Ectoが2.0(beta)になって、concurrent acceptance testingができるようになったのでいくつか調べてみた。 参考にした元記事は以下。 Concurrent Acceptance Testing in Elixir この中で、Ectoのownershipのところが気になったのでいくつかコードを追ってみました。 Ownweshipを取得する時、 Ecto.Adapters.SQL.Sandbox.checkout/2 が呼ばれます。 これはEcto2.0で必要になったところですね。 https://github.com/elixir-lang/ecto/blob/v2.0.0-beta.1/lib/ecto/adapters/sql/sandbox.ex#L281 ここの中で、もしsandboxであれば にあるように、ownership_poolのキーを持つDBConnectionのプロセスをとってきます。 これは、以下のdb_connectionのコードを呼びます。 https://github.com/fishcakez/db_connection/blob/v0.2.4/lib/db_connection/ownership.ex#L47 この中で case されるのは以下。 https://github.com/fishcakez/db_connection/blob/v0.2.4/lib/db_connection/ownership/manager.ex#L19 この DBConnection.Ownership.Manager はGenServerになってて、その自身に対して call します。 :checkout が call されるところを探すと、以下がみつかります。 https://github.com/fishcakez/db_connection/blob/v0.2.4/lib/db_connection/ownership/manager.ex#L149 ここで、DBに対して処理を行うプロセスがcheckoutされていない場合、以下のprivateメソッドが呼ばれます。 https://github.com/fishcakez/db_connection/blob/v0.2.4/lib/db_connection/ownership/manager.ex#L174 こう見ると、この段階でetsに対してcheckoutした、ということを保存するのですね。なるほど。 もう1つ。以下の通り allow されることがconcurrentlyにテストを実行する上では必要です。 これは、以下の通りドキュメントに書かれています。 https://hexdocs.pm/ecto/2.0.0-beta.1/Ecto.Adapters.SQL.Sandbox.html Summing up – Using allowances – requires explicit allowances via allow/3. Tests may run concurrently.…More
Category Archives: development
[Erlang]Dive into Designing for Scalability with Erlang/OTP
Designing for Scalability with Erlang/OTPを読みました。Erlang/OTPを軸とした、スケーラブルなシステムを構築するための設計に必要な知見がたまってそうだったのと、半額程度で購入できたのでありがたく読みました。 内容として、半分はErlang/OTPのエコシステム周り、設計思想とかの話でした。ただ、残す半分はErlangに限ったことではない、広く使えそうな基礎がまとまっていました。個人的には、Elixir in Actionと合わせて読むとこの系統の書籍は十分そうな感覚です。 ちなみに、所どころ使われている例題や、それを個人的にElixirに書き直したものを以下に置いています。(所どころ壊れているものもありますが。) https://github.com/KazuCocoa/erlang-scalable-design 前半部分 Erlang/OTPの全体的な話が書かれています。背景とか。message passingの概要とか。諸々。Erlangの文法も学びながら、gen_serverだったり、gen_fsmだったりといくつかのOTPの話に発展する感じでErlangを学ぶことができます。 debugのための、sysやdbgモジュールも記載されていました。以前読んだQiitaのReconTrace で Erlang VM のトレース機能に親しむでかかれていたrecon_traceなんかのことも言及されています。 proc_libという特別なプロセスの話も。この特別なプロセスは、 システムメッセージや、イベント、シャットダウンとが可能 動的モジュールのリストを得ることができる debug flagを使ってトレースメッセージを利用することができる といった特徴があります。 後半部分(Chapter13以降くらい) Chapter 13のDistributed Architectureは、SOAやP2Pといった大局な設計やinterfaceから、その配布方法などの話まで色々ありました。これはErlangに特出したツールの話以外は、普通にErlang以外でも役立ちそうな情報だと思います。 リリース関係の話の中で、riakというdecentralized datastoreなツールの話もあって、面白かったです。Gossip protocolを使ってClusteringしているとか、そういう話も載っていたので。HashiCorpのSurfなんかでも結構知られていますね。Gossip protocol。 Riakのそこらへんのドキュメントはこちら http://docs.basho.com/riak/latest/theory/concepts/Clusters/#Gossiping http://docs.basho.com/ これのErlang client https://github.com/basho/riak-erlang-client Elixir client https://github.com/drewkerrigan/riak-elixir-client Scalableなシステムを組むためのtipsとして、以下の項目がまとめられていました。 分割する Distributed architectural pattern(cluster, SOAなど ) Network protocol node間のinterfaceや状態も持ちようやデータモデル node間のretry strategy node間のsharing data…More
[Elixir][Erlang]RecordとElixirのStructの違い
最近、Erlangのある書籍を読み始めました。そこでは始めの方にErlangの基本的な事柄が書かれていたので、そこを軽く追いながらErlangを軽く学んでいます。(と言っても、Elixirやってきたので文法以上は特に目新しいものはないのですが) そこで、ElixirのStructとElixir/ErlangのRecordの違いが気になったので、まとめておきます。 結局は、RecordとMapの違いになってきて、Erlangコミュニティで話されるその違いと同じような感じになっていました。(すごいE本のP. 567とか。やっぱりこの本、すごい。)ただ、ElixirのStruct自体はElixir独自のものなので、ちゃんと残しておきます。 Erlang x Record Erlangでは、Recordはtupleの糖衣構文。例えば、以下の通り を実行すると以下の結果になります。 なるほど。 Elixir x Record なるほど。でも、こう見るとこれはstructに似ている。と思いますよね。普通にElixirのget startを学んだだけだとRecordがでてこないので、考える順としてはこんな感じだと思われます。 ElixirのRecord ElixirのRecordのドキュメントを見ると to work with short, internal data to interface with Erlang records と、Recordの使うポイントが書かれています。ふと、ここでよく見るとstructとの使いわけが気になります。 まぁ、そう思うよね、と思ったらGoogle Groupsにやっぱり。 https://groups.google.com/forum/#!topic/elixir-lang-talk/6kn7J2XnFg8 https://gist.github.com/josevalim/b30c881df36801611d13 結論だけここに残しておくと、たいていの場合はStructを使って、限られたときだけRecordを使いましょう、というもの。StructはMapで __struct__ 定義されます。 To clarify: when we said that Records in Elixir were deprecated, it was Elixir implementation of records which is…More
デブサミ2016でモバイルアプリ開発に関してお話しさせていただきました
以下の通り、お誘いいただいたこともあって、デブサミ2016でお話しさせていただきました。 http://event.shoeisha.jp/devsumi/20160218/session/1055/ Googleのとある書籍に習って、テストに関わる職種から見た開発、というものを書いてみました。ただ、ハードウェアは関係ないので”ソフトウェア”をつけています。 がっつりソフトウェアテストの技法だとか、どう活用しているという話は JaSST や SQiP でされる方がよくて、デブサミでは 自身の体験をもとにしたその周り 、という形の方がイベントの趣旨としても良さそうだったので今の物語の流れにしました。聴講者、デブサミは開発よりな人だったり開発上がりのマネージャな方なイメージだったので、時間帯も考えるとがっつりテストの話は眠くなりそうと感じたので。なのでQualityを真ん中に置いてその改善という流れにしてみました。 テストという局所的な話よりも、開発全体の中でQualityを高めるためにどうしたか、その中でテストエンジニアというものがサービス開発にどう関わっているのか、貢献しているのかが一連の流れで分かると良いなと思いました。 テストというQualityに対する一部を取り出してそこだけに深く関わるのではなくて、こういう感じで広く関わって、品質を向上させるところに 知を使う のがテストエンジニアとか、QAエンジニアと言われる方々。ソフトウェアテストの開発の上流工程から〜と言われるところの仕様というところをさらに広げた、多分もっと根本的にあったであろう活動全般になるのでないかな。(と信じてはしますが…)。日本でいう、1990年代にあったとされる品質活動と同じようなことをしている感じ。(実際にはその頃の話は聞いただけなので、想像ですが…) 品質に対してアリストテレスの話を出したのですが、そこらへんも反応がなかったので “がっつりソフトウェアテストの技法だとか、どう活用しているという話は JaSST や SQiP でされる方がよくて” という判断は正しかったぽい。(多分、そこ専門に学んでいると多少なりとも知るのでないかなと思ったので)。でも、そのあとのとある会話でSQiPやJaSSTでもそんなでもないかも、と言われたので、そんなでもないのかも。 あ、 toteka の宣伝の箇所が一番ウケがよくて、良い緩和剤になってくれました。 運営に携わっていました方々、ありがとうございました。More
[Android]delete data stored in AccountManager via adb
As you know, you can remove local application data via adb command. The command is very useful to do Android test against release module with uiautomator, Appium an so on. But, if your application use AccountManager provided by Android platform, the command can’t remove the data stored via account manager. What you can do is……More
OpenSFT
完全なメモ。 OpenSFT を試した。リリース直後は確か何かつまづいてそれ以降試そうとしていなかったのだけれど、また試してみた、といった具合。 単純に、on Mac OS X 10.11で試したが、 stf local では特に問題なく動作しました。LDAP機能もあったし、社内連携も多少は行けそう。 ふむ。More
[Elixir]Lint with dogma
Elixirのlintツールとしてdogmaというものがあります。 RubyのRobocopのようなものですね。 https://github.com/lpil/dogma 試しに適用してみました。修正も。備忘録に、以下2つ。Phoneixの簡単なアプリとhttp_proxyを。 http_proxy https://github.com/KazuCocoa/http_proxy/pull/21/files sample web app https://github.com/KazuCocoa/web_qa_vote/pull/6/files Report formatとしてJSONもしてい出来ます。 https://github.com/lpil/dogma/blob/master/docs/reporters.md この標準出力を解析して、例えば dokumi と組み合わせるとPR時にlintを指摘する、というのもできますね。 ※ 最近は credo を私は使っているMore
[Elixir]ExUnitで同名のtestが存在した時にコンパイルエラーにする
1行まとめ ExUnitにおけるテストケースの重複時にコンパイルエラーにしたい場合、 test_helper.exs に Code.compiler_options(warnings_as_errors: true) オプションを追加しておこう 多分、これはチーム開発では大いに役立ちます ExUnitが test マクロを関数定義するまで 以下のようなテストケースがあったとします。 この時、 test マクロで定義されたところは __ErrorSampleExunitTest__.’:test the truth’ としてコンパイル時に定義されます。 Elixir1.2.1では以下の行での話になります。 https://github.com/elixir-lang/elixir/blob/v1.2.1/lib/ex_unit/lib/ex_unit/case.ex#L258 同名の test が存在した場合 さて、この時に複数の同名のテストが存在した場合はどうでしょう? 例えば以下。 この場合、コンパイル時にCLIで以下のような warn が表示されます。 test/error_sample_exunit_test.exs:8: warning: this clause cannot match because a previous clause at line 4 always matches テストケースを記述するコードは、 .exs の拡張子を持つので、このようなwarnはテスト実行毎に表示されます。なので、実行を注意深く見ていると、このエラーを知ることができます。 ただ、他のテスト自体は実行されます。 コンパイルエラーにする ただ、warnではなくコンパイルエラーにしたほうが親切なのでは?と思い、手元でコンパイルエラーになるようにExUnitを直接修正してみました。 ExUnitのtestマクロでは、以下の2点でコンパイル時に関数を定義します。 https://github.com/elixir-lang/elixir/blob/v1.2.1/lib/ex_unit/lib/ex_unit/case.ex#L258 https://github.com/elixir-lang/elixir/blob/v1.2.1/lib/ex_unit/lib/ex_unit/case.ex#L280 なので、その直前で以下のように既存モジュールに定義済みの同名関数があるかどうかを検出させ、trueであればraiseするようにします。 コンパイラオプションで回避する…More
TensorFlowに関するメモ
[Elixir]CustomLoggerのコードを追う
[Elixir]Loggerのconsole出力をファイルに書き出すではlogger_file_backendを使う、ところを残しました。そのついでに、CustomLogger付近とその作り方を見てみました。 参考: Elixir Meetup #1 Loggerの構造と拡張 from Sugawara Genki これを理解するために、ElixirのLoggerの実装群や、 GenEvent 付近が理解を助けてくれます。 https://github.com/elixir-lang/elixir/tree/v1.2.0/lib/logger/lib Elixir本体のloggerの参考 https://github.com/elixir-lang/elixir/blob/v1.2.0/lib/logger/lib/logger/backends/console.ex :console のbackendの書き方の参考 このようにしてcustomer loggerを作り、backendとして指定、利用できる https://github.com/elixir-lang/elixir/blob/v1.2.0/lib/logger/lib/logger/formatter.ex log levelの種類によって表示を整形する参考 https://github.com/elixir-lang/elixir/blob/v1.2.0/lib/elixir/lib/gen_event.ex Backendの拡張のために利用される 私も参考で貼ったスライドを参考に、練習のためにCustomLoggerを書いてみました。consoleの実装箇所を参考にすればここら辺もかける感じ。 This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden…More