Friday, March 20, 2009

Shoes with dRuby

ShoesでdRubyを使う例
但しオセロゲームのように
両側で同じ動作をさせる場合
以下のようにする
  • ユーザによりサーバーになるかクライアントになるかの選択ボタンのようなものを用意する
  • サーバー側となったスクリプトでサーバーオブジェクトを生成しFRONTにする
  • このときサーバー側のShoesアプリを渡し、配列などで管理する
  • クライアント側が選択されるとFRONTを受け取ると共にクライアント側のShoesアプリをサーバーオブジェクトに登録されるようにし、上の配列で管理する
  • 同期を取りたい任意のアクションを配列で管理されている各アプリに渡す
これはちょうどオブザーバーパターンのようなものだな
簡単な同期なら以下のような方法でもできる

time_server.rb

   1  require "drb/drb"

   2  

   3  class TimeServer

   4    #  include DRbUndumped

   5    attr_accessor :color

   6    def initialize

   7      @color = :black

   8    end

   9  

  10    def get_current_time

  11      "#{Time.now.ctime}"

  12    end

  13  end

  14  

  15  Shoes.app :width => 400, :height => 400 do

  16    $SAFE = 1

  17    URI = "druby://localhost:8787"

  18    FRONT = TimeServer.new

  19    DRb.start_service(URI, FRONT)

  20  

  21    @timer = stack do

  22      animate 8 do

  23        @timer.clear do

  24          para FRONT.get_current_time

  25          para FRONT.color

  26        end

  27      end

  28    end

  29    stack do

  30      button "Green!" do

  31        FRONT.color = :green

  32      end

  33    end

  34  

  35  end


time_client.rb

   1  require "drb/drb"

   2  

   3  

   4  Shoes.app :width => 400, :height => 400 do

   5    URI = "druby://localhost:8787"

   6    DRb.start_service

   7    FRONT = DRbObject.new_with_uri(URI)

   8  

   9    @timer = stack do

  10      animate 8 do

  11        @timer.clear do

  12          para FRONT.get_current_time

  13          para FRONT.color

  14        end

  15      end

  16    end

  17    stack do

  18      button "Red!" do

  19        FRONT.color = :red

  20      end

  21    end

  22  end

No comments: