2014年9月15日月曜日

PyConJP 2014 2日目

PyConJP 2014 2日目の感想

ちなみに1日目の感想はこちら
http://mzmttks.blogspot.jp/2014/09/pyconjp-2014.html
目が覚めるといい感じの時間だったので午前の感想は無い

感想

まず、期待よりもずっと楽しいカンファレンスですごく楽しめた。
ご飯もおいしいし、発表も面白いし、いろいろ知り合えたし。
スタッフのみなさんありがとう! 

言語仕様を安定させたいという Core Developers の方針なのか、
scipy/numpy/scikits みたいな科学技術系パッケージが多いからなのか、
思ったより研究者やPhD が多かった。
ちゃんと理論やる系発表と実装系発表をわけると興味がマッチするのかなあと思った。

パッケージメモ: wheel / devpi / PuLP
聞けなかったけどスライドシェア

python ドキュメント翻訳プロジェクト

OpenCV の python インタフェース入門

スポーツ動画からの姿勢推定をしている博士課程の学生 (ブログ
資料はこちら 
ちょっと資料の文字が小さかったけど、最初に資料の URI を出してくれたので
特に問題はなかった。

注意点

  • OpenCV は BGR (Blue-Green-Red) の順だけども、
    それ以外 (matplotlib/PIL/scikit-image) は RGB なので注意。 
  • mlはあるけども、scikit-learn とかの方がよくそろってて良い。

話を聞きながら自分でハンズオンしようと思ったけど、
brew install opencv
で Python バインディングが入らなくて悲しい気分になった。

入門ってことで、インストールの方法とか最初に言ってくれると
聞きながらできてよかったかも

 

Python と scikit-learn ではじめる機械学習

たまに twitter で見かけたけど s/機会/機械/
Naive Bayes でスパムフィルタを学習してみましたって話。 
形態素解析ツールで Mecab / kuromoji / ChaSen を紹介していて、
kuromoji は知らなかった。

まずは ML 系の python パッケージを紹介していた

パッケージ系

  • scikit-learn
  • gensim
  • nltk
  • R
  • Julia

ミドルウェア系

  • Jubatas
  • Spark + MLib
  • H20
  • Mahout

使用データ: SMS Spam Collection Data Set

spam: スパム
ham: 非スパム
のラベル付き。 spam/ham ってラベルが標準なのね。知らなかった。

手順

このへんは、見ながらメモったので適当。 あとで試して記事書くかな。

  • 読み込み: numpy.genfromtext 
  • 特徴量抽出:  CountVectorizer, fit_transform で 単語とメールの行列に変換
  • 学習:  scikit-learn の naive_bayes の Multinomial で学習。
    Gaussian (正規分布),  Multinomial (多項分布), Bernoulli (ベルヌーイ分布) が選べる。
  • 評価:  cross_validation でクロスバリデーション —> 96% ぐらいの正解率
  • 予測:  predict

 

まあその、ちゃんと学習からクロスバリデーションによる評価までしていたので
よかったと思ったが、なんというか聴衆の事前知識量 and 興味はだいぶ広そうなので
難しいなあと思った。

 

数理最適化によるパズルの解法

資料は ipython notebook で公開されてる。http://goo.gl/kAbWrA
技術者のためのゲーム理論の基礎 というチュートリアルをやるそうで、
もれなくOR学会 の会員になれるっぽい

PuLP でいろんな問題を解けるよーという話。
紹介されてた日本語の数少ない (らしい) 解説ブログ記事は
Pythonで整数計画問題・線形計画問題を解く(PuLP編)

ポイントは、

  • LpProblem: 数理モデルのオブジェクト
  • LpVariable: 変数。連続、整数、バイナリを選択できる
  • LpAffineExpression: 目的関数
  • LpConstraint: 制約

よく使う関数は

  • value: 値の取り出し
  • lpSum: 変数の総和?
  • lpDot: 変数のドット積(内積)

数独の制約条件が、
変数を vijk というバイナリ変数で表現して、
座標 (i, j) の値が k のとき 1, そうでない時 0 となると定義することで
エレガントに表現できるのにだいぶ感動したんだけども、
さらっと流されてしまった。

この辺の制約条件 and 変数の設計の妙がキモだと思うんだけど、
そういうのは OR 学会で聞けって話なんだろうか 

 

パッケージング @aodagi

1. 使う

pypi
cheeseshop が前身の PyPI サーバ、
最近は warehouse という次世代サーバが準備されていて、
https://warehouse.python.org でアクセス可能。

pip
SSLを通さない場合アクセスしなくなったので、
-allow-external / -allow-unversioned とかがいるらしい。 
ほかにもオプションがいろいろあった。 

  • -f http://localhost:5000
    このオプションを入れると、ローカルの PyPI サーバに
    アクセスする。その作り方は後述。
  •  -r requirements.txt
    依存パッケージを丸ごと入れられる。
       pyramid==1.5.1
       git+https:// …
    みたいな感じ。
    さらに、-r を中にかけるので構造化できる。 
  • —no-index
    外に見に行かないオプション。これとローカル PyPI サーバとか wheel (後述) を
    組み合わせると、外部アクセスしなくてもテストとかができる。 

 

wheel

Python のパッケージを、依存ライブラリも合わせてまるごと入れる
(ベンダリングする)ツール。
pip install wheel で pip wheel が使えるようになる。
pip wheel pyramid で、wheelhouseというディレクトリに依存も含めて全部入る。
で、pip install -f wheelhouse pyramid  …. —no-index
とかやると、全部ローカルから入れられる。 

 

2. 作る

setuptools

setup.py を作る。 今後宣言的になっていくので、setup関数を呼ぶだけにすべき。

  • description = 1行だけ。
  • packages    = 入れたい python パッケージ
  • namespace_packages = 名前空間がかぶってもよいという宣言。
  • long_description = 詳細な説明。 reST でいろいろ書く。
  • install_requires=依存パッケージ

 

3. もっと活用する

PyPI に完全公開

python setup.py register
python setup.py sdist bdist_wheel upload

Github / Bitbucket から公開 (URL 知ってる人だけ)

git tag 0.0
git push —taggs
pip install -f https://...github.../archive/v0.0.zip
みたいな感じで入れられる。

devpi (ローカル PyPI サーバ)

pip install devpi

PyPI のプロキシ (キャッシュサーバ) としても働く。
内部向けパッケージの公開、公開前の練習とかに使える。
名前空間を切れるので1のサーバだけでみんなで使える。

使い方

聞きながらのメモだったので不正確かも。 

devpi-server —start
pip install -i http://localhost:3141/root/pypi/+simple/YOURPACKAGE

ユーザ作成

devpi user -c USERNAME password=PASSWORD
devpi login USERNAME --password=USERNAME

アップロード

devpi index -c aodag.hello
devpi use aodag.hello
devpi upload --formats "sdist,bdist_wheel" 

 

LT 

 野球プログラミング

JIRA, Cacoo, Bitbucketを使ってるよーという紹介。
トークでは野球データの解析をしてた (BABIP / ピタゴラス勝率)
に加えて、三振王らしいアダムダン率の話。

Technology that underly PyCon JP 

PyCon JP のチェアによる運営ノウハウ

  • コミュニケーション: Slack
  • 課題管理: JIRA on demand
  • 文書管理: Google drive
  • ウェブページ: symposion
  • SSL: Global Sign が 1年だけの free ssl 証明書?をオープンソース向けに出してるらしい 
  • 参加チケット管理: connpass
  • プログラム管理: guidebook

DDD

Pyramid + socket.io + Bacon.js なんかを使って人狼アプリを作った話

Python で始める競技プログラミング

@cocodrip (ブログ) さんという Python アイドルらしい人の競技プログラミングの話。
制限時間がある問題では、データのサイズごとに適切なアルゴリズムが違うみたいな
まじめなテクニックから、
競技プログラミングは青春ですよね!とはにかんでいってみる可愛い部分もあって
有能だなあと思った。

バイラルメディア 三上聡 @saicologic

乱立するバイラルメディアにある 35 のメディアからいくつかの記事を
scrapy, pandas, matplotlib で分析した。
記事シェア数はスケールフリーな分布だったり、
アナと雪の女王が多かったり、もう一段分析すると面白そうなことがわかりそう

PyConJP NOC (Network Operation Control) @taka-stack

PyCon のネットワークまわりの担当チームの話。
すごく安定して使えていて感動してたんだけども、
準備に半年かけて、実際の構築は 3-4時間ですませたらしい。すごい。
DualStack-Lite (CodeZine) という技術を使ったらしいけど時間切れ。

SphinxCon JP 2014 @usatan

ドキュメンテーションツール sphinx のカンファレンス SphinxCon の宣伝。
日本コミュニティが結構活発らしい 

2014年9月14日日曜日

PyConJP 2014 1日目

PyConJP 2014 @ Tokyo に行ってきました。
https://pycon.jp/2014/
お台場の国際研究交流大学村が会場で、朝から行っていきました。
主に自分メモとして書いときます。
Chrome のタブが膨大になったのでリンクも入れてます。 

これとは関係ないけど、 twitter で見たも書いときます。
線形最適化ツール PuLP 

 

Keynote

Kenneth Reitz の発表。heroku のプロダクションオーナー。
人のコミュニケーションは 1 to 1 から始まっていって、
インターネットの登場で広がって。。。みたいな話から
Python 2 / 3 でコミュニティが分断されつつあるという話につながった。 

PyPiなどでは Python 2 は依然 Python 3 の 20-30 倍ダウンロードされているらしい
だから、もし「自分しか Python 2 をまだ使ってる人はいないかもしれない」
と思っているかもしれないけど、実はいっぱいいる。

傾向として、
昔からのユーザは Python 2系を使い続けて、新しいユーザは Python 3系を使っているらしい。

Kenneth は個人的には2 系が好きだけど、みんな Python 3 try してみて!
と言ってた。うーん。あんま使うモチベーションにならんなあ。
と、思った。

Dive Into Python 3 のそれっぽい章を読んでもうーんって感じ

 

Deep Learning for Image Recognition in Python

Kaggle というデータ解析チャレンジの 猫と犬の画像分類問題で、
Haar-like feature (opencv, mahotas) & Logistic regression (scikit-learn) 
だと正解率 60% ぐらいだけど、
DNN (DeCAF) & Logistic regression (scikit-learn)
だと 96% でてびっくりした
という話。DNN は広がっているなあ。

これをもとに、xxx48 の画像と、よなんとか興行の人の 画像を使って
人工知能で選ぶ JKC48 メンバースカウト機能を Pepper にのせる!

という話をしていて、思いのほかうまく言ってておもしろかった。

DeCAFCaffe になったらしい。

 

Django パフォーマンスチューニング

Django のパフォーマンスをチューニングする話。
django-debug-toolbar を使ってSQL アクセスが無駄に多い部分を見つけ出して、
.select_related, .prefetch_related, .bulk_create とかの JOIN する系メソッドに
置き換えることで、SQL 発行回数を減らせる。

他にも、いろんなテクニックがあって、
Index を適切に使う、Cache を使う、バックエンドを Redis にするとか、 
django-compressor / django-asset とかで静的ファイルを圧縮するとか
いろいろ紹介されてた。

ただし、結局本質的に大事なのはDB設計とミドルウェアの選定だねという
まっとうなアドバイスで締められた。 

あとは、Funkload という、テストシナリオを python で書けて、
複数テストから差分レポートとかトレンドとかを出せるツールが紹介されていた。
今度ためしてみたい。 (Qiita 記事)

 

Python 実装系総ざらい

Python のいろんな実装を紹介する話。

CPython

標準。ctypes/windll で外部 DLL にアクセスしたり、
Python C API, Pyrex, Cython, boost.python で別言語の実装とつないだり、
numpy は numba で JIT コンパイルしたりすると早いよーという話だった。
llvmpy という python の LLVM コンパイラ (でいいのか?)もあるらしい。 

Jython

昔ちょっとつかった。まだ開発がされていたことに衝撃を受けた
GIL が無いらしい。

Iron Python

.NET Framework で動く Python.
Python Tools for VisualStudio なるツールがあるらしい。 
これも GIL なし。 

PyPy

JIT コンパイラが走るはやい Python
JIT ドキュメント
流行りの JITコンパイラは嫌いですか?
が詳しい情報だとか。

PyPyには、
1. 言語を作るツールセットとしての機能
2. 1 の青果物としての Python 実装
が含まれていて最初の「はやいPython」というのは 2のことらしい。
実際、PyPyによる Ruby 実装 Topaz, PHP実装 HippyVM というのがあると。

で、最近は同様に numpypy というのも作られ始めているらしい。

Pyston

LLVM 上で Python をコンパイルする試み。 Dropbox で使っている/開発している

Micro Python

組み込みで動く python 

 

Effective Numerical Computation in Numpy, Scipy

基本的な話の、 
Broadcasting (要素ごと積とかできるやつ) とか、
Indexing (インデックスに値の集合をわたせるやつ ) の話とかと、
疎行列ライブラリ scipy.sparse の話があった。
ちなみに、疎行列とは、ほとんどの値が 0 の行列のこと。 

lil_matrix という代入がはやいオブジェクトで行列を構成して、
csr_matrix (rowアクセスがはやい) or csc_matrix (column アクセスがはやい) に
変換すると、速度あがるよーという内容。
ただし、実は csr/csc_matrix には内部構造の indptr, data, indices というのがあって、
それを直接操作するとさらにはやくなる。

どれぐらい疎だと疎行列のメリットが生かせるんだろうか

トーク中に紹介された Numpy Medkit が詳しくてよかった。
ただし、個人的にこれ系の資料では、 EuroScipy の Tutorial がベスト  

Introduction to Scientific Programming in Python

科学技術計算に使える Python ツールの紹介。

この辺の基本的なツール

ただし、商用というかそういう系だと、速度を上げるには最適化がいるので、
anaconda, canopy のような、最適化済 python ライブラリが便利らしい。

4h の解説動画 http://www.youtube.com/watch?v=3Fp1zn5ao2M が紹介されていた。長い!

リファクリングツール

Python でリファクタリングするためのツールの紹介。 

コーディングスタイル系

PEP8 / PEP257 が標準コーディング規約
pep8, pep257, pyflakes みたいな自動チェックツールがある。
基本的には flake8 を使えば OK.
カスタマイズはいろいろできて、例えば #NOQA を行に入れるとそれを蒸しするとかいろいろ。

自動修正系

autopep8, autoflake, docformatter, eradicate, unify とかがある。

自動補完

jedi が vimmer にはよいらしい。

リファクリングツール

Rope がおすすめ。名前の変更、関数の別ファイルへの移動、引数変更などがいい感じにできる

コードメトリクス

静的コード解析。 Radon がおすすめだとか。

 

Python を支える技術 ディスクリプタ編

__get__, __set__, __delete__ を定義したクラスのことをディスクリプタという。
で、関数呼び出しなんかがこのプロトコルに従って行われている。

この辺を理解すると、内部構造がわかって良さそうだが、だいぶディープだった。

 

Lightning Talks (5min の発表)

Gunosy の広告配信サーバ

50msec or die の世界では
高速APIサーバ (Tornado, PyPy)
統計解析 (Numpy/Scipy/Cython/Numba/Bokeh)
並列処理(Celery)がいる。
全部 Python でやることで、3人ぐらいでもまわせるらしい。すごいな

スタンドアロンアプリ

GUI アプリ pydun を pyQt で書いて、PyInstaller でインストーラも作ったよって話。
世界樹の迷宮のマップ作成ツールだとか。

ちらっと見せられた地図は新・世界樹の迷宮のスノーウルフが出てくるとこかなーと
思ったんだけども、真相はわからん。

最初から最後まで非常によくできていた。 

非エンジニアが PyConJPスタッフしてみた話

エンジニアを理解するためにスタッフしてみた人事スタッフの話。
こういう歩み寄りはとてもすばらしい。

あと、人事スタッフの仕事のなかにデプロイとか入ってて、
こういうのがフルスタック人事っていう人なのかーと思った。

Django REST framework

REST フレームワークで、いろいろ Pyramid に似てるとかいう話だけども、
Django を使わないので残念ながらあんまついていけなかった。 
Django REST framework