開発ツールの変遷あれこれ


DSS で開発を始めて、早2年半。

Scala を開発技術の軸に据えていることは創業以来変わりないですが、
その周辺のツールは色々変わりました。

Dev

  • ソースコード管理: GitLab => GitHub プライベートリポジトリ
  • ドキュメント管理: GitLab => (Sphinx) => GitHub docs専用リポジトリ + wiki
  • タスク管理: Redmine => GitHub Issue + Waffle.io
  • CI: Jenkins => CircleCI
  • デプロイ: (Capistrano) => Fabric => Ansible + sbt-art
  • DWH: Hadoop(HBase/Hive) => Amazon Redshift
  • 単体テスト: Specs2 => ScalaTest + ScalaCheck

Ops

  • チャット: IP Messenger => IRC => HipChat (+ Slack) + Hubot
  • 監視: Nagios => Zabbix => Amazon CloudWatch + Grafana + 自作ツール

こうして見ると、オンプレミスから着実に AWS + SaaS 構成に移行しています。
CircleCI はまだ始めたばかりなので、これからノウハウを溜めていく予定。

あ、そういえばこんなスライドも作りました。

チーム開発での最優先事項はツールであるという言葉もありますし、
今後もより良いものがあれば積極的に取り入れていきたいですね。

Scala Days 2015 San Francisco に参加してきました (5)


(前回から続く)

Scala Days 閉幕の翌朝、私はタクシーに乗り込みモスコーニ・センター近くの Galvanize University へと向かいました。そこで Scala Days アンカンファレンスが開催されたからです。

sf4-1

このアンカンファレンスは、Scala Days ゴールドスポンサーでもある Nitro Software1の主催によるものです。

sf4-2

参加者は 10名〜15名程度。
私が日本から来たことを告げると emoji (絵文字) の話題になったり2するなど、とても和やかな雰囲気でした。

各々が手を挙げて、自主的にセッションが行われました。

[10:00] Sequencing Futures

sf4-3

最初のスピーカーは jedesah さん。Future をより効率的に使うためのライブラリの紹介です。

  • Future.sequence はナンセンス
  • Future をキャンセルするには?
    • Twitter はキャンセル可能な Future を作った
  • モナドは非常に強力

[10:40] Scraping Reddit with Akka Streams

sf4-4

Akka Streams を使って Reddit3のスクレイピングをしたという話。

  • アップストリームとダウンストリームの差がある場合に有用
  • Reddit のワードカウントの例
  • Scalaz streams との違いは? 性能にどれほど差があるかは不明

[11:20] Introduction to Intuitionistic Type Theory

sf4-5

圏論、カリー化、型理論といったキーワードが出てきましたが、残念ながら私は途中から付いていけなくなってしまいました。(いつか理解できるようになりたい……)

[12:00] ランチ

会場近くの Tava Indian Kitchen でカレーをテイクアウト。
注文方法がなかなか日本では目にかかれないスタイルで、若干戸惑いました。

  • まず、ベースをブリトー、ライス、サラダの中から選びます。4 私はサラダにしました。
  • 肉やチーズの選択。ここは無難にチキン。
  • その上にかけるカレーソースも何種類かあります。よく分からないので “spicy” を注文。
  • トッピングの選択。英単語が分からないので、ここは “all of them!” 一択です。
  • サイドメニューとして、ガーリック・ナンを注文できます
  • アメリカなので、やっぱり量が多かったです

[13:00] Scala Back to Basics: Type classes

sf4-6

型クラスについての話。
また、Scala 学習者向けの教材を色々作っているようで、後ほどその一部を見せてもらいました。

[14:00] Discussion Forum: Driving Scala adoption

椅子を環状に並べて座談会を開催。

sf4-7

  • 一人ずつ自己紹介をして Scala のユースケースを紹介したり
  • Scala の良さを説得して、会社で採用させるためにはどうしたらいいか、といった日本でもよくある話題とか
  • functional.tv がオススメという話とかをしました

[15:00] Adtech x Scala x Performance Tuning

なんと、ここで私の発表です。
全く準備していませんでしたが、昨年発表した こちらのスライド をその場で英訳し、アドリブでなんとか乗り切りました。

非常につたない英語だったと思いますが、皆さん温かく見守ってくれました。感謝感激です。5

今回のカンファレンスのオーガナイザーである、Nitro Software の Alexy Khrabrov さん が写真を撮ってくれました。

<

p>また、この後ある参加者の方と会話し LMAX のパフォーマンス・チューニングについて教えてもらいました。やはり自分からアクションを起こせば、必ず得るものがありますね。

[15:40] Android App Dev in Scala

そして、トリを飾るのは Scala Matsuri の主催でお馴染み、我らが麻植(おえ)さん!
Android 向けアプリを Scala で開発をする際の苦労とノウハウについてのトークでした。

sf4-8

実に堂々たる発表でした。今回私が話すことができたのも、麻植さんがきっかけをくれたお陰です。本当に見習うべきことばかりです!
また、アンカンファレンスが終わった後も色々な国のカンファレンス事情を語ったりなどして、
1時間くらい楽しい時間を過ごしました。


これから勉強すべきことは山ほどありますが、6千里の道も一歩から。
胸いっぱいの充実感を得てサンフランシスコを後にしました。

(おわり)

  1. 現地では「ニトロ」ではなく「ナイトロ」と発音されます []
  2. Unicodeの変数名を付けている奴がいるよ、とか []
  3. 英語圏のソーシャルブックマーク+電子掲示板サイト []
  4. サラダがライスと同列! []
  5. これまで何気なくカンファレンスの英訳スタッフなどを横目でみていましたが、こんなに骨の折れる作業なのかと改めて実感しました []
  6. Scala も英語も数学も…… []

Scala Days 2015 San Francisco に参加してきました (4)


(前回から続く)

Scala Days 2015 サンフランシスコの 3日目のレポートです。
私が聴講したセッションについてポイントをまとめます。

尚、発表スライドはこちらにリスト化されていますので、あわせてご覧ください。

3日目


早いもので Scala Days 2015 San Francisco も最終日。
この日も用意された朝食を満喫してから、キーノートの会場へ向かいます。

