Kazuhiro's blog
ようこそ! Kazuhiro's blog
土曜日, 4月 20 2024 @ 02:48 午前 JST
 記事を友人にメールする 印刷用画面 

FreePWINGで4GB以上の書籍を作成する

general

JIS X 4081では理論上は1ファイル約190GBまでの書籍が構築可能ですが、EBStudioやFreePWINGではそのような大きな書籍は作成できません。 作成するのにどの程度手間がかかるか、wikipedia-fpwが2GBの壁に届く前にちょっと試してみました。

まず、FreePWINGにパッチをあて、4GB超の書籍を作成できるようにしてみました。

  • 必要なもの
    large fileをサポートし、64ビットintなperl

    perl -V等で、Compile-time optionsにUSE_64_BIT_INTUSE_LARGE_FILESが存在している事を確認してください。

    large fileをサポートするファイルシステム

    例えばFAT32では4GBを超えるファイルを作成できません。

    パッチ

    FreePWING 1.5にあてるパッチです。 もうちょっと工夫すれば32ビットintなperlでも大丈夫そうな気がしますが今回は見送ります。

oald7-fpwで、テキスト登録時にテキストを水増しして4GB超の書籍を作成してみたところ、エラーも起きずにそれっぽいものが作成されました。 次にブラウザ側の検証です。

  • 4GB超の書籍を扱える(であろう)アプリケーション
    EB Libraryを利用するアプリケーション

    64ビット環境の場合はebzip以外は動作すると思いますが未確認です。 32ビット環境でoff_tが64ビット以上の場合は、パッチが必要ですが動作しました (NetBSD 4.0_BETA2)。

  • 4GB超の書籍を扱えないアプリケーション
    EB Libraryを利用するアプリケーション

    Windows環境 (Cygwin + MinGWでビルドしたもの) では扱えませんでした。 ちょっとした小細工で何とかなりそうな気はしますがまだ未検証です。

    ebzip

    4GBまでのファイルしか想定されていません。

    EBWin

    正しく扱えませんでした (2.09)。

    DDWIN (おそらく)

    未確認です。

(追記) Cygwin + MinGWではMinGWのインクルードファイルにパッチをあてれば_FILE_OFFSET_BITSを設定することでoff_tを64ビットにできるので何とかなりました。

(追記の追記) EB Libraryとebzipは4.4以降で、EBWinは3.01以降で4GB超の書籍に対応しました。

タグ:FreePWING EB Library EPWING
 記事を友人にメールする 印刷用画面 

SDIC辞書のインデキシングを最適化する

Lookup

とか書くと偉そうに聞こえますが、自作のコードで必要な部分だけのインデックスポイントを書きださせることで、インデックスのサイズを小さくするという話です。 既存のアイデアではありますが、こういうのはスクリプト言語でやった方が楽じゃないかなぁという事で、紹介します。

SDICを使ってSDIC形式の辞書を検索する時、SUFARY(あるいはSary)を使ってインデキシングを行うことで検索の高速化が可能になります。 しかし、速くなるのはいいのですが、mkary等でインデキシングを行うと元のSDIC辞書のおよそ3倍という、結構な大きさのインデックスファイルが必要になります。 SDIC形式な辞書の場合、コメントの部分や、タグや実体参照の途中等からマッチさせる必要はありません。というか、されるとうれしくありません。 ですので、この部分についてはインデックスポイントを出力しないようにしてみます。 これにより、インデックスのサイズがおよそ2割前後小さくなりました。 また、全文検索を捨てて検索語だけでインデックスを作ったり、後方一致検索も捨てることで更に小さくできます。

mkary 最適化 検索語のみ 前方一致検索のみ
gene.sdic.ary 9,591,548 7,754,864 3,007,944 229,480
jedict.sdic.ary 10,397,976 7,422,524 2,245,376 452,778

一応公開しておきます。使い方ですが

% perl sdic_dumpip.pl gene.sdic

の様に使います。検索語のみでインデックスを作成する場合は

% perl sdic_dumpip.pl --index=keyword gene.sdic

