Entry

趣味プログラミングの近況とか

2010年05月01日

職場で生じたプログラミングのストレスは,自宅の趣味プログラミングで解消するぜ!と,迎え酒みたいなことをしているわけですが。ま,ちと作ってる。

もったいぶることでもないので言ってしまうと,PDF を中心とした,文書データのコンバータとビューアを作っています。ま,この手の話はよくあるわけで,新しさもへったくれもないわけなんですけどね。こゆ(機能において)素朴なお題は,趣味プログラミングにうってつけです。自前でライブラリを持てたら,それはそれで資産になりそうだし。

じゃ,なぜ PDF かというと,この規格,結構色々な方面の技術が必要になるからです。カモネギなお題なんですね。例えば,ちょっと挙げるだけでも,次のようなことを広く深く知っている必要があります。

  • フォントプログラムの仕様全般(Type0,TrueType ……)
  • 文字コード
  • 画像ファイルの扱い(BMP,Jpeg,PNG,TIFF ……)
  • ベクタによる描画処理
  • 暗号とハッシュ
  • その他組版の常識とか

多分,このライブラリを作る過程で,中間成果物(それだけで製品になるソフト)がかなり作れると思う。実際,画像フォーマットや文字コードの変換ライブラリなんて,このライブラリの一部機能だけで作れてしまいます。

もちろん,全部を自分で作るとなると無駄な作業が増えてしまうので,適宜サードパーティ製のライブラリを利用することにはしています。現在は,基本的なデータ型をそろえて,木構造のデータ構造を設計・実装したところ。割とうまくいっています。

ここでひとつ,設計上のミソを書いておくと,文書データのデータ形式を変換する場合,「どのように変換するか」よりもむしろ「変換の対応をどのように管理するか」というところが非常に重要になってきます。

例えば,MS Word の DOC ファイルと,MS Excel の XLS ファイル,そして PDF ファイルの三者を互いに変換するライブラリを考えてみます。このとき,Doc2Xls や Doc2PDF のような直接変換するクラスをひとつづつ作るようじゃダメなんですね。いや,ダメじゃないけど大変。なぜなら,フォーマットが1つ増えるたびに変換の対応が,n(n- 1) のオーダーで増えていくからです。フォーマットが3つなら6つの組み合わせで足りるけれど(それも大変だが),1つ増えて4つのフォーマットになるといきなり倍の12個の組み合わせが必要になります。

文字コードの変換や公開鍵暗号と秘密鍵暗号の違いについて知っている方はピンと来るんでしょうけれど,こゆモノは,ひとつの汎用的な文書型を定義しておいて(pivot とかいう),それとの対応を取るように設計するのが正解(だと思う)。つまり,MyDoc とかいった自分用の文書フォーマットを定義しておいて,それと DOC ファイルや XLS ファイルとの変換を書けばいいわけです。も少し具体的に言うと,PDFReader で PDF を読んで,読んだオブジェクトを PlainTextWriter で書き出す……とかいった具合。これなら,変換する手順は1つ増えるけれども,オーダーは 2n に収まる。対応するフォーマットが1つ増えても変換の対応は2つ増えるだけです。

もっとも,この方式を取ったとしても,すべての文書フォーマットに対して当てはまる文書型を定義することは,まずできません。とゆことで,結局のところ,変換ライブラリを作る(設計する)際の腕の見せ所は,変換の必要や目的に応じて,こうした汎用型をどのように定義できるかにかかっていたりします。逆に,pivot となるフォーマットがヘタレだと,余計な対応や怪しげな配慮をゴリゴリ加えないと,変換できなくなるとも言える。文書交換ではないけれど,実際にそゆ場面も見ている。

とりあえず,CAD 図面のような少し特殊なフォーマットを加えても,文書フォーマットは PDF が最も汎用的なんじゃないかと思います。じゃ,PDF を pivot にするかというと,そゆわけでもなく,例えば PDF は,「表」のような構造を持ったオブジェクトを定義することができないので(PDF の表は,「線と文字の組み合わせ」という意味しかない),少し拡張性を持たせて自分で定義する必要があります。

この連休で少し進めたいところ。どこまで進むだろう。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN