🐙

モダン Erlang/OTP

2023/03/12に公開

ちまちまアップデートしていきます

前提

  • 時雨堂 が実際に利用している機能を中心に紹介しています
  • OTP 26.2.1 ベースに書いています

この資料が以下の書籍を読んだ人にとって、最近の Erlang/OTP の動向をキャッチアップする手助けになればと思います。

また、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 月現在の書籍からのアップデート

maybe 構文

maybe 構文が使えるようになりました。ネストが深くなってしまっていたコードが一気に読みやすくなります。

とにかく maybe が使えないかどうかを考えるようにしてください。

OTP 26 で利用する場合は --feature(maybe_expr, enable). をモジュールに指定してするか、 rebar.config 利用します。

{erl_opts, [{feature, maybe_expr, enable}]}.

https://www.erlang.org/eeps/eep-0049

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

https://github.com/erlang/rebar3

rebar3_hex

https://github.com/erlef/rebar3_hex

rebar3_lint

https://github.com/project-fifo/rebar3_lint

rebar3_efmt

時雨堂が利用しているフォーマッター

Rust で書かれており高速、フォーマット前とフォーマット後の動作を保証してくれる。

https://github.com/sile/efmt

relx

https://github.com/erlware/relx

公式ドキュメント

Erlang/OTP のドキュメントが整備され、全文検索の追加とどの機能がどのバージョンで追加されたのかがわかるようになりました。

https://www.erlang.org/doc/man/maps.html

Image from Gyazo

Image from Gyazo

時雨堂

時雨堂の 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 を利用
  • パッケージビルドには Docker を利用
  • Hex のプライベートパッケージを利用
    • 年 1 人 $ 70

VS Code

VS Code に公開してある Erlang ベースの LSP はクラッシュが頻発したり遅かったりして、正直使い物にならない。
そのため、Rust で書かれた LSP とフォーマッターの利用をお勧めする。

実際、この二つのみをインストールして開発しているが困ることがほとんど無い。

新しい書籍

最初に紹介した 2 冊以上の書籍は今後も出てこないと考えて良いです。
なぜなら特に必要性がないためです、最新版にアップデートした書籍が出るかもくらいです。

Property-Based Testing with PropEr, Erlang, and Elixir

https://www.lambdanote.com/collections/proper-erlang-elixir

Stuff Goes Bad: Erlang in Anger

Erlang を実際に運用する際に利用できるノウハウ集が、日本語版が有志によって翻訳されています。

https://www.erlang-in-anger.com/

日本語翻訳版
https://github.com/ymotongpoo/erlang-in-anger

Discussion