PyCon APAC 2013参加レポート

第3回Pythonを便利に使うフレームワーク、ライブラリ ~PyConの楽しみ

PyCon APAC 2013 参加レポートの最終回は、2日目のセッションと会場の雰囲気を中心にお伝えします。

Luigi, The Friendly Pipeline Plumber

2日目の午後一番の英語セッションです。PyCon APAC 2013のスタッフとしても活動するIan Lewisさんから、Luigiという、バッチ処理をパイプラインで書くためのフレームワークに関しての紹介がありました。

セッションは英語でしたが、日本語も流暢なIan Lewisさん
セッションは英語でしたが、日本語も流暢なIan Lewisさん

Luigiとは

LuigiはSpotifyが開発、公開している、バッチ処理をパイプラインで書くためのフレームワークです。fluentdなどから送られてくるログといった、リアルタイムの処理に向いたフレームワークではなく、あくまでバッチ処理を小さな処理に分けるためのフレームワークです。小さな処理に分けることで、テストを行うのが簡単になります。

以下の項目がLuigiのコンセプトとして紹介されていました。

処理の対象
タスクからの入出力
処理の単位(タスク)
1入力から1出力を作るための処理
渡せるパラメータ
タスクがどのように動くか定義するためのパラメータを設定できる
画像

パイプラインで書くときに必ず必要になってくる機能はすべてLuigiが面倒を見てくれます。たとえば、以下のような機能がLuigiには備わっています。

  • パイプラインの途中で失敗した場合のリカバリ
  • アトミックなファイル操作
  • タスク間の依存関係の管理
  • タスク間の入出力の受け渡し
  • Hadoop/HDFSのサポート
  • 複数マシンでの分割実行
  • タスク進行状況の確認画面

Luigiの使い方

Luigiで書いたタスクの例として以下のコードが紹介されました。

class AggregateArtists(luigi.Task):
    date_interval = luigi.DateIntervalParameter()
    some_val = luigi.IntParameter(default=0)

    def requires(self):
        return [Streams(date) for date in self.date_interval]

    def output(self):
        return luigi.LocalTarget("artist_%s.tsv" % self.date_interval)

    def run(self):
        artist_count = defaultdict(int)
        for input in self.input():
            with input.open('r') as in_file:
                for line in in_file:
                    timestamp, artist, track = line.strip().split()
                    artist_count[artist] += 1

        with self.output().open('w') as out_file:
            for artist, count in artist_count.iteritems():
                print >> out_file, artist, count

requiresメソッドでタスクの依存関係、outputメソッドで出力先、runメソッドで処理の実装を書きます。requiresとoutputメソッドの返り値はLuigiで定義されたクラスのインスタンスを返します。ここでは省略されていますが、StreamsクラスもAggregateArtistsクラスと同様に、luigi.Taskクラスを継承したクラスです。

MapReduceを使って実装するには、runメソッドをmapperとreducerに分けて書きます。

def mapper(self, line):
    ts, artist, track = line.strip().split()
    yield artist, 1

def reducer(self, key, values):
    yield key, sum(values)

セッションで紹介されたコードは全てGithubで見ることができます。こちらはここで省略されている全てのコードが確認できるので、参考にしてください。

MoSQL: More than SQL, but Less than ORM

2日目のTea Break後の英語セッションは、去年のPyCon JPでも発表を行った台湾のMosky Liuさんの発表です。自作ライブラリであるMoSQLに関する紹介がありました。

Mosky Liuさん
Mosky Liuさん

MoSQLとは

MoSQLは、発表者のMoskyさんが開発しているSQLのビルドライブラリです。MoSQLを使うとSQL文をPythonでオブジェクティブに書くことができます。

発表タイトルが "More than SQL, but Less than ORM" である通り「SQLを書くよりも簡単に高機能で、ORMを使うよりも簡単にすぐ使える」ことをコンセプトに作られています。

MoSQLでは以下の機能に対応しています。

  • SQLインジェクション対策(入力値のエスケープ)
  • SELECT / INSERT / UPDATE / DELETE文のビルド
  • テーブルの結合(JOINシンタックス対応)
  • モデルの定義

ORMに比べると機能はとても少ないですが、その分学習コストが低く、すぐに使いはじめることができます。また、ORMよりも4倍実行速度が速いそうです。Moskyさんは、MoSQLの特徴として以下の4つが挙げられると話していました。

  • 簡単に使える(Easy-to-Learn)
  • 便利(Convenient)
  • 速い(Faster)
  • 安全(Secure)
