台風9号がものすごいストライクコースで東京を直撃中。 これは恐ろしい。 ちなみに、京葉線は7日午前中の運休を前日の夜には既に決定しているという諦めの良さである。
GIFを出力するアクセスカウンタをperlで作ってみた。 情報元は以下。
GIF89a Specification
http://www.geocities.co.jp/SiliconValley/1361/gif89a.txt
まずはGIF89aフォーマットの原典。
とほほのWWW入門 GIFフォーマットの詳細
http://www.tohoho-web.com/wwwgif.htm
部分的だが、日本語で説明あり。
モジュールを使わないシンプルなアクセスカウンタ(Perl)(Code Zine)
http://codezine.jp/a/article.aspx?aid=70
ソースをダウンロードするには Code Zine 会員登録が必要。
こちらはLZW圧縮済のGIFデータブロックをPerlソース内に持っており、GIFブロックを桁数だけつなげて複数桁のカウンタ表示にしているのが潔い。
これならUNISYSのGIF特許(LZW圧縮特許)なんて関係ない。
無圧縮GIFを作成する方法 http://www.oersted.co.jp/‾emk/dhtml/nocompgif.html
上サイトから引用。
n ビット画像の場合なら、以下のようになります。
- 最初に値 n のオクテットを書き込む(初期code size)。
- 元データから n ビット読み、n+1 ビットにゼロ拡張して書き込む。
- 2.を 2^n-3 回繰り返す。
- 値 2^n を n+1 ビットで書き込む(clear code)。
- 2.〜4.を元データがなくなるまで繰り返す。ただし2度目以降は3.は 2^n-2 回まで繰り返してよい。
- 値 2^n+1 を n+1 ビットで書き込む(end code)。
(無圧縮GIFを作成する方法http://www.oersted.co.jp/‾emk/dhtml/nocompgif.htmlより)
白黒画像は、特例として2ビット画像(4色)として扱う。
Because of some algorithmic constraints however, black & white images which have one color bit must be indicated as having a code size of 2. (GIF89aフォーマット Appendix F. Variable-Length-Code LZW Compression.より)
従って、白黒画像を扱う場合の処理は以下のようになる。
ビットストリームをバイトに詰める順序は以下の通り。 (GIF89a Specification Appendix F. Variable-Length-Code LZW Compression.より)
BUILD 8-BIT BYTES Because the LZW compression used for GIF creates a series of variable length codes, of between 3 and 12 bits each, these codes must be reformed into a series of 8-bit bytes that will be the characters actually stored or transmitted. This provides additional compression of the image. The codes are formed into a stream of bits as if they were packed right to left and then picked off 8 bits at a time to be output. Assuming a character array of 8 bits per character and using 5 bit codes to be packed, an example layout would be similar to: +---------------+ 0 | | bbbaaaaa +---------------+ 1 | | dcccccbb +---------------+ 2 | | eeeedddd +---------------+ 3 | | ggfffffe +---------------+ 4 | | hhhhhggg +---------------+ . . . +---------------+ N | | +---------------+ Note that the physical packing arrangement will change as the number of bits per compression code change but the concept remains the same.
たしか、LZW圧縮の特許は2005年で失効してたから、そろそろ作ってもいいのかな?
辞書とか実装するのは面倒だったので、LZW無圧縮な処理を内部で持つperlのアクセスカウンタを作ってみた。
カウンタのフォント元データはXBMな並びの白黒ビットマップデータ。
これを並び変えて結合し、無圧縮GIFの1枚絵にして出力する。
こんなんなりますた。
counter.zip (3KB)
自分で言うのもなんだが、ひでぇソースだなこりゃ。
作ってから思ったけど、1桁の数字のGIFブロックを持って、内部で結合した方が速くて安心だよな。
どう考えても。
http://mail-index.netbsd.org/tech-toolchain/2007/09/12/0000.html gccよかコンパイルスピードが5-10倍速いとか? まじすか。 pccは確かPortable C Compilerって奴かな。
今のところ、各種ソースはgccでコンパイルが通るように書かれることが多いので、デフォルトコンパイラにしようとするとすんごい大変そうだけども、これはいいかもしれんね。
今回はPSUでダメだった部分がいろいろ改良されているのと、フォルテファイター(fF:近接武器タイプ)がクソ強くなったという噂なので、購入。 感想は後程。