第二回 Erlang 基礎勉強会まとめ
以前、告知した通り 2010年7月28日(水) にジェミナイ・モバイル・テクノロジーズ株式会社様の会議室をお借りして Erlang 基礎勉強会の第二回目を行う事ができました。
快く会場をご提供して頂いたジェミナイ・モバイル・テクノロジーズ株式会社様、また、ジェミナイ・モバイル・テクノロジーズ株式会社様をご紹介して頂いた @takemaru_jp さん、誠にありがとうございました。特にジェミナイ・モバイル・テクノロジーズ株式会社様には、ビル入り口の看板、机、椅子、プロジェクタ、電源、WiFi、飲料(ビール含む) のご準備など様々なご協力を頂き、大変、感謝しております。
参加予約について
ATND の参加予約は、全く当てにしていなかったのですが、今回は 10 名中 9 名の方にご参加頂き、ほぼ時間通りに開始する事ができました。
とは言え、席が空く事をお待ちになられていた方もいらっしゃったようなので、今後は、少人数の勉強会であっても自由席を用意する事を検討しております。(そのかわりに座席が無い場合は、お引き取り頂く事になります)
今回の内容について
Erlang なんて DSL(Domain Specific Language) だから簡単だよ…という話と、アクターモデルの幾つかのパターンについて話をさせて頂きました。
スライドはこちらで、サンプルコードはこちらです。
前回は、説明に四時間ほど掛かりましたが、今回は、説明に一時間、質疑応答に一時間としました。しかし、スライド枚数が多く、早口で説明してしまったため、参加者の方々に伝えるべき内容を伝えきれませんでした。
次回は、説明する内容を更に減らし、実際にコードを書いてもらいながら進めたいと考えております。
質疑応答のまとめ
質問への応答は私だけではなく、Erlang 製の KVS(Key-Value Store) Hibari の開発者様や、Erlang 歴 1 ヶ月にも関わらず、とても詳しい方(虎さん)にもお手伝い頂きました。
プロセス間メッセージで 6Mbps のデータを送り続けたいが、負荷はどうか?
- 負荷が気になるのであればバイナリで送る手がある。ここの「4.1 How binaries are implemented」が助けになるかも。
- Hibari では Erlang に Patch を適用している。Patch は、R14 以降に取り込まれる予定。
- ストリーミングは、プロセスが太りすぎる場合があるので、GC 関連のライブラリもご確認を…。
この辺り、私は調べたり試したりした事がないので詳しい事は解りませんが、多分、上記はローカルノード内の話かなと。ノードを跨いだプロセス間通信では、上記の恩恵は受けられないので、試して本当に負荷が酷いのであれば、別の手を考える必要があると考えております。
ちなみに、Efficiency Guide は、@shibukawa さんによる邦訳が存在します。
本を購入するとしたら始めの一冊は何が良いか?
- 本は購入せずに作りたいものを作る。その後に プログラミング Erlang などを読むのが良い。
- Programming Erlang より Erlang Programming の方が読者が順序立てて学べる構成になっている。例えば、いきなり OTP を解説せず、まずはプロセスのデザインパターンから解説している箇所などが評価できる。
- 公式サイトのドキュメントを、しっかり読む。各ライブラリ毎に「User's Guide」と「Reference Manual」に分かれており、非常に解りやすい。
- http://www.erlang.org/download/armstrong_thesis_2003.pdf がおすすめ。
私の個人的経験ですが、始めに本を購入した言語は、手足のように使える状態になった試しがありません。「○○を作りたい」という意思が無ければ、モチベーションが続かないからです。言語はモノ作りの道具であるという事を忘れてはいけないと考えております。
パターンマッチの _Foo とは何か?
- _ でパターンマッチするよりは、_Pid や _Reason など名前を付ける方が、コードを読んだ際に解りやすい
- _ は束縛されないが、_Foo は束縛される
- メッセージ受信の際、_ ではなく、束縛してログなどに値を残した方が良い
その他
- TypEr を使っているプロジェクトが見当たらない。もっと TypEr 使いましょう!
- プロセスを簡単に作れる事は、利点でもあり不利点でもある。プロセスは状態を持つので副作用を伴う。
- 副作用が伴うため、プロセス間通信を伴うテストは複雑である。
- テストを書く際、副作用がない逐次処理のテストと、副作用があるプロセス間通信を伴うテストは分離する。