画像

MoSQLの使い方

まずは、基本的なMoSQLの使い方です。SQLを知っていれば直感的に使うことができます。

>>> from mosql.build import *

>>> select('pycon')
SELECT * FROM "pycon"

>>> select('pycon', {'id': 'mosky'})
SELECT * FROM "pycon" WHERE "id" = 'mosky'

>>> insert('pycon', {'yr': 2013, 'id': 'mosky'})
INSERT INTO "pycon" ("id", "yr") VALUES ('mosky', 2013)

>>> update('pycon', where={'id': 'mosky'}, set={'id': 'mosky'})
UPDATE "pycon" SET "id"='mosky' WHERE "id" = 'mosky'

解説がいらないほど簡潔です。使い方の応用として、モデルを定義する例を挙げていました。

import psycopg2.pool
from mosql.result import Model

pool = psycopg2.pool.SimpleConnectionPool(1, 5, database='mosky')

class PostgreSQL(Model):
    getconn = pool.getconn
    putconn = pool.putconn

class Person(PostgreSQL):
    table = 'person'
このモデルからデータを取得したい場合、以下のメソッドを使用します。
>>> Person.select({'person_id': 'mosky'})
{'name': ['Mosky Liu'], 'person_id': ['mosky']}

>>> Person.where(person_id=('andy', 'mosky'))
{'name': ['Andy Warhol', 'Mosky Liu'], 'person_id': ['andy', 'mosky']}

モデルもSELECT文、INSERT文、UPDATE文、DELETE文に対応しており、これらと同名のメソッドにディクショナリを渡すことで実行できます。その他にもフィールドを絞り込むためのsquashedパラメータ、ユニークなフィールドを指定するident_byパラメータなどに対応しています。

Pythonの代表的なORMであるSQLAlchemyは複雑で、小さなアプリケーションを作る際にはあまり使いたくありません。MoSQLであれば、モデルにも対応しているので「初めはSQLビルダーだけを利用して、アプリケーションのサイズが大きくなってきたら、モデルを定義する」と徐々に拡張するやり方ができます。何か趣味で小さなアプリケーションを作るような際には、SQLite+MoSQLは最適なツールだと感じました。

PyCon APACを楽しもう

ここからはテクニカルセッションを離れて、イベントの雰囲気を中心にお伝えします。

会場受付