[09:00] Technical Leadership from wherever you are

sf3-1

テクニカル・リーダーの心構えについてのプレゼン。
Scala Days の参加者にはリーダー層の方が多いようで、質疑応答の時間が終わっても Dianne さんを取り囲み、白熱したディスカッションが続けられていました。

  • リーダーシップとは何か
  • 組織の中でリーダーシップを発揮するには?
    • 多くの人の意見を聞き、実践する
    • 成功体験を捨てる
    • 信念のために立ち上がり、恐怖に打ち勝て
  • リーダーは何をするか
    • ビジョン、戦略を持つ
    • コミュニケーション
      • 傾聴すること
      • 人によって会話のプロセスは異なる
      • 情報と時間を与える
    • フィードバックを得る
      • これが一番重要
      • あなたが常に正しいとは限らない
  • テクニカル・マネージャの困難
    • ミーティングばかりでコードを書けない
      • それでも、Tech Muscle (技術筋肉) を鍛え続けよう
    • 締切のない (Off-critical path) プロジェクトを作る
    • 社内ハッカソンはとても良い
  • 最初の仕事から、経営者のように振る舞え
  • 質疑応答
    • 2人のリーダーが異なるビジョンを持っており、対立している。どうしたらいいか?
      • (これは切実な問題ですね)

[10:25] How Scala is made

sf3-2

Scala言語のコンパイラやコアライブラリの開発を行っている Typesafe社のエンジニアの発表。

  • なぜ Scala を作るのか
    • インパクトを与えたい
    • 新規性と普及度の両立
      • 当初は多くの博士が作った言語ということもあり、新規性が高かった
      • C と似たシンタックスだと普及しやすい
    • 安定性が大事
      • 測定可能にする
      • しかし、安定のために機能を捨てるのは悲しい
  • どのように新しい機能を検討するのか
    • コンパイラやコアライブラリの機能追加は 1年以上かかる
    • ユーザーをセグメント化して分析
    • オプト・イン方式で、フラグとしてリリース
  • ツールとベストプラクティス
    • ツール最優先主義
      • 良いツールを使えば、自然と品質、生産性、リリース速度が向上する
    • 巨大な Scala コミュニティのフィードバック・ループ
    • 検証の非属人化
      • Pull Request が送られる度に、複数の観点のテストが走っている
    • どんどんオープンになっているのは素晴らしいこと

[11:35] The Unreasonable Effectiveness of Scala for Big Data

sf3-3

Typesafe社でビッグデータ・アーキテクトを務める Dean Wampler 氏が、ビッグデータと関数型言語の関係について語りました。

  • Hadoop
    • Yahoo で大規模事例あり (2008年時点で 16PB, 4000ノード)
    • MapReduce
      • アルゴリズム実装の難易度が高い
      • APIの問題でボイラープレートが多くなってしまう
    • Scalding (by Twitter) が唯一の希望
      • それでもディスク読み込みのパフォーマンス、バッチとストリームの統合に課題あり
  • Spark
    • 非常にエレガントな関数型API
      • 様々なアルゴリズムに柔軟に対応できる
    • バッチ (mini batches) もストリーム処理も同じように扱える
  • データ処理は数学
    • Algebird (by Twitter)
      • 抽象代数学ライブラリ
      • モノイド・群・環といったものが実装されている
      • サンプリングではなく、ハッシュを使って空間効率を高め、推定する
    • Spire
      • 高速かつ正確な数値計算ライブラリ
    • Scala NLP
  • Spark を使った実装コード紹介
    • 飛行機のフライトに関するシミュレーション

[12:20] ランチ

sf3-4

[13:20] Akka HTTP: The Reactive Web Toolkit

sf3-5

Akka Tech Lead1の Roland Kuhn 氏のプレゼン。Coursera のビデオでもお馴染みの方です。
Akka HTTP の話を期待していたのですが、大部分は Akka Streams のライブ・デモでした。

  • Akka Streams
    • ライブ・デモ
      • Source, Sink を作る
      • mapAsync
      • HTTP ストリーム
  • Akka HTTP
    • もうすぐ開発が終わりそうなところ
    • SSL対応も BidiFlow で実装。本当にもうすぐ実装されるが、Scala Days には間に合わなかった
  • 質疑応答
    • HTTP2 への準備は?
      • まずは HTTP1.1 への対応をしているところ
      • 夏以降か、来年になるか、未定
    • WebSocket
      • SSL対応と同じ時期に、すぐに対応する予定

[14:30] The road to sbt 1.0 is paved with server

sf3-6

日本人には馴染みの深い、横田さんと Josh の sbt についての発表。
2人の掛け合いが絶妙で、会場はとても和やかな雰囲気でした。

  • ビルドツールの歴史
    • sh, make から ant, Maven, Rake といったツールを振り返り
  • sbt 1.0 へのロードマップ
    • sbt-server
      • モジュール化
      • IDEなどからもアクセスできるように
      • まだまだ課題も多い
    • より安定的に
    • プラグインのバイナリ互換性、ビルドソースの互換性を向上

[15:40] Scala needs YOU!

sf3-7

Scala のコントリビューション・ページを一新したそうです。
コミュニティへの貢献について、熱く語ってくれました。

  • コミュニティのためにできること
    • ドキュメントを書く
    • バグ修正
    • ツール/IDEの開発
    • コアライブラリの開発
    • 機能拡張
  • ドキュメントから始めよう
    • 最も完全である必要がある
    • 更新が必要
    • 何よりも助けが必要
  • バグ報告
    • まずはガイド scala-lang.org/contribute を読むこと
    • 書く前に読むのが大事
      • 未整理のもの、議論中のものが多くある
    • チェックリストの確認も忘れずに
  • Scaladoc
    • ドキュメントが欠けている部分を見つける
    • スペルチェック、文法、コードのチェック
      • concurrent.Future のように良いガイドを全てに付けたい
    • Wiki を更新するのも良い貢献
  • ツール/IDE
    • Scalariform にはまだアイコンが無い。チャンスだみんな!
  • コアライブラリ
    • SLIPs: コアライブラリの提案集

[16:50] Why Scala.js

sf3-8

