北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

Python Unconference 1 レポート

Python Unconference 1へ行ってきましたので、レポートです。

割と予習したつもりだったんですが、特にPylons周りでわかんない話が多発しました。頑張ってメモりましたが、内容の正確さは期待しないで下さい( ´△`)。

Unconferenceについて解説

Unconferenceとは、Conferenceほどの大きさではない勉強会で、米国での呼び方にあわせたっぽいです。

Pylonsとその仲間たち 〜フレームワークのためのメタフレームワーク〜 (林 淳哉さん)

  • Djangoによる金融ポータルの紹介 http://finance.coolmedia.jp
    • モデルは67個
  • Pylonsの翻訳プロジェクト http://wiki.pylonshq.com/display/pylonsja/
  • TurboGears 2に関しては、ノータッチで
  • Pylonsの好きなところ
    • スタンダードと柔軟性
    • 名前空間(c、g、h等)
    • 開発スタイルのパッケージ化
    • ドキュメント
    • エラー画面でのデバッグ(Pythonコードを実行可能)
  • Pylonsの大変なところ
    • 依存性が非常に高い(ドキュメントの分散・バージョン不整合)
    • デバッグ画面がセキュリティリスクに
  • 利用事例: Triax CMS ver 0.0.1
    • 社内リリースしているそうです
    • Pylonsベースの開発環境
    • 管理画面を自動生成
    • ひな形を自動生成: paster create -t trcms foo
    • カスタムコマンド: paster triaxapp news 等
  • 開発スタイルをフレームワーク化 - MyCMSを作る
    • setuptoolsでパッケージを作成する
    • プロジェクトのひな形を作成
    • テンプレート templates/default_projects/
        1. package+ : package名
        2. egg+ : egg名
      • ${hoge} : 変数で置換
    • pasteパッケージのTemplateクラスを継承し、ディレクトリ名やegg名等を与える
    • カスタムコマンド: paste.script.command.Command の継承
    • setup.py に entry_pontsを指定
    • eggを作成して配布する
  • ひな形がよく出来ており、Pylonsの価値の多くを占めている
    • 実際の土台はPasteであり、そのアプリケーショん実装がPylons
  • Pylonsとは
  • Pylonsの仲間達 → たくさんの依存
  • Pylonsがやってること
    • WSGIアプリケーション (クライアントに返す部分)
    • 設定ファイル
    • コントローラー
    • エラー処理
    • StackedObjectProxy変数
      • c: テンプレートと共有するオブジェクト
      • g: グローバルオブジェクト
      • cache: 通常はbeaker_cacheデコレータを利用
      • request, session
    • プロジェクトのひな形(pasterコマンド)
    • まとめ: WSGI準拠、小さいパッケージ、多くの依存
  • WSGI (Web Server Gateway Interface ウイスキー) とは
    • PEP333
    • Web ServerとApplicationをつなぐ仕様
    • Server, Application, Middleware
    • Plaggerやデコレータを思い浮かべるとよい
  • WSGIによるApplicationリレー
    • Middlewareは、Applicationをデコレートする
    • Serverからの呼び出しは、Middlewareを流れてApplicationに届く
    • Middlewareはenvironに値を格納できる
  • Serverの動き
    • requestを受けて、responseを返す
    • environに、CGI変数やwsgi変数を入れる
    • Applicationを呼び出す(environを渡す)
  • Applicationの動き
    • 2つの引数を受け取るcallableオブジェクト(environ, start_response)
    • start_responseでヘッダを出力
  • MiddleWareの動き
    • Serverから見るとApplication、ApplicationからみるとServer
    • environに値やオブジェクトを格納
    • Applicationの代わりにresponse
    • responseをApplicationに委譲
  • MiddleWareの具体例
    • Paste: ConfigMiddleware
      • 設定ファイルの情報をenvironに格納
    • Paste: Cascade
      • 複数のApplicationを連結
      • 404を無視し、次のApplicationに依頼する
    • Routes: RoutesMiddleware
      • URLのマッピングを行う
      • matchした情報をenviron['wsgiorg.routing_args']やenviron[routes.route]に格納
  • WSGIの詳細は、PEP333-ja
  • Pylonsのインストール
$ easy_install Pylons
$ paster create -t pylons mycms
[development.iniを一行編集]
$ paster serve development.ini
  • ひな形の構造は?
    • foo/controllers、foo/models、foo/templates
    • development.ini
    • foo/config/
    • foo/lib/
  • config/middleware.py
    • Applicationのエントリポイント
    • WSGI Applicationを作成する (Middlewareをリレーさせる)
  • config/environment.py
    • 設定ファイルを読み込む
    • paste.deploy: ConfigMiddlewareを environ と paste.deploy へ渡す
  • config/routing.py
    • RoutesMiddleware
    • environにルーティング情報を格納
  • lib/base.py
    • コントローラーで必ず読み込むファイル
    • StackedObjectProxy 変数(どこでも使える)
    • モジュールのimportはここを経由して行う(継承ができるから)
  • lib/helpers.py
    • 便利な関数群
    • 主にWebHelpers、自前定義もここで行う
    • hで参照できる
  • lib/app_globals.py
  • lib/vars.py (おまけ)
    • Pylon標準ではなくTriaxでの話
    • vで参照できる定数を定義している
  • まとめ
    • PylonsのベースはPaste
    • Pasteのアプリケーションとしての実装がPylons
    • Pylonsのプロジェクトのひな形はパッケージと同じくらい大切
    • PylonsのApplicationはMiddlewareだらけ(WSGIの有効利用)
  • 質疑応答
    • Q. 「start_responseがよくわからない」
    • A. 「serverが用意したレスポンスが回って来ている。start_responseでレスポンスが開始できる」
    • Q. 「cronであるコマンドを実行したい」
    • A. 「pasterコマンドをcronに渡すとうまくできる」
    • Pylonsの日本語ドキュメントがあります。見て下さい」
    • Q. 「Pylonsの質問が出たらどうする?」
    • A. 「メーリングリスト等はない。pythonメーリングリストへ送って欲しい」


この時点で会場は超満員で立ち見がたくさん。Pythonの最近の注目度が伺えますねー。

Google Gears(MiCHiLUさん)

  • 今年の5月にGoogleが発表
  • キャッシュをしてくれるプラグイン
  • Firefox 1.5+, IE 6+ (Safari) + JavaScript
  • LocalServer, Database, Workerpool
  • LocalServer
    • Localで動くWEBサーバー
    • プロキシのように動く
  • Database
  • WorkerPool
  • 実装は?
  • サンプル: Django offline → 開発止まってます><
  • まとめ
    • GoogleGearsは便利
    • Djangoなら、オフラインドキュメント和訳があります

Gearmanでプログラムの壁を越えろ(村岡 友介さん)

  • Danga?
  • Gearman?
    • リモートファンクションコールルータ
    • 分散型リモートプロシジャーコール
    • WorkerがGearmanDに自分をレジストする
    • GearmanDは、適当なサーバにタスクを投げる
  • プログラムの壁?
    • RMI(Java)、dRuby(Ruby) → 言語に閉じている
    • 共通の仕組み → CORBAとかSOAPとか → 重い。
  • gearmandだと言語の壁を越えられる
  • rubypythonをワーカーとして呼び出すデモ
  • まとめ
    • 分散
    • 好きな言語でハックしたい
  • Q. 「Gearmanのサーバ同士でデータ共有ができるか」
  • A. 「調べては居ないが、ワーカーとクライアントをつないでいるだけ」
  • Q. 「型は?」
  • A. 「クライアントとワーカーで勝手にあわせる」
  • Q. 「gearmandはプロクシとして転送しているのか」
  • A. 「はい、リクエストとレスポンスを送ってます」
  • 宣伝: PythonVMについて解説されているらしいです*1

PyTCで学ぶPython C拡張の書き方(末永 匡さん)

  • PyTCとは?
    • TokyoCabinetPythonバインディング
    • key-value型データベースの好実装
    • mikio氏がmixiの支援を受けて開発。C言語
    • パフォーマンスが、Berkeley DBよりずっと早い
    • CDBには負ける(読み込み専用DBなため)
    • TC Btreeの方がTC Hashより速いようだ
  • PythonからCライブラリを使うためには??
    • ctypes, SWIG, Pyrex, SIP, Boost.Python, C拡張
    • どれを選ぶ?
  • ctypes
    • Python2.5以降は標準
    • お手軽。コンパイル不要。
    • 実用的にするにはPythonでラッパを書く必要がある。
  • SWIG
    • 移植性が高い(perl, python, ruby, Java)
    • C++と相性がいい(オブジェクトの作成・削除)
    • Cのものは、C++のラッパを書いて使うといい
  • SWIGは使わなかった
  • Pyrex
    • Python+αの文法で拡張モジュールが書ける
    • Cのソースが出力される。コールバックも問題ない
    • おすすめ。普通はこれ。
  • SIP
  • Boost.Python
    • C++ライブラリBoostの一部
    • ブルドにBoostが必要
  • Cによる拡張モジュール
    • Python/C APIでごりごり
    • Cで全て書ける
    • おすすめできない。面倒。
  • Cによる拡張モジュールを選んだ
    • 趣味だから
    • Tokyo Cabnetのパフォーマンスを崩さぬよう
  • 方針
    • Pythonでのラッパを必要としない
      • Cソース+setup.py
    • マクロの活用
  • dict風オブジェクトを作る
    • tp_as_mapping, tp_iter, tp_as_sequence
  • マルチスレッド
    • Tokyo CabinetはI/Oでブロッキング
    • GILを解放し、マルチスレッド同時実行性能を上げる
    • コールバック関数で、GILの取得が必要
  • 定数の格納
    • 現状: モジュールそのものの辞書に登録
    • 将来的には、型に定数を登録したい
  • まとめ
    • お気軽実装ならctypes
    • C++ならSWIG
    • ちゃんと書くならPyrex
    • 変態で暇ならC APIでごりごり
    • PyTCではiterkeysやitervaluesやiteritemsは未実装
  • Q. 「Cheese shopへの登録は?」
  • A. 「はい。最新版ならeasy_installでOKのはず」
  • Q. 「Rubyのラッパーとの速度差は?」
  • A. 「未試行。恐らく、がわの性能ではあまり変わらないでしょう」

habuの紹介(大谷 弘喜さん、遠藤 隆尚さん)

  • Plaggerもどき
  • プラグインの組み合わせで、RSSの収集と再配信
  • 開発経緯
    • テストコードの組み合わせ
  • 使い方 コマンドラインツール
  • コード量
    • init.py 331行
    • runhabu.py 246行
    • ちっちゃい
  • Pluginとは?
    • Pythonのモジュール
    • hubuがyamlの設定に従ってプラグインの動的ロード
    • フィルタはPythonの知識だけで書ける
    • twistedを知っていた方がいい
  • Pluginの決まり事
    • create(config, environ)オブジェクトを返す
    • execute(content) deferredか辞書かそのリスト
  • Pluginは? pyhabu-plugins でやってます。
  • 変な機能
  • Q. 「WEBからインストール機能は何を使って実装?」
  • A. 「twistedです。setuptoolsはroot権限がいるから」
  • Q. 「habuはcronから実行可能?」
  • A. 「できます。デーモンとして常駐させたい」
  • Q. 「CGIのように利用することはできる?」
  • A. 「CGIからキックできれば可能」


Python系のセミナーには初めて出たんですが、色々と勉強になりました。特にグニャラさんの話が面白かったです。

*1:見つけた。ありがたやありがたや。