Namazu-win32-users-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: インデックス作成時のエラーその後



竹迫です。

池浦さん、ご報告どうもありがとうございます。

Subject: [namazu-win32-users-ja] インデックス作成時のエラーその後
From: <sikeura_BGY@xxxxxxxxxxxxxxxxxxxxxxxxxx> said:
> 竹迫さんの修正が加わったkakasi-2.3.3をcygwinでコンパイルして
>メール:kakasi -w cr_eat_mode bug? に添付のfailed.txtや当方の問題の
>テキストファイルで
> kakasi -w < failed.txt
>を行うとkakasi単体は正常に終了するようになりました。しかしこのテキスト
>ファイルを
> C:\>perl c:\namazu\bin\mknmz -U -O d:\index d:\test 
>     ※d:\testに問題のテキストファイルを入れています。
>とすると以前と同様perlがハングする状態のままでした。ちなみに同じことを
>failed.txtでやるとmknmzは正常に終了します。そこでPerlをデバックモードに
>してmknmzを追っかけていくと、wakati.pl中のwakatize_japanese_subで71行目の
>  $str = Text::Kakasi::do_kakasi($$content);
>でハングしているような感じでした。まだどこかでオーバーフローしている
>モジュールがあるのでしょうか?

Namazu version 2.0 以降からは、mknmz のインデックス処理の分かち書きを
Text::Kakasi モジュールをデフォルトで使用するようになっています。

・Text-Kakasi-1.04.tar.gz の入手先
  http://www.daionet.gr.jp/~knok/kakasi/

これをコンパイルしてPerlにインストールする必要があるのですが、
Win32版の ActivePerl だったら、Microsoft Visual C++ がないと
コンパイルは難しいと思います。

# cygwin の gcc では、多分無理だと思います。

次の version の Namazu のリリースまで待つというのも何ですので、
ちょっと効率は悪くなりますが、Perlモジュールでなくプロセス経由で
kakasi を利用するという手もありますので紹介しておきます。

具体的な方法としては、

(1) \namazu\share\namazu\pl\conf.pl ファイル中の、

    $KAKASI = "module_kakasi -ieuc -oeuc -w";

    という部分を \kakasi\bin に PATH が通っていれば、

    $KAKASI = "kakasi -ieuc -oeuc -w";

    と書き直して、

(2) \namazu\share\namazu\pl\wakati.pl ファイル中の
    wakatize_japanese_sub サブルーチンの最後の方で、

 my $tmpfile = util::tmpnam("NMZ.wakati");

    という行があるので、その後ろに以下の1行を追加します。

 $tmpfile =~ s/\//\\/g;

多分、これでうまくインデックスが作成できると思います。

> あと、oletaro.plも使ってみたのですが、更新日付がうまくとれないようです。
>Word2000で一太郎のファイルを開いてからVBAでチェックしてみましたが、Wordで
>一太郎のファイルを開いた場合BuiltinDocumentPropertiesプロパティではファイ
>ルの更新日時は取得できないようです。

情報ありがとうございます。
手元に一太郎のファイルがほとんどないのでとても助かります。

> スマートではないですが、olemsword.pl(一太郎専用に書き直した方がよいか?)に
>  use Win32::OLE::Variant;
>を追加して、更新日付の取得部分を
>  my $Fso=Win32::OLE->new('Scripting.FileSystemObject');
>  my $File=$Fso->GetFile($cfile->{FullName});
>    $fields->{'date'} = $File->{DateCreated}; # createdate
>  undef $File;
>  undef $Fso;
>と書き換えるととりあえず取れるようになります。もっとスマートな方法があったら
>いいのですが。

おぉ、まさに VBA の方法がそのまま Perl Win32:OLE に移植されていますね。(^^;

更新日時が取得できないときは、どのような結果が返ってくるのでしょうか?

BuiltinDocumentPropertiesプロパティで更新日時が取得できなかったときは、
undef $fields->{'date'}; としておくと、mknmz の complete_field_info()
サブルーチンの中で、勝手にファイルの最終更新日の設定をしてくれるので、
OLEフィルタ内で無理に設定しなくても大丈夫かもしれません。

--
   広島市立大学 情報科学部 情報機械システム工学科
     竹迫 良範 <takesako@xxxxxxxxx>