プログラミングErlang 第10章 分散プログラミングのサンプルが動かない問題の解決方法

久しぶりの記事です。最近は題名の『プログラミングErlang/Joe Armstrong (著), 榊原一矢 (翻訳) 』を読みながらErlangを習得しようと奮闘しています。


その本の139ページから始まる「第10章 分散プログラミング」のサンプルコードが動かなかったため、調べてみると海外のフォーラムではかなり動かないという相談を見かけました。ただ、日本語での情報がなかったので、この本とErlangの普及の為にも書き残しておきます。
環境は Mac OSX 10.6.1(Snow Leopard)、Erlang R13B02 (erts-5.7.3) 、Eshell V5.7.3、使用シェルはzsh 4.3.9 (i386-apple-darwin10.0)です。


問題が発生するのは142ページのステージ2です。クライアントとサーバーが1つのホストの別のノードにある場合に、その二つの間で通信を行うコードで、以下のようにして二つのノードを立ち上げ、rpcライブラリモジュールを使ってkvsを呼び出すのですが…

$ erl -sname gandalf
(gandalf@hogename) 1> kvs:start().
true

ここまではうまくいくはずですが

$ erl -sname bilbo
(bilbo@hogename) 1> rpc:call(gandalf@localhost, kvs, store, [weather, fine]).

と打つと

{badrpc,nodedown}
(bilbo@hogename) 2> 
=ERROR REPORT==== 18-Nov-2009::17:02:18 ===
Error in process <0.39.0> on node 'bilbo@hogename' with exit value: {badarg,[{erlang,list_to_existing_atom,
["gandalf@hogename"]},{dist_util,recv_challenge,1},{dist_util,handshake_we_started,1}]}

とエラーを吐かれてしまいます。上の "hogename" は共有の「コンピューター名」です。これを変更するには「環境設定 > 共有」で開く画面の上の方にあるテキストインプットを編集します。



さて、解決方法ですが二通りあります。
ひとつめは erl の起動時につけるオプションを変更する方法です。

$ erl -sname gandalf@localhost

とします。bibloの方も同様にします。こうすることで先ほどは

(gandalf@hogename) 1>

だったところが

(gandalf@localhost) 1>

となっているはずです。



ふたつめの解決策は "/etc/hosts" に "hogename" を書き加える方法です。

$ sudo vim /etc/hosts

127.0.0.1    hogename # <= これを書き加える

あとは端末を一度再起動して、

(biblo@hogename) 1> rpc:call(gandalf@hogename, kvs, store, [weather, fine]).

とすれば動作するはずです。

海外の情報は、日本ではあまりまだメジャーではない環境や言語では特に助かるということを思い知りました…。
ではまた。


参考サイト
http://blog.getintheloop.eu/2009/5/17/running-rabbit-mq-on-mac-osx-solving-badrpc-nodedown
http://cammacrae.com/blog/2007/06/27/erlang-example-error/
http://somic.org/2009/02/19/on-rabbitmqctl-and-badrpcnodedown/