そうだ! EuroPython 2011へ行こう

#1基調講演とカンファレンスの全体像

EuroPythonについて

EuroPythonは、ヨーロッパで開催されるPythonカンファレンスの1つです。PythonのカンファレンスとしてはPyConが世界各地で開催されていて、例えば、ドイツ、フランス、イタリアといった国において開催されています。日本でも初のPyCon JPが8月に開催されることになっています。

EuroPythonは、そういったヨーロッパの国々の、ローカルのPyConよりも大きな規模で開催されるカンファレンスです。

筆者が参加した EuroPython 2011は6月20日?26日の6日間、イタリアのフィレンツェ で開催されました。用意された650個のチケットはすべて売り切れ、参加者数は600人以上だったようです。会場は グランドホテル メディテラネーオ というホテルでした。

なお、EuroPythonは、2年続けて同じ場所で開催するようにしていて、来年もフィレンツェで開催されることが決定しています。これは規模の大きなイベントの運営を1年毎に交代していくと、毎年同じような問題が起こり、運営のノウハウが蓄積されないことを避ける意図があるそうです。

Pythonの海外イベントの雰囲気を知ってもらい、本稿の読者がいつか参加しようと思ったときの参考になるよう、3回にわたって筆者視点でEuroPython 2011のレポートをお届けします。

travel: 旅行

本カンファレンスには、小宮さん@tk0miyaと池さん@rokujyouhitomaと筆者の3人で参加してきました。残念ながら会場で日本人とは会いませんでした。筆者たちは3人一部屋で会場と同じホテルに滞在しました。筆者が本カンファレンスへ参加するのにかかった費用は次の通りです。

項目金額(円)
EuroPython(Standard/Early)23,245
ホテル宿泊費(6泊)34,819
往復航空券82,500
航空保険料・燃油サーチャージ等36,600
イタリア出入国税等3,700
成田空港施設使用料2,040
成田旅客保安サービス料500
手配旅行に係る取扱料金5,250

合計すると188,654円になります。実際のところ、現地での食事や観光もしたのでもう少しお金がかかっています。航空券や燃料サーチャージも時期によって変動するので概算の参考程度にみてください。

往路は成田-ローマ-フィレンツェとすべて空路で移動しましたが、復路はフィレンツェ-ローマを電車で移動しました。フィレンツェ-ローマ間は、飛行機で1時間、電車で1.5時間程です。筆者は、飛行機よりも電車の方が快適で、待ち時間を考慮すると、電車のほうが便利なように感じました。

EuroPython 2011

keynote: 基調講演

EuroPython 2011は、2人のPythonistaによる基調講演から始まりました。

GOOD API DESIGN: 優れたAPIデザイン

最初に講演したのはAlex Martelli氏です。

Alex Martelli氏
Alex Martelli氏

Alex Martelli氏は、Pythonソフトウェア財団(PSF)のメンバーであり、PythonクイックリファレンスPythonクックブックの著者でもあります。現在はGoogleに所属しています。講演の中ではAPIデザインのアンチパターンとして、APIのライフサイクルも考慮しながら、なぜそれが良くないか、ならどうしたら良いのか、という考えるための土台を説明して、自身の経験の中からその方法論を説明されていました。

本講演の資料と動画はGOOD API DESIGNで公開されています。

GOOD API DESIGN: 優れたAPIデザイン
GOOD API DESIGN: 優れたAPIデザイン

最悪のAPIデザインのアンチパターン

最悪なのはAPIを提供していないことであり、APIの必要性が求められているにも関わらず、APIを提供しないと次のようなことが起こることが紹介されました。

  • stackoverflowにスクレイピングの質問ばかり繰り返される
  • スクレイピングが増えることで、システムにレンダリングの負荷が増える
  • 表面的なちょっとした変更がユーザのアプリケーションを動かなくしてしまう
  • 自分たちの競合に参入するきっかけを与えてしまう

プログラマの出発点はここからです。

  • そうだ! APIを提供しよう
  • 使いやすくてシンプルなAPIにしよう
  • ドキュメントをちゃんと書いて、更新し続けよう

デザインのないAPIは、APIではない

その次に良くないことは、何も考えずにただAPIを提供することです。それは内部の実装を変更しようとすると、次のことが起こるからです。

  • 面倒になって改善しようとしなくなる
  • (変更によって)既存ユーザのアプリケーションを動かないようにしてしまう
  • 新旧の2つの実装を提供すると、メンテナンスの負荷が増える

