2010-11-24

web3ref PEP444 の実装例

PEP444 のリファレンス実装の存在を @aodag さんに教えてもらったので、見てみる、という試み。PEP444 は、PEP333 WSGI の後継仕様の提案です。まだ提案段階なので、WSGI 2.0 ではなく web3 という呼称を使っています。

読んでみたコードは、http://github.com/mcdonc/web3 です。Pyramid フレームワークの開発者だそうで。

サンプルコードとして simple_server.py というのがあります。ここで簡単な web3 アプリが定義されています。

def demo_app(environ):
    result = b'Hello world!'
    headers = [
        (b'Content-Length', to_bytes(len(result))),
        (b'Content-Type', b'text/plain'),
    ]
    return (b'200 OK', headers, [result])

戻り値の各要素は、bytes 型、bytes 型、bytes型の配列になっています。これは PEP444 と PEP333 の違いのひとつで、web3 アプリのレスポンスは bytes 型で返すこと、となっています。ステータスコードも bytes 型です。PEP444 でもいくつか理由があげられていますが、Python 2.x 系列の str 型はそれが文字列なのかバイト列なのかが不定である、サーバにエンコーディングをさせたくない、などの理由でこうなっているとのことです。

この簡単なサンプルだけみると、Content-Type の指定なんかで、わざわざ bytes にするのってどうよ、って思いましたが、多くの場合ここには Django とか Pylons なんかのフレームワークがのっかってくるので、アプリ(web3 アプリではなくて、web サービス的な意味でのアプリケーション)で気にしなくてよいでしょう。

ちなみに、to_bytes() 関数は、

def to_bytes(data):
    str(data).encode('ascii')

です。

サーバとハンドラはまた今度。socketserver モジュールで定義されているテンプレート的な基底クラスを、何段階か継承しているので、ゆっくり見てみようかと。いつになるんだろ。

2010-11-20

(第3回)Python mini Hack-a-thon

Python mini Hack-a-thon に初めて行きました。もともと Plone/Zope の hack-a-thon だったらしいのですが、最近は Plone/Zope に特化していないのということなので、こっそり参加です。何かを作り上げるっていうよりも、Python 3.2 を使うことが目的でした。が、しかし、最初の自己紹介で「Python 3 で何かつくる」って言ってしまった手前、まあなにかやろう、と。

標準ライブラリだけを使って、BaseHTTPRequestHandler を継承してフレームワークを作るというのが、どんなもんか、というのが興味あったのですよね。WSGI とかは無視で。

実は一番困ったのは、BaseHTTPRequestHandler.wfile.write() には文字列ではなくて、bytes や bytearray を渡す必要があったんですね。このへん、Python 3 の話をするときにいつも言ってるのですが、自分がやってしまうとは。

久しぶりに、どうでもいいコードを書いた。たのしぃ。やべぇ。

     
import sys
import http.server
import re

PORT = 8001

# --------------------------------------------------------------
# Request handler
# --------------------------------------------------------------

class Handler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        return self.show()

    def show(self):
        view = self._find_view(self.path)
        response = view(Request(self.path, self.command))
        response.render(self)

    def _find_view(self, path):
        for pattern, view in urls:
            if re.match("^"+pattern+"$", path):
                break
        else:
            view = error_404
        return view

class Request(object):
    def __init__(self, path, method):
        self.path = path
        self.method = method

class Response(object):
    def __init__(self, data,
                 headers={"Content-type":"text/html"}):
        self.status = 200
        self.headers = headers
        self.data = data

    def render(self, handler):
        self._render_status(handler)
        self._render_headers(handler)
        self._render_content(handler)

    def _render_status(self, handler):
        handler.send_response(self.status)
   
    def _render_headers(self, handler):
        for k,v in self.headers.items():
            handler.send_header(k, v)
        handler.end_headers()

    def _render_content(self, handler):
        data = self.data
        if data is not None:
            handler.wfile.write(data.encode("utf8"))
   
# --------------------------------------------------------------
# View(s)
# --------------------------------------------------------------

def index(request):
    t = "<html><head><title>Hello</title></head><body><p>Hello</p></body></html>"
    return Response(t)

def error_404(request):
    response = Response("404 Not Found", {})
    response.status = 404
    return response

# --------------------------------------------------------------
# main
# --------------------------------------------------------------
   
urls = [('/hoge.*', index)]

