特集 Web で日記帳システムを作ろう um% cd chasen—2.0b6 1 加 % make 1 加 % make dic ・ u.m0/o su # exit # make install これで ChaSen か使えるようになったはすなので、試 してみます。 um% echo " 今日はいい天気です。 今日 は 天気 です EO S { キョー / コンニチ } ー chasen 今日 16 / 0 / 0 ワ イイ テンキ デス は 天気 です 62 / 0 / 0 48 / 43 / 2 2 / 0 / 0 70 / 49 / 2 74 / 0 / 0 上の例では echo コマンドによって「今日はいい天癶で す。」という文章を chasen コマンドの標準入力べ度して います。ちゃんと分かち書きされていますね。 ChaSen は正しくインストールできたようなので、今度 は Namazu を展開します。 1 % tar —x ー 2 —f namazu—l. 3.0.10. tar ・ gz 今度はⅡ amazu ー 1.3.0.10 というディレクトリができ るのでこのなかの INSTALL ファイルの記述に従って 作業していきます。 Namazu のマニュアルは、展開し たディレクトリの下の d 。 c / ja ディレクトリに日本語で 書かれた manual.html というファイルが用意されてい ます。このファイルは HTML で記述されているので、 netscape で file:/home/miyasita/namazu- 1.3.0.10 / doc/ja/manual. html と指定すれは読むことができま す。このファイルも適 : 売みながら作業をしていきます。 um% cd namazu—l . 3 . 0 . 10 1 % cd src 次にこのディレクトリにある configure というコマン ドを実行するのですが、このときに次の 2 つの引数を付け て実行します。 ・ CGI として Namazu を利用するためのプログラムを 格納 - す - るディレクトリを /home/httpd/cgi-bin にし UNIX MAGAZINE 1999.11 23 こまさきはどインストールした httpd の設定によります。 —with—cgi—dir=/home/httpd/cgi—bin たいので 23 という引数を j 砌日します。 ・ Namazu を管理している人のメールアドレスは miya- sita としておきたいので、 --with-admin=miyasita という引数を j 助日します。 Ⅷ % . /configure \ —with—cgi-dir=/home/httpd/cgi—bin \ —with—admin=miyasita configure コマンドの出力は省略していますが、 Na- mazu を動作させるために必要なソフトウェアか不足して いるときは、 ここて警告を表示します。 このあとの竹業は次のようになります (make コマンド の出力メッセージは省略します ) 。 um% make um0/o Password : # make install # make install—cgi 取に夫イ丁しているコマンドは、 Namazu を CGI と して利用するためのプログラムをインストールするもので す。 これで ChaSen と Namazu がインストールされたの で、全文検索をおこなう竟か整いました。 コマンドラインからの検索 Namazu では mknmz というコマンドを用いて、検 索対象となるファイルを読み込みながら、そのファイル のなかに出現した単語をもとに索引 ( インデックス ) ファ イルを作ります。検索するときには namazu というコマ ンドを使い、指定されたキーワードを索引ファイルのなか から探し出して、そのキーワードを含むファイルを特定し ます。 ます、 mknmz を使って日記ファイルから索引ファイ ルを作成します。この索引ファイルを置いておくディレク トリは -/public-html/nikki/namazu とします。 um% cd -/public—html/nikki um% mkdir namazu um% mknmz —a -D ー 0 namazu 1999 lndex output directory : namazu 0 /home/miyasita/pub1ic—htm1/nikki/1999/9/18 1 /home/miyasita/pub1ic—htm1/nikki/1999/9/19 Time : 16 sec . System : linux Namazu Version: 1 . 3 . 0 . 10 ( 中略 ) 73
特集 Web で日記帳システムを作ろう 図 50 . namaz urc の内容 I NDEX REPLACE /home/miyasita/public—html/nikki/namazu http://10ca1host/%7Emiyasita/ /home/miyasita/public—html/ こでは、 -/public-html/nikki/1999 以下のすべて のファイルを検索対象にしたいので引数ー a を付け、また 対象となるのは日記ファイルなので、そのファイルの作成 時刻などの情報は不要と考えて一 D という引数も追加しま した。索引ファイルの出力先として、直前に作った na- mazu というディレクトリの名前を一 O の後ろに指定して います。 これらの引数の言料田についてはマニュアルか、 mknmz に引数ー h を付けて実行すると表示されるメッセージが参 考になります。 索引ファイルを作ることができたので、コマンドライン から検索を実行してみます。この例では、 namazu コマ ンドにキーワードとして「今日」を渡して検索してみまし た。コマンドラインの最後にある namazu は、索引ファ イルを置いたディレクトリの名前です。出力が大量にあっ たので省略しましたが、うまく検索できているようです。 um0/o namazu " ・今・日 " na.mazu 検索結果 参考ヒット数 : [ 今日 : 13 ] 検索式にマッチする 13 個の文書が見つかりました。 ( 以下略 ) 一度 mknmz で索引ファイルを作ってしまえば、次か らは日記ファイルを作成するたびにさきほどと同じ引数で mknmz コマンドを実行するだけで、索引ファイルが更新 されます。 W 、 VW を利用した検索 この日記張システムは、閲覧するときには日記ファイル の内容を HTML に変換し、それを netscape で見るとい うイ督目みなので、検索にも netscape を使えるようにして みました。それにはさきはどインストールした CGI プロ グラムを利用します。 Namazu のマニュアルを読むと、 Namazu を CGI と して使うには、 CGI プログラム (namazu ・ cgi という名 前です ) と同じディレクトリに . namazurc という名前の 74 図 51 . htaccess の内容 Options ExecCGI AddType application/x-httpd—cgi sh cgi 言置ファイルを用意し、そのなかに索引ファイルの置き場 所などを記するように書いてあります。 今回用意した設定ファイルは図 50 のようなものです。 1 行目は索引ファイルの置き場所を指定しています。 2 行 目は、検索にヒットしたファイルを WWW 経由でア クセスする場合に便利なように、ファイル名の / h 。 me / miyasita/public-html という部分を http://localhost /%7Emiyasita/ (%7E は ~ を意味します ) に置き換える ことを孑しています。 このファイルを namazu. cgi と同しディレクトリに置 いておきたいのですが、さきはどこのプログラムは汎用に 使える /home/httpd/cgi-bin というディレクトリにイ ンストールしたので、同しディレクトリにこの疋ファイ ルも置くと、このプログラムの用途が日記検索に限定され てしまいます。それではおもしろくありません。 そこで、この namazu. cgi を日記の閲覧用 CGI プログ ラムが置いてある /public-html/nikki/bin にコピーし、 このディレクトリにさきほどの設疋ファイルを置くことに します。また、このディレクトリ内にさきはど作成した . htaccess ファイルの内容を図 51 のように変更しておき ます。こうするとファイル名の末尾が . cgi であるような プログラムも CGI として重川するようになります。 作成した -/public-html/nikki/index. html に、検索 する部分を追加します ( 図 52 ) 。この図の下から 8 行目以 ド勧ゞ追加した部分です。 ここに水平線を引くこと 追加部分の最初の <hr> は、 を意味しています。空行を挟んでその次の行からか験索 用のフォームで、マニュアルに書いてあるとおり、 na- mazu ・ cgi への引数の渡し方は get を用いています。 また、検索に使うキーワードを指定する部分は < input type=" text" name= ' key" size=" 40 ' ' > と記するこ とによって、文字を入力するための蝠 40 桁の箱を用意 し、入力された文字列を key という名前の変数として na- UNIX MAGAZINE 1999.11
特集 Web で日記帳システムを作ろう 図 59 search. sh ( バージョン 2 ) の内容 # ! /bin/sh echO "Content—type : text/plain" eval $QUERY_STRING KEY= ( echo $key ー perl —e while ( く > ) { pr int $ ー while ( く > ) { KEY= ( echo $key ー perl —e eval $QUERY_STRING echO "Content—type : text/html " # ! /bin/sh 図 61 search. sh ( パージョン 3 ) の内容 echo $KEY pr int $ ー 図 60 ファイル 戻る 自転第 search. sh ( パージョン 2 ) の実行結果 編集表示ジャンア c 。「宿 n 朝 ま再読込 ~ ーホーム検索 , 海 e へルア 印刷保護 NAMAZU_CONF=/home/miyasita/pub1ic—htm1/nikki/bin/ . namazurc /usr/local/bin/namazu -h —f $NAMAZU—CONF $KEY 図 62 search. sh ( 元 ) の内容 # ! /bin/sh echo "Content—type : text/html " echO eval $QUERY_STRING KEY='ech0 $key ー perl —e while ( く > ) s/%(CO-9a-fA-F]2)/pack("c",hex($1))/ge; print $ ー NAMAZU_CONF=/home/miyasita/pub1ic-htm1/nikki/bin/ . namazurc /usr/local/bin/namazu —h —f $NAMAZU—CONF $KEY ハ YEAR=\1\&MONTH=\2\&DAY=\3/g ' ( 誌面ク ; 合上て折り返しています ) MAZU-CONF という変数に定義しています。そして、 13 行目で namazu コマンドの引数ー f の後ろにこの変数 を指定し、索引ファイルの置き場所などの情報を namazu コマンドに教えます。さらに、引数ー h を追加して検索結 果を HTML でさせます。 UNIX MAGAZINE 1999.11 これで、今後 search. sh の出力結果は HTML になる ので、 3 行目も変更しておきます。 このように変更した search. sh の出力結果は図 55 と同 しものになります。 最後に、この namazu コマンドの出力結果を加工しま 77
特集 Web で日記帳システムを作ろう 図 48 スクリプトの変更 ( 21 行目 ) (a) 変更前 sed —e 's/*$/ く p>/' $NIKKI—FILE (b) 変更後 sed -e ' s/-$/ く p>/ ' -e 's/\( く img. *src="\)/\l.. \/photo\//g' $NIKKI-FILE 図 49 10 月 18 日の日記を見る ( その 2 ) を対象に手軽に検索できるようになったため、大きな注目 を集めている技術です。しかも、日本語を含む文書の全文 ~ ファイル編集表示ジャンプ CO 叫 0 聞に砌ー 物索権ー印ーー保護 戻る 第 : 再読込 = オー 、ミ蠡・プりグマーク↓場所叩ゾ加 c 。 5 い叫”れ n 社 v 朝山寸 ? 、・ EAR 。 1339 & MC'NTH -10 & / = ) に関遽サイト 検索をおこなうソフトウェアの多くがフリー・ソフトウェ 1 99 / 10 / 18 アなのですから、これは試さすにいられません。 日も元スに出第といきたいところだが ; 、月日はどうも体がダルくていけない 午前申はいい美スだったのだがタしく市が降った . をのときに研富の外へ出てみると - 学の輩物の上に虹が出ていん のでをわず写支につおけど、写支だとよくわからないなあ . 準備 全文検索をおこなうソフトウェアはたくさんあります が、今回はフリー・ソフトウェアの Namazu を使うこ とにします。 Namazu は手軽に使える日本語全文検索シ ステムで、簡単に CGI として利用できるので、今回のよ うな用途にはうってつけです。 私か調べた範囲では、 Namazu の RPM 形式のパッ ケージはみつかりませんでした。そこで、「 Namazu the full text retrieval search system 」というべーシ 21 か ら namazu-l. 3.0.10. tar. gz をダウンロードしました。 上記のページを読むと、 Namazu を利用するには下記 のソフトウェアが必要なようです。 ~ 0 朝朝ツ匐、彡 1. perl 5.003 以降 で、どちらかを用意すオ L ばよいようです。とくに理由はな 2. nkfvl. 62 3. 京都大学の馬場肇氏がパッチを当てた kakasi-2.2.5 いのですが、今回は ChaSen を利用することにします。 4. 奈良先立物斗哮技術大完大学の「茶筌 (ChaSen) 」 ChaSen のはうも RPM 形式のパッケージはみつからな かったので、「 ChaSen 」のペーシ 22 から chasen-sys2. 1 つ目の PerI は強力なプログラム言語で、多くの PC 0b6-ipadic1.0. tar. gz をダウンロードしました。 UNIX に標準でインストールされています。 2 つ目は日本 まず、このパッケージを展開します。 語の文字コードを変換してくれるフィルタで、これも多く の PC UNIX に標準でインストールされていると思いま ー % tar -xzf chasen—sys2. Ob6—ipadic1.0. tar ・ gz す。インストールされていない場合も、かなり高い確率で すると chasen-2.0b6 というディレクトリができるの OS をインストールするときに使った CD-ROM のなか で、そのなかにある README. jp に従らて作業します。 に求されているはすです。万一求されていなくても、 このファイルには MakefiIe の内容を適宜変更するように 2 っともたいへん有名なソフトウェアなので WWW 上 と書かれていますが、今回はその必要はなさそうなのでそ で検索すれば RPM 形式のパッケージを簡単に探せるで のままにしておきます。あとはコンパイルしてインストー ルするだけです ( ー己では make コマンドカ咄力したメッ 3 番目と 4 番目はどちらも日本語を単語に分解 ( 分か セージは省略しています ) 。 ち書き ) するために Namazu が利用するソフトウェア 22 http://cactus ・ aist-nara. ac ・ jp/ からたどれます。 21 http://openlab.ring ・ gr ・ jp/namazu/index. html.ja 目 1 を 72 UNIX MAGAZINE 1999.11
イ ン タ フ ェ イ ス の 街 シグネチャ法によるお手軽検索システム 角 23 増井俊之■ 高機能なサーチェンジンのおかげで Web ページは上交 的簡単に検索できるようになりましたが、受け取ったメー ルなどの検索には困っている人も多いのではないでしよう か。私もその 1 人ですが、状況を改善するために個人でも 気軽に使える検索システムを作ってみました。 UNIX 上でファイルを探すには、 find コマンドでファ イル名を検索したり、 grep コマンドで内容を検索するの が一般的です。ファイルがどこにあるかが分かっていれ ば、たいていはこれで間に合いますが、、、どこかにあった " といったあやふやな記匱しかない場合は探 はすだが・ しだすのにかなりの時間がかかります 1 。そのようなとき は、 Web ページの検索と同様、すべてのファイルに対す るキーワードを用いた全文か有効です。 ファイルの全文検索をおこなう商用システムも市販され ていますが、ひろく使われているものはあまりみかけませ ん。フリーのシステムとしては、 Namazu2 が Web サー バーなどでよく利用されているようです。解説によれば、 Namazu は、、手軽に使える " ことを目指しているそうで すが、検索速度も重視しているため、、、手軽さ " はやや犠 牲になっているきらいがあります。 Namazu をはしめとするはとんどの全文検索システム では、高速検索のために単語ごとのインデックスを作成し ます。たとえは、、、単語 " という単語がどのファイルに含 まれているかという情報をインデックス・ファイルに格 納します。この方式はきわめて高速な検索が可能になる反 1 歳のいか、去もをはこういうことかひどく多くなったような安切ゞ・・ 2 http://openlab.ring ・ gr ・ jp/namazu 全文検索システム 170 面、文書に含まれるあらゆる単語について情報尉寺して おかねばならないので、巨大なインデックス・ファイルが 必要になります。さらに、分かち書きされていない一ヨ勺 な日本言韶 ) 文書を単語に分割するために形態素斤プログ ラムを利用します 3 。そのため、処理に時間がかかり、全 体のシステムも複雑になりがちです。システムやインデッ クス・ファイルか複雑になると扱いにくくなり、ちょっと したカスタマイズなどもおいそれとはできません。 インデックス・ファイルを用いた検索手法の利点は、 なんといっても検索の高速性でしよう。この種の方式は、 Web のサーチェンジンのように高速性を優先し、インデッ クスの作成にかかる手間や時間はさはど問題にしなくても よい場合に適しているように思います。一方、個人のファ イルは、検索回数はそれほど多くないのに対し、更新や移 動は頻繁におこなわれます。インデックス・ファイルのサ イズも小さければ小さいほどよく、更新の手間も少ないほ うか楽です。 今回は、個人のファイルを対象とした手軽に使える検索 システムを紹介します。ごく簡単なインデックスを使って いるため検索はあまり速くありませんが、一ヨ勺な用途に は十分ですし、カスタマイズも容易です。 文書の全文検索は、 grep のようにまったくインデック スを使わない去と、 Namazu や Web のサーチェンジ ンのようにあらかしめ完全なインデックスを作成する去 の 2 不頁に大別できます。前者は、インデックスを作成 3 たとえば Namazu では、日恥谺彡態素角斤システム「茶筌」などを用 いてキーワードの切出しをおこなっています。 シグネチャ・ファイルによる検索 UNIX MAGAZINE 1999.11
特集 Web で日記帳システムを作ろう 図 52 藤磁皀を追加した index. html et " > く html > く head> く title> 日記帳く /title> く /he ad> く body> く hl > 日記帳く / hl > く fO て m action="bin/nikki . く select name="YEAR"> く option se1ected>1999 く option > 2000 図 53 単 . 入力 ーフ , イル、編集表示ジを - ンア c 。 0 ⅷ国 戻を一」次再読込ーホーみー験海 c , 第第・プ少クマクま場所を叩冫 , 師 c 酬い 7Em ッおねレ を記を 自転第 図 54 結果 「フ - ア、ル編集表示ジャンプ - 朝 m 「 印刷 保護 保護 ー / ア関連サイ method=" く /select> 年 く select name="MONTH"> く optio Ⅱ > 1 く option>5 く optio Ⅱ > 9 く /select> 月 く select name= く option>l く optio Ⅱ > 5 く option>9 く optio Ⅱ > 13 く option > 17 く optio Ⅱ > 21 く option > 25 く option > 29 く /select> 日の日記帳が く / fo て m > く hr > く form action= く /form> く /body> く /html> く optio Ⅱ > 30 く optio Ⅱ > 26 く optio Ⅱ > 22 く option > 18 く option > 14 く option > 10 く option>6 く optio > 2 "DAY"> く option > 10 く option>6 く option>2 戻る 再読込にホ、ツ検索国ィ印刷 く optio Ⅱ > 3 く optio Ⅱ > 7 く optio Ⅱ > 11 く optio Ⅱ > 3 く option>7 く optio Ⅱ > 11 く optio Ⅱ > 15 く optio Ⅱ > 19 く option > 23 く optio Ⅱ > 27 く optio Ⅱ > 31 く optio Ⅱ > 4 く optio 取 > 8 く option > 12 く option>4 く optio > 8 く optio れ > 12 く option > 16 く optio > 20 く optio Ⅱ > 24 く optio > 28 、 4 ' ブッ - グマ、 - ク↓場所第叩 ( を " ツね , 。。加。川 3 川 ? 畑た % 1 日 48 % を関連サイト 境を、訂のププイ : ルがイ彡デッグズ化 2 れ、 5 扱値のキー -1 ドが舞さています . 、ー載による第戈・奢、シスデム 覆第のにをツそオるれクアつ第ジまし を考とつを「自転第 2 ] 第房を言を第るー」ッ、 インダッグズの第第ぞを : 盟恭′ が段量いなので通に発ネに時第がかかる、平日は自転第風さんへ《をがないと要うのて、今い 既自臨第のタイヤがパッグし、ので日はて出れ登リまのつらさはあま支わら第いが」平地でのえビ三ドー ! 壘可い効 使い方がをしそうったのでめた、久しリに自をに第る当、その第異のビドに物とすを一 午中、自転第をさん・、きパンクを物理しまもら - プ . 店願にあたバング第理キットなるものを人レをうにがも ーこの全支検素シメテムは製朝ま社Ⅵコ .0 」 0 、によらて物第されています . ! 島当プ国ノ髜 フ、ツイル編集表示ジャンプ - co m 如に 3 図 55 結果の日記 く input type="submit" value = ". 見たし、 " > "bin/namazu. cgi " method="gett' > く input name="key" size="4()"> く input type="submit" value=" 検索 "> UNIX MAGAZINE 1999.11 しかし、これでは日記ファイルの閲覧用 CGI プログラ 下のほうのリンクをクリックしてみます ( 図 55 ) 。 が分かります。その日記ファイルへのリンクがあるので、 には、、自転車 " という単語が含まれるものが 2 個あること 行さ図 54 のような結果か表示されました。私の日記 [ 検索する ] ボタンをクリックすると namazu. cgi が実 車 " という単語を入力してみます ( 図 53 ) 。 さっそく試してみましよう。ここでは例として、、自転 mazu. cgi に渡すようにしています。 ッ第」 ~ ー再読込 = ネー - よ験索 N 、印刷 ・ブックマーク 4 : 曁所・を叩引 0 ( 3 物 05 レ % 7E0 ル 3 引はれ娘い 33W1 6 朝、自転率のタイヤがバンダしていたのでタ日は徒歩て動 . 発り坂のつらさはあまり寶わらないが、平地てのスどードが 、なのて通動に非電に時関がおかを 平日は自転事さん - 絎くをがないとを ) のて、今いっげい 通動お . 保護 . / を関違サイト ムを通らすに、、生の日記ファイル " が見えてしまいます。 もちろんこれは Namazu か懇いわけではありません。 そこで直接 namazu. cgi は使わすに、内部で namazu を呼び出すような CGI プログラムを作成して、 namazu の出力をカ旺することによってこれを改善することにしま す。 75
図 56 search. sh ( パージョン 1 ) の内容 # ! /bin/sh echO "Content—type : text/plain" eval $QUERY—STRING echo $key 図 58 CGI. pm 中のサプルーチン unescape 特集 Web で日記帳システムを作ろう フ , イル編集表示ジャンプ co r 図 57 search. sh ( パージョン 1 ) の実行結果 戻る 再読込ネーム検索権印刷保護 朝 ' クマーク場所当当謇讐 : 挈当 : 当響讐当 ! 粤門認当お・麕連サイト 行組 8 % 24B 第 0 % 2 日 E % 3E 第 20V % IB % 日 # unescape URL—encoded data sub unescape { my ($todecode) = $todecode $todecode WWW からの検索 ( 改良 ) return $todecode ; # pluses become spaces 解釈しなけれはなりません。 検索をおこなう CGI フログラム (search. sh という名 前にします ) の芻既彡を作ります ( 図 56 ) 。 1 行目はこのファ イルがシェル・スクリプトであることを示しています。 3 ~ 4 行目は、このスクリプトの出力が何も装飾のない文書 (plain text) であることを WWW プラウサに知らせる ためのものです。 5 行目では、さきはどと同様に get とい う友去で httpd から渡された引数を評価し、 6 行目でそ の内容を出力しています。 また、このスクリプトを呼び出すように index. html の はうも変更します。これは図 52 の、下から 6 行目にある namazu ・ cgi を search. sh に変更するだけです。これで、 さきはどと同し「自転車」という文字列を入力してみると 図 57 のように表示されてしまいました。 これは、 form を用いて文字列を CGI プログラムに渡 すときに独牛 ) 変換がおこなわれるためです。この変換は おもに次のようなものです。 ・半角の空白文字は十に変換される。 ・半角英数ネ以外の文字は、その文字を表す ASCII コー ド ( 16 進数 ) を % の後ろに付加したかたちに変換さ れる。 namazu ・ cgi を直接使ったときにはこの変換は na- mazu. cgi のなかて埆早釈されていましたが、今回は自分で 76 この解釈のために参考になるプログラムはないかとあち こちのディレクトリを探していたら、 Perl のモジュール のなかにびったりのルーチンがありました。 CGI. pm の なかにある unescape というサプルーチンがそれです ( 図 58 ) 。この図の 4 ~ 5 行目がまさにこの変換を解釈してい る部分です。 この CGI. pm というファイルは、 PerI ( バージョンは 5 以 E) のライプラリが集めてあるディレクトリ 24 に置い てありました。 このルーチンを使って改良した search. sh は図 59 の ようになりました。さきほどとは 6 行目以降が異なって います。 6 ~ 11 行目で、変数 $key の内容を Perl を用いてもと に戻し、その内容を変数 $ KEY に定義しています。そし て、その内容を 12 行目で出力しています 25 。結果は図 60 のように正しく解釈されていることが分かります。 次に、 $KEY の内容を出力する代わりに、 $KEY を引 数として namazu コマンドを夫行する部分を search. sh に追加します ( 図 61 ) 。 12 行目では、さきはどの na- mazu ・ cgi を実行するときに使った疋ファイルを、 NA- 24 Red Hat Linux では /usr/Iib/per15 でした。 25 全部を PerI スクリプトにすれはいいのにという声か聞こえてきそう ですが・・ UNIX MAGAZINE 1999 ユ 1
0 ・よぶんに必なファイルか単純で小さい シグネチャ法による検索でよぶんに必要なのはシグネチ ャ・ファイルだけです。各テキストのシグネチャはファ イル本体にくらべてかなり小さいので、全単言 ) インデ ックスを用意するガ去と上交するとディスク領域をそれ ほど必要としません。 このように、シグネチャ法は grep などを用いた検索 とインデックスを利用する去の中間的な特徴をもってお り、個人や小規模なオフィスにおける情報検索に適してい ます。 検索システムの実装 シグネチャ・ファイルは、以下の手順で作成します。 1. 検索対象のファイル一覧を作る。 2. 各ファイルの重要部分を抽出し、漢字コードを統一す る。 3. 重要部分のシグネチャを計算してシグネチャ・ファイル に加える。 以下では、これらの処理を順番に説明します。 検索対象のファイル一覧作成 ます、 *. 。や *. dvi など、明らかにテキスト検索の対象 にはならないファイルを除外するため、検索が必要なファ イルの一覧を生成する listfiles コマンドを作ります ( リ スト 1 ) 。 こでは検索するディレクトリ名やパターンカワ。ログラ ムに埋め込まれていますが、竟によってこれらを変更し たり引数て指定できるようにするとよいでしよう。 ファイルの重要部分の抽出 listfiles で生成された各ファイルについて重要な部分を 抽出し、コード変換をおこないます ( リスト 2 ) 。どの部 分か重要かはファイルの内容によって異なるとは思います こではオ戒白勺に地頁から 1 , 000 バイトを抽出し、検 が、 索処理のために文字コードを EUC に変換しています。 メールやニュース記事の場合はヘッダを除いたり、 ファイルなら、、 \begin{ ・ . } " などのコマンド文字列を取 り除く処理をすれはよいでしよう。 172 リスト 1 Iistfiles()E 対象ファイル一覧を作成 ) # ! /usr/local/bin/perl require 'find. pl' ・ # 検索対象のディレクトリ @dir = ' /user/masui/DOC/meib0/ ' # 検索が必要なファイル名の種別 sub valid { 10Ca1 ( $ ー ) # 検索不要なファイル名の種別 sub invalid { local($-) &find(@dir) ; シグネチャの計算 toptext() 関数で軸出されたテキストに対し、ハッシュ を引・算してシグネチャを求めます ( リスト 3 ~ 4 ) 。効率の よいシグネチャを作るにはよいハッシュ関数を使う必要が ありますが、このプログラムでは文献 [ 1 ] で紹介されてい る hashpjw() 関数を使っています。 さきほど述べたように、 Namazu などの一般的な検索 システムでは、テキストをます単語に分解してからインデ ックスを作成するため、形態素角斤システムが必要です。 このとき、誤った形態素角財斤により検索に失敗する可能匪 も皆無とはいえません。たとえば、、、東京都民 " という文 字列を、、東京 / 者眠 " と分解してインデックスを作成する と、、、東京都 " では検索できなくなります。あるいは、も との文脈では、、東 / 京都 / 民 " だったかもしれません。 こでは、形態素角財斤の手間を省いてシグネチャ・ファ イルの作成を高速化するため、、、あらゆる連続した 3 バイ トを単語とみなしてシグネチャを言算する " という手法を sub wanted { # & find で呼ばれる # $name = $dir/$- # シンポリック・リンクなどは除く return if ー 1 $name Ⅱ ! —f $name ; # ファイル名をもとに要 / 不要を判別 return if ! &valid($name) & &invalid($name) ; print "$name\n" UNIX MAGAZINE 1999.11
インターフェイスの街角 図 2 シグネチャ・ファイルのエントリ列 CHd] RhBTctAPQH' TaPAAPOrB ( YZHcZG&S@BjvPej eAQZHNsfKmdAgOSHA@a@FnrNkHy@bRRJIDh@@RdDvAHFpI@@PphHhEB@ i@QBRNepYPhZhp@ZyH@@D@TZd@fhD@D@f@Pp@l Ri{@jHBD 'YzePDbEFDp' zHBj -baCb ( @L@1BdW [CLFAS@WR' Nax ( hN@V\h@ /user/masui/DOC/meib0/m/a/Masui. Toshiyuki zN@DD\hD [DVNL ( Hht@@KDtsAh@wAiT@xZ\aH@PMIQFv?—nBi ( DAnhb ' E ( HH@@hAY リスト 6 sigfind. c ( シグネチャ・ファイルを使った実行 ) #include く stdio . h> #include く stdlib . h> #include " signature. h" #include "toptext. h" void err(s) { fprintf (stderr, exit(0); } main (int argc , char **argv) FILE *sigfile,*f ; char *pat ; char buf [ 5000 + 1 ] ; char patsig [SIGBYTES + 1] , textsigCSIGBYTES + 1] ; char filename [ 1000 ] ; int Ⅱ ; if (sigfile = = NULL) sigfile fopen(argv[2] ,"r"); than 2 bytes") ; err( "Pattern should be longer if (strlen(pat) く 3 ) pat = argv[l] ; if(argc く 3 ) err()% sigfind pat 髫 s) ; sigfile err( "Cannot open signature file" ) ; calcsig(pat ,patsig) ; whi1e(fgets(buf,5000,sigfi1e) ) { sscanf (buf , "%s\t%s" ,filename 'textsig) ; if (sigmatch(textsig,patsig) ) { fopen(filename,"r")){ if(f Ⅱ = fread(buf,1,5000,f); buf [ 司 if (strstr(toptext(buf) ,pat) ) printf ("%s\n" ,filename) ; fclose(f); UNIX MAGAZINE 1999.11 か否かを sigfind コマンド ( リスト 6 ) で串ヾれは、去絲冬 れに成功したファイルについて、パターンが含まれている グネチャとを上は交し、第 1 段階の検索をおこないます。 されたシグネチャ・ファイルとパターンから生成されたシ sigmatch() 関数を用いて、検索対象ファイルから生成 シクネチャ・ファイルを利用した検索の実行 的な検索結果か得られます。 sigfind は、次のようにして生成します。 % gcc —g —c sigfind. c % gcc —g sigfind. 0 signature. 0 toptext . 0 \ ー 0 sigfind 実行結果は、たとえば以下のようになります。 % sigfind ' ソニー sigfile /user/masui/DOC/meib0/k/i/Kitano . Hiroaki /user/masui/DOC/meibo/m/a/Masui . Toshiyuki /user/masui/DOC/meibo/t/o/T0koro . Mari0 検索の手軽さ 今回の検索プログラムは全部で 250 行程度と小さく、 特殊なツールも使っていないため、インデックスの作成 や検索の実行もかなり手軽におこなえると思います。検索 速度は Namazu などとくらべるとはるかに f 応ですか 5 ときどき使う程度であれ ( 幻 - ・分ではないでしようか。 makesig で生成したシグネチャ・ファイルはテキスト形 式なので、どのようなファイルがインデックスに含まれて いるのかがすぐに分かります。イ腰なエントリを削除した り、新しいエントリを追加するのも簡単です。たとえは、 例に使った名簿ファイル用ディレクトリの私のエントリ に関するシグネチャは、図 2 のような行て表現されてい ます。これなら、 grep などて取り出したり、不要なエン トリを取り除くのも簡単でしよう。 ェントリを追加するときは、 % find / —mtime ー 1 —print ー makesig などとして新しいファイルに対するシグネチャだけを引・算 し、既存のシグネチャ・ファイルに含めることができます。 あるいは、ファイルを保存するたびに、そのシグネチャを シグネチャ・ファイルに追加するようにしてもいいでしょ 5 : 仏の竟では、イ第 t 100MB 程隻のファイルの検素に約 10 科力、かりま す。 175
特集 Web で日記帳システムを作ろう 図 63 search. sh ( ー ) の実行結果 フ〒イル編集表示ジャツア℃ 0 ”朝新 戻る次再込ホーム ~ 験素 , 印ー保護 当、を ' ブックマーク↓場所 . を叩川 003 物 0 第 7Em Ⅳね衂は 3 にル 5 純 % 1 日 % 24 日第 3 ( 製ツ「「 、 m 載 u によさ戈・シスデ必 を、引のプアイルがインダッグス化され、 51 タ宿のキーワドが第されています・ 当 ! 些以“。 2 ) を住に′ンチる 2 のズ第がつ第しを をどツを [ 自転を 2 ] ッダングズの第第タヨ 1 ー ーヘルガ ' 関連サイト 午申、自転第屋さんへ行きパングを第理してもらうい店 : あったング第場キットなるものを物しを引 : なるが、 を礙。畆 0 7 日止心な : に「 . 駅司 & トーれを止 0 ( 42 ト界 0 り が段速いなので通物に第第にがかかる , 平日は自転屋さんへ行くがないと思うのて、週い 新、自をのタイヤがパンケしていたので日は歩で出れをり坂のつらさはあまジ変わらないが、平でのビヂ 2 毛 ( 当 - ! Ⅱ“ 0 2 ) 的 9 を給田夏 46b ) 30 語 0 使い力が・しそうだったのて物めた第久しみりに自転まに第ると、その第異のスビドに物とする この全支検シスをムは川新ⅵユ 0 」 0 によって物されています . 図 64 図 63 からリンクをたどる フツイ・ル編集表示ジャンプ communicator 戻る ー再読込ホーム験棗権、一印刷卩保 当、を・ブックマーグ、 & 場所 : = 叩 00 10 7Em Ⅳ 3 引は′物は " ifn•k 灯 ? YEAR ・ 1933 & MON ル = 1 ツ 1999 / 10 / 6 1 、み ' 関連サイト ヘルガ 亂自転をのタイヤがパンケしていたの 4 日は貨て出れ登リ板のつらさはあまツ第わらないが , 平岶でのスビードがを いなのて道第に発ネに時問がかかる . 平日は自転屋さんへ行くをがない 4 当うので、を置いつはいをナ通か . 78 ると、図 64 のように希望どおり日記閲覧用 CGI プログ 検索にヒットした日記ファイルへのリンクをクリックす この結果、表示される検索結果は図 63 のようになり、 す。 の後ろのコマンドによって前述したリンクを変換していま に渡すためのものです。そして sed コマンドでは一 e 引数 コマンドの出力をその下の行の sed コマンドの標準入力 さきほど追加した 13 行目の最後にあるハは、 namazu 加した search. sh か図 62 です。 18 に変換すればよいことになります。このための行を追 bin/nikki. sh?YEAR=1999&MONTH=10&DAY= 10 / 18 のようになっているので、これを sed で nikki/ 検索結果のなかでは、日記ファイルの名前はⅲ kki / 1999 / それには、これまでと同様に sed コマンドを使います。 ように変更することです。 ンクを、日記閲覧用 CGI プログラムを通したものになる す。目的は、検索結果として出力された日記ファイルのリ ラムを通した結果か表示されるようになりました。 まとめ WWW を利用して自分のためだけの日記帳システムを 作成しました。その特徴をまとめておきます。 ・日記の内容はプレーンテキストとして書く ・日記の表示には netscape を利用する ・プレーンテキストを HTML に変換する信群トけがある ・デジタルカメラの写真を日記に貼ることかできる ・日記本を検索することができる はかにも、日記ファイルのあいだにリンクを張って何日 か前の日記をクリックひとつで閲覧できるようにしたり、 せします。 ったことも考えられますが、 さらに表示去を工夫したり、 ( みやした・けんすけ岡山理科大学 ) これらは読者の皆さんにお任 日記に音声も録音するとい UNIX MAGAZINE 1999.11