メディアタイプチェック2005年12月18日 11時49分51秒

mknmzではメディアタイプの判定にFile::MMagicを使っていますが、このメディアタイプの判定に多くの時間がかかっています。

まず、メディアタイプをグループに分けて階層的に判定を行う必要があります。
たとえば、HTMLグループにはMHonArcやPipermail等が含まれ、OLEグループにはWord,Excel,PowerPoint,一太郎文書等、zipグループにはzip,OpenOffice等といったようにグループ分けを行い、最初にどのグループなのかの判定をし次にグループの中のどのタイプなのかを判定するというようにです。
必要なら一番最初にバイナリファイルなのかテキストファイルなのかの判定を行うのが良いかもしれません。ただし、判定にどれくらいコストがかかるのかは見極める必要はあります。

次に判定する順番です。
よく判定するものから優先的に判定し、メディアタイプが判明した時点で判定を終了することで、効率的にチェックが行えます。
HTML,PDF,OLEドキュメント等は比較的よく判定するものですから、これらを優先することで速度は向上するはずです。
(利用用途によってはメールもよく処理するかもしれません。)
ケースバイケースですが、どのようなメディアタイプの文書をどれくらいの割合で処理しているか調査したいものです。

また誤判定を防ぐ意味でも、判定する順番は大切です。
判定材料としての情報が比較的少ないものはできるだけ後で判定しないと誤った結果が得られます。
たとえばMacbinary I が良い例です。

新規登録では仕方ありませんが、更新時は前回判定したメディアタイプのグループを優先的に判定するのが効率的です。
更新時にはメディアタイプが変わっている確率が低いためです。
NMZ.r ファイルにメディアタイプを記録しておき、そのメディアタイプが属するグループの判定をまず行い、違った場合には通常の判定を行います。
この時、グループ内の判定は慎重に行わなければ誤る可能性がありますので、記録されたメディアタイプそのものの判定は避けて、あえてそのグループの判定から行うのが良いだろうと今のところは思っています。

-t オプションで直接メディアタイプを指定することができますが、ここのファイルのメディアタイプを指定することができませんから、-F でファイルリストを指定する場合にも、メディアタイプも指定できるようになっていればこれを使うのも良いでしょう。
ファイルフォーマットは拡張して

"filename","メディアタイプ"

という形式にして、メディアタイプは省略可能。
そして従来の

filename

という形式も互換性のためにサポートしておく。
filename に空白やダブルクォーテーションが含まれる場合についても考慮する必要があるし、UTF-8コードで記録する拡張も合わせて行う。

最後にmknmzの中の判定も比較的複雑なものですから、これも整理したいと考えています。

NMZ.r について2005年12月18日 12時47分53秒

NMZ.r の形式は変更したい。

・処理しやすい形式に変更する。
(更新、削除、新規登録のチェック等)
・ファイル名はUTF-8で記録する。
・ファイル名に空白等が含まれるものも考慮する。
・メディアタイプを記録して、更新時に利用する。

注意:
・gcnmz等でも利用するので、注意が必要。
(形式を変える前にツール独自の処理ルーチンを廃止し、mknmzと共通のモジュールを使用するように修正が必要)

ターゲットファイル2005年12月18日 12時55分41秒

mknmz -F オプションで指定するファイルです。
インデックス対象のファイルを1ファイル1行で書いたリストです。
(もしかすると公式な資料にこのファイル形式は載っていないかもしれません。)

path/filename1
path/filename2
path/filename3
:
:

といった感じです。
これを

"path/filename1","メディアタイプ"
"path/filename2","メディアタイプ"
"path/filename3"
:
:

という形式もサポートして、個々のファイルのメディアタイプを直接指定できるように改良したいと思います。
メディアタイプは省略可能で、その場合は通常のメディアタイプの判定を行います。
-t オプションでは個々のファイルのメディアタイプは指定できないためです。

その他にも
・UTF-8コードで記録する。
・空白、ダブルクォーテーション等のエスケープを行う。
・ドライブレター(Windows)
・UNC(Windows)
・パス区切り文字
・大文字/小文字(パス名/Windows)
などのいろいろと考えたいと思います。