ScalaMatsuri 2016 参加メモ

# 一行感想

Septeni　ミュージックビデオ　かっこいい

[![Scala Matsuri 2016 / Septeni original](http://img.youtube.com/vi/Y7xXKiAW0fE/0.jpg)](http://www.youtube.com/watch?v=Y7xXKiAW0fE)

# 三行感想

前回の[2014](http://2014.scalamatsuri.org/)に比べて、関数型の理論的なセッションは元より、
機械学習や非同期ストリーム処理などの業務経験を元にしたセッションが増え、いわゆるビックデータ関連の前線で普及している印象を受けました。
[Apache Spark](http://spark.apache.org/)や[Play Framework](https://www.playframework.com/)などキラーフレームワークの影響が大きそう。

# 概要

イベント: [ScalaMatsuri 2016](http://scalamatsuri.org/)
日時: 2016/1/30(土)~31(日)
場所: 国際交流館

# 1日目

## [Refactoring in Scala](http://gakuzzzz.github.io/slides/refactoring_in_scala/)

- value typesについて
    - type alias
    - tagged type ([scalaz](https://github.com/scalaz/scalaz)), newtype ([shapeless](https://github.com/milessabin/shapeless))
    - value class: extends AnyVal
        - phantom type
    - prism ([Monocle](https://github.com/julien-truffaut/Monocle)), optic ([shapeless](https://github.com/milessabin/shapeless))
        - 片方向がOption
        - 外部ライブラリ間の変換処理が纏められる
- 質疑
    - abstract type memberも選択肢の一つ

## [Scalaで始めるDeep Learning](http://www.slideshare.net/oeuia/getting-started-with-deep-learning-using-scala)

- [サンプルコード](https://github.com/taisukeoe/matsuri-mnist-example)
- [DeepLearning4j](http://deeplearning4j.org/ja-index.html)
    - 処理の流れは、raw data (ex. image) => Canova (vectorization) => DeepLearning4j (includes ND4J)
    - [ND4S](https://github.com/deeplearning4j/nd4s): ND4JのScala版
        - いわゆるNumPyクローン、行列フィルタ処理ができる
        - subarrayが->記法で書ける
    - ConfigurationはBuilderパターン
    - ニューロン構成要素のうち、weight（掛け算）とbias（足し算）はmutable、activation functionはimmutable
    - 最新版はGPU未対応のため注意
- 参考
    - [深層学習](http://www.amazon.co.jp/dp/4061529021)
    - [Neural Networks for Machine Learning - University of Toronto](https://www.coursera.org/course/neuralnets)
- 質疑
    - activation functionにReLU（[ランプ関数](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%83%97%E9%96%A2%E6%95%B0)）は使える？
        - 使える

## [猫という考え方](http://www.slideshare.net/EugeneYokota/thinking-in-cats)

- [Cats](http://non.github.io/cats/)
    - [Principles for Modular, Functional, Approachable Libraries](http://plastic-idolatry.com/erik/sw2015.pdf)
    - コミュニティ重視
    - 関数型を高パフォーマンスで分かりやすく使えるように
- triple equal
    - 型が異なるものを比較するとコンパイルエラーになる
- 圏論について
    - left identity law, right identity law, associative law
    - uniquness of product
    - uniquness of free monoids
- flatできる型はだいたいモナド

## [バッチを Akka Streams で再実装したら100倍速くなった話](http://www.slideshare.net/kazukinegoro5/akka-streams-100-scalamatsuri)

- SIでの夜間バッチ処理高速化
- [Akka Streams](http://doc.akka.io/docs/akka-stream-and-http-experimental/2.0.3/scala.html)
    - まだexperimental
- Railsと比べて295倍

## sbt-awsプラグインを使って簡単デプロイ by [j5ik2o](https://twitter.com/j5ik2o)

- [sbt-aws-eb](https://github.com/chatwork/sbt-aws)
    - [AWS ElasticBeanstalk](https://aws.amazon.com/jp/elasticbeanstalk/)
- [AWSのためのsbtプラグインを作ってみた](http://c-note.chatwork.com/post/119913385070/)

## [ScalaコードはJVMでどのように表現されているのか](http://www.slideshare.net/jyukutyo/how-scala-code-is-expressed-in-the-jvm)

- クラスファイル
    - cafe babe、Javaマイナーバージョン、Javaメジャーバージョン、...
    - (scala) javap: 逆アセンブラ
    - コンスタントプール (#...)
    - JVM has about 200 instructions
        - 後から追加されたのはinvokeDynamicだけ
- traitはinterfaceとabstract classに分離される
- case classはかなり大きくなる
- パターンマッチはif文やcase文になる
- カリー化は部分適用ごとにクラス生成

## Scala.jsのLT by ChatWorkの方

- Scala.jsを実戦投入中
- Scala.jsでロジックのみ実装、UIはTypeScriptで実装、ロジックとUIは関数呼びださずJSON通信している

## [Functional Programming Patterns v3](https://github.com/47deg/func-architecture-v3)

- Free of Interpretation : Free Monads
- Support Parallel Computation : Free Applicatives
- Composable pieces : Coproducts
- Dependency Injection / IOC : Implicits & Kleisli
- Fault tolerant : Dependently typed checked exceptions

## [Maverick sponsor LT](http://www.slideshare.net/AoiroAoino/maverick-sponsor-lt)

- [Monocle](https://github.com/julien-truffaut/Monocle)のLens便利

## Playソースコード完全マスターへの道 by [tototoshi](https://twitter.com/tototoshi)

- コードリーディングでは、まずbuild.sbtを読む
    - libraryDependicies
    - dependsOn: マルチプロジェクトの依存
- https://github.com/tototoshi/play-dependency-graph
    - play-java, play-scalaに分かれた
    - モジュール化がんばった
- 簡単なDIを採用
    - Constructor-based Dependenc Injection
        - Compile DI
        - Runtime DI: @injectするとGuice...
        - コンストラクタ見れば依存が分かる
- 型クラス
    - クラス定義の外で機能を追加
    - implicitで省略できる
    - Writable, ContentTypeOf, QueryStringBindable, PathBindable, ...
- modules
    - play: core module
    - play-jdbc
    - play-json: json4sに置き換えられるかも
    - play-server
    - play-stream

## [Scalaでドメイン駆動設計に真正面から取り組んだ話](http://www.slideshare.net/yoshiyoshifujii/scalamatsuri-2016)

- Layered Architecture
    - Domain leakつらい
    - モデルとかシーケンス図をホワイトボードで共有
    - too many conversions: ドメイン隔離のためには仕方ない
- Command and Query Responsibility Segregation: コマンドとクエリを分離
    - クエリは適宜レイヤーをスキップする
    - コマンドはきちんとレイヤー分離
- 質疑
    - is-a Root Entityのところはクラス設計が変なのでは

# 2日目

## [Domain-Specific Languages with Scala](https://staff.aist.go.jp/c.artho/papers/artho-2015-icfem.pdf)

- External DSL
    - Parser Combinator
- Internal DSL
    - implicit
    - case class
    - overload
    - 中間記法
    - アノテーション
    - shallow embedding vs deep embedding (Abstract Syntax Treeいじる)
- NASAの軌道計算で、C External DSLからScala Internal DSLに移行
- [modbat](https://staff.aist.go.jp/c.artho/modbat/): Model-based teseting 

## Scalaz入門 by [xuwei_k](https://twitter.com/xuwei_k)など

- オブジェクト指向せずにHaskellライクな型クラスを使うライブラリ
    - subtypingは避ける
- [Scalaz日本語ドキュメント](http://xuwei-k.github.io/scalaz-docs/index.html)
    - [型クラスの継承関係](http://xuwei-k.github.io/scalaz-docs/diagram.html)
- [主要な型クラスの紹介](https://gist.github.com/gakuzzzz/8d497609012863b3ea50)
- [FP in Scala](http://www.amazon.co.jp/dp/4844337769/)は一章だけでも読もう
- 関数型になりきったコードでないとScalaz導入しても意味ない
- IOは難しい
    - 多要求: 失敗するかも、ブロックしたくない、パフォーマンス出したい……
- プロダクトコードでよく使うのはFoldableとかMonoid
- 使いどころが分かりやすいのはValidation
- contravariantなモナドについて 
    - [scalaz.IndexedContsT](http://docs.typelevel.org/api/scalaz/nightly/index.html#scalaz.IndexedContsT): 継続モナド

## [Japanese Text Mining with Scala and Spark](http://www.slideshare.net/wmeddie/scala-matsuri-2016-japanese-text-mining-with-scala-and-spark)

- [サンプルコード](https://github.com/wmeddie/spark-text)
- Spark
    - collect()して初めて実行が始まる
    - パフォーマンスの面ではcache()がとても大事
- [LDA](https://github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/mllib/clustering/LDA.scala)
    - 日本語には単語の区切り文字がない
    - JMecab: インストール大変
    - Kuromoji: Mavenにあるので楽
    - 実用ではカスタム辞書が必要になってくる
    - 言葉から数字を作り出す
    - 前処理頑張れば、機械学習の実行コードはたいてい一行！
    - stop word（です、さん）除去のため、全体の上位50単語は取り除いてしまう
    - predictもできるようになった
- [word2vec](https://code.google.com/archive/p/word2vec/)
    - 言葉の足し引きができる
    - ほとんど事前処理は必要ない、「、」や「。」も意味空間に配置済み
    - なるべく大きなデータセットを用意するべき
    - Paragraph Vectorsがあればレコメンドできるが、Spark未実装
        - 全てのベクトルを足してしまう手法がある
            - まだ数学的な証明はないと思う