スポンサーリンク

2016年2月19日

What is OTP?

とある錬金術師の万能薬(Elixir)

Wait a minute

Erlang/OTPについて、そもOTPって何?って言うのがよく分かっていなかった。
なので、OTPについて簡単にまとめた記事。

GOAL

実施する前に設定したことと実際にやってみてどうなったのかを記載します。

Goal & Outcome

設定した目標と出てきた成果について。
(タスクの記載で重複するためGoalとOutcomを統合して記載します)
  • 頭の中にだけある理想
    • Erlang/OTPについてリサーチを行い、OTPを使っている・使っていないの区別ができるようになる
    • Erlang/OTPを自分以外の人へ説明できる知識を習得する
    • Elixirから意識してOTPを使うことができる力を身に付ける
  • 非情なタスク
    • [x] OTPとは何なのかをリサーチしブログの記事としてアップする(4h)
      • [x] プログラミングErlangのOTP入門をリサーチする(30m)
      • [x] Erlangの公式ページにある”What is OTP?”を翻訳する(1h30m)
      • [x] 振返り用としてブログの記事にまとめる(2h)
    • [] Elixirから自分の意思でOTPを使いサンプルプログラムをブログへアップする(2h)
      • [] ElixirからOTPを使うサンプルプログラムの設計を行う(30m)
      • [] ElixirからOTPを使うサンプルプログラムへ着手する(1h30m)
  • 残酷な現実
    • ギャップ
      • OTPを他者へ説明することはできない
    • 実施結果
      • 1442~1523(41m) プログラミングErlangからのリサーチ終了
      • 1544~1710(1h26m) Erlang公式ページからのリサーチ終了
      • 1735~1835(1h) ブログ用の記事として作成完了
  • 特記
    • Elixirのプログラムについては、これから着手のため特に振り返りはなし。

Analyze

成果の分析結果について。
OTPが何なのかについては判別がつくようになった。
OTPを自分が学んだままの知識として伝えることはできると思うが、
それを噛み砕いて説明・疑問への返答などはまだまだ知識が足りないためできないレベルにある。
本からのリサーチで見積もり時間より11m超えている件について。
興味本位にソースコードまで追いかけてしまったのが原因。

Learn

  • OTPが何なのか、どうやって使うのか概要レベルで習得できた
  • GOAL-IPはもう少し、ファジーにしてもよいかもしれない
    • 少し振返りに時間を掛け過ぎてしまった

Improve

改善すべきこと・できることをについて。
おそらく現段階にて、OTPの概要レベルでしか触れることができていない。
OTPを説明できるようになるためには、ドキュメントやプログラミングErlangを読み込むことと、
実際に動くコードを実装しイメージを固めることを何度も行っていく必要がある。
(つまり知識の習得->コードの実装を繰り返し、いつも通りの積み重ねをするだけ)
見積もり時間は守れたはず、自制心が足りない。
興味はあとで、必要なところをピックアップして読み飛ばしていくこと。

Prepare

次の行動に必要な準備について
  • プログラミングErlangはパソコンとセットで置く(ティッピング・ポイントにする)

Content

Dev-Environment

  • OS: Windows8.1
  • Erlang: Eshell V7.2.1, OTP-Version 18.1

Index

What is OTP?
|> Erlang/OTPって何?
|> もっと詳しく!

Erlang/OTPって何?

色々と書いてありました。
氏曰く、OTPはOpen Telecom Platform、フレームワーク、アプリケーション・オペレーティングシステムの一種、ライブラリや手続きの集合体…etc
結局何?
(サーバを構築するための)プラットフォーム。
OTPの中核は?
ビヘイビアと呼ばれるものが中核的な概念。
コールバックモジュールによって変化させられるアプリケーションフレームワーク。
もっと詳しく!
OTPは、Erlangのライブラリと、これらのシステムを開発するためのミドルウェアを提供する設計原理のセット。
これは、他の言語におけるデバッグとリリースハンドリングツールに対してインターフェースするように、
独自の分散データベース、アプリケーションが含まれているとのこと。
(公式サイトの説明を翻訳しただけ…)

Note:

