Tcl Archive

[自己解凍形式]

はじめに

こちらの方に飾りましたが、 Tcl/Tk を使ってネットワークゲームのクライアントを作りました。 Tcl/Tk を使った理由は、当然 GUI プログラムが簡単に書けるというのもありましたが、 同じプログラムが Linux や Windows, MacOS など様々なプラットフォームで動作するということの方が大きかったです。

ところがプログラムが完成し (実は本文を書いている時点では、 まだ完成してないのですが... ちょっと飽きたので気分転換にこちらを先に作ってしまいました)、 いざ web ページに飾ろうと思った時、 プログラムを何で圧縮すればいいか悩みました。 Linux (UNIX) なら tar + gunzip でしょうし、 Windows なら自己解凍の実行形式、Mac なら.... 何でしょう。

もちろん、Windows でも適当なツールを使えば tar + gunzip 等で 固めたファイルを展開することはできますが、 一応ゲームということでできるだけ沢山の人にダウンロードして使ってもらいたい と考えています。 ただでさえ、Tcl/Tk のインストールを強要しているのに、 これ以上敷居を高くしたくありません。

というわけで、たまに出回っている shell 版のような Tcl で書かれた自己解凍プログラムがあればいいと考えたのですが、 探してみてもなかなか見つからず、結局作ってしまいました。

なお、本プログラムは Tcl/Tk 8.1 で作成されています。 どのあたりまで下のバージョンでも動作するか確認はしていません。

ファイルの説明

せっかくなので、自己解凍形式で固めました。 実行パーミションを付けて実行するか、"wish tclarchive.tcl" といった 感じで実行すればファイルが展開されます。

無事展開できると次のようなファイルが出来上がります。

自己展開ファイルの作り方

結構手抜きしたので、 自己展開ファイルを作るには非常にめんどくさい手続きが必要です。 大体の手順は以下の通りです。

  1. packlist.dat を編集して、どのファイルを圧縮するか指定します。 ファイル名の後に "x" を付けると、展開時に実行パーミションが付きます。
  2. keywords.dat を編集して、圧縮対象の中によく出て来るフレーズを 指定します。全部で 128 個指定します。 頭からサーチして行くので、キーワードの長い順に書いた方がいいでしょう。
  3. pack を実行します。圧縮したファイルが pack.tcz となって出て来ます。 このファイルは TclExtract.tcl で展開することができます。
  4. "base64 pack.tcz > foo.b64" と実行します。foo.b64 は Base64.tcl でデコードすることができます。
  5. TclUnpack2.tcl の中の "Insert Base64 decoded strings here" と書かれた 部分に foo.b64 を挿入します。

そうそう、あまり厳密に動作チェックは行っていませんので、 自己展開ファイルを作った際は、必ず一度自分で正しく展開できるか 確認してから配布してください。

圧縮アルゴリズム

一応、簡単な圧縮を行った後、テキスト化しています。 圧縮・展開部分について最初は gunzip の展開アルゴリズムを Tcl で記述しようと調べたのですが、 「はふまんなんちゃら」とかいう所でつまずき、 「どーせもともといい加減なんだから、 こんなもん理解するより作った方が早いや」と適当に作っちゃいました。 それでも一応

ことをめざしました。

アルゴリズムを簡単に言えば

  1. 良く出て来るフレーズをキーワードとして 1byte に圧縮する
  2. 連続するスペースやタブも 1byte で表現する
というものです。 その代わりバイナリファイルは圧縮どころか膨れてしまいます。 詳細は Readme.txt を御覧ください。

展開の方は Tcl でも書ける程簡単ですが、問題は圧縮です。 圧縮効率はキーワードの選定に左右されるわけですが、 簡単に書けそうなアルゴリズムが思い付かず、 手動で設定することにしました。 さらに、Tcl で書くのがめんどくさくて C で書きました。

自分としては、「とりあえず機能する」ということでここらへんで 日和ってますが、もし「俺が作ってやる」という方がおられましたら 御一報ください。

著作権について

本プログラムはフリーソフトです。 アルゴリズムを含め自由に改造、利用、配布を行ってもかまいません。 ただしすべて自己責任で行ってください。 圧縮アルゴリズムがどこかの特許に触れていてもしりません (ってこんな誰でも思い付く圧縮アルゴリズムが特許になるとは思えんが...)。


[戻る]