この問題に立ち向かうアプローチは次の2つの視点から考えます。

  • どう使いたいかを考える
    • 自分が利用者だったら何をどうしたいだろうか
    • (とは言っても)単純に利用者の立場だけで考えるわけでもない
  • いまの実装を忘れる
    • 少なくとも2つ3つの実装を考えて、その中から共通項を探す
    • 何が変更されると困ったことになるか
    • APIにずっと残っている中核は何か

APIのデザインは大変ではあるものの、その見返りも大きく、機能を拡張するだけでなく、システムのコア機能を分割する優れたアーキテクチャも手に入れられると述べていました。

APIのデザイン

APIをデザインするにあたり、考え方としてAPIを階層化する方法が良いと言及されていました。

  • システムの論理的なアーキテクチャの低レベルAPIを1つだけ公開する
  • 低レベルAPIは使い方が分かり難くても、パフォーマンスが良くデバッグしやすいなら構わない
  • その他のAPIは低レベルAPIから構成する(システムの内部処理を使わない)

APIの変遷

優れたAPIを設計してもユーザに新しいAPIへ移行してもらう必要があります。大きな変更はユーザを離反させることにつながるため、段階を踏んで移行します。

  • 新旧APIが動作するリリースを1つ以上提供する
  • チュートリアルとドキュメントを準備する
  • 旧APIに新しい機能を追加しない

一貫性のないAPIデザインのアンチパターン

引数の順番や命名規則などが一貫性のないものになってくるときがあります。

  • 人は時間と共に考え方が変わるから
  • もともとの要件とは違うようになったから
  • 別のメンバーが違う方法で実装したから

そんなときにデータディクショナリを作ると良いと提案されていました。それは、チーム内で共有する名前とその概念を1対1でひも付けたものです。そして、新たに何か思い付いたときに追加するように運用し、そこから名前を選択するようにします。これにより、決めることに要するオーバーヘッドを少なくするという狙いがあります。

簡単に言うと、チーム内で情報を共有することを言っているのですが、これをシステム的にやると良いと説明されていたように思います。

WHAT MAKES PYTHON SO AWESOME: Pythonのいけてるところ

基調講演のもう一人はRaymond Hettinger氏。

Raymond Hettinger氏
Raymond Hettinger氏

Raymond Hettinger氏は、Pythonのコア開発者でitertoolsモジュールやsetオブジェクト等の作者であり、Pythonソフトウェア財団(PSF)の役員も務めています。彼のActiveState Codeのレシピには、Pythonクックブックに引用されているコードがいくつもあります。また、氏のTwitter@raymondhでは、Pythonのちょっとしたテクニックをよく紹介しています。

基調講演では、Pythonそのものの良さを次の3つの視点から紹介し、これらの項目すべてを含めてPythonがいけてるということを講演されていました。

成功の背景
  • ライセンス
  • 商用ディストリビューション
  • Zen
  • コミュニティ
  • モジュールリポジトリ(PyPI)
  • キラーアプリ
  • Win32
  • 書籍
優れた品質
  • 習得しやすい
  • 高速な開発サイクル
  • 簡潔な表現
  • 可読性と美しさ
  • たった1つのやり方
  • インタラクティブプロンプト(アプリへのインタプリタ組み込み)
  • バッテリーインクルード(豊富な標準ライブラリ)
  • 縁の下の力持ち(互換性を意識した進化、シンプルな実装)
  • 共通プロトコル
プログラマを魅了する機能
  • 信頼できる基盤:リスト、ディクショナリ、メモリ
  • マネジメント、例外、ファーストクラス関数、オーバーライド可能な構文
  • イテレータープロトコルとジェネレーター
  • 内包表記
  • デコレーター
  • イントロスペクションと抽象基底クラス
  • Exec、eval()、type()
  • with文
  • インデントブロック

この中から、筆者が印象に残った項目、もしくは(比較的)新しめの話題をいくつか紹介します。

なお、本講演はWHAT MAKES PYTHON SO AWESOMEから視聴できます。

モジュールリポジトリ(PyPI)

PythonのパッケージリポジトリとしてPyPI(Python Package Index)があります。資料の中では、現在15,318個のパッケージがあると紹介されていました。筆者の周りではPyPIを「ぱいぱい」と呼んでいますが、Raymond氏は「ぴぴぃ」と呼んでいました。

PyPIへパッケージをアップロードすると、他環境へのインストールの簡略化、他人へパッケージの存在を知ってもらうなど、たくさんのメリットがあります。

PythonのパッケージングやPyPIへパッケージをアップロードする方法については、清水川さん@shimizukawaがまとめられたPython Hack-a-thon 4ハンズオン 中級コースがとても分かりやすいです。筆者もこの内容を参考にしてPyPIデビューを果たしました。

