[Elixir]愚直にズンドコキヨシ

こちらの「ズンドコキヨシ」を簡単に実装してみた。Streamとか、そういうのは使ってない。実際に処理するメソッド数は3つ。 Enum.take/2 のようなものは使っていない。 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 Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters defmodule Znd do @z "ズン" @d "ドコ" @k "キ・ヨ・シ" def kiyoshi,…More

[Elixir]@behaviour and @callback

簡単なWebフレームワークを作ってみようと、Plugやtrotを読んでいると、いたるところで @behaviour と描かれているものがありました。 GenServer なんかを use した時にOTPとしての振る舞いを、対象モジュールに与えることができました。そこで使われている Behaviour は把握していたのですが、この @ のアノテーションはパッと思い出すことができなかったので、メモがてら。 Elixir 1.2.xの時点が対象です。結論から書いておくと、この @behaviour は Behaviour のことで、2.0では削除される Behaviour の代わりに推奨されているものです。 ドキュメント https://github.com/elixir-lang/elixir/blob/v1.2/lib/elixir/lib/module.ex https://github.com/elixir-lang/elixir/blob/v1.2.3/lib/elixir/lib/behaviour.ex#L1 Behaviorは、Elixir 1.2.3 からdepricatedになった。 自身で定義したBehaviourに関して、以下のように @callback で定義したものを、 @behaviour で読み込んで使うという用途で使われます。ここで、読み込んだ先で @callback しているものを def で定義していない場合、 warning が表示されます。 例えば、以下の MyModule や MyGenServer の直前のコメント箇所のような。 This file contains hidden or bidirectional Unicode text that may be interpreted or compiled…More

[Elixir]defprotocol and defimpl, inheritance

trySwiftConfにて、protocolの話がかなり熱かったのでElixirのprotocolの動作を思い出し込みで確認してみました。 テストコードありなので、以下をそのままファイルに書き出して実行すると現状の動作を確認できます。 ポイントは、 継承 defprotocolとdefimpの組み合わせ です。 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 Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters defmodule Value do defmacro __using__(_opts) do quote do…More

[Elixir]Ecto2.0-beta2のownership周りのコードを追う

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

[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