PyCon Taiwan 2012 イベントレポート Day 0

6月9-10日に開催された PyCon Taiwan 2012 に参加してきました。

初めて行った台湾ですが、羽田空港から飛行機で3時間半と近く、とても良いところですっかり気に入りました。そんな雰囲気が分かるレポートになっていると思います。記事は3人で執筆しています。

DevOps は開運!?

半月以上前のイベントですが、5月26日に DevOps Days Tokyo 2012 が開催されました。私はお手伝いも兼ねて参加していました。

John Wills 氏のスライド

冒頭のセッションで Enstratus 社の John Wills 氏がスライドに「開運」という文字を表示していました。

昨日、Jay(本イベントの司会で中心人物の堀田直孝氏)と、DevOpsの定義ってなんだろうね、という話をしていて、それは「開運」じゃないかということになり、じゃあ開運のスライドからはじめようと。

DevOpsを実践する企業に共通すること。DevOps Day Tokyo 2012 - Publickey

Jay が DevOps の定義を話しているうちに「開運」になったんだと聞いたのですが、私はその詳しい経緯がよく分かっていませんでした。

このときに来日していた John Willis 氏と Damon Edwards 氏が DevOps について語る DevOps Cafe Podcast & Videos - Show Notes という Podcast を提供しています。
その後、先日の DevOps Tokyo 2012 で収録した Podcast がアップロードされていました。

この対談には Jay も出てきますが、24分頃から「DevOps = 開運」になった経緯が語られています。

DevOps って日本語で何だろうね?

  • Develop x Operation = 開発 x 運用
  • Dev x Ops = 開 x 運

それで「開運」かと言えば、そのまんまでしかないのですが、この「開運」に秘められた意味としては、開 = Open, 運 = fortune、それなら open your luck! つまりは better fortune! ですねと言うやり取りが、なかなかに当たらずとも遠からずのような、英語と日本語の違いがあるものの、うまい言葉になったもんだと感心した次第です。

detox で tox テストを並列実行しよう

複数の Python バージョンでテストを実行するツールに tox があります。

tox ツールそのものがとても便利なのですが、この tox テストを並列実行してくれるツールがリリースされました。

既に tox を使っている環境であれば、detox をインストールするだけで良いです。

$ pip install detox

使い方は tox と全く同じで特別な設定は不要です。tox コマンドを実行する代わりに detox コマンドを実行します。試しに実行してみましょう。

(test)$ detox 
py26 create: /Users/t2y/work/repo/littlehttpserver/.tox/py26
GLOB sdist-make: /Users/t2y/work/repo/littlehttpserver/setup.py
py27 create: /Users/t2y/work/repo/littlehttpserver/.tox/py27
py32 create: /Users/t2y/work/repo/littlehttpserver/.tox/py32
py26 installdeps: :pypi:pytest, :pypi:pep8 
py27 installdeps: :pypi:pytest, :pypi:pep8
py32 installdeps: :pypi:pytest, :pypi:pep8
installdeps py26- py27/ py32-         

この例では、Python 2.6, 2.7, 3.2 の tox テストが並列実行され、依存パッケージのインストール中です。

最終的な実行結果です。

(test)$ detox 
GLOB sdist-make: /Users/t2y/work/repo/littlehttpserver/setup.py
py27 sdist-reinst: /Users/t2y/work/repo/littlehttpserver/.tox/dist/LittleHTTPServer-0.1.2.zip
py32 sdist-reinst: /Users/t2y/work/repo/littlehttpserver/.tox/dist/LittleHTTPServer-0.1.2.zip
py26 sdist-reinst: /Users/t2y/work/repo/littlehttpserver/.tox/dist/LittleHTTPServer-0.1.2.zip
py26 runtests: commands[0]    
py27 runtests: commands[0]               
py32 runtests: commands[0]               
_______________________________ summary ________________________________
  py26: commands succeeded
  py27: commands succeeded
  py32: commands succeeded
  congratulations :)

