オートリロードでリロードが楽になるのはいいんだけど、リロードさせるために設定をしたりとかするのがすっごいめんどく感じるようになってきたので設定もオートでやろうぜって思った。

Rinda::Ring は UDP で検索したり登録したりしてサービス呼び出せるライブラリで、これを使うと一瞬で上のようなことができちゃってオレスゲー感を味わえます。ちょーLL

まず tuplespace を起動する。以下のスクリプトそのまま。このタプルスペースはサービスの情報を統括してる。

require 'rinda/ring'
require 'rinda/tuplespace'

DRb.start_service

ts = Rinda::TupleSpace.new
place = Rinda::RingServer.new(ts)

DRb.thread.join

次に各種リロードサービスを tuplespace に登録するスクリプト。 こいつらはブラウザとともに常駐して、リロード要求をうけつける。これらはもちろん RingServer と同じホストで動いている必要はない。

以下は例

reloadfx.rb

#!/usr/bin/ruby

require 'rinda/ring'
require 'net/telnet'

class Reload
    def reload
        telnet = Net::Telnet.new({
            "Host" => "localhost",
            "Port" => 4242
        })
        telnet.puts("content.location.reload(true)")
        telnet.close
    end
end

reload = Reload.new
DRb.start_service(nil, reload)

provider = Rinda::RingProvider.new(:Reload, DRbObject.new(reload), 'Reload')
provider.provide

DRb.thread.join

reloadsafari.rb

#!/usr/bin/ruby

require 'rinda/ring'
require 'net/telnet'

class Reload
    def reload
        <<-`EOC`
        osascript -e '
        tell application "Safari"
            do JavaScript "location = (location.href);" in document 1
        end tell
        '
        EOC
    end
end

reload = Reload.new
DRb.start_service(nil, reload)

provider = Rinda::RingProvider.new(:Reload, DRbObject.new(reload), 'Reload')
provider.provide

DRb.thread.join

でもって、上記サービスをタプルスペースから検索し、リロードメソッドを呼ぶスクリプト

#!/usr/bin/ruby
# reload.rb
require 'rinda/ring'

DRb.start_service
ts = Rinda::RingFinger.primary

ts.read_all([:name, :Reload, DRbObject, nil]).each do |i|
    begin
        p i[2].reload
    rescue Exception => e
        puts e.message
        puts e.backtrace
    end
end

この reload.rb を呼ぶだけで、何の設定もなしに、ネットワーク内のブラウザをリロードする。

新しくブラウザを起動したら同時にそのブラウザ用の Provider を起動すれば、それも何の設定もなしにリロードしてくれるってわけですよ。やばい!

Rinda::Ring さいこう>< DRb は Ruby の宝><

もうちょっといぢってみる。