FreyaSX開発メモ(1) -- June 3, 2004, Yutaka Sato

ことのなりゆき

DeleGate-ML の検索用に、7年間ノンストップで回し続けて来たマシンが、ついに 止まってしまいました。 そこで、自分の手元にあるマシン、できれば 個人用のiMac / MacOSX (最近個人的にちょっと肩入れしたいと思っているもんで) の上で、できればフリーの検索エンジンを動かしたいと思ったのがそもそもの はじまりです。 (まあ数千円以内ならポケットマネーで買って済ませても良かったんですけど)

そこで思い出したのですが。数年前、DeleGateと検索エンジンを組み合わせ れば面白い応用ができそうだと思い、そのあたりを「研究」しようかと 計画書に書きました (書いただけかも。その後研究所も再編されちゃったし、もう時効だぽ)。 しかし、当時は育ち盛りのDeleGateのおもりに忙しく、具体化せずに終りました。 今回はせっかくなので、当時やりたいと思っていた事をこの機会に試してみられ ればとも思ったわけです。 (老後の楽しみにとか思ってもいたんですが、そろそろ片足突っ込んだかも)

フリーの検索エンジンは沢山あるようです。実は一昨年だったか mnoGoSearchと いうのをひろってきてちょっと使ってみたことがあります (FreshMeat一番ポピュラーな検索エンジンだったから)。 しかし、かなりインストールが面倒(単体では動かないし)に感じたし、 日本語能力は期待できないしで、がっかりしたのを覚えています。 日本語対応でフリーの検索エンジンと言えばNamazuが第一候補のようですが、 これもそれ自体の他に幾つかのソフトを組み合わせる必要があるようで敬遠。 そこで思い出したのが、その昔、Google以前、自分でも使わせてもらっていた 検索サイトODINのエンジンだった Freyaです。 Web上でちょっと調べてみると、Freyaは単独で動作するそうで、ダウンロード してみるとソースが(ドキュメントも^^)大変コンパクトで見通しが良さそう (周辺がゴテゴテしてなくて、むき出しのエンジンというか)。 もし自分なりの拡張を加えたり、DeleGateに組み込んだりしたくなっても、 都合が良いと感じました。 フレーズ検索もできるので、MLに投稿されているエラーメッセージやログ情報 の検索とかにも有利だろうかとか。 (それと、作者のドキュメントの、表向き軽い感じのノリと押しの弱さ? の裏に、深そうな奥行きを感じました。正直なところ。 プロフィール の写真をクリックしてワラタよ)

そこでまず、とりあえず動かしてみようとMacOSXの上で作業を始めました。 5月の連休明けの週末のことでした。この時に勤務先 (産総研) の定期メンテナンスのための停電があり、その復電の時に、旧検索サーバの ホストマシンが立ち上がり困難な状態に陥りました (年に2,3回やってくれるんです、定期的に停電をまる1日2日。 外部向けサーバ類の運用が停止するだけでなく、 これをきっかけにこれまで幾多のディスクやマシンが永眠。 だもんで今回の iMac をはじめ DELEGATE.ORG のサーバ類は 365日無停電(当たり前)の自宅に置いてあります。 というか自分の個人的利用と共存しているので、 当然いずれも私物なんですが)。 電源を抜いたり差したりしているうちに、たまたま立ち上がりはしたものの、 いつ完全に逝ってしまっても不思議では無い状態です。 これは何とか次の手を打っておかなければと思ったわけです。 それでMacOSX上での作業ですが、makeするとエラーメッセージがどっと出て停止。 なにせC++はよく知らないし、そのエラーメッセージがやたらと複雑で見にくい ので、この時は比較的あっさり挫折。 (だから何でC++で書くかなぁ。とこの時は思いました。正直なところ)

ところが、それから10日ほどして再びくだんの旧式機が墜ちました。マシンの パネル上のインジケータによると、どうもCPUのファンが回らなくなったという のが原因のようなのですが、いまさらこの耐用年数ゼロになったポンコツを 叩いて無理して回すのもお金の無駄だし地球にも優しくない。 それで再びFreyaの移植にトライします。今回は根気を入れてエラーメッセージ を解読してmakeを通過。うーん、こういう作業は原作者の目が黒いうちなら 一時間仕事だろうなとも思いましたが、原田さんのFreyaのページには 「もうメンテしてません。使わないことをお勧めします」てある。ぽ。。。 (まあ、自分の経験では、学生時代にひとりで作ったソフトへの思い入れ というのは非常に強いものだと思いますので、これは単純に額面通り受け取る べきではないんじゃないかなぁとは思いますが)。 どっちにしろ開発終了宣言している作者の方を煩わすなんて論外だし、自分の 勉強の機会でもあると思ったし、自力でやれないなら諦めるまでです。 まあ、最近はGoogle他の検索サーバのコンテンツが充実しているおかげで、 Gcc v3 がらみの移植上の問題の事例などは簡単に探せて助かりました。

