libintl-perl を使ってみる2007年09月23日 01時27分08秒

Namazu では GNU gettext を利用して、メッセージの言語切り替えを行っています。 namazu や namazu.cgi は GNU gettext の libintl を使って、mknmz では独自のルーチンを使って(gettextを使わずに)メッセージカタログにアクセスしています。

このため、処理の違いにより不具合が生じることがあります。 例えば、mknmz では日本語でメッセージが出るのに、namazu.cgi では英語になるといったことです。 これは微妙な処理の違いや、GNU gettext の仕様変更によるものであったりします。

これらの微妙な差をなくすためには、mknmz の独自ルーチンをやめて、mknmz でも gettext を使うというのが正しい選択でしょう。

namazu, namazu.cgi で GNU gettext を使うのですから、mknmz で GNU gettext を使うようにしても、インストールの手間はそれほどかからないはずです。

mknmz は Perl によるプログラムですから、gettext の Perl モジュールが必要となります。そこで、いろいろ調べてみると libintl-perl というものを見つけました。 試しに libintl-perl-1.16 を使ってみました。

#!/usr/bin/perl

use Locale::TextDomain qw (namazu);

print __("Invalid query");
print "\n";
print N__("Invalid query");
print "\n";

このプログラムを Namazu がインストールされている環境で実行すると、

$ perl test-libintl-perl.pl
不正な検索式です
Invalid query

と、表示されました。 これだけ動けば mknmz で使うのに十分でしょう。

ただ、ローケルファイルのあるディレクトリを指定した場合に正しく動いてくれませんでした。何か設定のミスだとは思いますが、はてさて。

2つのインデックスが同じかどうか比較するツール2007年04月20日 03時43分46秒

最近、2つのインデックスが同じかどうかを比較するツールが欲しいと感じています。

例えば、update を繰り返したインデックスと、新規に作りなおしたインデックスが同じかどうかを比較したり、文書を2つのグループに分けてそれぞれインデックスを作った後にマージしたものと、最初からまとめてインデックスを作ったものが同じかどうかを比較したりといったことのためにです。

これは単純に diff や cmp での比較では同じかどうかをチェックすることができないからです。

まず、Namazu のインデックスはupdateを繰り返すとゴミが含まれます。ゴミが含まれる以上、diff や cmp で一致しないのは明白です。ただ、このゴミは gcnmz で除去できます。しかし、ゴミを除去しても diff や cmp では一致しません。 これは、Namazu のインデックスは処理した文書の順番に依存するデータ構造のためです。

このため、インデックスを比較するためには、専用のツールが必要となります。

また、gcnmz にインデックスを文書名順にソートする機能を加えて、変換後に diff や cmp で比較するという方法も考えられます。

HEAD を Namazu 2.3.X へ移行2006年08月13日 09時04分53秒

従来の HEAD(2.1.X) を development-2-1 ブランチに分け、HEAD をutf8index-branch に置き換えを行う作業がスタートしました。

これにより HEAD を Namazu 2.3.X とし、Namazu 2.2.X の開発版という位置づけにします。

従来の安定版 stable-2-0 に対する開発版は development-2-1 となります。

画像フィルタ見つけました2006年06月07日 10時53分10秒

画像フィルタ(image/bmp, image/gif, image/jpeg, image/png)

http://www.interq.or.jp/japan/koi_san/trash/2004/namazu_filter2.htm

GPL2

中身は確認していません。

UTF-8 に対応した分かち書きツール2006年04月19日 22時25分22秒

開発版の kakasi では UTF-8 の入出力が可能です。
しかし、内部で EUC-JP に変換して処理後、UTF-8 に再変換して出力するだけですので、EUC-JP に含まれない文字の処理はできません。
kakasi では3バイト文字に対応していませんので、JISX0212補助漢字(またはJISX0213 JIS第3/4水準漢字)には対応していません。

このため、Namazu の UTF-8 化に伴い、UTF-8 の分かち書きが可能なツールが欲しいものです。
Namazu の開発版には簡易分かち書き機能がありますので、これを発展させるか、あるいは kakasi の分かち書き機能を切り出して UTF-8 化を行うというのも良いかもしれません。

なお、ChaSen, MeCab は、辞書を UTF-8 で用意すれば UTF-8 で処理が可能ではあります。

外字2006年04月09日 18時44分03秒

外字は全文検索に不向きです。 自由に定義できるため、どのような内容が定義されているのかを知る手段がありません。

しかし、世の中には市販されている有名な外字フォントというものも多々あります。 (外字はコードというよりもフォントに依存すると考えるのが妥当です。)

