Erlang Programming 楽しみ

Erlang Programming: A Concurrent Approach to Software Development

Erlang Programming: A Concurrent Approach to Software Development

久々に amazon.com の方を見たら Erlang Programming の発売日が載ってた。
さっそくポチり。
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 した際にニックネームにアンダースコアをアペンドしたりと使ってる実装が多いです。また、ニックネームの先頭にアルファベット以外を使える実装も多いです。

以下、RFC 1459 内の BNF

::= { | | }
...
::= 'a' ... 'z' | 'A' ... 'Z'
::= '0' ... '9'
::= '-' | '[' | ']' | '\' | '`' | '^' | '{' | '}'

というわけで、下記のような BNF が現実に即しているのかな。

 ::=  |  {  |  |  }
...
     ::= 'a' ... 'z' | 'A' ... 'Z'
     ::= '0' ... '9'
    ::= '-' | '[' | ']' | '\' | '`' | '^' | '{' | '}' | '_'

RFC 1459 実装中にハマった

IRC プロトコルのパーサーを書いてる途中にちょっと詰ったところ。
素晴しい日本語訳があり大変助かっているのですが、一部紛らわしい箇所がありました。

<trailing> ::= <SPACE,NUL,CR,CFを含まないオクテットの列(空のオクッテトの列も可)>

原文では、

::=

には SPACE (0x20) は含むんですよね。
実際にサーバから吐き出されるメッセージを見たら一目瞭然なんですが、ちょっとハマってしまいました。

2009-03-09 訳者の方に訂正案と共にメールしといた。

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 ベースで設定の変更が可能ですヨ。

  • node
    • 監視対称のノード名を指定します (ex. -node 'hoge@localhost')
    • Value: atom()
    • これは必須のパラメータです
  • setcookie
    • 監視対象ノードで cookie を設定している場合は同じものを指定してやりましょう
    • Value: atom()
  • lines
    • 表示するプロセス数を指定します
    • Value: integer()
    • Default: 10
  • interval
    • プロセス状態の再描画間隔を指定します。単位は秒です。
    • Value: integer()
    • Default: 5
  • accumulate
    • true を指定した場合、実行時間と recution time*2 が累計されていきます (false の場合は再描画毎に計測されます)
    • Value: boolean()
    • Default: false
  • sort
    • 並び替えの基準を指定します
    • Value: runtime | reductions | memory | msg_q
    • Default: runtime (reductions if tracing=off)
  • tracing
    • 妙なメッセージが出て邪魔なようなら off にしましょう (Erlang top got garbage... とか) *3
    • Value: on | off
    • Default: on

まとめ

結構便利です。etop。眺めてるだけでニヤニヤできます。
妙にメモリ食ってるプロセスや、メールボックスにメッセージが溜ってるプロセスがいたら注目します。

% etop -node 'hoge@localhost' -interval 1 -lines 200 -tracing off > hoge.log

とかでログを取りつつ

% tail -f hoge.log

として眺めることが結構あります。

参考

Erlang Top
etop

*1:これが何をさしているのか分かりませんでした。教えてエロイ人>< \\2009-03-17 追記: reduction とは関数 (BIF を含む) の呼び出し回数だそうです。こいつが 1000 に逹すると BEAM エミュレータによるコンテキストスウィッチが行われるそうです。エロイ人に教えて頂きました! mikage さんありがとうございます!

*2:Reds 列 *1

*3:詳しく知りたい場合は etop のマニュアルページへ。。。

PuTTY でカーソル(キャレット)の残像が残る問題が解決しました

PuTTY をよく使うようになってきたのですが、困ったことが一つ。
ウィンドウを非アクティブにした際にカーソルの残像が残るんですよね。。

↑シアンのカーソルの残像が。。。

色々と調べても解決方法が見つからず暫く放置していたのですが、キャレット関連のツールを入れていたことを思い出し、無事解決しました!感激!

原因

PuTTYSetCaretColorというツールを併用していると起こる不具合です。

解決方法

PuTTY では SetCaretColor を無効にすると良い。設定ファイル SetCaretColor.ini に下のように書きます。

[Ignore] ;指定ウィンドウのキャレットを置き換えない
Ignore=putty.exe,,

で、 SetCaretColor.exe を再起動。 (多重起動すると起動中のプロセスが死んで新しいプロセスが起動します)

いやぁ、これで数ヶ月のモヤモヤが解消されました。


↑ウィンドウ切り替えても残像が残らなくなりました

ところで

SetCaretColorIME の入力モードによってキャレットを変えてくれるというシンプルながらとても便利なツールです。
使ったことない方は是非とも試してみてください!日ごろ無意識のうちに蓄積されていたストレスを減らしてくれる素晴らしいツールです。

ASUS 読み方

ずっと「エイサス」だと思ってたんですが、テレビで広報の方がばっちりと「アスース」って言ってましたね。。

検索すると「どちらでもいい」ようですが。

「エイサス」のが自然でかっこいいと思うんだけどなー。