2006年 09月 25日

Ruby で CGI 書くとき

require "cgi" して簡単なのを書くときの指針がやっとできたのでメモ。

require "cgi"

class HogeCgiApplication
    def initialize(cgi, opt={})
        @cgi = cgi
    end
    
    def run
        # リクエストの応じて他のメソッドに飛ばす
        _, mode, rest = @cgi.path_info.to_s.split("/", 3)
        if mode && respond_to?(mode)
            send(mode, *rest)
        end
    end

    def view
        show(:param => "hoge")
    end

    def show(stash={})
        b = binding
        stash.each do |k, v|
            eval("#{k} = stash[:#{k}]", b)
        end

        template = File.read(@opt[:Template])
        self.class.class_eval { include ERB::Util }
        @cgi.out("type" => "text/html") { ERB.new(template).result(binding) }
        exit
    end
end

cgi = CGI.new
hoge = HogeCgiApplication(cgi)
hoge.run

セッション使ったりするので必ず cgi.out を使う。場合によっては cgi.out をオーバーライドしてうんぬんできる。

でもまぁフレームワーク使うならそれでいいんだろうなぁ。

自宅のは .rb なのは fcgi で動くようなラッパ書いて動かしてるけど……

http://lab.lowreal.net/trac/browser/c/cgi-wrapper 前に lowreal.net に書いたけど、エラーとかキャッチしてスタックトレース出すようにしたり。元のファイルを書き換えずにエラーハンドル追加できるので結構自分で使う分には便利に使ってたりする。CGI バージョンは今はたぶんちゃんと動いてないな。

daap

256kbps の mp3 を再生中だと 70KB/s ぐらいネットワーク受信がある。外からだと結構きつそう。

fcgi

のラッパ使って ruby cgi を動かしてると、require でロードされたスクリプトがずっと残るのでときどきハマる。一度 load に書き換えてあげたりして

小さいアプリケーションでもフレームワーク使った方がいいっていうのはすごく思う。だけど、例えば XREA で使おうとか思ったとき、Rails や Catalyst ぐらい巨大だと CGI 動作じゃ死にたくなる。
なんか K*NT 指向なんだけどさ!!

chokan のソース

今動いてるやつも少し前にインポートしたよ!
http://lab.lowreal.net/trac/browser/chokan/old/0.2

新しいの作ろうとしてるけど全然やってないよ!

深く

深く考えずにとりあえずコーディングしてみる、というのを実践してみた。「やった感」と「動いた感」はあるので楽しい。いっぽう、「無駄なことをいっぱいしているんじゃないか?」「設計がダサくないか?」と不安になる。
思うに、ひたすら経験な気がした。他のソースを読みまくって、「あーこういうケースで、あのすぱーはかーはああしていたなぁ」とか思い出すと、コード書いてるときにあんまり悩まないようになる、気がする。そうなりたい。が、どこまでモチベーション続くかは一生謎

新しいほう

http://lab.lowreal.net/trac/browser/chokan/trunk
ファイルの配置変えとかと、config の統一をやった。とりあえず動く、けど、既存プラグインを移植してない。
@s << notice() より、@chokan.notice() とかのほうがよさそう。そうすれば余計なインスタンス変数 (プラグインごとに設定してる) をなくせるかなぁ。