日記

10月 1日 (日)

1. DeleGate Message Filter (FTOCL)

Yahoo!のトップページ用フィルタを書いてみました。ごちゃごちゃしているのが特徴でもあるページですが、これが本当にYahoo!かと思うほどシンプルになりました。

あとはブラウザのキャッシュ対策として、強制的にCache-Controlフィールドを付加するモードを追加。これはどちらかというとフィルタ開発・デバッグ向けです。

2. 鍋

旅人さんの引越記念に鍋が催されることになり、その誘いを受けました。引越祝いに怪しげなフィギュアでも買って行こうかと企みましたが、雨で買い物に行くのが面倒だったので断念。またの機会にしましょう。

さて、鍋。白滝とエノキが大量だったのを除けば、割と普通の鍋でした。闇鍋でなくて一安心。

ところで旅人さんの新居ですが、やたら広いのでいろいろ飾れますね。フィギュアとかフィギュアとかフィギュアとか。今度お邪魔したときには、引越祝いも兼ねて何か不法投棄プレゼントすることにしましょう。

10月 2日 (月)

1. DeleGate Message Filter 1

メモ。ディレクトリ構成をごっそり変えてみました。機能拡張に対応するためです。

  • フィルタタイプとしてFTOSV等にも対応出来るように。
  • ドメイン単位とフィルタタイプ単位の二段構え(OR結合)で、デバッグモード等の設定切り替えが可能に。
  • ファイル名 "$SERVER_HOST.pl" をやめて、サーバホスト名でディレクトリを切って "$SERVER_HOST/filter.pl" に。

2. DeleGate Message Filter 2

フィルタが動作しないケースにぶち当たりました。今のところ、GooとYoutubeのみです。動作するサイトとの違いといえば、Transfer-Encodingフィールドの有無でしょうか。エンティティボディがチャンク形式でエンコードされていると、CFIスクリプトが正しく動作していないように見えます。ただの偶然かもしれませんが。要調査?

10月 3日 (火)

1. DeleGate Message Filter 1

昨日のフィルタが動作しない件、なんだかバグっぽいなあ。-vdオプションでログを解析。対象リソースのMIMEタイプはtext/htmlで、転送エンコーディングはチャンク形式。

#!cfi
Content-Type: text/html
Message-Filter: hoge
--
Content-Type: application/xhtml+xml
Message-Filter: hoge

このスクリプトでは、フィルタが適用されません。スクリプトが読まれている様子すらありません。転送エンコーディングがチャンク形式でない(ベタ転送)場合は、期待通りContent-Type: text/htmlの部分にマッチし、フィルタが適用されます。

#!cfi
Content-Type: text/html
Message-Filter: hoge
--
Content-Type: application/xhtml+xml
Message-Filter: hoge
--
--

このスクリプトでは、Content-Type: text/htmlの部分にマッチしたとのログが出ます。フィルタは期待通り適用されます。ところが、最後のデリミタを削除してしまうと、なぜか前述のスクリプトと同様、スクリプト自体が読まれません。謎。

2. DeleGate Message Filter 2

FTOCL通過後のYouTubeは割とシンプル。FLV直リンクURLの取得には、以前作ったスクリプトを流用しました。

10月 7日 (土)

1. Message Filter - mod_ext_filter

DeleGate用フィルタをApacheでも使おう計画。

Apache 2.0 + mod_proxy + mod_ext_filter で環境を構築しました。既存のSubversion用Apacheを使い回すため、バーチャルホストを立てました。ホスト名とポート番号の両方で仮想化しています。

で、フィルタですが、結論から言うと動きません。

  • エンティティヘッダが飛んでこない。
  • Transfer-Encoding: chunkedな応答では、メッセージボディがそのまま飛んでくる(?)。
  • Content-Encoding: gzipな応答でも、メッセージボディがそのまま飛んでくる。

