Erlang をはじめよう その6
前回 - mog project: Getting Started with Erlang pt.5 の続き
CHAPTER 11: Getting Started with OTP
いよいよ OTP の章に入る。
OTPとは Open Telecom Platform の略。
分散並列処理のためのライブラリ群と耐障害性の高いアプリケーションサーバ機能を持った
フレームワークの名称である。
Open Telecom Platform - Wikipedia, the free encyclopedia
この OTP の機能を活用することこそ、Erlang を使う最大の目的である。
モジュールをサービスとして実行する
-define はマクロの定義、?MODULE は組み込みマクロ。
-module(shop). -behaviour(gen_server). -export([start_link/0]). % convenience call for startup -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). % gen_server calls -define(SERVER, ?MODULE). % macro that just defines this module as server -record(state, {count}). % simple counter state %%% convenience method for startup start_link() -> gen_server:start_link({local, ?SERVER}, ?MODULE, [], []). %%% gen_server callbacks init([]) -> {ok, #state{count=0}}. handle_call(_Request, _From, State) -> Distance = _Request, Reply = {ok, buy(Distance)}, NewState=#state{ count = State#state.count+1 }, {reply, Reply, NewState}. handle_cast(_Msg, State) -> io:format("So far, calculated ~w prices.~n", [State#state.count]), {noreply, State}. handle_info(_Info, State) -> {noreply, State}. terminate(_Reason, _State) -> ok. code_change(_OldVsn, State, _Extra) -> {ok, State}. %%% Internal functions buy(Number) -> 100 * Number.
実行
> c(shop) > shop:start_link(). > gen_server:call(shop, 3). > gen_server:call(shop, 5). > gen_server:cast(shop, {}). > gen_server:call(shop, 7). > gen_server:cast(shop, {}).
サーバ実行中にモジュールを書き換えることもできる。
例えば、shop.erl の最終行を以下のように書き換える。
buy(Number) -> 105 * Number.
先ほどのコンソールで引き続き。
> c(shop). > gen_server:call(shop, 7). > gen_server:cast(shop, {}).
ただし、処理中にエラーが発生するとサーバは停止してしまう。
> gen_server:call(shop, apple). > gen_server:call(shop, 7).
スーパーバイザーの実行
-module(shop_sup). -behaviour(supervisor). -export([start_link/0]). % convenience call for startup -export([init/1]). % supervisor calls -define(SERVER, ?MODULE). % macro that just defines this module as server %%% convenience method for startup start_link() -> supervisor:start_link({local, ?SERVER}, ?MODULE, []). %%% supervisor callback init([]) -> RestartStrategy = one_for_one, MaxRestarts = 1, % one restart every MaxSecondsBetweenRestarts = 5, % five seconds SupFlags = {RestartStrategy, MaxRestarts, MaxSecondsBetweenRestarts}, Restart = permanent, % or temporary, or transient Shutdown = 2000, % milliseconds, could be infinity or brutal_kill Type = worker, % could also be supervisor Shop = {shop, {shop, start_link, []}, Restart, Shutdown, Type, [shop]}, {ok, {SupFlags, [Shop]}}. %%% Internal functions (none here)
実行
> c(shop_sup). > {ok, Pid} = shop_sup:start_link(). > unlink(Pid). > gen_server:call(shop, 3). > whereis(shop). > gen_server:call(shop, apple). % error > whereis(shop). > gen_server:call(shop, 5).
start_link を行うとシェル自身がスーパーバイザーになってしまうので、
サーバを起動し続けるためには unlink を行う必要がある。
別の方法としては、gen_server:call の呼び出しを catch で囲むアプローチもある。
アプリケーションとしてパッケージングする
アプリケーション リソースファイル
{application,shop, [{description,"Shopping some fruits"}, {vsn,"0.0.1"}, {modules,[shop, shop_sup]}, {applications,[kernel,stdlib]}, {mod,{shop_app,[]}}]}.
アプリケーション モジュール
-module(shop_app). -behaviour(application). -export([start/2, stop/1]). start(_Type, _StartArgs) -> shop_sup:start_link(). stop(_State) -> ok.
実行
> c(shop_app). > application:load(shop). > application:loaded_applications(). > application:start(shop, 3). > application:start(shop). > gen_server:call(shop, 3). > whereis(shop). > gen_server:call(shop, apple). > whereis(shop). > gen_server:call(shop, 5).
カレントディレクトリ以外の場所にリソースがある場合には
code:add_path("path/to/the/directory").
が必要。
CHAPTER 12: Next Steps Through Erlang
最終章。次のステップは?
- シェルのその先へ
小さなコードを試すのに Erlang Shell は最適だけど
コンパイルや実行にはより適したツール、IDEがある - 分散コンピューティング
ネットワーク越しに、複数の Erlang ノードで処理を行う
- バイナリデータの取り扱い
バイナリデータの構造に適したモジュールやツール
- 入出力処理
ファイルI/O - file/filename/filelib/io_lib
ネットワークI/O - gen_tcp/gen_udp - テスト、分析、リファクタリング
テストフレームワーク - EUnit
プロファイリング - eprof/fprof
カバレッジ取得 - cover/cprof
リファクタリング - Wrangler など - ネットワーク、Web フレームワーク
Yaws
mochiweb
cowboy
Nitrogen Web Framework for Erlang
webmachine - (Diagram · basho/webmachine Wiki)
ChicagoBoss
比較表 - Comparison of Erlang Web Frameworks · ChicagoBoss/ChicagoBoss Wiki - データストレージ
様々な外部DBとの連携
- 他のプログラミング言語との連携
Java/C/Ruby/.NET/Python/Perl/PHP/Haskell/Scheme/Emacs Lisp との連携
- Erlang 上で動作するプログラミング言語
- コミュニティ
erlang-questions Info Page
free node #erlang IRC チャンネル
Erlang Factory
Erlang Programming Language
Trending Erlang repositories on GitHub today - Erlang の知見を共有しよう
References
0 件のコメント:
コメントを投稿