ごるあなゆーぴーえっくす

つい最近は・・・10 月だというのに夏のような暑さがある。2 つ前の月が 8 月。8±2. 6 月と同じと考えたらいいのか? 6 月は暑かった気もしないでもないから、不思議ではないのかな。

ごるあな

久々に、あなごるの問題を解いてみた。 rotate arrows FIXED.js だ。トップが 70B で、自分のコードはそれより 1B だけ短い 69B だったので、投稿した。まだ抜かれてない。これより短い解答はあるかもしれないな。あんまり吟味せず、「トップより短くなったから投稿しよう」という短絡的なポストなのでなおさら。

ゆーぴーえっくす

こないだ、ブログに gcc -nostartfiles について書いたが、もっとファイルサイズを小さくするためには、UPX を使うのがいい。

Windows やその他の OS 向けにバージョン 3.91 が出ている。最新版だ。リリース日は 2013 年。今年だ。最初の版が 1996 年に出たから、随分と息の長いプロジェクトである。そして更新が活発だ。

Windows 版 UPX では、EXE と DLL の圧縮ができる。upx.exe に、目的のバイナリをドラッグアンドドロップすればお手軽。正式にはコマンドラインツールなので upx hoge.exe とか打って使う。MS-DOSワイルドカード記法を使って upx *.exe *.dll のように指定すると、カレントディレクトリにあるすべての実行ファイルおよび DLL をまとめて圧縮できる。素晴らしきユーザビリティの高さである。

それから、圧縮したバイナリに対して、upx -d hoge.exe のようなコマンドを打つと、解凍もできる。あろうことか、可逆圧縮なのである。神にも程がある。

ただし、実際には、解凍したバイナリは、圧縮前のバイナリと、ファイルサイズが同じでも、バイナリエディタで比較したところ、中身はところどころ違っていた。たとえば、kernel32.dll という文字列が KERNEL32.DLL というふうに大文字になっていたりする。

一般に拡張子が exe である Windows の実行ファイルの中身はバイナリであり、その構造は Portable Executable (PE) というフォーマットであるが、これについてはよくわからない。なので、圧縮前バイナリと UPX による解凍後バイナリ間の差異が、アプリケーションの挙動にどういう違いをもたらすのかがわからない。