習得しやすい

Pythonは、1時間でデータ型、制御構造、モジュールを学べて、1日あればPythonのイディオム、汎用オブジェクト、ライブラリ、特殊メソッドが分かるから、週末だけで学習できるよと述べられていました。

Pythonを学び始めるならPythonチュートリアルから始めるのが良いという人が、筆者の周りにも何人かいます。ぜひ挑戦してみてください。

Ease of Learning
Ease of Learning

簡潔な表現

簡潔な表現の例として、次のPythonのサンプルコードが紹介されていました。

import collections
import glob
import gzip
import re
import heapq
import pprint

counter = collections.Counter()
for filename in glob.glob('Data/logs/*.gz'):
    for line in gzip.open(filename):
        mo = re.search(r'GET (.*) HTTP/1', line)
        if mo is not None:
            url = mo.group(1)
            counter[url] += 1

result = heapq.nsmallest(20, counter.items(),
                         key=lambda (url, cnt): cnt)
pprint.pprint(result)

このサンプルプログラムは、Webサーバのログディレクトリからログファイルを取り出して、参照されたページのアクセス数が少ない方から20個のページ情報を表示するプログラムです。いくつか標準ライブラリを利用していますが、Pythonでは、こういった小さなツールや機能を組み合わせて処理を実装するコーディングが好まれます。

簡潔さに加えて、インデントにより整形されたコードは見栄えも良くなります。企業が業務でPythonを選択する最も多い理由は、優れた可読性によるメンテナンス性の高さにあると、講演の中でも触れられていました。

また、利用する上で必要なものが一通り揃っているということをBatteries Included(バッテリーインクルード)と呼ぶそうです。Pythonには、豊富な標準ライブラリが付属していて、アプリケーションを開発する上で便利な機能を提供しています。

イテレータープロトコルとジェネレーター

イテレータープロトコル
イテレータープロトコル

Pythonそのものと結び付きの強い仕組みにイテレーターがあります。文字列やリスト、ディクショナリからファイルやその他のコレクション型まで、様々なオブジェクトがイテレータープロトコルをサポートしています。このおかげで、そういったオブジェクト(Iterable)のデータ型の違いをあまり意識せずに、forループ文から、min/max、sortedといった関数まで一貫して扱えます。

例えば、ディクショナリをソートしようとすると、そのキーのイテレータが返され、キーのソートされたリストが得られます。

>>> sorted({"a":1, "b": 3, "c": 2})
['a', 'b', 'c']

キーと値を保持して値でソートしたい場合は、key引数に比較する要素を取り出す関数を渡します。

>>> sorted({"a":1, "b": 3, "c": 2}.items(),
...        key=lambda (k, v): v)
[('a', 1), ('c', 2), ('b', 3)]

さらにおもしろい例では、Raymond氏が開発したイテレーターを作成して返すitertoolsモジュールに様々なツールがあります。無限リスト、または巨大なリストを扱うときなど、パフォーマンスを考慮する場面でitertoolsモジュールは活躍します。

次のような例を考えてみます。引数で受け取ったオブジェクトを返すrepeat()と、map()と同じように引数で受け取った関数に対して、繰り返し可能なオブジェクトの要素を1つずつ適用して返すimap()を組み合わせると、任意のリストの要素を2乗する処理が次のように書けます。

>>> from itertools import imap, repeat
>>> list(repeat(2,3))
[2, 2, 2]

>>> # [pow(i, 2) for i in [1, 2, 3]]
>>> list(imap(pow, [1, 2, 3], repeat(2)))
[1, 4, 9]

最後にイテレーターを作成する最も簡単な方法としてジェネレーターを紹介します。関数を定義するときにyieldというキーワードを使うのみで、イテレーターを作成できるとてもシンプルな構文です。

>>> def f(n):
...     for i in xrange(n):
...         yield i

>>> list(f(3))
[0, 1, 2]

PEP 342によりyieldyield式として再定義されました。この詳細は、別の講演のPython拡張ジェネレータの先へにおいて、説明されていたので次回に紹介します。

イテレーターに関する内容を簡単に紹介しましたが、もっと詳しく知りたい方は関数型プログラミングHOWTOを参照してください。

exec、eval、type

Pythonのコーディングは明示する文化なので、eval()execを使う機会はあまりないと思います。応用例の1つとして、講演の中でtimeitnamedtupleは、テンプレートから実行時にコードを生成する用途に使われていると紹介されていました。inキーワードを利用することで、評価結果をグローバルまたはローカルの名前空間に割り当てられます。スプレッドシートのアプリケーションにはこういったテクニックが使われるそうです。

