Scala Days 2014 に参加してきました (2)


前回 の続きです。

私が聴講したセッションのみのレポートとなります。

2014-07-04追記:
全セッションの動画とスライドはこちらにアップロードされています。

2日目


いよいよカンファレンス本編のスタートです。
ホテルから電車を乗り継ぎ Weberwiese 駅で降り、歩いて会場の Kosmos Berlin へ。

weber

[09:00] キーノート: Erik Meijer@headinthebox

スピーカーの Erik Meijer 氏は昨年の Coursera の講義 で Martin Odersky 氏らとともに講師を務めておられた方です。

講演のタイトルは『The Lost Art of Demotational Semantics』。
ホームページ上の記載とは異なる内容ですね。全編手書きのスライドが Cool なセッションでした。

内容は氏のツイートにもあるように

関数型プログラミングの始祖ともされるクリストファー・ストレイチー氏の理論に従って
Scala の try – finally を再実装してみようという話です。

  • Scala の try – finally の実装は Java のそれとは異なっています。
  • 以下のコードで定義した関数は、それぞれどのような結果が得られるでしょうか。

erik1

なにゆえこんな(一見)奇妙な動作をするのか、そこにはしかるべき基礎があるとのことです。

  • いくつかの記号を定義して try – finally を議論していく様子

erik5
erik2

  • 最後は双対(dual)、カタモルフィズム、アナモルフィズムに話が及びます。

erik3

圏論をきちんと学んでいれば、より理解が深まっただろうと感じたセッションでした。
後日改めて復習しようと思います。


[10:00] Functional Query Optimization with Spark SQL

  • スピーカー: Michael Armbrust – @michaelarmbrust
  • スライド
  • Spark の概要説明
    • Hadoop と親和性が高く、MapReduce よりも高機能
    • Scala との相性もよく、開発者の手間を削減できる
  • Spark SQL の紹介
    • まだ発表して間もないプロダクト
    • Shark との違い
    • スキーマRDDを宣言可能
    • クエリを解析して自動的に最適化する (フィルタ処理を先に実行したりなど)
    • TPC-DS (ビッグデータ向けの標準的なベンチマーク) のテストでは Shark より良い成績
    • Scala の リフレクション + 準クォート(quasiquotes) 機能を使うことで、 Spark SQL 自体も非常にシンプルなコードになっている
    • 将来的には、型安全なクエリ結果にも対応する予定

[11:00] Reactive Streams: And why you should care.

息の合ったお二人の掛け合いが絶妙で、常に会場の笑いを誘っていました。
『Reactive Stream』は、他のセッションでも度々登場した重要なキーワード。
リアクティブ宣言 の流れをくんだものです。

  • ストリームとは何か
    • サイズに依存しないデータの流れ
    • プロセスネットワークとして表現できる
  • Reactive Stream
    • java.util.stream は他のコレクションと異なる挙動があり、直感的でない
    • みんな同じ問題を抱えており、それぞれのコミュニティが独自のソリューションを開発していた
    • 共通のソリューションを提供することが狙い (組織の垣根を超えてトップエンジニアが集結)
    • ストレージ、メモリ量には制限をかけつつも異なる処理性能に柔軟に対応する
    • Push と Pull のハイブリッド機構 (Dynamic Push-Pull) なので、どんなに負荷をかけても OutOfMemory が起こらない
      • といいつつもセッション最後のデモで OutOfMemory が発生し会場爆笑
    • Reactive Stream では最小限のインタフェースだけを提供し、APIに完全な自由を与える
    • 将来は JDK への統合も提案している
  • デモ

銀行口座の振込フローのプログラムがデモで実行されました。

kuhn2

  • Q&A
    • scalaz-stream との関連はあるのか
      • インスピレーションを受けてはいるが、Reactive Stream は別のものを目指している

[12:00] ランチ

ビュッフェ形式で肉も魚もなんでもあり。
スイーツがおいしかったです。