1つの tox 環境でテストが通ったときに素早く他の環境でも実行したい、ちょっとした修正を行ったときに他の環境でも一応テストしてみたい、といった用途にとても便利です。何よりも CPU パワーが有り余ってるマシンで並列処理を実行するのは気持ち良いです。

detox は、並列処理に eventlet を使っていて、detox のソース自体も百数十行というシンプルなものです。eventlet の GreePool から greenthread でプロセスを実行しているようです。私は eventlet を使っているソースを初めて見かけたので興味深かったです (^ ^;;

pytest のドキュメントを翻訳しました

Python のテストツールに pytest があります。ここ最近、徐々にテストを書くのに慣れてきて、さらにテスト設計や知見を高めようという思いが強くなってきました。

pytest は、wikipedia:設定より規約 を設計原則とするツールです。Python は明示する文化なのでやや違和感を感じる人もいるかもしれません。さらに xUnit スタイルではない funcarg という関数の引数をフックしてリソースインジェクションを行う仕組みを提供するなど、私にとっては新たな概念を学ぶのにおもしろそうな題材に見えました。

Holger Krekel 氏と出会い

先日 PyCon US 2012 に参加して、pytest の作者 Holger Krekel 氏と出会い、話すことができました。

最初に会ったのはカンファレンスが始まる前日のチュートリアルデーで、手持ち無沙汰な様子に見えたので、ランダムデータテストのやり方を相談してみると、pytest のパラメーターテストやフックの仕組みを教えてくれました。そこで顔を覚えてもらったせいか、その後のカンファレンスやスプリントを通して、サンプル実装したコードをレビューしてもらったり、アドバイスをしてもらったりして、最終的な成果物が以下のプラグインです。

カンファレンスも彼の発表を聴講しました。

pytest ドキュメント翻訳

日本へ帰国後、すぐに pytest の翻訳を始めました。

本当は2週間ほどで完了し、4月中旬には出来ていました。その後、メーリングリストで Holger 氏と翻訳ドキュメントの公開やメンテナンスについてやり取りをして、最終的には pytest 本体に翻訳ドキュメントを取り込んでもらいました *1 。とはいえ、やはり Sphinxi18n 機能を使った方が良いかどうかを協議中だったりします。

以下で和訳されたドキュメントが公開されています。

今後のバージョンアップに伴うメンテナンスも継続的に行います。誤字/脱字、誤り翻訳などあれば、こちらまで ご連絡頂けると助かります。

*1:2ヶ月近くかかった理由は Holger 氏が5月末まで休暇中だったため

pytest-pep8 を 0.7 から 0.8 にアップグレードしたらテストが失敗するようになった

タイトルは釣りです。

pytest で pep8 のテストを行う pytest-pep8 プラグインがあります。次のようなサンプルコードを用意します。

(test)$ vi sample.py 
x=3
class A(object): pass

def f(x):
    return x

このサンプルコードを pep8 でチェックすると、たくさんのエラーが出ます。

(test)$ pep8 -r sample.py 
sample.py:1:2: E225 missing whitespace around operator
sample.py:2:1: E302 expected 2 blank lines, found 0
sample.py:2:16: E701 multiple statements on one line (colon)
sample.py:4:1: E302 expected 2 blank lines, found 1
sample.py:6:1: W391 blank line at end of file

同じように pytest-pep8 0.7 で実行します。

(test)$ py.test --version
This is py.test version 2.2.4, imported from /Users/t2y/.virtualenvs/test/lib/python2.7/site-packages/pytest.pyc
setuptools registered plugins:
  pytest-pep8-0.7 at /Users/t2y/.virtualenvs/test/lib/python2.7/site-packages/pytest_pep8.pyc

(test)$ py.test --pep8 sample.py 
========================= test session starts ==========================
platform darwin -- Python 2.7.3 -- pytest-2.2.4
pep8 ignore opts: (performing all available checks)
collected 1 items 

sample.py F

=============================== FAILURES ===============================
______________________________ PEP8-check ______________________________
/Users/t2y/tmp/t/sample.py:1:2: E225 missing whitespace around operator
x=3
 ^
/Users/t2y/tmp/t/sample.py:2:1: E302 expected 2 blank lines, found 0
class A(object): pass
^
/Users/t2y/tmp/t/sample.py:2:16: E701 multiple statements on one line (colon)
class A(object): pass
               ^
/Users/t2y/tmp/t/sample.py:4:1: E302 expected 2 blank lines, found 1
def f(x):
^
/Users/t2y/tmp/t/sample.py:6:1: W391 blank line at end of file

^

======================= 1 failed in 0.01 seconds =======================

全く同じエラーが出ます。何もオプションを付けずに使っている分には問題ありません。

ここで pytest.ini に PEP8 のコーディングスタイルを無視するオプションを追加します。

(test)$ vi pytest.ini 
[pytest]
pep8ignore = E302 E701

E302 と E701 のエラーだけを無視して、E225 と W391 のエラーは出力されるはずなのですが、、、

(test)$ py.test --pep8 sample.py 
========================= test session starts ==========================
platform darwin -- Python 2.7.3 -- pytest-2.2.4
pep8 ignore opts: E302 E701
collected 1 items 

sample.py .

======================= 1 passed in 0.01 seconds =======================

pytest-pep8 0.7 では、テストが成功してしまいます。これは pep8ignore に設定した無視したいエラー総数が、PEP8 違反としたいエラー総数よりも多いときにテストが成功してしまう不具合がありました。

pytest-pep8 0.8 ではこの不具合が修正されています。

(test)$ pip install pytest-pep8==0.8
(test)$ py.test --pep8 sample.py 
========================= test session starts ==========================
platform darwin -- Python 2.7.3 -- pytest-2.2.4
pep8 ignore opts: E302 E701
collected 1 items 

sample.py F

=============================== FAILURES ===============================
______________________________ PEP8-check ______________________________
/Users/t2y/tmp/t/sample.py:1:2: E225 missing whitespace around operator
x=3
 ^
/Users/t2y/tmp/t/sample.py:6:1: W391 blank line at end of file

^

======================= 1 failed in 0.01 seconds =======================

今度は正しく E225 と W391 のエラーが検出されましたね。

おそらく pep8ignore オプションを設定していると、1つ2つのエラーを見逃してしまっている可能性があります。あるとき pytest-pep8 をアップグレードしたら、ソースいじってないのにエラーが出るようになったと不思議に思うことがあるかもしれません。

参考までに修正された内容です。

もしかしたら、あるときに pep8 の API 仕様が変わったのかな?詳しく調べてはいません。

virtualenvwrapper のドキュメント (和訳) を更新しました

2010-12-31 に virtualenvwrapper のドキュメントを翻訳したときのバージョンは 2.6.1 でした。

現時点の最新バージョンは 3.2 です。その後も着々と機能拡張、バージョンアップが行われているようです。

ドキュメント (和訳) の更新内容

その他の主なドキュメントの更新内容を紹介します。

インストール

最もドキュメントの追加が多かったのがインストールに関する内容でした。

MSYS 環境や拡張プラグインによる PowerShell 環境のサポート、さらに mkproject コマンドによるプロジェクト管理機能が追加され、全般的な設定 にそういった説明も加わっています。

まとめ

開発者の Doug Hellmann は、積極的にユーザーからの要求に対応したり、バグ修正を行っています。またドキュメントもきちんと更新しています。

更新した和訳ドキュメントの Pull リクエスト を送ったところ、数時間でマージして、Web サイトも更新してくれました。virtualenvwrapper のような、多くのユーザーに使われるパッケージを保守するのは大変かもしれませんが、開発が活発で楽しんでいるのかもしれませんね。