Scala Days 2017 Copenhagen 2日目

突然ですが、ただ今デンマークの首都コペンハーゲンにいます。

f:id:iwmat:20170602030927j:plain

なんでかと言うとScala Days 2017という技術カンファレンスに参加しているからです。

f:id:iwmat:20170602035114j:plain

せっかく高い旅費や参加費*1を払っているわけですし、何か残しておかないともったいないかなと思いブログを作りました。よろしくお願いします。

Scala Daysとは

Lightbend社、TRIFORK社が開催するScalaの技術カンファレンスです。海外のでっかい勉強会って事ですね。特にLightbend社(旧Typesafe社)はScalaの作者であるMartin Odersky先生が創業に関わっているため、とても公式度の高いイベントです。

 

タイトルの通り、この記事では2日目のレポートをお送りします。1日目のレポートは一緒に参加しているid:todokrの記事を御覧ください。

todokr.hatenablog.com

もちろん受付からセッション内容まで全て英語ですが、僕の英語力の都合上、内容の正しさについては保証しかねます。

Keynote

2日目のKeynoteはViktor Kuncakさんの「Tools for Code Verification, Synthesis, and Repair」です。

このセッションはStainlessというScalaの検証ツールの紹介が主な内容でした。

このツールを使うと、以下のように記述した関数*2に対し入力(require), 出力(ensuring)で値を検証してくれます。

def factorial(n: BigInt): BigInt = {
  require(n >= 0)
  if(n == 0) {
    BigInt(1)
  } else {
    n * factorial(n - 1)
  }
} ensuring(res => res >= 0)

検証といっても型を見て、取りうる値を自動で割り出し検証しているそうです。無駄にユニットテストを書かずに済むのでよいですね。

他にも再帰処理であっても処理ごとにちゃんと検証していたり、複雑なロジックに対し仕様をそのままテストにするといったデモを紹介していました。

最後にどうやってこの機能を実現しているのか(おそらく)数学的な事を交えて解説していましたが全く理解できませんでした。😭

Easy and Efficient Data Validation with Cats

DanielaSfregolaさんによるCats、特にValidatedNelの紹介です。

よくあるウェブアプリケーション、例えばFormのバリデーションを例に解説しています。

 

まずOptionによる実装。

この例では一応バリデーションはできますが、どの項目でどういったエラーとなったのか全く分からないのが問題です。

次にEither(Scala 2.11.x)による実装

一応どの項目でどういったエラーになったか分かるようになりましたが、全ての要素でエラーとなる場合などに対応する事ができません。

複数のエラーメッセージを持てるように改良してみますが…

大変つらみがありますね。エラー情報は集約できるものの、要素が増えるとパターンが指数関数的に増える事になります。

ここでCatsのValidatedを使っての実装

全てがうまくいきました🙄

それぞれのバリデーション結果を|@|*3で結合し、mapでDataにapplyしています。

ちなみにLeftの場合(ここではInvalid)は空のリストになる事があり得ないためNonEmptyListで表す事ができます。

思ったより長くなってしまったのでだいぶ雑に省きますが、エラー型を用意したりtype aliasを設定したりなど色々すると以下のようにできます。

ちなみにScalazでも同様の事ができますね。

compiling like a boss

(2017/06/02 6:00 (UTC+02:00) 追記)

寝起きでid:todokrに注意されましたが2点修正があります。

  • Scala 2.12で20%早くなったというのは嘘で実際は逆との事
  • hydraはまだearyly-accessだけなので、ちゃんと連絡しないと使えないとの事

です。公式ページにも書いてありました。 🙇

f:id:iwmat:20170602130739p:plain

嘘情報を書いてしまい、大変申し訳ありません。英語力を鍛えます。

 

Triplequote社のMirco DottaさんとIulian Dragosさんによるセッション。"like a boss"は「鬼のように」という意味だそうです。

Scalaに携わった事のある人であればもれなく「コンパイルが遅い事」にイライラするはずです。このセッションではコンパイル時間を短くし、まさしく鬼のようにコンパイルするためのTipsを紹介しています。

 

コンパイル速度を上げる手段として、まずScalaのバージョンを上げる事が紹介されています。Scala 2.12では2.11.8に比べてなんと20%早いそうです。

次にコンパイルオプションを色々調整するTipsです。

f:id:iwmat:20170602060334j:plain

特にMacros, Implciits, Type Inferenceあたりの設定が効果的だそうです。

 

最後の方法がHydra を使う事です(つまり自社製品の紹介🙄)。HydraはScalaコンパイラなのですが、並列処理によってコンパイル効率を向上させています。非常に単純な話ですが

f:id:iwmat:20170602060830p:plain

だそうなので、相当早いって事ですね。

導入も簡単そうなので帰ったら試してみたいです。

Monad transformers down to earth

とても疲れているので、飛ばし飛ばし紹介していますが、これが2日目最後のセッションです。

f:id:iwmat:20170602061336j:plain

Buildo社のGabriele Petronellaさんによる発表です。タイトルからしてヤバイですね。

結論から言うとEitherTの紹介です。資料は既にアップロードされているようです。

t.co

Future[Option[A]]ってmapを2回書かなきゃいけないよねっていう話から始まり、Functorを使え、Monadを使えという話になります。Monadな性質を持つcase class(49ページ目あたり)ってもうちょっと一般化できそうというあたりからOptionT, EitherTが登場します。

普段からEitherT等はよく使ってたので、割とスルスル頭に入ってきて良かったです。最終的にはFreeを使えという事なのでScalaは怖いですね。

終盤にTIPSが紹介されていましたが(75ページ〜)、2つ以上のMonadが混ざると急速に死ぬとか、wrap/unwrapするのが楽ではないから気をつけろとか「あるあるだなー」って思っていました。その辺りは"Local Optimization"した方が良いという事なので、参考にしたいと思います。

その他

企業ブース付近ではいつでもコーヒー飲み放題、フルーツ食べ放題となっています。

f:id:iwmat:20170602063622j:plain

f:id:iwmat:20170602063804j:plain

ちっちゃいりんごとか洋梨、プラムが置いてあるので思わずテンションが上がってしまいますね。また、昼食と夕食も出てくるので、デンマーク料理的なもの*4を食べる事ができました。

f:id:iwmat:20170602064132j:plain

盛り付けに失敗していますね。😂

このとき近くになんと小田好先生がいたので、id:todokrと一緒に写真を撮ってもらおうとしましたが「明日撮影会やるからそのときにしてくれ」と注意されました。😇

余談

コペンハーゲンは緯度が高いためか、この時期は日の入りが相当遅いようです。信じられないかもしれませんが現地時間の21:00でも外はこんな感じです。

f:id:iwmat:20170602041438j:plain

日本ではあり得ない光景…。

*1:900ユーロ + 25%の税😱

*2:参考

*3:DanielaSfregolaさん曰く"Crazy Symbol"

*4:異常なくらいカリカリに焼いたベーコンなど