トップ 最新 追記   RSS 1.0 FEED  

Journal InTime


2005-08-01 (Mon) [長年日記]

_ [mod_ruby][Rails] Apache::RailsDispatcher

Agile Web Development with Railsでdeprecated approachと書かれている のに腹が立って*1実装。

<URL:http://svn.modruby.net/repos/mod_ruby/trunk/lib/apache/rails-dispatcher.rb>

(mod_ruby自体も最新にしないと動かないので注意。)

RubySafeLevel 0
# RubyGemを使う場合
# RubyRequire rubygems
RubyRequire apache/rails-dispatcher
RubyTransHandler Apache::RailsDispatcher.instance
<Location /appname>
  SetHandler ruby-object
  RubyHandler Apache::RailsDispatcher.instance
  RubyOption rails_uri_root /appname
  RubyOption rails_root /path/to/rails/root
  RubyOption rails_env development
</Location>

こんな感じの設定で動くと思う。

以下の方針により、複数アプリケーションを動かすことができるようにした。

  • requireしたものはすべてのアプリケーションで共有。
  • require_dependencyしたものはアプリケーションごとの無名モジュールにロード。 (load(filename, true)相当)
  • development環境では無名モジュールを毎回破棄。
  • production環境では無名モジュールを使い回す。
  • Railsの設定(RAILS_ROOTやActiveRecord::Base.colorize_logginなど)は 毎回リセット。
  • 本当はDBのコネクションプールを実装したいけど、まだやってない。

まあ、YARVのMulti VMサポートまでのつなぎだけど。

単一のアプリケーションだけ動かすようなケースでは、今のところlighttpd + FastCGIが一番パフォーマンスがよいが、 FastCGIだとアプリケーション数に比例してプロセス数が増える *2 のが気になるところ。 いっぱいアプリケーションを動かすような場合には、インタプリタや フレームワーク部分を共有するmod_rubyの方がおトクかもしれません。

あと、Rails本では「FastCGIなら100プロセスのWebサーバで静的な ファイルを処理しつつ、FastCGIのプロセス数は10におさえることで メモリ消費を抑えられるけど、mod_rubyだとでかいプロセスが100コ になっちゃうよん」みたいなことが書いてあるけど、mod_rubyでも mod_perlでもふつーそういう時には静的ファイルは別のApache インスタンスなり他のWebサーバに処理させるよね?

*1  もちろん冗談ですよ

*2  FastCGIでもフレームワークの作り方によって違う形にもできるとは思う。

_ [ximapd] やまださんのパッチ

たくさんのパッチをいただいたのでマージ。 ありがたいことです。

自分もちゃんとコード書かないとな。 とりあえず、もうちょっと速くしただけどなかなか大変そう。 fetchの上限を作っちゃうのが一番てっとりばやいかな。 古いメールは検索して読め、と。

本日のツッコミ(全2件) [ツッコミを入れる]

_ はんばあぐ [素晴らしい>mod_ruby]

