Linda について話題に出たが、論文を読むだけじゃさっぱり分からないので、Ruby の実装を試してみた。Ruby に最初から入ってるみたいで試すのはめっちゃ簡単だった。
まずサーバー。個人サーバーの languagegame.org を使って実験した(豆知識: fedora では irb は別パッケージなので、sudo yum install irb しよう)。
$ irb -r rinda/tuplespace --simple-prompt >> DRb.start_service('druby://languagegame.org:12345', Rinda::TupleSpace.new) => #<DRb::DRbServer:0xb7f49e3c ... >> puts DRb.uri druby://languagegame.org:12345 => nil >> DRb.thread.join
ぱっと眺めた感じ。Linda とはデータベースの事を言うようだった。なので、手元のマシン(kanabun) で接続して、"hello world" と書き込んでみる。使える操作には次の物がある。
- write データの追加
- take データを削除して取り出し。
- read データを残して取り出し。
(kanabun) $ irb -r drb --simple-prompt >> DRb.start_service => #<DRb::DRbServer:0x7ff61b8c ... >> $ts = DRbObject.new_with_uri('druby://languagegame.org:12345') => #<DRb::DRbObject:0x7ff5dbf4 @ref=nil, @uri="druby://languagegame.org:12345"> >> $ts.write(["hello world"]) => #<DRb::DRbObject:0x10022aa0 @ref=-604364348, @uri="druby://languagegame.org:1
で、それを他のマシン(tinlizzie) で読む。読むとデータは無くなる。
(tinlizzie) $ irb -r drb --simple-prompt >> DRb.start_service => #<DRb::DRbServer:0xb7e8a4b0 ... >> $ts = DRbObject.new_with_uri('druby://languagegame.org:12345') => #<DRb::DRbObject:0xb7ef6624 @ref=nil, @uri="druby://languagegame.org:12345"> >> $ts.take([nil]) => ["hello world"]
何となくわかった。データベースと違う所は、読むとデータが消える事、値の取り出し(take) がブロックする事と、一度に一行だけ読み込む事。
ブロックするという性質を使って、遠くのマシンで動く関数を作る事が出来る。普通の関数と違って、値をどう返すかまで考えないといけない。例えば今の時刻を答える仕組みには、"time?" と聞いて、"time!" と答えると言う事にする。
#!/usr/bin/ruby require 'drb' DRb.start_service $ts = DRbObject.new_with_uri('druby://languagegame.org:12345') loop do $ts.take(["time?"]) $ts.write(["time!", Time.now]) end
(kanabun) >> $ts.write(["time?"]) => #<DRb::DRbObject:0x7ff1d8c4 @ref=-604617178, ... >> $ts.take(["time!", nil]) => ["time!", Wed Feb 20 14:35:45 -0800 2008]
"time?" と聞いた後に他の人が割り込んで "time!" を横取りしたらどうなるのだろうという疑問がぬぐえないが、その辺はまた勉強して行こう。