2004-09-01 (Wed) [長年日記]
_ 型パラメタとAttribute
がーん、型パラメタを含むTypeオブジェクトはAttributeにできないのか (まあ、それはそうか)。
イテレータの戻り値の型をAttributeに保存してたけど、どうしよう。 Attribute使わずに、引数を増やしちゃうのが簡単かな。
2004-09-03 (Fri) [長年日記]
_ ワンライナー
beryllium 側で移行する passwd と shadow を調べるために 以下のスクリプトを考えたのですが, 2 つ目の Ruby インタープリタ呼出しは一行で書けずに ";" を使ってしまいました.
[雄也の?日坊主日記(2004-09-03)より引用]
$ ruby -e 'print open("/etc/shadow").grep(/^(?:#{$<.map {|l| l.split(/:/)[0]}.join("|")})/)'
とか。
あと、一つ目は
$ ruby -F: -ane 'print if $F[3] == "100"' /etc/passwd
の方が楽かも。
2004-09-06 (Mon) [長年日記]
_ Mono: A Developer's Notebook
買わずに済みそうだな。
で、どういう内容かというと、こういう内容だそうです。
MS.NETを全く触らない人向けのC#の説明なんかも入っているし(知っている人が今更読むものではない)、gtk#やglade#やgecko#といったMonoにしかないコンポーネント(Commons.Xml.Relaxngとかw)の説明も入っている。NUnitの使い方なんかも、MS系の書籍では読めないだろう。ランタイムの設計がどうとか、GACの設計がどうといった、monoならではの難易度の高い話が書かれている本ではない(個人的にはそういうのが一番読みたいのだけど)。
[Place Under Glacier: Mono: A developer's Notebookより引用]
最後の部分、同感。
2004-09-07 (Tue) [長年日記]
_ 無償ソフトウェア ガイドライン
Debianプロジェクトは声明の中で、Microsoftのライセンス条項は同プロジェクトの無償ソフトウェア ガイドラインとは相容れないとしている。同プロジェクトは今後、Sender IDを実装せず、これを実装するほかのソフトウェアでも同標準はサポートしない。
[DebianもSender IDを拒否 - CNET Japanより引用]
「無償ソフトウェア ガイドライン」って。
_ LispのCLUへの影響
(モデル的には)全部参照で、GCをサポートしてる、ってところかなあ。
2004-09-10 (Fri) [長年日記]
_ fml
ああ、fml いやですよね。
[Rubyist Magazine - 0001-Rubyist Hotlinksより引用]
何てこと言ってるんだ、この人は。
fmlにはとてもお世話になってます。 だいたいPerlが書けないバカが悪いんです。 ロクに勉強もせずに悪口言うなんてサイテーです。
よし、今年はPerlを覚えよう。 *1
*1 perl -pe 's/foo/bar/g'くらいなら書けるんですが
_ Shugo daimyo
いやあ、大名プログラマとしてそんなに有名だったとは。
2004-09-15 (Wed) [長年日記]
_ mod_rubyがささる
ruby_1_8ブランチのHEAD + Apache 2.0.50 + mod_ruby svn headの 組み合わせで、ささることがあるようだ。 gdbをアタッチしてbtしてみるも、よくわからず。 条件も特定できない。
(gdb) bt #0 0x403d0670 in mallopt () from /lib/tls/libc.so.6 #1 0x00000038 in ?? () #2 0x404938a8 in __after_morecore_hook () from /lib/tls/libc.so.6 ... #27 0x40714278 in __JCR_LIST__ () from /usr/local/lib/libruby1.8.2.so.1.8 #28 0x00000000 in ?? () #29 0x00009344 in ?? () #30 0xbfff6818 in ?? () #31 0x4069f347 in ruby_xmalloc (size=120) at gc.c:116
明日、まつもとさんに相談してみよう。
boronもこいつのせいかなあ。
追記:
以下のようなスクリプトでSEGVした。
#!/usr/bin/ruby -Ksd require "webrick/cgi" require "search/namazu" class MyCGI < WEBrick::CGI def do_GET(req, res) 100.times { result = Search::Namazu.search("ruby", ["/home/shugo/tmp/index"]) } ary = [] 10000.times { ary.push(Object.new) } res["content-type"] = "text/plain" res.body = "hello" end end cgi = MyCGI.new cgi.start
今度はまともなバックトレースが取れた。
(gdb) bt #0 0x403c1741 in st_free_table (table=0x82024b8) at st.c:219 #1 0x40371f60 in obj_free (obj=1079314672) at gc.c:1153 #2 0x40371a39 in gc_sweep () at gc.c:1021 #3 0x40372479 in rb_gc () at gc.c:1387 #4 0x40370daa in rb_newobj () at gc.c:376 #5 0x403739d6 in hash_alloc (klass=1078233508) at hash.c:183 #6 0x40373a64 in rb_hash_new () at hash.c:195 #7 0x4056007e in result_make_fields (idxid=0, docid=75, field_list=1078070448) at namazu.c:373 #8 0x405601e3 in result_make_hlist (hlist=0xbfff9e68, fields=1078070448) at namazu.c:394 #9 0x405604ea in search_main (search_0=1078070428) at namazu.c:480 #10 0x4035b904 in rb_ensure (b_proc=0x405603a0 <search_main>, data1=3221200480, e_proc=0x40560610 <search_ensure>, data2=3221200480) at eval.c:5184 #11 0x405606aa in namazu_f_search (argc=1836017711, argv=0x6d6f682f, self=1079103052) at namazu.c:502
どうも、Search::Namazu.searchの中でGCが起きた時に落ちてるっぽい。
(gdb) list 214 int i; 215 216 for(i = 0; i < table->num_bins; i++) { 217 ptr = table->bins[i]; 218 while (ptr != 0) { 219 next = ptr->next; 220 free(ptr); 221 ptr = next; 222 } 223 } (gdb) p ptr $10 = (st_table_entry *) 0x6d6f682f (gdb) p *ptr Cannot access memory at address 0x6d6f682f
ptrの値がおかしいようだ。 さて、だれが悪いのだろう。
2004-09-18 (Sat) [長年日記]
_ search-namazuとENV
mod_rubyを使わなくても、以下のスクリプトで落ちることを確認。
require "search/namazu" VAL = "x" * 100 (1..100).each do |i| p i ("A00".."A99").each do |name| ENV[name] = VAL end result = Search::Namazu.search("ruby", ["/home/shugo/tmp/index"]) 10000.times { Object.new } ENV.clear end
ちょっと条件を変えるとささったりする。
どうもlibnmzのnmz_set_lang()でsetenv()を使っているのが原因のようだ。 RubyのENVの実装って、拡張ライブラリなどでsetenv()を使わないことを 前提にしていたような気がする。
試しに以下のようにnmz_set_lang()をruby_setenv()で置き換えると 落ちなくなるようだ。
--- namazu.c.orig 2004-09-19 01:21:14.000000000 +0900 +++ namazu.c 2004-09-19 01:35:42.000000000 +0900 @@ -301,7 +301,7 @@ static void process_lang(VALUE lang) if(!NIL_P(lang)) slang = StringValuePtr(lang); - nmz_set_lang(slang); + ruby_setenv("LANG", slang); } static VALUE process_fields(VALUE fields)
うーん、どうしたもんだか。
2004-09-20 (Mon) [長年日記]
_ ログハウス
奥さんと長女の誕生日、にはちょっと早いが、多岐町のログハウスに宿泊。 ログハウスはフィンランド製だそうだが、できて間もないようで、 とてもきれいだった。
内部の設備も充実していて、サウナ(写真右)があったり、 IHクッキングヒーターまであったり。 IHクッキングヒーターなのは、きっとガスコンロより掃除が 楽だからだろう。
掃除と言えば、利用の手引きみたいなのに、帰りに自分たちで 掃除してから帰るように書いてあるくせに *1、 ホテルとかによくある「お客様が快適に過ごせるよう、私たちが 掃除しました」みたいな紙が置いてあるのはどうかと。
*1 掃除機や、トイレの掃除道具まで置いてあった
2004-09-21 (Tue) [長年日記]
_ キララ多伎
ビーチを歩いたり、海鮮たこやきを食べたり、近くの「いちじく温泉」に入ったり
[ふぇみにん日記 - キララ多伎より引用]
しようと思ったら、道の駅も温泉も休みだった:( *1
結局、なぜかジャスコの火曜市に。
*1 かずひこさんとはニアミスだったようだ。
2004-09-23 (Thu) [長年日記]
_ modruby.net Hiki
Wikiを使うのははじめてで、勝手がよくわからず。
RD+スタイルを使っているのだが、応答するプロセスによって 「==」が<h2>になったり<h4>になったりするようだ。 ひょっとしてtDiaryと名前がかぶってる?
_ リビンズ山根
という米子の家具屋さんに食器棚を見に行って来た。 名前はださいが、わりといい感じのものが、安く売られていた。
帰りにホバートにも行ってみたのだが、思ったより安いものの、 くらべるとやっぱりぜんぜん違うお値段。 庶民はおとなしくしとこう。
_ tDiaryのRDスタイル
コードを見てみたら、
class Headline MARK2LEVEL["="] = 3 MARK2LEVEL["=="] = 4 MARK2LEVEL["==="] = 5 MARK2LEVEL["===="] = 6 end
なんてしてるじゃないですか(Headlineはrdtoolで定義されてるクラス)。 だから、tDiaryが動いた後で、Hikiの方の見出しのレベルが変わっちゃうんだな。
このへんはHikiのRD+スタイルみたいにした方がマナーがいいと思います。
_ Google AdSense
modruby.netに入れてみた。 あんまり期待できないけど。
2004-09-24 (Fri) [長年日記]
_ libapreqのインクルード
Debianのlibapreqパッケージにもれなくperl bindingが付いてくるのが 嫌で、svn headにlibapreq本体を取りこんでみた。
元のlibapreqは、Apache2では動かない*1ので、 ちょっと手を加えてApache1/Apache2の両方で使えるようにした。 あと、元のと名前がぶつからないように、関数名にプリフィックスを 付けておいた。
*1 libapreq2なら対応してるけど、Apache2専用
_ Webアプリケーションフレームワーク
ちょっとWebアプリケーションフレームワークを作ってみようかな。
- クエリの解析やHTMLの生成などを行うフロントエンドは、mod_ruby上 (CGIでもいいけど重そう)で動かす。
- ロジックは、アプリケーション毎に独立したプロセスで動かす。
- コンポーネントのサポート。
- イベントドリブン。
- セッションには継続を使う。したがって、アプリケーションは同時に 1つのリクエストしか処理できない。クライアントとの入出力はmod_ruby 側でやるから、あまり問題はない(と思いたい)。
要は、Webアプリケーションが書くのが嫌いなので、なるべく 普通のGUIアプリケーションっぽくしたいのだ。
セッションに継続を使うのは、イベントハンドラから別の画面に 遷移した後で、もとの画面に戻ってくる時に、イベントハンドラの 元の場所に戻ってきたいから。 上手く行くかどうかは、あまり深く考えてない。
継続を使うのは、リクエスト毎に、復元と保存が一回ずつだけなので、 速度的なコストはたいしたことないだろうけど、メモリ食いそうだな。
_ Google AdSense
日記にも入れてみた。
_ 継続
とか言ってる間に、継続自体がばっさり削除されそうな予感
_ mod_securityでreferer spamよけ
1000以上もくらっていたので、こんな感じにしてみた。
SecFilterSelective HTTP_REFERER "foo|bar|baz"
fooなどの部分はアレな単語で置き換えてください。
2004-09-25 (Sat) [長年日記]
_ callccの制限
$SAFE >= 4では、callccそのものを禁止してしまう、というのは 乱暴すぎるだろうか。
_ $SAFEと拡張ライブラリ
拡張ライブラリでは、$SAFEが考慮されてないことが多いので、
require "postgres" require "readline" $SAFE = 4 conn = PGconn.connect("localhost", 5432, "","","dbname", "username") Readline.readline(conn.exec("select current_timestamp")[0][0] + "\n")'
出力結果:
2004-09-25 01:44:34.247251+09
なんてことができてしまう。
C API(rb_define_method()とか)で定義したメソッドは、 デフォルトで、$SAFE >= 4では実行不可にしてしまうというのはどうだろう。
_ lithium.ruby-lang.orgダウン
lithium(ruby-lang.orgのMLを提供)が14:00ごろから落ちていたようだ。 かずひこさんに復旧していただいた。多謝。
ログを見ると、ext3のエラーが出ていたようだけど、ハードウェアの エラーらしきものはないようだ。うーん、原因は何だろうな。 はっ、もしかしてY君か...
2004-09-26 (Sun) [長年日記]
_ 「春雨」と「ビーフン」の違い
奥さんに聞かれて調べてみた。
# 「春雨」・・・・・・ 緑豆、えんどう豆、甘藷、また馬鈴薯などのデンプンが主原料のもの
# 「ビーフン」・・・ 米が原料
[「春雨」と「ビーフン」の違いより引用]
なるほど。
_ mod_ruby-1.2.3
リリースしました。
2004-09-27 (Mon) [長年日記]
_ SecFilterEngine
mod_securityの設定で
SecFilterEngine On
としていた部分を
SecFilterEngine DynamicOnly
にした*1ら、ツッコミができないようになっていたようだ。 かずひこさんに教えていただいて発覚。
*1 動的コンテンツに対するリクエストのみフィルタリングする という意味
_ 嘔吐反射
歯医者で歯の掃除をしてもらう。
自分は嘔吐反射があるので、かなりの苦痛を伴う。 歯医者というと、痛いのが嫌だという人がいるけど、ちょっとくらい 痛い方が気が紛れていい。 あんまり痛いのも嫌だけど。
_ Re: mod_ruby-1.2.3 released
案の上バグがあったようだ。
I'm getting the following when trying to compile it on Mac OS X (10.3):
(snip)
mod_ruby.c:906: warning: implicit declaration of function `_NSGetEnviron'
[Re: mod_ruby-1.2.3 releasedより引用]
Mac OS Xでビルドができなくなっていたらしい。 また、やってしまった。
でも、こういうのってリリースしないとなかなか見つからないんだよな。
_ mod_ruby-1.2.4 リリース
というわけでリリース。
_ ML services will be stop for maintenance
ML services will be stop for maintenance on Tue Sep 28 11:00 (UTC). The services will be restart within 30 minutes, I hope.
[ML services will be stop for maintenanceより引用]
がー、英語が変だった...。
2004-09-28 (Tue) [長年日記]
_ mod_securityでreferer spamよけ(2)
ホスト名が30文字以上なやつは蹴ることに。
SecFilterSelective HTTP_REFERER "http:/[a-zA-Z_-]{30}" "deny,nolog,status:403"
パス部の//が/に正規化されるのは知ってたけど、http://もhttp:/に なっちゃうのは知らなくて、はまった。
2004-09-29 (Wed) [長年日記]
_ Hashを使ったコードのテスト
Hashを使ったコードは、繰り返しの順序が不定なため、テストを 書きにくい時がある。 そういう時は、テストコードでHash#eachを再定義してしまえばよい。
class Hash def each(&block) to_a.sort_by { |k,v| k.to_s }.each(&block) end end
テストの方に入れるのがポイント。
_ chroot環境のアップデート
今はcronでやってるけど、/etc/apt/apt.conf.d/にスクリプト を置く方がスマートに実現できそうな気がする (けど、今はやる時間がないのでメモ)。
Post-Invokeでごにょごにょやればいいのかな。
_ はら [なああああるほどぉぉぉ>Hash]
2004-09-30 (Thu) [長年日記]
_ ブリエキャセロール
一日遅れで、奥さんへのプレゼントが届いた。
といっても奥さんが自分で選んで自分で注文したので今一つ実感がない。 と思っていたら、コンビニ用の払込票を渡されて実感が湧きました。
シールを剥がしたらルクルーゼにそっくりで、名前もブルジョアっぽい けど、箱にさりげなく「MADE IN CHINA」の文字が。
_ まつもと [もう直ってますね。無償ソフトウェアガイドライン。]
_ shugo [おお、ほんとだ。 書いてみるもんですね(違]