Open6
いつか「プロフェッショナル Erlang/OTP」を書くためのメモ
これは「プログラミングErlang」と「すごいErlangゆかいに学ぼう!」を読み終わった人向けの 「プロフェッショナル Erlang/OTP」というオンラインブックをいつか書くためのメモ。
著者
- 時雨堂の中の人
- Erlang/OTP は R11 から
- Erlang/OTP を利用した商用パッケージ製品開発者
これから Erlang/OTP を学ぼうと思う人へ
まずこの2冊を購入してしっかり読み込んでほしい。自分もプログラミング Erlang をひたすら読み込んだ。
また、この 2 冊以外は日本語の書籍は読む必要はない。これに書いていない事は Erlang のドキュメントやソースコードを読む。資料では、この 2 冊に足りていない部分を書いていく。
ドキュメント
海外書籍
- Erlang Programming [Book]
- Property-Based Testing with PropEr, Erlang, and Elixir: Find Bugs Before Your Users Do by Fred Hebert
- Erlang and OTP in Action
- Designing for Scalability with Erlang/OTP [Book]
- Programming Erlang (2nd edition) by Joe Armstrong
- Introducing Erlang [Book]
資料
rebar3
何はともあれ、rebar3 を覚える必要がある。
rebar3 プラグイン
-
erlef/rebar3_hex: Rebar3 Hex library
- Hex をプライベートで利用する場合は必須
- project-fifo/rebar3_lint: Erlang linter - rebar3 plugin
- rebar3_efmt | Hex
書籍には載っていない機能やライブラリや文法
- BeamAsm, the Erlang JIT
- rand
- gen_statem
- counters
- persistent_term
- logger
- Maybe
- Bit String Comprehensions
counters と persitent_term と logger は erlang vm にとってブレイクスルーなので、必ず覚えるべき。
デファクトスタンダードなライブラリ
- erlware/relx: Sane, simple release creation for Erlang
- sile/jsone: Erlang JSON library
- ninenines/cowboy: Small, fast, modern HTTP server for Erlang/OTP.
- ferd/recon: Collection of functions and scripts to debug Erlang in production.
- massemanet/redbug: erlang tracing debugger
オススメのライブラリ
-
sile/efmt: Erlang code formatter
- Rust で書かれた Erlang/OTP フォーマッター
- 早いのは正義
- フォーマット前とフォーマット後の動作が同じ事を保証してくれるので安心して使える
UUIDv4 が使いたい
crypto:strong_rand_bytes/1 を使って簡単に自作できる。
%% https://www.rfc-editor.org/rfc/rfc4122.html
uuidv4() ->
%% https://www.rfc-editor.org/rfc/rfc4122.html#section-4.1.2
<<Rand1:48, _:4, Rand2:12, _:2, Rand3:62>> = crypto:strong_rand_bytes(16),
<<Rand1:48,
%% https://www.rfc-editor.org/rfc/rfc4122.html#section-4.1.3
%% Msb0 Msb1 Msb2 Msb3 Version Description
%% 0 1 0 0 4 The randomly or pseudo-
%% randomly generated version
%% specified in this document.
2#0100:4,
Rand2:12,
%% https://www.rfc-editor.org/rfc/rfc4122.html#section-4.1.1
%% Msb0 Msb1 Msb2 Description
%% 1 0 x The variant specified in this document.
2#10:2,
Rand3:62>>.
ライブラリ FAQ
- Language Server は?
- 暗号ライブラリは?
- OpenSSL 3.0 系を利用する crypto が OTP に内蔵されてる
- Erlang -- crypto
- X509 関連ライブラリは?
- OpenSSL 3.0 系を一部利用する public_key が OTP に内蔵されている
- Erlang -- public_key
- LDAP ライブラリは?
- eldap というライブラリが OTP に内蔵されている
- Erlang -- eldap
- HTTP/2 ライブラリは?
- サーバーであれば Cowboy
- クライアントであれば Gun
- WebSocket ライブラリは?
- サーバーであれば Cowboy
- クライアントライブラリであれば Gun
- QUIC ライブラリは?
- msquic のラッパーが公開されている
- emqx/quic: QUIC protocol for Erlang & Elixir
- HTTP/3 ライブラリは?
- Raft ライブラリは?
書き方 FAQ
- 何かあったらクラッシュさせていいの?
- ダメ、把握できる範囲は ok/error で対応する
OTP 26
https://www.erlang.org/news/160 の翻訳。
Erlang シェル
- 変数、レコード名、レコードフィールド名、マップキー、関数パラメータタイプ、ファイル名のオートコンプリート
- シェルで外部エディタを開き、現在の式を編集します
- シェルでレコード(型あり)、関数、スペック、型を定義
JIT
- base64モジュールの性能は大幅に改善されました
- JITを使ったx86_64システム上では、エンコードとデコードの両方がErlang/OTP 25のときよりも3倍近く速くなった
- 固定サイズのセグメントを持つバイナリの作成とマッチングが最適化されました
- UTF-8 セグメントの作成とマッチングが最適化されました
- バイナリへのアペンドが最適化されました
- コンパイラとJITは、すべてのキーがコンパイル時に分かっているリテラルである小さなマップを作成するためのより良いコードを生成するようになりました
Dialyzer
- Dialyzerには新しいインクリメンタルモードがあり、Dialyzerの実行時に--incrementalオプションを与えることで起動します。 この新しいインクリメンタルモードは将来のリリースでデフォルトとなる可能性があります
Maps
- マップ内包が実装されました
- アトムキーの内部ソート順を変更することにより、いくつかのマップ操作が最適化されました。これは小さなマップのアトムキーがどのように表示され、maps:to_list/1とmaps:next/1 によって返されるかという(文書化されていない)順番を変更します。 新しい順番は予測不可能で、Erlang VMの異なる起動の間で変わるかもしれません
- マップの要素を決定論的な順序で返すインターレーターを作成するための新しい関数maps:iterator/2が導入されました。 また、マップの要素を順序どおりに印刷するための新しい修飾子kとKが io:format() のフォーマット文字列として導入されました
ssl
- erl_dist の ssl が ktls に対応
その他
- BIFのmin/2、max/2がガードやマッチの仕様で使用できるようになりました
- 選択的受信の最適化が改善され、他の関数から返された参照に対して有効化できるようになりました。これにより、gen_server:send_request/3 やgen_server:wait_response/2 といった関数の性能が大幅に改善されます
- inet:setopts/2に3つの新しいオプションが追加されました:reuseport,reuseport_lb,exclusiveaddruse
- application:get_supervisor/1を導入