OTPのライセンスは、"Erlang Public License"。
(Mozilla Public Licenseの派生とのこと)

もっと詳しく!

大体、ここら辺のことをまとめてOTPと呼ぶらしい。

Application

Erlang/OTPは、コンポーネントの数に付属する、それぞれがいくつかの特定の機能が実装されている。
コンポーネントはErlang/OTPの用語で呼ばれるアプリケーション。
最小限のシステムは、次の2つのアプリケーションで構成されている。
  • Kernel - アーランを実行するために必要な機能
  • STDLIB - Erlang標準ライブラリ
アプリケーションのコンセプトは、プログラム構造(プロセス)とディレクトリ構造(モジュール)の両方に適用される。
最も単純なアプリケーションは、すべてのプロセスを持っているが機能モジュールの集合体で構成されていない。
このようなアプリケーションは、ライブラリアプリケーションと呼ばれている。
(ライブラリアプリケーションの例はSTDLIB)
プロセスとアプリケーションは、最も簡単な標準的な振る舞いを使用して監督のツリーとして実装されている。

Supervisor

Erlang/OTPでの基本的な考え方は監督の木です。
監督の木は、労働者と監督者の考え方に基づいてプロセスを構造化モデルにする。
  • 労働者とは、実際の作業を行う計算を実行するプロセス
  • 監督者は、労働者の行動を監視するプロセス。(何かがうまくいかない場合、スーパーバイザは労働者を再起動することができる)
  • 監督の木は、フォールトトレラントソフトウェアとしての設計とプログラムになる。(監督者と労働者への階層的な配置のコードにできる)
プログラムがクラッシュしたときのためにスーパーバイザがある。

Behaviour

監視ツリーにおいて、プロセスの多くは同様のパターンに従って、類似した構造になっている。
例えば、監督者は構造が類似している。
構造の間の唯一の違いは、彼らが監督する子プロセスです。
労働者の多くは、サーバ・クライアント関係のサーバー、有限状態マシンまたはエラー・ロガーなどのイベントハンドラ。
ビヘイビアは、これらの一般的なパターンに形式化されている。
汎用部分(ビヘイビア・モジュール)と特定の部分(コールバック・モジュール)で処理するためのコードを分割すること。
ビヘイビア・モジュールはErlang/OTPの一部。
スーパバイザのようなプロセスを実装するには、
ユーザーが機能のみを定義されたコールバック関数のセットをエクスポートし、コールバックモジュールを実装する必要がある。
  • Behaviour Module
    • application
    • supervisor
    • gen_server
    • gen_fsm
    • gen_event

Note:

gen_serverのビヘイビアを実装するときにやること

1. コールバックモジュールの名前を決める
2. インターフェース関数を実装する
3. コールバックモジュールの6つの必須になるコールバック関数を実装する
コールバックは課題の本質的な部分を担い、ビヘイビアはそれ以外の本質的でない部分を担う。
つまり、共通部分はビヘイビアにして、特殊な部分や課題ごとに代わる部分はコールバックにすればいい。

オブジェクト指向で言うなら抽象化と具象化のようなものでしょうか?(かなりざっくりとしてイメージ的には)

Other

リリース関連や、デバッグなんかのツールがある。
OTPアプリケーションのパッケージ化なんかに使われると思う。

Speaking to oneself

ざっくりと得た知識をつらつら書いていっただけになった。
書いているうちに自分の中で理解が進むかと思ったけど、
残念ながらそんなことはなかった。
しばらくは、ドキュメントの読み込みとソースコードの作成・実行が主体となるでしょうね。
というか、やらないと知識が増えないし自分の中に落とし込めないのです。
とりあえず、一般的に使われるパターン(?)があるらしいので、
プログラミングErlangにあるパターンを使ってElixirで練習してみます。
まぁしかし、先に調べておいて良かった。
smtpのプログラム直すのにも使えそうだし、今日から始めるElixirでのOTP利用!!
っというか、すごく基本的な設計思想になるみたいだから、Elixirやるなら必須だわここら辺。
自分が無知であるってことをTwitterでぎゃーぎゃー喚いていた感じだな…恥ずかしい///

Bibliography

人気の投稿