>>> namespace = {}
>>> exec "x = 100" in namespace
>>> namespace["x"]
100

with文

Python 2.6から標準で利用できるようになったwith文という構文があります。with文のブロックでは、リソースのロックとアンロック、ファイルのオープンとクローズといったtry...exceptで行っていた標準的な前処理と後処理を切り出すことができます。

この仕組みそのものは、他の言語でも提供されているものがあるそうですが、withというキーワードは珍しいのではないでしょうか。

with open(file_name) as f:
    f.read()
# ブロックを出るときにクローズされる

また、任意のコンテキストマネージャーを定義することで、そういったリソース管理などのコードを分離するためのツールになるということが重要な点だと強調されていました。

conference:カンファレンス

カンファレンスのスケジュールは、5日間にわたりました。1日あたり、5つのトラック(4つの英語トラック、1つのイタリア語トラック⁠⁠、3つのハンズオントレーニングがありました。

カンファレンスの内容は、大きく次の4種類に分けられます。個別の講演やハンズオントレーニングの詳細については次回に紹介します。

メイン会場
メイン会場

talks: 講演

60分、または90分の単位で発表者がプレゼンテーションを行う、一般的な講演のスタイルです。開催日数が5日間と長く、トラック数も多いことから、発表と質疑応答に十分な時間が割り当てられていました。一番大きな部屋は200人、その他が50人から100人程度の部屋でした。

筆者は、基調講演以外に5個のセッションをもっていたRaymond Hettinger氏の講演に強く興味をもって聴講していました。

hands-on trainings:ハンズオントレーニング

3時間とやや長めの時間を取り、参加者が実際にコーディングしたり、サンプルアプリケーションを作成したりします。チュートリアルと呼ばれることもあります。筆者は高度なPythonテクニックPySideとQMLによるデスクトップ/モバイルアプリ開発の2つのハンズオントレーニングに参加しました。

recruit: 求人募集

スポンサー企業のうちstatproAltran Xype-HT ConsultingDemonWareSpotifyの5社による、参加者への求人募集がありました。設立後、数年といった若い企業の求人募集が多かったように思います。会社説明の最中に、⁠会場席を指差して)そこにCTO(最高技術責任者)がいるから話しかけてね、話し合いがまとまれば面接は合格だよ、といったノリでした。

スポンサー企業の発表が終わった後に、サプライズイベントとして、空飛ぶモンティ・パイソン「おバカな就職面接」が演じられ、会場を沸かしていました。英語が苦手な筆者でも、この一幕は十分に楽しめました。

events: イベント

Python系イベントパートナープログラムの2種類が用意されていました。筆者はほとんど参加していないので、サイトに記述されている以上のことは分からないのですが、フィレンツェは観光名所でもあるので、カンファレンスの合間に観光へ出掛けるのも良さそうです。

筆者も半日かけて同行者と街の散策をしたり、美術館巡りをしたり、最終日は「サン・ジョヴァンニ祭」というお祭りで花火を見ました。イタリアの花火も日本のものとほとんど同じで、夏の風物詩といった様相でした。

「サン・ジョヴァンニ祭」での花火
「サン・ジョヴァンニ祭」での花火

organization: 運営

海外の有料イベントですと、ランチが提供されるのが一般的(?)なようです。カンファレンスのスケジュールを見ると、90分のランチと、45分のコーヒーブレイクが2回あります。ホテルのレストランにて、それぞれの休憩時間に食べものや飲みものが振る舞われます。長めの休憩時間のおかげで、参加者同士のコミュニケーションが活発でした。筆者もほとんど英語が話せないながらも、みんながわいわい話している雰囲気に後押しされて話しやすかったりしました。

いくつか写真の紹介します。イタリアの食べものと共に雰囲気を楽しんでください。

lunch: ランチ

料理はどれもおいしかったです。パスタよりもご飯系のほうが筆者の好みでした。

リゾット、ハムと惣菜
リゾット ハムと惣菜

ランチでもコーヒーブレイクでもワインがありました。お国柄ですね。数あるデザート類の中で、筆者はこのティラミスが一番おいしかったです。

ワイン、デザートのティラミス
ワイン デザートのティラミス

coffee break: コーヒーブレイク

コーヒーブレイクでは、数種類のデザートが用意されていました。食べたり飲んだりしながら歓談していました。

デザートと、コーヒーブレイク時の歓談風景
デザート コーヒーブレイク時の歓談

次回予告

今回はカンファレンスの基調講演の内容とカンファレンスの全体像を紹介しました。次回は個別の講演やハンズオントレーニングについて紹介したいと思います。

おすすめ記事

記事・ニュース一覧