トップ «前の日記(2001-04-09 (Mon)) 最新 次の日記(2001-04-11 (Wed))» 編集   RSS 1.0 FEED  

Journal InTime


2001-04-10 (Tue) [長年日記]

_ 締め日

締め日の変更 はボーナス時まで延期されたらしい。ほっ。

_ mod_ruby

mod_rubyで、Rubyでリクエストハンドラを書けるようにしてcvsにcommitした。

# cat.rb

require "singleton"

class Cat
  include Singleton

  def handler(r)
    begin
      body = open(r.filename).read
      r.content_type = "text/plain"
      r.send_http_header
      r.print(body)
      return Apache::OK
    rescue Errno::ENOENT
      return Apache::NOT_FOUND
    rescue Errno::EACCES
      return Apache::FORBIDDEN
    rescue
      return Apache::SERVER_ERROR
    end
  end
end

みたいなスクリプトを書いといて、httpd.confで、

RubyAddPath /home/shugo/ruby
RubyRequire cat
<Location /cat>
SetHandler ruby-object
RubyHandler Cat.instance
</Location>

なんて設定をしておくと、/cat/以下にアクセスした場合はCat#handlerが呼ばれる。 別にSingleton使わなくても、Object.newして特異メソッド定義するだけでもいいけど。

後は他のハンドラも定義できるようにしなきゃな。

_ mod_rd2html.rb

ちょっと実用的なモジュールをRubyで書いてみたり。 これはRDをHTMLに変換するモジュール。

# mod_rd2html.rb

require "singleton"
require "rd/rdfmt"
require "rd/rd2html-lib"

class RD2HTML
  include Singleton

  def handler(r)
    begin
      open(r.filename) do |f|
	tree = RD::RDTree.new(f)
	visitor = RD::RD2HTMLVisitor.new
	r.content_type = "text/html"
	r.send_http_header
	r.print(visitor.visit(tree))
	return Apache::OK
      end
    rescue Errno::ENOENT
      return Apache::NOT_FOUND
    rescue Errno::EACCES
      return Apache::FORBIDDEN
    rescue
      return Apache::SERVER_ERROR
    end
  end
end

たとえば、httpd.confで、

RubyRequire mod_rd2html
<Location /rd>
SetHandler ruby-object
RubyHandler RD2HTML.instance
</Location>

なんて設定をすると、http://www.foo.org/rd/foo.rdでfoo.rdをRDに変換した結果が 見られるわけ。 ERbを使うモジュールなんかも簡単にできそうだな。