プログラミング言語PythonのカンファレンスPyCon JP 2017に参加してきました。そこで勉強になったこと、これから勉強したいことをまとめた個人的なリストです。
いろいろなセッションの内容については、既にいろいろな方が素晴らしい記事を書いているので、私は特に包括してまとめるつもりはありません。そういう目的であれば、特に以下の記事がおすすめです。
ベンリに使おう変数アノテーション - typing.pyとの楽しいお付き合い
一言でまとめると「Python3.6から変数アノテーションが導入された。それを使って型を使って安全に(バリデーションした上で)jsonを読み込むライブラリを作った」という発表です。Pythonの最新機能と、Python自体の機能をハックして、言語設計者が考えている以上に便利にアノテーションを使うという楽しさのある発表でした。
私はPythonの型アノテーションが導入された時に、「プログラムを安全にするための型」を理解したくてHaskellを勉強し始めたのですが、実際に簡単なCLIを作ろうとした際にJSONを読み込む手間が煩雑すぎて(たしか、jsonから値を取る場合に全てMaybe型で取得され、明示的に処理する必要があるような感じ)、結局Pythonで書いてしまったことがあります。
それに比べると、読み込み時に指定の値が入っていない場合にtypedmarshalや、その元ネタのGo言語の仕組みは分かりやすくて良いなと思います。
ただ、実際にjsonオブジェクトのバリデーションを行うとき、私は今のところCerberusライブラリを使うと思います。こちらは文字列の正規表現や、数値の範囲のチェックまで行えるためです。
もし「型」で同じようなことをやるにはどうすればいいのでしょうか?私は詳しくないのですが、依存型という概念でリストの長さも制限できる言語があるらしく、同じような用途に使えるんじゃないかと思います。もしPythonでやるなら、辞書をアノテーションに渡す形式にしたほうが分かりやすい気もしますが。
数理最適化モデラー(PuLP)チートシート
2日目のポスターセッションも素晴らしい展示が多く、特に数理最適化(数理計画)のこの発表が良かったです。
私は、同僚の書いたpulpを使った雰囲気でレビューしている(他にPythonに詳しいプログラマーが少ないんです…)ので、いろいろ質問してしまいました。
いや、もちろん全く理解していないのではなく、「目的関数と制約条件を定義して〜」みたいなレベルの話とかプログラミング一般の話(インプットアウトプットが妥当かとか、読みやすいコードなのか)はできるのですが、「どういう問題が難しい」とか「モデリングが妥当か」みたいなところはほとんど話できていません。
数理最適化のブースがあった。「同僚のpulpのコードをレビューしてるけど難しい。モデリングについて議論できないし、どんな問題が簡単/難しいのか分からない」って話をしたらオススメの本を紹介してもらえた pic.twitter.com/ZHwaTRms0S
— 黒めだか (@takeshi0406) 2017年9月9日
今日から使える!組合せ最適化 離散問題ガイドブック (KS理工学専門書)
- 作者: 穴井宏和,斉藤努
- 出版社/メーカー: 講談社
- 発売日: 2015/06/23
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
この本を含め、数冊おすすめしていただきました(上記のQiitaの記事に書いてあります)。ポスターセッションで話をした感じでは、「どういう問題が難しい」みたいな話は、NP困難などの話が出て来るようなので、普通のプログラマーとしての力を上げていけば議論できるようになる気がします。
私と同じ時間に質問していた方が「pulpって分散処理できるんですか?」という質問をしていて、「pulpはPythonから商用やフリーの最適化のソルバーをラッピングしているだけなので、対応しているソルバーに差し替えればできます」って答えていたのが面白く感じました。
数理計画の専門家は「何を解くか」に注目していて、エンジニアは「どうやって処理するか、そもそも現実的に使える時間に処理が終わるのか」みたいなところに注目している気がします。
Python におけるドメイン駆動設計(戦術面)の勘どころ
「Pythonでドメイン駆動設計(DDD)の知見あんまり無いよね」「一つサンプルケース作ってみたから参考にしてよ」という発表です。
www.slideshare.net
ただし、私はDDDや設計の話はほとんど学んだことがなく、全体としてそこまで理解できてはいません。ただ、それでも「クエリとコマンドを分けて考えるといいよー」って話など、部分部分で「なるほど」と思う箇所はありました。
もうちょっと設計などの話を勉強したいです。ただ、結局は実践しなくては理解出来なさそう(ベストプラクティスとアンチパターンの区別がつかなさそう)なのと、DDDのクソ分厚い本に躊躇して手が出せていません。
Pythonはどうやってlen関数で長さを手にいれているの?
www.slideshare.net
Pythonの仕組みに一歩深く踏み入れられる素晴らしい発表でした。「Pythonには公式ドキュメントにもプロトコルをまとめられてないよね」って話には納得感があります。with
構文を使いたい場合などに特に…。
「collections.abcがある今となっては、mixinで実現して欲しかったような気がする」とTwitterで言っている方がいて、私もそれには同感でした。この点、RubyのEnumerableモジュールを使ったイテレーターの実装のほうが綺麗ですね。
Pythonをとりまく並行/非同期の話
並行・並列処理や、GIL(Global Interpreter Lock)についてまとまっている発表です。並列処理によって高速化したいプログラムのボトルネックがI/Oバウンドやメモリバウンドかによってやり方違うよね、という目的の話から始まっているので、非常に分かりやすかったです。
参考文献(記事)も紹介されているので、ここから広げていけば並行処理/非同期処理は攻略できると思います。
pandasでのOSS活動事例と最初の一歩
pandasのコミッターの @sinhrks さんによる基調講演です。
Pythonの科学技術計算の歴史や、OSSコミュニティの様子などが紹介されています。個人的には、様々な環境でのパフォーマンステストが用意されているのが、様々な環境で使われうる科学技術計算ライブラリならではだと、印象的でした。
「OSS活動するなら、まずは気になるプロジェクトのリポジトリをウォッチしてみよう!」と仰っていたので、私もその通りにやってみます。