erlang

Erlang OTP : application と supervisor behaviour 組み合わせにおける起動と停止

application behaviour と supervisor behaviour を組み合わせてアプリケーションを起動停止する方法を調べたのでメモ。 マニュアルは以下。 supervisor application 誰が何をして、どの型(callbacks)を実装しているべきなのかが把握しづらかったので mio …

Erlang の Memcached クライアント Merle

http://github.com/joewilliams/merle/tree/master を入れた。 注意点は 2 つ。 etap が必要 http://github.com/ngerakines/etap/ make test がメンテナンスされていない疑惑 テストの start_link を connect に、get を getkey にすると良い term_to_binary…

メモ:高速な gen_server 実装?

merle uses LShift's gen_server2 module/behavior for faster message queues. http://hg.rabbitmq.com/rabbitmq-server/file/b95f2fd4e3f6/src/gen_server2.erl 要調査。

Erlang Common Test メモ

今まで適当に使ってきたがマニュアルを読み返す。http://erlang.org/doc/apps/common_test/part_frame.html テストケースの特別な戻り値 {skip,Reason} スキップ {comment,Comment} ログにコメント {save_config,Config} 次のケースに Config 渡す 失敗と認…

Erlang の application behaviour でコマンドライン引数をとる方法

背景 make check でテストを silent に実行し、make vcheck で verbose に実行するということを実現したかった。 error_logger を利用しているので端末にログを出すかどうかは error_logger:tty(false) のように制御できる。 このフラグをコマンドラインから…

おれるせ

Erlang の Short-Circuit は以下の2つ。 Expr1 orelse Expr2 Expr1 andalso Expr2 or-else ではなくて ore-lse と読んでしまう。

Erlang OTP における 自分自身を gen_server:call してしまう問題

自分自身に対して gen_server:call してしまうとデッドロックで止まってしまう問題は、どうやって回避するのが良いだろうか。 隣の Node 介して環状に自分自身に gen_server:call してしまうんだよなあ。 出来る限り cast ってのが良いんだろうか。 handle_c…

gen_server あるある

handle_call({link_op, NodeToLink, Direction, Level}, _From, State) -> ok; と空実装を書いて怒られる。 handle_call({link_op, NodeToLink, Direction, Level}, _From, State) -> {reply, ok, State}; が正解。

Erlang のパターンマッチが良い感じ

lists:map(fun({_, _, MVector}) -> MVector end, Level0Nodes) これはコーディングスタイルに影響しそう。Scheme でも match-lambda をもっと使おう。 case-lambda はアリティだけなので中途半端と感じる。getter 兼 setter 的な手続きを作るときくらいしか…

Erlang の Common Test におけるエラーログがうまくいかない

Common Test のログは端末に、その他の error_logger 経由のログはファイルに出力したいがうまくいかない。 run_test に -config elog.config を渡しすのはうまくいかない。 [{kernel, [{error_logger, {file, "log/hige.log"}} ]}]. xxx_SUITE の先頭で err…

Erlang の lists:nth ではまる

1> lists:nth(0, [1]) 1> . ** exception error: no function clause matching lists:nth(0,[1]) このエラーメッセージでは何が起きているか分からない。正解は index は 1 から始まるのでエラー。

Erlang で変数を shadow するとひどい目に遭う

send しているのに receive でブロックするの原因は変数の shadow が原因だった。 handle_call({search, ReturnToMe, Key}, _From, State) -> 上の handle_call の Key と下の receive の Key がかぶっているので別のノードから返ってきた Key が Key にマッ…

Erlang で LOG マクロ

-define(L(), error_logger:info_msg("{~p ~p,~p}:~n", [self(), ?MODULE,?LINE])). -define(LOG(X), error_logger:info_msg("{~p ~p,~p}: ~s = ~p~n", [self(), ?MODULE,?LINE,??X,X])). -define(LOGF(X, Data), error_logger:info_msg("{~p ~p,~p}: "++X++…

send しているのに receive でブロックする

send しているのに受け取り側でブロックするのはなぜだ。receive 条件を _ にしても受信できないので失敗しているのかな。 gen_server:handle_call から隣のノードに gen_server:cast しているんだけどこれが原因だろうか? 検索で 開始ノードが handle_call…

Erlang の Record を更新する

gen_server::handle_call の State を構造体で表現しているとして -record(state, {key, value, left, right}). value だけ更新して、reply したい場合がある。今までは {state, State#state.key, myValue2, State#state.left, State#state.right} としてた…

mnesia:write/1

mnesia:write/1 などで record 名、とテーブル名を同じにすると少しだけコードがきれいになるんだけど。 同じ型のテーブルを、複数作るときは使えない。代わりに mnesia:write/3 を使うだけでなくて、mnesia:create_table に record_name オプションを与える…

Erlang インストール

% wget http://erlang.org/download/otp_src_R13B.tar.gz % tar zvxf otp_src_R13B.tar.gz % cd otp_src_R13B/ % ./configure % make % sudo make install % erl Erlang R13B (erts-5.7.1) [source] [smp:2:2] [rq:2] [async-threads:0] [kernel-poll:false]…

プログラミングErlang 読了

プログラミングErlang を読み終えた。読んだきっかけは、rui さんによる Erlang のすすめだったと思う。 java.util.concurrent に感動して、Shibuya.lisp の宴会で、同じくJava並行処理プログラミングを読んだ ruiさんと「あれすごいよねー。という話に」。 …