@m_seki の

I like ruby tooから引っ越し

東京Ruby会議でDripハンズオンやったよ

DripとdRubyのハンズオンセミナーを東京Ruby会議でやりました。あいにくの雪の中、参加してくれたみなさんありがとう。参加しなかったみなさん残念でした!

当日の資料のPDF版はgithubにおいてあるので、Pages版をGumroadで売ろうと思います。


当日でたいくつかの質問についてコメントします。

Queueは知らないオブジェクトどう扱うのか

DRbUnknownという仕組みを使います。未知のオブジェクトをMarshal.loadするときに、特別なオブジェクトで包んで扱うことで、ストレージ的なサービスを簡単に書けるようにしています。
DRbUnknownについてはこのビデオでも述べられています。

また、ビビッドレッドオペレーション#2 04:30くらいにてDRbUnknownの実装が説明されています。

Dripのキーの発番のしくみ

Dripではキーの発番の設計が全てと言っても過言ではありません。Dripのキーの発番はRindaのTupleSpaceで排他制御された区間で行われます。
まず、Time.nowのsec, usecから作った整数がキーの候補となります。キーの候補が前回のキーと同じ/小さい場合には前回のキー+1の整数がキーとなります。(実際にはぶつかることはほとんどありませんので、開発中はキーの分解能を変えて試しています)

  def make_key(at=Time.now)
    synchronize do |last|
      key = [time_to_key(at), last + 1].max
      yield(key)
      key
    end
  end
   
  def synchronize
    _, last = @event.take([:last, nil])
    last = yield(last)
  ensure
    @event.write([:last, last])
  end

TupleSpaceでキーの発番を管理するのは排他制御のためだけではありません。新しい要素の追加を待つスレッドを起こすトリガーにもなっています。

  def wait(key, renewer)
    @event.read([:last, key+1 .. INF], renewer)[1]
  end

詳しくはこの英語の本を!

The dRuby Book: Distributed and Parallel Computing with Ruby

The dRuby Book: Distributed and Parallel Computing with Ruby