PyramidをGunicornで動かした

簡単なアプリならPyramidで書けそうな感じにはなったので、次はDeploy周りについて調べてみた。
pipでインストールできるし定番っぽいところでGunicornの上で動かしたので手順をメモっておく。

インストール

新しいvirtualenv作ってそこにインストールしていく。

$ mkvirtualenv --distribute --no-site-packages --python=python2.7 gunicorn
$ pip install pyramid gunicorn

Pyramidアプリケーション生成

適当なディレクトリにscaffoldからpyramidアプリを作る。

$ mkdir dev
$ cd dev
$ paster create -t pyramid_starter sample
$ cd sample
$ python setup.py develop

起動

あとはgunicorn_pasterでiniファイルを指定するだけ!簡単!

$ gunicorn_paster develop.ini
2011-07-08 00:46:14 [27106] [INFO] Starting gunicorn 0.13.4
2011-07-08 00:46:14,397 INFO  [gunicorn.error][MainThread] Starting gunicorn 0.13.4
2011-07-08 00:46:14 [27106] [INFO] Listening at: http://0.0.0.0:6543 (27106)
2011-07-08 00:46:14,399 INFO  [gunicorn.error][MainThread] Listening at: http://0.0.0.0:6543 (27106)
2011-07-08 00:46:14 [27106] [INFO] Using worker: sync
2011-07-08 00:46:14,401 INFO  [gunicorn.error][MainThread] Using worker: sync
2011-07-08 00:46:14 [27109] [INFO] Booting worker with pid: 27109
2011-07-08 00:46:14,409 INFO  [gunicorn.error][MainThread] Booting worker with pid: 27109

Googleで検索してもGunicorn + Pyramidについて情報が全然なかったんだけど、こんな簡単だからわざわざ書く人がいなかったのかな…。

おまけ gunicorn-console

gunicornはプロセスの管理をシグナルで行うそうだけど、コマンドから直接シグナル送るのはなんだかなあと思って管理ツール的な物を探してみた。で、こんなものを見つけた。

cursesを使ったCUIアプリケーションで、以下のようなことが出来るらしい。

  • ステータス確認
    • master毎のpid, port, prosess name, memory, worker数
  • プロセス操作
    • masterのリロード
    • workerの追加
    • master, workerのkill

ちなみに、前述の起動コマンドで立ち上げてからgunicorn-consoleでステータスを確認してみたところ、process nameにはiniファイルのフルパスが表示されてしまっていた。

f:id:inoshirou:20111024232151p:image

以下のように--nameオプション付きで起動すると、任意の名前を表示させることが出来る。

$ gunicorn_paster --name=pyramid_sample develop.ini

こうなった。

f:id:inoshirou:20111024232152p:image

psコマンドにも反映される。

  PID TTY      STAT   TIME COMMAND
27325 pts/6    S+     0:00 gunicorn: master [pyramid_sample]
27328 pts/6    S+     0:00 gunicorn: worker [pyramid_sample]

ちなみこのプロセスに名前を付ける機能はsetproctitleというパッケージを入れることで使える。pipでgunicorn-consoleインストールすれば一緒に入るはず。

こんな感じだが、機能が豊富なわけでもないしscreen上で起動すると表示が点滅というかチカチカして非常に見づらかったので多分使わない。
本気で運用する気になったら管理コマンドでも作ろうかな。やっぱりこういう時はFabric使うのがいいのかね?

参考URL

http://w.koshigoe.jp/study/?ruby-unicorn-intro
オリジナルのunicornについてのまとめだけど、概要を掴むには良い資料だと思った。

Python Developers Festa 2011.10 に参加しました

Python Developers Festa 2011.10 に参加してきました。このイベントはもともとPython Hack-a-thonという名前で4年前くらいからやっていたそうだけど、今回から名前が変わった模様。

http://d.hatena.ne.jp/Voluntas/20110828/1314542601

Zusaarによると、一般枠と女性枠合わせて156人くらいが参加したみたい。Pythonのハッカソン系イベントとしては最大規模?他の勉強会とはしごで参加した強者もいた。
ちなみに自分は過去の開催に参加したことはなく、今回が初参加。

午前中 ハンズオン git-flow