[13:00] Learn you an sbt for fun and profit!

  • スピーカー: Daniel Westheide – @kaffeecoder
  • スライド
  • コード
  • 基本的な SBT の使い方

  • Setting[T], Task[T] について
  • 独自プラグインの作成方法
    • 例として、リリースノートを自動で生成するプラグインを作成
  • 便利なプラグインの紹介
    • sbt-revolver: sbtシェルのバックグラウンドでアプリケーションを実行して監視
    • sbt-updates: Mavenリポジトリを参照して、依存ライブラリの更新をチェック
    • sbt-license-report: プロジェクトで使われているライブラリのライセンスを報告
    • sbt-git: sbtシェルから直接 Git の操作を可能にする

[14:00] akka-http: (un)REST for your Actors

  • スピーカー: Mathias Doenitz – @sirthias
  • スライド

  • akka-http とは

    • spray.io を改善したもの
    • Reactive Stream を使用した HTTPモジュール
    • 並行・分散処理を簡単にする、という Akka の思想を受け継いでいる
  • akka-http サーバ/クライアントAPIの利用方法の説明
    • パイプライン処理
    • エンティティが読み込まれる前にレスポンスを返すことも可能
  • Q&A
    • 次期バージョンのリリース次期は未定
      • HTTP2.0 の対応はその後
    • 現時点で、これから(プロダクション環境向けに)新しいプロジェクトを始めるとしたら Spray と akka-http のどちらを使うのがよいか。
      • akka-http の機能がどうしても必要という場合を除いて、現時点では安定している Spray を推奨する

[15:00] Lightning-Fast Standard Collections With ScalaBlitz

スピーカーはEPFLの方。

  • Scala のコレクション操作は Java と比べてなぜ遅いのか
    • とあるコード例で Scala が遅い原因を分析
      • 引数および結果のボクシング
      • foreach, reduce 関数の動的ディスパッチ
      • イテレーションそのものではなく、メソッド呼び出しのオーバーヘッドが大きい
  • ScalaBlitz を使えば、optimize {} を付けるだけで性能向上
    • 並列コレクションも大幅に性能アップ
    • Range, Array は顕著に性能改善、他のコレクションにも効果あり (スライド55ページ参照)
  • ScalaBlitz はマクロ(準クォート/quasiquotes)を使ってコードを解析し最適化されたコードを生成している

[16:00] Simplifying Scala — The Past, Present and Future

スピーカーは Scala のイシューを管理している方。
Scala言語そのものの進化の軌跡を辿るセッションです。
立ち見が出るほど大盛況でした。

  • Scala が目指す方向性
    • シンプルに、一貫性のある形に
    • 学習曲線を緩やかに
    • 落とし穴(ハマりどころ)を少なく
  • イシューの影響度と頻度を考慮して優先順位付けをしている

  • 過去のイシュー対応
    • 暗黙的なUnit型の挿入をなくす
    • 浮動小数点記法の改善 (1 .+(2)1.+(2) の違いに気づかせる)
    • 8進数リテラルを非推奨に
    • for 糖衣構文中の val 使用に関する曖昧さを排除
  • 現在のイシュー対応
    • プロシージャ構文の改善
    • View Bounds (<%) を非推奨に (implicit パラメータを推奨する)
  • 今後のイシュー対応
    • map関数のパラメータなどで、=> の左側のタプル指定をデフォルト不可に
    • 情報落ちの発生する暗黙的な型変換に対する警告
    • 列挙型
      このような構文を検討中とのこと。

  • デフォルトのインポートの改善 (使われない/使えない インポートが含まれている)

  • Avian VM というJVM互換の軽量なVMを開発中

    • 試してみてください、とのこと

[17:00] Spores: Towards Function-Passing Style in the Age of Concurrency and Distribution

発表者は Heather さんという女性の方。現在EPFLの博士課程で、Odersky氏とともに Scala チームの一員であるそうです。
(そういえば Coursera のコースでも色々サポートされていました)

とてもオシャレなスライドでした。フォントの使い方とか、(真似できないけど)勉強になります。

  • 現在の2つのトレンド
    • データセントリック (コールバック、リアクティブ、クロージャ)
    • 関数型プログラミング (不変なデータに対して関数を適用する)
  • クロージャをそのまま分散処理するのは難しい
    • いくつもの頭痛の種
    • Scala に限った話ではない
    • シリアライズ不能な具体例

