歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【メモ】PyCon 2017で勉強になったこと、これから勉強すること

プログラミング言語PythonのカンファレンスPyCon JP 2017に参加してきました。そこで勉強になったこと、これから勉強したいことをまとめた個人的なリストです。

いろいろなセッションの内容については、既にいろいろな方が素晴らしい記事を書いているので、私は特に包括してまとめるつもりはありません。そういう目的であれば、特に以下の記事がおすすめです。

qiita.com

ベンリに使おう変数アノテーション - typing.pyとの楽しいお付き合い

一言でまとめると「Python3.6から変数アノテーションが導入された。それを使って型を使って安全に(バリデーションした上で)jsonを読み込むライブラリを作った」という発表です。Pythonの最新機能と、Python自体の機能をハックして、言語設計者が考えている以上に便利にアノテーションを使うという楽しさのある発表でした。

speakerdeck.com

私はPythonの型アノテーションが導入された時に、「プログラムを安全にするための型」を理解したくてHaskellを勉強し始めたのですが、実際に簡単なCLIを作ろうとした際にJSONを読み込む手間が煩雑すぎて(たしか、jsonから値を取る場合に全てMaybe型で取得され、明示的に処理する必要があるような感じ)、結局Pythonで書いてしまったことがあります。

それに比べると、読み込み時に指定の値が入っていない場合にtypedmarshalや、その元ネタのGo言語の仕組みは分かりやすくて良いなと思います。

ただ、実際にjsonオブジェクトのバリデーションを行うとき、私は今のところCerberusライブラリを使うと思います。こちらは文字列の正規表現や、数値の範囲のチェックまで行えるためです。

qiita.com

もし「型」で同じようなことをやるにはどうすればいいのでしょうか?私は詳しくないのですが、依存型という概念でリストの長さも制限できる言語があるらしく、同じような用途に使えるんじゃないかと思います。もしPythonでやるなら、辞書をアノテーションに渡す形式にしたほうが分かりやすい気もしますが。

数理最適化モデラー(PuLP)チートシート

2日目のポスターセッションも素晴らしい展示が多く、特に数理最適化(数理計画)のこの発表が良かったです。

qiita.com

私は、同僚の書いたpulpを使った雰囲気でレビューしている(他にPythonに詳しいプログラマーが少ないんです…)ので、いろいろ質問してしまいました。

いや、もちろん全く理解していないのではなく、「目的関数と制約条件を定義して〜」みたいなレベルの話とかプログラミング一般の話(インプットアウトプットが妥当かとか、読みやすいコードなのか)はできるのですが、「どういう問題が難しい」とか「モデリングが妥当か」みたいなところはほとんど話できていません。

今日から使える!組合せ最適化 離散問題ガイドブック (KS理工学専門書)

今日から使える!組合せ最適化 離散問題ガイドブック (KS理工学専門書)

この本を含め、数冊おすすめしていただきました(上記のQiitaの記事に書いてあります)。ポスターセッションで話をした感じでは、「どういう問題が難しい」みたいな話は、NP困難などの話が出て来るようなので、普通のプログラマーとしての力を上げていけば議論できるようになる気がします。

私と同じ時間に質問していた方が「pulpって分散処理できるんですか?」という質問をしていて、「pulpPythonから商用やフリーの最適化のソルバーをラッピングしているだけなので、対応しているソルバーに差し替えればできます」って答えていたのが面白く感じました。

数理計画の専門家は「何を解くか」に注目していて、エンジニアは「どうやって処理するか、そもそも現実的に使える時間に処理が終わるのか」みたいなところに注目している気がします。

Python におけるドメイン駆動設計(戦術面)の勘どころ

Pythonドメイン駆動設計(DDD)の知見あんまり無いよね」「一つサンプルケース作ってみたから参考にしてよ」という発表です。

www.slideshare.net

ただし、私はDDDや設計の話はほとんど学んだことがなく、全体としてそこまで理解できてはいません。ただ、それでも「クエリとコマンドを分けて考えるといいよー」って話など、部分部分で「なるほど」と思う箇所はありました。

もうちょっと設計などの話を勉強したいです。ただ、結局は実践しなくては理解出来なさそう(ベストプラクティスとアンチパターンの区別がつかなさそう)なのと、DDDのクソ分厚い本に躊躇して手が出せていません。

Pythonはどうやってlen関数で長さを手にいれているの?

www.slideshare.net

Pythonの仕組みに一歩深く踏み入れられる素晴らしい発表でした。「Pythonには公式ドキュメントにもプロトコルをまとめられてないよね」って話には納得感があります。with構文を使いたい場合などに特に…。

collections.abcがある今となっては、mixinで実現して欲しかったような気がする」とTwitterで言っている方がいて、私もそれには同感でした。この点、RubyEnumerableモジュールを使ったイテレーターの実装のほうが綺麗ですね。

Pythonをとりまく並行/非同期の話

Pythonをとりまく並行/非同期の話

並行・並列処理や、GIL(Global Interpreter Lock)についてまとまっている発表です。並列処理によって高速化したいプログラムのボトルネックがI/Oバウンドやメモリバウンドかによってやり方違うよね、という目的の話から始まっているので、非常に分かりやすかったです。

参考文献(記事)も紹介されているので、ここから広げていけば並行処理/非同期処理は攻略できると思います。

pandasでのOSS活動事例と最初の一歩

pandasのコミッターの @sinhrks さんによる基調講演です。

speakerdeck.com

Pythonの科学技術計算の歴史や、OSSコミュニティの様子などが紹介されています。個人的には、様々な環境でのパフォーマンステストが用意されているのが、様々な環境で使われうる科学技術計算ライブラリならではだと、印象的でした。

OSS活動するなら、まずは気になるプロジェクトのリポジトリをウォッチしてみよう!」と仰っていたので、私もその通りにやってみます。