日記

10月 20日 (金)

1. 文豪

すでに釣られている方も各所に居られますが、数日前からはてなブックマークで大人気のリソースです。

無断リンクがマナー違反であることを前提に、はてなブックマークの大半のユーザーはマナー違反者であり、無断リンクされたWebマスターは「迷惑を被っている」との決付けから話が始まります。「烏合の衆」「今一度わかっていない」等誤用やおかしな表現を適度に配置する、「無断リンク」と「空き巣に合い鍵」「烏合の衆」「荒らし」「店の冷やかし」とを説明も無しに結びつける、「〜の大半」「多くの〜」「一個もない」など根拠のない統計的表現をするなど、各文に平均的に一箇所以上のツッコミどころを設けつつ、はてなブックマークユーザ批判を展開し、訴訟も辞さない構えを示して結んでいます。

実に面白い。素晴らしいネタ文書です。

なんだか今週はネタがいっぱいだな。

10月 22日 (日)

1. GRADIUS V

個人的な感想ですが…

  • 画面エフェクトが煩すぎて、敵弾も自機も見づらい
  • クリアしても全然達成感がない
  • トレジャー臭がプンプン

GRADIUS Vに限らず、トレジャーのシューティングはどうも肌に合いません。アクション(特にシルミラ)は好きなんだけどなあ。

そのGRADIUS V、だらだらプレイしていたら、ようやくクレジット制限が解除されました。解除ということは、文字通り「放置プレイ」でも30周以上行けるということでしょうかね。

2. 鬼車

鬼車/4.4.4がメモリリークしているっぽい。どうもパターンに\sを含めるとアウトらしく、正確なは測定はしていませんが、一対のonig_new()〜onig_free()でのリーク量は80バイト程度かと思われます。エンコーディングにも因るらしく、ASCIIでは再現しませんが、UTF-16/32-LE/BE では再現します。Windows 2000でもCentOSでも同じ現象が発生するので、環境依存の可能性は低そうです。最新の鬼車/5.0.0も含めて、調査する必要があります。

どうでもいいけど、各関数に付く接頭辞onig_ が「おにぎり」に見えて困る。

10月 23日 (月)

1. 鬼車

鬼車のメモリリーク疑惑。Valgrindを導入してチェックしてみました。昨日と同様、パターンはリーク発生の最小条件である\sとし、onig_new()でコンパイルした直後にonig_free()します。エンコーディングはUTF-16LE固定にします。

結果、鬼車/4.4.4 (CentOS/4.2 IA32)では76バイトのリークを確認、5.0.0ではリークはありませんでした。ただし、5.0.0の場合、onig_free()の時点では解放されず、onig_end()(ライブラリ使用終了宣言)を実行して初めて解放されます。つまり、onig_init()(ライブラリ初期化)以降、\sを含めたパターンを何度もコンパイルしていると、その分だけは解放されず、onig_end()するまで蓄積されるということです。確かにonig_end()で解放されるのでリークではないのですが、いいのかなあ。なお、4.4.4ではonig_end()でも解放されません。

2. 日記

Windows上で、複数のコマンドコンソール(cmd.exe)を使ってTJS2改造作業、同時にTeraTermを使って別の作業していた時、TJS2のライブラリを作り直そうとcmd.exe上でmake cleanしたつもりが、間違ってTeraTerm上でWebサイトの日記ファイルをmake cleanしてしまいました。あらあら。気をつけないと。

まあ、make一発で再作成ですが、ファイルの更新日付が変わってしまいました。

10月 24日 (火)

1. gzipの怪

プロクシサーバDeleGateを導入してからというもの、ダウンロードした一部のファイルがおかしくなりました。xxxx.tar.gzが正常に展開できなくなるというものです。LinuxのGNU tarでtar zxf xxxx.tar.gzとすると、gzip: stdin: not in gzip format と怒られます。

このファイル、実はただのTARファイル(application/x-tar)です。gzipではないので、怒られるのは当たり前です。問題は、なぜ拡張子がgzなのに中身がtarになってしまったのか、ということです。

DeleGateを導入して以来発生するようになったので、DeleGateをまず疑いましたが、結果から言うとDeleGateは「白」です。まず、xxxx.tar.gzへのGETリクエストを、フォワードプロクシせずに投げてみます。すると、以下のレスポンスが返ってきます。

Content-Type: application/x-tar
Content-Encoding: x-gzip

ちょっと待て、何だそれは。

