モダン Erlang/OTP
ちまちまアップデートしていきます
前提
- 時雨堂 が実際に利用している機能を中心に紹介しています
- OTP 26.2.1 ベースに書いています
この資料が以下の書籍を読んだ人にとって、最近の Erlang/OTP の動向をキャッチアップする手助けになればと思います。
- プログラミング Erlang
- すごい Erlang ゆかいに学ぼう!
また、Erlang/OTP を利用した製品がより多く生まれるといいなというお気持ちもこっそりあります。
書籍の Erlang/OTP のバージョンについて
- プログラミング Erlang は
OTP R11B5
がベース- OTP R11B5 は 2007-06-12 リリース
- すごい Erlang ゆかいに学ぼう! は
OTP R15B
がベース- OTP R15B は 2011-12-14 リリース
2024 年 4 月現在の安定版は 26.2.3 です。
書籍とバージョン差はありますが、基本的な文法はほとんど変わっていませんので、安心してください。
- OTP 17 から後ろに A や B が付いたりせず 17.0 -> 17.1 とバージョンが上がるようになりました
- 現在では Erlang/OTP は 1 年に 1 回、 5 月頃にメジャーバージョンアップがリリースされます
2023 年 8 月現在の書籍からのアップデート
- Erlang/OTP LSP
- https://github.com/sile/erlls
- 時雨堂で利用しています
- Erlang Formatter
- https://github.com/sile/efmt
- 時雨堂で利用しています
- rebar3 が OTP ビルドの標準へ
- hex.pm を利用したパッケージマネージャー
- Erlang/OTP が Apache License 2.0 へ変更
- OTP 18
- maybe 構文
- OTP 25 で実験的採用
- OTP 27 で正式採用
- https://www.erlang.org/eeps/eep-0049
- map 内包表記
- is_map_key / map_get がガードに追加
- OTP 21
- min/2 と max/2 がガードに追加
- OTP 26
- gen_fsm が gen_statem に置き換わった
- random が rand に置き換わった
- socket アプリケーションの追加
- gen_[tcp|udp|sctp] が socket アプリケーションベースに変更
- OTP 23 & 24
- erlang shell で type や spec や record などが利用可能に
- OTP 26
- erlang shell に履歴機能が追加
- OTP 23
- ssl アプリケーションの TLS 1.3 と DTLS 1.2 対応
- OTP 22
- counter アプリケーションの追加
- persistent_term アプリケーションの追加
- logger アプリケーションの追加
- AsmJit を利用した Erlang VM の x86_64 と ARM64 JIT 化
- OTP 24 & 25
- https://www.erlang.org/doc/apps/erts/beamasm
- NIF 用の Dirty Scheduler の追加と改善
- 時間ライブラリの整備
- Unix Domain Sockets が利用
- OTP 19
- erlang:get_stacktrace/0 の廃止
- HiPE 廃止
- OTP 23
- crypto アプリケーション API 変更
- OTP 22
- gen_* から format_status/2 の廃止と format_status/1 をオプションで追加
- OTP 25
- slave アプリケーションが peer アプリケーションへ変更
- OTP 25
- argparse ライブラリが追加
- OTP 26
maybe 構文
maybe 構文が使えるようになりました。ネストが深くなってしまっていたコードが一気に読みやすくなります。
とにかく maybe が使えないかどうかを考えるようにしてください。
OTP 26 で利用する場合は --feature(maybe_expr, enable).
をモジュールに指定してするか、 rebar.config
利用します。
{erl_opts, [{feature, maybe_expr, enable}]}.
maybe 構文適用前のコード
commit_write(OpaqueData) ->
B = OpaqueData,
case disk_log:sync(B#backup.file_desc) of
ok ->
case disk_log:close(B#backup.file_desc) of
ok ->
case file:rename(B#backup.tmp_file, B#backup.file) of
ok ->
{ok, B#backup.file};
{error, Reason} ->
{error, Reason}
end;
{error, Reason} ->
{error, Reason}
end;
{error, Reason} ->
{error, Reason}
end..
maybe 構文適用後のコード
-feature(maybe_expr, enable).
commit_write(OpaqueData) ->
maybe
ok ?= disk_log:sync(OpaqueData#backup.file_desc),
ok ?= disk_log:close(OpaqueData#backup.file_desc),
ok ?= file:rename(OpaqueData#backup.tmp_file, OpaqueData#backup.file),
{ok, OpaqueData#backup.file}
else
{error, Reason} -> {error, Reason}
end.
rebar3
rebar3_hex
rebar3_lint
rebar3_efmt
時雨堂が利用しているフォーマッター
Rust で書かれており高速、フォーマット前とフォーマット後の動作を保証してくれる。
relx
公式ドキュメント
Erlang/OTP のドキュメントが整備され、全文検索の追加とどの機能がどのバージョンで追加されたのかがわかるようになりました。
時雨堂
時雨堂の Erlang/OTP 利用方法
- 1 週 1 回 Erlang/OTP master と maint ブランチでのビルド&テストの実行
- 1 日 1 回 Python (pytest) ベースの E2E テストを実行
- 常に最新のリリースバージョンを rebar3 の
minimum_otp_vsn
に設定- RC 版も含める
- OpenSSL は静的リンク
- 最新の OpenSSL の機能や性能を利用したいため
- rebar3_efmt を利用
- rebar3_lint を利用
- rebar3_hex を利用
- https://hex.pm/docs/rebar3_private
- プライベートパッケージを利用
- パッケージビルドには Docker を利用
-
Hex のプライベートパッケージを利用
- 年 1 人 $ 70
VS Code
VS Code に公開してある Erlang ベースの LSP はクラッシュが頻発したり遅かったりして、正直使い物にならない。
そのため、Rust で書かれた LSP とフォーマッターの利用をお勧めする。
実際、この二つのみをインストールして開発しているが困ることがほとんど無い。
新しい書籍
最初に紹介した 2 冊以上の書籍は今後も出てこないと考えて良いです。
なぜなら特に必要性がないためです、最新版にアップデートした書籍が出るかもくらいです。
Property-Based Testing with PropEr, Erlang, and Elixir
Stuff Goes Bad: Erlang in Anger
Erlang を実際に運用する際に利用できるノウハウ集が、日本語版が有志によって翻訳されています。
日本語翻訳版
Discussion