2005-08-01 (Mon) [長年日記]
_ 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サーバに処理させるよね?
_ やまださんのパッチ
たくさんのパッチをいただいたのでマージ。 ありがたいことです。
自分もちゃんとコード書かないとな。 とりあえず、もうちょっと速くしただけどなかなか大変そう。 fetchの上限を作っちゃうのが一番てっとりばやいかな。 古いメールは検索して読め、と。
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-05 (Fri) [長年日記]
2005-08-06 (Sat) [長年日記]
_ 風邪
かずひこさん宅でたこやきパーティーのはずだったのに、こんな時に かぎって子どもが熱を出してしまって断念。 朝起きた時は37度ちょいくらいだったのに、姉弟ではしゃぐもんだから 39度近くまで上がってしまった。
2005-08-09 (Tue) [長年日記]
_ たこやきパーティ
昼に会社の同僚たちとかずひこさん宅に押しかけてたこやきパーティ。 かなり薄めのタネで、中がトロッとしていておいしかった。 出汁も用意していただいて、明石焼風にしてたべたりとか、堪能しました。
_ 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) [長年日記]
_ mobileimap対応
BODYSTRUCTUREをまともにしたり、UIDが付かないSEARCHやSTOREを 実装して、mobileimapが使えるようになった。 何だかすごく遅いけど、mobileimapはNet::IMAPを使っているので どちらにせよ遅いのはたぶん自分のせい:( まあ、いろいろバグもあったし、STARTTLS対応をマージしたら とりあえず0.0.4を出そう。
ただ、現状ではximapdを手元のノートPCで動かしているので、 まだ恩恵を受けることはできていない。 HPの一番グレードの低いサーバでいいから欲しいなあ。
29,925円って書いてある けど、見積りを見るとなぜか最小構成でも33,500円に なってるのは罠ですか。
_ 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 0.0.4
リリースしました。
2005-08-23 (Tue) [長年日記]
_ 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で取りこんでおいた 以下の記事を見に行ったら、すでにページがなくなっていた。
どこかに移動したんだろうか。
*1 褒め言葉ですよ。
_ 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ではどうやって実現してるんだろうか。
_ Re: Method Finder for ruby
すでにあったらしいorz....
id:shinichiro_h さんが、Squeak の Method Finder にヒントを得て、さっそく Ruby で使える Method Finder をこしらえて公開してくださいました。動的言語 and/or 動的システム、万歳!ですね。w
2005-08-24 (Wed) [長年日記]
_ 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) [長年日記]
_ Hyper Estraier 対応
Rastといえば、ximapdをHyper Estraier対応にする実験もやられているみたいだな。実用段階までいくかどうかはわからないけど、コスモポリタニズムというか、ルネサンス的というか、そういうノリは大好きだ。
でも所詮は「比較対象」として、つまり引きたて役の扱いなんだよなぁ。ぶっちゃけ何がいけないんだろう。
[開発メモより引用]
当初は、Rastにべったりで書いていて、クエリもそのままRastのものを 使うなどして、手を抜いていたのですが、現在、バックエンドを本体から 独立させて、クエリの解析などを自前でやってバックエンドで検索エンジン の違いを吸収できるように作業中です。
というわけで、ximapd 0.1.0では、Hyper Estraierも基本的に Rastと同等の扱いになります。
2005-08-28 (Sun) [長年日記]
_ 幼稚園の環境整備作業
環境整備作業というと何かすごそうであるが、要はドブさらいである。 しかも朝の7:30から。 でも、まあ、玉湯の奉仕作業の6:00集合にくらべたら随分マシなものだ。
日ごろ運動しないものだから、ひどく疲れた。 ちょっと泳いだりして身体を動かした方がいいかもしれない。
いちご組の先生は男の人なんだけど、ちょっとごとけんさんに雰囲気が似てるな。 自分よりずっと若いらしい。若いごとけんさん。
_ はんばあぐ [素晴らしい>mod_ruby]
_ shugo [ありがとうございます。 (あんまり反応がなかったのですっかり忘れてました:()]