Elixirを思い出す時の資料
今の職場でアプリケーションコードを書く時はKotlinかElixirかPythonが多い。(残念だけどGoやRustではない)
Elixirは職場でもともと使われていたために使っているといった感じ。 必要に追われて書こうとするたびに色々と忘れていて、すこし強いニューゲームを繰り返している。 そんなわけで記憶の定着と資料の整理のためにまとめる。
基本的には公式資料とソースコードへのリンクだけど、少しだけ非公式な日本語資料へのリンクも残した。 それらにはとても助けられた。
インストールはasdfを使っている。
基礎
Elixirの基本コマンドは4つでここにある。特にelixirが基礎になっている。
読むとシンボリックリンクを再帰的に解決して erl コマンドに -pa オプションで関連 ebin ディレクトリを登録して呼び出す。 iex 以外の時は -s オプションでエントリポイントを指定してる。 elixir モジュールの start 関数はここ。
ref.
- elixir/lib/mix/lib/mix/tasks at master · elixir-lang/elixir
- elixir/lib/elixir/src at master · elixir-lang/elixir
- elixir/elixir.erl at master · elixir-lang/elixir · GitHub
- Erlang – erl
基本
本が紹介されている。 このうち少なくともElixir Schoolはオンラインで公開されている。 あとはドキュメントから辿る。 特に標準ライブラリ(Kernel)はモジュールの名前だけでも把握しておくと良い。
標準ライブラリの実装は目を通すのが基本で特に良さそうなのを並べておく。 enum.ex,stream.ex は勉強になる。また Protocol,Typespec,Behaviour,attribute がマクロで実現されてるの少し感動する。
@melponさんがとても良い資料をたくさん残している。
実践
実践に向けて学ばないとならない事がある。 ビルディングブロックの使い方、テスト・デバッグの方法、コーディングのガイドライン、内部動作だ。
ビルディングブロックの使い方
せっかくなので非同期処理や分散フレームワークの使い方を覚える。 Task モジュールは async/await を提供しているので簡単に非同期処理を扱える。
状態を扱いたい場合にはどうしてもアクターが必要になる。 外部のデータベースやストレージを使うことが多いと思うけど、もちろん Elixir/Erlang だけでも実現できる。 高度なKVストアとしては Registry を使う。これは内部で ETS を使ってる。
サーバー-クライアントモデルの実装には GenServer か Agent を用いる。 GenServer の方が柔軟だけど少し大変。 Agent は書きやすくて良い。 Agent の具体例としてこのへんの記事がわかりやすかった。
アクターは監視が必要だったりする。
公式じゃないけど@ohrdevさんが入りやすい記事を残してくれている。
@melponさんもたくさん残している。正直 DynamicSupervisor は良くわからなかったので助かった。
またシステム情報や設定へのアクセスは把握しておくべきこと。
コーディングのガイドライン
読んでおくと良い。レビューで余計な衝突を減らせる。
- Naming Conventions
- Writing Documentation
- Library Guidelines
- A community driven style guide for Elixir
テスト・デバッグの方法
型検査がない。だけど Dialyxir などで Typespecs (アノテーション)を活かせるので使うべき。
実際の挙動の検査にはテストが必要で標準のユニットテストフレームワークとして ExUnit がある。 Ectoって定番の癖の強いORMがある。 これと相性がいいテストデータ生成ライブラリがExMachina。
動いてる最中に調査するにはデバッガが便利で IEx を使う。(プリントデバッグには IO.inspect/2 を使う)
内部動作
怒りを感じる。
実践::真似られるサードパーティ(ExAWS)
ExAwsが有名だ。 素朴にはTCPセッションを使いまわしてくれない。(Elixirにありがちだけど)ドキュメントは本当に基本的なことは書いてあるけどあとはコードを読んでくれって感じになっている。
トップレベルモジュールの ExAws はビヘイビアを実装していてv1.5から追加された @impl を使っている。 @spec も使って欲しいとか思った。
ex_aws_s3/parsers.exはSweetXMLの具体例になっている。
ElixirのライブラリはOTPアプリケーションを定義したり Application 経由で設定ファイルを読み込んだりとグローバルに状態を持ってることが多い。 個人的には設定ファイル依存を切り離して呼び出し時に上書きしたり出来るようにしておきたい。ExAwsは上書きできるようになっていて真似をした。