@m_seki の

I like ruby tooから引っ越し

講義先の環境で野田先生に確認してもらうこと

RubyCygwinの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.

(3) C1のRubyインタプリタを終了(Ctrl-C???)して実験終わり。

2. Thread#joinで待ってもちゃんと動くか?

サーバの最後にあるwhileのループはなんかWindowsRubyでメインスレッドがスイッチしないときなどに使うトリック。なければない方がよいので、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の内容を印字し、直ちに終わる。

(3) C1のRubyインタプリタを終了(Ctrl-C???)して実験終わり。

4. 端末間で通信できるか?

1.と3.の実験を二台の実習端末で実験する。端末1でC1を、端末2でC2を起動して、似たような結果が得られるかどうか。
また、講師用の端末とも同様に動作するかも確かめる。