の様にしてください。前方一致検索用のインデックスを作成する場合は

% perl sdic_dumpip.pl --index=prefix gene.sdic

の様にしてください。いずれの場合でも書き出し後にmkary(あるいはmksary)によるインデックスのソートが必要です。

% mkary -so gene.sdic
% mksary -s gene.sdic

タグ:SDIC Lookup

(2008/09/08 追記) <K>以外のタグもスキップするように変更しました。

 記事を友人にメールする 印刷用画面 

FreePWING 1.5 is released

general

本日、FreePWING 1.5がリリースされました。 これには、sound patchと私が加えていた変更がそのまま取り込まれていますので、私が行っていた改造版の公開は終了しました。

(特に私がサボっていた)ドキュメントの記述等、作者の笠原さんにも色々と作業いただきましてどうもありがとうございました。

タグ:FreePWING

 記事を友人にメールする 印刷用画面 

mkdirhierのバグ

general

imakeに入っているmkdirhierがCygwin環境では動作しない(事がある)というお話しです。

なんでいきなりimakeなのかというとFreePWINGにこのmkdirhierが入っているからです。 簡単に書くと、Cygwin環境でmkdirhierに絶対パスを引数として与えるとディレクトリの作成に失敗するというものです。 何故失敗するかというと、絶対パス名が与えられると先頭の'/''//'に変更してディレクトリを掘ろうとするためです。 以前からあった問題なのかは知りません。 UNIX環境では問題にならないようですが、Cygwin環境ではUNC名として解釈されるので予期しない動作を来します (大抵の場合はエラー)。

ちなみに、最近のmkdirには同等の動作をするオプション (-p) があるので、mkdirhierがなくてもあまり困らないかもしれません。 改造版のFreePWINGは修正しました。

タグ:FreePWING

 記事を友人にメールする 印刷用画面 

よくわからない解説

Lookup

UbuntuのeblookでEBGの辞書がひけない話の続きです。 EBGに対して(だけかどうか不明ですが)、ウムラウトの入った文字を含む単語を検索しようとするとLookupが反応しなくなったそうです。 呼ばれもしないのにしゃしゃり出ていろいろ試していただいた結果、一応解決したようです。 途中、解決しなかったらどうしようかと思いましたが。

過程はコメント欄でのやり取りを見て頂くとして、結局Readlineとiconvのサポートを切る事でうまく動作するようになりました。今のところ一番あやしいのはReadlineサポートです。 (コメント欄ではiconvも切るように書きましたが、iconvでおかしくなっているのであればshell-modeでも症状が再現するはずなので、その可能性は低いと思っています。) 何故Readlineサポートが有効だとダメなのかは追求していません。

通常、Lookupから呼ばれたeblookはReadlineサポートを無効にしますが、Emacsがターミナル上で動作している場合などはReadlineサポートは有効のまま動作します。ちなみに、以下のようなコードで判定を行っています。

if (!isatty(fileno(stdin))) interactive_mode = 0;

今回はこの判定がおかしかったのかもしれませんがやっぱり追求していません。 とりあえず思いついた、eblookのReadlineサポートを無効にする手段は以下の通りです。

eblookのReadlineサポートを無効にしてビルドする

eblookを使うのがLookupからだけであればReadlineサポートは必要ありません。

eblook-1.6.1+media (とLookup 1.4+media)を使う。

eblook-1.6.1+mediaにはReadlineサポートを無効にするオプションがあります。

また、eblookにおける日本語の文字コードですが、Lookup 1.4.1のデフォルトでは常にeuc-jpになります。 ndeb-process-coding-systemのデフォルト値もUNIX環境ではeuc-jpになるはずです。 Lookup 1.3ではeblookの文字コードはeblookの自動判定に任せますから、環境変数の値等に依存しています。 その為、ndeb-process-coding-systemもそれに合わせる必要があります。

(追記) Lookup 1.4+mediaでも、Readlineを有効にした状態のeblookにiso-8859-1な文字列を送ると動作がおかしくなりました。 Readlineを無効にすると解消したので、やはりReadline機能が問題になっているようです。

タグ:eblook Lookup