Scalaと過ごした5ヶ月間
Demand Side Science(株) 岡田遥来
もくじ
• 自己紹介
• Demand Side Science(株)について
• Scalaの学習
• Scalaと仲良くなるためにやったこと
$ whoami
• 岡田遥来
• Scalaエンジニア
• 2015/03∼ Demand Side Science(株)
• 前職ではC#(Windowsアプリ), Railsなど
• 趣味でiPhoneアプリ
$ whoami
• ジャズトランペット
• 「カンタス村田とサンバマシーンズ」で

FUJI ROCK’10 ROOKIE A GO-GO出場
DSSについて
• 2012/11 設立
• 社員10名
• 3PAS, アドベリ, DSPなど
DSSの開発環境
• すべてのプロダクトでScalaを使用
• Webアプリ(Play, Spray)
• 入札サーバ(Finagle)
• ログ集計など各種バッチ
DSSの開発環境
• IDE
• IntelliJ IDEA : 7名
• Eclipse(Scala IDE) : 2名
• Emacs + Ensime : 1名
_人人人人人_
> Ensime <
 ̄Y^Y^Y^Y ̄
Scala
• Martin Odersky教授により設計
• オブジェクト指向
• 関数型のエッセンス
• JVMで動く
• Javaのライブラリをシームレスに使える
Scala
• アドテク業界で採用例が多い印象
• Cyber Agent, Smart News, 

Septeni, Fringe81, …
• 競合言語
• Java, Groovy, Ruby, …
Scalaの会社に入って
• Scala未経験からのスタート
• シンタックスシュガーが多く、一通り読める
ようになるのに苦労
例. Dispatchのコード
import dispatch._, Defaults._
val svc = url(“http://api.hostip.info/country.php")
val country = Http(svc OK as.String)
• HTTPクライアント
• http://dispatch.databinder.net/Dispatch.html
import dispatch._, Defaults._
val svc = url(“http://api.hostip.info/country.php")
val country = Http(svc OK as.String)
もやっとする
svcはReq型だが、ReqにOKメソッドはない
スペース区切りで3つキーワードが並んでいる

どう結合してるのか一見わかりづらい
import dispatch._, Defaults._
val svc = url(“http://api.hostip.info/country.php")
val country = Http(svc OK as.String)
解説
RequestHandlerTupleBuilderにOKメソッ
ドが定義されている
as.Stringを引数としてOKメソッド呼び出し
• 引数が一つのメソッドは、ドットと括弧無しで呼びだせる(中置記法)
• ReqからRequestHandlerTupleBuilderへのimplicit conversionが行われている
Scalaの学習に使った資料
• Scala School!
• Ninety-Nine Scala Problems
Scala School!
• http://twitter.github.io/scala_school/
• http://seratch.hatenablog.jp/entry/
20120218/1329531294 (瀬良さんによる日本語訳)
• コンパクトにまとまっている
• 最低限のScalaの言語仕様を一通りおさえられる
Scala School!
Ninety-Nine Scala Problems
• http://aperiodic.net/phil/scala/s-99/
• 再帰の練習によい
Ninety-Nine Scala Problems
object P05 {
def reverse[A](lst: List[A]): List[A] = {
@tailrec
def reverseIter[A](l: List[A], result: List[A]): List[A] = l match {
case Nil => result
case head :: tail => reverseIter(tail, head :: result)
}
reverseIter(lst, Nil)
}
}
もっとScalaと仲良くなる
ScalaにはREPLがある
• REPL(Read–eval–print loop)
• 対話的にコードを実行する環境
• Ruby(irb)とかPythonとかLISPにもある
scala> final val b = "b"
b: String("b") = b
scala> def foo(c: b.type) = c
foo: (c: String("b"))String
scala> foo("c")
<console>:10: error: type mismatch;
found : String("c")
required: String("b")
foo("c")
^
みんなでREPL
• 社内のチャットボットに

ScalaのREPLを導入(弊社水谷)
よかったこと
• 「これうまい書き方ある?」みたいな議論が

盛んになった
みんなでベンチ
• amemiyasanはベンチマークもとれる
• 業務中にベンチマークを競ったり
結果
• とくにコレクションの理解が進んだ
• 性能特性(List, Vector, Queue, …)
• 「推測するな、計測せよ」の文化が根付いた
あめみやさんデモ
まとめ
• Scalaは仲良くなると面白い
• 言語機能が多いので、色々覚えてくると組
み合わせる楽しみがある
• Scalaと(会社の人とも)仲良くなるには、みん
なでREPLおすすめです
ご清聴ありがとうございました
Demand Side Scienceは

本物のScalaプログラマを募集しています



recruit@demand-side-science.jp

Scalaと過ごした5ヶ月間