こちらの方に飾りましたが、 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" といった 感じで実行すればファイルが展開されます。
無事展開できると次のようなファイルが出来上がります。
ドキュメントです。一応世界進出を狙って拙い英語で書いてみました。
c++ ファイル用のメイクファイルです。
圧縮プログラムです。
BASE64 形式にエンコードするプログラムです。
BASE64 形式をデコードするプログラムです。
Pack.c++ で圧縮したファイルを展開するプログラムです。
自己解凍形式の雛型です。
TclUnpack2.tcl と同じ内容です。 ただ、TclUnpack2.tcl はファイルサイズを小さくするため、 非常に見にくいものです。こちらは若干見やすくなっています。
Pack.c++ で、どのファイルを圧縮するか指示するファイルのサンプルです。
Pack.c++ で、圧縮するキーワードを指定するファイルのサンプルです。
結構手抜きしたので、 自己展開ファイルを作るには非常にめんどくさい手続きが必要です。 大体の手順は以下の通りです。
そうそう、あまり厳密に動作チェックは行っていませんので、 自己展開ファイルを作った際は、必ず一度自分で正しく展開できるか 確認してから配布してください。
一応、簡単な圧縮を行った後、テキスト化しています。 圧縮・展開部分について最初は gunzip の展開アルゴリズムを Tcl で記述しようと調べたのですが、 「はふまんなんちゃら」とかいう所でつまずき、 「どーせもともといい加減なんだから、 こんなもん理解するより作った方が早いや」と適当に作っちゃいました。 それでも一応
アルゴリズムを簡単に言えば
展開の方は Tcl でも書ける程簡単ですが、問題は圧縮です。 圧縮効率はキーワードの選定に左右されるわけですが、 簡単に書けそうなアルゴリズムが思い付かず、 手動で設定することにしました。 さらに、Tcl で書くのがめんどくさくて C で書きました。
自分としては、「とりあえず機能する」ということでここらへんで 日和ってますが、もし「俺が作ってやる」という方がおられましたら 御一報ください。
本プログラムはフリーソフトです。 アルゴリズムを含め自由に改造、利用、配布を行ってもかまいません。 ただしすべて自己責任で行ってください。 圧縮アルゴリズムがどこかの特許に触れていてもしりません (ってこんな誰でも思い付く圧縮アルゴリズムが特許になるとは思えんが...)。