h1

  • Spores とは
    • 移動可能な関数の振る舞いの小さなパーツ
    • 分散/並行実行環境でクロージャのような抽象化を実現
    • メモリリークやレースコンディション、シリアライズのエラーのない、安全なクロージャを目指す
    • Spore の中身はローカル変数、とクロージャのみ
  • デモ
    • 車種の提案用の検索ツール (車の条件(色・価格帯など)を入れるとマッチするものが返ってくる)
    • クライアント・サーバ間で一定のやりとりが発生する場合、Spore を送ればいい
    • 従来のような個々のマッピングがいらない
    • クライアントサイド(JavaScript) <-> サーバサイド(Scala) で通信する例
    • RDD (Resilient Distributed Dataset) も扱いやすい

懇親会

アレキサンダープラッツ駅近くの Weekend Club の屋上で開催。
エレベーターでビルの最上階まで行き、さらに長い階段を上った先が会場でした。

ビールと3種類の料理が振る舞われ、参加者同士が自由に歓談するスタイル。
私も数名の方と会話したのですが、意外と普段 Scala をメインで使う方ばかりではなかった、という印象を受けました。

さる大学の講師の方いわく、一般的な生徒に教えるには難しすぎる、とか
またとある方は Java がメインの大企業で、Scala の導入がなかなか進められず苦労している、とか。

  • ベルリンのシンボル、旧東ドイツのテレビ塔と美しい夕日

  • 空撮もあったんですね

<

p>つづく


  • おまけ: 次回予告

Scala Days 2014 に参加してきました (1)


Scala というプログラミング言語がこの世に誕生してちょうど 10年。
その Scala にまつわる世界最大のカンファレンスといえば Scala Days!

今年は 2014年6月16日〜18日の期間、ドイツはベルリンで開催され
私も参加者の一人として現地の熱気を生で体感してきました。

本ブログでも、その雰囲気を少しだけお伝えしようと思います。

blog1

1日目


実は私は今回初めてヨーロッパを訪問したのですが、ベルリンの気候は北海道と同じくらい。
昼間は半袖のTシャツ一枚で平気ですが、夜1になると何か羽織るものがないと肌寒いです。

そんなわけで街並みの美しさや、改札のない鉄道網に感動しつつ会場の Kosmos Berlin へ。

blog2

この日は前夜祭といった趣で、講演は Martin Odersky 先生のキーノートだけ。
ドイツ名物のビールも振る舞われて、既に盛り上がっています。
そして夕方 16:30、いよいよ開幕です。

blog3

800人の世界中のScala愛好者が一堂に会しました。

連絡事項など

まずは Josh (Joshua Suereth @jsurerth)が壇上に立ち挨拶と連絡事項について話がありました。
内容は以下のとおり。

  • 挨拶とこの日の段取りについて
  • Scala Days App のデモ

<

p>Android/iPhone 向けのアプリの紹介。
セッションのスケジュールを確認したり、参加者全員の名札に印刷されたQRコードをスキャンしてコンタクト情報を共有することができたりします。

  • セッション投票

セッションが終わると扉の出入口にいるスタッフがスマートフォンをかざしています。
そこには、悪い・普通・良いの三段階のアイコンが表示されており、参加者はタッチするだけで
評価を投票することができました。

  • Phil Bagwell Award

私は知識がなかったのですが、Scala 草創期からの貢献者 Phil Bagwell氏 にちなんだ Scala コミュニティ主体の賞のようです。
受賞者は Kojo というプログラミング言語の作者、Lalit Pant さん。

blog4

キーノート: Martin Odersky

そして、いよいよ Martin Odersky 先生が入場。

スライドは SFScala で発表されたもの と同じだったようです。

blog5

タイトルは、Scala – The Simple Parts。要旨は以下になります。

  • Scala が誕生して10年

多くの開発者によって大きな成長を遂げ、現在は『スケーラブル』な言語になっている

  • 『スケーラブル』の定義

言語自体が進化できること: DSLによる特殊化 – sbt, scalaz, specs, akka など
伸張自在であること: システムの規模に関わらずでも同じように使えること、小規模から大規模なシステムへスムーズに移行できること

オブジェクト指向 + 関数型 という特性が、これを可能にしている。
でも、本当に正しく使えているのか?

  • Scala は Modular 言語でもある

基礎的なパーツ(通常一つの機能だけを持つ)の組み合わせで複雑なシステムを表現できる。
関数やオブジェクトが必ずしも1個のモジュールに対応するとは限らない。

  • シンプル is not 簡単