Content-Encodingはエンティティボディのコーディング(平たく言うと圧縮/伸張)方法を示します。HTTPで転送する際に、帯域を節約する目的で一時的にエンティティをエンコード(圧縮)し、受け取り側(UA)でそれをデコード(伸張)する、という風に使用されます。つまり、Content-Encoding: x-gzip では、メッセージボディがgzip方式でデコードされることを期待しています。

DeleGateを通してGETメソッドを投げた場合、UAよりも先にDeleGateがレスポンスを受け取ります。DeleGateは、メッセージヘッダのContent-Encoding: x-gzip を見て、メッセージボディをデコードし、Content-Encodingフィールドを削除してUAに返します。つまり、当該リクエストに対するUAから見たレスポンスは、以下のようになります。

Content-Type: application/x-tar

サーバからのメッセージは既にDeleGateによってデコードされているため、実態はapplication/x-tar(Content-Typeと一致)ですが、UAはリクエストURIの通り、xxxx.tar.gzというファイル名で保存します。 これが「拡張子はgzなのに中身がtar」現象の仕組みです。 DeleGateは律儀にデコードしただけ、UAはURIに基づいてファイルを保存しただけ、となると、「犯人」はHTTPサーバに絞られます。

元々のリソースがx-tarであり、HTTPによる転送のために一時的にgzipでエンコードしたのであれば、前述のレスポンスヘッダは正しい。しかし、元々がgzipで圧縮されたリソースであり、それがHTTP転送のためのエンコーディングでない場合、前述のレスポンスヘッダは不適切です。

UNIX系アプリケーションなどは屡々tar.gz形式(tar ball)で配布され、その状態に対するハッシュ(MD5など)が別途用意されているのが普通です。余計なContent-Encodingフィールドのせいで伸張されてしまうと、ハッシュ値の突き合わせが出来なくなり、不便です。そもそも、配布者は、配布物がgzipで保存されることを期待しているのは明らかなので、サーバは以下のように返すべきではないでしょうか。

Content-Type: application/x-gzip

などと書いておいて、じゃ、うちのサーバはどうなっているのよと調べてみたら、見事に「不親切な」レスポンスを返していました。orz

対策。Apacheの場合、httpd.confか.htaccessに以下の記述を追加すればOKです。ただし、「転送の為に事前gzipしたファイル」にも適用されてしまいますが。

AddType application/x-gzip .gz .tgz
RemoveEncoding .gz .tgz

10月 28日 (土)

1. 鶴

実験的に、TJS2の正規表現エンジンを鬼車に換装。それに伴って、TJS2の正規表現リテラルの文法をほんの少しだけ拡張しました。修飾子に英大文字を使えるようにする、というだけのものです。微妙ですね。基本の修飾子(コンパイル時オプション)として、'l'を廃止して'smx'を追加し、'gismx'の五文字を使用します。拡張機能として、コンパイル時に正規表現文法を指定出来るようにするため、さらに'ABXEGUJPNR'の十文字を追加します。

/Hoge+/
/Hog(e+).*?Hug(a+)/g
/Hog(?<name1>e+).*?Hug(?<name2>a+)/gsR

修飾子に大文字が来るとちょっと違和感がありますね。

10月 29日 (日)

1. 姉

チャンポンでサバイバル。雑魚戦は理保で壁に向かって「理保でーす」を連発していれば、ほとんどノーダメージでいけます。ただし、肋骨にはあまり効果がないかも。雑魚が寄ってくるの待たなければいけないので、時間が掛かります。凄くチキン。

ボス戦ではエヴァを使用します。熊は壁に引っかけてチクチク。咲は間合いを保って特殊攻撃。エヴァも咲と同様で、ワープしてきたら全力で逃げる。レイコとチョイ・ボンゲ&チャン・コーハン爪&鉄球は…誰か斃し方教えてください。三周目あたりから手に負えなくなります。

結局4-8のレイコで死亡。チーン。

2. 鶴

名前付き捕獲式集合の処理を実装しました。namedGroupプロパティ(辞書配列)を使っていろいろ引くことができます。鬼車は重複した名前を許すため、辞書配列はそれに対応した構造になりました。つまり、%[ 名前 => 配列 ]です。ちょと扱いにくいけど仕方ないか。

10月 31日 (火)

1. morph

存在そのものを忘れかけていた、モーフィングトランジションを改良しました。簡易CSVパーサを内蔵したので、KAGからも座標を指定できるようになりました。さらに単独の自由変形にも対応したつもりですが、そもそも吉里吉里は単独のトランジションに対応していないっぽい?