@m_seki の

I like ruby tooから引っ越し

省略されたdRubyのURI

dRubyのサービスを開始するときのURIを省略することができるのだけど、注意が必要です。

DRb.start_service('druby://hostname:12321', front) #1
DRb.start_service('druby://hostname:0', front) #2
DRb.start_service(nil, front) #3

1の'druby://hostname:12321'はhostnameで指定するネットワークインターフェイスのポート12321でサービスを開始することを示します。hostnameはマシンを特定するんじゃなくて、ネットワークインターフェイスを特定します(その結果、マシンを特定する)。

2の'druby://hostname:0'は1と同様にhostnameで指定するネットワークインターフェイスで、空いているポートをシステムに選んでもらってサービスを開始します。DRb.uriで完全になったURIを知ることができます。DRb.uriはそのサービスのオブジェクトが外部に参照として渡されるとき、オブジェクトが配置されているサーバを特定する情報となります。

3は全てのネットワークインターフェイスに対して、空いてるポートをシステムに選んでもらってサービスを開始します。これはくせ者です。複数のネットワークインターフェイスでサービスしているのにDRb.uriは一つなのです。
dRubyURIのホスト名部分をSocket.gethostnameを使って補います。だって、他に良い候補がないんだもん。複数のインターフェイスを持っていて、特定のインターフェイスを使わせたいのなら、2の形式で指定するべきです。また、頻繁にハマる失敗パターンにSocket.gethostnameの返す名前を他のマシンがIPアドレスに変換できない、というのがあります。そういうケースを救うために先日の作戦はどうかなあ、と思うですよ。