実行形式が出来たので、さっそくDeleGate-ML用に使ってみることに。ここで 索引の作成の前処理ために日本語やMIMEの変換用のフィルタが必要ということが わかります。 デフォルトでは nkf を指定していますが、同様な機能はDeleGateに あるので、ちょっと拡張 (2バイト記号文字→ASCII変換とか)なんかもしたりして、 それ を使うことに。しかし、MLのデータを食わせて検索してみると 「internal error」が。。。特に索引が大きめになるほど頻発。そこで、あち こちにデバッグ用の文などを挟みながら追いかけてみると、どうもファイルの seekが失敗しているということがわかり、対処して解決。ここに一番手間が かかりました。(その後調べてみると、この問題はLinux上では起こらないよう なので、MacOSXの固有の問題かも知れません。さらにその後、ついでなので、 連休中に購入したザウルス用にも(セルフ/クロス)コンパイル。そしたら Gcc v3 の仕様上でひっかかり、これにも対処。) この他、HTMLから索引を作るのに Freya では、PerlのWWWライブラリ?を使って いるのですが、これは MacOSX 上のPerl (v5.6) にはデフォルトでは無いようでした。 探して来てインストールするのも面倒なので、HTMLをプレインなメールの形式 に変換する適当なフィルタをCで書いて(数十行)、メールとして索引を作るという ごまかし様です。どっちにしろ、www.delegate.org の場合、HTMLのコンテンツは 数十件しかないので無問題です:p