小さな部品の組み合わせを効果的に行うための具体的なコーディングパターンを紹介。
compose – match – group – recurse – abstract – aggregate – mutate

一つの式で複雑な処理をせず、小さな関数にして意味のある名前を付けよう
暗黙的引数(implicit parameter)を使って抽象化しよう、など。

  • 静的な型チェックの目的

Clojure / Scala / Haskell / Idris / Coq の5つを比較。
正解はなく、トレードオフの関係にあるとのこと。

  • ではモジュールとは何か

自由に組み合わせ可能な小さなパーツ。色々な姿で表現される。
関数 / オブジェクト / クラス / アクター / ストリーム変換 / マイクロサービス

参加者との質疑応答の中で、Scala の将来についての話も出ましたが
言及されたのは Java8 への追従ということのみ。他はアイデアの検討段階だそうで、Scala 3 の登場はまだ先になりそうです。

ワールドカップ ストリーミング観戦

この日は奇しくもサッカーW杯ブラジル大会でドイツ代表の初戦が行われた日。
相手はポルトガルと好カードです。
18:00 にキックオフとなった試合は会場の壁に映し出されると同時に、ビール片手の多くのエンジニアの耳目を集めていました。

blog6

結果は4対0とドイツの大勝だったこともあり、会場は大変盛り上がりました。

つづく

  1. 日没が21時過ぎなので夜は短い []

FLOPS2014報告


 FLOPS2014 に行ってきました、といっても発表しに行った訳でなく単に話を聞きに行っただけなんですが。

 FLOPS 2014 は二年に一回、日本で開催される関数型および論理型プログラミングに関する国際会議です。今年は6/4-6の日程で石川県金沢市で開催されました。
 弊社はアドテクの会社で開発言語もScalaだったりと、まぁほとんど会社の業務と関係無いのだけど、やはりせっかく日本で関数型言語の国際会議があるなら是非聞きに行かないとね、ということで聞きに行きました。

 以下、感想などです。各発表内容に関しては、プログラムのページから発表スライドを見る事ができるはず。

第1日目

★ “Liquid Types For Haskell” 招待講演
 今回のFLOPSで一番興味を持っていたのがこの話です。
 Liquid = Logically Qualified Data の略、のつもりらしく、liquid type というのは、{v: Int | v >= 0} の様に、論理式で修飾された型のことです。Coq などの依存型を用いた定理証明系でもこのような述語を伴った型を使ってプログラミングを出来るところは同じなのですが、liquid type は述語を決定可能なPresburger算術の範囲に限定し、SMTソルバーを用いて自動証明をさせようというところが大きく違います。まぁCoqの証明を書くのは大変だし、開発の現場で必要とされる検証課題はほぼPresburger算術で充分なのだとしたら、自動証明の方が普及までの敷居が低いのは自明。
 LiquidHaskell がどんなものか試したい人はオンラインでどんなものか試すことが出来ます。
liquid type の型定義は、{-@ type Even = {v:Int | v mod 2 = 0} @-} みたいにHaskell のコメントとして、実際のHaskellのコードに註釈します。すると double xs = [x + x | x <- xs] のようなHaskellの実装について、{-@ double :: [Nat] -> [Even] @-} の様な仕様を満たすことを自動証明してくれる、というのを試せます。
 個人的には Coq で証明を書くの好きなんだけど、やはり前の会社(SIer)や今の会社で仕事をしてみた印象としては、自動証明器も必要なのかなぁとも思います。ならば Why3 とか使って開発すれば良いかなとも思うけど、Haskell みたいに既にメジャーな言語でこの手のツールが使えるというのは、やはり強みなのかなぁと思います。

他の発表は簡単に(というか専門家じゃないから解説なんか出来ない)。詳しくは、proceedings読んで下さい。

★ “PrologCheck – property-based testing in Prolog”
 オブジェクト指向言語界隈では具体的なテストケースに対してユニットテストをすることが多い様ですが、関数型言語ではランダムにテストデータを生成して仕様(=満たすべき性質)を満たすことを確認するようなproperty-baseのテストツールが標準的です。(ScalaでもScalaCheckというのが有りますが、開発現場ではあまり使われてないみたい。勿体ない話です。)
 で、Prolog版のを作った、という話(だと思う)。