Scala.js のコミッターである Li Haoyi 氏の発表。
軽妙なトークで会場を盛り上げていました。

  • デモ
    • OpenWeatherMap から天気の情報を取り出し、AJAXで表示する
  • Webアプリを作っているScala開発者には
    • JavaScript を書く必要がなくなり、Scala だけで完結
    • ブラウザサイドでも型安全に
  • Webアプリ以外を作っているScala開発者には
    • 作ったものをWebで公開すると、みんなが見てくれる
  • コンパイラ開発者には
    • Scala.js はコンパイルが楽しい
    • リフレクションを使っていないので安全
    • コンパイル時間や出力バイナリのサイズなど、最適化も日々進歩している
  • 質疑応答
    • なぜJS自身ではなくJVMでコンパイルしているのか?
      • JSは速い(Pythonの5倍)と言っても、Javaよりは遥かに遅い
    • TypeScriptについてどう思うか?
      • JS自体が冗長だという問題は解決されていない
      • 複数のFutureのようなAjaxをまとめることができない

カンファレンスを通じて Scala.js に乗り遅れるな、という雰囲気を随所で感じました。
既に「実用レベル」とのことなのでまずは触れる機会を増やしてみようと思います。

[18:00] Closing Panel and Thank You

  • Typesafe
    • 司会: Josh Suereth
    • Adriaan Moors (Scala Tech Lead)
    • Lukas Rytz
    • Jason Zaugg (scalaz コミッター)
    • Grzegorz Kossakowski

sf3-9

最後は、恒例の Typesafe メンバーへの質疑応答コーナーでした。

  • 今後のロードマップは?
    • 2.11.9 は年内にリリース
    • 2.12 の開発も進行中
  • Java の機能を Scala に持ってくる計画はあるか?
    • ない
  • TASTY の仕様確定は?
    • tasteless という噂も

こうして世界的な Scala イベント、Scala Days も盛況のうちに幕を閉じました。
次回は6月にオランダ・アムステルダムで開催されます。

サンフランシスコ、素晴らしい時間をどうもありがとう!

sf3-10

(つづく)

  1. ちなみに、元 Tech Lead の Viktor Klang 氏は Typesafe社の副CTOというポジションになったそうです []

Scala Days 2015 San Francisco に参加してきました (3)


(前回から続く)

Scala Days 2015 サンフランシスコの 2日目のレポートです。
私が聴講したセッションについてポイントをまとめます。

尚、発表スライドはこちらにリスト化されていますので、あわせてご覧ください。

2日目


この日からは終日のセッションです。会場に入ると、朝食が用意されていました。

sf2-1

[09:00] Why Open Languages Win

sf2-2
2日目のキーノートを務めたのは、オープンソース界の女王という二つ名を持つ Danese Cooper さん。オープンソースに対する熱い思いを語ってくれました。
(スライドの表紙は スパイvsスパイ)

  • これまでの軌跡
    • Microsoft, Apple, Symantec, Sun などで様々なプロダクトのオープンソース化に尽力
    • Java One Tokyo (2005年) で サプライズ的に Java のオープンソース化を発表した
  • オープンソースをめぐる戦い
    • C++ vs Java
    • S vs R (統計ソフト)
    • Windows vs Linux
  • GitHub 時代の到来
    • 「ただプロトタイプを作っているだけ」と装っている間に完成させてしまおう (笑)
    • もし新しい言語を作るなら、オープンソースであることが必須条件
      • 金に目が眩むと絶対失敗する
    • Scala の未来は明るい
  • 質疑応答
    • 大変だったことは?
      • コミュニティを形成させてゆくプロセス。
    • マネタイズのモデルは?
      • スポンサー、基金、ライセンスモデルの選択などで成功事例がある。
    • ライセンスについて
      • 法律家に聞くこと。国や、(アメリカでは)州によってルールは色々。

[10:25] Visualize the things

sf2-3

ビッグデータの可視化ツール Sparkle の紹介。

  • オープンソースのデータ可視化クライアント
    • Kafka, Cassandra, D3.js を使用
    • WebSocket と独自の Sparkle プロトコルでストリーミング処理
  • デモ
    • sbt run で Webサーバが立ち上げる
    • D3 ならではの綺麗な見た目で、ズーム処理もスムーズ
  • パフォーマンスとスケーラビリティ
    • スループットを向上するために、メモリ構造から根本的に考えぬいた
    • Reactive Streams を使うことで GC 頻度も減らせる
  • ライブ・レイヤーとデータ・アーキテクチャー
    • Extract Transform Load
    • ライブ処理とバッチ処理

[11:35] Shattering Hadoop’s Large-Scale Sort Record with Spark and Scala

sf2-4

Databricks の共同創設者であり Spark のコミッターでもある Reynold Xin 氏が、Spark の速さの秘訣を紹介してくれました。

  • Spark プロジェクトは、以下の全てをカバーすることが目的
    • 様々なデータサイズ (GBから TB, PB級まで)
    • 様々なストレージ・メディア (RAM/HDD/SSD)
    • 低レイテンシーが要求されるストリーム処理から、長時間のバッチ処理まで
  • ソート処理でベンチマークを取る
    • ディスクI/O, ネットワーク帯域なども含め、総合的なベンチマークになる
  • 高速化へのポイント
    • アプリレベルでの最適化 (よい子はマネしないでね)
      • while loop を使う
      • Scala/Javaのコレクションライブラリを避ける
    • GC 対象外のメモリプールを作る
      • DirectByteBuffer / sun.misc.Unsafe
      • ただし、メモリ使用率が 50% を超えた場合はチューニングの効果は薄くなりがち
    • キャッシュに最適化したソート
      • TimSort / AlphaSort といったアルゴリズム
  • 質問
    • JNI を使わないのはなぜか?

[12:20] ランチ

sf2-5

[13:20] Scala – The Real Spark of Data Science

sf2-6

