2006-10-03
おなか減った
牛丼食べたい。この時間に食べると…。あああああううううう。
Capistrano で改善したいところ
- sudo でコマンド失敗($? が 0じゃない)したらそこで処理が止まる
- :force オプションとか欲しいな。stop; start で止まるのは痛い
- Thread での並列処理
- 直接処理もしたいよ。ソース見たけど修正めどそう…。
- コールバックハンドラを複数登録
- 今だと Proc な block 一つしか登録できないんでチェインでやりたい
- production しか deploy 考えてない
- わりと無理矢理拡張したので、もっとかっちょよくして patch 送りたい
- Net::SSH でパスフレーズがいつも必須
- :password なしなら ssh-agent が使われる(と思う)のに。でもその後 sudo の Password: の stdin に流し込むストリームのとこで ssh-agent 使ってるとパスワード入力されずマズーに。
誰か↑全部修正してください(他人本位かよ)
CCCD
最近全く見かけなくなったなぁ。良いことだ。あの暗黒の数年間はなんだったんだ…。
そして久しぶりに iTunes の CDDB に登録されてないアルバムががが。久しぶりに CDDB に登録したよ。iTunes のインタフェでトラック名入力めどいね。。
dRuby で 1プロセスで複数サービスの提供
http://subtech.g.hatena.ne.jp/cho45/20061002/1159729733
そういえば DRb って一つのプロセスで複数のサービスってできるんだろか。URI 違えばいいのかな。
オプション付き URI というので指定できます。ていうかどこにもドキュメント無い?王子様本(dRubyによる分散・Webプログラミング)にも載ってなかったような…?たまたま dRuby のソース読んでて前見つけたんだっけ。
というわけで解説を書いてみる。
druby://hostname:10000?optionname
というスキームでアクセスすると、dRuby のフロントオブジェクトに[]メソッドが引数の文字列「optionname」で呼ばれ、その戻り値が DRbObject となる。つまり[]メソッドをファクトリにしてやればよい。
class Double
def double(i)
i * i
end
end
class MathDelegate
def method_missing(*args)
Math.send *args
end
end
class DRbFactory
def initialize
@double = Double.new
@math = MathDelegate.new
end
def [](arg)
case arg
when 'double'
@double
when 'math'
@math
end
end
end
require 'drb'
DRb.start_service 'druby://localhost:2001', DRbFactory.new
DRb.thread.join
な感じ。これで
druby://hostname:port?math
で MathDelegate のインスタンスな DRbObject を取得できるし、
druby://hostname:port?double
で Double のインスタンスな DRbObject を取得できる。
/usr/bin/drb
druby はクライアントとして利用するのに初期化が面倒。ちょっとテストでいじりたいときにあれそれする時とか、毎回同じようなコード書くのがめんどくさくなったので作ってみた。
$ drb druby://localhost:2001
>> drb
=> #
>> drb.double 3
=> 9
> exit
こんな。第一引数に uri 渡して起動すると、Kernel::drb に DRbObject インスタンスが入ってるのであとはお好きに、みたいな。
#!/usr/bin/env ruby
require 'irb'
require 'drb'
unless ARGV.first
puts 'usage: drb druby://hostname:9000'
exit 1
end
DRb.start_service
module Kernel
@@__drb_object = DRbObject.new_with_uri ARGV.shift
def drb
@@__drb_object
end
end
IRB.start
/bin/false
なるほど。
$ /bin/false
$ echo $?
1
$ /bin/true
$ echo $?
0
dRuby?
http://clouder.jp/yoshiki/mt/archives/000716.html
って、dRubyってなに!?
RMI のようなもんですが、RMI って俺もよく知りません><。一言で言うと「ruby のインスタンスを別の ruby からあたかもローカルに存在するインスタンスのように呼び出せる」というすばらしい仕組みを持ったライブラリです。
マシン1で
class Double
def double(i)
i * i
end
end
require 'drb'
DRb.start_service('druby://localhost:2001', Double.new)
DRb.thread.join # スレッド待ち受け
のようなコードを書いて実行します。Double というクラスは double メソッドを持ち、与えられた数値を倍にして返します。
次に別のマシン(同じマシンでもいいけど)でこんなコードを書きます。
require 'drb'
DRb.start_service
obj = DRbObject.new_with_uri 'druby://サービスを動かしてるマシン:2001'
p obj.double(4)
p obj.double(10)
結果は
16
100
と druby サービスで動いているインスタンスに実行した結果を取得できます。これのすごいところは、ローカルではリモート先の実装を全く知らなくても良いところです。つまり Double クラスのコードはローカルでは必要なく、呼び出しメソッドに渡す型と戻り値だけわかってれば利用できます。しかも超お手軽に。
というわけでこれを応用するとわりとなんでもすごいシンプルにローカル/リモートとのつなぎこみの実装できてすばらしい感じに。
いたずら[これはひどい]
朝チャリにのったらブレーキが外されてた!!!3秒でできるけど死に繋がるいたずらはやめてください…。ビデオキさんもやられたことがあるらしく、坂を下ったら気づいて死にそうになったらしい。というわけであらかじめこのいたずらの存在や直し方がわかっててよかった。ありがとうビデオキさん!知らなかったらチャリ屋に持って行ってたよ…。
そして通勤途中にチェーンはずれるし。もういやだこんな朝><。