Just another Ruby porter,

〜2004年7月下旬〜


<Prev(,) | Next(.)> | Recent(/)>> | RDF

2004-07-21 (Wed)

[Ruby] lilyをWEBrickのservelet化する

まずはrequireできるようにln -s lily.cgi lily.rbしておく。 sample/webrick/hello.rbを参考にすると、 res.bodyに入れとけってことなので、

require 'lily'
require 'webrick'

class LilyContent < Lily
  def webrick_body=(body)
    @content = body
  end
  def print(*s)
    @content << s.join("") unless s[0] =~ /Content-type:/
  end
end

としてみる。幸いなことにlilyはprintしか使ってないので、 printをここで定義した。 ちゃんとやるなら$stdout.writeを定義すべき。

続いてcgi.rbを使うのもなんだし、 lilyではCGI#path_infoとCGI#[]しか使ってないので、 そのあたりをでっちあげてみる。

class LCGI
  attr_reader :params
  def initialize(req)
    @req = req
    @params = {}
    req.query.each do |key, value|
      @params[key] = Array(value)
    end
  end
  def path_info
    @req.path_info
  end
  def [](name)
    @params[name]
  end
end

以上準備できたのでdo_GETを作ってmountする。 POSTもGETと同じでいい。

class Lilylet < WEBrick::HTTPServlet::AbstractServlet
  def do_GET(req, res)
    res["content-type"] = "text/html"
    lily = LilyContent.new(LCGI.new(req), load_env)
    lily.webrick_body = res.body
    lily.disp
  end
  alias do_POST do_GET
end

httpd = WEBrick::HTTPServer.new(:DocumentRoot=>Dir.pwd, :Port=>10080)
httpd.mount("/lily", Lilylet)
trap(:INT) do
  httpd.shutdown
end
httpd.start

これでhttp://localhost:10080/lily/でアクセスできる。


2004-07-22 (Thu)

[XP] XP祭り2004

咳さんのプレゼン資料の表紙に笑う。

[Ruby] WEBrick serveletで$stdoutを置き換え

昨日の続き。print以外が使えるように$stdoutを置き換えてみる。

class Stdout
  def initialize(body)
    @body = body
  end
  def write(*s)
    @body << s.join("") unless s[0] =~ /Content-type:/
  end
end

というクラスを作っておいて、do_GETの中で

$stdout = Stdout.new(res.body)

とすれば一応目的は達成できるけど、いまいち。 直接$stdout.writeを定義しようとすると、 res.bodyをどうやって渡すか悩むし。

lily.cgiのほうを手を加えないで済むうまい手をもうちょっと摸索してみよう。


2004-07-23 (Fri)

[Ruby] WEBrick serveletで$stdoutを置き換え

さらに続き。わざわざクラスを作らなくてもres.bodyにwriteメソッドを追加しちゃうのはどうだろう?

class << res.body
  def write(*s)
    self << s.join("") unless s[0] =~ /Content-type:/
  end
end
$stdout = res.body

それはそれとして、lily.cfgでurlを設定していないときは CGI#server_nameとCGI#script_nameが必要だった。

def server_name
  @req.host
end
def server_port
  @req.port
end
def script_name
  @req.script_name
end

以上をまとめて lilylet.rbという名前で置いとこう。


2004-07-24 (Sat)

[Ruby] Lilyletで複数のblog

WEBrickでservlet化したのはいいが、これだと1つしか動かせない。 lily自身はnewして複数起動できるわけだし、lily.cfgを切り替えれば対応できそうな気がする。

というわけで、こんなのを考えてみた。

def load_config(dir)
  config = {}
  open(File.join(dir, "lily.cfg")) do |f|
    f.grep(/^([a-z_:]+)\s+(.*)/) do
      key, val = $1, $2 || ""
      val = File.join(dir, val) if /dir$/ =~ key && /^\// !~ val
      config[key] = val
    end
  end
  config
end

として、datadir, flavordir, plugindirを絶対パスに変換してしまう。あとは

lily = Lily.new(LCGI.new(req), load_config(@options[0]))

のようにload_envの代わりにload_configを使い

httpd.mount("/foo/lily", Lilylet, "/home/foo/lily")
httpd.mount("/bar/lily", Lilylet, "/home/bar/lily")

と好きなだけmountしとけば

http://localhost:10080/foo/lily/で/home/foo/lilyに
http://localhost:10080/bar/lily/で/home/bar/lilyに

アクセスできる。


2004-07-25 (Sun)

[Ruby] $stdoutを排他制御

考えてみたら$stdoutを別のものに置き換えたらthread safeにならない。 だめじゃん。ちゃんと排他制御しよう。

