2010-08

2010-08-03 

凄い動画を見つけた。

「あの」ロックマンXシリーズ最悪の極悪難度を誇るX6を、よりによってオワタ式(チートを用いて1ダメージで即死亡に設定)でクリアという偉業。これは本当に凄い。そして改めてロックマンX6はその前後作(こちらも大変な問題作)と比べても、やはり頭一つ抜けておかしかったと言う他ない。

いや本当にロックマンX6は酷いんだよ! 神ゲーのさらに上にロックマン枠を設けてる程のシリーズファンの俺でさえ、何年たっても「これはXシリーズどころかアクションゲームとしてねえよ」以外の感想が出てこないんだから! 前作のX5の時点で「おいこれ本当に正式なXシリーズなのか? 海賊版ではないのか?」といった出来栄えだったのだが、下には下がいたというか。

難度調整のおかしさは本当に酷く、ダメージ喰らいつつ無理やりゴリ押しが事実上前提というあたりにアクションゲームとしての異常さが表れている。マリオで言うと、キノコが山のように出てくる代わりに回避困難・不能な敵の配置がしょっちゅう出てくるといった感じだ。そして即死トラップの雨あられ、単にダルいだけのギミック持ちの一部ボスなど。「一体何が面白いんだ?」と聞かれたら、「面白くねえから別のゲームやれ」としか言えない。

ゲーム本編だけでなくストーリーもファンを激怒させる出来だったのもアレだ。いや、きちんとした演出とかすれば目の付け所は悪くなかったんだろうけど、見せ方が素人目に見ても下手というかなんというか……。「前作のエンディングと初っ端から矛盾が生じてる」「黒幕の一人が説明ゼロで死体になってる」というあたりから、その酷さを感じてもらいたい。

2010-08-20 

更新頻度上げるとか言っておきながら、やっぱり多忙だったりして更新しなさすぎな今日この頃。備忘録代わりに Python のしょーもない Tips でも。

urllib2 で GET, POST 以外のメソッドを使う 

urllib2.Request クラスはどういうわけだか GET, POST 以外のメソッドが使えない、というか HTTP リクエストを送る際にボディに何かデータがあれば自動的に POST メソッドが使われ、それを変更できない仕様になっている。

しょうがないので、こういう感じで get_method をオーバーライドして凌ぐことにする。

class MyRequest(urllib2.Request):
    def get_method(self):
        return self._method

    def set_method(self, method):
        self._method = method

200, 206 以外の 2XX レスポンスを例外扱いにしない 

urllib2 は 200 と 206 以外のステータスコードを全部例外にするという仕様なので、他の 2XX 系のステータスコードをエラー扱いしたくないときに困る。

悪さをしているのは urllib2.urlopen などで使われるデフォルトの OpenerDirector の設定なので、自前で OpenerDirector の設定を行い、その際に元からある HTTPErrorProcessor ではなく、手製の奴を使うようにすればいい(コードはほぼ流用)。

class MyHTTPErrorProcessor(urllib2.BaseHandler):
    handler_order = 999

    def http_response(self, request, response):
        code, msg, hdrs = response.code, response.msg, response.info()
        if int(code / 100) != 2:
            response = self.parent.error(
                &39;http&39;, request, response, code, msg, hdrs)
        return response
    https_response = http_response


opner = urllib2.OpenerDirector()
classes = [urllib2.ProxyHandler,
           urllib2.UnknownHandler, 
           urllib2.HTTPHandler,
           urllib2.HTTPDefaultErrorHandler, 
           urllib2.HTTPRedirectHandler,
           urllib2.FTPHandler, 
           urllib2.FileHandler, 
           MyHTTPErrorProcessor]
for c in classes:
    opner.add_handler(c())
opner.open(...)