まる2日ばかりかけて、とりあえず使えるようになったので、DeleGate-MLの索引を 作って 公開したのが 5月19日 ( http://www.delegate.org/delegate/goiken/, http://www.delegate.org/feedback/ )。 しかし、やはりGoogleはじめ世の中AND検索がふつうでしょという時代、Freyaの デフォルトORは馴染めない。実際検索ログを見ていても、みなさんANDを前提に して検索かけて来る。一応 Example として、"+"の前置が必要なことをそれと なく:p 例示してはいたんですが (そういうのを見ない人はそういうのを見ない)。 それと、とりあえず主な用途がMLの検索なんで日付順の表示がどうしても欲しい。 しかし、このあたりを変更するには、移植のための変更(はコンパイルなどど同様 等価変換ではないかと)を踏み越えることになります。さらにそれ以上の変更もして、 DeleGateに組み込んだり、改変版を配布したり等も考えるとすると、これより先に 進むには、ライセンス上の問題も含めてまず作者にお伺いを立てなければ。で、 メールするとすぐに原田さんからは「煮るなり焼くなり」好きにしてOKという、 改変と再配布の許可を頂けたので、ありがたく、拡張に着手しました。

当初は、Freyaの元のソースの改変は最少にして、検索結果のソートは外部の プログラム+外部のデータでやろうと思っていました。ひとつには、DeleGateを 通過したページのアクセス頻度順で表示するような応用を考えているので、 日付順ソートについても、そこで行われるであろうやり方と同じように外付けの データとメカニズムで実現すべきだと思ったからです。 しかし、どうやってやるかインターフェイスの設計に時間がかかりそう。 当面、DeleGate-MLですぐに使いたいので、結局Freyaのソース(fsearchcgi.cc) に手を入れることにしました。 データ件数が大規模な場合の性能なんかもこの際無視して実装 (DeleGate-MLは 日英併せて15,000件程度なので)。デフォルトの検索をANDにするのも、脊髄反射的に (Expression.ccに)数行加えて実現したので怪しいけど、とりあえず使ってみた 限りでは問題無さそうに見えます。

こいつは楽勝だ。と、次は、複数の索引を検索してマージして返す機能を付けて みました。ここで、DeleGate-MLの英語版と日本語版のようなものは、ふつうは 別々に探したい、必要な時だけ一緒にして探したい、というものです。 というわけで、ふつうは (HTMLのFORMで生成して) index=idx のように検索対象 の索引を指定するところを、index=idx1,idx2 のように、複数の索引を指定 できるようにしました。 (索引間の関係を、検索式と同様に AND, OR, NOT で論理演算できるようにすると 面白いかも知れません)。

残るは性能面の問題。Freyaの処理速度は索引の作成も検索も十分高速だと思い ますが、さすがに一万件を越えると数分で索引作成というわけにもいきません (なので、5000件を越えないと発現しないような seek のバグの追跡に 時間を食いました)。 また、メーリングリストに到着した記事とか、DeleGateを通過したページを 即座に索引に追加して、検索に供するというのは実用上不可能です。 これに対処するないーぶな方法としては、比較的少量の追加分を別の索引にして 本体の索引と併せて検索するということが考えられます。 追加分を階層的にしてやれば、利用者側の見ためにはリアルタイムにインクリ メンタルな追加ができているように見せられるでしょう。 この場合、上記のような検索者に見える索引ではありませんが、実装上は同じ ものが使えます。というわけで、一つの索引を複数の部分索引から構成する ことも簡単に実装できました。もっとも、これを使って、追加分をどう管理 するかが、別のちょっと頭をひねらなくてはならない問題で、これはまだ手を つけていません。DeleGateとの組み合わせで試行錯誤してみようと思います。

いろいろと「実装した」と書きましたが、しかしこれらの拡張機能の実装は、 いずれもやっつけ仕事です。原作者なら、ちゃんと設計して正しい方法で実装 するでしょう。 ただ(一般論として)原作者の場合、なにかもっと面白い方法でやりたい、 きれいに実現したい、そうでないならやる気にならない、というような心境に 陥っている(^^)ことが多く、そのためになかなか実装が進まない。 ということで、 こういう傍流のやっつけな拡張もそれなりに意味があるんじゃないかと思います。

とりあえず早急に欲しかった機能は実現しました。 正味一週間ほど Freya とつき合ってみて、今後も、特にDeleGateとの組合せと いう形で、拡張していきたいと思うようになりました。 それで、今後の配布なども考えて、改変版に名前を付けることにしました。 システムの開発を楽しくする上で、その命名は極めて重要です(^^)。 せっかくなので、ODIN / Freya みたいに、北欧神話にちなんだ名前をひねれ たらとも考えたのですが、なにせ素養が無いので。それで、最近わたしが 乗っているクルマにちなんで FreyaSX ということにしました。 (他で使われていない文字列であることも重要です。意味を持ちそうな FreyaのもじりをいくつかGoogleで検索しましたが、どれも使用済みで頻出でした。 "FreyaSX"は、現時点でDeleGate-MLのページ中の一件だけです^^) ということで、6月3日に、FreyaSX のホームページを作りました (http://www.delegate.org/freyasx/)。 ページの先頭に何か欲しかったので、 やっつけでFreyaSXのロゴを作ったのですが、 このなんとなくシワシワげなフォントは(フォント名を忘れましたが)以前、 ODINサーバのページにあったODINのロゴがそんな雰囲気(全然違うかも)だった のにちなんでいます。 (そういやGIFにひっかかってた特許が今月で切れますね。 やれやれ...)

このページを作って原田さんにその旨お伝えしたところ、 本家 からリンクをはって下さいました。 ところが。。。わたしのページのほうで、すき間の埋め草に書いたコピーが そのまま、

        * イマドキのGccやマシン(MacOSX, Linux, ARM-Linux)に対応
        * 複数のデータベースの併合検索
        * 検索結果の日付順での表示
        * AND 検索をデフォルトに
と引き写されています。うーん、こういうのって自分のページにはナニゲに 書いてしまうのですが、引用されたのを改めて読むと赤面しますね。 ゴメンナサイ。悪気は無いんですが軽率で:p。 そもそもLinux上では(当時のGccなら)元の版のFreyaも動いていたと思いますし、 ARM-Linuxに固有なことはFreyaには多分なく (DeleGateでは ありましたが、 それもZaurus固有かも)、 問題があるとするとそれはGcc3.3を通るかどうかという一般的なものだと思います。 いずれ適切な表現に直します(何が適切かわかってから)。 追加機能についても、上述のようにいずれも怪しげなものです。ただこちらに ついては、たぶんDeleGateとの組合せという形で、今後時間をかけてぼつ ぼつ取り組んで、ちゃんとしたものにしていければと思っています。
Yutaka Sato <y DOT sato AT delegate DOT org>