Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

オープンソースパーティ2007

本日(2007/05/27)24:00締め切りです。都合が付けば行きたいなぁ :-)


今年もLinux Worldが5月30日(水)〜6月1日(金)の3日間、東京ビッグサイトで開催されます。
これに合わせて、例年通りオープンソース関係者が一同に集える大宴会を企画しましたので、ご案内いたします
           :
           記
●日時:2007年6月1日(金) 19:00-21:00 (18:30 受付開始)
●会費:4,000円(飲み放題コース・当日会場受付にて・ドタキャン禁止)
●会場:T.G.I.フライデーズ 銀座8丁目店 http://r.gnavi.co.jp/g572202/
●交通:JR新橋駅 徒歩7分
●住所:中央区銀座8-9-4 銀座たあぶる館1〜2F
(中央通り 三菱東京UFJ銀行裏)
●TEL :03-5537-5955

自習メモ〜分散プログラミング(ping/1とnodes/0)

公開されているpdfをやってみるシリーズ(?)の分散プログラミング。
マジッククッキー*1を作ったあと、net_adm:ping/1を使って疎通確認。今回はVMwarePlayer上のCentOS4.5にErlangをインストールして、Windows-CentOS間で試してみました。
まずは、WindowsCentOSそれぞれのhostsファイルにテスト用FQDNを追加。Windows側には2つ用意してみました。

192.168.52.1    win.xxx.yyy test.xxx.yyy
192.168.52.128  centos.xxx.yyy

ノード名(任意の名前@ホスト名)を指定して分散ノードを起動。まずはWindows側。

D:\home\shimooka\erlang>erl -name shimooka@win.xxx.yyy
Eshell V5.5.4  (abort with ^G)
(shimooka@win.xxx.yyy)1>

次にCentOS側を起動し、net_adm:ping/1を実行。「pong」と返ってくれば成功です。

[root@centos ~]# erl -name root@centos.xxx.yyy
Erlang (BEAM) emulator version 5.5.4 [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.5.4  (abort with ^G)
(root@centos.xxx.yyy)1> net_adm:ping('shimooka@win.xxx.yyy').
pong
(root@centos.xxx.yyy)2> 

今度はWindows側からCentOSへのnet_adm:ping/1。

(shimooka@win.xxx.yyy)1> net_adm:ping('root@centos.xxx.yyy').
pong
(shimooka@win.xxx.yyy)2>

うまくいったようです :-)
続いて、片方を終了させたあとに

(shimooka@win.xxx.yyy)2> q().
D:\home\shimooka\erlang>

再度pingをすると接続失敗「pang」が返ってきます。

(root@centos.xxx.yyy)3> net_adm:ping('shimooka@win.xxx.yyy').
pang
(root@centos.xxx.yyy)4>

また、分散ノード名で識別されるようなので、test.xxx.yyyでのnet_adm:ping/1はpangになりました。

(root@centos.xxx.yyy)4> net_adm:ping('shimooka@win.xxx.yyy').
pong
(root@centos.xxx.yyy)5> net_adm:ping('shimooka@test.xxx.yyy').
pang
(root@centos.xxx.yyy)6>

最後に、nodes/0で繋がっているノードを確認してみました。net_adm:ping/1をしたあとじゃないと空のリストが返ってきます。

