2011-07-09

Stay alert, trust no "Py3k ready", keep your pdb handy

Python mini Hack-a-thonに行ってきた。
Python3で何か動かすところまでやろうとして挫折したメモ。

ベースの環境はMacPortsのpython32, py32-distribute, py32-virtualenvを使った:
  • python32 @3.2_2+no_tkinter+universal
  • py32-distribute @0.6.19_0+universal
  • py32-virtualenv @1.6.1_0+universal

1. VirtualEnvは大丈夫
virtulenvは動く。というよりも、これが動かないと話にならん。

2. pipコマンドが動くと思うな
たいていは動くんだけど、時折入れられないパッケージがある。
バージョン比較とかをするところでintとstrを比べようとして落ちるケースが非常に多い。
次に多いのはsetup.pyにprint文が入っているケース。
PyPIのインデックスはバージョンごとに分かれている方がいいんじゃないかなあ、と思ったりするわけです。

3. buildoutだめ
http://pypi.python.org/pypi/zc.buildout/2.0.0a1を見るとbootstrap.pyを拾ってきて使えとあるけど、pipと同じようにバージョン比較だの何だのでよく落ちる。
2.0.0a1を使っているはずなのに、途中で1.5.2のeggがインストールされていたりとかrecipeがPython3で動かないとかが当たり前のように起きるので、今のところ全く使えないと思った方がよい。

