[osask 6980] bim2bin4i.

  こんばんは、川合です。

  例によってbim2binのバージョンアップです。さらにまたフォーマッ
トをいじってしまったという(情けない)特典付きです。

  今回の改善点は主にOSASK-Wikiのtek1/adv2で説明したアルゴリズム
をtek1〜tek3に取り込んだことです。しかし今回はtek3には一通り組み
込めましたが、tek1とtek2に関しては展開ルーチンしかできていません
。圧縮ルーチンができてないのでテストのしようがなく、展開ルーチン
は本当にこれでいいのかすら実はよく分かりません。

  こんな状態なのですが、いつまでもbim2binをいじってばかりはいら
れないので、OSASKにtek1〜tek3のサポートを組み込む作業をはじめま
す。tek0が推奨されなくて、かといってtek2はOSASKでは自動展開して
くれない、という現在の状況はかなり不健全です。もうtek1〜tek3のフ
ォーマットをいじる気はなくなったので、OSASKに組み込むべき時期に
きました(いじる気がなくなったというよりは、疲れ果てた、という感
じかもしれませんが・・・ああもちろん、もういじる気がないとは言っ
ても、バグがあればそれは直します)。LZMAがすごくいいので、数年後
とかにこれをosacmpに取り込むときにまたがんばればいいでしょう。

    http://k.hideyosi.com/bim2bi4i.lzh  (91.9KB)

  ああそうだ、tek3そのものについてもまだ説明していませんでした。
tek3については、

    http://wiki.osask.jp/?tek3

の説明を見てください。LZO風の「圧縮率は結構悪いけど、とにかく展
開速度は劇的に速いよ」の圧縮符号です。展開ルーチンが非常に簡単な
のも特徴の一つです。LZOをそのまま使うことも考えたのですが、自作
のtek3の圧縮率のほうがよかったので(そして展開速度でも十分だった
ので)、LZOは使わずにtek3を使うことにしました。

  改定された圧縮率表については、次のページを参照してください。

    http://wiki.osask.jp/?tek1/comp

  tek3の展開速度がtek1などとくらべてどのくらい速いかは、

    http://wiki.osask.jp/?room/000

の6/9の表などを見てください。そこを見ると分かりますが、tek0は
LZMAに準ずる展開速度のくせに、圧縮率はtek1にも及ばないわけで、「
割の合わない」フォーマットであるといえます。bzip2もLZMAと比べると
割の合わないフォーマットです。

  同様にtek3もLZOと比べるとやや割の合わないフォーマットのように
見えるのですが、これはosaskgoに限ったことで、全体的な傾向として
は、上記のtek1/compのページで圧縮率を比較すると、そう問題はない
ということが分かります。

---

  さてbim2bin4iですが、まず、-tek3オプションが追加されました。デ
フォルトは今も-tek2なので、tek3にしたい場合は、-tek3を付けてくだ
さい。

  また今回、stk1〜stk3というtek1〜tek3のサブセット仕様を提案しま
した。これはtek1〜tek3のいろいろな自由度をあえて固定することで、
展開ルーチンを短くした例です。stk1とstk2はあと数十行を書き加える
と符号寿命もサポートできるので、そっちのほうがよかったかもしれま
せん(それで圧縮率は結構上がりますし)。気が向いたら、符号寿命を
入れた形に改定します。tek3はフルセット版でも符号寿命という概念が
ないので、stk3はもうこれでよく、ほぼ確定でしょう。

  いずれにしても、サブセットは下位互換があるので、サブセット仕様
のものであってもかならずフルセット版で展開できます。サブセット版
は展開ルーチンがコンパクトでないと困る状況のときに使うといいでし
ょう(自己展開ルーチンとか)。そして、ユーザは、サブセット版しか
展開できないツールで使うかもしれないときは、圧縮するときにサブセ
ット指定をして、その心配がないときはフルセットで圧縮すればいいで
しょう。

  またnum128というのは0000〜FFFFが順番に入った128KBのファイルな
のですが、そのようなファイルをBS:0、MD:0、clv:9のtek3で圧縮して
も、ぜんぜん40バイトにはなりません。これはどういうことだ、と思う
でしょうが、なにはともあれ、bim2binでomakeディレクトリの40バイト
のnum128.tk3を展開させると、ちゃんと128KBのデータが出てきます。

  このnum128.tk3をどうやって作ったのかというと、hintファイルとい
うものを使って、この範囲はこうやって差分をとるとうまくいくからや
ってごらんと、bim2binに教えてやらならないといけないのです。全自
動でこれを大雑把にやることもできるのですが、そんなことにいつまで
も開発時間をかけているわけには行かないので、とりあえず今回はパス
しました。

>bim2bin -osacmp -tek3 clv:4 BS:0 in:num128.org out:num128.tk3 hint:num128.hin

とすればうまくできます。このhinファイルもomakeの中にありますが、
その文法を説明するのは面倒になったのでまたの機会に。

---

  最後にdtk2s、dtk3s、dtkfについてです。これらはbim2binの展開ル
ーチンだけを切り出したもので、OSASK以外のOSに自動展開サポートを
持たせたい場合のために準備したものです。このライブラリを使った
サンプルもいっしょにありますので、必要な人は眺めてみてください。

  さっきもちょっと書きましたがstk1/stk2は暫定仕様なので、stk2sは
数日中に改定する可能性があります。

  圧縮ルーチンはこんな風にまとめないのかという質問が来そうなので
先回りしておきますが、今の圧縮ルーチンは(先日やっと圧縮速度が改
善したとはいえ)我ながら駄作で、はっきり言ってアルゴリズムからし
て作り直したほうが、もっと圧縮率は上がるし、圧縮速度も上がりそう
です。ということでこんなタコルーチンを他の人が流用しないようにす
るためにも、今使っているルーチンの切り出しは予定していません。

  ぜひ僕に代わってもっといいルーチンを書いてください。

  それでは。

--
    川合 秀実(KAWAI Hidemi)
OSASK計画代表 / システム設計開発担当
E-mail:kawai !Atmark! osask.jp
Homepage http://osask.jp/

ML番号でジャンプ
ML単語検索