require 'thread'
module Stdout
  @@mutex = Mutex.new
  def redirect
    @@mutex.synchronize do
      stdout = $stdout.dup
      $stdout = self
      yield
      $stdout = stdout
    end
  end
  def write(*s)
    self << s.join("") unless s[0] =~ /Content-type:/
  end
end

のようなmoduleを作って

(res.body.extend Stdout).redirect do
  lily.disp
end

というようにextendすればよさげだ。

lilylet.rb


2004-07-26 (Mon)

[Worm] ruby-lang.orgへwormが来襲

それはもうすごい数。いったい何が起きたんだ? とりあえず明日の朝までruby-*-ctl@ruby-lang.org宛てのメールは/dev/nullに捨てるんでよろしく。

追記: 大元で対処したので、現在ruby-*-ctlは復活してます。


2004-07-27 (Tue)

[Mail] fmlのREJECT_COMMAND_HANDLERのなぞ

-ctl宛てにvirusやらspamが来たときに、REJECT_COMMAND_HANDLERがauto_registだと非常にやっかいなことになる。 もはやconfirm mailを送り返しても迷惑なだけだろう。

今朝ignoreにしたらなぜか投稿自体が流れなくなるという自体になったらしい。 どうにも納得いかないよねえ。

MAIL_LIST                       ruby-talk@$DOMAINNAME
PERMIT_POST_FROM                members_only
REJECT_POST_HANDLER             reject

CONTROL_ADDRESS                 ruby-talk-ctl@$DOMAINNAME
PERMIT_COMMAND_FROM             members_only
REJECT_COMMAND_HANDLER          ignore

じゃだめなのかな。

[Worm] 現在の~/.procmailrc

zipとexeのような添付はもう全部要らないってわけで、~/.procmailrcで

:0 B
* ^(UEsDBAoAA[AQ]AAA|TV[qo][QA]AA[ME]AAAA[EC]AAAA)
junk/.

としている。もう2,3ヶ月ぐらい経つと思うけど、この設定で全然問題ないなあ。 こんな正規表現でいいならprocmailやめられるか。

それはそれとして、Mydoom.M祭りのわりには今日は32通と思ったよりも少ない。 ruby-lang.orgにvirus scanが入ったおかげか。


2004-07-28 (Wed)

[Soft] Dnsmasq 2.10

Changes:

Highlights of this release include support for DNS queries over TCP and minimal support for DNSSEC and EDNS. The DHCP server now pushes configuration changes out to existing clients better. There are some minor bugfixes and a new "contrib" section, which has a utility that produces an page showing the contents of the DHCP lease pool.


2004-07-29 (Thu)

[Soft] diet libc 0.27

Changes:

diet can now use $DIETHOME to locate the installation. Some BSD backwards compatibility cruft was added. A few bugfixes were made.

[Ruby] AltGr問題解決

というわけでAltGr問題はinputrcで解決したようだ。

"\M-[": "["
"\M-]": "]"
"\M-{": "{"
"\M-}": "}"
"\M-\\": "\\"
"\M-|": "|"
"\M-@": "@"
"\M-~": "~"

2004-07-30 (Fri)

[Ruby] gsub.gsub.gsub...

Perlではこうだけど、Rubyではどう?という質問はありがちだけど、その逆はあまり見たことがない。ちょっと新鮮。

[Soft] 多くの解凍ソフトに指定外の場所へファイルが解凍されてしまう脆弱性が存在

うーむ。なんか気になる。他のソフトでもありうる話なのかな。 すぐ思いつくのはdot-dot-slash攻撃だけど単純すぎか(あややじゃないよ)。

[Security] Port 135

昼ぐらいからPort 135へのアクセスが急増。なんか流行り始めてる?


2004-07-31 (Sat)

[Soft] Clam AntiVirus 0.75.1

ruby-lang.orgにも導入されたClam AntiVirusを入れてみた。 どのくらいの実力なのか~/Mail/virusで試す。

% clamscan -m ~/Mail/virus
<...>
----------- SCAN SUMMARY -----------
Known viruses: 23051
Scanned directories: 1
Scanned files: 9881
Infected files: 9872
Data scanned: 255.07 MB
I/O buffer size: 131072 bytes
Time: 156.649 sec (2 m 36 s)

OKになってしまったファイルを調べてみると、 zipとpifファイルが添付されたメールだった。 これらはvirusかどうかも不明だしねえ。 結構すごいね。

これで種類がわかりやすくはなったが、なんか名前が他とは違うような。 NetskyがSomeFoolだったりで。でもそういう目的なら online scannerで十分か。


<Prev(,) | Next(.)> | Recent(/)>> | RDF


WWW を検索 jarp.does.notwork.org を検索

わたなべひろふみ
Key fingerprint = C456 1350 085F A320 C6C8 8A36 0F15 9B2E EB12 3885
Valid HTML 4.01!