例えばMacintoshDTPで定番となっている「ビブロスフォント外字セット」

 http://www.biblosfont.co.jp/product.html

もそのひとつです。Windows 版の

 http://www.est.co.jp/fe/kigou/index.html

もあります。

あらかじめビブロスフォントを使用している文書であるとわかっている場合には、これらの外字を全文検索用に別の文字に置き換える等の処理を行えば、全文検索に利用することもできるでしょう。

例えば、

(0) -> 0 や (普) -> 普 といった置換するライブラリです。

かなり限定した用途であり、運用する上で注意しないといけませんが、そういった特殊な用途に特化するのも面白いかもしれません。

ただ、ひとつの文書の中に複数のフォントを切り替えていることは多々あり、それぞれ別の外字が定義されていると、フォントごとにテキストを取り出さないと正しく処理できないので、あくまでも外字の種類は1種類のみといった簡単な対応しかできないでしょう。

同様に CP932 の機種依存文字も変換するライブラリがあれば良いかもしれません。(こちらの方が実用的)

例えば、

(株) -> 株 や 平成(1文字) -> 平成(2文字)

といったよう。

検索後、クリックしたリンクを調べる2006年03月21日 02時30分43秒

検索結果からどのページのリンクをクリックしたのかがわかれば、クリック数の多いページをより上位に表示するような仕組みを実現するのも可能でしょう。

NMZ.result.normal のリンクの部分を書き換えて

<dd>a href="/cgi-bin/link.cgi?uri=${uri}">${uri}</a> (${size} bytes)<br><br></dd>

次のような link.cgi でラップすれば、リダイレクトができます。

#!/usr/bin/perl

use CGI;
$query = new CGI;

my $uri = $query->param('uri');

print "Location: $uri\n\n";

あとは uri を記録する部分を追加すれば良いだけです。
また、この CGI でリンク先を取得し、キャッシュファイルに保存する等すれば、google のキャッシュのようなものも作れますね。
同様に PDF/Word等 の場合は、テキストに変換して保存しておくと、リンク先をテキストかHTMLで参照する(プラグイン、ヘルパーアプリケーション不要)というのも作れます。

google のマネしても何ですけど...。

Search-Namazu for Windows でエラー発生2006年03月04日 00時02分26秒

Namazu for Windows 2.0.15 を使って、Search-Namazu 0.93 をコンパイルしてみました。

まず、Makefile.PL の中に nmz-config が2箇所使われているので、それぞれを置き換えます。

$cflags = '-IC:/namazu/include';
$libs = '-LC:/namazu/lib -lnmz';

Makefile を作成し、コンパイル。
しかし、blib/lib/Search/ の下に Namazu.pm は作成されませんでした。
仕方がないので、Namazu.pm は手作業でコピーし、インストールを終えました。
次に、perl のプログラムを実行すると Search::Namazu::Search() 実行時に perl のエラーが発生してしまいます。

もう少し調べてみると、Search::Namazu::Search() 内の nmz_search() でエラーが発生しているので、どこかでメモリを壊しているのかもしれません。
ただし、今回は nmz.dll を使うようになっているのですが、この nmz.dll を C から使った場合は、何の問題もなく検索ができています。

要調査です。

Namazu Document Filter for Windows Media Format[WMV/WMA]2006年02月11日 18時45分19秒

Namazu Document Filter for Windows Media Format[WMV/WMA]

http://www.baykit.org/~hoshino/wmawmv.html

というのを見つけました。
中身は全く確認していません。

GPL2 なので手直しして取り込んでも良いかも...。

html.pl フィルタの XHTML 対応2006年02月10日 10時55分32秒

Namazu は HTML には対応しているが XHTML には対応していないので、html.pl フィルタでは "/>" でタグが閉じているものを無視して処理してしまっています。

今時、それはないので XHTML 対応も考えないといけないでしょう。

とりあえず、html_filter の最初の方で "/>" を ">" に置換してから処理を通せば大丈夫なはず。
あと、isexcluded が html_filter の前に通るので ここだけは個別に対応しておく必要がありますが、現状のままで問題ないようです。

# しかし、"/>" を ">" に置換するのは少々強引か...。
# 問題が起こるのは、"\s*>" 等のパターンを使っているところ。そこを "\s*/?>" に全て変える方が良いか...。

HEAD の場合、テンプレートは XHTML にも多少対応しているのですが、stable-2-0 への対応はまだ甘かったかもしれません。
ちなみに HEAD の方は、HTML パーサを使うこともできるので、もう少しまともな処理が可能なはずです。