インフルエンザですよ奥さん……。 もう一週間くらい体温が 38 度をキープしてて死にそうです。 今年のインフルエンザはマジで凶悪なので、 みなさん気をつけてください。
次回は復活後〜 (23:53)
寝ようかと思ったけどこれだけ投げとく。
http://zunda.freeshell.org/d/20050414.html#p03
「setup.rb で --prefix を指定すると site_ruby の値が /usr/local/local/lib/... になっちゃうよ〜」問題。 これはこないだ別の人からもメールで文句を言われて そしてまた今来たメールにも書いてあった。
とりあえず、これについては解決策を考えつかない。 「/usr/local」は一般的な prefix の値 (/usr) を含んでいるので、 setup.rb みたいに自動処理するとどうしても $(prefix)/local/... に ならざるをえない。
じゃあ新しい rbconfig.rb の仕様を使って MAKEFILE_CONFIG を見ればよいかというと そうでもない。例えば Debian だと --sitedir=$(prefix)/local/... と定義されているので、--prefix=/usr/local にするとやっぱり /usr/local/local/... になる。
考えてみると、prefix を変えると site_ruby も変わるってのが変なのかもしれん。 site_ruby のパスは ruby に埋め込まれており、その値でないと意味をなさない。 だから setup.rb で指定する値に関らず一定であったほうがよいのではないだろうか。
また、siteruby 以外にも不変であったほうがよい値はあるだろうか。 (01:11)
寝こんでるはずなのに日記だけは書き込まれるわけです。謎です。
すでに数日前のことだけど、 TMail::Mail#decoded_body というメソッドを追加した。 名前の通り、Content-Transfer-Encoding をデコードし、 文字列のエンコーディングを合わせた本体を返すメソッド。 いままでこの程度の機能すらもなくてよく使ってたな俺。 さすがバージョン 1.0 未満だ。 (22:12)
http://kerneltrap.org/node/5070
Proliant DL585って hp のフラッグシップ Opteron サーバ? いいなあ。ていうか、Intel じゃなくていいんだな (いろいろと)。 それにしても
> 4-way dual-core Opterons, with 24 gigabytes of RAM and > 10 terabytes of disk space using a pair of MSA-30 arrays > for each server.
このスペックはうらやましすぎる……。 (02:37)
http://mez.seesaa.net/article/3449106.html
袋節約しろーてのはわりとよく言われる。 特に一番大きいサイズのやつ (25 号だったかな?) はかなり高いらしく 滅多なものに使ってはいけないことになっている。
ちなみに通常装備されていると思われる コンビニの袋は 6 号・8 号・12 号・20 号の 4 種類 + 弁当袋。 少なくとも俺のいたイレブンとファミマはこのラインナップだった。 6 号は 500ml 紙パックがギリギリ二つ、 8 号は 1000ml 紙パックがギリギリ二つ、 12 号は 2000ml ペットボトルがギリギリ二つ、 20 号は箱ティッシュが二つ以上の大きさである (これは本当にギリギリのサイズなので、実際に入れると持ちにくいから気をつけよう)。 弁当袋にも昔は種類があったけど今いるファミマは一つになってる。
あと、用度品で結構高いのが プラスチックのフォークとスプーン (弁当用のでかいやつ)、 それと揚げ物につくケチャップやソースである。 確か前者が一本 2.3 円くらい、後者が 5 円くらいだったかなあ。 ケチャップはもうちょい高かったかも。 ヨーグルトなんかにつく小さいプラスプーンは たしか割り箸と同じで 1 円強だと思った。
ついでに言えば、用度品は各店が買うものなので、 本部から来るスーパーバイザ (SV) は用度品の節約には興味がない。 つーかむしろたくさん使ってくれたほうが嬉しい。 それゆえ SV の言うことを聞いて気前よく袋をあげてしまうと店長に怒られるから気をつけよう。
また、以前コンビニが一斉に弁当から箸をとったことがあったが、 あれもそのへんの構造がからんでいる。 弁当についてると箸のコストは弁当に含まれるのだが、 別付けになると明示的に店が買わないといけないのである。 つまり、本部にとっては箸を別付けにするだけで自分たちの売り上げが増えるというわけだ。 もちろん表向きの理由は「環境への配慮」ということになっているのだが、 実はコスい「売り上げアップ大作戦」なのである。 (05:48)
http://daigakuseinoryouri.fc2web.com/cook.html
料理にもうちょっとバリエーションが欲しいので勉強しよう。
……というか、これはなんだ。
> ねぎと生姜とニンニクを日頃のストレスを解消するかの > ように包丁で叩き刻む(奇声をあげながら)
(06:08)
http://www.itmedia.co.jp/enterprise/articles/0505/03/news004.html
悪かったね古くて。でも内容は基本的に気にいった。
かねがね思っていたのだが、Linux のインストールが趣味になっちゃってるような人は、 今度は Linux という足場を基盤にして異種アーキテクチャを征覇していくのはどうだろうか。 単なるインストール厨でも、i386 しか使えねー自作厨もどきに比べれば、 Alpha と SPARC と POWER にインストールしたことが ありますってほうがずっと自慢できるだろ。
もっとも、「親切なインストーラがなきゃヤダー」だの 「GNOME 動かなきゃヤダー」だのたわけたことを言うやつはやめとけ。 最低でもシリアルコンソールと vi だけで OS 全て設定できるようになっておくのが好ましい。 「そんなのはインストールしながら覚えてやるぜ」でも当然 OK。 (07:21)
内々に使っている samidare がこんなダイイングメッセージを 残して死ぬようになってしまった。
/var/samidare/htree/htree/loc.rb:258:in `loc_list': stack level too deep (SystemStackError) from /var/samidare/htree/htree/loc.rb:272:in `path' from /var/samidare/samidare/main.rb:367:in `ignore_tree' from /var/samidare/samidare/main.rb:366:in `filter' from /var/samidare/htree/htree/traverse.rb:261:in `each_with_index' from /var/samidare/htree/htree/traverse.rb:36:in `each' from /var/samidare/htree/htree/traverse.rb:36:in `each_with_index' from /var/samidare/htree/htree/traverse.rb:36:in `each_child_with_index' from /var/samidare/htree/htree/traverse.rb:261:in `filter' ... 2949 levels... from /var/samidare/samidare/main.rb:1282:in `main' from /var/samidare/samidare/main.rb:1400 from /var/samidare/update.rb:10:in `load' from /var/samidare/update.rb:10
super しているその super 先が同じメソッドになってしまっているため、 無限ループになるらしい (追記:これは嘘だった)
とりあえず samidare と htree を HEAD にしてみよう。
digital:/var/samidare % ruby update.rb --single-thread /var/samidare/wc/htree/htree/loc.rb:258:in `loc_list': stack level too deep (SystemStackError) from /var/samidare/wc/htree/htree/loc.rb:272:in `path' from /var/samidare/wc/samidare/main.rb:373:in `ignore_tree' from /var/samidare/wc/samidare/main.rb:372:in `filter' from /var/samidare/wc/htree/htree/traverse.rb:261:in `each_with_index' from /var/samidare/wc/htree/htree/traverse.rb:36:in `each' from /var/samidare/wc/htree/htree/traverse.rb:36:in `each_with_index' from /var/samidare/wc/htree/htree/traverse.rb:36:in `each_child_with_index' from /var/samidare/wc/htree/htree/traverse.rb:261:in `filter' ... 2949 levels... from /var/samidare/wc/samidare/main.rb:1291:in `main' from /var/samidare/wc/samidare/main.rb:1409 from update.rb:10:in `load' from update.rb:10
変わらなかった。 引き続き調査中。
(23:15)
原因判明。HTML がこんなだった。
<FONT size="-1" color="#000000"><FONT size="-2"></FONT><FONT size="-1"><BR><FONT color="#000000"><FONT size="-1"><FONT c olor="#000000"><FONT size="-1"><FONT color="#000000"><FONT s ize="-1"><FONT color="#999999" size="+2"><FONT size="+1"><FO NT color="#000000" size="+2"><FONT size="+1"><FONT size="-1" color="#000000"><FONT color="#999999" size="+2"><FONT size= "+1"><FONT color="#000000" size="+2"><FONT size="+1"><FONT s ize="-1" color="#000000"><FONT color="#999999" size="+2"><FO NT size="+1"><FONT color="#000000" size="+2"><FONT size="+1" ><FONT size="-1" color="#000000"><FONT color="#999999" size= "+2"><FONT size="+1"><FONT color="#000000" size="+2"><FONT s ize="+1"><FONT size="-1" color="#000000"><FONT color="#99999 9" size="+2"><FONT size="+1"><FONT color="#000000" size="+2" ><FONT size="+1"><FONT size="-1" color="#000000"><FONT color ="#999999" size="+2"><FONT size="+1"><FONT color="#000000" s ize="+2"><FONT size="+1"><FONT size="-1" color="#000000"><FO NT color="#999999" size="+2"><FONT size="+1"><FONT color="#0 00000" size="+2"><FONT size="+1"><FONT size="-1" color="#000 000"><FONT color="#999999" size="+2"><FONT size="+1"><FONT c olor="#000000" size="+2"><FONT size="+1"><FONT size="-1" col or="#000000"><FONT color="#999999" size="+2"><FONT size="+1" ><FONT color="#000000" size="+2"><FONT size="+1"><FONT size= "-1" color="#000000"><FONT color="#999999" size="+2"><FONT s ize="+1"><FONT color="#000000" size="+2"><FONT size="+1"><FO NT size="-1" color="#000000"><FONT color="#999999" size="+2" ><FONT size="+1"><FONT color="#000000" size="+2"><FONT size= "+1"><FONT size="-1" color="#000000"><FONT color="#999999" s ize="+2"><FONT size="+1"><FONT color="#000000" size="+2"><FO NT size="+1"><FONT size="-1" color="#000000"><FONT color="#9 99999" size="+2"><FONT size="+1"><FONT color="#000000" size= "+2"><FONT size="+1"><FONT size="-1" color="#000000"><FONT c olor="#999999" size="+2"><FONT size="+1"><FONT color="#00000 0" size="+2"><FONT size="+1"><FONT size="-1" color="#000000" ><FONT color="#999999" size="+2"><FONT size="+1"><FONT color ="#000000" size="+2"><FONT size="+1"><FONT size="-1" color=" #000000"><FONT color="#999999" size="+2"><FONT size="+1"><FO NT color="#000000" size="+2"><FONT size="+1"><FONT size="-1" color="#000000"><FONT color="#999999" size="+2"><FONT size= "+1"><FONT color="#000000" size="+2"><FONT size="+1"><FONT s ize="-1" color="#000000"><FONT color="#999999" size="+2"><FO NT size="+1"><FONT color="#000000" size="+2"><FONT size="+1" ><FONT size="-1" color="#000000"><FONT color="#999999" size= "+2"><FONT size="+1"><FONT color="#000000" size="+2"><FONT s ize="+1"><FONT size="-1" color="#000000"><FONT color="#99999 9" size="+2"><FONT size="+1"><FONT color="#000000" size="+2" ><FONT size="+1"><FONT size="-1" color="#000000"><FONT color ="#999999" size="+2"><FONT size="+1"><FONT color="#000000" s ize="+2"><FONT size="+1"><FONT size="-1" color="#000000"><FO NT color="#999999" size="+2"><FONT size="+1"><FONT color="#0 00000" size="+2"><FONT size="+1"><FONT size="-1" color="#000 000"><FONT color="#999999" size="+2"><FONT size="+1"><FONT c olor="#000000" size="+2"><FONT size="+1"><FONT size="-1" col or="#000000"><FONT color="#999999" size="+2"><FONT size="+1" ><FONT color="#000000" size="+2"><FONT size="+1"><FONT size= "-1" color="#000000"><FONT color="#999999" size="+2"><FONT s ize="+1"><FONT color="#000000" size="+2"><FONT size="+1"><FO NT size="-1" color="#000000"><FONT color="#999999" size="+2" ><FONT size="+1"><FONT color="#000000" size="+2"><FONT size= "+1"><FONT size="-1" color="#000000"><FONT color="#999999" s ize="+2"><FONT size="+1"><FONT color="#000000" size="+2"><FO NT size="+1"><FONT size="-1" color="#000000"><FONT color="#9 99999" size="+2"><FONT size="+1"><FONT color="#000000" size= "+2"><FONT size="+1"><FONT size="-1" color="#000000"><FONT c olor="#999999" size="+2"><FONT size="+1"><FONT color="#00000 0" size="+2"><FONT size="+1"><FONT size="-1" color="#000000" ><FONT color="#999999" size="+2"><FONT size="+1"><FONT color ="#000000" size="+2"><FONT size="+1"><FONT size="-1" color=" #000000"><FONT color="#999999" size="+2"><FONT size="+1"><FO NT color="#000000" size="+2"><FONT size="+1"><FONT size="-1" color="#000000"><FONT color="#999999" size="+2"><FONT size= "+1"><FONT color="#000000" size="+2"><FONT size="+1"><FONT s ize="-1" color="#000000"><FONT color="#999999" size="+2"><FO NT size="+1"><FONT color="#000000" size="+2"><FONT size="+1" ><FONT size="-1" color="#000000"><FONT color="#999999" size= "+2"><FONT size="+1"><FONT color="#000000" size="+2"><FONT s ize="+1"><FONT size="-1" color="#000000"><FONT color="#99999 9" size="+2"><FONT size="+1"><FONT color="#000000" size="+2" ><FONT size="+1"><FONT size="-1" color="#000000"><FONT color ="#999999" size="+2"><FONT size="+1"><FONT color="#000000" s ize="+2"><FONT size="+1"><FONT size="-1" color="#000000"><FO NT color="#999999" size="+2"><FONT size="+1"><FONT color="#0 00000" size="+2"><FONT size="+1"><FONT size="-1" color="#000 000"><FONT color="#999999" size="+2"><FONT size="+1"><FONT c olor="#000000" size="+2"><FONT size="+1"><FONT size="-1" col or="#000000"><FONT color="#999999" size="+2"><FONT size="+1" ><FONT color="#000000" size="+2"><FONT size="+1"><FONT size= "-1" color="#000000"><FONT color="#999999" size="+2"><FONT s ize="+1"><FONT color="#000000" size="+2"><FONT size="+1"><FO NT size="-1" color="#000000"><FONT color="#999999" size="+2" ><FONT size="+1"><FONT color="#000000" size="+2"><FONT size= "+1"><FONT size="-1" color="#000000"><FONT color="#999999" s ize="+2"><FONT size="+1"><FONT color="#000000" size="+2"><FO NT size="+1"><FONT size="-1" color="#000000"><FONT color="#9 99999" size="+2"><FONT size="+1"><FONT color="#000000" size= "+2"><FONT size="+1"><FONT size="-1" color="#000000"><FONT c olor="#999999" size="+2"><FONT size="+1"><FONT color="#00000 0" size="+2"><FONT size="+1"><FONT size="-1" color="#000000" ><FONT color="#999999" size="+2"><FONT size="+1"><FONT color ="#000000" size="+2"><FONT size="+1"><FONT size="-1" color=" #000000"><FONT color="#999999" size="+2"><FONT size="+1"><FO NT color="#000000" size="+2"><FONT size="+1"><FONT size="-1" color="#000000"><FONT color="#999999" size="+2"><FONT size= "+1"><FONT color="#000000" size="+2"><FONT size="+1"><FONT s ize="-1" color="#000000"><FONT color="#999999" size="+2"><FO NT size="+1"><FONT color="#000000" size="+2"><FONT size="+1" ><FONT size="-1" color="#000000"><FONT color="#999999" size= "+2"><FONT size="+1"><FONT color="#000000" size="+2"><FONT s ize="+1"><FONT size="-1" color="#000000"><FONT color="#99999 9" size="+2"><FONT size="+1"><FONT color="#000000" size="+2" ><FONT size="+1"><FONT size="-1" color="#000000"><FONT color ="#999999" size="+2"><FONT size="+1"><FONT color="#000000" s ize="+2"><FONT size="+1"><FONT size="-1" color="#000000"><FO NT color="#999999" size="+2"><FONT size="+1"><FONT color="#0 00000" size="+2"><FONT size="+1"><FONT size="-1" color="#000 000"><FONT color="#999999" size="+2"><FONT size="+1"><FONT c olor="#000000" size="+2"><FONT size="+1"><FONT size="-1" col or="#000000"><FONT color="#999999" size="+2"><FONT size="+1" ><FONT color="#000000" size="+2"><FONT size="+1"><FONT size= "-1" color="#000000"><FONT color="#999999" size="+2"><FONT s ize="+1"><FONT color="#000000" size="+2"><FONT size="+1"><FO NT size="-1" color="#000000"><FONT color="#999999" size="+2" ><FONT size="+1"><FONT color="#000000" size="+2"><FONT size= "+1"><FONT size="-1" color="#000000"><FONT color="#999999" s ize="+2"><FONT size="+1"><FONT color="#000000" size="+2"><FO NT size="+1"><FONT size="-1" color="#000000"><FONT color="#9 99999" size="+2"><FONT size="+1"><FONT color="#000000" size= "+2"><FONT size="+1"><FONT size="-1" color="#000000"><FONT c olor="#999999" size="+2"><FONT size="+1"><FONT color="#00000 0" size="+2"><FONT size="+1"><FONT size="-1" color="#000000" ><FONT color="#999999" size="+2"><FONT size="+1"><FONT color ="#000000" size="+2"><FONT size="+1"><FONT size="-1" color=" #000000"><FONT color="#999999" size="+2"><FONT size="+1"><FO NT color="#000000" size="+2"><FONT size="+1"><FONT size="-1" color="#000000"><FONT color="#999999" size="+2"><FONT size= "+1"><FONT color="#000000" size="+2"><FONT size="+1"><FONT s ize="-1" color="#000000"><FONT color="#999999" size="+2"><FO NT size="+1"><FONT color="#000000" size="+2"><FONT size="+1" ><FONT size="-1" color="#000000"><FONT color="#999999" size= "+2"><FONT size="+1"><FONT color="#000000" size="+2"><FONT s ize="+1"><FONT size="-1" color="#000000"><FONT color="#99999 9" size="+2"><FONT size="+1"><FONT color="#000000" size="+2" ><FONT size="+1"><FONT size="-1" color="#000000"><FONT color ="#999999" size="+2"><FONT size="+1"><FONT color="#000000" s ize="+2"><FONT size="+1"><FONT size="-1" color="#000000"><FO NT color="#999999" size="+2"><FONT size="+1"><FONT color="#0 00000" size="+2"><FONT size="+1"><FONT size="-1" color="#000 000"><FONT color="#999999" size="+2"><FONT size="+1"><FONT c olor="#000000" size="+2"><FONT size="+1"><FONT size="-1" col or="#000000"><FONT color="#999999" size="+2"><FONT size="+1" ><FONT color="#000000" size="+2"><FONT size="+1"><FONT size= "-1" color="#000000"><FONT color="#999999" size="+2"><FONT s ize="+1"><FONT color="#000000" size="+2"><FONT size="+1"><FO NT size="-1" color="#000000"><FONT color="#999999" size="+2" ><FONT size="+1"><FONT color="#000000" size="+2"><FONT size= "+1"><FONT size="-1" color="#000000"><FONT color="#999999" s ize="+2"><FONT size="+1"><FONT color="#000000" size="+2"><FO NT size="+1"><FONT size="-1" color="#000000"><FONT color="#9 99999" size="+2"><FONT size="+1"><FONT color="#000000" size= "+2"><FONT size="+1"><FONT size="-1" color="#000000"><FONT c olor="#999999" size="+2"><FONT size="+1"><FONT color="#00000 0" size="+2"><FONT size="+1"><FONT size="-1" color="#000000" ><FONT color="#999999" size="+2"><FONT size="+1"><FONT color ="#000000" size="+2"><FONT size="+1"><FONT size="-1" color=" #000000"><FONT color="#999999" size="+2"><FONT size="+1"><FO NT color="#000000" size="+2"><FONT size="+1"><FONT size="-1" color="#000000"><FONT color="#999999" size="+2"><FONT size= "+1"><FONT color="#000000" size="+2"><FONT size="+1"><FONT s ize="-1" color="#000000"><FONT color="#999999" size="+2"><FO NT size="+1"><FONT color="#000000" size="+2"><FONT size="+1" ><FONT size="-1" color="#000000"><FONT color="#999999" size= "+2"><FONT size="+1"><FONT color="#000000" size="+2"><FONT s ize="+1"><FONT size="-1" color="#000000"><FONT color="#99999 9" size="+2"><FONT size="+1"><FONT color="#000000" size="+2" ><FONT size="+1"><FONT size="-1" color="#000000"><FONT color ="#999999" size="+2"><FONT size="+1"><FONT color="#000000" s ize="+2"><FONT size="+1"><FONT size="-1" color="#000000"><FO NT color="#999999" size="+2"><FONT size="+1"><FONT color="#0 00000" size="+2"><FONT size="+1"><FONT size="-1" color="#000 000"><FONT color="#999999" size="+2"><FONT size="+1"><FONT c olor="#000000" size="+2"><FONT size="+1"><FONT size="-1" col or="#000000"><FONT color="#999999" size="+2"><FONT size="+1" ><FONT color="#000000" size="+2"><FONT size="+1"><FONT size= "-1" color="#000000"><FONT color="#999999" size="+2"><FONT s ize="+1"><FONT color="#000000" size="+2"><FONT size="+1"><FO NT size="-1" color="#000000"><FONT color="#999999" size="+2" ><FONT size="+1"><FONT color="#000000" size="+2"><FONT size= "+1"><FONT size="-1" color="#000000"><FONT color="#999999" s ize="+2"><FONT size="+1"><FONT color="#000000" size="+2"><FO NT size="+1"><FONT size="-1" color="#000000"><FONT color="#9 99999" size="+2"><FONT size="+1"><FONT color="#000000" size= "+2"><FONT size="+1"><FONT size="-1" color="#000000"><FONT c olor="#999999" size="+2"><FONT size="+1"><FONT color="#00000 0" size="+2"><FONT size="+1"><FONT size="-1" color="#000000" ><FONT color="#999999" size="+2"><FONT size="+1"><FONT color ="#000000" size="+2"><FONT size="+1"><FONT size="-1" color=" #000000"><FONT color="#999999" size="+2"><FONT size="+1"><FO NT color="#000000" size="+2"><FONT size="+1"><FONT size="-1" color="#000000"><FONT color="#999999" size="+2"><FONT size= "+1"><FONT color="#000000" size="+2"><FONT size="+1"><FONT s ize="-1" color="#000000"><FONT color="#999999" size="+2"><FO NT size="+1"><FONT color="#000000" size="+2"><FONT size="+1" ><FONT size="-1" color="#000000"><FONT color="#999999" size= "+2"><FONT size="+1"><FONT color="#000000" size="+2"><FONT s ize="+1"><FONT size="-1" color="#000000"><FONT color="#99999 9" size="+2"><FONT size="+1"><FONT color="#000000" size="+2" ><FONT size="+1"><FONT size="-1" color="#000000"><FONT color ="#999999" size="+2"><FONT size="+1"><FONT color="#000000" s ize="+2"><FONT size="+1">(05/05/10)<BR></FONT></FONT></FONT> </FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FO NT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT>< /FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FON T></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></ FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT ></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></F ONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT> </FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FO NT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT>< /FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FON T></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></ FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT ></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></F ONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT> </FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FO NT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT>< /FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FON T></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></ FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT ></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></F ONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT> </FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FO NT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT>< /FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FON T></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></ FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT ></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></F ONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT> </FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FO NT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT>< /FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FON T></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></ FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT ></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></F ONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT> </FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FO NT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT>< /FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FON T></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></ FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT ></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></F ONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT> </FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FO NT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT>< /FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FON T></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></ FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT ></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></F ONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT> </FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FO NT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT>< /FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FON T></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></ FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT ></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></F ONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT> </FONT></FONT>
なにこの幾何学模様。
というわけで最後に一つだけ、 問題の HTML から一部を引用してこの話を終わることにしたい。
<META name="GENERATOR" content="IBM WebSphere Studio Homepage Builder Version 7.0.0.0 for Windows">
(00:24)
■ i [VS.NETでもWEBデザイン画面で頻繁にラベルやテーブルをいじくってたらこうなります(w]
考えてみると --libruby の一族も値は不変であるべきのような気がする。 ruby にパスが埋め込まれてるってのもあるけど、 こいつらはオプションとして指定するためにあるわけじゃなくて、 値として使うためにあるからだ。
※ こういうことね。
$ ruby setup.rb config --rbdir=\$librubyver --sodir=\$librubyverarch
だからやっぱり --libruby* の値も不変にすべきだろう。
あと、--installdirs=std/site というのがあると いいんじゃねーかと提案されたので、これも実装しておこう。 ついでに home ってのがあってよさそうだなあ。
……いや、甘かった。この仕様だと stow が使えない。 やっぱりパラメタライズしないとだめだ。
目先を変えて典型的なパターンを考えてみる。
この場合、パラメタライズしてあろーがなかろーがどうでもいい。 現状の setup.rb で問題なし。
プログラムのインストーラをそのまま活用するシステムでありうる。 この場合も現状の setup.rb で問題なし。
ちょっと面倒。--prefix=$HOME --rbdir=$HOME/lib/ruby --sodir=$HOME/lib/ruby のように三つ指定する必要がある。--installdirs=home を用意すれば一つになるか。 しかし ~/lib/ruby を固定にしてしまってよいのか、少し疑問。
これが一番の問題か。 例えば ruby が /usr にあるけど /usr/local に入れたいという場合。 /usr/local という値は rbconfig からは取れないので、 適切な値を自動設定するには全てのプラットフォーム向けの値を用意しておくしかない。 この場合は --prefix=/usr/local --rbdir=\$siterubyver --sodir=\$siterubyverarch かな? --installdirs が用意されれば --prefix=/usr/local --installdirs=site で、多少は簡潔になりそうだな。
また、今回の変更もこのパターンでの便を考えてのことだ。
うーん、usrlocal, usrlocalxxx, opt くらいの 代表的なモデルは用意してもいいかもしれないなあ。 なんか自分から棺桶に片足つっこんでる気がするけど。
この場合はまた別の問題として、 prefix その他をインストール時だけすりかえる手段が必要になる。 --override=prefix,/usr/pkg/tmail みたいなオプションを用意するか。
Makefile の場合は環境変数で上書きできるんだよね。 環境変数も見ようかなあ。でもなあ。 make の場合は環境変数を見るのはわかりやすいけど (イメージ的に sh と近いからかな)、 /bin/sh 独立なイメージのある setup.rb で環境変数を見るのはあまり直感的でない。 やはり --override 形式にしよう。
(12:48)
tunami:~/src/ruby-1.8.3 % uname -srm OSF1 V5.1 alpha tunami:~/src/ruby-1.8.3 % /usr/local/pkg/ruby-1.8.3p1/bin/ruby --version ruby 1.8.3 (2005-05-12) [alphaev6-osf5.1b] tunami:~/src/ruby-1.8.3 % gcc --version gcc (GCC) 3.4.3 Copyright (C) 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. tunami:~/src/ruby-1.8.3 % /usr/local/pkg/ruby-1.8.3p1/bin/ruby test/runner.rb Loaded suite test Started ................................. 略 Finished in 175.576072 seconds. 1) Error: test_wsdl(XSD::TestEmptyCharset): Iconv::InvalidEncoding: invalid encoding ("euc-jp", "utf-8") (eval):6:in `iconv' (eval):6:in `encode' /usr/local/pkg/ruby-1.8.3p1/lib/ruby/1.8/rexml/source.rb:41:in `encoding=' /usr/local/pkg/ruby-1.8.3p1/lib/ruby/1.8/rexml/parsers/baseparser.rb:202:in `pull' /usr/local/pkg/ruby-1.8.3p1/lib/ruby/1.8/rexml/parsers/streamparser.rb:16:in `parse' /usr/local/pkg/ruby-1.8.3p1/lib/ruby/1.8/rexml/document.rb:171:in `parse_stream' /usr/local/pkg/ruby-1.8.3p1/lib/ruby/1.8/xsd/xmlparser/rexmlparser.rb:27:in `do_parse' /usr/local/pkg/ruby-1.8.3p1/lib/ruby/1.8/wsdl/xmlSchema/parser.rb:60:in `parse' ./test/xsd/test_noencoding.rb:15:in `test_wsdl' 1102 tests, 11438 assertions, 0 failures, 1 errors
(17:48)
http://www.daemonology.net/hyperthreading-considered-harmful/
なんか詳細が気になってしまったので、 このページにあった論文 Colin Percival "Cache Missing For Fun And Profit", 2005 を簡単にまとめてみた。
複数スレッドがキャッシュを共有しているために、 悪意のあるスレッドが同一プロセッサ上におけるスレッドの活動を監視できる。
HT ができた背景とか書いてるだけなので略
ページングを利用した covert channel の構築について。 covert channel とは、通常は通信に使うとは考えられないものを使った通信経路のこと。 ちょっと前に話題になった IP over DNS みたいなやつのことだな。 この節ではページアクセスにかかる時間の差を使った covert channel の構築方法が説明されている。 例えば、特定のページがページアウトされているかいないかで 1 ビットが伝達可能になる。
HT Pentium 4 の L1 キャッシュを使った covert channel の構築方法。
この方法と適切なエラー訂正機能を組み合わせた場合の 通信速度はおよそ 400KB/秒 である。
HT Pentium 4 の L2 キャッシュを使った covert channel の構築方法。 基本的には L1 キャッシュの場合と同じ。 アドレス変換キャッシュがからんでくるので、 適当にレイテンシを追加する必要があるらしい。
L1 cache covert channel を使って OpenSSL から秘密鍵を奪取する方法。 openssl rsautl -inkey priv.key -sign を動かしておき、 これに L1 cache spy をしかける (両方が同じ CPU で走るように工夫する)。
OpenSSL は Chinese Remainder Theorem と sliding window を使っているので かなり規則的にメモリにアクセスする。 スパイプロセスは L1 cache を監視することでこれを検出できる (具体的には 512 ビットの指数のうち 200 ビット程度を奪取できる)。
が、これ単独では RSA 鍵は再現できない。 最低でも指数の下位 256 ビットが必要である。 しかしこの不足分は計算開始時に決定されるテーブルの "footprint" を解析すれば補うことができる (このあたりの仕組みはさっぱりわからず)。 これは簡単ではないが、 OpenSSL の特定バージョンであることがわかっていれば 50% の確率で判明する。 結果として 110 ビットの指数が追加でき、 最終的には指数 512 ビットのうち 310 ビットが奪取できる。 これは RSA 鍵を解くには十分な値である。
CPU で取れる対策
OS で取れる対策
アプリケーションで取れる対策
その他
CPU
OS
暗号ライブラリ
セキュリティってめんどくせー。
「キャッシュを共有してるから」云々てのを聞いて 最初はもろにキャッシュの中身が見えるのかと思ったけど、 さすがにそこまでアホな実装をするはずがなかった。 コードの傾向もわかってないといけないみたいなので、 コード一発で任意のプロセスを覗けるってわけじゃないんだね。 思っていたよりはずっと限定的な穴だった。
なんにしても local exploit だし、 信用できないユーザのいないマシンでは関係ないと。
細かいところはこんど笹田さんに聞こう。
(20:57)
■ なかだ [--rb-dir=\$site-ruby-common も簡単にできるとちょっと嬉しいんですが。]
■ Oni [ほんと、「めんどくせーーー!」って感じですね。「そりゃあ、そうやれば可能なんだろうけど・・・」うーむ。]
■ kjana [local exploit に別の remote exploit での一般ユーザ奪取を組み合わされて、どこかが陥落してたのはいつのことだったか、っていう話があったり無かったり。]
■
青木 [> --rb-dir
そこまではちょっと……。
ちなみに最近はハイフンを取るようにしてるので
--rbdir=\$siteruby までは短縮できますが、
それはちょっと話が違いすぎる予感。]
http://www.alasir.com/alpha/alpha_history.html
NetBSD/Alpha port ML より。
(17:25)
どうやって lchmod(2) があるか確かめたらいいんだよー! NotImplementedError 出すくらいならメソッドを定義しないでくれ!
うむむ、test_fileutils.rb みたいにテンポラリファイルを作って確かめるかなあ。 tmpdir が確実に見付かるなら何も問題はないが、 検出できない場合はどうすれば……。 見付かっても、エントリが残っちゃう可能性があるなあ。激しく嫌だ。
わかった。一般に検出しようとするからだめなんだ。 どうせ実際に必要になった時点で検出するんだから、 最初の一つで試せばいい。
(18:55)
よく考えるとやはり chmod(0700) するのは問題がある。 少なくとも chmod(lstat(path).mode & 07770) でないとまずい。
あと、どうにも不安が解消できないのが NTFS なんだよな。 いちおうテストはしてるけど、 これで本当に正しく動作してるのか確信できない。
(16:53)
lchmod と lchown を検出する方法がわかった。
~ % cat t def have_lchmod? return false unless File.respond_to?(:lchmod) begin File.lchmod 0 return true rescue NotImplementedError return false end end def have_lchown? return false unless File.respond_to?(:lchown) begin File.lchown nil, nil return true rescue NotImplementedError return false end end p have_lchown? p have_lchmod? ~ % test-all-ruby t ruby 1.4.6 (2000-08-16) [i686-linux] false false ruby 1.6.0 (2000-09-19) [i686-linux] false false ruby 1.6.1 (2000-09-27) [i686-linux] false false ruby 1.6.2 (2000-12-25) [i686-linux] false false ruby 1.6.3 (2001-03-19) [i686-linux] false false ruby 1.6.4 (2001-06-04) [i686-linux] false false ruby 1.6.5 (2001-09-19) [i686-linux] false false ruby 1.6.6 (2001-12-26) [i686-linux] false false ruby 1.6.7 (2002-03-01) [i686-linux] false false ruby 1.6.8 (2002-12-24) [i686-linux] false false ruby 1.8.0 (2003-08-04) [i686-linux] true false ruby 1.8.1 (2003-12-25) [i686-linux] true false ruby 1.9.0 (2005-05-16) [i686-linux] true false
(17:20)
ちがった。オーナーじゃなきゃ chmod できないんだから chmod できれば常にオーナーだ。だからやっぱ 700 でいいんだ。
とすると、root staff 777 みたいなディレクトリはどうすればいいんだろ。 通常ユーザでも消せるけど、chmod はできないから結局 world writable で、 すりかえは防げないことになるな……。 自分に権限がなきゃ /etc/passwd みたいな重要ファイルは消せないからいいのか? いや、CGI が使ってるデータみたいなものは消せてしまう?
いや違う、world writable ならそんなことしなくても 普通に消せるからこれは問題でないんだ。 今回の問題は権限の大きいユーザが消すときだけ発生する。 問題は「権限が大きい」=「chmod できる (オーナーである)」が成立するかどうかだ。
グループとして所有していて、world writable な場合はどうなるか。 lstat から unlink までの間にディレクトリをシンボリックリンクに すりかえると重要ファイルが消せるな。……え? やっぱりまずい?
あれ? もしかして chdir しても防げないんじゃ……。 chdir しようとしてるディレクトリを シンボリックリンクにすりかえられたらまずいじゃん。 ということは、world writable なディレクトリがあると どうやっても安全には消せない? だから、chdir するかしないかに関係なく chmod 700 する必要がある。 したがって安全に消せるのはオーナーだけだ。 だからオーナー以外が world writable なディレクトリを再帰的に 消す場合はもともとセキュアにはなりえないので、考えるだけ無駄なんだな。
ということで結論は chmod 700 する。 オーナーでない場合は、もともとセキュアじゃないので呼ぶほうが悪い。
(21:58)
と、決心した直後に気付いたけど、 消すディレクトリの上を全部 chmod しないと問題があるのね。 もういい、そんなのあきらめる。
いや、/tmp の場合はやばいのか。 困ったな。root で掃除すると仮定するなら、 まず chown(root) してもらうべきなのかな。
うん、それじゃ、そういうことで。
(22:07)
これまで「a/.」も「a」も同じだろーと思ってたんだけど、 そうじゃないんだな。a がディレクトリを指すシンボリックリンクの場合、 readlink("a") は大丈夫だが readlink("a/.") は EINVAL になる。 まあ、言われてみりゃ確かにそうだけど、って感じ。
(01:03)
http://slashdot.jp/article.pl?sid=05/05/19/088246&topic=16
「複数の Wiki」ってんで慌てて調べたけど、添付ファイルがらみなのね。 明らかに BitChannel は関係ないな (実装してないから)。
あ、なんか BitChannel いじりたくなってきた。
(02:00)
fileutils.rb のテストをしてたら変なことが起こった。
/tmp % ruby -e 'Dir.mkdir"a"; 20000.times{|i| open("a/#{i}","w"){}; open("a/passwd","w"){} }' /tmp % rm -rf a || ls a | wc -l rm: cannot remove directory `a': Directory not empty 9926 /tmp % rm -rf a || ls a | wc -l rm: cannot remove directory `a': Directory not empty 4817 /tmp % rm -rf a || ls a | wc -l rm: cannot remove directory `a': Directory not empty 2334 /tmp % rm -rf a || ls a | wc -l rm: cannot remove directory `a': Directory not empty 1022 /tmp % rm -rf a || ls a | wc -l rm: cannot remove directory `a': Directory not empty 436 /tmp % rm -rf a || ls a | wc -l rm: cannot remove directory `a': Directory not empty 144 /tmp % rm -rf a || ls a | wc -l
エントリが半分ずつしか減らない。いったいどうなってるんだ。
ちなみに /tmp 以外だと何も問題はない。
~/tmp % ruby -e 'Dir.mkdir"a"; 20000.times{|i| open("a/#{i}","w"){}; open("a/passwd","w"){} }' ~/tmp % rm -rf ~/tmp % ls a ls: a: No such file or directory
これはもしかして tmpfs のバグか?
/tmp % uname -srm Linux 2.4.22 i686 /tmp % mount | grep tmp none on /tmp type tmpfs (rw,mode=1777,size=64m)
報告されてた。これだな。
新しいバージョンでは修正されてんのかな。
/d/src/linux-2.4.30 % grep tmpfs ChangeLog-2.4.* ChangeLog-2.4.23: o tmpfs 1/5 LTP ENAMETOOLONG ChangeLog-2.4.23: o tmpfs 2/5 LTP S_ISGID dir ChangeLog-2.4.23: o tmpfs 3/5 swapoff/truncate race ChangeLog-2.4.23: o tmpfs 4/5 getpage/truncate race ChangeLog-2.4.23: o tmpfs 5/5 writepage/truncate race ChangeLog-2.4.25: o tmpfs readdir does not update dir atime ChangeLog-2.4.25: o Fix tmpfs dcache oops ChangeLog-2.4.27: o tmpfs surplus page miscounted ChangeLog-2.4.28: o tmpfs: stop negative dentries ChangeLog-2.4.28: o tmpfs: fix shmem_file_write return value
いっぱいあった。2.4.28 以降なら大丈夫そう?
(19:27)
次のような攻撃ができる可能性はあるんだろうか。 両プロセスのカレントディレクトリは /tmp で、 /tmp のパーミッションは 1777 とする。
rm -rf プロセス(euid=0) クラックプロセス(euid=1000) --------------------------------------------------------------------- (プログラム cmd を作り chmod(01777, "cmd")) chmod(01777, "cmd") mkdir("a") readdir("/tmp") unlink("a") = EISDIR rmdir("a") rename("cmd", "a") lchown(0, "a") execl("./a") # setuid root で動作? lchmod(0700, "a")
Linux 2.4 では lchown(2) で suid bit がクリアされたけど、 SUSv3 によると実装依存らしい。
If the specified file is a regular file, one or more of the S_IXUSR, S_IXGRP, or S_IXOTH bits of the file mode are set, and the process has appropriate privileges, it is implementation-defined whether the set-user-ID and set-group-ID bits are altered.
……だりい……。 家にあるシステムを片端から実行してみて問題なければ OKってことにしちゃおうかなあ……。
アプリケーションを特定できればなんとかなるはずなんだよなあ。 万能のメソッドを一個だけ作ろうとするから無理なわけで……。
結論は fork, setuid, chdir ってことで。冗談です。
うーん、open したディレクトリに対して chown とか chmod できればいいのかなあ。 それなら普通に stat が使えるし。
え、いや違うか、 open する対象がすりかえられたら回避できない?! そうか、だから lchown が必要なんだっけ。 なんだ、それじゃ lchown が suid bit をクリアしないシステムでは どうやってもセキュアにはならないんだな。 それならクリアされるほうに賭けたほうが得だ。
テンポラリファイルを使わずに調べよう、 シンボリックリンク編
/tmp % cat /d/tmp/have-symlink-p.rb def have_symlink? File.symlink nil, nil rescue NotImplementedError return false rescue return true end p have_symlink? /tmp % test-all-ruby /d/tmp/have-symlink-p.rb ruby 1.4.6 (2000-08-16) [i686-linux] /d/tmp/have-symlink-p.rb:3: parse error rescue NotImplementedError ^ /d/tmp/have-symlink-p.rb:3: warning: useless use of a constant in void context /d/tmp/have-symlink-p.rb:5: parse error ruby 1.6.0 (2000-09-19) [i686-linux] true ruby 1.6.1 (2000-09-27) [i686-linux] true ruby 1.6.2 (2000-12-25) [i686-linux] true ruby 1.6.3 (2001-03-19) [i686-linux] true ruby 1.6.4 (2001-06-04) [i686-linux] true ruby 1.6.5 (2001-09-19) [i686-linux] true ruby 1.6.6 (2001-12-26) [i686-linux] true ruby 1.6.7 (2002-03-01) [i686-linux] true ruby 1.6.8 (2002-12-24) [i686-linux] true ruby 1.8.0 (2003-08-04) [i686-linux] true ruby 1.8.1 (2003-12-25) [i686-linux] true ruby 1.9.0 (2005-05-16) [i686-linux] true
Windows での状況
~/src/ruby % ruby-vc6 -v have-symlink-p.rb ruby 1.9.0 (2005-03-28) [i386-mswin32] false ~/src/ruby % ruby-cygwin -v have-symlink-p.rb ruby 1.9.0 (2005-03-28) [i386-cygwin] true
ハードリンクも同じようにすれば調べられる。
しかし、なんか妙な知識ばっかり蓄積されてくなあ。
(02:20)
AMD64 Virtualization Codenamed "Pacifica" Technology
Secure Virtual Machine Architecture Reference Manual
http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/33047.pdf
Hammer-Info より
(08:52)
さらにプラットフォーム追加
結論は変わらず。6 プラットフォームすべてに共通な errno は 72 で、 なんとなく Windows にはなさそうな印象のある EPERM や ELOOP, ECHILD などもすべて定義されている。
ちなみに最も定義数が多いのは (やっぱりというか何というか) Linux で、まったく欠けがない。
(20:42)
うー、そうかあ、lchmod が set-user-id を落とさなければ昇格が起こり、 落とすと既存のプログラムを落としちゃうかもしれないわけか……。 こりゃ手詰まりだ。
あとは ruby-talk に出てた mkdir して rename するやつくらいか。 すると今度は親ディレクトリのパーミッションがからんでくるなあ。 なんかもう……。
(00:42)
朝っぱらから SEGV だし……。 えーと、
C = Struct.new(:a,:b,:c,:d, :e,:f,:g,:h, :i,:j,:k,:l) c = C.new(0,0,0,0, 0,0,0,0, 0,0,0,0) c.k
これで死亡か。やだなあ。
バックトーレス
(gdb) bt #0 0x00000000 in ?? () #1 0x0805f4e9 in rb_call0 (klass=1075345696, recv=1075355776, id=10497, oid=2, argc=0, argv=0x0, body=0x400092c4, nosuper=-1073745676) at ../../src/ruby/eval.c:5549 #2 0x0806014e in rb_call (klass=1075505016, recv=1075503856, mid=10497, argc=0, argv=0x0, scope=0) at ../../src/ruby/eval.c:5911 #3 0x0805b78e in rb_eval (self=1075571216, n=0x0) at ../../src/ruby/ruby.h:641 #4 0x08069b05 in ruby_exec_internal () at ../../src/ruby/eval.c:1528 #5 0x08069b26 in ruby_exec () at ../../src/ruby/eval.c:1549 #6 0x08069d30 in ruby_run () at ../../src/ruby/eval.c:1566 #7 0x08053c98 in main () at ../../src/ruby/main.c:38 #8 0x400874ad in __libc_start_main () from /lib/libc.so.6
……なんか変な感じ
(gdb) f 1 #1 0x0805f4e9 in rb_call0 (klass=1075345696, recv=1075355776, id=10497, oid=2, argc=0, argv=0x0, body=0x400092c4, nosuper=-1073745676) at ../../src/ruby/eval.c:5549 5549 case 0: (gdb) list 5544 return (*func)(recv, rb_ary_new4(argc, argv)); 5545 break; 5546 case -1: 5547 return (*func)(argc, argv, recv); 5548 break; 5549 case 0: 5550 return (*func)(recv); 5551 break; 5552 case 1: 5553 return (*func)(recv, argv[0]); (gdb) p func No symbol "func" in current context.
は? しかもこれは call_cfunc() の中に見えるんですが。
あー……そうか、static inline なのね。 しかも gcc 3.4 を入れていたような気がする。 そういうことか。めんどくさいので gcc を 2.95 に戻して回避だ!
/d/rsrc/Ci-delta6 % ruby t aamine@harmony t:3: [BUG] Segmentation fault ruby 1.9.0 (2005-05-26) [i686-linux] zsh: 19877 abort (core dumped) ruby t
な お ら な い
ちょっと待ってよー、なんなんだよこれ。 inline 取ってもなおらないどころか -O0 にしても起こるし。 コンパイラじゃないのか。
GC を止めても起きる。ますます嫌だ。
/d/rsrc/Ci-delta6 % gdb /d/obj/ruby/ruby aamine@harmony GNU gdb 5.2.1 Copyright 2002 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i686-pc-linux-gnu"... (gdb) run t Starting program: /d/obj/ruby/ruby t Program received signal SIGSEGV, Segmentation fault. 0x00000000 in ?? () (gdb) bt #0 0x00000000 in ?? () #1 0x0805db79 in call_cfunc (func=0, recv=1075503856, len=0, argc=0, argv=0x0) at ../../src/ruby/eval.c:5550 #2 0x0805e242 in rb_call0 (klass=1075505016, recv=1075503856, id=10497, oid=10497, argc=0, argv=0x0, body=0x401ae390, nosuper=0) at ../../src/ruby/eval.c:5689 #3 0x0805eaf9 in rb_call (klass=1075505016, recv=1075503856, mid=10497, argc=0, argv=0x0, scope=0) at ../../src/ruby/eval.c:5911 #4 0x080594bf in rb_eval (self=1075571216, n=0x401ae804) at ../../src/ruby/eval.c:3334 #5 0x0805553d in eval_node (self=1075571216, node=0x401ae804) at ../../src/ruby/eval.c:1350 #6 0x08055aae in ruby_exec_internal () at ../../src/ruby/eval.c:1528 #7 0x08055b07 in ruby_exec () at ../../src/ruby/eval.c:1549 #8 0x08055b46 in ruby_run () at ../../src/ruby/eval.c:1566 #9 0x08053d36 in Letext () at ../../src/ruby/main.c:38 #10 0x400874ad in __libc_start_main () from /lib/libc.so.6 (gdb) f 1 #1 0x0805db79 in call_cfunc (func=0, recv=1075503856, len=0, argc=0, argv=0x0) at ../../src/ruby/eval.c:5550 5550 return (*func)(recv); (gdb) p func $1 = (VALUE (*)()) 0
うお……。なんで func が NULL になってんだ
(gdb) p *body $3 = {flags = 98847, nd_file = 0x813e2e1 "t", u1 = {node = 0x0, id = 0, value = 0, cfunc = 0, tbl = 0x0}, u2 = {node = 0x0, id = 0, argc = 0, value = 0}, u3 = {node = 0x0, id = 0, state = 0, entry = 0x0, cnt = 0, value = 0}}
body がまっ白になってらっしゃいます。
うーん。Struct のほうから攻略してみよう。
これか―――――――っ!
--- struct.c 18 Apr 2005 06:38:30 -0000 1.63 +++ struct.c 27 May 2005 23:24:04 -0000 @@ -132,7 +132,7 @@ static VALUE rb_struct_ref8(obj) VALUE obj; {return RSTRUCT(obj)->ptr[8];} static VALUE rb_struct_ref9(obj) VALUE obj; {return RSTRUCT(obj)->ptr[9];} -static VALUE (*ref_func[10])() = { +static VALUE (*ref_func[])() = { rb_struct_ref0, rb_struct_ref1, rb_struct_ref2, @@ -211,7 +211,7 @@ for (i=0; i< RARRAY(members)->len; i++) { ID id = SYM2ID(RARRAY(members)->ptr[i]); if (rb_is_local_id(id) || rb_is_const_id(id)) { - if (i<sizeof(ref_func)) { + if (i < sizeof(ref_func) / sizeof(VALUE (*)())) { rb_define_method_id(nstr, id, ref_func[i], 0); } else {
(08:41)
オペミスでサイトの日記ディレクトリを rm -rf しちまいました。 まあデータもプログラムも全部別の場所に 置いてあるんで実質的なダメージはゼロ。 リンクだけ張り直したらほぼ復旧できたようだ。
つーかなんでこんな時間に家にいるんだろうな俺。
(13:11)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
■ ay [Debianでは少し前に--sitedir=/usr/local/...に変更しました。]
■ 腹風邪ひきzunda [風邪おだいじに〜。
パッケージャの立場から言うと、最終的なインストール先を決めるprefixとパッケージ作成時に仮にインストールされるdestdirを別に指定したいような気がします。例えば実行ファイルは、プログラムからは{prefix}/binにインストールされるように見えるのだけれど実際は{destdir}/{prefix}/binにインストールされる。
そこから演繹して、site_rubyはインストールされているRubyから取ってくるんだけどインストール先はdestdirみたいなもので制御できるとうれしいです。例えば、site_rubyが/usr/local/lib/ruby/site_rubyならprefixが何であれ、ruby setup.rb install -destidr=/var/tmp/hoge-rootで/var/tmp/hoge-root/usr/local/lib/ruby/site_rubyにインストールされる。
一方、野良ビルドする立場からすれば、$HOME/localに入れておいて$:.unshiftして使いたい場合も想像できます。するとprefixで全部変えられた方がうれしいかも。
むむーん。風邪ひきの青木さんを更に混乱にまきこむようなツッコミですみません。もう少し考えてみます。]
■ 青木 [DESTDIR 相当は ruby setup.rb install --prefix=DIR
があります。
ruby setup.rb config --prefix=$HOME とするのは
ありそうですが、その場合は site_ruby の値をその
まま使っても嬉しくないので、合わせる意味がないと
思います。どっちにしろ --rbdir は指定してもらわ
ないと。]