Firefox null

written by shn, on Mar 8, 2009 1:10:00 AM.

なにこのかっこいいバージョン

Firefox null

Werkzeugで遊ぼう! - Routing編

written by shn, on Mar 7, 2009 2:34:00 AM.

リクエストから、各URLへと対応するハンドラを導くのに、Werkzeugではwerkzeug.routingを使う。

wz_routing.py

#! -*- coding:utf-8 -*-
from werkzeug import run_simple
from werkzeug.routing import Map, Rule, Submount, Subdomain

class WSGIApplication(object):
    def __init__(self):
        self.url_map = Map([
            Rule('/hello', endpoint='hello'),
            Rule('/hello/<string:lang>', endpoint='hello'),
        ])
        self.url_adapter = self.url_map.bind('localhost')

    def __call__(self, environ, start_response):
        endpoint, arguments = self.url_adapter.match(environ['PATH_INFO'])

        handler = getattr(self, 'handle_%s' % endpoint)
        return handler(environ, start_response, **arguments)

    def handle_hello(self, environ, start_response, lang='en'):
        writer = start_response('200 OK', [('Content-Type', 'text/plain; charset=utf-8')])
        if lang == 'en':
            return ['Hello']
        elif lang == 'ja':
            return ['こんにちわ']
        elif lang == 'he':
            return ['הלו']
        return ['no hello yet']

if __name__ == '__main__':
    run_simple('localhost', 4000, WSGIApplication())

$ python wz_routing.pyして、$ curl http://localhost:4000/hello とか、 $ curl http://localhost:4000/hello/ja とかしてみるといろいろなhelloが楽しめると思う。

Ruleには、<int>やら、<float>やらも使えるので、/blog/archive/2009/03/とか、twitter.com/shn/repliseみたいなナウいURLが設計しやすくて良いですね~

__call__の中身は、以下のようにも書き換えられる。

return self.url_adapter.dispatch(
    lambda e, a: getattr(self, 'handle_%s' % e)(environ, start_response, **a),
    path_info=environ['PATH_INFO']
)

goodbyeも楽しみたいなーと思って、/goodbyeにアクセスするとNotFound例外が飛ぶ。こいつもwsgi的な奴なので、ちょちょっとするとエラーを表示してくれる。

from werkzeug.exceptions import HTTPException
try:
    endpoint, arguments = self.url_adapter.match(environ['PATH_INFO'])
except HTTPException, e:
    return e(environ, start_response)
else:
    ...

Submountを使うと、Ruleの塊を指定したディレクトリ以下にマッチしてくれるようにしてくれる。似たようなのにSubdomainてのもあるけど、まだ使ったこと無い。subdomain毎にbind()しないといけないのかな?

Werkzeugで遊ぼう! - とりあえず編

written by shn, on Feb 27, 2009 8:49:00 PM.

ザインに入信したので次はWerkzeugだ!

Werkzeugは小気味の良いWSGIのユーティリティ集で、やはりpocooタンが開発している。pocooタンかわいいよpocooタン
C#よりC++, MFCよりWTL, apacheよりnginxな男はDjangoよりWerkzeugを選ぶのである。

前置きはおいといて、まず開発支援系の機能から試していくことに。

run_simple

werkzeugのHTTPサーバを使った最小コードはこんな感じかしら。手元でテストする分には十分げ

wz_first.py

#! -*- coding:utf-8 -*-
from werkzeug import run_simple

class WSGIApplication(object):
    def __call__(self, environ, start_response):
        writer = start_response('200 OK', [('Content-Type', 'text/plain; charset=utf-8')])
        return ['Hello', 'הלו', 'こんにちわ']

def main():
    run_simple('localhost', 8080, WSGIApplication(), use_reloader=True)

if __name__ == '__main__':
    main()

use_reloader=Trueにすると、forkして、コードに変更がありしだい子プロセスを立ち上げなおす。

スクリプト

wekrzeug.scriptを使うと、コマンドラインからいろいろ出来る!

def main()
    from werkzeug import script

    action_runserver = script.make_runserver(WSGIApplication, use_reloader=True)
    action_shell = script.make_shell(lambda: {'app': WSGIApplication})
    script.run()

コマンドラインから、script.run()を呼び出したフレームのaction_xxxを呼び出せる。
例えば、$ python wz_first.py runserverすると、action_runserverさんが呼び出される。

ワースゴイヤ!

Pythonの最小セット

written by shn, on Feb 24, 2009 6:28:00 PM.

Python(2.6@win32)を起動するだけなら、以下のlibがあれば良いようだ

site
    os
        ntpath (win32)
            stat
            genericpath
            warning
                linecache
                types
        UserDict(win32)
            _abcoll
                abc
        copy_reg

    encodings
        codecs

site.pyはいじって、site-packages等を読み込まないようにしている。

sys.setdefaultencoding('utf-8')とかしないなら、encodings以下もいらないのかな。codings:utf-8なんてスクリプトが読めなくなるかな。

_zipimportは組込みなので、上記パッケージはzipできる。zipすると57KBととてもスッキリ

Boost.Python@MSVCでpython-debuggingが

written by shn, on Feb 23, 2009 6:20:00 PM.

多分これと一緒。 Boost.Pythonをpython-debuggingにしてビルドしたものを使うと、Pythonの関数を呼んだ時に逝くという問題。 環境は恐らくWindowsのみで、うちの場合はboost 1.38.0, MSVC 9, Python 2.6。

原因はpython-debugging=onにしてできる、boost_python-vc90-mt-gy-1_38.dllPython26.dllと、Python26_d.dllの両方にリンクしてるからっぽい。

深く追うのがめんどくさかったので、tools\build\v2\tools\python.jam L:102に、condition = <python-debugging>on ;を挿入して無理矢理解決。

ざっと見た感じ、tools\build\v2\build\toolset.jam L:32initを空で呼んでいるせいで、 python.jamのinitに$(condition)が渡されてないのかなぁ、と。

bjamの引数に-d 7とか渡すとbjam内の引数と関数呼び出しを全部出力できて便利。 (ref: bjam usage)

Zineになりました。

written by shn, on Feb 22, 2009 3:45:00 AM.

WordPressからZineになりました。
Zineといってもセックス教団 ザインの事ではなく、Werkzeug, Jinja2の作者のArmin Ronacherのブログソフトウェアですね。
Pythonで書いてあるブログソフトウェアの中では一番の有望株なんじゃないでしょうか。
インターフェースはWordpressにクリソツ。

みなさんが気になるのは、なんでブログツール変えてんのよって事だと思います。
語るも涙、読むも涙の物語になるのですが、簡単に言えばHDDが吹っ飛んだんですね。
Seagateでも無いのに。 Doblogでも無いのに。

あとはもう五月雨式に
新しいHDDが要る。 > どうせならSSDにしようか。 > SSDにするならAtomにすれば電気代浮くかも! > やってきました秋葉原 > 腹が減ったので久々にじゃんがら > 秋葉に来たついでにドコモショップいったら、クレーマーが貧乏ゆすりしながらクレームしてた > 帰ってセットアップ > ケースを使おうと思ってたHPのML 115はトルクスで唖然 > BIOSがデネー! と思ったら、ジャンパいじらないと出ないらしい。 > DVDよみこまねぇ!と思ったら、ML 115につけてたのはCDドライブで唖然 > FreeBSD 7.1を入れたよ > ダイエット中なのにじゃんがら食べたのがばれて怒られる。
という感じです。