つまり、エンティティボディを得るために、外部フィルタはメッセージボディをチャンク形式でデコードし(?)、さらにgzipデコードまでせねばなりません。しかし、ヘッダがないとデコード方法を判定できないので、どうしようもありません。後者はinflateフィルタ(あったっけ?)を間に挟めば何とかなるかもしれません、どのみちヘッダがないと不便です。いや、エンティティヘッダ+ボディが飛んでくるという前提(DeleGate型)でフィルタを実装したので、やはりヘッダは必要です。外部フィルタにヘッダを渡す方法があれば改善の見込みはありますが、現状ではなんともかんとも。

10月 8日 (日)

1. 横横

延々とR-TYPEΔ&GRADIUS Vをやっていました。GRADIUS V、一周するのに一時間以上掛かります。長いよ。しかも似たようなステージ、似たような音楽が続くので、プレイしているとだれてきます。とてもじゃないけど何周もする気にはなれませんね。

ちなみに私の好きなグラディウスはII(ゴーファーの野望)と外伝。

10月 9日 (月)

1. 地球防衛軍2

INFERNO「灼熱」でボルケーノ6Wが出ました。ダメージ1250*6で、爆風も弾速もボルケーノ6Aより改善されていて、かなり強い武器です。残るはAS-100FとライサンダーFとUMV2とリペアスプレーAか。

10月 12日 (木)

1. 押し入れに上履き180足 においかぐため?28歳逮捕

こういう事件で実名が公開されるとめちゃ恥ずかしいよなあ。近所を歩いていても、

主婦A
「ちょっと奥さん、ほら、上履きの人よ。」
主婦B
「まあ、上履き!」

なーんて後ろ指指されるんですよ、きっと。

そういえば縦笛900本を盗んだ事件もありましたね。まあ、縦笛!

2. メモ

行列とかベクトルとか。

10月 13日 (金)

1. 二次元

移動している点、円の衝突判定処理を書いてみました。線分も目処がついたのでそのうち。矩形はかなり面倒なのでやらない方向で。軸に平行で、かつ静止している矩形同士であれば話は簡単ですが、一方が移動している、軸に平行でない、一方が矩形でない等となるととたんにややこしくなります。

2. 地球防衛軍2

  • INFERNO「皇帝都市」はアイテムの回収効率が悪いので、武器稼ぎにはあまり向かない。放置できる「灼熱」の方が楽。
  • 一番吹っ飛ぶのはモンスターS。密着でのデモニックランスやホーリーランスよりも飛ぶ。

10月 15日 (日)

1. CommaInitializer

tvmetのVector<data_type, size>クラスインスタンスは、

double x, y, z;
Vector<double, 3> vec;
// ...
vec = x, y, z;

のように、値をカンマ区切りにして要素を代入できるようになっています。Matrixクラスでも同様です。この仕掛けの説明はTechniques for Scientific C++ - 1.11: Comma overloadingに書かれています。説明を読むより、コードを見た方がわかりやすいかもしれません。tvmetの場合、テンプレートに指定したサイズより代入する要素数が多いと、ちゃんとコンパイルエラーになるのだそうです(試してないけど)。

そこまでしなくても、vec.assign(x, y, z);でいいような気もしますが…

10月 18日 (水)

1. 罰ゲームのメイドツーリング in 椿、伊豆スカ

何かの罰ゲームのようです。

2. メイガス四姉妹

例の「邪神」とか「中国」とか。旬を過ぎた感はありますが、一応。ちなみに元ネタは下記の通り、でいいのかな?どれもプレイしたことがないので間違っているかも。

10月 19日 (木)

1. 鬼車

鬼車は、Ruby/1.9以降で採用される正規表現エンジンです。多くの文字エンコーディング、多くのパターン文法だけでなく、名前付き捕獲式集合((?<name>....))にも対応しており、非常に面白そうです。

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からも座標を指定できるようになりました。さらに単独の自由変形にも対応したつもりですが、そもそも吉里吉里は単独のトランジションに対応していないっぽい?