_ shugo [ありがとうございます。 (あんまり反応がなかったのですっかり忘れてました:()]


2005-08-02 (Tue) [長年日記]

_ [ソフトウェア] amavisをlocalhostからのメールに適用しない

ZnZさんにruby-lang.orgからメールが出る時のウイルスチェックは 無駄じゃないか*1 との指摘を受け、設定の修正。 やまださんに教えてもらった設定を参考に、 master.cfの、

smtp    inet  n       -       -       -       -       smtpd

という行を、

127.0.0.1:smtp    inet  n       -       -       -       -       smtpd
    -o content_filter=
210.163.138.100:smtp      inet  n       -       -       -       -       smtpd

のような変更したらうまく行ったようだ。 ちなみに、210.163.138.100の方が外向けのインタフェイスのIPアドレスである。 127.0.0.1で受けた時だけ、content_filterを空にしているので、amavisによる ウイルスチェックが行われないという仕組み。

main.cfで

content_filter=smtp-amavis:[127.0.0.1]:10024

のようにcontent_filterを設定しているという前提の設定なので注意。

*1  資源に余裕があればやっといた方がいいかもしれないけど。


2005-08-03 (Wed) [長年日記]

_ [その他] Blog

Blogというものをはじめてみた。


2005-08-05 (Fri) [長年日記]

_ [ソフトウェア] Ajaxと戻るボタン

Ajaxなインタフェイスでブラウザの戻るボタンが使えなくて(前に見たコンテンツに戻れない)イライラするのは私だけですか。

_ [ximapd] ximapd 0.0.3 リリース予定

今日リリースして、0.0.x用のブランチを切って、それからやまださんの Hyper Estraier対応をマージしようと思っていたのだが、ちょっと 無理かも。 月曜にはリリースしたいな。

本日のツッコミ(全3件) [ツッコミを入れる]

_ smbd [イライラするときありますねぇー]

_ ogino. [Flashのページなんかも同じようなストレスが..。]

_ shugo [ですよねえ。Flashのページは何か買う時しか見る機会がないのでまあいいんですけど。]


2005-08-06 (Sat) [長年日記]

_ [家族] 風邪

かずひこさん宅でたこやきパーティーのはずだったのに、こんな時に かぎって子どもが熱を出してしまって断念。 朝起きた時は37度ちょいくらいだったのに、姉弟ではしゃぐもんだから 39度近くまで上がってしまった。

本日のツッコミ(全3件) [ツッコミを入れる]

_ かずひこ [やっぱり子どもには直前まで内緒の方がいいのでしょうか?>おでかけ]

_ なかむら(う) [今回は残念でしたねえ、また次の機会に。お子様にはお大事にとお伝え下さい。]

_ shugo [いや、騒ぐのはしかたないですね>子供 また来られる際にはお知らせください>うささん]


2005-08-09 (Tue) [長年日記]

_ [ximapd] ximapd 0.0.3 リリース

リリースしました。

今回はやまださんのリリースといってもいいくらいだなあ。 今後は、いよいよ、他の検索エンジンに対応するためのコードをマージします。

_ [会社] たこやきパーティ

昼に会社の同僚たちとかずひこさん宅に押しかけてたこやきパーティ。 かなり薄めのタネで、中がトロッとしていておいしかった。 出汁も用意していただいて、明石焼風にしてたべたりとか、堪能しました。

_ [tDiary] comment spam

やられまくったので、やまださんのフィルタ を導入。 これではじけるといいなあ。


2005-08-10 (Wed) [長年日記]

_ [ソフトウェア] External Editor

Thunderbirdから外部エディタを起動してメールの編集を行うextension。 こんなものがあったのか。 しかも、もう0.6.1だし。

試してみると、ちゃんと日本語(UTF-8)も扱うことができた。

ちょっとはまったのが、

/usr/bin/gvim --nofork

のように指定しないと、gvimがforkしちゃってうまくいかないこと。 gvimのこの挙動ってうれしいのかなあ。


2005-08-17 (Wed) [長年日記]

_ [ximapd] mobileimap対応

BODYSTRUCTUREをまともにしたり、UIDが付かないSEARCHやSTOREを 実装して、mobileimapが使えるようになった。 何だかすごく遅いけど、mobileimapはNet::IMAPを使っているので どちらにせよ遅いのはたぶん自分のせい:( まあ、いろいろバグもあったし、STARTTLS対応をマージしたら とりあえず0.0.4を出そう。

ただ、現状ではximapdを手元のノートPCで動かしているので、 まだ恩恵を受けることはできていない。 HPの一番グレードの低いサーバでいいから欲しいなあ。

29,925円って書いてある けど、見積りを見るとなぜか最小構成でも33,500円に なってるのは罠ですか。

本日のツッコミ(全1件) [ツッコミを入れる]

_ shugo [FDD外したら、ちゃんとその価格になりました。すまんかった > HP]


2005-08-18 (Thu) [長年日記]

_ [ソフトウェア] svk

今までは他人のプロジェクトをちょこっといじるのにsvkを使っていた だけだったのだが、バックアップも兼ねて、自分のプロジェクト(具体的 にはximapd)にもsvkを使うことにした。

まず、//mirror/ximapdにミラーを用意する。

$ svk mirror https://projects.netlab.jp/svn/ximapd //mirror/ximapd
$ svk sync //mirror/ximapd

次に、//local/ximapdに手元で作業するためのブランチを作る。

$ svk copy -p //mirror/ximapd/trunk //local/ximapd

で、//local/ximapdからチェックアウト。

$ svk co //local/ximapd ximapd

あとは修正を行ってsvnと同様に

$ svk ci

で手元のブランチにcommitできる。 diffやlogなどもsvnと同様に使える。

ミラー元の修正を手元にマージするには、

$ svk pull

とするだけでよい。

逆にミラー元に手元の修正をマージするには、

$ svk push

でよいのだが、これだとsvkのへッダがsvnのログに含まれてしまうため、 ちょっと気持ち悪い。

$ svk push --verbatim

のように--verbatimオプションを指定すると余分なへッダが付かないようだ。

$ svk push --lump --verbatim

だと手元での複数のcommitをミラー元には一回のcommitとしてマージできるらしい。 自分はこまめにcommitするのが好きなので、結構いいかもしれない。


2005-08-22 (Mon) [長年日記]

_ [ソフトウェア] pdnsd

ノートPCでDNSのキャッシュサーバを動かしているのだが、 djbdnsを使うのをやめて、代りにpdnsdを使うようにした。 apt-get installで簡単にインストールできるし、resolvconf もインストールすれば、ifupなどと連動して参照するDNSサーバを 勝手に変更してくれるので楽チン。 *1

*1  今までは自前のスクリプトでやっていたのだ。

_ [ximapd] ximapd 0.0.4

リリースしました。


2005-08-23 (Tue) [長年日記]

_ [C] Coroutines in C

anthy-devより。

Cで、

switch (count % 8) {
    case 0:        do {  *to = *from++;
    case 7:              *to = *from++;
    case 6:              *to = *from++;
    case 5:              *to = *from++;
    case 4:              *to = *from++;
    case 3:              *to = *from++;
    case 2:              *to = *from++;
    case 1:              *to = *from++;
                   } while ((count -= 8) > 0);
}

のように書けることを利用してコルーチンを実現するという話。 Cは奥が深いな。*1

そういえば、と思って、前にScrapBookで取りこんでおいた 以下の記事を見に行ったら、すでにページがなくなっていた。

C言語でコルーチン

どこかに移動したんだろうか。

*1  褒め言葉ですよ。

_ [Ruby] Method Finder

Method Finder というのは、振る舞いからメソッドを探す(!)ためのある種“逆引き”ユーティリティ。「3. 4. 7」とかいうふうに、レシーバ、引数、(期待される)返値の順にリテラル(あるいは値を生成する式)をピリオドで区切って入力すると、該当するメソッドを列挙してくれます。

[sumim’s smalltalking-tos - Ruby の <=>より引用]

へえ。Rubyだとこんな感じかなあ。

def find_method(recv, args, ret)
  return Thread.start {
    $SAFE = 4
    recv.methods.select { |method|
      begin
        recv.send(method, *args) == ret
      rescue Exception
        false
      end
    }
  }.value
end

p find_method(3, [4], 7)
p find_method("foo", ["f", "F"], "Foo")
p find_method("foo", [], "Foo")

実行結果:

$ ruby findmethod.rb
["+", "|", "^"]
["sub", "tr", "gsub", "tr_s"]
["capitalize"]

すごくいやな予感がしたので、一応$SAFE = 4にしてみたけど、 Squeakではどうやって実現してるんだろうか。

_ [Ruby] Re: Method Finder for ruby

すでにあったらしいorz....

id:shinichiro_h さんが、Squeak の Method Finder にヒントを得て、さっそく Ruby で使える Method Finder をこしらえて公開してくださいました。動的言語 and/or 動的システム、万歳!ですね。w

[sumim’s smalltalking-tos - Re: Method Finder for rubyより引用]


2005-08-24 (Wed) [長年日記]

_ [Ruby] DoubleDispatchable

Visitorパターンみたいなダブルディスパッチは好きなのだが、 acceptメソッドみたいなのを何回も書いてると面倒だと思う時がある。 そこでこんなモジュールを書いてみた。

module DoubleDispatchable
  def self.append_features(klass)
    super(klass)
    klass.class_eval do
      @@double_dispatch_methods = {}
    end
    def klass.double_dispatch(method, prefix)
      @@double_dispatch_methods[method.to_s] = prefix.to_s
      define_method(method) do
        raise SubclassResponsibilityError.new
      end
    end
    def klass.inherited(subclass)
      for method, prefix in @@double_dispatch_methods
        method2 = prefix +
          subclass.name.slice(/[A-Za-z]+\z/).gsub(/[A-Z]/) { |s|
          "_" + s.downcase
        }
        subclass.class_eval(<<-EOF)
          def #{method}(obj, *args)
            obj.#{method2}(self, *args)
          end
        EOF
      end
    end
  end
end

これを、

class Query
  include DoubleDispatchable

  double_dispatch :accept, :visit
end

のように使うと、

class AndQuery < Query
end

のようにサブクラス化した時点で勝手に以下のようなメソッドを 作ってくれる。

def accpet(obj, *args)
  obj.visit_and_query(self, *args)
end

もともとはVisitorパターン専用にAcceptableというモジュールを 書いていたのだが、汎用化して上記のような形にしてみた。

調べてみると、Ruby: VisitorPattern でほとんど同じ手法が紹介されてるではないか。 Blogの方で書こうかと思ったけど、 あんまりインパクトないかなあ。


2005-08-26 (Fri) [長年日記]

_ [ximapd] Hyper Estraier 対応

Rastといえば、ximapdをHyper Estraier対応にする実験もやられているみたいだな。実用段階までいくかどうかはわからないけど、コスモポリタニズムというか、ルネサンス的というか、そういうノリは大好きだ。

でも所詮は「比較対象」として、つまり引きたて役の扱いなんだよなぁ。ぶっちゃけ何がいけないんだろう。

[開発メモより引用]

当初は、Rastにべったりで書いていて、クエリもそのままRastのものを 使うなどして、手を抜いていたのですが、現在、バックエンドを本体から 独立させて、クエリの解析などを自前でやってバックエンドで検索エンジン の違いを吸収できるように作業中です。

というわけで、ximapd 0.1.0では、Hyper Estraierも基本的に Rastと同等の扱いになります。


2005-08-28 (Sun) [長年日記]

_ [家族] 幼稚園の環境整備作業

環境整備作業というと何かすごそうであるが、要はドブさらいである。 しかも朝の7:30から。 でも、まあ、玉湯の奉仕作業の6:00集合にくらべたら随分マシなものだ。

日ごろ運動しないものだから、ひどく疲れた。 ちょっと泳いだりして身体を動かした方がいいかもしれない。

いちご組の先生は男の人なんだけど、ちょっとごとけんさんに雰囲気が似てるな。 自分よりずっと若いらしい。若いごとけんさん。

_ [その他] 散髪

床屋で散髪。終わった後にアンケートを書いたんだけど、

Q. シャンプーはどちらがいいですか。

(1) うつぶせ
(2) あおむけ

のような選択肢がっ。

くわばら、くわばら。