プログラミング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/