def main():
    print("serving at port", PORT)
    httpd = http.server.HTTPServer(("", PORT), Handler)
    httpd.serve_forever()

if __name__ == "__main__":
    main()


2010-11-14

村上龍「歌うクジラ」の感想






村上龍の「歌うクジラ」を読みました。

群像に連載されていた、未来SFディストピア的ロード小説「歌うクジラ」を読みました。iPad の電子書籍版で1,500円です。「五分後の世界」「コインロッカーベイビーズ」「イビサ」みたいな描写が好きな人は、好きなんじゃないかな、と思います。

これまでの作品で描かれていた、あるいは主張されていたことと、今回新たに書かれたこと、の両方があります。村上龍節++ っぽい感じでしょう。ディテール描写でぐんぐん惹きつけられる感じでした。

プラットフォームとしては未来SFですが、書かれているテーマであろう、格差や断絶はタイムリーだと思います。「日本に移民が増えすぎる」みたいなのは、10年前と今ではリアリティが違うと思います。

epub などとの互換性のない電子書籍版を先行販売したことや、小説のウェブサイトがあることなど、メタな話題については、基本的にポジティブに受け取っています。

注意:以下、物語の核心に関する核心部分が明かされます。






大勢の人が笑顔をつくっている乳製品の宣伝映像を父親のデータベースではじめて見たとき、目まいと吐き気を覚えた。害悪だと子供にもわかった。 (p.207)

村上龍は、この種の笑顔を否定する記述を、小説内でよくやっている。本当に本人が嫌っているのか、そういう立場の人を描きたいだけなのかわからないけど。ただ、あまりに無表情な会話を続けると私は不安になります。この人、いやなのかなぁ、あるいは何か威圧しようとしているのかなぁ、と。


歩いて老人施設まで行くのかとアンジョウに聞いても意味がない。アンジョウに付いていく以外に老人施設を目指す方法はないからだ。 (p.332)

やっても意味のないことはすべきではない、っというのも、村上龍がよく明示的に書いています。個人的にそれはよいプラクティスだと思っていて、それは心がけたいなぁと思う。思考停止と間違わないように、と。



あの小型のドーム内にはガラスのグラスで飲みものを飲んでいる特別な人たちがいる。だが外を眺めるためのものではない。あれは自分たちが特別だと示すための施設なのだ。(p.149) 

「VIP 用なんとか」が目に見える状態になっているのは、今でも見せるために見せていると思います。それが商品としての価値だったりする。そのことに自覚的にならないと、まんまとマーケティングの餌食になってしまうなぁと思いました。


人口の減少および労働力の移民への依存度は幾何級数的に高まり生産性は劇的に下がり幾度となく円は暴落してやがて燃料と職労が欠乏するようになるが一般大衆の政治意識はゼロに等しかった。(p.238)

それ今でもそうだよなぁ。最近、政治がらみで盛り上がってるふうだけど、具体的な活動に移す人は殆どいないし、私もまったく行動をしていません。あまりに何もしていないとか、無関心が続くと、いざとなったときに、どうしていいのか分からないと思います。こわこわ。





2010-11-07

Python 3.2 を調べ始めてみた

Python 3.2 alpha 3 が出ているので、見てみました。前提として、私は仕事では Django を使っている(ので、Python 2.x 系)のと、ちょっとした日々の作業のスクリプトを Python 3.1 で書いています。その視点で気になったことリスト。

@atsuoishimoto に教えてもらったファイル名の取り扱いに変更があります。UTF-8 決め打ちじゃなくて、システムロケール使うぜ、と。os.fsencode() と os.fsdecode() でシステムロケールに合わせた、エンコード/デコードができます。

コンパイル済みコードの置き場が変わります。これまでは、foo.py が foo.pyc になってました。が、これだと複数の Python があったりすると、インタプリタが変わるごとに結局再コンパイルでした。てなわけで、__cahced__/foo.cpython-32.pyc みたいなファイル名で保存されます。

Logging の設定を、API 経由だけじゃなくて、辞書で指定できます。

3.1 では hasattr() があらゆる例外を握りつぶしていたのですが、AttributeError 以外はちゃんと伝搬してくれます。

などなど。あと全体的にパフォーマンスが上がっているようです。

個々の変更が、どういう影響があるかは、Python の使い方によって違うと思います。logging 使ってない人にしてみたらどうでもいいわけです。

個人的な印象としては、ものすごく大きな変更ではないようです。が、見逃していることは多々あるでしょうね。