sprintf がらみの酷いバグを指摘されたので修正。
POPS はどうしようかなあ。 これ以上 start の引数を増やすのは嫌だから、 net/https みたく new してセットするようにしようかな。
(14:41)
今日はひたすら実装の日なのです。
1. mod_ruby だと $0 が false になっている
Apache.request.filename で代用。
2. fork すると直後に SEGV
謎だ。例えば次のようなプログラムを実行すると、
# fork.rbx def log(msg) File.open('/tmp/log', 'a') {|f| f.puts msg } end log "pid=#{$$}: start" pid = Process.fork { log "pid=#{$$}: (child) fork OK" exit 0 } log "pid=#{$$}: (parent) child=#{pid}" dummy, status = Process.waitpid2(pid) log "pid=#{$$}: waitpid=#{status.inspect}" print "HTTP/1.1 200 OK\r\n" print "Content-Type: text/plain\r\n" print "Content-Length: 3\r\n\r\nOK\n" log "pid=#{$$}: program exit"
ログがこうなって、SEGV で落ちているらしいことがわかる。
pid=23072: start pid=23072: (parent) child=23079 pid=23072: waitpid=#<Process::Status: pid=23079,signaled(SIGSEGV=11)> pid=23072: program exit
なお環境は以下の通り。
(21:47)
(追記) Ruby が古いだけだった。情けない。
やっぱりいろいろ間違っていた。
CGI のときは suexec していたのでレポジトリが 一般ユーザ所有になってたのだが、 mod_ruby だと httpd 権限なのでロックできなくて落ちると。
これで一通り通るようになったんではなかろうか。
(22:57)
書き忘れてたけど他にもいろいろ入れました。
何気にでかい変更だったりする。
一連の変更が落ち着いたらリリースしますので、 それまでは以下のあたりを参照して CVS から取ってください。
(23:02)
(00:14)
結論から言うとソケットを受け取るのはやりません。
まず HTTP の場合、 HTTP 1.1 ではホスト名が必要になるので意味がありません。
POP のほうは、クラスでプロトコルを分岐するのはやめたいので採用しません。 クラスで分岐する方法だとほとんどハードコーディングになってしまうんで。
あと、APOP の使えるサーバだと無差別に APOP スタンプを渡してくるので 中田さんパッチの後半はまずいです。
(00:37)
思いついてしまったヤバ気な機能たち
更新されるそばからサーバープッシュで diff をたれながす。 Wiki における tail -f
限定 drb。 BitChannel に存在する便利そうな Ruby オブジェクトを 無造作に Marshal して返してくるサービス。 tDiary のプラグインから使ったりするといいことがあるらしい。 問題は Ruby のバージョンが違うと泣くことと、 あんまりおもしろいオブジェクトがないことか。 うーん。
(04:38)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
そもそもAPOPってinitializeのときに分かってないとダメなもんですか。
こういうのを考えてるんですけど。
http://nokada.jin.gr.jp/ruby/pops.diff
むしろNet::Protocol(のサブクラス)はホスト名とか受け取らずに、
オープンされたIOを受け取るようにしたほうがいいんじゃないかとか。
> Ruby が古いだけだった。情けない。
これって 1.9.0-20040316 でも古いってことですか?
そうです。3/27 バージョンまで上げないとだめでした。
1.8.1 は試してません。
1.8.1 もだめでした。(mod_ruby は同じく 1.0 系 HEAD)
3/27 版で mod_ruby 下で動きました。ありがとうございました。
ついでに esehttpd で試したところ、cgi_url が "(eval)" になります。
Ruby 組み込みだと $0 が (eval) になるようです。
REQUEST_URI や SCRIPT_NAME でも参照するしかないですかね。。。
なるほど。それはバグですね。直します。