いまは世界中でPyConが開催されています。PyConというのはPython Conferenceのことです。それらの中でも一度は行ってみたいと思うのがPyCon
筆者が参加したPyCon 2012は、
本稿の読者もPyConへ行こうと思ったときにその全体像が分かるよう、
Travel:旅行
参考までに渡航記録をまとめておきます。筆者は一人旅行だったのですが、
海外のカンファレンスに参加した経験がない方は、
- (特に初日は)
移動や会場探しで迷う心配がない - 荷物が多くなったら部屋に置いてこれる (受付後や展示ブースでパンフレットやノベルティをたくさんもらう)
- 忘れものをしても取りに行ける
- カンファレンス中に疲れたら部屋へ戻って休める
- 遅くまで会場に残ってイベントに参加したり、
他の参加者とやり取りできる
同じホテルに泊まることで移動やちょっとしたトラブルを避けることができるかもしれません。
筆者が本カンファレンスへ参加するのにかかった費用は次の通りです。
項目 | 金額 |
---|---|
PyCon | \23,800/$300 |
チュートリアル | \11,899/$150 |
ホテル宿泊費 | \47,672/$577 |
往復航空券 | \62,900 |
その他諸税等・ | \55,720 |
成田空港施設使用料 | \2,040 |
成田旅客保安サービス料 | \500 |
合計すると204,531円になります。為替が1ドル80円程度でした。この中に食費は含まれていませんが、
往路は成田 - ロサンゼルス - サンノゼと空路で移動しましたが、
PyCon 2012 概要
PyCon 2012は、
3月7日、
![基調講演が行われたカンファレンス会場 基調講演が行われたカンファレンス会場](/assets/images/news/report/2012/03/2801/thumb/TH800_001.jpg)
Tutorial:チュートリアル
チュートリアルは、
試しにGraph Analysis from the Ground Upという、
グラフとは、
チュートリアルでは、
![ファイルシステムのグラフ表現 ファイルシステムのグラフ表現](/assets/images/news/report/2012/03/2801/thumb/TH800_002.png)
$ tree foo foo ├── bar │ ├── baz │ │ └── f1 │ └── f1 ├── f1 ├── f2 ├── f3 └── hoge ├── f1 └── f2
import os
import networkx as nx
import matplotlib.pyplot as plt
def build_fs_graph(directory):
g = nx.Graph()
for root, dirs, files in os.walk(directory):
for node in dirs + files:
g.add_edge(root, os.path.join(root, node))
return g
g = build_fs_graph("foo")
nx.draw(g)
plt.show()
講師のVan Lindbergは一般の講演も行っていて、
- 誰と誰がよく話しているか
- メーリングリストの中で関心の高い話題は何か
- “最適化”という話題に対して最もコメントしている人は誰か
以下から講演内容とビデオが参照できます。
PyWeb Summit:PyWebサミット
3月9日にチュートリアルとは別にPYTHON WEBDEV SUMMITというパネルディスカッションがありました。PythonによるWeb開発に関する様々な話題について、
![Python Web Development Summit Python Web Development Summit](/assets/images/news/report/2012/03/2801/thumb/TH800_003.png)
丸1日に渡り、
![パネリスト(左から Jim Fulton、Tarek Ziade、Kenneth Reitz、Ian Bicking、Nate Aune) パネリスト(左から Jim Fulton、Tarek Ziade、Kenneth Reitz、Ian Bicking、Nate Aune)](/assets/images/news/report/2012/03/2801/thumb/TH800_004.png)
モデレーターのJacobからJavaのWARファイルでデプロイするような仕組みがPythonにはないという話しから議論が始まりました。
それに対してIan BickingのPython application packageのアイディアという記事を受けて、
また、
またC拡張ライブラリを必要としないPythonアプリケーションであれば、
最終的にパネルディスカッションのまとめとしては、
興味のある方は、
Introduction:開会の挨拶
カンファレンスの基調講演の前に、
![Jesse Noller(左)とSteve Holden(右) Jesse Noller(左)とSteve Holden(右)](/assets/images/news/report/2012/03/2801/thumb/TH800_005.jpg)
彼はPyConの運営にあたって、
個人の背景を述べながら、
そのビデオがIntroduction and Welcomeです。Jesse Nollerは4分過ぎから登場します。また、
Keynote:基調講演
3日間に及ぶカンファレンスでは、
Frighteningly Ambitious Startup Ideas(とんでもない起業家たちのアイディア)
ハッカーでありエッセイストでもあるPaul Grahamの基調講演です。Paul GrahamとPythonで筆者が思い浮かべるのは、
彼が驚く起業家たちのアイディアとして、
- 新しい検索エンジンを作る
(4:10) - Eメールを置き換える
(7:30) - 大学を置き換える
(11:50) - ハリウッドをやっつける
(13:45) - 新しいApple
(17:10) - ムーアの法則に戻る
(21:00) - 継続的な診断
(26:25)
基調講演の内容がエッセイとして公開されているというのも珍しい気がします。それぞれのタイトルだけを見ると
最後に戦略的なアドバイスとして、
つまり、
Paul Graham PyCon 2012 keynote | Hacker Newsでもたくさんコメントが寄せられています。
BDFL Keynote:慈悲深き終身独裁者の基調講演
Pythonの作者であるGuido Van Rossumの基調講演です。ビデオはKeynote Guido Van Rossumで公開されています。
冒頭にGuidoの心を打ったアートとして、
本題はPythonに対して、
- 言語の比較
(5:15) - Python 3
(7:35) - PyPy
(12:30) - 動的型付け
(18:40) - 速度
(26:00) - GIL
(32:30) - 非同期 I/
Oと並列性 (36:35) - ブラウザ
(41:30) - モバイル
(42:30) - 関数型プログラミング
(44:25) - 標準ライブラリ
(49:00) - ガベージコレクション
(53:55) - 言語の進化
(55:30)
これらの質問の中から筆者が興味深かったものを紹介します。
Language Comparisons(言語の比較)
- "Python sucks. Ruby Rules."
(Python キモイ、 Ruby こそ最高だ)
PythonはPerl/
誰もがお気に入りの言語が良いものだと誇りたいのは分かるけれど、
Python 3
- "When will you admit Python 3 is mistake?"
(いつPython 3は間違いだと認めるのか?) - "When will we finally get to see Python 2.
8 release?" (いつPython 2. 8を目の当たりにできるのか?)
Python 3は良いものであるし、
そしてPython 2.
3月9日のPYTHON WEBDEV SUMMITのパネルディスカッションでもPython 3への移行についての議論があり、
Functional Programming:関数型プログラミング
- "Why did you kill reduce()?"
(どうしてreduce()をなくしたの?) - "Please fix lambda."
(lambdaを何とかして) - "Please add more functional features."
(もっと関数型の機能を追加して)
Guidoも関数型言語が大好きで、
Pythonは、
またPythonにもmapやlambdaといった組み込み関数など、
Talks:講演
カンファレンスの講演は5つのトラック
筆者は主にテスト関連の講演に参加したため、
pytest - rapid and simple testing with Python:Python での速くて簡潔なテスト
発表者はpytest作者のHolger Krekelです。
![Holger Krekel Holger Krekel](/assets/images/news/report/2012/03/2801/thumb/TH800_010.png)
pytestは以下のすべてのテストフェーズに適用できるツールです。
- ユニットテスト
(1つの関数/クラス単位のテスト) - インテグレーションテスト
(複数の機能に対するテスト) - システムテスト
(一連の、 ブラックボックスのようなテスト)
pytestの特徴として以下の3点を挙げていました。
- Cross-Python
- Python 2.
4-2. 7,Pthon 3,PyPy,Jythonのサポート
- Python 2.
- Pythonicスタイル
- xUnit/
JUnitではないPythonらしいシンプルなスタイル
- xUnit/
- テストリソースインジェクション
- テスト関数やその引数をフックするユニークなDI
(依存性の注入)
- テスト関数やその引数をフックするユニークなDI
![pytest - rapid and simple testing with Python pytest - rapid and simple testing with Python](/assets/images/news/report/2012/03/2801/thumb/TH800_009.png)
以下から講演内容とビデオが参照できます。
pytestの特徴をサンプルコードと共に簡単に紹介します。
分かりやすいassertレポート
様々なデータに対してassertに失敗するデモプログラムを実行してみます。
$ pip install pytest $ hg clone ssh://hg@bitbucket.org/hpk42/pytest $ cd pytest $ py.test doc/example/assertion/failure_demo.py
pytestの優れた特徴の1つがテストに失敗したときのレポートです。次のtest_
________________________ test_generative[0] ________________________ param1 = 3, param2 = 6 def test_generative(param1, param2): > assert param1 * 2 < param2 E assert (3 * 2) < 6
文字列同士の比較では、
__________ TestSpecialisedExplanations.test_eq_long_text ___________ self = <failure_demo.TestSpecialisedExplanations object at 0x10194a510> def test_eq_long_text(self): a = '1'*100 + 'a' + '2'*100 b = '1'*100 + 'b' + '2'*100 > assert a == b E assert '111111111111...2222222222222' == '1111111111111...2222222222222' E Skipping 90 identical leading characters in diff E Skipping 91 identical trailing characters in diff E - 1111111111a222222222 E ? ^ E + 1111111111b222222222 E ?
同様に、
_____________ TestSpecialisedExplanations.test_eq_dict _____________ self = <failure_demo.TestSpecialisedExplanations object at 0x10194ab10> def test_eq_dict(self): > assert {'a': 0, 'b': 1} == {'a': 0, 'b': 2} E assert {'a': 0, 'b': 1} == {'a': 0, 'b': 2} E - {'a': 0, 'b': 1} E ? ^ E + {'a': 0, 'b': 2} E ?
リソースインジェクション
リソースインジェクションというxUnit/
- 一時ディレクトリ/
ファイルを使ったテスト tmpdirという引数名を使うことで一時ディレクトリ/
ファイルを使ったテスト を簡単に行えます。次の例ではtmpディレクトリ配下に“test.ini”ファイルを作成し、 Configオブジェクトの属性をテストしています。 from ConfigParser import ConfigParser class Config: def __
init__ (self, path): parser = ConfigParser() parser.read(path) self.extensions = parser.get("myscan", 'extensions').split() def test_config_ (tmpdir): path = tmpdir.join("test.defaults ini" ) path.write("[myscan]\n") path.write("extensions = .txt .rst", mode="a") config = Config(path) assert config.extensions == [".txt",]- パラメーターテスト
いわゆるデータ駆動テストです。デコレーターで任意の引数名に対してテストデータを渡します。
import pytest @pytest.
mark. ("numiter", range(10)) def test_parametrize func (numiter): assert numiter < 9- フィクスチャを分割するテスト
テスト関数とフィクスチャ定義のスクリプトを分割できます。conftest.
py にpytestのフック処理を記述すると、ディレクトリ単位で有効になります。 例えば、
テスト関数に対するparamという引数の変数名をフックしてテストデータとしてリストを返す処理をconftest. py に記述します。例えば、
次のようにconftest. py とtest_param. を作成します。py # conftest.
py の内容 def pytest_funcarg__ (request): return range(42) # test_param param. def test_py の内容 param (param): print("\nparam length is {0}".format(len(param)))test_
param. を実行します。長さ42のリストが渡されています。py $ py.
test -v -s test_ param. py ... test_ param. py:2: test_ param param length is 42 PASSED 実用的な機能としてFuncargRequest.
cached_ のscopeにより、setup() テストリソースのキャッシュの有効範囲を制御できます。また、 次のサンプルではscopeをコマンドライン引数で指定できるようにpytest_ addoption() で引数パーサーの処理をフックします。# conftest.
py の内容 def pytest_addoption (parser): group = parser.getgroup("general") group.addoption('--scope', action="store", dest="scope", default="module", type="choice", choices=["module", "function"], help=("set scope, default: module.")) def mysetup(): return range(42) def pytest_funcarg__ (request): scope = request.config.option.scope print(", scope is {0}".format(scope)) return request.cached_param setup (setup=mysetup, scope=scope) # test_param. def test_py の内容 param1 (param): print("id is {0}".format(id(param))) def test_param2 (param): print("id is {0}".format(id(param)))test_
scope. py を--scope=moduleで実行します。mysetup()で作成したリストがキャッシュされます。 $ py.
test -v -s --scope=module test_ scope. py ... test_ scope. py:2: test_ param1 , scope is module id is 4321280584 PASSED test_ scope. py:5: test_ param2 , scope is module id is 4321280584 PASSED test_
scope. pyを--scope=functionで実行します。今度はテスト関数単位でリストが作成されたことが分かります。 $ py.
test -v -s --scope=function test_ scope. py ... test_ scope. py:2: test_ param1 , scope is function id is 4321280584 PASSED test_ scope. py:5: test_ param2 , scope is function id is 4321283752 PASSED
講演の中では、
pytestプラグイン
設定ファイル、
- pytest-xdist:分散テストを目的としたプラグイン
- テストを複数プロセスで並列に実行する
- ファイルの変更を監視して失敗したテストのみを再実行する
- リモートホストにrsyncして複数環境でテストする
- pytest-pep8:pep8でコーディングスタイルをテストする
- pytest-cov:coverageでテストカバレッジを出力する
- pytest-timeout:テストにタイムアウト設定を行う
- oejskit:JavaScript向けのテストツール
Fast Test、Slow Test:速いテスト、遅いテスト
発表者はGary Bernhardtです。テストの目的は次の3つにあるというのが分かりやすかったです。
- リグレッションを防ぐ
- (リファクタリングに対する)
不安を防ぐ - 悪い設計を防ぐ
実際にテストコードを書くときは、
あるWebアプリケーションでSeleniumによるシステムテストに約10秒要したのが、
![テストコードのサンプル テストコードのサンプル](/assets/images/news/report/2012/03/2801/thumb/TH800_011.png)
以下から講演内容とビデオが参照できます。
Gaining Confidence through Security Testing:セキュリティテストで信頼性を高める
発表者はGeremy Condraです。次のようにセキュリティテストを定義していました。
- “normal tests + adversary -> security tests”
![Geremy Condra Geremy Condra](/assets/images/news/report/2012/03/2801/thumb/TH800_012.png)
adversaryという単語を筆者は初めて知ったのですが、
そして、
- コマンドインジェクション
- クロスサイトスクリプティング
- ディレクトリトラバーサル
セキュリティに特化したテストという、
以下から講演内容とビデオが参照できます。
PyPy
筆者がPyPyに疎くて詳しく紹介できないのが残念ですが、
また、
![基調講演でPyPyを語るDavid Beazley 基調講演でPyPyを語るDavid Beazley](/assets/images/news/report/2012/03/2801/thumb/TH800_013.jpg)
日本においてもpypy-jaが活発に活動しているので要チェックです。
Testing In Python Birds of a Feather / TiP BoF
カンファレンス初日の全講演が終わった後でオープンスペースのTesting BOFに参加しました。オープンスペースというのは、
![オープンスペースの説明 オープンスペースの説明](/assets/images/news/report/2012/03/2801/thumb/TH800_014.png)
Testing BOFは、
- テストツールがビヘイビア駆動開発
(behavior driven development) だ - テストツールが継承とCamelCaseを要求してる、
それはJavaじゃないのか - ドキュメントが腐ってる
- テストツールがプログラマーにしか使いこなせない
- 付属テストが動かない、
その名はオープンソースと言うんだ - テストは高速だけど、
実際には何もしてない - 誰もオレオレassert関数が理解できない
- テストツールがPython 3でしか動かない
- 得体の知れないmockライブラリだ
- WebテストツールなのにJavaScriptをサポートしてない
少しお酒が入っていたのもあり、
Lightning Talks:ライトニングトークス
ライトニングトークスは、
![ライトニングトークスの申し込み ライトニングトークスの申し込み](/assets/images/news/report/2012/03/2801/thumb/TH800_016.png)
Local Python Community:ローカル Pythonコミュニティ
印象に残っているのが、
他にもPyCon DE 2012やEuroSciPy 2012の発表を見かけました。ライトニングトークスでローカルのPythonコミュニティの発表をするのも良さそうに思えました。いつか日本のPythonコミュニティの紹介もしてみたいです。
Django Python 3 Support:DjangoのPython 3対応
EuroPythonと比較すると、
Djangoのリリースマネージャーを務めるJamesのライトニングトークスの中で2012年秋リリース予定のDjango 1.
筆者の周りにはDjango嫌いな方も何人かいますが、
Sprint:スプリント
スプリントは、
![スプリントボード スプリントボード](/assets/images/news/report/2012/03/2801/thumb/TH800_017.png)
Distutils2/packagingスプリント
1日目はDistutils2/
Distutils2のドキュメントやイシュートラッカーに目を通しながら、
![Distutils2/packaging スプリント部屋の風景 Distutils2/packaging スプリント部屋の風景](/assets/images/news/report/2012/03/2801/thumb/TH800_018.png)
pytestプラグイン開発
2日目はpytestのプラグイン開発をしていました。pytestの作者であるHolger Krekelがすぐ近くにいたので、
ランダムにデータを生成する機能を作りたいと相談すると、
サンプル実装で一通り動くようになり、
最終的な成果物がpytest-quickcheckプラグインです。
Holgerは、
あとがき・謝辞
海外のPyConに興味をもたれた方は、
筆者は、
カンファレンスを通してお世話になった方々がいます。この場を借りて皆さんにお礼を申し上げます。
岩下さん
Brian Dorsey
Ian Lewis
また、
![画像](/assets/images/news/report/2012/03/2801/thumb/TH800_019.png)