当日になってもどのハンズオンにするか決まらず(ハンズオン内容が事前に分からないものもあったので)もくもくするか中級者向けにしようかなーと思っていたけど、直前になってgit-flowに参加することに。ちなみにgitはgithubからcloneするくらいの用途でしか使ったことは無かった。業務ではSubversionを使ってる。
進め方はチュートリアル的な内容で手を動かしながら、講師であるVの人の話を聞いたり質問したりといった感じ。あまり細かいところまでフォローしないよといったスタンスだったが、それくらいで丁度いいと思った。詰まった時とか近くの人と話すきっかけにもなるし。

一通りの流れをコマンド打ちながら実践して、最後にgithubにpushして終わり。
流れは分かったけど、今まで戦略とか考えてVCS使ってこなかったせいかピン来てない点がいろいろあるので、それはこれから考えようと思う。

財布を忘れるという大失態を犯したことに気づく。(電車はSuica使ってこれた、チャージなかったら詰んでた)Suicaでコンビニ飯かなーと思っていたところ、PyConJpで知り合った方におごって頂ける事に。ありがとうございました!
オラクルの会場担当の方の案内で行った蟹料理屋のカニ玉チャーハンはおいしかったなー。一緒に行った人たちとわいわい喋れたのも楽しかった。

午後 LT

もくもくしながら聞こうかと思ったけど、知らない話が多くて聞き入ってしまってもくもく出来なかった。
置いてきぼりにされる題目の連続だったけど、逆に普段は関わらない世界が垣間見えて面白かったと思う。以下テキトーまとめ。

Pythonのシグナルハンドリング @atsuoishimoto
  • 「無職からフリーターになりました」
  • PythonのシグナルハンドリングはCといろいろ違うので注意せよ
  • Threadとシグナルを混ぜるのは危険
  • どういった場合にシグナルを使ったプログラムが必要になるんだろう
PyPyについて @jbking
  • PyPyは、CPythonで書かれたPythonサブセットのRPythonで書かれたPython処理系(認識これで合ってるのか?)
  • RPythonで処理系を書くとJITが効くようになるから速いらしい
  • ガベージコレクタは勉強してないのでよく分からなかった
  • 発表資料がマインドマップだった
git-dailyについて @sotarok
  • PHPの方から来ました」
  • タイピングというかコマンド打つのはえー。シェルのaliasとかプロンプトとかすごい活用してた
  • 発表内容はあんまり頭に入ってこなかったので、あとでブログ読もう
  • 「残念!PHPでした!」
社内向けgit Webフロント koshinuke について @lanius
  • 「こころを作りたくてITに来ました」
  • 「gitoriusは高機能だけどインストールとかメンテが大変だから自分で作った」
  • 「先輩に言われて4回くらいスクラッチで作り直した」
  • 「koshinukeの由来はメーリングリストで "Hi koshinuke users!" とか言われたかったから」
  • ローカルのgit Webフロントっていっぱいあるみたい、git使わんので知らなかった
  • pushState + Ajax っていうのを初めて聞いた
  • CSSプログラマフレンドリに書けるlessというものがある
riakについて @yosukehara
  • ここから本格的置いてきぼりのターン始まり
  • プレゼン資料がとてもcoolな感じだった
  • Bashoというところが作った分散KVS。AmazonのDynamoという論文?を実装したもの
  • キーワード拾うので精いっぱい。「CAP定理」は覚えておくといいらしい
  • インフラ系はまだまだ知識不足だ…
機械学習について @dekosuke
  • 機械学習の概念的なあたりの説明
  • まったく知らない分野だけど、知らない人向けの結構わかりやすい内容だった
OpenFlowについて @oshothebig
  • ネットワーク方面の話
  • スイッチから制御塔的な部分を切り離して一元管理見たいな話
  • 通信のポリシーはコントローラにあり、スイッチは転送ルールをコントローラに問い合わせる
  • コントローラ側のルールはプログラマブルに定義できる
Hadoopについて @shiumachi
  • エキスパートPythonプログラミング第二期TL見ていてあまり聞いてませんでしたごめんなさい
  • あと象がキモイTLだった、確かにキモかった
