Software Design誌 2000年11月号に掲載された記事の元の原稿です。
筆者が本紙に Namazu 1.3 の記事を執筆してから約 2年が経ちまし た。その間に Namazu は 2.0 へと成長しています。本稿では、ま ず Namazu 2.0 とは何かを説明し、次に開発の経緯と失敗談を紹介 します。最後に今後の予定を述べます。
はじめに
UNIX を利用しながら生活を送っていると、メーリングリストの記 事や WWWから拾ってきた文書、フリーソフトウェアのマニュアルな ど、知らず知らずのうちにたくさんの文書が溜まっていきます。
ほとんどの文書は後から参照することはありませんが、「この問題 の解決策は以前に何かの文書で読んだはずだ」と思い出したときに、 突然、参照したくなります。
そんなとき、UNIXを使っているなら find や grep コマンドを駆使 して目的の文書を探し出すのが一般的な手法です。しかし、ファイ ルの数が 1,000、 10,000 と増えていくと、この方法では時間がか かりすぎてしまいます。一方、高速な全文検索システムを使えば、 文書の数が増えても一瞬で検索できます。
全文検索というと、AltaVista や gooのような WWWの検索エンジン が有名ですが、ここで必要とされるのはそのような巨大なシステム ではなく、個人で使うためのごく小規模なものです。Namazu はま さにそのような用途のための全文検索システムです。 [図1]
Namazu 2.0 の特長
Namazu は手軽に使える日本語全文検索システムです。次のような 特徴があります。
- GPL2*1に基づいたフリーソフトウェア
- CGIとして動作するため Webブラウザから検索できる
- コマンドラインからも使える
- 多彩な検索方法
- 日本語の処理にきめ細やかな配慮を施している
- 多くの文書の形式に対応
1998年12月号で紹介したバージョン 1.3 と比べると、主に次の機 能強化が図られています。
- インデックスが小さくなった
1.3 と比べて約半分の大き さになります。インデックスを小さくするために、データ構造の無 駄を削りました。また、BER圧縮と呼ばれる手法を用いてデータの 圧縮を行っています。BER圧縮は 非負の整数を可変長のバイト列で 表現することによって、データを圧縮します。Perl の pack 関数 の `w' テンプレートで提供されています。 - インデックス作成の高速化
後述の Perlモジュールを利用 すると、インデックスの作成が 1.3 と比べて 2倍近く速くなりま す。従来の Namazu では、日本語の文字コードを変換するために nkf を、日本語をわかち書きするために KAKASI/茶筌を、それぞれ コマンドとして呼び出していましたが、2.0 では、これらを Perl モジュールとして呼び出すことにより、コマンド実行のオーバーヘッ ドを削減しています。もちろん、従来通りのコマンド呼び出しによ る処理も可能です。 - 対応する文書の形式が増えた
新たに Microsoft Word、 Microsoft Excel、 PDF、 TeX の文書に対応しました。これらの文 書を扱うには別途、専用のコマンドが必要です。 - gettext化
メッセージの言語を実行時に切り替えることが できます。開発中の Namazu 2.0.5 には、英語、日本語、スペイン 語、フランス語のメッセージが用意されています。 - autoconf + automake + libtool化
./configure && make && make install で簡単にインストール できます。configure スクリプトは、ソフトウェアの make に必要 な設定を自動で行います。autoconf, automake, libtool の役割は 次の通りです。- autoconf
configure スクリプトを生成します。生成され た configureスクリプトは autoconf がインストールされていない 環境でも動作します - automake
Makefile作成の手間を省力化します。開発者は Makefile の代わりに Makefile.am というファイルを作成します。 Makefile.am は簡潔に記述できます。 - libtool
共有ライブラリの作成を容易にします。各種プラッ トフォーム固有の事情を無視して簡単に共有ライブラリを作成でき ます。
- autoconf
改良が進んだ一方で、インデックスの互換性がなくなっているので 注意が必要です。Namazu 2.0 ではバージョン 1.3 で作成したイン デックスを検索することはできません。
インストール
Namazu をインストールするには、あらかじめ次のソフトウェアを インストールしておく必要があります。
- Perl バージョン5.004以降
<http://www.perl.com/> - nkf バージョン1.71以降
<ftp://ftp.ie.u-ryukyu.ac.jp/pub/software/kono/nkf171.shar>
nkf 1.71 には Perlモジュール NKF が付属しています。 - 茶筌<http://cl.aist-nara.ac.jp/lab/nlt/chasen.html>
または KAKASI <http://kakasi.namazu.org/>
茶筌、KAKASI には、それぞれ Perl モジュール Text::ChaSen, Text::KAKASI が用意されています。
NKF, Text::ChaSen, Text::KAKASI の各 Perl モジュールをインス トールしておくと、Namazu の動作が高速になります。
Namazu のインストール方法は一般的なUNIXのフリーソフトウェア と同様です。<http://www.namazu.org/> からソースコードを入手して、次のように実行します。現行執筆時 点での最新版は 2.0.4 です。本紙が書店に並ぶ頃には 2.0.5が公 開されている予定です。
% gzip -dc namazu-2.0.4.tar.gz | tar xvf - % cd namazu-2.0.4 % ./configure % make % su Password: (root のパスワードを入力) # make install
なお、 <http://www.namazu.org/> には Debian GNU/Linux用と Red Hat Linux 用のバイナリパッケージが用意されています。
Namazuに付属するチュートリアル (tutorial.html) にはインストー ル方法の詳細と基本的な使い方が丁寧に解説されています。この文 書は藤原誠氏が用意してくれました。初めて Namazu を使う方は、 まずチュートリアルにあたるといいでしょう。
使い方
Namazu の使い方は簡単です。基本的な使い方は次の通りです。
- インデックスを作成
% mknmz "対象文書のあるディレクトリ"
- 検索
% namazu "検索質問" "インデックス"
インデックスは、高速な全文検索を実現するためのデータ構造です。 ちょうど本の索引と似ています。本の索引ではどの単語がどのペー ジに載っているかを記録しますが、 Namazu のインデックスでは、 どの単語がどの文書に載っているかを記録しています。
インデックスの作成
それでは実際にインデックスを作ってみましょう。ここでは実験と して /usr/local/share/namazu/doc の文書を対象とします。mknmz はインデックスを構成するファイルを実行時のディレクトリに書き 出すので、ひとまず /tmp で行います。[図2]
図2 インデックスの作成
% cd /tmp % mknmz /usr/local/share/namazu/doc 7個のファイルがインデックス作成の対象として見つかりました 1/7 - /usr/local/share/namazu/doc/en/manual.html [text/html] 2/7 - /usr/local/share/namazu/doc/en/nmz.html [text/html] 3/7 - /usr/local/share/namazu/doc/en/tutorial.html [text/html] 4/7 - /usr/local/share/namazu/doc/ja/manual.html [text/html] 5/7 - /usr/local/share/namazu/doc/ja/nmz.html [text/html] 6/7 - /usr/local/share/namazu/doc/ja/tips.html [text/html] 7/7 - /usr/local/share/namazu/doc/ja/tutorial.html [text/html] インデックスを書き出しています... [基本] 日付: Mon Sep 18 18:08:52 2000 追加された文書の数: 7 サイズ (bytes): 119,874 合計の文書数: 7 追加キーワード数: 3,778 合計キーワード数: 3,778 わかち書き: module_kakasi -ieuc -oeuc -w 経過時間 (秒): 33 ファイル/秒: 0.21 システム: linux Perl: 5.006 Namazu: 2.0.4
これでインデックス作成は完了しました。インデックスは NMZ.i, NMZ.ii, NMZ.w, NMZ.wi のように NMZ から始まる複数のファイル で構成されています。
検索
検索は namazu コマンドで行います。さきほど作成したインデック スに対し、キーワード「カズタマイズ」で検索するにはコマンドライ ンから次のように実行します。
% namazu 'カズタマイズ' /tmp
検索結果は[図3]のように表示されます。Webサー バと連携すれば[図4] のようにブラウザから検 索することもできます。
図3 コマンドライン上での検索結果
% namazu 'カスタマイズ' /tmp 検索結果 参考ヒット数: [ カスタマイズ: 1 ] 検索式にマッチする 1 個の文書が見つかりました。 1. Manual of Namazu (スコア: 1) 著者: developers@namazu.org 日付: Fri, 31 Mar 2000 16:35:57 全文検索システム Namazu 説明書 目次 Namazuの基本構成 mknmzコ マンド namazuコマンド namazu.cgi 付属ツール 検索式 mknmzコマ ンド行引数 mknmzrcの設定 文書フィルタ namazuコマンド行引数 namazurcの設定 基本 /usr/local/share/namazu/doc/ja/manual.html (25,337 bytes) 現在のリスト: 1 - 1
以上が Namazu の基本的な使い方です。詳しい使い方については Namazu に付属するマニュアル (manual.html) を参照してください。
Namazu 2.0 の開発
ここでは、Namazu 2.0 の開発の経緯を紹介します。
Namazu 1.3 が完成すると、筆者は次のバージョンとして 1.4 の開 発に着手しました。この版では、インデックスを小さくすることと、 インデックス作成の高速化を目標としていました。
ちょうどその頃、筆者は名古屋Linuxユーザグループを通じて野首 貴嗣氏と知り合い、氏が Namazu の改良を手伝ってくれることにな りました。野首氏の担当はより多くの文書の形式に対応することと、 Namazu のライブラリ化です。
同じ頃、馬場肇氏が Namazu を autoconf + automake 化しようと 提案し、たたき台を用意してくれました。 autoconf + automake 化すると、./configure && make && make install で簡単にインス トールできるようになります。実はこのとき、筆者はいまいち乗り 気ではなかったのですが、せっかく作ってくれたのだから、という ことで馬場氏の提案を採用することにしました。
また、馬場氏からはソースコードを CVSで管理しようとの提案も受 けました。こちらも同じく乗り気ではなかったのですが、氏の勧め る通りに CVS 管理を始めました。そして、autoconf + automake 化およびソースコードの CVS管理は、開発の効率化の面で絶大な効 果があることが後からすぐに判明しました。*7
1.4 の開発が始まってしばらくすると、安部竜治氏という強力な助っ 人が現れました。安部氏は autoconf + automake 化の徹底、 gettext化、libtool化と次から次へと Namazu の改良を行ってくれ ました。これらの作業と並行して、高久雅生氏による地道なバグ修 正も行われました。
このように、バージョン 2.0 の開発には多くの人間が携わってい ます。そこで、 2.0 からは筆者の名義ではなく Namazu Project *8 による著作物とすることに しました。1998年10月31日の 1.3.0.0 の公開から約1年と4か月を 経て、2000 年2月20日にようやく Namazu 2.0 が完成しました。
Namazu から学んだ教訓
以上のような過程を経て Namazu 2.0 は完成したのですが、すべて が順調に運んだわけではありません。ここでは、Namazuの開発を通 じて学んだ教訓を、著名人による警句を交えて紹介します。これか らフリーソフトウェアを開発しようとしている人の参考になれば幸 いです。
- 貧弱な設計
初期の貧弱な設計が足を引きずって、現在の Namazu は保守および 拡張が不可能になりつつあります。最初から正しい設計をするのは 無理としても、手遅れにならないうちに設計を少しづつ変えていく 必要があります。多くの貧弱なシステムは、まずい基本デザインを化粧品で塗り固 めて救い上げようとした結果の産物だ -- Fred Brooks
- 動けばいいという姿勢
よく考えずに低品質なコードを量産したおかげで、その修正に多く の時間を取られました。しっかりしたコードを書くことが大切です。問題に対してすぐさま解決法を決めつけるプログラマが多すぎる。 彼らは 1分考えて、1日をコーディングに費やす。1時間考えて 1時 間でコーディングする代わりに。 ─ Jon Bentley
- 忍び寄る機能主義
利用者からの要望に応えるために、けばけばしい機能が無暗に増え ていきました。2.0 では不要と思われるいくつかの機能を廃止しま した。システムにおけるコンセプトの完全性こそが使いやすさを決定す るものである。システムの基本的コンセプトと一致しないなら、優 れた機能であれアイデアであれ、除外しておくのが一番だ -- Fred Brooks
- 車輪の再発明
既存のコード、ツール、ライブラリ、を使えばいいのに、自前であ れこれと用意しようとしました。先人の仕事を再利用することが大 切です。
可能な限り、コードは盗め。-- Tom Duff
- 変なスタイル
ソースコードの整形の仕方や、ヘルプメッセージの書式などは自分 で考えてもほとんどいいことはありません。慣習に合わせるべきで す。後から修正するのに苦労しました。重要でない部分について慣習を確立すれば、重要な部分に創造的な 活力を集中できる。-- Steve McConnell
- 勉強不足
少ない知識で下手なコードを量産していました。良書を読んだり、 良質なソースコードを読んだりして、プログラミングの勉強をする ことが大切です。最も大切なのは、プログラミングについて真剣に考えることは役に 立ち、楽しくもある、ということだ。-- Jon Bentley
- テスト不足
動作テストをしっかり行わなかったせいで、直したはずのバグが再 発するという事態に悩まされました。2.0 からようやくテストスイー トの整備を始めました。
テストにおける唯一の最も重要な規則は、テストする、ということ だ。-- Brian Kernighan and Rob Pike
- 英語のコメント・文書
2.0 では国際化の一環として、ソースコードのコメントをすべて英 訳しました。また、文書の英訳をしました。コメントについては初 めから英語で書いておけばよかったと後悔しました。遅くともしないよりはまし -- ことわざ
Namazu の将来
前述の通り、現在の Namazu は保守および拡張が不可能になりつつ あります。また、2.0 の目標であった、ライブラリの提供も中途半 端な形で終わっています。
そこで、筆者は現在 Namazu の再設計に取り組んでいます。新しい 設計では、
- 保守が簡単
- 拡張が簡単
- 完全にカスタマイズ可能
- 動的に拡張可能
なソフトウェアを目指しています。全文検索の機能をいろいろなア プリケーションに組み込めるように、使いやすいライブラリを提供 することも目標です。
また、春先から筆者が Lisp の大ファンになったということもあり、 次世代の Namazu では拡張言語として Lisp の 1つの方言である Scheme を採用する予定です。 Guile <http://www.gnu.org/software/guile/> をライブラリとし て組み込むことにより、 C と Scheme を柔軟に組み合わせたプロ グラミングを実現できます。
これまでの Namazu は手軽に使える反面、作りが甘いソフトウェア でしたが、今後は、手軽に使えて、しかも、作りのしっかりした、高 品質なソフトウェアを目指していくつもりです。
注釈
- GNU GENERAL PUBLIC LICENSE Version 2 <http://www.gnu.org/copyleft/gpl.html>
- groff <http://www.gnu.org/software/groff/groff.html> が必要。
- detex <http://www.cs.purdue.edu/homes/trinkle/detex/> が必要。
- xpdf <http://www.foolabs.com/xpdf/> に付属の pdftotextコマンドが必要。
- wvWare <http://www.wvWare.com/> が必要。
- xlHtml <http://www.xlhtml.org/> が必要。
- このことから、新しいものを積極的に取り入れていくことは大 切だ、という教訓を筆者は得ることができました。ありがたいこと です。
- <http://www.namazu.org/project.html>
参考文献
- Namazu のWebサイト <http://www.namazu.org/>
- Software Design 1998年12月号 pp. 43-50
「はじめての Plamo Linux - 全文検索システム Namazu の活 用」 - 高林哲