SlideShare ist ein Scribd-Unternehmen logo
1 von 41
明日から
業務で使う
Scala
陶山育男
Cyberagent アドテクスタジオ
2017/03/21
陶山 育男
すやま いくお
Cyberagent
アドテクスタジオ LODEO
サーバーサイドエンジニア
Scala歴 1年ちょっと
◎スマートフォン動画広告ネッ
トワーク
◎国内最大級のタテ型動画広告
在庫
◎配信サーバーなど、バックエ
ンドにScalaを採用
“タテフル”
質問
お客様の中に
業務でScalaを使わ
れている方
はいらっしゃいますか?
お話すること
◎ チュートリアルで教
えてくれない(出て
きてもサラッと…)
けど現実世界で役立
つScala
◎ 業務で使い始めた頃
に困ったもの・早く
知っておきたかった
Scala
○「あの時アレを知ってい
れば…」
本日のテーマ
業務で使うScala
お話しないこと
◎ なぜScalaを使うか、
人類はScalaで幸せ
になれるか
◎ object, traitなど基礎
的な文法の話
◎ Mからはじまるやつ
と関数型の話
This is
For Beginners+
チュートリアル終わって、いざ実務!
な方、または使い始めて日が浅い方
チュートリアル未済の方のための良チュートリアル
“ドワンゴさんの研修資料
“はてなさんの資料
“Fringe81さんの資料
弊社のScalaブログ
※チュートリアルではありませんが役立つ情報満載!
1.
業務で使う
開発環境
IDE
ド定番Emacs使いの方ゴメンナサイ…
Scala開発で便利な機能
IDE: IntelliJ + Scala Plugin
◎ ショートカット
○ ^ + Shift + P : 型情報
○ ⌘ + B/⌘ + ^ + B : 定義、実装Jump
○ Alt + Enter : なんでも修正
○ Shift x2: なんでも検索 , etc…
“ 忙しい人のためのIntelliJ IDEAショートカット集(´-`)
◎ ScalaWorkSheet
○ New -> Scala Worksheet
○ IDEエディタ機能が使えるREPL
○ ちょっと複雑なコードの検証に使う
ビルドツール
定番ビルドツール
ちょっとややこしい…
SBT
organization := "io.martin.lover”
version := "0.1.0”
scalaVersion := "2.12.1”
libraryDependencies ++= Seq (
"org.specs2" %% "specs2-core" % "3.8.9" % "test”
)
!?
!?
!?
これだけ覚える
◎ build.sbtはScalaとしてコンパイルされる
○ Scalaコードが書ける。val, lazy val, def が作れる
◉object, classはトップレベルには作れない
○ 見覚えのない記号は⌘+B等で定義を探れる
◎ build.sbt DSL
○ `:=` … 左辺(setting/task key)に右辺の結果を設定する
○ `+=` … 左辺に右辺の結果を追加する
○ `++=` … 左辺に右辺の結果を複数一度に追加する
SBT
SBT: Setting/Task
“SBT-ビルド定義
◎ 左辺:キー
○ SettingKey[T] サブプロジェクト読み込み時、一度だけ計算
○ TaskKey[T] 毎回計算。副作用を伴う可能性あり
◎ オペレーター:マクロ
◎ 右辺:本文
○ 設定する値
SBT: Libraly Dependencies
“SBT-ライブラリ依存性
libraryDependencies += ”groupID” %% ”artifactID” % ”revision" % ”configuratioin"
○ 依存管理はApache Ivy 、Mavenと同じ感覚でつかえる
○ デフォルトでMavenのpublicRepを探す
libraryDependencies ++= Seq (
"commons-daemon" % "commons-daemon" % "1.0.15",
"org.specs2" %% "specs2-core" % "3.8.9" % "test”
excludeAll ExclusionRule(organization = "log4j")
) 特定のライブラリを弾きたいことが
稀によくある
○ %% はscalaVersionキーで定義したScalaのバージョン(ク
ロスビルド)のバイナリを探す
○ scalaVersion := “2.12.1“とした場合は “_2.12“ をartifactIDに
補うだけ。↑の例では “secs2-core_2.12“ を探す
javaライブラリは`%`
Scalaビルドがあるときは`%%`
SBT: Multi Projects
“SBT−マルチプロジェクト
lazy val `core` = (project in file("core"))
lazy val `web` = project
○ 共通モデルやUtil の切り出し等、複数の異存のあるプロジ
ェクトを作りたいとき(ほとんど毎回…)
○ project はマクロで、変数名をIDにしたProject型の値を作成
する
○ IDとディレクトリが同じ時は省略できる
SBT: Multi Projects Sample
“サンプル – フル版
lazy val commonSettings = Seq(
organization := "io.martin.lover",
version := "0.1.0",
scalaVersion := "2.12.1"
)
lazy val `root` = (project in file("."))
.aggregate(`core`, `web`)
lazy val `core` = (project in file("core"))
.settings(commonSettings)
lazy val `web` = (project in file("web"))
.settings(commonSettings)
.settings(libraryDependencies ++= webLibraryDependencies)
.dependsOn(core)
lazy val webLibraryDependencies = Seq(/* ... */)
$ sbt
sbt> project core
サブプロジェクト切り替え。
初回時自動で必要なデレィクトリが
作成される
集約。
集約される側(core, web)で
同じタスクを実行。
依存。
依存される側(core)で
同じタスクを先に実行
&クラスパスに読み込み
2.
業務で使う
頻出イディオム
省略
省略
val list = Seq(1, 2, 3, 4, 5)
list map { i =>
i + 1
}
わかる
!!?
◎ 知ってないと読めない形が多い、、
◎ 容赦なくライブラリのチュートリアル等で出
て、DSLと見分けつかなくて困った
◎ 頻出の形をPickupして紹介します。
○ あとは出てきたときに頑張る
“Scala の省略ルール早覚え
“Scalaでのメソッド呼び出しの書き方一覧と推奨される書き方
省略: ラムダ式
val list = Seq(1, 2, 3, 4, 5)
def double(i: Int): Int = {
i * 2
}
list.map(double)
val double:(Int) => Int = (i: Int) => i * 2
list.map(double)
○ doubleは普通の関数定義。mapは引数1つの関数を引数に
取る高階関数。
関数型定義
のS.S.
Function1のインスタンス
=無名関数=ラムダ式
○ 関数定義の省略。Function1型の変数として書ける。右辺
はラムダ式と呼ばれる
省略: 中置記法
val list = Seq(1, 2, 3, 4, 5)
val double2:(Int) => Int = (i: Int) => i * 2
list.map(i => i * 2)
list map { i =>
i * 2
}
○ 引数の型が自明の場合、引数型を省略してよい
○ 引数が1つの場合、()を省略して良い
: Int と () を省略
list map {_ * 2}
○ . と () の省略(中置記法)
○ 関数を引数に1つ取る場合、() の代わりに {} を使って良い
この形が頻出!
○ すべての引数が1回しか使われない場合、引数定義を省略
して `_` にできる(!)
_ は一つ目の引数、の意。頻出!!
ライブラリに見る中置記法
val name = "martin.lover"
val memberId: Option[Long] = DB readOnly { implicit session =>
sql"select id from members where name = ${name}"
.map(rs => rs.long("id"))
.single
.apply()
}
scalikeJDBC
"Specs2" should {
"use infix notation" in {
"test" mustEqual "test"
}
}
specs2
val route: Route =
get {
pathPrefix("item" / LongNumber) { id =>
// there might be no item for a given id
val maybeItem: Future[Option[Item]] = fetchItem(id)
akka-http
should, inが高階関数
() => Flagment
readOnly が高階関数
DBSession => A
pathPrefixが高階関数
Directive1
For Comprehension
For Comprehension
val maybeName: Option[String] = Some("martin.lover")
val maybeAge: Option[Int] = Some(33)
case class Person(name:String, age:Int)
val person: Option[Person] =
for {
name <- maybeName
age <- maybeAge
} yield Person(name, age)
わかる
!!?
◎ 覚えるとすごい便利&強力
◎ 制御を追わなくて良くなるので、可読性↑↑
○ 好みはあると思います。。LODEOでは頻出。
わかる
“ Scalaスケーラブルプログラミング(コップ本)
23章 for式の再説
For Comprehension: 展開
val maybeName: Option[String] = Some("martin.lover")
val maybeAge: Option[Int] = Some(33)
val person: Option[Person] =
for {
name <- maybeName
age <- maybeAge
} yield Person(name, age)
val person: Option[Person] =
maybeName flatMap { name =>
maybeAge map { age =>
Person(name, age)
}
}
○ `<-` はジェネレーターと呼ばれる
○ flatMap とか map とか foreach とか withFilter に展開される
なるほど
わからん
For Comprehension: 覚え方
val person: Option[Person] =
for {
name <- maybeName
age <- maybeAge
addr <- maybeAddr
} yield Person(name, age)
Forを始めた外側の
型が最後まで続く
Option[String]外側剥がれる
name:String
外側の型を
揃える
Option[T]
中はなんでも良い
計算失敗したら
それ以上実行
しない
最後まで成功したら
外側の型でくるんで返す
○ flatMap, mapが実装されていれば、ここでいう「外側の型」
として使える=「文脈付きの型」
○ 上の例なら、maybeName,maybeAge,maybeAddrがすべて
Someなら Some(Person), どれかNoneならNoneが返る
For Comp~: うれしいこと
maybeName match {
case Some(name) => maybeAge match {
case Some(age) => maybeAddr match {
case Some(addr) => Person(name, age)
case None => None
}
case None => None
}
case None => None
}
(maybeName, maybeAge, maybeAddr) match {
case (Some(name), Some(age), Some(addr)) =>
Some(Person(name, age))
case _ => None
}
○ こういうコードが見やすく改善できる
○ matchのネストを見たらfor文で書き換えるプルリクチャンス!
どこで終わるの、、、
()多すぎ、、
For Comp~: flatMap御三家
◎Option[T]
○ 値があるかもしれないしないかもしれない
◎Future[T]
○ 値が未来に取得できるかもしれない
◎Either[T]
○ 右かもしれないし左かもしれない
For Comp~: Either flatMap
def validateName(name: String): Either[String, String]
def validateAge(age: Int): Either[String, Int]
val validPerson =
for {
name <- maybeName toRight "Name is Required"
age <- maybeAge toRight "Age is Required"
_ <- validateName(name)
_ <- validateAge(age)
} yield Person(name, age)
○ Eitherの例。複数重なるとmatchネストしがち
○ Scala 2.12 で Either が Right-Biasになった!!
◉.rightを書かなくて良くなった
Eitherを返したいので、
OptionをEitherに変換して
Eitherでforを始める
Eitherの検証のみで値を
利用しないときは _
で受ける
“他の型でのサンプル
3.
業務で使う
デプロイ・運用
Config
Config
libraryDependencies ++= Seq (
"com.typesafe" % "config" % "1.3.1"
)
server {
host = "localhost"
port = 8080
}
import com.typesafe.config.ConfigFactory
val config = ConfigFactory.load
val host = config.getString("server.host")
val port = config.getString("server.port")
println(s"server start: http://${host}:${port}”)
○ 基本 TypesafeConfig で困らない。多くのライブラリで利用
○ Developmet / Staging / Producion で値を切り替えたい
build.sbt
resources/application.conf
Hoge.scala
この名前のファイルは
デフォルトで読み込まれる
Config切り替え
include "application.conf"
server {
host = ”unit.test.io"
}
○ UT用は test/resources/に置くだけ。設定したものだけ上書き
○ 環境切り替えには各環境毎にそれぞれファイルを準備し、JVM
Optionで渡すのが(おそらく)最も簡単
test/resources/application.conf
include "application.conf"
server {
host = "martin.lover.io"
}
resources/production.conf
$ java –Dconfig.resource=production.conf -jar martin_lover_io.jar
$ java –Dconfig.file=/path/to/your/resources/production.conf
application.confをincludeし、
producion.confで記載したものだけ上書きする
起動時にJVMオプションで読み込むファイルを指定
config.fileでクラスパス外ファイルも指定可能
パッケージ
パッケージ: sbt-native-packager
lazy val `web` = (project in file("web"))
:
.enablePlugins(JavaServerAppPackaging)
build.sbt
“sbt-native-packager
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.4")
project/plugins.sbt
○ sbt-assemblyをよく利用しているが、こちらはより多機能
○ 起動スクリプトが作れる。DockerImage や (使わないと思う
が)msi, dmg も作れる
“sbt-native-packager
`Archetypes`
サーバーなのかアプリ
なのかなど、アプリ自
体の特性 `Formats` Universal
Jarを作って固める
`Formats`
プラットフォーム特有
のファイルを追加する
パッケージ: sbt-native-packager
lazy val `web` = (project in file("web"))
:
.settings(buildSettings)
.enablePlugins(JavaServerAppPackaging)
.enablePlugins(SystemVPlugin)
.enablePlugins(RpmPlugin)
build.sbt
“build.sbtの完全なサンプル
`Archetypes`
サーバー起動
`Systemloaders`
`Formats`
○ Systemloadersを指定
◉Cent系で /etc/init.d のスクリプトがほしいときはSystemV
○ Rpmビルドを作成することを宣言
◉Universalビルドではプラットフォーム依存のファイルは作成されない
$ sbt
sbt> project web
[web] > rpm:packageBin
パッケージ: sbt-native-packager
デプロイ
デプロイ
○ Lodeoの例。
○ 特別なことはなく、JenkinsからJarを配って起動している
デプロイ
ビルド
CI
PR
マージ
まとめ
Scalaむずい
ハイコンテクスト文化…
でも楽しい!!
よいScalaライフを!!
全く網羅的ではありませんでしたが
何か一つでも今後のお役に立てば…
Thanks!
…And any questions?

Weitere ähnliche Inhalte

Was ist angesagt?

JSX / Haxe / TypeScript
JSX / Haxe / TypeScriptJSX / Haxe / TypeScript
JSX / Haxe / TypeScriptbleis tift
 
データ解析技術入門(R編)
データ解析技術入門(R編)データ解析技術入門(R編)
データ解析技術入門(R編)Takumi Asai
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!Ra Zon
 
すごいHaskell読書会 第7章 (前編)
すごいHaskell読書会 第7章 (前編)すごいHaskell読書会 第7章 (前編)
すごいHaskell読書会 第7章 (前編)Suguru Hamazaki
 
闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみたSatoshi Sato
 
Pythonデータ分析 第4回勉強会資料 12章
Pythonデータ分析 第4回勉強会資料 12章Pythonデータ分析 第4回勉強会資料 12章
Pythonデータ分析 第4回勉強会資料 12章Makoto Kawano
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Ra Zon
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)parrotstudio
 
リテラル文字列型までの道
リテラル文字列型までの道リテラル文字列型までの道
リテラル文字列型までの道Satoshi Sato
 
Define and expansion of cpp macro
Define and expansion of cpp macroDefine and expansion of cpp macro
Define and expansion of cpp macrodigitalghost
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門Kimikazu Kato
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
Material
MaterialMaterial
Material_TUNE_
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードShigenori Sagawa
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
 

Was ist angesagt? (20)

JSX / Haxe / TypeScript
JSX / Haxe / TypeScriptJSX / Haxe / TypeScript
JSX / Haxe / TypeScript
 
データ解析技術入門(R編)
データ解析技術入門(R編)データ解析技術入門(R編)
データ解析技術入門(R編)
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!
 
すごいHaskell読書会 第7章 (前編)
すごいHaskell読書会 第7章 (前編)すごいHaskell読書会 第7章 (前編)
すごいHaskell読書会 第7章 (前編)
 
闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみた
 
C++ template-primer
C++ template-primerC++ template-primer
C++ template-primer
 
Pythonデータ分析 第4回勉強会資料 12章
Pythonデータ分析 第4回勉強会資料 12章Pythonデータ分析 第4回勉強会資料 12章
Pythonデータ分析 第4回勉強会資料 12章
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
 
リテラル文字列型までの道
リテラル文字列型までの道リテラル文字列型までの道
リテラル文字列型までの道
 
Define and expansion of cpp macro
Define and expansion of cpp macroDefine and expansion of cpp macro
Define and expansion of cpp macro
 
C++の黒魔術
C++の黒魔術C++の黒魔術
C++の黒魔術
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
Material
MaterialMaterial
Material
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 

Andere mochten auch

【LT】akka receive とScala Javaの違い
【LT】akka receive とScala Javaの違い 【LT】akka receive とScala Javaの違い
【LT】akka receive とScala Javaの違い 賢太郎 前多
 
Akkaの翻訳みんなでやろう Let's translate akka doc
Akkaの翻訳みんなでやろう Let's translate akka docAkkaの翻訳みんなでやろう Let's translate akka doc
Akkaの翻訳みんなでやろう Let's translate akka doc賢太郎 前多
 
ディープラーニングとは
ディープラーニングとはディープラーニングとは
ディープラーニングとはNVIDIA Japan
 
Technology Content Marketing 2017 - Benchmarks, Budgets & Trends - North America
Technology Content Marketing 2017 - Benchmarks, Budgets & Trends - North AmericaTechnology Content Marketing 2017 - Benchmarks, Budgets & Trends - North America
Technology Content Marketing 2017 - Benchmarks, Budgets & Trends - North AmericaContent Marketing Institute
 
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016Yota Ishida
 
【講演資料】激変する自動車業界におけるクルマ屋の戦略
【講演資料】激変する自動車業界におけるクルマ屋の戦略【講演資料】激変する自動車業界におけるクルマ屋の戦略
【講演資料】激変する自動車業界におけるクルマ屋の戦略naoto kyo
 
リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介Recruit Technologies
 
困らない程度のJDK入門
困らない程度のJDK入門困らない程度のJDK入門
困らない程度のJDK入門Yohei Oda
 
Architecture of Falcon, a new chat messaging backend system build on Scala
Architecture of Falcon,  a new chat messaging backend system  build on ScalaArchitecture of Falcon,  a new chat messaging backend system  build on Scala
Architecture of Falcon, a new chat messaging backend system build on ScalaTanUkkii
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheLeslie Samuel
 
RTBにおける機械学習システムの実装と運用
RTBにおける機械学習システムの実装と運用RTBにおける機械学習システムの実装と運用
RTBにおける機械学習システムの実装と運用Atsuhiro Narita
 
Kotlinで関数拡張しちゃうぞ![修正版]
Kotlinで関数拡張しちゃうぞ![修正版]Kotlinで関数拡張しちゃうぞ![修正版]
Kotlinで関数拡張しちゃうぞ![修正版]Shinichi Kozake
 
Pony concurrency built into the type system
Pony concurrency built into the type systemPony concurrency built into the type system
Pony concurrency built into the type systemmatsu_chara
 
ePlus Managed FlexPod Services
ePlus Managed FlexPod ServicesePlus Managed FlexPod Services
ePlus Managed FlexPod ServicesePlus
 
Try EarlGrey | 20161118 iOS Test Night
Try EarlGrey | 20161118 iOS Test NightTry EarlGrey | 20161118 iOS Test Night
Try EarlGrey | 20161118 iOS Test Nightichiko_revjune
 
Proxies are Awesome!
Proxies are Awesome!Proxies are Awesome!
Proxies are Awesome!Brendan Eich
 
Apache Spark チュートリアル
Apache Spark チュートリアルApache Spark チュートリアル
Apache Spark チュートリアルK Yamaguchi
 
Elixirと他言語の比較的紹介 ver.2
Elixirと他言語の比較的紹介ver.2Elixirと他言語の比較的紹介ver.2
Elixirと他言語の比較的紹介 ver.2Tsunenori Oohara
 

Andere mochten auch (20)

【LT】akka receive とScala Javaの違い
【LT】akka receive とScala Javaの違い 【LT】akka receive とScala Javaの違い
【LT】akka receive とScala Javaの違い
 
Akkaの翻訳みんなでやろう Let's translate akka doc
Akkaの翻訳みんなでやろう Let's translate akka docAkkaの翻訳みんなでやろう Let's translate akka doc
Akkaの翻訳みんなでやろう Let's translate akka doc
 
ディープラーニングとは
ディープラーニングとはディープラーニングとは
ディープラーニングとは
 
Technology Content Marketing 2017 - Benchmarks, Budgets & Trends - North America
Technology Content Marketing 2017 - Benchmarks, Budgets & Trends - North AmericaTechnology Content Marketing 2017 - Benchmarks, Budgets & Trends - North America
Technology Content Marketing 2017 - Benchmarks, Budgets & Trends - North America
 
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
 
【講演資料】激変する自動車業界におけるクルマ屋の戦略
【講演資料】激変する自動車業界におけるクルマ屋の戦略【講演資料】激変する自動車業界におけるクルマ屋の戦略
【講演資料】激変する自動車業界におけるクルマ屋の戦略
 
リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介
 
困らない程度のJDK入門
困らない程度のJDK入門困らない程度のJDK入門
困らない程度のJDK入門
 
Architecture of Falcon, a new chat messaging backend system build on Scala
Architecture of Falcon,  a new chat messaging backend system  build on ScalaArchitecture of Falcon,  a new chat messaging backend system  build on Scala
Architecture of Falcon, a new chat messaging backend system build on Scala
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your Niche
 
RTBにおける機械学習システムの実装と運用
RTBにおける機械学習システムの実装と運用RTBにおける機械学習システムの実装と運用
RTBにおける機械学習システムの実装と運用
 
Kotlinで関数拡張しちゃうぞ![修正版]
Kotlinで関数拡張しちゃうぞ![修正版]Kotlinで関数拡張しちゃうぞ![修正版]
Kotlinで関数拡張しちゃうぞ![修正版]
 
Pony concurrency built into the type system
Pony concurrency built into the type systemPony concurrency built into the type system
Pony concurrency built into the type system
 
ePlus Managed FlexPod Services
ePlus Managed FlexPod ServicesePlus Managed FlexPod Services
ePlus Managed FlexPod Services
 
Try EarlGrey | 20161118 iOS Test Night
Try EarlGrey | 20161118 iOS Test NightTry EarlGrey | 20161118 iOS Test Night
Try EarlGrey | 20161118 iOS Test Night
 
Akka stream
Akka streamAkka stream
Akka stream
 
Proxies are Awesome!
Proxies are Awesome!Proxies are Awesome!
Proxies are Awesome!
 
Apache Spark チュートリアル
Apache Spark チュートリアルApache Spark チュートリアル
Apache Spark チュートリアル
 
Elixirと他言語の比較的紹介 ver.2
Elixirと他言語の比較的紹介ver.2Elixirと他言語の比較的紹介ver.2
Elixirと他言語の比較的紹介 ver.2
 
Prestoクエリログの保存/分析機能の構築 #yjdsnight
Prestoクエリログの保存/分析機能の構築 #yjdsnightPrestoクエリログの保存/分析機能の構築 #yjdsnight
Prestoクエリログの保存/分析機能の構築 #yjdsnight
 

Ähnlich wie 明日から業務で使うScala

第一回ゆるふわーる
第一回ゆるふわーる第一回ゆるふわーる
第一回ゆるふわーるSachiko Hirata
 
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』Kenta USAMI
 
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案yushin_hirano
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門Makoto Fukuhara
 
OpenGLと行列
OpenGLと行列OpenGLと行列
OpenGLと行列miyosuda
 
OpenGLと行列
OpenGLと行列OpenGLと行列
OpenGLと行列miyosuda
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Ransui Iso
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~CHY72
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2Masao Kato
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについてdekosuke
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座bleis tift
 
Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)Shintaro Fukushima
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんかcch-robo
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Ransui Iso
 

Ähnlich wie 明日から業務で使うScala (20)

Processing
ProcessingProcessing
Processing
 
第一回ゆるふわーる
第一回ゆるふわーる第一回ゆるふわーる
第一回ゆるふわーる
 
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』
 
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門
 
OpenGLと行列
OpenGLと行列OpenGLと行列
OpenGLと行列
 
OpenGLと行列
OpenGLと行列OpenGLと行列
OpenGLと行列
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについて
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
 
Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
Sinatra
SinatraSinatra
Sinatra
 
Scala conf2013
Scala conf2013Scala conf2013
Scala conf2013
 
T4使ってみた
T4使ってみたT4使ってみた
T4使ってみた
 

明日から業務で使うScala

Hinweis der Redaktion

  1. はじめまして。陶山育男といいます。 アドテクスタジオのロデオというプロダクトで、サーバーサイドエンジニアをやっています。 Scala歴は一年とちょっとというところで、まだまだ修行中の身です。 よろしくお願いします。
  2. LODEOについて少し紹介させていただきます。 LODEOは国内最大級の縦型の動画枠を持つ、スマートフォン専用動画広告ネットワークです。 アドテクスタジオでは多くのプロダクトがScalaを採用していますが、LODEOでも配信サーバーなどバックエンドの多くでSalaを採用しています。 右側で動いているのが「タテフル」というLODEO人気のアドフォーマットです。記事からニョキッと出てきてインパクト大です。
  3. ちょっと挙手をお願いしてみてよいでしょうか。 ありがとうございます。
  4. 私もScala歴1年とちょっとでまだまだですが、業務で使い始めた頃にこまったものや、もっと早く知っておきたかったもの、なるべく実践的な内容をお話できればと思っています。
  5. 本セッションはScalaを初めて日が浅いかた、 特に、実務でScalaを利用したい、または利用し始めている方を対象にしています。 ですので、使っていれば常識だよね、なものも多く含まれると思います。 バリバリの方は退屈するかもしれませんが、復習と思ってお付き合いいただければと思います。
  6. まずは軽めの話題から、IDEは多くの人がInlielliJを利用していると思います。 実際周りも8割位はIntelliJなイメージです。Scalaに関連してよく使うショートカットとして、型情報紹介させていただきます。 あとScalaWorkSheetがこまかいコードを試すときとか、sbtのREPLより便利なことが多いのでよく使っています。
  7. Gradleを利用している方もいらっしゃるかもしれませんが、SBTが多いと思います。 最初見た時、これが設定ファイルか …?と思いました。。 業務でちょっと複雑なことをやろうと思うととたんにどうすれば良いんだろう…みたいな。。
  8. とりあえずこれだけ覚えれば戦えると思います。 他はほぼScalaの文法です。 次からもう少し詳細紹介します。
  9. 左側がキーと呼ばれるもので、2つあるんですが、 ほとんどSettingKeyなので、特に意識する必要はないと思います。 右側の式を実行した値を、型安全にタイミングとかをいい感じに設定してくれます。
  10. 最後に、サブプロジェクトの作り方を紹介します。これも業務では頻出と思います。
  11. 代替メソッド名のイメージ通りですが、aggergate は親に設定する、dependsOnは子同士の依存を指定する、と覚えておけば大丈夫と思います。
  12. この形はとても多く出てくると思うのですが、初見だと「ん??」ってなりました。 Scalaではライブラリ特有のDSLが定義されることも多いと思うのですが、それと見分けがつかなくて困った記憶があります。 ↓のリンクの内容を覚えておけばとりあえず戦えると思うのですが、それでも多いので、よく使う形をなるべくわかりやすく紹介しようと思います。
  13. まず関数型の定義と、関数の実装自体を def を Function型の変数として定義する時のシンタックスシュガーです。 これだけでわけがわからないのですが、 val のときは単独の = から左が定義で右が実装、と覚えれば見分けがつくかと思います。
  14. 先程の表現をさらに省略します。で、直接mapに渡すとこうなります。 さらに カッコがブラケットになって、開業するとさっきの形が出てきます。 結構無茶と思うのですが、 さらに アンダースコアで省略できます。
  15. いろいろなライブラリで出てきますが、先程のルールを覚えておけばある程度読み・実装しやすくなるのではないでしょうか。
  16. チュートリアルではサラッと終ることがおおい for comprehensionですが、業務で使い始めてたくさんこの表現に出会いました。 最近は書ける時はほぼこの形で書きます。この方が制御の流れを意識せず、ロジックに集中できるとおもっています。
  17. 教科書によると、flatmapやmapに展開されます。 でも展開されたコードをいちいち想像して実装できないです。。
  18. 感覚的に実装できると思われる方法を紹介してみます。 Flatmap, mapが実装されていれば、この書き方を利用できます。「文脈付きの型」と呼ばれることもあるみたいです。 ここではOptionの例で説明します。 まず、最終的に得たい値の型=ここではOption[Persion]を決めて、その外側の型と同じ型で for 文を始めます。 矢印の左側には文脈が剥がれた型が来ます。矢印の右側はすべて外側の方を揃えるようにします。 こうすると、最後yield句で返した値が、外側の方にくるまれて返される、という寸法です。 この記法で便利なポイントは、flatmapのチェインになるので「うまく行かなかった文脈の時」ここではNoneですが、が途中で出るとそこで計算を止めて、うまく行かなかった型を返せる、ということです。
  19. これを使うと何がうれしいかというと、上記みたいなmatch caseが多重にネストしたコードを制御と目的を分離して明確化できるということです。 Scalaはパターンマッチの機能が強力なので、覚えたての頃はこればかり使いがちだと思うのですが、 Matchのネストが出てきたらforを思い出していただければと思います。
  20. For でよく使う型です。 flatMap御三家というのは僕が勝手につけた名前です。 それぞれ頻出ですね。
  21. パターンマッチのネストになりがちなEitherでの例を紹介して、この章を終わります。 余談ですが、Scala2.12になって、EitherがRight−Biasになって使いやすくなりました。 このコードは正しいname, ageが与えられたときに Personを作って返すコードのサンプルですが、制御がだいぶわかりやすいのではないでしょうか。
  22. 業務コードには必ずコンフィグが入ると思います。 ご存じの方も多いと思いますが、ほとんどのケースでTypesafeConfigを利用すると思います。 UT、Develop、Staging、Productionなど環境ごとにちがう値を読み込みたいはずです。
  23. 色々手段はあるのですが、ここでは最もシンプルと思われる方法を紹介します。 Production.confなど環境毎に設定ファイルを準備します。include でベースと成るファイルを読み込み、差分がある箇所のみ設定を書いて上書きします。 アプリケーション起動時に JVMOptionとして –Dconfigを渡すことで、TypesafeConfigが依存を解決してくれます。便利。
  24. 現状sbt-assemblyをよくつかっています。 Fatjarを作って、自作の起動スクリプトでjavaやjsvcで起動する感じです。 こちらはちょっと使い方が難しいですが、DockerImageが作れたり、起動スクリプトを作成してくれたりしてべんりです。
  25. Sbt-native-packageは多機能な分ちょっと複雑です。ドキュメントはまあまあ親切です。 この図を覚えておくと、必要な設定とか動作が想像しやすいです。 まず`Archetype` を指定します。これはバッチアプリなのか、サーバーみたいなデーモンなのか、みたいなJar自体の起動方法に関する設定です。 で、`Formats` Universalがすべてのプラットフォーム共通のファイル(jarとか)を作成した後、 サブ `Formats` の指定でプラットフォーム特有のファイル(/init.dとかbatとか)を作成します。
  26. 設定例です。Init.dが欲しい時は、SystemVPluginとRpmPluginを指定します。 Init.dを作成するプロセスがプラットフォーム特定あとの処理なので、 `SystemVPlugin` といっしょにRpmPluginを指定します。
  27. Jarファイルができるので、特別なことはないです。 LODEOではJennkinsからデプロイしています。 またアドテクスタジオではCircleCIのEnterpriseを利用しており、その環境でCIを行っています。
  28. チュートリアルから業務で活用できるようになるまでの時間、ラーニングコストがとても高い言語と思います。 でもJavaを書いているよりとても楽しいです! つらつらとお話してしまって全く網羅的ではなかったのですが、何か一つでも今後お役に立てればと思います。