Asakusa Frameworkについて @cocoatomo
  • Hadoopを使ったアプリケーションを書くためのフレームワーク
  • 前のLTちゃんと聞いてればもうちょっと分かったのかも、残念
  • バッチ処理が高速化できるとかなんとか
女性にモテるためのIT系男子的部屋の片付け術 @sawonya
  • 「つまみぐい勉強法」のイラストを描いたやまもとさをんさん
  • 要らないものを捨てるではなく、必要なものを残す
  • 理想の自分の実現の為に理想の部屋をイメージ
??? @moriyoshi
  • 「PyFesの裏番組はYAPCですよね」
  • perlコミュニティをリスペクトしましょう」
  • perlにあってpythonに無いもの ×dankogai ×yusukebe(会場からはmopemopeさんがいる、という声が) ○Acme
  • pythonにはbuchoパッケージがあるらしい
  • Acme::AKB48Pythonに移植しました」
ウェブ魚拓と大津波 @hiroki_ninuma
  • すごいいい声
  • 「災害は必ず来る、来なくても来る」
  • 鬱になりやすい食事と太りやすい食事には共通点があるそうだ
  • 紹介された本を読んでおけば災害に対して精神的耐性が少しは付くのかな

次回PyFes

http://d.hatena.ne.jp/Voluntas/20111015

一般枠は公開当日に埋まり、気が付いたら枠増えたはずの女子枠も埋まっていた。なにこれこわい。
自分もとりあえず当日ずさーしておいた。今から楽しみ。

ORMについてのメモ

ORM(Object Relational Mapping)とは

  • DBを抽象化してオブジェクトとして扱う方法
  • プログラム上ではオブジェクトとして扱うけど、裏でORMが働いてDBと同期してくれるみたいな
メリット
  • SQL書かなくてもいい
  • プロダクトが各種DBに対応していれば、コードを変更せずにDBを変更できる

SQL書かなくていいと言ってもクエリの生成をメソッドで指示しているような感じなので、SQLの知識は必要。

デメリット
  • 性能に影響する(処理速度、消費メモリ)
  • 生成するクエリの質が問題になることもあるらしい

他にもちゃんと理解していないところだと、ORMを使うことでデータベース設計が難しくなったり、モデリングが難しくなったりするらしい。
設計方面は知識が足りてない。

ORMのパターン2つ

どちらもPofEAAという本に書かれているパターンだそうだ。ActiveRecordってRailsのORMの事かと思ってたら、パターンの名前そのまま使ってるだけなんだね。
PythonではActiveRecordのORMは、SQLObject / Elixir / Storm、DataMapperではSQLAlchemyが代表的ぽい。(ElixirはSQLAlchemyの上に構築されてる)

Scala SchoolでScalaに入門

面白そうだったので

Twitterの中の人が作ったScala Schoolというサイトができたようだ。Twitterは最初Rubyで構築してからScalaに移行したんだっけ。最近PythonistaからScalaオススメという話を聞いていており、ちょっとScalaに興味があったのでここで勉強してみる事にした。
ちなみに今まで静的型付けの言語はちゃんと使った事がなくて、C/C++/Javaをそれぞれちょこっと触ったくらい。
ちまちま進めていて、とりあえず現在の所Basic Continued(2ページ目)のObjectsまでやった(遅い)

やってみた感じとか

  • valとvarの正しい使い分け方がよく分かってない。
  • 対話型コンソールがあるのはいいね。評価した結果が保存されるのはipythonっぽい。
  • 関数の戻り値が最後に評価した式っていうのは新鮮。
  • Partial applicationとCurried functionsはどんな時に嬉しいの?
  • Constructorの概念も、関数定義する他の言語とは違う感じ。
  • Trait = JavaのInterface?
  • apply()はPythonでいう__call__()かな?似た機能を使った経験があると理解しやすくていい。
  • ObjectはSingletonなクラスに似てるけど、引数が渡せなかったりするのでイコールじゃない。

まだsbt consoleの対話環境でしか触ってないけど、楽しみながら遊んでいる。まあ、関数型プログラミングの世界に入ったところで間違いなくつまづくんだろうけど…。

時間見てちょこちょこと進めていきたい。

