今日の gem install
- mechanize
Growl の通知は消えてしまうのでうんたらかんたら。Ircv は http://www.misuzilla.org/dist/net/ircv/ です。

http://lab.lowreal.net/trac/browser/c/mac/iicv.rb
Ruby/Cocoa の TransparentHelloWorld を参考にちょっと作り替えただけ。
setNeedsDisplay(true) すると再描画してくれるらしい。
縁取りがどうも簡単にできなくて試行錯誤した。NSStrokeWidthAttributeName を太めにして描画とかやってみたけど、どうもゴミがでて汚い。
しかたないので NSShadow を使ってるけど、薄いので5回重ねてる。おそそ
クリックを透過するのってどうすればいいんだろう……
require 'drb/drb'
require 'time'
o = DRbObject.new_with_uri("druby://localhost:9876")
loop do
o.call(Time.now.xmlschema)
sleep 1
endIRC 部分書くのがめんどいので DRb にした。
両方の Server 同士でそれぞれタプルを書き込み合うっていうのがたぶん一番簡単な方法かな?
ts = Rinda::TupleSpace.new
place = Rinda::RingServer.new(ts)
DRb.start_service(uri, ts)
other_ring_server = DRbObject.new_with_uri("druby://other-network")
ts.notify(tuple_match).each do |t|
other_ring_server.write(t)
endでもこれだけだと NAT とかの場合にタプルは取得できるのにサービスに接続できないというハメになりそう。
drb/gw.rb を使わないとだめかな? SimpleDelegator を DRbUndumped にしてあげるだけでもいけそうな気がする
class Rinda::PeskyRingProvider < Rinda::RingProvider
def provide
entry = nil
loop do
begin
if entry
# 登録済みタプルを削除する
entry.renew(0)
end
# RingServer を再検索する
Rinda::RingFinger.finger.lookup_ring_any
entry = super
rescue DRb::DRbConnError, RuntimeError => e
# RingServer が見つからないときのエラーをキャッチ
entry = nil
end
sleep 60
end
end
end
スクリプトエディタのライブラリ使うとアプリケーションごとのリファレンス見れるのか……
inspect 相当の命令ってないのかなぁ。{1, 1} を "{1, 1}" にするとか
http://rubyosa.rubyforge.org/ を入れようと思ったら libxml-ruby が入らなかった。
extconf.rb:64: undefined method `find_header' for main:Object (NoMethodError)
ruby のバージョンが古いせい (1.8.2) っぽい。
しかし新しいバージョン入れるのめんどい(コンパイルはしてあるけど、置き換えるのがいろいろめんどそう……)ので、
sudo gem install libxml-ruby -- --with-xml2-include=/usr/include/libxml2
した。
rubyosa 使って applescript にインターフェイスにアクセスした場合帰ってくる文字コードは Shift_JIS みたいだ。
http://lab.lowreal.net/trac/browser/c/lyric/itunes-timetag.rb
/ART-SCHOOL/EVIL/02-WISH.txt みたいな感じになってるのを HTTP からとってきて表示させてみる。
しかし track position が秒単位でしかとれないのでいまいち。
algorithm-diff で常に直近の数行の文字ごとの diff をとりながら、共通する部分をキーワードDBに登録していく。
ログは全てn-gram 式の全文検索エンジンに突っ込んでいく。
直近の diff から得た共通部分からランダムにトピックワードを選択し、全文検索。出てきた結果の上位数件からランダムに行を抽出し、直近の行と再び diff をとる。その結果のキーワードをキーワードDBから取り出した(どうやって?)ランダムなものに置換する。
http://lab.lowreal.net/trac/browser/c/mendoi/autoring
ネットワークまたがった場合のいい方法が浮かばないなぁ。とりあえず chain できるようにしてみた。他に方法あるんだろうか
# 主要 RingServer を uri つきで起動 ./ring.rb -u druby://host:4321
でもって違うネットワークでは普通に RingServer をたてて
uri 指定して reload メッセージを別の RingServer の tuplespace に投げるサービスを起動
./ring.rb& ./reload_chain.rb druby://host:4321&
美しくないな。
っていうか上流サーバのあるネットワークで cl.rb 起動されても下流に通知されないからこれじゃだめか。ネットワークが分かれているというより、NAT なのが悪いんだよなぁたぶん。NAT でなければ Finger.new("servername") でいけそうだ
解決法:ネットワーク分けない
所属ギルドが解散するらしい。残念だなぁ。
ここ最近ログインしてもコミュニケーションサーバーが重くてギルドチャットがまともに通らないことが多い。直後はしばらく繋がらないから発言できないし。キャラクターチェンジ多いとほぼずっとオフライン扱いになってしまう。直して欲しいな、と書こうと思っていたけどもうどうでもいいな。
大してログインもできないくせにこれから他のギルドに所属するのは面倒くさい。今更知らないギルドに入って相手の考えていることを量りながらチャットするなんてモチベーションは生まれてこないし、そんなに時間がとれない。
そろそろネトゲも卒業ですか。
Provider は RingServer を定期的に再検索するようにしたほうがいいっぽいなぁ。RingServer が落ちてもそれを検知できないから……
provider = Rinda::RingProvider.new(:Reload, DRbObject.new(reload), 'Reload')
entry = nil
loop do
begin
if entry
# 登録済みタプルを削除する
entry.renew(0)
end
# RingServer を再検索する
Rinda::RingFinger.finger.lookup_ring_any
entry = provider.provide
rescue DRb::DRbConnError, RuntimeError => e
# RingServer が見つからないときのエラーをキャッチ
entry = nil
puts e.message
end
sleep 60
endなんかいい方法ないかなぁ。これだと Renewer は意味がなくなる。(Renewer はサーバからのリクエストの答えるだけなので、サーバが動いてなければ意味をなさない。)
provide メソッドをオーバライドしてブロックするようにしてもいいかもしれない。