RubyはCygwinの1.8.6。Windows XPで動く。
1. 一つの端末でつながるか?
まず一台の端末の中で動くかどうか確かめる。'Hello, World.'を出力するサーバで実験。
# first_server.rb require 'drb/drb' class Foo def hello puts 'Hello, World.' end end DRb.start_service(nil, Foo.new) puts DRb.uri while true sleep 1 end
# first_client.rb require 'drb/drb' DRb.start_service uri = ARGV.shift ro = DRbObject.new_with_uri(uri) ro.hello
一台の端末でコマンドプロンプトを二つ起動する(C1, C2と呼ぶ)。
(1) C1でサーバ起動。そのサービスのURIが印字されるはず。
C1$ ruby first_server.rb druby://hoge:59639
(2) C2でクライアント起動。引数は上記のURI。
C2$ ruby first_client.rb druby://hoge:59639
クライアントは直ちに終わる。C1の画面にHello, World.が印字されていれば成功。
C1$ ruby first_server.rb druby://hoge:59639 Hello, World.
2. Thread#joinで待ってもちゃんと動くか?
サーバの最後にあるwhileのループはなんかWindowsのRubyでメインスレッドがスイッチしないときなどに使うトリック。なければない方がよいので、joinで待っても動くか確認する。
# first_server.rb require 'drb/drb' class Foo def hello puts 'Hello, World.' end end DRb.start_service(nil, Foo.new) puts DRb.uri DRb.thread.join
末尾をDRb.thread.joinに置き換えたfirst_server.rbを用意して1.の実験をして確認する。
3. 相互にホスト名が解決できるか?
イテレータ(ブロック付きメソッド)を実験する。二つのプロセスが双方向にRMI可能かを確かめる。
# second_server.rb require 'drb/drb' front = {} DRb.start_service(nil, front) puts DRb.uri while true sleep 1 end
# second_client.rb require 'drb/drb' DRb.start_service uri = ARGV.shift ro = DRbObject.new_with_uri(uri) ro[:hello] = 'wolrd' ro[:shimane] = 'MatzE' ro.each do |k, v| p [k, v] end
一台の端末でコマンドプロンプトを二つ起動する(C1, C2と呼ぶ)。
(1) C1でサーバ起動。そのサービスのURIが印字されるはず。
C1$ ruby second_server.rb druby://hoge:60172
(2) C2でクライアント起動。引数は印字されたURI。
C2$ ruby second_client.rb druby://hoge:60172 [:shimane, "MatzE"] [:hello, "wolrd"]
Hashの内容を印字し、直ちに終わる。
4. 端末間で通信できるか?
1.と3.の実験を二台の実習端末で実験する。端末1でC1を、端末2でC2を起動して、似たような結果が得られるかどうか。
また、講師用の端末とも同様に動作するかも確かめる。