セッションと開発スプリントは新宿工学院大学で行われました。入り口のホールはとても綺麗です(下写真左⁠⁠。セッション会場は4階なので、ここからエレベータに乗って移動します。500人以上の来場者が来るとあって、受付には大量の人がいました(写真右⁠⁠。

画像

受付ではノベルティと名前のタグを受け取ります。

画像

受付を通りすぎて、そのまま左側のホールに入ればオープニングの会場です。

オープニングセッション

まずは司会の藤山さんから、PyCon APAC 2013とこのオープニングに関する説明です。英語と日本語の説明はさすがAPAC、国際感が溢れるイベントです。

画像

続いて座長の寺田さんから挨拶です。今回、初めてチュートリアルを開催したこと、英語セッションが去年と比べて増えたことなどを英語で話していました。

画像

続けてアイスブレイクです。台湾出身のWuさんから、流暢な英語でアイスブレイクが行われました。

画像

途中で海外から来た人を挙手するシーンがあったのですが、それを見る限り20~30%ぐらいの参加者が海外出身です。座った席の左右前後での自己紹介あり、質問による挙手や立ちながら自己紹介するなど体を動かすシーンもあり、楽しいアイスブレイクでした。

続いて、スポンサーの紹介です。回のPyCon APAC 2013ではスポンサー企業、個人やスタートアップ企業のパトロンスポンサーを含めると50以上のスポンサーが集まったそうです。

PyCon APAC 2013 スポンサー一覧

プラチナにはNoSQLデータベースのRiakをメンテナンスするBasho、ゴールドにはJIRAをはじめとするプロジェクトマネジメントツールを提供するAtlassianが入っており、こちらも国際的です。

画像

最後に司会の藤山さんから注意事項や会場の説明があり、オープニングセッションは終わりました。

ランチ

12時からはランチの時間です。ランチはドリンク付きで5種類のお弁当から選ぶことができます。その他にイスラム教徒の方のためのハラル限定のお弁当や、ベジタリアンの方のためのお弁当も用意されていました。

画像

奥にはランチ会場の奥にはジョブボードも用意されており、特にブレイクタイムに大勢の方が閲覧していました。

画像

全員同時にランチタイムに入ること、食事をとるスペースがここしかないことから、必ず誰かと相席することになります。筆者も2日目は一人でランチタイムに入ったため、数人の方と相席しました。

画像

一人は先ほどセッションを紹介したMoskyさん、もう一人はDjango CMSのリードデベロッパーであるojiiさん、そして、シルバーエッグ・テクノロジー⁠株⁠で働いている加藤さんです。

Moskyさんとは面識があったので、去年のPyCon JP 2012とお互いの会社の話題で話していたところ、いつの間にか話の輪が広がっていました。ランチを食べ終わった後は、オープンソースや台湾、東京の話題で盛り上がりました。Moskyさんの開発しているライブラリを紹介してもらったり、使っているWebフレームワークの話などをojiiさんのMacBook Airを覗きながら、英語で会話していました。

英語で会話するこんな1コマもPyCon APACらしいですね。ちなみに隣ではキーノートのRian Hunterさんが海外組と基調講演の話で盛り上がっていたようです。

画像

ブレイクタイム

15時からはブレイクタイムです。セッションで疲れた頭を癒やすためにお菓子とコーヒー、ジュースが用意されています。

入り口でお菓子を取り、ランチと同じように席に座って食べることができます。コーヒーメーカーがジョブボードの横にあったせいか、ジョブボード横で立ち話が弾んでいたようです。

画像

スポンサーブース

セッション会場としている教室横の廊下をスポンサーブースとして使用しています。MicrosoftさんやBashoさん、IT系のイベントではお馴染みのCodeIQさんなどがブースを構えていました。

CyberAgentさんのブース、キャラクターのポスターが目をひきます
CyberAgentさんのブース、キャラクターのポスターが目をひきます
CodeIQさんのブース、クイズに答えるとAmazonギフト券5,000円が当たります
CodeIQさんのブース、クイズに答えるとAmazonギフト券5,000円が当たります
Microsoftさんのブース、おなじみのクラウディアさんも居ました
Microsoftさんのブース、おなじみのクラウディアさんも居ました
Bashoさんのブース、エース、キング、クイーン、ジャックのトランプが引ければノベルティがあたります
Bashoさんのブース、エース、キング、クイーン、ジャックのトランプが引ければノベルティがあたります

セッション会場が近いこともあり、多くの人がスポンサーブースを訪れていました。

集合写真

初日にアナウンスがあった通り、2日目には参加者全員で集合写真を撮りました。新宿工学院大学の入り口のホールで二階から写真を撮ってもらいました。

画像

LT

2日目のクロージング前にはLT大会も行われました。英語と日本語が入り混じりながら、テンポの良いLTが続きます。

PythonでFizz and Buzzを書く話、英語の発表なのですが、時折混ざる日本語が会場の笑いを誘っていました
PythonでFizz and Buzzを書く話、英語の発表なのですが、時折混ざる日本語が会場の笑いを誘っていました
今回の美人ドラ娘です
今回の美人ドラ娘です
バイオ分野におけるPythonの活用事例の紹介です、最後には来年のPyCon APACの紹介もしていました
バイオ分野におけるPythonの活用事例の紹介です、最後には来年のPyCon APACの紹介もしていました
Excelファイルをリバース・エンジニアリングする話です
Excelファイルをリバース・エンジニアリングする話です
JSONのスキーマバリデーションライブラリの紹介です、猫バリデーションをデモとして使っていました
JSONのスキーマバリデーションライブラリの紹介です、猫バリデーションをデモとして使っていました
自動でPEP8の規約に沿ったコードに変換してくれるautopep8というツールの紹介です
自動でPEP8の規約に沿ったコードに変換してくれるautopep8というツールの紹介です

クロージング

LTが終わった後はそのままクロージングに移行します。まずは座長の寺田さんから、来場してくれた方々、手伝ってくれたスタッフへの御礼の言葉がありました。

画像

続いて来年開催予定のPyCon APAC 2014 in Taiwanの紹介です。台湾で開催されるPyCon APAC 2014の座長のTim Hsu氏とSkypeでつないで抱負を語ってもらいました。

画像

そして、日本ではPyCon JP 2014が開催されることのアナウンスがありました。来年は座長が寺田さんから鈴木たかのりさんに変わります。鈴木たかのりさんから、今年参加してくださった方々へのお礼と、スタッフの募集がありました。まだまだ何も決まっていないので、一緒にPyCon JP 2014を盛り上げていきたいそうです。スタッフとして参加したい場合は、PyCon JPのMLに入って、スタッフの参加表明をしてください。

画像

これで充実した2日間のPyCon APAC 2014が終わりました。

ただ、実際には開発スプリントが翌日行われました。筆者は参加できなかったので、同じPyCon APAC 2014スタッフの川田さんにまとめてもらいます。1日目の夜に開催されたパーティに関しても同様に川田さんにお願いしました。

パーティ

ここからは藤原に代わり、同じPyCon APAC 2013スタッフの川田が、パーティと開発スプリントの感想をまとめます。

PyCon APAC 2013 初日の夜に、参加者が集うパーティが行われました。

画像

会場は、都庁展望台 Tokyo Cafe 202という、地上202mの展望室が貸し切り状態となる施設で、広々とした中で交流が行われました。美味しいお酒と料理も用意されており、至れり尽くせりでした。

海外からの参加者には、東京の夜景を一望することができ、とても評判が良かったようです。それでも、みなさん会話が弾みだすと、夜景はそっちのけで夢中にお話されていたのが印象的でした。

Partyでは、昨年のPyCon JPと同様にDJショーが行われていました。また、終盤にはプレゼント抽選会が行われ、盛り上がりました。プレゼントは、スポンサーさんなどからのグッズが多く、それ以外にもパーフェクトPythonなどの本やAmazonギフト券などがあり、盛況でした。

画像

参加した印象としては、さすが⁠PyCon APAC⁠というだけあって、海外の参加者がとても多かった点が目立ちました。普段は話せない海の向こうから来たPython開発者と話せる環境で、かつ広めの会場だったので、話の輪にも入りやすかったのではないかと思います。また、ノートPCを開いて黙々と開発する人や、それを見て議論をされている方もいたのも、こういう場ならではの光景だなと思いました。

合わせてLTも行われていました。香港のOSSコミュニティの方のトークもあり、APAC地域の交流に役立っていたようです。

開発スプリント(3日目)

3日目は、開発スプリントが開催されました。

画像

Sprintsとはあまり使われない言い方ですが、ハッカソンのようなものだと思っていただければ良いかと思います。あるテーマごとにチームになって、固まって黙々と開発するというスタイルで行われました。人数は1人のチームもあれば、複数人のチームもありました。

ただ、この日は朝から台風が直撃し、電車の遅延も発生しており、開始時間に集まった参加者は非常に少なかったのですが、台風の雨が弱まった午後になるにつれてどんどん増えていき、最後にはそれなりに人が集まりました。Sprintsはチケットが必要なかったため、Sprintsだけに参加された方もいたようです。最終的には40名ほどの方が参加されました。

チームは、後半には15チームぐらいできていたようで、Django, Pylons/Pyramid, Sphinx, Google Cloud Platform などおなじみのものから、PyCon運営チーム開発スプリントやラジオ体操開発スプリントといったものまで開催され、自由な状態でした。後半にかけて人が増えてきたため、チームの数も増えていきました。

画像

Sprintsは皆さん頭を使うので、エナジードリンクや飲み物も用意されて、自由に使えるホワイトボードも何台かあり、集中できる環境が用意されていました。

画像

最後に1時間ほど、希望する各チームの成果発表が行われました。Sphinxチームでは、開発者で基調講演もされたGerog Brandlさんも参加されており、この開発スプリントでたくさんのチケットを処理できた様子が発表され、大変盛り上がっていました。また、YAMAHAさんに提供いただいたWi-Fi ネットワークの構成などを紹介した成果報告もあり、当日起きたトラブル等についても発表されました。

筆者はというと、MyHDLというPythonで記述できるHDL(ハードウェア記述言語)に関する開発スプリントのチームのリーダーとして参加していました。ひとりで黙々とやるつもりでしたが、興味があるという方が数人いて、チームを作ってチュートリアルのような事を行っていました。

僕以外、VerilogやVHDLなど他のHDLを触ったことのある方がいなかったので、プログラムのように見えて実は回路であるという複雑さに躓いたりしていましたが、無事最後にはチュートリアルで作成したCPUのパイプラインのようなものを作成・発表できて良かったです。こういった、当日行ってみたら同じ興味のある人がいた、というのも開発スプリントの魅力です。

今回でPyCon APAC 2013の参加レポートは最後になります。来年、日本ではPyCon JP 2014が、台湾ではPyCon APAC 2014が開催予定です。来年も一緒にPythonコミュニティを盛り上げて行きましょう!

おすすめ記事

記事・ニュース一覧