history

青木日記 RSS

<前の日 | この月 | 次の日>

2004-03-28

net/pop

sprintf がらみの酷いバグを指摘されたので修正。

POPS はどうしようかなあ。 これ以上 start の引数を増やすのは嫌だから、 net/https みたく new してセットするようにしようかな。

(14:41)

BitChannel / mod_ruby対応で悩む

今日はひたすら実装の日なのです。

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

なお環境は以下の通り。

  • ruby 1.9.0 (2004-03-16) [i686-linux]
  • apache 1.3.28 (with/without mod_ssl)
  • mod_ruby -rversion_1_0 (apxs)

(21:47)

(追記) Ruby が古いだけだった。情けない。

BitChannel / mod_ruby対応 (2)

やっぱりいろいろ間違っていた。

  • 実行順序の勘違いで、waitpid されていなかった
  • その結果としてコマンドが失敗しても無視されていた
  • さらにゾンビが大量発生 (CGI だと発覚しない)
  • そして問題の根源は CVS レポジトリのパーミッション間違い

CGI のときは suexec していたのでレポジトリが 一般ユーザ所有になってたのだが、 mod_ruby だと httpd 権限なのでロックできなくて落ちると。

これで一通り通るようになったんではなかろうか。

(22:57)

BitChannel 更新

書き忘れてたけど他にもいろいろ入れました。

  • コメントボックス追加。行頭に [[#comment]]
  • メニュー変更: Recent を後ろに
  • 文法追加: CSV なテーブル (行頭に「,」で開始)
  • 文法追加: 「-」で始まる UL
  • 文法追加: 「>」による引用 (1 レベルのみ)
  • 細かいバグをみっつばかし修正

何気にでかい変更だったりする。

一連の変更が落ち着いたらリリースしますので、 それまでは以下のあたりを参照して CVS から取ってください。

(23:02)

BitChannel更新 (2)

  • mod_ruby に対応しました。index.cgi がそのまま使えます。
  • FastCGI に対応しました。index.fcgi を使ってください。

(00:14)

netのSSL関係に関して

結論から言うとソケットを受け取るのはやりません。

まず HTTP の場合、 HTTP 1.1 ではホスト名が必要になるので意味がありません。

POP のほうは、クラスでプロトコルを分岐するのはやめたいので採用しません。 クラスで分岐する方法だとほとんどハードコーディングになってしまうんで。

あと、APOP の使えるサーバだと無差別に APOP スタンプを渡してくるので 中田さんパッチの後半はまずいです。

(00:37)

BitChannel / めも

思いついてしまったヤバ気な機能たち

更新されるそばからサーバープッシュで diff をたれながす。 Wiki における tail -f

限定 drb。 BitChannel に存在する便利そうな Ruby オブジェクトを 無造作に Marshal して返してくるサービス。 tDiary のプラグインから使ったりするといいことがあるらしい。 問題は Ruby のバージョンが違うと泣くことと、 あんまりおもしろいオブジェクトがないことか。 うーん。

(04:38)

本日のツッコミ(全6件) [ツッコミを入れる]
なかだ (2004-03-28 15:15)

そもそもAPOPってinitializeのときに分かってないとダメなもんですか。
こういうのを考えてるんですけど。
  http://nokada.jin.gr.jp/ruby/pops.diff
むしろNet::Protocol(のサブクラス)はホスト名とか受け取らずに、
オープンされたIOを受け取るようにしたほうがいいんじゃないかとか。

だて (2004-03-28 22:18)

> Ruby が古いだけだった。情けない。
これって 1.9.0-20040316 でも古いってことですか?

青木 (2004-03-28 22:36)

そうです。3/27 バージョンまで上げないとだめでした。
1.8.1 は試してません。

青木 (2004-03-28 22:41)

1.8.1 もだめでした。(mod_ruby は同じく 1.0 系 HEAD)

だて (2004-03-29 11:30)

3/27 版で mod_ruby 下で動きました。ありがとうございました。
ついでに esehttpd で試したところ、cgi_url が "(eval)" になります。
Ruby 組み込みだと $0 が (eval) になるようです。
REQUEST_URI や SCRIPT_NAME でも参照するしかないですかね。。。

青木 (2004-03-30 11:08)

なるほど。それはバグですね。直します。

名前
メールアドレス

<前の日 | この月 | 次の日>
2002|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|04|05|06|09|10|
2009|07|
2010|09|

Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved. LIRS