これはまだ書きかけです、ちまちまアップデートしていきます
前提
- 時雨堂 が実際に利用している機能を中心に紹介しています
- OTP 26.0 ベースに書いています
この資料が以下の書籍を読んだ人にとって、最近の Erlang/OTP の動向をキャッチアップする手助けになればと思います。
- プログラミングErlang
- すごいErlangゆかいに学ぼう!
また、Erlang/OTP を利用した製品がより多く生まれるといいなというお気持ちもこっそりあります。
書籍の Erlang/OTP のバージョンについて
- プログラミングErlang は
OTP R11B5
がベース- OTP R11B5 は 2007-06-12 リリース
- すごいErlangゆかいに学ぼう! は
OTP R15B
がベース- OTP R15B は 2011-12-14 リリース
2023 年 3 月現在の安定版は 25.3 です。26.0 が 5 月にリリースされます。
書籍とバージョン差はありますが、基本的な文法はほとんど変わっていませんので、安心してください。
- OTP 17 から後ろに A や B が付いたりせず 17.0 -> 17.1 とバージョンが上がるようになりました
- 現在では Erlang/OTP は 1 年に 1 回、 5 月頃にメジャーバージョンアップがリリースされます
2023 年 3 月現在の書籍からのアップデート
- Erlang/OTP LSP
- rebar3 が OTP ビルドの標準へ
- hex.pm を利用したパッケージマネージャー
- Erlang/OTP が Apache License 2.0 へ変更
- OTP 18
- maybe 構文
- 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 に履歴機能が追加
- 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
maybe 構文
maybe 構文が使えるようになりました。ネストが深くなってしまっていたコードが一気に読みやすくなります。
OTP 26 で利用する場合は --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 回 Erlang/OTP master ブランチでのビルド&テストの実行
- 常に最新のリリースバージョンを rebar3 の
minimum_otp_vsn
に設定- RC 版も含める
- OpenSSL は静的リンク
- 最新の OpenSSL の機能や性能を利用したいため
- rebar3_efmt を利用
- rebar3_lint を利用
- 設定はそのうち公開
- rebar3_hex を利用
- https://hex.pm/docs/rebar3_private
- プライベートパッケージを利用
- パッケージビルドには Docker を利用
新しい書籍
最初に紹介した2冊以上の書籍は今後も出てこないと考えて良いです。
なぜなら特に必要性がないためです、最新版にアップデートした書籍が出るかもくらいです。
Property-Based Testing with PropEr, Erlang, and Elixir
プロパティテストの本は翻訳が出るのをまったり待ちましょう。
Stuff Goes Bad: Erlang in Anger
Erlang を実際に運用する際に利用できるノウハウ集が、日本語版が有志によって翻訳されています。
日本語翻訳版
Discussion