日本で開催されるPythonに関する国際カンファレンスであるPyCon JPに参加してきました。昨年からPythonに興味を持ち、カンファレンスがあることを知って行きたいと思い続けたことが実り、今年初めて参加することができました。
*タイムテーブル
*講演
私が実際に聴いた講演です。資料は公開されているもののみURLをつけてあります。- Webアプリケーションの仕組み
Webアプリケーションについて、基礎的なことを広範囲について説明してくださりました。デベロッパーツールを使って、レスポンスやリクエストの確認方法をデモしてくださったりもして大変わかりやすかったです。
Telnet を使うと情報がテキストで返却されることや、リクエストの中身をいつもあまり確認していなかったので、自分で実際に試して1つ1つ確認して理解を深めたいと思います。
Gunicorn はWSGIに対応したWebサーバーなのですが、これを使ったアーキテクチャにするとマルチで並行処理できたりプロセス死んでも生き返るそうです。
性能が良いクラウドサービスとして Amazon Aurora がおすすめなようです。
私は業務でWebアプリケーションの開発に携わっていますが、サーバーの仕組みや基礎的な部分の理解が浅いので、改めて見直さなければいけないと認識することができました。講演者の清水川さんはWebアプリケーションの仕組みを細かくまとめられていて、コツコツの積み重ねが大事だと実感したので、私も見習って基礎的な勉強をしておこうと思いました。
- オンザフライ高速化パッケージの比較:Numba, TensorFlow, Dask, etc個人的に実行速度について実験したそうで、その結果を解説してくださりました。
実行速度について興味があったので聴いてみたのですが、実際に使ったことがないパッケージが多く出てきたので私にとっては難しい内容でした。
速くしたかったら GIL ではなく、GIL Safe を使うと良いそうです。CPython、Numba、jit、CUDA、PyTorch、PyData など聞いたことはあるものの、具体的にどういうものかは知らないので後で調べておこうと思います。
- Interactive Network Visualization using Python 〜 NetworkX + BokehでPEPの参照関係を可視化する
個人でPEPの参照関係を可視化するサービスを開発したそうで、そのサービスの説明と、開発過程で辛かったことなどを話してくださりました。
Bokeh(ボケ) はインタラクティブなグラフを作成できるデータ可視化ライブラリで、グラフをドラッグして拡大縮小やホバーといったことができます。NetworkX のサポートが追加されているので今回使ったそうです。
このライブラリとNetworkX(2.2RC)を使って今回の可視化サービスを作ったそうです。NetworkXは2.0以降でないとPandasと連携がスムーズにならないとのことでした。
この可視化サービスを作るにあたって躓いたことをご紹介してくださり、どんなにすごい人でも何度も躓いて時間をかけて学んでいくのだと感じました。また、業務ではなく趣味でこのサービスを作っていて、本当に楽しくてやったことが伝わってきました。
Bokeh や NetworkX など知らなかったので技術的にも勉強になりましたし、今後もPythonを学んでいくことについてもコツコツ楽しく頑張ろうと思い直すことができました。
- Pythonista’s Batting Eye(選球眼)
フレームワークや技術の選定を、身近な野球という身近な例えとして「フライを打つためのボールの見極めと技術が大切」と言っていたことがとても印象的でした。実際に開発したサービスのアーキテクチャを例に、なぜその技術を採用したかを説明してくださりました。
バックエンドは Django を採用したそうですが、理由としては最新バージョンにライブラリがたくさん入っていて、SPA などが使えたからだそうです。
フロントエンドには、VueをベースにしたSPAフレームワークである Next.js を使っていて、Next UI をつかったグラフ連携や SPA に便利とのことでした。Next UI はAdmin画面を作ってくれます。
API 連携部分は、Django REST フレームワークを使っていて、指標値計算には Serializer というものを使ったそうです。Serializer は、クエリなどの複雑なデータを Json に変換するといったことができます。パイプラインは Pandas + Luigi を使っていました。Luigi はPythonで書かれたデータフロー制御フレームワークです。知らなかったので試してみようと思います。
Jupyter + PyData をプロトタイピングをするときに使ったそうです。地道な実験が必要だそうです。グラフ描画は Bokeh、テストや開発は Docker と Pycharm を使ったとのことでした。
辛いことも多いですが、そういったことの積み重ねで学んでいくものです。ツラいスライダーは時には捨ててもいいですが、バットを振るか振らないかの決断が大切です。決断を恐れず決断するルールを作るのがオススメだそうです。(迷ったらPythonとか)
- Integrate Full-text Search service with Django
実際に開発したサービスを例に、Elasticsearch を使った全文検索サービスを導入する際の知見を話してくださりました。
導入するにあたって、Elasticservice のインデックスどうするか、
過去未来の同期をどうするか、といったことを検討するときは「サービス思考で設計」して UI を考慮したほうが良いとのことでした。
【設計案1】ROA (Resource Oriented Architecture)
RESTful API を使うときはこの設計になり、1リソース1インデックスの関係になるそうです。ただこの案だと、複数テーブルをまたいたテーブルの JOIN がやりにくく、何回か検索する必要あってスマートじゃないといった問題があります。
【設計案2】SOA(Service Oriented Architecture)
サービスを1つの単位とする設計で、必要なサービスをベースとして情報が全てそろってる状況をつくります。テーブルを JOIN した状態でデータを取得することができます。ただこの案だと、非正規化されるのでデータサイズ大きくなったり、関連ドキュメント全部を更新する必要があるといった問題があります。
Go-mysql-elasticserch という同期ツールがあり、データを監視して変更があったことをイベントとして実行してくれます。
タイムラグが少なくテーブル単位になるといったメリットがありますが、複数テーブルの結合を対象としてるとできないといったデメリットがあります。
Logstash はOSSのサーバーサイドデータ処理パイプラインで、今回はデータ転送に使っています。Select文にひっかかったものを抽出できたりテーブルを JOIN できるといったメリットがありますが、削除だとSelect文にひっかからないので対応できなかったり、Cronで実行されるのでタイムラグがあるといったデメリットがあります。Logstash で定期的に処理を実行したい場合はSQLファイルを用意し、時間を比較して更新あったら同期するようにします。非正規化されたテーブルにも対応できます。
Elasticserch-dsl というPythonパッケージがあって、これはインデックスの定義をDjangoのクラスとして定義してくれます。DictでPythonの辞書を作成すると検索クエリも作れます。
Serializer は Django の RESTful APIでの検索サービスで、APIのエンドポイントで実行できます。出てはいけないデータや高負荷になるといった問題を解決してくれ、何件返すか指定することができます。実行すると検索クエリがクライアントからとんできます。
Django側の同期について Logstash側はCronを使ったそうです。Signalsを使うことで、削除されたあとに動かすといったイベントを検知することができます。ただ、これらを使ってもエラーが起こった時にどうするか問題があるので手放しにはできず、ロールバックするかなど検討が必要です。別のデータベースを扱っているので、失敗することを予期することが大切です。
エラーが発生した箇所を考慮してどうロールバックするべきかを考える必要があるということを知ることができ、大変勉強になりました。Elasticsearchを業務で導入したことはありませんが、今後使うことになった際に参考にさせて頂きたいと思います。
- Sphinx-2.0 とドキュメントの未来
Sphinx(スフィンクス)とは、テキストファイルから任意のフォーマットに変換できるできるドキュメント生成ツールです。
Django や Python の公式ドキュメントにも使われています。
Blockading を使ってコードから図を生成することもできますし、任意のフォーマットへの変換、テーマの変換、複数の拡張子に対応、マークダウンに変換、画面イメージをコンバートしてPNGに変換、英語などの言語に変換、Jupyterをドキュメントに組み込むといったこともできます。半年ごとにアップデートされ、現在はV1.8で2019年春頃にV2.0がリリースされるそうです。ドキュメントのCIも可能で、そういった情報は全て vvakame/docker-review に書いてあるそうです。
Sphinx は使ったことがないのですが、CI などもできるとのことなので、APIドキュメントを作成してE2Eテストを自動実行させるようにできたら嬉しいと思いました。
- 複数アプリケーションのプロセスとログを管理するための新しいツールと手法
複数アプリケーション開発を効率化するために、jaffle というツールを独自で開発したそうです。バックエンドとフロントエンドを同時に起動して自動テストを実行し、ログは統合されるというものだそうです。
また、Pythonファイルは更新後に再起動する必要がありますが、設定をしておくことでアプリケーションを停止せずに自動で更新することができるそうです。デバッグもできるなど便利な機能がつまっているそうなので、今度使ってみたいと思います。
- Pythonによる異常検知入門
私が開発している部分はWebアプリケーションなのですが、予測モデルを開発しているメンバーと関わることがあるので、話を聞いてみました。
まず前提として、異常の定義が必要で、過去に発生したことがある教師あり学習なのか、それとも教師なし学習なのかといったことを確認する必要があります。
はずれ具合をみて異常かを判断するには、ホテリング法や近傍法、LOF、One+Class SVM といった手法があり、scikit-learn を使えば簡単にできるそうです。
異常を検知するとき、クレンジングとして季節性やトレンドを考慮する必要もありますし、関係者とコミュニケーションをとってフィードバックして異常なのかの確認をする必要もあります。
手法など知らないことが多かったですが、データだけでなく裏側を理解する必要があるなど学ぶことが多く勉強になりました。
- AltJSとしてのPython - フロントエンドをPythonで書こう
Alt JS とは コンパイルすることで Javascript に変換する言語のことです。Python以外にも他の言語も対応できます。
今回使ったのは Transcript といってPythonを変換するもので、インストールしてビルドするだけで変換できます。Vue.jsとも連携してたりするのですが、うまくいかない部分などもあり実際に業務で使うのは難しいかと思いました。
色々問題がありそうですが、試行錯誤して解決策を見出していたのが楽しかったです。個人的に試してみるのは楽しそうだと思いました。
*その他の講演資料
- Pythonで時系列のデータを分析してみよう
- あなたとPython今すぐパッケージング
- ざっくりUnixプロセス
- jupyter-black / GitHub
- REST API に疲れたあなたへ贈る GraphQL 入門
- 自分が欲しいものをPythonで書く方法
- niconicoにおけるコンテンツレコメンドの取り組み / youtube
- Why you should care about types: Python Typing in the Facebook Backend
- データサイエンスで競馬の結果を予測する、機械学習モデルの構築プロセス
- Django REST Framework における API 実装プラクティス
- DjangoとVueで作るカンバンアプリケーション
- diff 最小化原理で導く Zen of Python
*全体を通しての所感
念願だった PyCon に2日間とも朝から晩まで参加させていただき、話したことがない他企業の方や、勉強会で会った方々にで出会うことができ、とても有意義な時間を過ごすことができました。講演についても技術のことはもちろん、学ぶ姿勢や小さな努力の大切さなどを知ることができ、モチベーションのアップにつながりました。また、サービスとしては、ノベルティのグッズやステッカー、ランチのお弁当、おやつのクッキーとケーキ、無料のコーヒーなど想像以上のサービスがあり充実していて嬉しかったです。
今回参加してみてPythonの魅力を改めて感じましたし、皆さんが本当にPythonを使ってプログラムを書くのを楽しんでいるのが伝わってきて、今の仕事を通してPythonに関わることができて本当に良かったと思っています。
まだまだ知らないことがたくさんあるので、少しでも皆さんに近づけるよう勉強を続けていきたいと思います。
スタッフの方々が迅速な対応をしてくださり、大変充実した2日間になりました。本当にありがとうございました。ぜひ来年も参加させて頂きたいです。来年も楽しみにしています!
Sign up here with your email
ConversionConversion EmoticonEmoticon