(root@centos.xxx.yyy)6> q().
ok
(root@centos.xxx.yyy)7> [root@centos ~]#
[root@centos ~]# erl -name root@centos.xxx.yyy
Erlang (BEAM) emulator version 5.5.4 [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.5.4  (abort with ^G)
(root@centos.xxx.yyy)1> nodes().
[]
(root@centos.xxx.yyy)2> net_adm:ping('shimooka@win.xxx.yyy').
pong
(root@centos.xxx.yyy)3> nodes().
['shimooka@win.xxx.yyy']
(root@centos.xxx.yyy)4>

ちなみに、公開されているpdfではnet_adm:ping/1の引数に「'」が付いていませんが、WindowsCentOSの両方とも「'」を付けないと

(root@centos.xxx.yyy)5> net_adm:ping(shimooka@win.xxx.yyy).

=ERROR REPORT==== 25-May-2007::23:57:08 ===
Error in process <0.37.0> on node 'root@centos.xxx.yyy' with exit value: {badarith,[{erl_eval,eval_op,3},{erl_eval,expr_list,6},{erl_eval,expr,5},{shell,exprs,6},{shell,eval_loop,3}]}

** exited: {badarith,[{erl_eval,eval_op,3},
                      {erl_eval,expr_list,6},
                      {erl_eval,expr,5},
                      {shell,exprs,6},
                      {shell,eval_loop,3}]} **
(root@centos.xxx.yyy)6>

となりました。実はこれでずっとはまってました。。。orz
あと、FQDNでない場合、以下のようなエラーになります。

(root@centos.xxx.yyy)6> net_adm:ping('shimooka@win').
=ERROR REPORT==== 25-May-2007::23:59:26 ===
** System running to use fully qualified hostnames **
** Hostname win is illegal **
pang
(root@centos.xxx.yyy)7>

*1:前のエントリには誤りがありますので注意

CentOS上でのbuild

おまけ ;-D
configureを使った極々一般的(?)な手順でインストールできます。

$ wget http://www.erlang.org/download/otp_src_R11B-4.tar.gz
$ tar zxf otp_src_R11B-4.tar.gz
$ cd otp_src_R11B-4/
$ ./configure
$ make
# su -
# make install
# 

ただし、結構時間がかかるみたいです。CF-R4+WindowsXP(SP2)+VMwarePlayer+CentOS4.5な環境で、makeだけで1時間程度かかりました。

自習メモ〜分散プログラミング(リモートノードへのモジュールロード)

公開されているpdfをやってみるシリーズ(?)の分散プログラミング。
「とあるノードにあるモジュールをリモートノードへロードする」を確認しました。環境は前のエントリの通り、WindowsXP-CentOSの組み合わせです。
まずはそれぞれの分散ノードを起動し、net_adm:ping/1による疎通確認。手順は省略(^^;
続いて片側にしかないモジュールのバイナリコードをcode:get_object_code/1で読み込み。

(shimooka@win.xxx.yyy)3> {Module, Binary, Filename} = code:get_object_code(sample).
{sample,<<70,79,82,49,0,0,1,216,66,69,65,77,65,116,111,109,0,0,0,68,0,0,0,7,6,
          115,97,...>>,
        "d:/home/shimooka/erlang/sample.beam"}
(shimooka@win.xxx.yyy)4>

この時点でCentOS側にはまだモジュールはロードされてませんので、m(sample)で確認するとエラーになるはずです。

(root@centos.xxx.yyy)2> m(sample).

=ERROR REPORT==== 27-May-2007::17:50:36 ===
Error in process <0.77.0> on node 'root@centos.xxx.yyy' with exit value: {undef,[{sample,module_info,[]},{c,m,1},{erl_eval,do_apply,5},{shell,exprs,6},{shell,eval_loop,3}]}

** exited: {undef,[{sample,module_info,[]},
                   {c,m,1},
                   {erl_eval,do_apply,5},
                   {shell,exprs,6},
                   {shell,eval_loop,3}]} **
(root@centos.xxx.yyy)3>

予定通りのエラー。ここで、rpc:call/4を使ってWindows側からCentOS側へモジュールをロードさせてみます。RPC経由でcode:load_binary/3をコールすることになるようです。

(shimooka@win.xxx.yyy)3> rpc:call('root@centos.xxx.yyy', code, load_binary, [Module, Filename, Binary]).
{module,sample}
(shimooka@win.xxx.yyy)4>

再度、CentOS側でm(sample)してみます。

(root@centos.xxx.yyy)4> m(sample).
Module sample compiled: Date: May 27 2007, Time: 08.44
Compiler options:  []
Object file: d:/home/shimooka/erlang/sample.beam
Exports:
         hello_world/0
         module_info/0
         module_info/1
ok
(root@centos.xxx.yyy)5> sample:hello_world().
Hello, World!
ok
(root@centos.xxx.yyy)6>

おお!うまくいきました。なんか気持ち悪い感じもしなくもないですが、なんかすごい :-)
しかし、code:get_object_code/1で返ってくるタプルの順番とcode:load_binary/3のリストで指定する順番が微妙に違うのが気になる。。。