第11回 Python mini hack-a-thon でやったことまとめ

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

やろうと思った事

オブジェクト指向のWebアプリケーションフレームワークであるBlueBream。このチュートリアルを一通り終わらせ、簡単なサンプルアプリを作る事を目標としました。

BlueBreamについて軽く説明をすると、これは2004年11月にリリースされたもので、元はZope3という名前のプロダクトでした。3があるということはもちろん2もあります。しかし、以前に開発されたZope2はフレームワークではなくWebアプリケーションサーバです。
同じ名前なのに違うプロダクトということで混乱があったらしく、Zope3は2010年1月にBlueBreamに名前を変えています。
現在、最新バージョンは2011年1月にリリースされた1.0です。あまり活発に開発されていないのかな?

ちなみに、PythonのWebアプリケーションフレームワークについては、これまで以下のものを触ってきました。どれもチュートリアル程度ですが。

  • Flask
  • Django
  • Pyramid

とりあえず今は「どんな状況の時にはどのフレームワークが適しているのか」というのを掴もうと思って、フレームワークの特徴を覚える為に軽く触っては次へ、という事をやってます。

レポート

インストール

ドキュメント 3. Getting Started を参考にBlueBreamをインストールするところから。

まずインストールからかなりつまづきました。詳細は省くというか原因自体把握できていないのですが、pipからのインストールでいろいろエラーが出ました。この所為で午前中と午後の1時間半くらいは消費…。
最終的に、tarballを展開してsetup.pyからインストールした場合は問題なくインストールが出来ました。

チュートリアル開始

ドキュメント 5.Tutorial - Part1 を見ながら進めました。

このチュートリアルでは、シンプルなIssue Tracking Systemを作るようです。

paster create -t bluebream

で、プロジェクトの情報を対話的に入力するとディレクトリが作成され、そこに必要なファイル一式が生成されている。

cd <project name>
python bootstrap.py

bootstrap.pyはbuildoutのセットアップスクリプトですね。
bin/buildoutコマンドが作成されます。

./bin/buildout

buildoutがBlueBream開発用の環境を整えてくれますが、かなり時間がかかります。依存しているzope関連モジュールが多いので、そのダウンロードとセットアップに時間がかかっている模様。完了まで30分くらいかかってたかも。
あまりに長かったので、Pyramidのroutesalchemyチュートリアルも少し進めてました。

その後は各種設定ファイル(buildout, pastedeploy, zope)の中身についての解説がつらつらと。
他のフレームワークもだいたいそんな感じでしたが、BlueBreamの設定ファイルも本番用(deploy)と開発用(debug)の2種類が用意されており、本番に出す時はdebugにしないようにね、等の注意書きもありました。

永続化オブジェクトを体験する

インストールと設定についての説明が終わると、アプリケーションオブジェクトの作成に入ります。
BlueBreamでは、他のZope関連プロダクト(Ploneなど)と同様、データの永続化にはオブジェクト指向データベースであるZODBを用います。
オブジェクトをpickle化してファイルストレージに保存することで、Pythonオブジェクトのまま取り出して使ったりできます。

チュートリアルではpasterのサブコマンドとして定義されたshellコマンドを使って、

  • 永続化オブジェクト用のクラスを作成
  • ルートオブジェクトに作成した永続化オブジェクトを保存
  • shellを立ち上げ直してもオブジェクトが取得できる事(永続化されていること)を確認

という流れで、簡単な使い方が理解できます。
ZODBはトランザクションをサポートしているため、ルートオブジェクトにオブジェクトを格納しても、コミットしない限りは実際の保存は行われないようです。

スキーマを定義する

この後は、アプリケーションオブジェクトのスキーマを、zope.interfaceモジュールを利用してinterfaceクラスとして定義していくのですが、この辺りで時間切れでした。

おわり

こんな感じで中途半端なところで終わってしまいました。始めにインストールでグダグダしていた時間のロスは大きかった…。あと英語力が無いのでブラウザのアドオンで翻訳しながら読み進んでおり、進みは遅かったと思います。
成果発表するレベルでも無いなあと思って発表には参加しませんでした。やってみた事はまとめたのでお許しを…。
次回に参加する時は何か発表できればいいと思います。