A Day in the Life

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秒でできるけど死に繋がるいたずらはやめてください…。ビデオキさんもやられたことがあるらしく、坂を下ったら気づいて死にそうになったらしい。というわけであらかじめこのいたずらの存在や直し方がわかっててよかった。ありがとうビデオキさん!知らなかったらチャリ屋に持って行ってたよ…。

そして通勤途中にチェーンはずれるし。もういやだこんな朝><。

記事の一覧 >