★ “Generating Constrained Random Data with Uniform Distribution”
 で、その手の XXX Check系のテストツールには、「もし入力データが◯◯という性質を満たすなら△△」みたいなのをテスト出来るのですが、◯◯という条件を満たすランダム入力データを作るのはなかなか面倒だったりします。その辺を工夫したよ、という話(だと思う)。

★ “Guided Type Debugging”
 関数型言語のエラーメッセージは、(C++ほどではないと思ってはいますが)Javaとかに比べると判りにくいところがあります。その原因の一つの、型の不整合の時のエラーのデバッグを容易にしようとする工夫(だと思う)。

★ “Using big-step and small-step semantics in Maude to perform declarative debugging”
 Maude (という項書き換え系言語)の上に、何か言語の big-step あるいは small-step semantics を定義して実行とかデバッグとか出来るフレームワークを作った、という研究の様に思えた。確かに small-step semantics とか Maude の上に定義すると便利そうに思えますね。

★ “Faustine: a Vector Faust Interpreter Test Bed for Multimedia Signal Processing – System Description -”
 Faust というのは信号処理用のDSLらしいのですが、これを使ったギターアプリ(タブレット上で動くギター風に演奏出来るアプリ)の動画デモが。こんな研究してる人もいるんだなー、と思いました。

★ “The Design and Implementation of BER MetaOCaml: System Description”
★ “On Cross-Stage Persistence in Multi-Stage Programming”
 MetaOCaml というのは OCaml を拡張して型安全 eval を使える様にしたようなものなのですが、それに関する発表が2件。

第2日目

★ “Programming Language Methodologies for Systems Verification” 招待講演
 L4 microkernel を作ってる研究機関での形式手法仕様に関する報告。当初OS班と形式手法班がIsabelle/HOLを使おうとして失敗し、Haskellを両者の共通言語として選択したら成功して、両者の共通言語としてのHaskellからIsabellあるいはC++を作る様になった(しかしその後、各班がHaskellをメンテしなくなって云々)みたいな報告。
 この手の話聞くと、OS班とはいえ研究者の方々でも、やはり Isabelle などの形式手法(定理証明系)とかで仕様記述するの嫌なのか、と思ってしまいますね。。。IsabelleはZとかほど抽象的ではないと思うのだけれどなぁ。あと、線形型は勉強した方が良さそうだなと思った。

★ “Lightweight higher-kinded polymorphism”
 OCamlには無いhigher-kinded polymorphismをdefunctionalizationすることで実現したよ、という話。

★ “Generic Programming with Multiple Parameters”
 HaskellのGeneric programmingでパラメータを複数個使える様に、という話。うーむ、Haskellのgeneric programmingの話、ちゃんと復習しないとなー。

★ “Type-Based Amortized Resource Analysis with Integers and Arrays”
 計算量というリソースを型として表現するという話。こういうことも出来るのか、と。

★ “Linear Sized Types in the Calculus of Constructions”
 CoqのInductionの停止性、CoInductionのproductivityの判定の為に、それらを表現出来るような型を、という話。

★ “Dynamic Programming via Thinning and Incrementalization”
 ナップザック問題を例にとってDPの解法アルゴリズムを、融合変換とかアルゴリズム変換とかを使ってアルゴリズムを最適化する話。この手の話に興味がある人は、”semiring fusion” とか “第三準同型定理” とかのキーワードでググると良いと知人より教わりました。勉強すること多いなー。

★ “POSIX Regular Expression Parsing with Derivatives”
 微分を用いて正規表現を扱う話は知っていたのですが、POSIX準拠のはずの各種正規表現ライブラリが、どこで部分文字列をマッチすべきかについて正しく無い答えを返す、という話は知りませんでした。ちゃんとPOSIX仕様に基づいて、部分マッチ箇所を計算するアルゴリズムの話です。Proceedingsにはプレゼンでは端折ってあった箇所が書かれてて面白そうなので、あとでちゃんと復習しよう。

★ “Semantics for Prolog with Cut – Revisited”
 Cut有りのPrologのsemanticsをCoqでやってる、という話。すみません、Prolog良く解らないので、どの辺が重要なポイントなのか判りませんでした。

