9月13日(金) ~16日(月)にかけて、新宿の工学院大学とホテルローズガーデン(チュートリアル会場)で開催されたPyCon APAC 2013に参加してきました。セッション、LT、パーティ、開発スプリントとさまざまなイベントが行われるPythonの祭典を楽しんできましたので、参加レポートをまとめたいと思います。
PyCon APAC 2013とは
この記事を読んでいる方は、PyConについてご存知の方も多いと思います。また、海外のPyConや去年の参加レポートも上がっているので、読まれた方も多いのではないでしょうか。
PyConとはPythonユーザが集まり、Pythonに関する知識を共有したり、Pythonの輪を広げるためのカンファレンスです。今年はへび年ということもあり「The Year of Python」をテーマとし、日本の参加者も海外の参加者も垣根なく、交流しやすいイベントを目指しています。
今年の参加者は500人以上。日本で開催されるPyConとしては4回目ですが、毎年規模が大きくなっています。筆者は参加していませんが、第1回目のPyCon mini JPは136人だったそうなので、比べると4倍の人数が来たことになります。
初日オープニングの模様、この後キーノートで会場は満席に
さらに、今年のPyConは特別です。PyCon JPではなくPyCon APACです。APACとはAsia Pacificの略で日本を含む、アジアから太平洋にかけての地域を指します。キーノート、セッション、ランチの会場を見ても、多くの方々が英語で会話されていました。アジア圏の方も多く、日本人と見分けがつかないことも多いのですが、全員が名札を下げているため、これを見れば海外の方なのか日本の方なのかはわかります。
筆者がいただいた名札
キーノートのお二人も海外の方で、Georg Brandlさんがドイツのミュンヘンから、Rian Hunterさんがアメリカのサンフランシスコからの参加です。もちろん、発表は英語で行われます。
その他のプログラムも英語と日本語のセッションが半分ずつ用意されていました。英語と日本語で部屋が分かれており、セッションの場所を探す際にわかりやすい配置になっていました。このことからも、今年のPyCon APAC 2013が国際色豊かなイベントだったことがおわかりいただけると思います。
会場MAP(抜粋) 。部屋ごとに「日本語」「 英語」に分けられています
この参加レポートでは、3回に渡りセッションの内容を中心にPyCon APAC 2013の雰囲気をお伝えしたいと考えています。第1回として、基調講演の内容をお届けします。
1日目基調講演 Georg Brandl氏 ─Python and Neutrons, or how to make it fun to move motors
初日の基調講演はPythonのコアデベロッパであるGeorg Brandlさんです。Pythonで書かれたドキュメンテーションシステムであるSphinxの作者としても知られています。現在は、物理学のドクターをとるためにミュンヘン工科大学に籍を置いているそうです。
Georg Brandlさん
講演ではGeorgさんに関わる2つの話題に触れていました。1つは、GeorgさんがPython 3.2とPython 3.3のリリースマネージャであることから、Python 3の現状関する話題、もう1つは、現在、物理学のドクターをとるためにサイエンスに携わっているということで、Pythonとサイエンスに関する話題です。プログラミング言語自体に詳しくないサイエンスの人たちが、コアデベロッパであるGeorgさんと一緒にPythonを使いながら研究できるのは羨ましい限りです。
Python 3.3とPython 3.4の現状
「Python 3.3は去年の9月にリリースされたからみんな使ってね」とのこと。3.3で追加された新しい機能について紹介がありました。
yield fromが追加
importlibがデフォルトで使用されるように
virtualenvが標準で組み込み
デバッグ支援のためのfaulthandlerの追加
FileNotFoundErrorなどの例外の追加
ipaddressモジュールの追加
namespace packageサポート
u"..."の復活
このあたりはおさらいといった形で軽く触れていました。
これに対して、Python 3.4はalpha 2が今週中に、正式リリースは2014年の2月に出るよ、とアナウンスがありました。こちらはぜひテストして、問題があったらレポートよろしく! とのこと。Python 3.4で新しく追加される機能についても軽く言及がありました。
enumモジュールの追加
tulipと呼ばれる非同期ライブラリが追加(されるかも)
多くのPEPがディスカッション中
こちらはさすがにAlphaバージョンといった感じで、まだまだ決まっていないことが多いようでした。
続いて、Python 2からPython 3への移行の話に移ります。Python 3にどれぐらいのライブラリが対応しているのかを、2008年から現在までを棒グラフで表した図を使って説明しました。現在2,500パッケージ、全体の約8パーセントがPython 3に対応しているそうです。ただし、PyPIに登録されたインデックスを元に出した値なので参考値程度と考えて欲しいとのことです。
また、Python 3 Wall of Superpowers のサイトを引用して、どれぐらいのパッケージがPython 3に対応しているかも話していました。
スライド右側が「Python 3 Wall of Superpowers」の対応図、緑色がPython 3対応パッケージになっている
Pythonと中性子
ここから話がPythonから物理学に移ります。英語で聞いていたせいもあって、なかなか話が追いつきませんでしたが、理解できたところを簡単にまとめてみます。
まずは、The FRM II という施設について説明がありました。The FRM IIは研究用の原子炉で、ドイツの中性子の研究学会(日本のJ-PARCという団体に近いと言っていました)が運営しているそうです。20メガワットもの火力エネルギーが中性子に対して使われているそうです。Georgさんはこの施設で研究を行っているとのこと。
「The FRM II」の外観
施設内にある研究室には25個の研究用の機器があるそうです。これらはあくまで研究用で、人を傷つけたりするのには使ってないよ、と言っていました。冗談で "APERTURE LABORATORIES" みたいなことはしてないよ、と言っていたのですが、どうやらPORTALというゲームに出てくる研究施設の名前のようです。
なぜ中性子の研究をしているかという話で、例としてHDDを挙げていました。サイエンス誌に取り上げられた「Writing and Deleting Single Magnetic Skyrmions」という論文では、中性子を使った技術を使うと、HDDに格納するビットを100分の1に圧縮できるという話が載っているそうです。
この後、ふだん使用している機器を紹介した上で、Pythonを使ったこれらの機器の制御の話に移っていきます。中性子の研究用機器には以下の特徴があるようで、これらを考慮して制御システムを作る必要があると話していました。
多くの異なった機器が存在する
1回の計測でいくつもの設定項目が存在する
制御する機器が多く存在する
モーター
中性子あるいは、その他の計測対象の検出装置
環境試料
たくさんの研究者がこの施設を使いに来るので、ユーザの使い勝手を考慮する必要がある
また制御システムの要件として以下の4つが挙げられ、それを満たすためには柔軟で簡単なプログラミング言語が求められると話をPythonに持っていきます。
すべての機器にアクセス可能なこと
すべて自動化でき、スクリプトが自分で書けること
新しい機器が導入されてもすぐにアクセス可能になること
ユーザがこのシステムを数時間で学習可能なこと
プログラムをまったく知らないわけではないが、詳しくは知らないユーザ向けのシステムといったところでしょうか。確かに研究で使う場合、こういった層向けのシステムが求められそうです。
続いて、制御システムを構築するためのライブラリであるNICOS の紹介です。NICOSはNetworked Instrument Control Systemの略で、FRM IIで使われている中性子散乱実験用のライブラリだそうです。
実験に必要な機能がすべて入っているそうで、開発者と科学者の橋渡しをするようなライブラリだと話していました。実際にCLIから機器のデータを読む例や、機器に対応したクラスを定義するコードの例を紹介していました。
import serial
from nicos.core import Moveable, Param
class PowerSupply(Moveable):
parameters = {
'port': Param('Serial port', type=str, mandatory=True)
}
def doInit(self):
self._serial = serial.Serial(self.port)
def doRead(self):
return float(self._serial.communicate('I?'))
def doStart(self, value):
self._serial.communicate('I=%f' % value)
使用できる機器のリストが左側に表示され、右側に命令を入力するためのプロンプトが表示されたGUIも紹介していました。
なぜ、Pythonを使うのか
スライドの3分の2を過ぎたあたりで、話の中心がPythonに移っていきます。まずは、なぜPythonを使うのか。例として機器の情報のキャッシュに使用しているデーモンを挙げ、以下の3つがPythonを使うメリットとして挙げられると話しました。
たくさんのKey-Valueストアの実装が存在する
キャッシュに必要な機能(有効期限切れやキーの書き換え、自動更新など) が揃っている
1,000行ほどのシンプルなデーモンでも安定して数カ月間運用できる
さらに、Pythonのドキュメンテーションシステムの強力さにも触れ、help関数でクラスや関数のヘルプが簡単に見ることができること、reStructuredTextで書けば簡単に綺麗なHTMLを吐き出せること、もちろん、Sphinxが存在することをPythonの強みとして挙げていました。
もうひとつは、必要な機能がはじめから揃っていること。Georgさんは機器を制御するために、以下の標準モジュールを使っているそうです。
socketserver
logging
pickle
wsgiref
email
ctypes
最後のメリットとして、ユーザ体験の面に触れ、Pythonに科学者のコミュニティが存在すること、データの収集と分析が同じ言語でできること、計測のためのコードが簡単に書けることなどを挙げ、Pythonのユーザ体験が優れていることを説明していました。
おまけの効果として、ユーザの一人が地下鉄の時刻を検索するスクリプトを書いてくれたそうです。これで実験中にいつでも電車の時刻をチェックできると話していました。これはシステムを構築したプログラマーとして嬉しい効果ですね。
最後に、システムを初めて使うユーザのためのハックを紹介して講演は終了しました。
はじめは基調講演として異色な発表だと思い聞いていたのですが、いろいろな分野で利用されるのもPythonの魅力だと気づきました。よく利用される分野はWebアプリケーションを中心としたシステム構築だと思いますが、それ以外にも、2日目のRianさんの講演にもあるDesktopクライアントの開発、Georgさんの科学分野でのデバイス制御への活用やデータ分析への活用など、さまざまな分野のPythonistaが集まって行われるPyConはとても魅力的に感じます。来年もこういった自分の分野以外でのPythonの活用をキーノートとして聞きたいですね。
2日目基調講演 Rian Hunter氏 ─One Million Lines of Python
初日のGeorgさんの講演は同時通訳を使わずに聞いたのですが、Rianさんの講演では同時通訳を使わせていただきました。案内にあった通り、会場左奥に同時通訳用の機器が置いてあり、早めに席を確保しておかないと、席が埋まってしまう状況でした。
RianさんとDropbox、Pythonの関わり
アイスブレイク的にゼルダやドラゴンボールの画像から始まったRianさんの基調講演は、いかにDropboxがPythonを使って成功したか、という内容です。セッションの最後に言われた、
"You're gonna start $4 billion company with Python."
という言葉がとても気に入りました。私自身、起業し、Pythonで書いた自社サービスを運用しているので、とても共感できます。
RianさんはDropbox三番目のエンジニアで、創業期からDropboxにエンジニアとして関わっています。Rianさんは2008年のMIT卒業生で、大学時代からデータ同期アルゴリズムについて学んでいたそうです。Dropboxに入社し、数億人が利用するサービスを開発することで、これらの知識がさらに洗練されていったと言います。
Rianさんは2008年から2011年までDropboxのDesktopクラアントを担当しており、入社当時はWindows版しかなかったそうです。生粋のLinuxユーザであるRianさんは、自分でLinux版のDesktopクライアントを書くために入社したと話していました。
Rianさんが主に利用する言語はC、C++、Python、Haskellだそうです。Cを書くときは、自分ってすごい(C makes me feel competent) 、Haskellを書くときは自分って賢い(Haskell makes me feel smart)と思わせてくれると言います。では、肝心のPythonはというと、自分を気持よくさせてくれる(Python makes me feel good)そうです。確かに、Pythonを書いているときは気持ちよくプログラムを書いている気がして、 納得して聞いていました。
今日はもちろんPythonの話ということで、Pythonを使って大規模なシステムを開発する話題に移ります。
DroboxのコードはすべてPythonで書かれており、そのコードベースは937,707行にもおよぶそうです。働いているエンジニアは125人で、少し少ないよね、と冗談交じりに話していました。この90万行におよぶコードにはサーバもDesktopクライアントも含まれているそうですが、今日のメインの話はDesktopクライアントの開発についてです。
Rian Hunterさん
Pythonを使ったDroboxの開発
RianさんはDropboxのDesktopクライアントを開発する上で必要になる要素を4つ挙げました。
正確性(Must be correct)
速度(Must be fast)
リソース(Must be resource efficient)
ポータビリティ(Must be portable)
どれもDropboxのシステムをよく表している要素です。データを失うことは許されませんし、同期速度が遅ければユーザが離れていくと語っていました。
最後のポータビリティは難しい問題で、Mac、Linux、Windowsの違いはもちろんのこと、各OSのバージョンにも対応させたDesktopクライアントを動作させる必要があります。さらにはOSごとに異なるファイルシステムも考える必要があり、プログラマなら考えるだけでも嫌になる作業です。
Dropboxではこれらの難しい作業をすべてPythonを使って解決しているそうです。DropboxのDesktopクライアントには大きく4つの要素があります。
データ同期のためのコアプログラム(LARGE platform indepentet sync core)
各プラットフォームに依存したデータ同期のためのプログラム(small platform dependent file system implementation)
GUIのためのコアプログラム(LARGE platform independent GUI controller logic)
各プラットフォームに依存したGUIのためのプログラム(small platform dependent GUI implementation)
データ同期のためのコアプログラムは約1万行にもおよぶ大きなプログラムで、各プラットフォームのためのデータ同期プログラムは全てで3,000行ほどだそうです。
Dropboxでは以下のライブラリを使ってDesktopクライアントを開発しているそうです。
Native
UI
WxPython
Cocoa
WebKit/HTML
パッケージング
Dropboxほど大規模でかつ各プラットフォームで動作するサービスはないので、こういったサービスを開発する上でこのライブラリ構成はとても参考になります。Twitterでも「このライブラリってまだ開発続いていたんだ!」という反応をちらほら見かけました。
Pythonを使う理由
RianさんはPythonを使う理由として以下の6つを挙げていました。
シンプルさ(Simple)
拡張性(Extensible)
安全性(Safe)
ポータビリティ(Portable)
巨大なスタンダードライブラリとコミュニティ(Large standard library, large community)
楽しさ(Fun)
Pythonはコンセプトをそのままコードに落とせるシンプルさが良いそうです。これは今回のPyCon APAC 2013のセッションの中で、みんなが話していたことです。みんな、シンプルなPythonが好きなようです。
また、たくさんのライブラリがあり、それを簡単に使えるPythonは素敵だとも言っていました。後に触れるダイナミックタイピングができることもPythonの良さとして挙げていました。
Dropboxとしてはクラッシュしないことが大事ということで、Cと違いバッファーオーバーフローが起きないPythonを使うメリットは安全性にあると話していました。
そして最大の理由が「GuideがDropboxにいることだよね」と、最近Dropboxに入社したGuideに関しても触れていました。
Pythonを使って信頼性の高いシステムを作れるか
ここからは逆にPythonのThe Bad Partsということで、Pythonに対する批判を取り上げての講演です。以下のようなことがよくPythonに対する批判として挙げられると語っていました。
Pythonって遅いよね
マルチスレッディングをサポートしていない
ダイナミックタイピングは悪だ
Stack OverflowやブログのPythonに対する批判をスライドに映しながら、Rianさんが所感を述べていきます。Dropboxの成功事例を紹介しながら、Pythonを使って信頼性の高いシステムを構築することは可能だと説きます。
Pythonが遅いという批判には、CPUバウンスになる事例はそんなに多くないという回答で、もしCPUバウンスになる場合はCythonやPyPyを使えば良いとのこと。または、問題となる小さなコンポーネントをCで書きなおせば良いと言っていました。
マルチスレッディングをサポートしていないという批判には、マルチスレッディングとは並列実行と平行実行を実現するための機構だということを述べた上で、Pythonには並行実行の機構としてmultiprocessingのモジュールが、並列実行のライブラリとしてtornade、twsted、stackless、geventがあると話します。並行実行と並列実行を実現できるので、Pythonはマルチスレッディングが不要だと結論づけていました。
ダイナミックタイピングに関する批判には、ダイナミックタイピングというより、ダックタイピングについて語るべきと話を持っていきます。"Discipline and The Zen of Duck Typing " という投稿がRianさんがダックタイピングを深く理解するきっかけになったそうです。
ファイルをコピーする関数を取り上げて、ダックタイピングについて説明していました。
def copy_file(src_file, dest_file):
while True:
buf = src_file.read(4096)
if not buf:
break
dest_file.write(buf)
これはsrc_fileをdest_fileにコピーする関数ですが、src_fileがread関数を、dest_fileがwrite関数を持っていればこの関数をさまざまな用途で使い回すことができます。
Rianさんは例として以下のコードを挙げていました。
import StringIO
src_file = open("src.txt", "rb")
dest_file = StringIO.StringIO()
copy_file(src_file, dest_file)
string_contents = dest_file.getvalue()
このように書くことで、同じ関数を使ってファイルオブジェクトを文字列に変換することができます。ネットワークにファイルを送りたい場合は、以下のように書くことができます。
import socket
src_file = open("src.txt", "rb")
s = socket()
s.connect(("dropbox.com", 80))
dest_file = s.makefile()
copy_file(src_file, dest_file)
ここで重要なのはcopy_file関数を一切変更していないことです。シンプルな例ですが、ダックタイピングの力強さを感じることができる、とRianさんは語っていました。
さらに、ダックタイピングはインターフェース指向プログラミングだと語った上で、Javaや他の言語と比べて、Pythonはこれがデフォルトで採用されていることが強みだと話します。Pythonを使うと、インターフェースを定義するのに、別に余分なコードを書く必要はありません。プログラマは制約という言葉について再考すべき、とも話していました。
最後にダックタイピングのtipsと、いくつかの細かいPythonに関する批判ついて触れ、講演は終了しました。
個人的にはとても参考になる講演でした。プログラマをやっていると、よく静的型付けと動的型付けの議論に巻き込まれますが、それに対する良い回答になっていたように感じます。最終的には感情論になってしまいますし、どっちが優れているという話ではないですが、お互いの利点を理解しておくことは重要です。Dropboxで巨大なPythonのコードをメンテナンスし続けたRianさんはPythonの利点と欠点をよく理解していると思いますし、そういう点でとても参考になる話だったと思います。
次回は筆者が聴いたセッションの内容を中心に、PyCon APAC 2013の様子をまとめたいと思います。