4. フレームワークはtornadoくらい
「何か」動かすと言っても、素で書いたやつで動かしたって、きょうび意味ないのでWebフレームワークの系統をアレコレ見てみたけど、Zope, Django, Pylons, Werkzeugあたりが全滅状態。 (ここ見るとよい http://python3wos.appspot.com/)
tornadoが動くっぽい所までは見た。全部の機能を動かしたわけではないけど、もともと小さいフレームワークだし対応が早かったんだろうなあ。
逆に言うと重量級のフレームワークが移植されるのは時間がかかること必至なので、マイクロフレームワーク全盛期がPython3の時代になっても続くのかもしれん。
そういう意味ではチュートリアル本もPython3ベースに移行しつつあるけど、なにか作ってみましょうというところで有名どころのフレームワークを使えない状況が続くとなると、兎も角も現時点で使えるフレームワークで書くことになると思うので「ZopeからPythonに入りました」とか「DjangoからPythonを始めました」なんていうクラスタが無くなって、tornadoとか、まだ見ぬマイクロフレームワークとかからPythonに入ってくる人が増えるのかねえ。
増えるわきゃないか。RubyはRailsが1.9で動くようになっているので、ZopeとかDjangoとかが動かないっていう所で、Pythonista人口の今後の変動に影響があるかもね。

5. Jinja2, SQLAlchemyはいける、IPythonがないのが地味につらい
足回りのライブラリは徐々に対応が進んでる感じだった。pytz, Jinja2, SQLAlchemyあたりが動くのは単純にうれしい。
IPythonが動かないので、素のインタプリタを1日使ったのだけれど、例外吐いたりしたときに調べるのが大変だったり、help見るのが面倒だったりして地味につらかった。IPythonは早くPy3k移行が進んでほしい。

6. SQLAlchemyからMySQLに繋がらない
これがトドメ。2-3個ドライバを変えて試したけど全部例外に落ちてしまった。ここ見るといくつか通るはずなんだけどね。statementにstrを期待されているところで、なぜかbytesになっていたり、bytearrayになっていたりで変数置換落ちする。
"Py3k ready"となっていても、実際には3.1までで、3.2じゃ動かなかったりとかそういうのなのか。

という感じで、作業環境をPython3に移行可能かという調べ物は、4時間ほどで頓挫。
失敗した記録として残しておく。

2011-03-31

Merlotをインストールして動かす

Mac OS Xで Merlot を動かすためのメモ。
Installing Merlot のドキュメントに書いてある通りで動くけど、せっかく日本語にしたので開発ブランチを使ってみましょう。
Google CodesにあるMercurialリポジトリをミラーして、VirtualEnvを組んで、buildoutを叩いたらインストール終わり。

一応コマンドリストだけでも書いておく:

$ hg clone https://merlot.googlecode.com/hg/ merlot
$ virtualenv --distribute --no-site-packages merlot
$ cd merlot
$ source bin/activate
$ python bootstrap.py
$ buildout

ここで、なぜかmechanizeのインストールに失敗することがある。エラーを見るにアーカイブをダウンロードしているときのレスポンスヘッダでContent-Lengthが"382313, 382313"みたいな感じでカンマ区切りで2個帰ってくるのがパースできないらしい。
RFC2616を見てみたところ、Content-Lengthヘッダは1*DIGITで書かなきゃいけないので、まあ、お行儀の悪いWebサーバーなのだろうけど、インストールプロセスが止まっちゃうのは困る。
なので、distributeのコードにパッチして無理やり通してしまった。virtualenvだと、こういう時にためらわずできていいね。

--- eggs/distribute-0.6.14-py2.7.egg/setuptools/package_index.py.orig     2011-03-26 15:00:28.000000000 +0900
+++ eggs/distribute-0.6.14-py2.7.egg/setuptools/package_index.py     2011-03-26 15:23:07.000000000 +0900
@@ -566,7 +566,10 @@
             bs = self.dl_blocksize
             size = -1
             if "content-length" in headers:
-                size = int(headers["Content-Length"])
+                try:
+                    size = int(headers["Content-Length"])
+                except ValueError:
+                    size = int(headers["Content-Length"].split(",")[0])
                 self.reporthook(url, filename, blocknum, bs, size)
             tfp = open(filename,'wb')
             while True:

で、パッチしたらもう一度buildoutを打つ。


$ buildout
$ merlot

merlotコマンドを打つと、grokフレームワークの簡易サーバが立ち上がるので、Webブラウザで 127.0.0.1:8080 にアクセスする。基本認証を聞かれるので、admin:adminで突破。このページはgrokフレームワークの管理画面らしくて、ホスティングするアプリケーションを追加、削除するためのもののよう。

"Name and create a new Merlot application" の所に適当に名前を入れて"Create"すると、インスタンスができる。名前はURLのトップディレクトリに使われるので、そこだけ気にすればよさそう。
とりあえずmerlotという名前で作ったことにする。

"Installed Applications" に新しくできたリンクをたどるとMerlotの世界へ。


こんな感じのトップページが来る。
この状態だと、rootディレクトリで打ったadminユーザーの基本認証を引き継いで動いているので、"ユーザー"タブから新しいユーザーを追加して、一旦ブラウザーを閉じてしまう。"ログアウト"はフォームで認証したときにCookieを消すだけなので、基本認証では効かない。次からのアクセスでは基本認証を使いたくないので、URLには 127.0.0.1:8080/merlot を使うこと。
この後は、"クライアント"を作って、"プロジェクト"を作って、"タスク"を作って、"ログ"を記録する。という流れになるんだけど、くわしくは次の記事で。

ところでWindowsを持っていないので動かしていないけど、誰か環境つくって手順もあるなら教えてください。

2011-03-27

Merlotに手を出してみた

第6回Python mini Hack-a-thonに行ってきた。
作っただけで放置しているプライベートプロジェクト某とか、同某とかの再開準備をしようかと思っていたけど、朝出掛けにこんなTweetを見てちょいと使ってみようかという気になったので、バージョン0.1が出たばかりのMerlotというアプリケーションに手を出してみた。"Project Management Software"なので、てっきりBTSを想像していたら、Timing and Estimateに特化したタスク管理ツールで、「クライアント (Client) < プロジェクト (Project) < タスク (Task) < ログ (Log)」という構成でタスクごとに使った時間を収集するようになっている。
Version 0.1で実装済みなのはデータ入力の部分が中心で、特にWorkLogの所はAjax実装とかもあってどんどん入力できる感じになっている (でも、消化時間の計算が入力直後に連動してなかったりするところが若干残念)。レポーティングはスクリーニングが取れるだけでまだまだこれからというところか。各モデルの属性も必要最低限な項目があるくらい。プロジェクトのロードマップもないので、今後どういう方向に拡張していくつもりなのかは、まだよく分からないけど、レポーティングの強化とか他のツールとの連携とかができるようになっていくんじゃないかなあ、と触ってみて思った。
いずれ多数顧客の多数プロジェクトでROIとかを計ろうとかいうことに完全に特化しているので、ニーズがばっちりはまるケースでは、現状のバージョンでも使えるように思える。画面は結構きれいだし。
実装言語はPythonでzope3派生のgrokというフレームワークで作ってあるっぽい。zopeもgrokも今まで使ってなかったので中身の作りを見るのはこれからだけど、poファイルを見つけたのでとりあえず日本語カタログを作って送りつけてみた。メッセージ翻訳周辺のツールはzc.i18nとかPasteScriptとかzc.buildoutで整備されていたので純粋にpoファイルを翻訳することに集中できたのは最近のツールの特徴になるのかなあ。中身のコードはというと、はじめて使うフレームワークだし周辺ツールも使ったことがないパッケージが大量にあるので、まだ全然見られていない。これから調べつつ順次見ていくという事になると思う。パッチとかも書いていくなら本格的にMercurialの使い方を身につけないといかんし。
今日一日で動かすだけはやってみたので、折を見てインストールの方法とか、ジャンプスタートとか、開発環境の作り方とか書いていく予定。今日は速報ということで。