2005-03-10 (Thu) [長年日記]
_ ruby ML 検索
やっぱりデモがないとね、というわけで、作ってみました。
"do end" "{}" 違い
みたいな検索ができたりします。
ちなみに、検索時間はRast::DB#searchでかかった時間を表示してます。 体感だともっと遅く感じるけど*1、ウソじゃないよ。 でも負荷が恐いのであんまりいじめないでください。
*1 古いAAAAレコードが残ってたせいでした
_ ブロックパラメータ
ブロックパラメータ名が外側のローカル変数と重複したらエラー(前田くんの勝ち)※
[Matzにっきより引用]
本当に勝ったんだろうか。もうちょっとよく考えてみないと。
メソッド内で使われたスコープが終わってしまった変数への参照は警告になる※
というのは、
def foo bar do id = baz end return id #=> 警告 end
ってことですよね。 警告かあ。*1エラーでもいいかな。ほんとに?
それはさておき、ミーティングでは再度多重代入の仕様変更をプッシュしときました。
*1 Object#idがそのころにまだあったとすれば、ですが。
_ 結婚記念日
というわけで、義母の家に子供を置いて外食。
せっかくなので田和山の新しい店(といってもいつできたのかよくわからないけど)に行ってみた。 看板もなくて何の店だかよくわからなかったけれど、「この時間(18:30ごろ)にやっているのなら何か食べられるだろう」と思って入ってみると、イタリアンだった。
平日ということもあり、店内はがらがらで、客は他に二組ほど。 そのうちの一組はわりと小さい子どもを連れていた。うちの子どもたち をこういう店に連れて来られるのはいつになるんだろう。 まあ、たまには子どもがいない静かな食事もいいな。 ただ店内の音楽は多少うるさかった。スピーカの真下だったからかもしれない。
メニューを見るとけっこうたくさん並んでいて何を食べるか迷う。 結局、頼んだのは以下の料理。
- ミネストローネ(二人とも)
- 真鯛のカルパッチョ(二人でシェア)
- ボンゴレ・ビアンコ(私)
- タラバガニとポロネギのビアンコ(奥さん)
- スズキのソテー(二人とも)
結果的に肉料理は一つも頼まなかった。最近肉より魚の方がおいしいのは 年齢のせいだろうか。
パスタは今一つだったけれどもそれ以外はおいしく食べることができた。 奥さんも同じ感想。でも、自分はちょっと味が濃く感じたのに、奥さんは 薄く感じたらしいので、あてにしてはいけない。
接客も悪くない感じだったのでまた行くかもしれない。 今度は肉を食べよう。
2005-03-13 (Sun) [長年日記]
_ イタズラ
下の子はまだ外では遊べないけど、代りに部屋の中でのイタズラに余念がない。 食器棚は勝手に開けられないように雑誌で取手をふさいでいたのに、 簡単に開けられるようになっているし、手の届かなかった本やCD用の棚 まで開けられるようになってしまった。
写真は計量カップだからまだいいけど、ビンに入りのローソクで 同じことをしていて、しかも中身が溶けてきていたり:( 何とかならないですかねえ。
2005-03-14 (Mon) [長年日記]
_ Rast 0.0.1
早くもリリースされました。 バグフィックスが中心です。
次のリリースまではもうちょっと間隔が空くんじゃないかな。
Mac OS Xでビルドする場合は、Finkを入れて
$ ./configure --with-db-includes=/sw/include/db4 --with-db-libs="-L/sw/lib -ldb-4.2"
みたいな感じで行けると思います。
_ フィナンシェ
奥さんが作ってくれたフィナンシェを会社に持って行ってみた。 ちゃんとラッピングした甲斐があってなかなか評判がよかったようだ。
ちなみにマドレーヌとフィナンシェの違いは、フィナンシェには アーモンドプードルが入っていることらしい。
2005-03-15 (Tue) [長年日記]
_ 会社の住所
(自分の)会社の住所を調べるのに前はhttp://www.netlab.jp/を見ていた のだが、
$ whois netlab.jp
の方が早いことに気付いた。 ちゃんと英語の表記まであるし、電話番号もわかる。
何で今まで気付かなかったんだろう。
2005-03-16 (Wed) [長年日記]
_ 佐川急便
佐川急便って配達遅くない? 昨日の昼にWebで問い合わせた時に「松江店から配達に出発しました」って 書いたのに、今日の昼にまだ届いてないんですけど。 市内なのに途中で一泊してる?
玉湯の時も遅かったし、ずっと家にいたのに不在票が入ってたこともあるし、何か佐川って感じ悪い。
2005-03-17 (Thu) [長年日記]
_ EXPLAIN
PostgreSQLでEXPLAINを使おうと思ってマニュアルを見ていたのだが、 なぜかEXAMINEだと思いこんでいてぜんぜん見つからず。 だめすぎ...。
2005-03-18 (Fri) [長年日記]
_ rast-mecab
なんてものを作ってみた。
Rastでは、N-gram(というかトークン)の切り出しをエンコーディングモジュール というものに独立させているが、この部分でMeCabによる形態素解析を 利用しているだけ。
RastとMeCabがインストールされている環境で、
$ ./configure $ make # make install
とすれば、インストールできる。
とりあえず、デモ。 N-gram版より結果の件数が少ないのは1万件弱しか 登録してないから。
Rastは隣接チェックを行うので、 趣味の問題 のようなキーワードもちゃんと検索できる。 一方、隣接チェックがない検索エンジンでは 趣味 問題 のようなノイズの多い検索結果になると思う。 辞書も小さくなるし、N-gramよりもいいケースもあるかな。
N-gramの利点の一つに、顧客に 「○○という単語で検索できない」と言われた時に、「そんな文字列は もとの文書に含まれていませんから許してくださいよ」と説明できるということがある。 任意の部分文字列の検索(要はfgrep)ができるからだ。 「これは形態素解析器の辞書がですね...」という説明で納得してくれれば いいけれど、あなたの顧客はそんなに物分かりがよいですか? *1
ここでちょっと考えたのだが、基本的に形態素解析でトークンを切りだし、 未知語が表れたらその部分だけN-gramで処理するというのはどうだろうか。 大多数のケースで良好な結果を得られそうな気がする。
あと、Rastで使う時は、形態素解析器にはなるべく単語を細かく切ってほしい。 たとえば、「日本語」よりも「日本 語」の方が好ましい。 前者だと「日本語」で検索した場合はヒットするが、「日本」ではヒットしない。 一方、後者なら両方にヒットするし、隣接チェックがあれば「日本語」の検索結果 のノイズも増えない。 MeCabをこういう方向にチューニングすることができないかな。
*1 インデックス生成時に単語レベルで正規化したりすると、このメリットが 損なわれるので、曖昧検索などを実装する際はOR検索のような方向性の方が 望ましいかもしれない。 すでに、Rastでは、「tcl/tk」のように規定のN(アルファベットでは3) より短いトークン(「tk」)がある場合には、前方一致検索を行った結果を マージしているので、同様に語尾の揺れなどにも対応できそうだ。
2005-03-20 (Sun) [長年日記]
_ IMAPのtag
IMAPサーバを書こうかなと思ってRFC3501を眺めていると、RFC2060とtagの 仕様が微妙に変わっているのに気付いてしまった。
RFC2060:
tag ::= 1*<any ATOM_CHAR except "+">
RFC3501:
tag = 1*<any ASTRING-CHAR except "+">
要は`]'が許されるようになったらしいけど、そんなのtagに使ってうれしい?
うーん、Net::IMAP直さないといかんかなあ。とか言ってたら小人さんが 直してくれたり...しないだろうな。 まあ、クライアントはそんなtag使わなきゃいいわけだけど、サーバは そうはいかないか。何かいきなり萎えちゃったよ、とほほ。
_ 検索ベースのIMAPサーバ
とりあえず、アイデア(っていうほどたいしたものではない)だけメモしとこう。こうしとけば、だれか他の人が書いてくれるかもしれない。
- 何はなくともSEARCHを実装する。
- mailboxは基本的にINBOXだけ。代りにThunderbirdのSaved Search Folderを使う。
- とは言ってもTrashやDraftくらいは必要かもしれない。まあ仮想的に用意すればいいか。
- INBOXのメール一覧では、\Recentフラグが付いたメールだけ(あるいは1000件だけとか)を返す。
- Saved Search FolderがないMUA(ほとんど?)のために、サーバ側で Saved Search Folderを用意した方がいいかも。
- 最近検索した結果は、自動的に上記のServer Side Saved Search Folderにする。しかし、mailbox名が問題
- 手動でspamを学習させる時に類似文書検索が使えたら便利かなあ。 しかし、IMAPでそういうインタフェイスを提供するのは無理か。 Server Side Saved Search Folderの設定などと一緒にWebインタフェイス を用意するとか?
- 検索エンジンにはもちろんRastを使いたいが、属性の更新を効率よく 処理できるようにならないと辛そう。まあ、属性は自前でやる手もあるが。
- RSSも突っ込めると便利かも。あと、NetNewsとか。
morqを改造する、という手あるけど、たぶん大変な部分はmorqから流用できる部分じゃないんだよな。
_ Ajaxで「次へ」
検索サイトで「次へ」というリンクをたどるのがいつも億劫なのだが、最近流行のAjaxで何かできないだろうか。 アクセスキー用意するだけでも便利かもしれないけど、そもそも10件ずつとかで検索結果を表示すること自体、あまり必然性がないと思う。
たとえば、最初はブラウザのスクロールバーを表示させずに一画面で表示できる分だけ出力して、Ctrl-Dとかjとか押してくと必要な部分だけ取って来て表示を書きかえていくとか。 各検索語を座標に取った地図みたいなのを出して、文書を表すアイコンに カーソルを持ってくるとタイトルや概要がポップアップで出てくるとか。
2005-03-21 (Mon) [長年日記]
_ 形態素周辺確率を用いた分かち書きの一般化とその応用
なるほど、これはよさそう。 Rastで何とか使えないかなあ。位置情報に加えて、頻度情報も記録しないと いけないので、ますますインデックスが大きくなりそうだけど。
しかし、BOWと聞くとBSD on Windowsを思い出してしまうのは私だけ?
2005-03-22 (Tue) [長年日記]
_ ruby-prof-0.1
Ruby用のプロファイラをリリースしました。 以下のいずれかが必要です。
- ruby 1.9.0 (2005-03-17) 以降
- ruby 1.8.2 (2005-03-22) 以降
使い方はprofile.rbとほとんど同じ。
$ ruby-cvs_1_8 -v -runprof fib.rb ruby 1.8.2 (2005-03-22) [i686-linux] use CPU clock counter for profiling 6765 %% cumulative self self total time seconds seconds calls ms/call ms/call name 90.84 0.074 0.074 1 73.94 81.39 #toplevel 3.66 0.077 0.003 21890 0.00 0.00 Fixnum#- 3.61 0.080 0.003 21891 0.00 0.00 Fixnum#< 1.73 0.081 0.001 10945 0.00 0.00 Fixnum#+ 0.12 0.081 0.000 2 0.05 0.06 IO#write 0.01 0.081 0.000 1 0.01 0.01 Fixnum#to_s 0.01 0.081 0.000 1 0.01 0.12 Kernel.print 0.00 0.081 0.000 1 0.00 0.00 Module#method_added
profile.rbと比べるとかなり高速になっていると思います、 と思ったら結果がおかしいですね...Ruby本体の修正にバグがありました、すみません。set_trace_funcを使う場合は問題なかったのでテストが通ってました:(
先ほど修正をcommitしたので、今のruby_1_8ブランチの先端では以下のように正しい結果が返ると思います。
$ ruby-cvs_1_8 -runprof ~/ruby/fib.rb 6765 %% cumulative self self total time seconds seconds calls ms/call ms/call name 81.55 0.037 0.037 21891 0.00 0.03 Object#fib 7.73 0.041 0.004 21890 0.00 0.00 Fixnum#- 6.94 0.044 0.003 21891 0.00 0.00 Fixnum#< 3.24 0.045 0.001 10945 0.00 0.00 Fixnum#+ 0.26 0.045 0.000 1 0.12 45.44 #toplevel 0.22 0.045 0.000 2 0.05 0.06 IO#write 0.03 0.045 0.000 1 0.01 0.12 Kernel.print 0.02 0.045 0.000 1 0.01 0.01 Fixnum#to_s 0.00 0.045 0.000 1 0.00 0.00 Module#method_added
_ SQLの高速化
何とか目標に近い数値を達成。 やっぱり、プロファイラが速いと作業がラク。 ちなみに、今までは、
st = Time.now ... p [:foo, Time.now - st]
みたいなコードをあちこちに書いてました:(
2005-03-23 (Wed) [長年日記]
_ 「本物の」アプリケーション開発にRubyのような「スクリプト言語」は不十分
「本物の」アプリケーション開発にRubyのような「スクリプト言語」は不十分、 Javaのような「本物の言語」が必要だ、というJavaラブ派
[Matzにっき(2005-03-21)より引用]
「本物のプログラマ」じゃない人には必要なんだろうね、とか言うとフレームに なるんだろうな。
冗談は置いといて、ちゃんとプロファイル取って、アルゴリズムの問題を修正して、 どうしても速くできないところ(死ぬほどビット演算を繰り返すところとか)だけ 拡張ライブラリにすれば、たいていのケースでは問題ない速度が出せると思う。 あと、Rubyプログラムを速くするコツは、なるべくRubyに仕事をさせないこと。 多少メモリ効率を犠牲にしてでも、Cで書かれた組み込みメソッドや拡張 ライブラリのメソッドに多くの仕事をまかせる。
まあ、でも、Rubyはうちの会社の秘密兵器 *1 として使いたいので、今くらいのポジションがいいのかも。
*1 日本ではメジャーじゃんと言われるかもしれないが、たとえば、高橋さんの会社でも使えないんだから秘密兵器と言ってもいいと思う。
_ intel compiler で Apache が 400% 高速化
Googleの広告見てて思い出したけど、これって本当なのかなあ。
abでベンチマーク取ってて「メチャメチャ速いじゃん」と思ったら全部500だった、ということがよくあるのは内緒だ。
2005-03-25 (Fri) [長年日記]
_ imapd
メモ。
- ML用のメールボックスはX-ML-NameやList-Idなどで自動的に生成する。 ただし、メールボックスを作成するといっても、メールボックス名と 「X-ML-Name = ruby-list」のような検索クエリの対応付けをするだけ。 メールボックス名はとりあえず自動生成して、ユーザの変更も許す。
- INBOXは「MLでない」とマークされたメールのみを(検索して)表示。
- ただし、SEARCHコマンドでは全メールを検索して結果を返す。
_ 雪
こんな時期に雪がめちゃめちゃ降ってるんですけど...。 とりあえず、道路には積もってないの一安心。
_ whois
whois netlab.jp
の方が早いことに気付いた。
[Journal InTime - 会社の住所より引用]
引けなくなっておかしいなと思っていたら、どうもwhoisサーバがwhois.nic.ad.jpから変わっているようだ。
apt-get sourceしてwhoisコマンドを書き変えようとして、ふと思いとどまってDebianのBTSを見てみると、すでに最新(4.7.2)では直っていた。
apt-lineに記述してあるミラーはまだ更新されてなかったのが敗因。
ところで、whois --versionの結果が、
$ whois --version Version 4.7.1. Report bugs to <md+whois@linux.it>.
と、4.7.1に見えるのはバグ?
2005-03-27 (Sun) [長年日記]
_ 散髪
ひさしぶりにカプチーノをオープンにして娘と散髪に。 ずいぶん前に乗せようとした時は恐がって無理だったが、今日は楽しんだようだ。
娘は美容院がはじめてだったのでちょっと心配だったのだが、案の上少し 泣いてしまった。声も上げずに涙が頬を伝うのを見ると、やっぱり女の子は髪を切られるのが悲しいのかなと思う。
ちなみに自分はちゃんと隣の床屋で切ってもらったのは言うまでもない。
2005-03-28 (Mon) [長年日記]
_ ローカル変数のスコープ
class SpoofSocket attr_reader :input, :output def initialize(s) @input = StringIO.new(s) @output = StringIO.new end for mid in [:read, :gets, :getc] define_method(mid) do |*args| @input.send(mid, *args) end end end
というコードが動かなくてはまった。 (SpoofSocket#readで、@input.send(:getc, ...)が呼ばれてしまう。)
正しくは、
[:read, :gets, :getc].each do |mid| define_method(mid) do |*args| @input.send(mid, *args) end end
のように、ブロックを使わないといけない。
2005-03-29 (Tue) [長年日記]
_ Googleでの検索結果リストにaccesskeyを仕込むGreasemonkey
遅まきながら試してみた。 すばらしい。
2005-03-30 (Wed) [長年日記]
_ Freudenhaus
ウェブサイトはちょっと凝り過ぎで見にくいけど、なかなかよさそう。
Lazudaの広告によると、glasses valleyのメインストアに デザイナーが来てトランクショーをやるらしい。 4/9〜11だったかな? 記憶があやふやなので行かれる方は確認してみてください。
自分は買う余裕がないけど、かずひこさんでも誘うかなあ。
_ かずひこ [おお、面白そうですね。ちなみにゆうなの今のメガネは米子の glasses valley で買いました。]
_ babie [メールアドレスは加工した方が良いと思いまする。 >ML検索]
_ shugo [おお、すみません、修正しときました。]