Spark の話題かと思いきや、フタを開けてみたら「ハンドベル」の話でした。

  • ハンドベルの会社の喩え
    • SCHULMERICH vs Malmarlk
    • どちらが優れているかを議論するのは、よい時間の使い方ではない
      • それよりもユーザ体験向上に尽力すべき
    • Hadoop vs Spark の議論も同じこと
  • 関数型言語と手続き型言語の比較
    • Haskellや圏論、ラムダ計算を知らないと関数型言語を使えない? そんなことはない
    • 逆に手続き型で全てを成し遂げようとしたほうが複雑
    • 関数型のデータ構造の考え方(あるいは基本的な数学)は、ビッグデータに応用できる
  • まとめ
    • 関数型は直感的だ
    • 関数型はシンプルだ
    • 関数型はパワフルだ

[14:30] Type-level Programming in Scala 101

sf2-7

  • Scala におけるコンパイル時の計算
    • val, lazy val, def キーワードは実行時に評価されるが、type はコンパイル時に評価される
  • 組み込み型の値を「型」で表現してみる
    • Boolean
    • Int
    • List[Int]
      • コンパイル時に要素数を知るための工夫
  • 主な用途
    • コンパイル時計算 (実行時計算の削減)
    • コンパイル時バリデーション
  • 質疑応答
    • 今回のコードは実践的なプログラムで使えるか?
      • 「否、これはただの遊びだ」
  • 所感
    • final val でも確かコンパイル時の最適化が走ったかと思います
    • C++のTMPを思い出しました。C++14ではconstexprが大幅に制限緩和され非常に使いやすくなりましたが、Scalaにもいつかその流れが来るのでしょうか。

[15:40] Stream as Scala Collections

sf2-8

