Scala Days 2017 Copenhagen 2日目
元気よく2日目に行ってまいりました。
Tools for Verified Scala
2日目のキーノートはEPFL内の研究室で開発されたstainlessというコード解析ツールについてです。
verify
で事前条件を、ensuring
で事後条件を記述すると、「すべての入力」に対してチェックを行い、制約を満たさない場合はその値をレポートしてくれるようです。
例えば平均値を求める処理ではこんな感じになります。
import stainless.annotation._ import stainless.lang._ object StainlessTest { def mean(x: Int, y: Int): Int = { require(x <= y && x >= 0 && y >= 0) (x + y) / 2 } ensuring(m => m >= x && m <= y) // Counterexample for postcondition violation in `mean`: // when y is: // 1865154560 // when x is: // 1277440000 }
xやyが大きい場合、Intがオーバーフローするためにensuringの制約が破られてしまうと教えてくれます。
Predicate types that refine the function type
と述べられていたのですが、まさにといった感じです。
その他にもパターンマッチングの完全性や、ゼロ除算の存在、配列境界チェックなども行ってくれるようです。
セッションでは二分探索木や並列コレクションを構成するデータ型をリファクタする例が挙げられていました。
コード解析はSatisfiability Modulo Theoriesという技術(分からない。。。)で実現されているとのことです。
今後はさらに踏み込み、「こう直したらいいよ!」と指摘できるようにしたいとのことでした。
8 Akka anti-patterns you’d better be aware of
次は分散システムのコンサルタントであるManuel BernhardtさんによるAkkaのアンチパターンについてのセッションです。
バッドパターンとして挙げられていたのは下記でした。
- グローバルでmutableな状態を使うこと
- 階層のないActor System
- 多すぎるActor Systems
- 同期的など適切でないロギング
- ハードウェアを意識しないこと
- ブロッキング
- Akka自身でできることの再発明
- JavaのSerializationを使うこと
5の「ハードウェアを意識しないこと」では、fork-join executorにてCPUを使い切れない設定などが例に挙げられていました。 ミドルウェアレベルでどのように抽象化がされていようと、その下のレイヤーについてまったく気にしなくて良いというわけではなく、やはりレイヤーをまたいだ学習は必要であるなあと改めて実感させられる大変教育的なセッションでした。
7の「Akka自身でできることの再発明」では、特にre-inventしがちなものとしてat-least-once deliveryやback-off supervision、message prioritizationが挙がっていました。やはりドキュメントをちゃんと読むのは重要ですね。
8の「JavaのSerializationを使うこと」では別のセッションで更に詳しく解説があったようです。
And this is (amongst other reasons) why using Java serialization with #akka is an anti-pattern pic.twitter.com/M50sCY553B
— 🇪🇺 Manuel Bernhardt (@elmanu) 2017年6月1日
セッションのただし書きにには「この講演に出席すると、自己疑惑、ストレス、パニックなどが生じるかもしれません」とあったのですが、なんとか無事生還を果たすことができました。
Building code analysis tools at Twitter
続いてはTwitter社のコード解析ツールについてのセッションです。
Twitter社は数百万行に及ぶScalaコードを扱っており、コードのブラウジングやレビュー、コードの改修などといった開発ワークフローを改善したいということがモチベーションのようです。
scalafixを使い、Slick3の不要なimportを取り除いた例が紹介されていました。
scalafixではScalaの新しいメタプログラミング機構であるscala.metaのSyntactic APIとSemantic APIを利用しているそうです。
デモではSemantic databaseからのコード情報の取得などが行われていました。
$ scalac -- semanticdb Library.scala cd META-INF/semanticdb cat Library.semanticdb # 中身はバイナリ read-semanticdb Library.semanticdb # NamesやDenotations、シンタックスシュガーなどの情報が確認できる
Compiling like a boss!
“Achieving 3.2x Faster"なScalaコンパイラであるHydraのセッションです。
triplequote.com (公式サイトでは 6x fasterになってました…)
「Scalaは大好きだが、コンパイル時間の長さは受け入れ難い。全てのCPUコアを使って並列にコンパイルするようにしてやる!」がモチベーションのようでした。
Hydraではコンパイル時間の短縮だけでなく、implicitの利用状況やtype inference steps、マクロ展開などのメトリクスも取れるようになるらしいです。
“early-access program for a few select customers"とのことなので、今後の動きに注目です。
何がコンパイルタイムを伸ばすのかや、implicit resolutionについての解説、macroによるeleganceとproductivityのトレードオフについてなど、大変勉強になるセッションでした。コンパイラの話題は今まで触れてこなかったのですが、これを機に勉強してみたいと思います。
余談ですが、「Scalaはコンパイルが遅い!」と言う人の画面を横から見ていたら、コンパイルの度にsbtを立ち上げなおしていたり、意味のないpublish-localをしていた、というケースに遭遇したことがあります。。。
Long-lived microservices
AkkaやApache Kafka、サーキットブレーカー、protocol buffer、JWTを使ってリアクティブな画像プロセッシングサービスをどのように作るかというセッションでした。
正直自分にとってはなかなかレベルの高いセッションで理解の及ばないところも多かったのですが、このセッションで触れられていた内容を含むオライリー本のプレビュー版をいただいたので、読んで勉強したいと思います。
ScalaQuest: the Scala adventure
2日目最後はScala学習ゲームであるScalaQuestのセッションです。http://scalaquest.com/
作者である@andanthorさんは高校生の時から教育に携わり、自身もゲームで英語を学んだ経験からこのようなScala学習ゲームを開発するに至ったとのことです。"Play is the highest form of research"というアインシュタインの言葉や、チクセントミハイのフロー理論などに触れながら、ゲームで学ぶことの効果を説明されていました。
フロントエンドにはゲームフレームワークであるPhaser.js、サーバーサイドはPlayを使っているとのことです。
どのようなScalaのトピックをどのような順番でどのように教えるかに相当苦心されているようでした。
並んだ石をfilter
でフィルタリングしたり、色をmap
で塗り替えたり、盾のバグったコードを直すと盾が使えるようになったりと、見せ方をいろいろ工夫しているようです。
ゲームは主人公がSkiという賢者のおつかいをクリアしていくというものですが、Skiのお願い、Order of Ski
がOdersky
にかけられているのが個人的にツボでしたw
それでは最終日楽しんできます!