★ バンケット
 コース+追加で寿司、天ぷら、日本酒という立派なバンケットでした。線形論理の話とか面白い話を聞けました。

第3日目

★ “Relating Computational Effects by TT-Lifting” 招待講演
 計算(computation)を扱う理論的枠組みとしてdenotational semanticsというのがあるのですが、圏論を使って色々統一的に議論出来るよという話で、最初は判る話だったんですが、後半はさすがに振り落とされました。が、こういう話聞くと、また圏論勉強しよう、という気分になりますね。

★ “A New Formalization of Subtyping to Match Subclasses to Subtypes”
 継承とジェネリクスと両方ある Java とか Scala みたいな言語だと、型宣言の際に共変反変の両方の制約を満たす為に(例えばScalaなら) sealed abstract class List[+A] extends ... { def ::[B >: A] (x: B): List[B] = ... } みたいなイディオムを使わざるを得ないとか色々不便なところもあるのですが、この論文は新しい subtyping の定式化をしてみたよという話。OO言語関係に近い話題はこの一件だけでした。Scala などに興味がある人は ECOOP とか聞きに行くべきなんですかね。。。

★ “Type Soundness and Race Freedom for Mezzo”
Mezzo というのはML風の言語なんですが、線形型を用いることでマルチスレッドプログラミングでロック取得の必要性などをコンパイル時にチェック出来る様にした言語で、言語の正しさ(型検査が通ればデータ競合が起きない事)を Coq で証明した、という話。Java とか Scala とかだとプログラマが正しくロックを取ってる事を保証しなくてはいけないので、Mezzo のこういう機能は素晴らしいと思います。

★ “Proving Correctness of Compilers using Structured Graphs”
 木構造ではなく(非循環)グラフを用いてコンパイラを改善するみたいな話で、グラフを用いてコンパイル&実行するのと、木も用いてとが等価だと言う証明の話(だと思う)。

★ “Constraint Logic Programming for Hedges: a Semantic Reconstruction”
 すみません、これは良く判りませんでした。semantics と solver のアルゴリズムについて話してたと思うのだが。

★ “How many numbers contains a lambda-term?”
 λ式でk-tupleとかを作った場合、λ式の型を決めると、そこに含む事の出来る自然数の個数には上限がある、という話(だと思う)。これも難しくて判りませんでした。

★ “AC-KBO Revisited”
 項書き換え系にはクヌース・ベンディックス完備化アルゴリズムという完備化アルゴリズムがありますが、結合則 x+(y+z) = (x+y)+z や交換則 x+y=y+x のような規則を満たす演算子に関する場合にどうするかという話。Steinbach という人の論文が間違っているという論文があったけど実はそれは正しくてみたいな話とか、順序付けがNP-hardなことはこうやってSATに変換してとか、(詳細は理解出来ない)門外漢にも楽しめる発表でした。

★ “Well-structured pushdown system: Case of Dense Timed Pushdown Automata”
 Timed Pushdown Automata の話でした。これも基礎知識が無くどういう話なのか良く判りませんでした。

終わりに

 社外勉強会の効能として、「今まで知らなかった話題に触れられる」「すごい人たちのやってるすごいことを知る」「もっと勉強しようというやる気を貰ってくる」といったことを主張する人は多いです。私もその意見に賛成します。
 だとしたら、学会とか国際会議に行けば、第一線の研究者がやっている最先端の話題を知る事が出来ます。
 そして、例えばHaskellとかOCamlなどは、言語の開発者がこういう学会で発表した事を言語の新機能として追加したりします。学会で話されている事は自分が使う機能と無関係な難しい話ばかり、という訳ではありません。
 
 勿論、聞いても分からない話も一杯有りますし、周りは見知らぬ研究者ばかりで話す相手も内容も無い、などなどというところはありますが、まぁその辺は我慢するとして。判らなかった内容とかは、各種勉強会とかに行って論文コピー片手に詳しそうな人に質問するとか方法はありますし。

 2016年のFLOPSは高知で春に開催だそうです。また PPL のような日本の学会とかなら敷居が低く感じるかと思います。

 社外勉強会に行く次のステップとして、学会とか国際会議を聞きに行くのを是非お勧めします。