Erlang Programming 楽しみ
Erlang Programming: A Concurrent Approach to Software Development
- 作者: Francesco Cesarini,Simon Thompson
- 出版社/メーカー: O'Reilly Media
- 発売日: 2009/06/29
- メディア: ペーパーバック
- 購入: 1人 クリック: 44回
- この商品を含むブログ (21件) を見る
さっそくポチり。
2009-06-15 ですな。後 3 ヶ月かー。
The book focuses the language's syntax and semantics, and explains pattern matching, proper lists, recursion, debugging, networking, and concurrency.
内容は基本的なことが中心みたい。デバッギングの章が気になるなぁ。
もっともっと日本の Erlang コミュニティを盛り上げるために翻訳本の登場が待たれますな。
翻訳やりたいな。こういうのってオライリー・ジャパンさんが既に翻訳権を取得してたりするのだろうか。。
case 文を使うべきか否か
例えば引数に指定された Operator によって処理を振り分けたい時、お作法的にはどちらが良いのでしょうか。
- case 文を使って一つの関数で全部捌くよ派
handle_operation(Operator, Operand) -> case Operator of a -> do_a; b -> do_b; c -> do_c; _ -> do_something end.
- case 文を使わずに複数の関数を使うよ派
handle_operation(a, Operand) -> do_a; handle_oeration(b, Operand) -> do_b; handle_oeration(c, Operand) -> do_c; handle_oeration(_, Operand) -> do_something.
個人的にはネストすると読みにくくなってしまうし、処理を変更したい時も大変そうだし、な (case 文があまり好みじゃない) ので後者かなぁと思ったりするのですが。。。
どちらが一般的なんでしょうかねぇ。
RFC 1459 に u_n_d_e_r_s_c_o_r_e は使えるのか
RFC 1459 によるとニックネームにアンダースコアは使えないことになっていますが、実際には rejoin した際にニックネームにアンダースコアをアペンドしたりと使ってる実装が多いです。また、ニックネームの先頭にアルファベット以外を使える実装も多いです。
::= { | | }
...
::= 'a' ... 'z' | 'A' ... 'Z'
::= '0' ... '9'
::= '-' | '[' | ']' | '\' | '`' | '^' | '{' | '}'
というわけで、下記のような BNF が現実に即しているのかな。
::= | { | | } ... ::= 'a' ... 'z' | 'A' ... 'Z' ::= '0' ... '9' ::= '-' | '[' | ']' | '\' | '`' | '^' | '{' | '}' | '_'
etop の 使い方
GUI ベースの etop = getop
Erlang には 指定ノードに於ける (Erlang) プロセス毎の状態を表示してくれるベンリツール etop があります。
丁度 UNIX コマンドの top のようなものです。
getop という GUI ベースの実装も提供されています。
場所
etop、getop は
/usr/lib/erlang/lib/observer-0.9.7.4/priv/bin/
あたりにあると思います。
PATH を通しておくと便利です。
起動方法
監視対象のノードを起動します。ノードの命名を忘れずに。
$erl -name 'hoge@localhost'
次に etop を起動します。監視対象のノードの指定を忘れずに。
$etop -node 'hoge@localhost'
etop を起動したところ。デフォルトだと 5 秒毎に更新される
おお。起動しましたね!
getop も同じ方法で OK です。
画面の見方
- Load
- cpu は Runtime/Wallclock を表します
- procs はノード上のプロセス数を表します
- runq は実行可能なプロセス数を表します
- Memory
- 割当てられたメモリの大きさを表します
- 単位は KB です
- Time
- プロセスの runtime を表します
- Reds
- プロセスが実行中の reduction*1 の数を表します
- Memory
- process_info(Pid,memory) によって得られるプロセスのサイズを表します
- MsgQ
- メッセージキューのサイズを表します (メールボックスに入っている ≒ まだ処理されていないメッセージの数)
オプション
下記のパラメータが使用可能です。起動後にも etop:config(Key, Value) で変更可能です。
また、 getop の場合は GUI ベースで設定の変更が可能ですヨ。
- lines
- 表示するプロセス数を指定します
- Value: integer()
- Default: 10
- interval
- プロセス状態の再描画間隔を指定します。単位は秒です。
- Value: integer()
- Default: 5
- accumulate
- sort
- 並び替えの基準を指定します
- Value: runtime | reductions | memory | msg_q
- Default: runtime (reductions if tracing=off)
まとめ
結構便利です。etop。眺めてるだけでニヤニヤできます。
妙にメモリ食ってるプロセスや、メールボックスにメッセージが溜ってるプロセスがいたら注目します。
% etop -node 'hoge@localhost' -interval 1 -lines 200 -tracing off > hoge.log
とかでログを取りつつ
% tail -f hoge.log
として眺めることが結構あります。
参考
PuTTY でカーソル(キャレット)の残像が残る問題が解決しました
PuTTY をよく使うようになってきたのですが、困ったことが一つ。
ウィンドウを非アクティブにした際にカーソルの残像が残るんですよね。。
↑シアンのカーソルの残像が。。。
色々と調べても解決方法が見つからず暫く放置していたのですが、キャレット関連のツールを入れていたことを思い出し、無事解決しました!感激!
原因
PuTTY とSetCaretColorというツールを併用していると起こる不具合です。
解決方法
PuTTY では SetCaretColor を無効にすると良い。設定ファイル SetCaretColor.ini に下のように書きます。
[Ignore] ;指定ウィンドウのキャレットを置き換えない
Ignore=putty.exe,,
で、 SetCaretColor.exe を再起動。 (多重起動すると起動中のプロセスが死んで新しいプロセスが起動します)
いやぁ、これで数ヶ月のモヤモヤが解消されました。
ところで
SetCaretColor は IME の入力モードによってキャレットを変えてくれるというシンプルながらとても便利なツールです。
使ったことない方は是非とも試してみてください!日ごろ無意識のうちに蓄積されていたストレスを減らしてくれる素晴らしいツールです。