2001-12-27(木) 10142歩 [長年日記]
■ 散財自慢
年末最後のバトルが繰り広げられている散財自慢だが、白状しなければならないことがある。このシステム、年を越せないのである。越せないわけじゃない(たぶん新年のデータはちゃんと入力できると思う)。前年以前のデータが見られないのである。だから、がんばって大晦日に散財しても、勝利に浸っていられるのはほんのわずかの間だけ。
それじゃぁあんまりだ、と思うので、年越し対応をしようと思っていたんだが、けっこう忙しいのとモチベーションがいまいち高まらないので(だって年間王者は某石油王の息子で決まりだしさ)、しばらくこのままで行っちゃうことにした。年が明けたら、新しい気持ちで散財に励んでください(笑)。
■ 続・tDiaryは重いか
重いったら重いよ。もぅ、1.3系ったら重くてしょうがないよ(←自分で作っておいて何を言うか)。
どれくらい重いか見てみようと思って、Ruby付属のプロファイラを使ってみた。最初は漠然と「I/Oがけっこう食ってるんじゃないのー」と思っていたのだが、ぜんぜん違った。通算50%近くの時間を食っていたのは、ERbCompiler#compile
だった。あぁ〜、そりゃそうだ〜。
なにせ、ページの外枠、日記本文、プラグイン適用と、都合3回もERbを通しているのだ。重くて当たり前である。こりゃなんとかせにゃあかんかなー、と思ったのだが、なかなかいい解決策は思いつかない。
一番いいのはキャッシュだろう。リンク元表示をプラグイン化してしまえば、前の二段階まではほとんど変化がないので、最新表示だけでもあらかじめrhtml化しておけば、最後のプラグイン適用だけで済む。キャッシュの更新は、本文の更新時かツッコミがあった時だけ。これはやる価値があるかも。
キャッシュの応用として、ERbのメソッド化機能を使う手もある。でもメソッド化したらどっかにとっておかなきゃいけないので、mod_rubyを前提にしたり、dRubyを動かしたりしないといけない。これはちょっと仰々しすぎるな。
それから、ERbをやめてerubyを使うという方法もある。もっとも、比べてみたことがないので、erubyの方がどれくらい速いのかはわからない。そもそもAPIが違うから、そんな簡単な問題ではない。
一番楽なのは、ムーアの法則様にお願いすることだな。これなら何もしなくてもいいんだけど。お願い、ムーア様。なんとかして。
2001-12-26(水) 8958歩 [長年日記]
■ tDiary 1.3.2
リリースしました。夕べ出そうと思ってたけど、Ruby 1.6.6が出たのでちょっと動作確認などしておりました。問題なかったけど(たぶん)。今年はおそらくこれで最後。
1.3.1からの変更点は以下の通り(スナップショットでの変更点を含む)。
- プラグインの実装
- プラグインのサンプル提供(misc/plugin)
- 最新表示で月をまたぐ
- ツッコミサマリの表示長を2倍に
- ツッコミサマリは新しい方を優先して表示
- ツッコミフォームを、リンク元表示の上に移動
- セクションを囲む<div class="section">を追加
- symlinkで複数日記を運用する場合の負担軽減
- mod_rubyで動かないバグをFIX
- 更新時に呼ばれるプラグインのテスト実装
詳しくはChangeLogを参照。プラグインに関する文書をmisc/plugin/README.htmlとして書いたのでどうぞよろしく。
■ 最後の「更新時に呼ばれるプラグイン」についてちょっと解説。
通常のプラグインは実装者が好きな名前をつけられるんだけど、それを日記記述者がどこかで明示しなくてはならない。何かのイベントをきっかけに呼ばれるコールバックのような仕組みはこれではダメなので、名前を固定する必要がある(もちろんあらかじめ名前を登録するという方法もあるけど、複雑すぎる気がする)。そこで、update
という固定名称のプラグイン呼び出しをshow.rhtmlに埋め込んだ。
じゃあプラグイン実装者はこのupdate
を上書きしちゃえばいいかというとそれでは困る。競合するとどれかひとつしか呼ばれなくなってしまうので。そこで、update
はそのままで、@@update_proc
というArraryなクラス変数にProcオブジェクトを追加してもらうことにしてみた。例えば、きたさんのrecent_listを外部ファイルに出力したいなんて場合はこう書く:
@@update_proc << Proc::new do open( 'recent_list.html', 'w' ) do |f| f.write( recent_list ) end end
このサンプルのままだとHTML的に完結してないとか問題はあるけど、基本的にはこんな感じ。これを応用すると更新情報をrdfで出したり……なんて真似もできるはず。なお、update
は文字列を返しても意味ないので、空文字列を返すように実装されております。
あと、ツッコミがあった時にはupdate
は呼ばれない。ツッコミも引っかけたかったら、@mode
が'comment'
の場合にだけ動作するプラグインを書いて、@header
か@footer
に埋め込めばいいので。じゃあなんて更新時は同じやり方ができないんだ、というと、更新時には@header
や@footer
を使わないからなのであった(笑)。
でもなー。なんかスマートじゃないんだよ。もっといい方法が思いついたら、この実装はさくっとやめちゃうかも。
◆ きた [うひー. 完成度向上目指して頑張ります.]
2001-12-25(火) 7347歩 [長年日記]
■ WebCamとか
あ、ライトアップされたので、暗くても見えるようになりました。色合いが妖しいです。ちゃんとポーズも取ってます。って、銃口をこっちに向けるなー(笑)。
WebCamと言えば、これ良すぎ。まるで左利きのために作られたかのようなデザインも好感。SPYZ買ってなければぜったい買ってたなー。くー。
そうそう、ホンダは青山のASIMOをWebCamで公開すべきだよ。ときどき誰も操縦してないのに動いちゃったりするといっそうカワユイと思うぞ(怖いだろ)。
あ、そうだ。例の幻のAsumi、「∀sumi」と呼ぶのはどうか(読めねー)。
■ RuBBS
WindowsでProcess::pid
が使えないのは困るなー、と思っていたら$$
なら使えるという記述が。なんでやねん。確かにWindowsのPIDが取れてるみたい。じゃあこれ使おう。
てぇことは、Process::pid
が使えないのは、mswin32版Rubyのバグなんだろうか……? 仕様的にはバグだな、マニュアルの$$
の項には「Process.pid
と同じ」って書いてあるもんな。帰ったらruby-devに報告しよう。
■ [追記]あ、よかった。直るんですね。まぁ、とりあえずは$$
でいいや。なんでツッコめなかったんだろう……。
あう、あおきさんにもツッコまれてしまった。mswin32な話をすっ飛ばしてるのがバレバレだなー(笑)。……と思ったらruby-bugs-jaか。そっちは見てなかった。
◆ みずほちゃん [今までの日記を変換したくないので、hnfに対応させています。ところで、他フォーマットの対応ってどうなるんでしょう?]
◆ たおかか [ええっ!! てことは練習自慢も年を越せないんですか!? ショック・・・。新しい気持で練習に励むかぁ(笑)]