PyCon JP 2014参加レポート

第2回1日目の注目セッション─Django活用、Pythonによる分析と最適化、MicroPython、PythonでのXML-RPC

第2回は、カンファレンス1日日のセッションを中心にお届けします。

Djangoによるスマホアプリバックエンドの実装

はじめにYuichi Nakazawa氏とKazuhiko Kakita氏によるスマホアプリのバックエンド実装に関するセッションを紹介します。現在、両氏とも長野県で働いており、またGEEKLAB.NAGANOというオープンスペースの管理人をしているとのことでした。長野県に行ったときには、ぜひ立ち寄りたいと思います。

まずは導入部分で、スマホアプリのバックエンドを構築する際のDjangoのメリットとして、学習コストが低いことや、管理サイトが秀逸であることを紹介していました。Djangoのadmin機能を利用すると、アプリケーションの管理サイトを簡単に構築できて、かつ機能も十分なので、APIを中心とするサービスには非常に適していると思いました。

次にCMS構築の例を元に、DjangoのORMの紹介および実例を説明しました。実際にDjangoのリレーションでできる事の紹介、またモデルの継承などについてわかりやすく説明していました。特に一般化リレーションについては、ドキュメントから探すのが難しい内容を解説しており、新しい発見がありました。Django1.7から搭載されるマイグレーション機能にも触れており、今後使用する場合の参考になりそうでした。

Yuichi Nakazawa氏とKazuhiko Kakita氏の講演 ©PyCon JP
Yuichi Nakazawa氏とKazuhiko Kakita氏の講演 ©PyCon JP

リレーション

  • 多対一のリレーション
  • 多対多のリレーション
  • エクストラフィールドで多対多のリレーション
  • 一対一のリレーション

モデルの継承

  • 抽象ベースクラス(親は実体を持たない)
  • マルチテーブル継承(親も子も実体をもつ)
  • プロキシモデル(子は実体を持たない、子は項目追加できない、親のメソッドの拡張に)

一般化リレーション

  • いろいろなモデル親モデルにタグを付けたい場合などに使用する

マイグレーション

  • Django1.7から標準に
  • syncdbではなく、migrate,createsuperuserを使用する。

次にAPI開発の実装のお話になりました。実際の開発ではサードパーティ製のRESTfulなライブラリではなく、自前でJSONを返す処理を実装したそうです。APIを実装する場合に必要な機能である、POST処理、プッシュ通知、ログイン連携などの方法にふれ、また公開するときの事例を紹介しており非常に参考になるセッションでした。今後私もアプリのバックエンドを実装する機会があるので、ぜひ参考にしたいと思います。