今回の Scala Days のゴールドスポンサーでもあるニトロソフトウェアの発表。AWS S3 の処理のために、独自のストリーム処理ライブラリを作ったとのこと。

  • ニトロソフトウェアについて
    • クラウド上でのドキュメントサービスを提供
    • ユーザ体験、状態の変化、変動する負荷、予期せぬエラーに対して、全てがリアクティブに設計されている
    • 数十億個の S3 オブジェクトを常時利用
  • なぜストリーム処理か
    • 仮に 1% のエラーでも数千万件のオブジェクトを失う。ビジネス損失が大きい。
    • AWS S3 に合わせた並列化: Amazon の環境は遅くなったり早くなったりする
  • コードは GitHub(https://github.com/nitro/streamcollections/)で公開
  • 質疑応答
    • ライブラリから、ストリーム部分だけを切り出してライブラリ化したほうがよいのではないか。AWSライブラリへの依存は重すぎる。

[15:40] Type-safe off-heap memory for Scala

sf2-9

前のセッションが早めに終わったので、もう一つ見に行きました。型安全な off-heap メモリを実現するライブラリ scala-offheap の紹介。

  • off-heap メモリの必要性
    • GC対象としたくない
      • 巨大なデータをメモリに乗せる
      • 厳しいレイテンシ要件を満たしたい
    • ネイティブコードとのメモリ共有
  • off-heap メモリの使い方
    • Direct byte buffers
      • 1バッファあたり2GBという制限
      • 境界チェックによる性能劣化
    • sun.misc.Unsafe
      • メモリの不正アクセスやリークの温床となりがち
    • C言語でコードを書き、JNI/JNAでアクセス
      • 多くのボイラープレートコード
      • 構成の複雑化
      • メモリリークの問題
  • 具体例
    • 二次元座標
  • パフォーマンスを重視
    • メモリプーリングは定数時間で実行可能
  • 質疑応答
    • off-heap メモリと on-heap メモリをクラスからシームレスに使うことはできるか?
      • sun.misc.Unsafe ベースであるため実現は難しい
    • off-heap メモリの共有はできるか?
      • 現状、サポートしていない

[16:50] Function-Passing Style, A New Model for Asynchronous and Distributed Programming

sf2-10

今や Josh と並び Scala Days の顔である、 Heather さんの発表。昨年の Scala Days で発表した Spores を発展させ、関数パッシングモデルという新しいプログラミング手法のアイデアを披露しました。

  • アイデアは Actor の逆
    • メッセージではなく、関数をやり取りする
    • 分散プログラミング・高分散モデルへの適用が狙い
  • コンセプト
    • Silos (サイロ): データを保管するための貯蔵庫。データは全て immutable
    • Spores: ポータブルかつシリアライズ可能な関数
    • サイロの間をラムダが行き交うイメージ
  • 現在の状況
    • 論文のドラフトを作成中
    • googleグループ function-passing でも議論中
  • 質疑応答
    • 関数の合成とは何が違うのか
    • Spores が巨大になったらメモリを使い果たすのではないか
      • 課題として認識しているとのこと
    • パフォーマンスはどうか
    • master ノードの冗長性は?

[18:00] Easy Scalability with Akka

sf2-11

初心者向けセッションの部屋でしたが、DDDD (Distributed Domain-Driven Design / 分散型ドメイン駆動設計) がテーマの熱い内容でした。

  • キーワード
    • DDD: ドメイン駆動設計
    • Akka は Erlang/Elixir と似ているが、よりベターである
    • CORS: Command Query Responsibility Segregation
    • ES: Event-Sourcing
  • 従来のDDD
    • I/O がボトルネックになる
    • データストアの共有が必要
    • 大量のインスタンスが必要
  • DDDD
    • スケーラビリティ
    • フェールオーバー
    • シンプルさ
  • オンライン・オークションの実装例
    • Gatling で性能測定してみた
      • 測定結果の形状に大きな違い
      • ボトルネックが変わったため
  • CRUD の場合
    • ノードを追加しても、性能が線形に向上しない
    • コンテンション(競合状態)が増える
    • チューニングがあまり役に立たないことも多い
  • CQRS の場合
    • 結果的に CRUD の約3倍のスループットを達成
    • ノードを追加すると、ほぼ線形に性能も上がる
    • 競合なし
    • チューニングが重要
  • 質疑応答
    • ビジネスドメインが変わって、DBのスキーマが変わったら?
      • 過去は変えるな by Jonas
      • とはいえ、デシリアライズの工夫など泥臭い対応も必要
    • Apache Camel おすすめ

[18:45] コミュニティパーティー

この日はセントパトリックデーということもあり、アイルランドにちなんだ料理が並んでいました。

sf2-12

(つづく)

Scala Days 2015 San Francisco に参加してきました (2)


(前回から続く)

CTO Roundtable の後はレジストレーション、そして Odersky先生のキーノートです。

1日目 (続き)


[16:00] レジストレーション

今回のメイン会場である Herbst Pavillion へ。

reg1

中に入ると、パーティ用のフロア1とスポンサー各社のブースが目に入ります。

reg2

ノベルティはこのような感じ。Tシャツのデザインは昨年のものと同じですが、背中の Scala ロゴがなくなっていました。また、参加者の名札と一緒に3日間のプログラムや会場地図がつづられており、これがとても便利でした。

novelty

artima本のブースも盛況でした。(Scala Puzzlers が一番人気)

reg4

さらに奥へ進んだ先が、キーノートの会場です。

reg5

[17:00] オープニング

ステージに Typesafe社の Josh Suereth氏、Dick Wall氏、EPFLの Heather Miller女史が登場し、Scala Days が開幕!

会場のボルテージも一気に上がります。

open1

“Don’t be a jerk.” (イヤな奴になるな) といったおなじみの行動規範や会場の説明、昨年好評を博した 47 degrees 社開発の専用スマートフォンアプリ、セッションに対する投票システムの紹介などが行われました。

open2

そして、いよいよ Odersky先生が登場します。

[17:10] Scala – where it came from, where it’s going

  • スピーカー: Scala 生みの親, Typesafe 共同創設者 Martin Odersky

od1

Scala はどこから来て、どこへ向かうのか。というテーマですが、Scala の将来の話はしません。

なぜなら、Scala は Hascalator へと生まれ変わるからです。

『Scala は Haskell への ゲートウェイ・ドラッグです』

od2

と笑いを取った後で本題へ。

Scala のこれまで

まずは、Scala のこれまでの軌跡とコンセプトが紹介されます。

  • Scala の前に学んだ/作った言語
  • Scala 開発の動機: XMLリテラルを実現するために、配列の参照を [] ではなく () に、型パラメータを <> ではなく [] にした。それでやっと、<> が使えるようになった。(笑)
  • Scala 言語自身がスケールするように
  • 型システムこそ Scala の中心: 安全性と柔軟性/使いやすさの両立を目指す

Scala の現在

続いて、Scala の現在と称して のエコシステム(生態系)の紹介。JVM と同列に JS が書かれていることからも、Scala.JS への期待の大きさがうかがえます。

od3

Scala.JS は 2015/2/15 にバージョン 0.6 がリリース。実用段階に入った、と明言されました。

その他のトピックとして

  • sbt の改善 (インクリメンタル・ビルドなど)
  • Eclipse, IntelliJ IDEA, Ensime (Emacs用プラグイン) といった IDE/エディタの充実 (implicit も追いかけられる)
  • Coursera のオンライン授業2個2

について言及がありました。

Scala のこれから

TASTY

最初に紹介されたのは、TASTY3を中心としたコンパイル構造の変化について。

以下のような 2段階のステップが踏まれるようになるそうです。

  • 1. [.scala => TASTY]

    Scala コードをコンパイル(scalac)して、まず TASTY という中間ファイルを生成

  • 2. [TASTY => .class | TASTY => .js]

    TASTY をもとにパッケージングツールやリンカーが処理を行うことで、

    プラットフォームに応じた成果物が生成される

    • クラスファイル (JDKの場合)
    • minimize された JavaScriptコード (Scala.JSの場合)

これにより、これまで課題としていたバイナリ互換や、プラットフォーム選択(JDK 7? 8? 9? 10? JS?)が可能となります。 また、最適化・コード分析・リファクタリングなどへの恩恵も受けられるようになるとのことです。

dotc の取り込み

続いて、開発中の dotc コンパイラ (dotty)の機能を取り込むことについて説明がありました。

主な変更点は以下です。

  • XMLリテラルを string interpolation に: xml"""<A>このスライド</A>"""
  • プロシージャ構文の廃止: def foo { println(1) } => コンパイル不可
  • トレイトがパラメータを受け取れるように: trait 2D(x: Double, y: Double)
  • existential type4を簡単に: List[_]
  • 高階型(higher-kinded types)を簡単に: type Two[T] = (T, T)
検討中のアイデア

検討中のアイデアとして以下が挙げられました。

  • 型の union (T&U) と intersection (T|U): まだ未解決の課題もあるとのこと
  • implicit function types: 関数型言語としての作用(effects)に対して、より Scala らしいアプローチができるのではないかと考えられている

最後に、Scala は登場から 10年が経っているのに競合する言語が少ない、との発言がありました。言われてみれば、確かに Java という膨大な資産の恩恵を受けつつ、オブジェクト指向と関数型指向をバランスよく取り入れた言語は、あまり見当たらないかもしれません。

質疑応答

質疑応答では、「言語のルールや、関数型のエッセンスが初学者に難しすぎるのではないか?」という質問がありました。

明確な答えはありませんでしたが、近年は書籍の他に Coursera や、BoldRadius5等のトレーニングを主軸とする会社の登場など、教育のための環境が徐々に整いつつあります。そのような学習ツールを活用すると良いのではないでしょうか。(他にも会話した人の中で、独自の教育プログラムを持っているという方もいました。)

[18:30] 歓迎パーティー

料理とビール、ワインなどが用意されて、パーティーとなりました。

量は(アメリカとしては)少し控えめでしたね。

party

今回はベルリンと比べ、日本からの参加者と多く出会うことができました。

各社のブログも、非常に参考になります。勉強させていただきます。

(つづく)

  1. Scala Days の期間中ずっと、雑談&休憩スペースとして使えました []
  2. 私も、2つとも受講しました。非常におすすめです。 []
  3. Serialized Typed Abstract Syntax Trees が由来。3日目のクロージングでは、Josh Suereth 氏から「TASTY は tasteless という噂もある」というジョークも飛び出しました。 []
  4. 日本語訳が分かりませんでした []
  5. Scala Days プラチナスポンサー []

Scala Days 2015 San Francisco に参加してきました (1)


こんにちは。@mogproject です。

世界最大の Scala イベントといえば、Scala Days !
今年は 3月:サンフランシスコ(アメリカ)、6月:アムステルダム(オランダ) と初の年2回開催です。

私も昨年のベルリンに続き、サンフランシスコに飛んでまいりました。1
その雰囲気を少しだけお伝えしたいと思います。

会場

今回の会場は、アメリカ・サンフランシスコの海岸沿いにあるフォートメイソン(Fort Mason)。
元々はアメリカ海軍の基地だった場所で、古い建物や倉庫などが当時の趣のままに利用されている、一風変わったイベント会場です。
(横浜の赤レンガ倉庫みたいな感じでしょうか)2

fortmason

ゴールデン・ゲート・ブリッジが目と鼻の先という素晴らしいロケーション。

goldengatebr

周りには広い公園があり、休日は多くの人でにぎわいます。

park

少し歩くと、映画『ザ・ロック』でおなじみのアルカトラズ島が眼前に現れます。3

alcatraz

 

1日目


CTO Roundtable

Scala Days のプログラムには載っていないのですが、Odersky先生の Keynote が始まる前に
CTO Roundtable という催しが開催されました。

[12:00] 開場

軽食が用意され、コーヒーを片手に雑談。随所でネットワーキングが行われていました。

ctoroundtable

そして、プレゼンテーションが始まります。

[12:50] GO REACTIVE

『時代は変わった。今こそ Reactive!』と熱弁を振るいます。

jonas

[13:15] Going Reactive With Typesafe Reactive Platform

クラウド・ドキュメンテーションのサービスを Play2+Scala+Akka で Reactive に作り変えるまでの過程と、エンジニアのチームビルディングに必要な 5×5 の鉄則を紹介してくれました。

tiho

[13:35] Hewlett Packard ストレージシステム分析への Scala適用について

  • スピーカー: Hewlett Packard リード・アーキテクト Jeff Dutton

少人数のプロジェクトで Scala/Play/Spark を採用した事例。
ちなみに、プロビジョニング・ツールは Chef よりも Ansible が気に入っているとのこと。

jeff0

[14:10] Akka Java Implementation

  • スピーカー: Hewlett Packard エンジニアリング・アーキテクト Hugh McKee

Java で Akka を利用している事例。Akka への愛があふれていました。

hugh

[14:30] Monolith to Microservices with Scala

LAMP で構成された一枚岩のシステムを、Scala でマイクロサービス化した話。

『リファクタリングはよく、トラックのタイヤを履き替えるのに例えられるが全く違う。宇宙ステーションを移設するくらい慎重にやらないと、大変なことになる』という言葉には実感が伴っていました。

ajai0

最後にその苦労の過程であるコミットログを可視化した映像が流れると、場内は拍手喝采となりました。

ajai

CTO Roundtable では、Martin Odersky 先生をはじめ、CTO の Jonas Boner 氏、副CTO の Viktor Klang 氏といった Typesafe社のコアメンバーと言葉を交わすことができました。
またその他名だたる企業のCTOクラスと交流できたのは、とても貴重な体験でした。

ちなみにアメリカでは少なくとも 2社のアドテク企業が Scala を採用しているそうです。
また、とある DSP4では D言語を使っているとか。

(つづく)

  1. 実はこのイベントの前にノースカロライナ州立大学のクラウドの取り組みを視察したりなどしたのですが、それはまた別の機会にレポートします []
  2. 昨年 akka meetup で来日した Konrad Malawski 氏の奥様 Ketty さんいわく、サンフランシスコは長崎と似ているとのこと。どちらも港町だし、異文化との融合が見られ、そしてシーフードがおいしい! []
  3. この写真は Scala Days前日に撮ったものですが、この直後サイクリング中の Odersky先生と偶然すれ違ってビックリ []
  4. Demand Side Platform []

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


前回 の続きです。

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

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

3日目


カンファレンス最終日。
この日はホテルで自転車をレンタルし、会場までサイクリングで移動しました。
ベルリンは自転車人口が多く、どんな通りにも自転車専用レーンが整備されています。
道中には歴史的な建造物や緑地が数多くあり、随所でドイツの文化を体感することができました。

  • 国会議事堂

a

[09:00] キーノート: Chad Fowler – @chadfowler

スピーカーの Chad Fowler 氏は、Immutable Infrastructure という言葉を世に広めた1ことでも有名な方です。

印象的なスライドとBGMを駆使した素晴らしいプレゼンテーションに引き込まれました。
話題としては Scala に限った話ではありませんが、キーノートらしい内容だったと思います。

chad

  • レガシーとは何か
    • 多くのエンジニアが持つ偏見: ひどい、嫌い、変化を恐れる頭の硬いマネージャー
    • 一方で、動けばいい、枯れている方が安心、安定しているという意見も
    • 音楽、文学、建築物、ファッション、絵画 ……
      今日でも通用する『レガシー』は皆、素晴らしいもの
    • レガシーを悪い意味で捉えてはいけない
  • 良いソフトウェアになるには 10年かかる
    • にも関わらず、ほとんどのソフトウェアは 5年以内に死ぬ
    • 20年以上生き延びているソフトウェア: TCP/IP, DNS, Linux, Emacs, grep, …
    • Scala は今年で10年。良いソフトウェアの仲間入りができた (笑)
  • 『レガシー』なソフトウェアを作るために
    • 最初の一歩は作ること
    • 価値を提供し続け、替えのきかない存在になる2
  • 生き残るのは、小さな部品システム
    • 人間こそがシステム
    • 細胞のように常に殺し、入れ替えることで、部品は正しく機能する
    • インタフェースは極力シンプルに
  • イミュータブル・デプロイ
    • 既存のノードでは一切のソフトウェア更新を行ってはいけない、という考え方
  • 最初から異なる環境を想定する
    • 例: 特定のプログラミング言語に依存した設計をしない
  • 故障(失敗/障害)を前提とする
    • 全てを監視し、自律的なサービスを
    • Chaos Monkey を使って様々な障害シナリオをランダムに引き起こす
      • 最悪のシナリオを知れば、何も恐れることはない

[10:00] Building a DBMS in Scala or how types can turn a SQL interpreter into a SQL compiler

  • スピーカー: Tiark Rompf – @tiarkrompf
  • スライド (coming soon)

Scala で高性能の DBMS を作れるか、という話。
スピーカーは、EPFL内のOracleの研究施設で働いているという方。

  • 一般化(拡張性・汎用性の向上)と特殊化(応答性能向上)はトレードオフの関係
    • それでも、コンパイル時に計算したり、特殊化のコードを生成することで汎用的な最適化を実現できる

10-01

  • LegoBase という RDBMS を Scala で開発中
    • LMS: Lightweight Modular Staging フレームワークの話
      • ステージング: 順序や使用頻度によってプログラムを置いておくステージを変える
    • クエリの処理順序の最適化: Filter 処理を再帰に実行するなど
    • TPC-H のベンチマークでも良好な成績
  • データベース以外のプロジェクトも、ローレベルなCコードに対抗すべく取り組んでいる
  • Play 2.4 も Reactive Stream ベースの実装に書き換えて、レイテンシが改善しているとのこと

[11:00] Building a Reactive Application

  • スピーカー: Duncan DeVore – @ironfish
  • スライド

  • スピーカーは Viridity Energy という企業の方
    • 電力の大口顧客に対して、プロファイルを受け取って分析・効率化を提案している
  • VPower というクラウドベースのアプリケーションの話
    • 旧来のバージョンは、デプロイ・レスポンス性能・スケーラビリティなどに問題があった
    • ドメイン駆動 + Reactive な設計で作り直した
    • Scala + Akka + Spray.io
  • CQRS: Command/Query Responsibility Segregation
    • コマンドとクエリの分離
    • CRUD モデルは苦痛
    • Append-only アーキテクチャは良い。簡単に分散できてロックを大幅に削減できる
    • 整合性を保つ仕組みの説明
  • ドメイン駆動: 1行のコンフィグで、ビジネスロジックを記述できるようにした
  • 読み込み用と書き込み用のマイクロサービスを異なるJVM上で稼働
    • それぞれ数十個のアクターが動いている
  • Reactive なショッピングカートの実装例
  • 今年の夏に、Manning から本を出版する予定
    • Building Reactive Applications by Duncan DeVore and Sean Walsh

[12:00] ランチ

前日と同じビュッフェスタイルでしたが、メニューは若干変わっていました。


[13:00] Futures and Async: When to Use Which?

Future と Async の違いについて。きちんと理解しておきたいところです。

  • Future について
    • 指定した秒数待機してから結果を返すコードを例に具体的に説明
    • 非同期でないAPIが必要になったら、scala.concurrent.blocking を使う
  • Promise について
    • Promise から future を作る
    • 必要になった場合にのみ使えばよい
  • Async について
    • パイプラインとして使用する例
    • ボクシングの回数が減り、性能が向上するケースもある
    • Production-ready (実業務に耐えうる品質である)
  • Async を使う動機
    • Future ベースのコードをシンプルに書き直せる
    • ただし現在のコードに十分満足しているなら、無理に書き直す必要はない

[14:00] specs2 2.3 whirlwind tour

スピーカーは Specs2 の作者。Specs2 の現状と将来像についてのセッションです。

  • 設計思想の根底にあるのは、実世界とコードの橋渡し
  • Specs2 の機能と使い方を一通り説明
    • sbt, IntelliJ IDEA からテストを実行する例
    • デフォルトでテストは並列処理
      • テストコードの分離性をチェックする助けにもなる
    • Isolation と Selection、タグを付ける
    • コマンドライン引数の解釈
    • ScalaCheck との統合
    • データテーブル形式の記法
    • その他の多種多様な機能
  • Specs2 3.0 の予定
    • 様々なバグ修正
    • オンライン Specification
    • よりライブラリらしく
  • コントリビュートを期待
    • Eclipse プラグイン
    • HTMLレポーティング
    • Selenium と連動した Web テスティング
  • Q&A
    • マッチャーなど、同じ意味のものに様々な書き方がある。
      (===, must_==, must beEqualTo など)
      なぜこのようにしているのか?

      • できるからできる! ルールは自分たちで決めてください (意訳)

早めに終わったのでメイン会場に行くと、こちらのセッションがまだ続いていました。

Scala: The First Ten Years

会場爆笑のムービーが流れた後は撮影会のような様相に。

b


[15:00] Effective APIs

  • スピーカー: Josh Suereth – @jsuereth
  • スライド (coming soon)

本カンファレンスの司会も務めていた Joshua Suereth氏。満を持しての登場です。
API開発のベストプラクティスを紹介してくれました。

josh

  • 良いAPIの基本
    • 型・名前は重要
      • ガイドなしでもユーザが学習できるように、それら自身が説明的であるとよい
    • エラーハンドリング
      • リカバリ可能か
      • ユーザが気にする必要があるか
    • ScalaDoc、チュートリアルを書く
  • バイナリ互換を保つのは大変
    • やってはいけないこと
      • case class のコンストラクタの変更
      • メソッドに引数を追加
      • トレイトに具体メンバを追加
      • クラス/メンバ/引数の削除
    • テクニック
      • 抽象クラスの利用
      • パッケージレベルのプライベート化
      • 独自の unapply 関数を定義して、case class を隠蔽
  • 拡張性を持たせる
    • 公開APIは最小限に留める
    • 引数のデフォルトは避け、オーバーロードを
    • トレイトは pure virtual に
    • final class を適切に利用
    • 既存のメソッドを変えるのではなく、新しいメソッドを追加する
  • Q&A
    • バイナリ互換性が保たれているかどうかを確認する方法はあるか
      • ある。セマンティック・バージョニングによって付けられる番号の変化を確認すればよい。

[16:00] Scala in Numbers – The Ecosystem Census

数字で見る Scala ライブラリ。
GitHub 内の Scala ライブラリを様々な観点でランキングしてみました、というコーナー。
終始和やかな雰囲気で進んでいきました。

  • 識別子の名前
    • ローカル val でよく使われている名前 => result
    • ローカル var でよく使われている名前 => i
    • var が多く使われているライブラリ => rapture-io
    • 引数でよく使われている名前 => f
    • 変数名の長さ => scalaz は 90% の変数名が 2文字以下 (会場爆笑)
  • ライブラリの利用実態
    • 最も多く使われているメソッド => Boolean.&&
    • 最も多く使われているコレクションのメソッド => TraversableLike.map
    • 最も多く使われている predef => augmentString
    • 最も多く定義されている predef 拡張 => any2ArrowAssoc ->
  • 暗黙的な利用
    • 最も多く使われている暗黙的パラメータ => _root_.scala.Function1
    • 最も多く使われている暗黙的パラメータ(Scalaライブラリ) => ClassTag
      • Functor など同じものが複数回出ているのは、表示上 prefix を省いているから
  • 検索ツールの紹介、デモ
    • 構成要素とクローラー
  • 会場からは、deprecated にすべきかどうかの判断材料として便利そう、という意見も
  • さいごに
    • 最も多く記号演算子を定義しているライブラリ => 圧巻の scalaz
    • ユニコードの演算子を定義しているライブラリ => やっぱり scalaz

[17:00] Sparkle: Reactive streams to the browser with scala and d3

スピーカーは Nest、Google、Typesafe といった名だたる企業を渡り歩くエンジニア。
Scala と D3 を使ってデータ可視化のライブラリを作った、という話です。

  • 動機
    • ブラウザ上で大規模データを扱ってインタラクティブな操作(ズームなど)をしたい
    • Scala, JavaScript でデータの変換処理をしたい
  • Sparkle は様々な用途に、誰でも利用可能
    • ビッグデータも素早く可視化
  • Sparkle Data Protocol: WebSocket 対応プロトコルを独自で作成
  • コンポーネントの説明
    • Loaders
    • Fast Storage: Casandra ベースのカラム志向 インメモリDB
    • API
    • Transform
    • Stream
    • Display
  • デモ
    • ダッシュボード
    • repl の操作で正弦波を描画

sparkle

スライドの方にはおまけとして、『Scala の良いところ』や『スタートアップ企業となぜ相性が良いのか』についても記述がありました。


[18:00] クロージング

最後のセッション。
メイン会場で、Typesafe社の方たちへのインタビューが行われました。

closing

  • Scala 2.12 の目玉機能は?
    • Java8対応
    • 邪悪にならないように、Scalaライクに。小さく、速くを目指している
  • Scala 2.13, Scala 3 では、バイナリ互換用の移行ツールを作る予定
  • Scala はオープンなコミュニティ。誰でもコントリビュートできます!

こうして熱狂冷めやらぬままカンファレンスは閉幕。
私自身も、非常に有意義な体験を得られました。

スピーカー・スタッフ・Scala Days 2014 に貢献してくださった全ての方に感謝します。

おわり

  1. Trash Your Servers and Burn Your Code: Immutable Infrastructure and Disposable Components – Chad Fowler []
  2. 出典: Michael Feathers: Your Code.. it’s Alive.. []

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時過ぎなので夜は短い []

ScalaNLP/Breeze入門 2


ScalaNLP/Breezeの使い方の第2回です。

ScalaNLP/Breezeが何かとか、インストール方法などについては第1回をご覧下さい。

Breezeを用いた行列とベクトルの復習

簡単な例として、2行2列の例で説明しましょう。

オブジェクトの生成

breezeでは下記のような(密)ベクトル

\( \displaystyle x = \left( \begin{array}{c} 1 \\ 2 \end{array} \right) , \; y = \left( \begin{array}{c} 3 \\ 4 \end{array} \right) \)

と書く事が出来ます。

下記のような(密)行列

\( \displaystyle A = \left(\begin{array}{cc}
2 & 3 \\
1 & 2
\end{array}\right), \;
B = \left( \begin{array}{cc} 3 & 4 \\ 2 & 3 \end{array}\right)\)

を定義するには、行ベクトル(横ベクトル)を縦に並べて表現します。

加減算、積など

行列の加減算は通常の +, - といった演算子が使用出来ます。また行列の積も * で計算出来ます。

\( \displaystyle
x+y = \left( \begin{array}{c} 4 \\ 6 \end{array}\right), \;
A+B = \left( \begin{array}{cc} 5 & 7 \\ 3 & 5 \end{array}\right), \;
AB = \left( \begin{array}{cc} 12 & 17 \\ 7 & 10 \end{array}\right), \;
Ax = \left( \begin{array}{c} 8 \\ 5 \end{array}\right)
\)
は、

となります。

要素の取得、スライス

行列 \(A\) の要素を取り出したり、その部分(slice)を取り出す事も出来ます。行列 \(A\) をa で表すならば、\(A_{ij}\) は a(i,j) で表現されます。但し数学と違って添字が1-originではなく0-originであることに注意する必要があります。要素やスライスを取得する例は下記の様になります。(ここだけ判り易い様に3行3列の行列を使ってます)

各行や各列のsliceを作るには別の記法もあります。こちらの方が判り易いかもしれません。

mutable object

行列やベクトルは、メモリ使用量や効率を考えmutable objectとして作成されます。従って要素を変更可能です。またsliceは元のobjectを参照しているので下記の様にzの変更を通じてcが変更されます。また*=の様な自分自身を更新する演算子も多数用意されています。

逆行列

逆行列などを計算するにはDouble型の行列である必要があります。

\( \displaystyle A = \left(\begin{array}{cc}
2 & 3 \\
1 & 2
\end{array}\right), \;
B = \left(\begin{array}{cc}
3 & 4 \\
2 & 3
\end{array}\right),
\;x = \left(\begin{array}{c}
1 \\
2
\end{array}\right)
\)

を下記の様に定義します。

\(A\) の逆行列 \(A^{-1}\) はinv(a)で計算出来ますが、\(A^{-1}B, \; A^{-1}x\) と逆行列を用いて計算したいだけの場合は、a \ b, a \ x\ という演算子を用いて逆行列を計算しない事が推奨されています。

\( \displaystyle A^{-1} = \left(\begin{array}{cc}
2 & -3 \\
-1 & 2
\end{array}\right), \;
A^{-1}x = \left(\begin{array}{c}
-4 \\
3 \end{array}\right), \;
A^{-1}B = \left(\begin{array}{cc}
0 & -1 \\
1 & 2
\end{array}\right)
\)
は下記の様になります。