erlang
application behaviour と supervisor behaviour を組み合わせてアプリケーションを起動停止する方法を調べたのでメモ。 マニュアルは以下。 supervisor application 誰が何をして、どの型(callbacks)を実装しているべきなのかが把握しづらかったので mio …
http://github.com/joewilliams/merle/tree/master を入れた。 注意点は 2 つ。 etap が必要 http://github.com/ngerakines/etap/ make test がメンテナンスされていない疑惑 テストの start_link を connect に、get を getkey にすると良い term_to_binary…
merle uses LShift's gen_server2 module/behavior for faster message queues. http://hg.rabbitmq.com/rabbitmq-server/file/b95f2fd4e3f6/src/gen_server2.erl 要調査。
今まで適当に使ってきたがマニュアルを読み返す。http://erlang.org/doc/apps/common_test/part_frame.html テストケースの特別な戻り値 {skip,Reason} スキップ {comment,Comment} ログにコメント {save_config,Config} 次のケースに Config 渡す 失敗と認…
背景 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 と読んでしまう。
自分自身に対して gen_server:call してしまうとデッドロックで止まってしまう問題は、どうやって回避するのが良いだろうか。 隣の Node 介して環状に自分自身に gen_server:call してしまうんだよなあ。 出来る限り cast ってのが良いんだろうか。 handle_c…
handle_call({link_op, NodeToLink, Direction, Level}, _From, State) -> ok; と空実装を書いて怒られる。 handle_call({link_op, NodeToLink, Direction, Level}, _From, State) -> {reply, ok, State}; が正解。
lists:map(fun({_, _, MVector}) -> MVector end, Level0Nodes) これはコーディングスタイルに影響しそう。Scheme でも match-lambda をもっと使おう。 case-lambda はアリティだけなので中途半端と感じる。getter 兼 setter 的な手続きを作るときくらいしか…
Common Test のログは端末に、その他の error_logger 経由のログはファイルに出力したいがうまくいかない。 run_test に -config elog.config を渡しすのはうまくいかない。 [{kernel, [{error_logger, {file, "log/hige.log"}} ]}]. xxx_SUITE の先頭で err…
1> lists:nth(0, [1]) 1> . ** exception error: no function clause matching lists:nth(0,[1]) このエラーメッセージでは何が起きているか分からない。正解は index は 1 から始まるのでエラー。
send しているのに receive でブロックするの原因は変数の shadow が原因だった。 handle_call({search, ReturnToMe, Key}, _From, State) -> 上の handle_call の Key と下の receive の Key がかぶっているので別のノードから返ってきた Key が Key にマッ…
-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 条件を _ にしても受信できないので失敗しているのかな。 gen_server:handle_call から隣のノードに gen_server:cast しているんだけどこれが原因だろうか? 検索で 開始ノードが handle_call…
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 などで record 名、とテーブル名を同じにすると少しだけコードがきれいになるんだけど。 同じ型のテーブルを、複数作るときは使えない。代わりに mnesia:write/3 を使うだけでなくて、mnesia:create_table に record_name オプションを与える…
% 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 を読み終えた。読んだきっかけは、rui さんによる Erlang のすすめだったと思う。 java.util.concurrent に感動して、Shibuya.lisp の宴会で、同じくJava並行処理プログラミングを読んだ ruiさんと「あれすごいよねー。という話に」。 …