実例およびライブラリ

  • OrderedDictを使用(JSONのレスポンスに順序を付けるため)
  • スマホ側でデータをPOSTして、Djangoのformでバリデーション
  • プッシュ通知pyapns, python-gcm)
  • 認証Python Social Auth)
  • 画像ファイルboto)
  • 公開(Nginx + uWSGI

Djangoアプリケーション、パフォーマンスチューニング

次にHiroki KIYOHARA氏によるDjangoアプリケーションのパフォーマンスチューニングのセッションを紹介します。KIYOHARA氏は、業務においても100万ユーザーを超えるサイトの構築、運用経験があり、またDjango本体へも貢献しているそうです。Djangoの勉強会なども開催しており、昨年のPyCon APAC 2013でのトークセッションでも発表を行いました。

このセッションでは主に、Djangoアプリケーションの高速化とパフォーマンス測定ツールについてお話していました。

Hiroki KIYOHARA氏の講演 ©PyCon JP
Hiroki KIYOHARA氏の講演 ©PyCon JP

最初にDjangoアプリを高速化するためのポイントとして、次の項目をあげ1つずつ解説を行いました。

  • SQLを減らす
  • インデックス
  • キャッシュ
  • アプリケーション外

SQL

まずはアプリケーションが動作しているときに、いろいろな情報を可視可するためのツールとしてdjango-debug-toolbarを紹介しました。django-debug-toolbarを使用するとブラウザ上からSQLを含めさまざまな情報を閲覧する事ができます。実際にアプリケーションを動かしながらSQLを確認する事によって、無駄なSQLを取り除く事が可能になります。次にSQLを減らすための仕組みとして、Djangoのモデルのselect_relatedやprefetch_related、bulk_createdなどのメソッドの紹介をしました。ORMが実行するSQLを知り、それに1つづつ対処していく事が重要であると再認識しました。

次にインデックスについての説明になりました。RDBを相手にしているので、SQLを確認しながら、適切なインデックスを使用する事が重要だと説明しました。またJet Profilerなどのツールの紹介も行いました。

インデックス

  • Jet Profiler for MySQL
  • extra クエリの一部分を生SQLで書く
  • raw クエリを生SQLで書く
  • テーブル設計が重要

キャッシュ

アプリケーションのキャッシュには次の4種類があり、上のものほど効果的だと紹介しました。またRedisでのキャッシュについて例をあげ解説を行いました。キャッシュはアプリケーションの複雑度が増すので、設計を適切に行う事が重要だと説明しました。

  • レスポンスキャッシュ
  • ビューキャッシュ
  • テンプレートキャッシュ
  • オブジェクトキャッシュ

次にアプリケーション外でのパフォーマンスを向上させるための施策についての話題となりました。セッションのバックエンドの修正や、静的ファイルの圧縮、DBのマスター、スレーブ構成のためのライブラリの紹介や設定方法について解説しました。実際の事例を元にしたライブラリの紹介だったのでとても参考になりました。

アプリケーション外

最後に負荷試験ツールFunkLoadの紹介を行いました。Pythonでシナリオを記述でき、実際にGETやPOSTを行ってパフォーマンスが測定できると説明しました。レポート機能もあり、今後使用してみたいと思いました。

FunkLoadパフォーマンス測定

  • FunkLoad
  • 負荷試験ツール(Pythonで記述)
  • セッション付きのシナリオ
  • 静的ファイルの自動取得
Hiroki KIYOHARA氏 ©PyCon JP
Hiroki KIYOHARA氏 ©PyCon JP

Data collection, analysis and optimization with python

次にShinji Iwaki氏によるセッションについて紹介します。Iwaki氏は主に業務で分析や最適化を行っていて、ITを利用して問題を解決する場合のフローについて、例を交えて説明しました。

最適化を行うまでには、下記のようにいくつかのステップがあり、Iwaki氏は以前はC#で問題を解決していましが、Pythonを使用することでより簡単に学んだり、実行することができるようになったと説明しました。

Flow of problem - solving with IT

  • Collect
  • Parse
  • Analyze
  • Optimize
  • Visualize

次に各ステップで使用するライブラリやツールについて具体的に紹介し、IPythonにてデモを交えながら説明していました。デモはTV番組の情報をスクレイピングして解析、ビジュアライズするという内容でした。著名人のTVへの出現頻度などがわかりやすくビジュアライズされており、とてもわかりやすく、大変楽しめるセッションでした。

Collect & Parse

Analyzing data

Visualization

Optimization

Shinji Iwaki氏のセッション ©PyCon JP
Shinji Iwaki氏のセッション ©PyCon JP

Micro Pythonで組み込みPython

Hirotaka Kawata氏によるMicro Pythonに関するセッションをご紹介します。Micro Pythonはマイコン上で動作する新しいPythonのオープンソースの実装で、PyBoardというボードと共に、KICKSTARTERで投資を集めて開発されていると説明しました。

またMicro Pythonには次のような特徴があり、Raspberry Piやmrubyとの違いなどわかりやすく解説していました。特にmrubyとの思想の違いはとても参考になりました。Micro Pythonは主にマイコンやホビー向けの製品であり、REPLでインタラクティブに操作できるのが大きな特徴のようです。

Hirotaka Kawata氏 ©PyCon JP
Hirotaka Kawata氏 ©PyCon JP

Micro Pythonの特徴

  • マイコン上でPythonが動く
  • Python3互換のPython処理系(マイコン向けに再実装)
  • REPLが使える(インタラクティブにマイコンを操作できる)

PyBoardに関しては、KICKSTARTERの購入分は既に発送済みらしく、すぐには入手不可能とのことでしたが、代わりにSTM32F4DISCOVERYという秋月電子通商で購入できるボードをカスタマイズする事でMicro Pythonを動作させる事ができるとの事でした。実際のデモでは、カスタマイズしたボードを利用して、REPLにてLEDを点滅させたり、LCDに文字列を表示させたりしていました。インタラクティブにボードを動かす事ができるのは、とてもおもしろかったです。私もマイコンなどには興味があったので、今後機会があれば挑戦してみたいと思いました。

XML-RPC : Pythonが「電池付属」と呼ばれる理由

最後にRansui Iso氏によるPythonのXML-RPCモジュールのセッションをご紹介します。Iso氏は1998年頃からPythonを使っていて、さまざまな開発を行ってきたそうです。現在はネットの広告配信の仕組みを研究開発しており、最近はCommon Lispで開発をしながら、Pythonもヘビーに使用しているとのことでした。まずは冒頭でRPCに関しての歴史的な紹介と、そもそもRPCとは何かということをわかりやすく説明していました。

そしてPythonでのXML-RPCの特徴について解説を行い、サーバ側、クライアント側の実装について解説を行いました。また設計、実装上のヒントやTipsの紹介を行いました。

Ransui Iso氏 ©PyCon JP
Ransui Iso氏 ©PyCon JP

PythonでのXML-RPC

  • 標準ライブラリ
  • xmlrpc.server(サーバ側)
  • xmlrpc.client(クライアント側)
  • PurePythonによる実装
  • CPythonがあればどこでも使用可能

サーバ側

  • SimpleXMLRPCServer(サーバ)
  • SimpleXMLRPCRequestHandle(公開する機能)
  • 上記両方を組み合わせる

クライアント側

  • ServerProxy

Tips

  • MetaClassの利用
  • スレッド化(Socketserver.ThreadingMixIn)
  • オブジェクトのバイナリデータの送受信

最後に事例として、実際に開発したディレクトリ型のポータルサイトについて解説を行いました。およそ30万件ほどのデータが格納されており、データベースと検索にPythonのXML-RPCのライブラリを使用しているそうです。

Pythonでは標準ライブラリが非常に充実しており、XML-RPCを行う処理もほんの少しのコードで実現する事が可能だとわかりました。今後いろいろなライブラリを調査して今後の開発に活用していきたいと思いました。

次回は?

1日日は全部で21個のセッションが行われ、そのうち7つのセッションが英語での発表となりました。発表者、参加者ともに、さまざまな国の方が参加しており、とても国際色が豊かなセッションでした。

発表内容もフレームワーク、ツール、ライブラリ、言語仕様、言語実装、データ分析、解析、組み込みなど多岐にわたり、今年のPyCon JPのテーマであるPython で再発見 - Rediscover with Pythonにふさわしい内容でした。

ここではいくつかの発表を紹介させて頂きましたが、他のセッションに関しても次のリンクより資料、動画を閲覧する事ができますので、ぜひご覧いただければと思います。

第3回ではPyCon JP 2014のカンファレンスのセッション(2日目)の内容をお届けします。

おすすめ記事

記事・ニュース一覧