SlideShare a Scribd company logo
1 of 30
Download to read offline
1
Slick入門
Takako Shimamoto
BizReach, Inc.
2
アジェンダ
• Scalaの代表的なORM
• Slickの基本的なお話
– スキーマ定義
– クエリ
• SQLを直接書く方法
– Plain SQL
– その他の選択肢
• Play2 + Slickで使うには
– 設定
– コネクションまわり
• プロジェクトでの留意点
3
Scalaで使えるORM
• Slick(旧ScalaQuery)
– タイプセーフなDSLや、SQLも記述可能
– 極力Scalaのコレクションと同じように扱えるよう設計され
ている
• Squeryl
– SQLは使用せず、DSLでクエリを記述する
– コンセプトは、できるだけシンプルに
val query =
from(table)
(t => where(t.id === id) select(t))
4
Scalaで使えるORM
• Anorm
– SQLを直接書くスタイル
– 手動でORマッピングを行う
• Scala ActiveRecord
– Squerylをベースに、モデル定義やよく使う機能をRailsの
ActiveRecordに似せている(CoC、DRY)
SQL("select * from User")
.as( int("id") ~ str("name") map {
case id~name => Person(id, name)
} *)
5
他にも、Activate、ScalikeJDBC、SORM など・・・
本日はTypesafe社お墨付きの
Slickについてお話します
6
Slickのきほん
7
タイプセーフなクエリ
• Slickは以下のように、クエリをタイプセーフに記述で
きることが1つの特徴
• このクエリを書くためには、スキーマ定義が必要
val id = 1L
val user: Option[UsersRow] =
Users.filter(_.id is id.bind).firstOption
select * from USERS x1 where x1.ID = ?
SQLのイメージ
8
スキーマ定義
• でも、手動で書くのは面倒ですよね
// マッピングするケースクラス
case class UserRow(id: Long, name: String)
// テーブルのスキーマ定義
class User(tag: Tag) extends Table[UserRow](tag, "USER") {
def * = (id, name) <> (UserRow.tupled, UserRow.unapply)
val id: Column[Long] = column[Long]("ID", O.PrimaryKey)
val name: Column[String] = column[String]("NAME")
}
// クエリに使用
lazy val User = new TableQuery(tag => new User(tag))
9
実はジェネレータがあるんですよ
10
コードジェネレータ
• sbtのタスクとして実行
• 生成するファイル
– Tables.scala
• 生成されるもの
– テーブル定義
– マッピングするケースクラス
– TableQuery
• クエリで使用
– 全テーブルのDDL
– GetResult(ResultSetからケースクラスに変換)
• Plain SQLで使用
11
コードジェネレータ
• ジェネレータはカスタマイズ可能
– SourceCodeGeneratorを拡張する形
– ドキュメントがないので拡張ポイントがわかりにくい
– slick.model.codegenパッケージ配下を見るとよい
• BizReachではカスタマイズして使っている
– 基本的なCRUD機能
– シールドクラスとカラムのマッピング
– 楽観的排他による更新機能
12
これでクエリが書けます
13
基本的なCRUD
// 全件取得
val users: Seq[UserRow] = User.list
// 登録
val res: Int = User insert UserRow(1, "なまえ")
// 更新
val res: Int = User.filter(_.id is id.bind).update(
UserRow(1, "なまえ変更"))
// 削除
val res: Int = User.filter(_.id is id.bind).delete
14
基本的なCRUD
// 全件取得
val users: Seq[UserRow] = User.list
// 登録
val res: Int = User insert UserRow(1, "なまえ")
// 更新
val res: Int = User.filter(_.id is id.bind).update(
UserRow(1, "なまえ変更"))
// 削除
val res: Int = User.filter(_.id is id.bind).delete
bindを呼ぶと
バインド変数になる
15
バインド変数になるbind
• bindなし
• bindあり
val name = "ta'kako"
User.filter(_.name is name).firstOption
・・・ from USER x1 where x1.NAME = 'ta''kako'
SQLのイメージ
User.filter(_.name is name.bind).firstOption
・・・ from USER x1 where x1.NAME = ?
SQLのイメージ
16
ケースクラスにマッピング
• <>を使えば、mapで絞り込んだ項目を別のケースク
ラスにマッピングできる
// このケースクラスにマッピング
case class Test(id: Long, name: String)
val res: List[Test] = User.map { t =>
t.id -> t.name <> (Test.tupled, Test.unapply)
}.list
17
他にもいろいろ
• ソート、グルーピング、ページング など
• 内部結合、外部結合も可能
• slick-referenceをGitHubに公開中
https://github.com/bizreach/slick-reference
18
タイプセーフなクエリで書けない
ときは?
19
Plain SQL
• SQLを文字列リテラルで書く
• 局所的に使うには便利
• ただ、複雑なSQLの代替として使うには厳しい
– リファクタリングがやりにくい
– 動的なSQLを組み立てるためには文字列処理が必要
sql"""SELECT ID + 1
FROM ISSUE_ID
WHERE USER_NAME = $owner FOR UPDATE
""".as[Int].firstOption
20
その他の選択肢
• mirage-scala
– Seasar2の2WaySQLの機能を単独のライブラリとして利
用できるようにしたもの
– Slickと組み合わせて使用することも可能
val books: List[Book] = sqlManager.getResultList[Book](
Sql("""
SELECT BOOK_ID, BOOK_NAME, AUTHOR, PRICE
FROM BOOK
/*IF author!=null*/
WHERE AUTHOR = /*author*/'test'
/*END*/
"""), Map("author"->"Takako Shimamoto"))
パラメータはMapではなくケース
クラスで与えることも可能
条件分岐やパラメータをSQLのコメント
で記述するのでコピペしてそのままDB
に流して動作確認できる
外部ファイル化することも可能
21
Play2でSlickを使うには
22
play-slick
• Play2でSlickを使う上で、面倒なことをいろいろやっ
てくれるプラグイン
– Play2の設定から自動的にSlickの
Database.forDataSourceを呼び出してくれる
– Slickのセッション管理を自動的にやってくれる
• withSessionやwithTransactionを呼び出してくれる
– Play2のリクエストとSlickのセッションの両方を持ち合わ
せたDBSessionRequestが使える
SlickがPlay2に組み込まれるのと同時に
このプラグインも統合される予定
23
何が変わるの?
• コントローラでPlay2のActionの代わりに、play-slick
のDBActionを使う
• トランザクションを開始する場合は
DBAction.transactionを使う
def list = DBAction { implicit rs =>
// IDの昇順にすべてのユーザ情報を取得
val users = Users.sortBy(t => t.id).list
// 一覧画面を表示
Ok(views.html.user.list(users))
}
24
コネクションプール
• Slickはコネクションプールの実装を持っていない
• Play2と組み合わせて使うならBoneCP
• ただし、有名なリーク問題が未だにある
– https://bugs.launchpad.net/bonecp/+bug/999114
• 対処方法は
– BoneCPのバージョンを固定
– maxConnectionAgeを0にする
• 現在は、HikariCPをお試し中
25
プロジェクトで使う上で注意
することは?
26
留意事項
• アグレッシブな機能追加/削除
– Scala全体の傾向(Slickも例外ではない)
– 特にメジャーアップにはマイグレーションが必要
– 常にキャッチアップして対応していく必要がある
• マニュアルがあまり豊富でない
– 本家サイトには書いてないが、できることが色々ある
– 慣れるまでに多少の時間が必要
– 充実させようとしている動きはある
– BizReachで公開しているリファレンスをぜひ活用を
27
留意事項
• 結合は発行されるSQLに注意
– 単一テーブルなら、①fiterで絞り込む、②mapで取得項目
を決める、③listやfirstOptionで実行、という流れ
– 結合は、メソッドチェーンとfor式で発行するSQLが異なる
// select ・・・ from (select * from A) s1 inner join (select * from B) s2
on ・・・
A.innerJoin(B).on(・・・)
// select ・・・ from A s1, B s2 where (s1.column = s2.column) and ・・
for {
t1 <- A
t2 <- B
if ・・・
} yield ・・・
28
留意事項
• Play2のEvolutionsは実践には厳しい
– 1.sql、2.sql・・・の管理はプログラマがやる
– ミスした場合、エボリューション用のテーブルを元に戻すと
いう操作を手動でやらないといけない
– ある程度の規模になるとメンテが困難
29
Slickの今後
30
次期バージョン2.1
• 使いやすさの向上
– APIの改善
– ドキュメントの充実
• Play2.4からデフォルトのO/Rマッパ(予定)
• Direct Embedding
– ケースクラスにアノテーションを付与
• スキーマ定義が不要になる
– 暗黙の型変換の代わりに、マクロを使用
• 実装するコード量が減る
– 現在は実験的な機能として提供
• 今後に期待

More Related Content

What's hot

強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話Yoshitaka Kawashima
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話Koichiro Matsuoka
 
Djangoフレームワークのユーザーモデルと認証
Djangoフレームワークのユーザーモデルと認証Djangoフレームワークのユーザーモデルと認証
Djangoフレームワークのユーザーモデルと認証Shinya Okano
 
SpringBootにおけるテンプレートエンジンの活用
SpringBootにおけるテンプレートエンジンの活用SpringBootにおけるテンプレートエンジンの活用
SpringBootにおけるテンプレートエンジンの活用iPride Co., Ltd.
 
3分でわかるAzureでのService Principal
3分でわかるAzureでのService Principal3分でわかるAzureでのService Principal
3分でわかるAzureでのService PrincipalToru Makabe
 
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017hirokiky
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜Yoshiki Nakagawa
 
Go言語のスライスを理解しよう
Go言語のスライスを理解しようGo言語のスライスを理解しよう
Go言語のスライスを理解しようYasutaka Kawamoto
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法kazkiti
 
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint [D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint NAVER D2
 
우아한 모노리스
우아한 모노리스우아한 모노리스
우아한 모노리스Arawn Park
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
さくらのVPSに来る悪い人を観察する その2
さくらのVPSに来る悪い人を観察する その2さくらのVPSに来る悪い人を観察する その2
さくらのVPSに来る悪い人を観察する その2ozuma5119
 
게임 애셋 스트리밍 패치
게임 애셋 스트리밍 패치게임 애셋 스트리밍 패치
게임 애셋 스트리밍 패치Seungjae Lee
 
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)Koichiro Matsuoka
 
Azure ADと外部アプリのID連携/SSO - Deep Dive
Azure ADと外部アプリのID連携/SSO - Deep DiveAzure ADと外部アプリのID連携/SSO - Deep Dive
Azure ADと外部アプリのID連携/SSO - Deep DiveNaohiro Fujie
 
Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門tsukasamannen
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유Hyojun Jeon
 

What's hot (20)

強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
 
SQLite の暗号化
SQLite の暗号化SQLite の暗号化
SQLite の暗号化
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
Djangoフレームワークのユーザーモデルと認証
Djangoフレームワークのユーザーモデルと認証Djangoフレームワークのユーザーモデルと認証
Djangoフレームワークのユーザーモデルと認証
 
SpringBootにおけるテンプレートエンジンの活用
SpringBootにおけるテンプレートエンジンの活用SpringBootにおけるテンプレートエンジンの活用
SpringBootにおけるテンプレートエンジンの活用
 
3分でわかるAzureでのService Principal
3分でわかるAzureでのService Principal3分でわかるAzureでのService Principal
3分でわかるAzureでのService Principal
 
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
 
Go言語のスライスを理解しよう
Go言語のスライスを理解しようGo言語のスライスを理解しよう
Go言語のスライスを理解しよう
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
 
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint [D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
[D2] java 애플리케이션 트러블 슈팅 사례 & pinpoint
 
우아한 모노리스
우아한 모노리스우아한 모노리스
우아한 모노리스
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
さくらのVPSに来る悪い人を観察する その2
さくらのVPSに来る悪い人を観察する その2さくらのVPSに来る悪い人を観察する その2
さくらのVPSに来る悪い人を観察する その2
 
게임 애셋 스트리밍 패치
게임 애셋 스트리밍 패치게임 애셋 스트리밍 패치
게임 애셋 스트리밍 패치
 
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
 
Azure ADと外部アプリのID連携/SSO - Deep Dive
Azure ADと外部アプリのID連携/SSO - Deep DiveAzure ADと外部アプリのID連携/SSO - Deep Dive
Azure ADと外部アプリのID連携/SSO - Deep Dive
 
Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
 

Similar to Slick入門

XPages 開発 Tips 百連発
XPages 開発 Tips 百連発XPages 開発 Tips 百連発
XPages 開発 Tips 百連発Mitsuru Katoh
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Ransui Iso
 
Solr6 の紹介(第18回 Solr勉強会 資料) (2016年6月10日)
Solr6 の紹介(第18回 Solr勉強会 資料) (2016年6月10日)Solr6 の紹介(第18回 Solr勉強会 資料) (2016年6月10日)
Solr6 の紹介(第18回 Solr勉強会 資料) (2016年6月10日)Issei Nishigata
 
Rails SQL Injection Examplesの紹介
Rails SQL Injection Examplesの紹介Rails SQL Injection Examplesの紹介
Rails SQL Injection Examplesの紹介Hiroshi Tokumaru
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門Sho A
 
DTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめDTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめMikiya Okuno
 
Why dont you_create_new_spark_jl
Why dont you_create_new_spark_jlWhy dont you_create_new_spark_jl
Why dont you_create_new_spark_jlShintaro Fukushima
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門Sho A
 
named_scope more detail - WebCareer
named_scope more detail - WebCareernamed_scope more detail - WebCareer
named_scope more detail - WebCareerKyosuke MOROHASHI
 
よろしい、ならばMicro-ORMだ
よろしい、ならばMicro-ORMだよろしい、ならばMicro-ORMだ
よろしい、ならばMicro-ORMだNarami Kiyokura
 
シェル芸初心者によるシェル芸入門 (修正版)
シェル芸初心者によるシェル芸入門 (修正版)シェル芸初心者によるシェル芸入門 (修正版)
シェル芸初心者によるシェル芸入門 (修正版)icchy
 
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...Google Cloud Platform - Japan
 
activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介Kevin Toyoda
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックスTomoharu ASAMI
 
Scala による自然言語処理
Scala による自然言語処理Scala による自然言語処理
Scala による自然言語処理Hiroyoshi Komatsu
 
2019年度若手技術者向け講座 インデックス
2019年度若手技術者向け講座 インデックス2019年度若手技術者向け講座 インデックス
2019年度若手技術者向け講座 インデックスkeki3
 
とあるDBAの黒い画面(ターミナル)
とあるDBAの黒い画面(ターミナル)とあるDBAの黒い画面(ターミナル)
とあるDBAの黒い画面(ターミナル)Kazuhiro Yoshikawa
 
【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 sandai
 

Similar to Slick入門 (20)

Tdd
TddTdd
Tdd
 
XPages 開発 Tips 百連発
XPages 開発 Tips 百連発XPages 開発 Tips 百連発
XPages 開発 Tips 百連発
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
 
Solr6 の紹介(第18回 Solr勉強会 資料) (2016年6月10日)
Solr6 の紹介(第18回 Solr勉強会 資料) (2016年6月10日)Solr6 の紹介(第18回 Solr勉強会 資料) (2016年6月10日)
Solr6 の紹介(第18回 Solr勉強会 資料) (2016年6月10日)
 
Rails SQL Injection Examplesの紹介
Rails SQL Injection Examplesの紹介Rails SQL Injection Examplesの紹介
Rails SQL Injection Examplesの紹介
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門
 
DTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめDTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめ
 
Why dont you_create_new_spark_jl
Why dont you_create_new_spark_jlWhy dont you_create_new_spark_jl
Why dont you_create_new_spark_jl
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 
named_scope more detail - WebCareer
named_scope more detail - WebCareernamed_scope more detail - WebCareer
named_scope more detail - WebCareer
 
よろしい、ならばMicro-ORMだ
よろしい、ならばMicro-ORMだよろしい、ならばMicro-ORMだ
よろしい、ならばMicro-ORMだ
 
シェル芸初心者によるシェル芸入門 (修正版)
シェル芸初心者によるシェル芸入門 (修正版)シェル芸初心者によるシェル芸入門 (修正版)
シェル芸初心者によるシェル芸入門 (修正版)
 
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
 
activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
 
Scala による自然言語処理
Scala による自然言語処理Scala による自然言語処理
Scala による自然言語処理
 
Java研修
Java研修Java研修
Java研修
 
2019年度若手技術者向け講座 インデックス
2019年度若手技術者向け講座 インデックス2019年度若手技術者向け講座 インデックス
2019年度若手技術者向け講座 インデックス
 
とあるDBAの黒い画面(ターミナル)
とあるDBAの黒い画面(ターミナル)とあるDBAの黒い画面(ターミナル)
とあるDBAの黒い画面(ターミナル)
 
【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門
 

More from chibochibo

Tour of Apache PredictionIO in 10 Minutes
Tour of Apache PredictionIO in 10 MinutesTour of Apache PredictionIO in 10 Minutes
Tour of Apache PredictionIO in 10 Minuteschibochibo
 
Crawler Commons
Crawler CommonsCrawler Commons
Crawler Commonschibochibo
 
Deadly Code! (seriously) Blocking &amp; Hyper Context Switching Pattern
Deadly Code! (seriously) Blocking &amp; Hyper Context Switching PatternDeadly Code! (seriously) Blocking &amp; Hyper Context Switching Pattern
Deadly Code! (seriously) Blocking &amp; Hyper Context Switching Patternchibochibo
 
Dynamic SQL in doobie
Dynamic SQL in doobieDynamic SQL in doobie
Dynamic SQL in doobiechibochibo
 
Is spark streaming based on reactive streams?
Is spark streaming based on reactive streams?Is spark streaming based on reactive streams?
Is spark streaming based on reactive streams?chibochibo
 
What is doobie? - database access for scala -
What is doobie? - database access for scala -What is doobie? - database access for scala -
What is doobie? - database access for scala -chibochibo
 
Quartzでcronを範囲検索したい
Quartzでcronを範囲検索したいQuartzでcronを範囲検索したい
Quartzでcronを範囲検索したいchibochibo
 
ビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streamingビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streamingchibochibo
 
nioで作ったBufferedWriterに変えたら例外になった
nioで作ったBufferedWriterに変えたら例外になったnioで作ったBufferedWriterに変えたら例外になった
nioで作ったBufferedWriterに変えたら例外になったchibochibo
 
Spark Streaming on AWS -S3からKinesisへ-
Spark Streaming on AWS -S3からKinesisへ-Spark Streaming on AWS -S3からKinesisへ-
Spark Streaming on AWS -S3からKinesisへ-chibochibo
 
Spark in small or middle scale data processing with Elasticsearch
Spark in small or middle scale data processing with ElasticsearchSpark in small or middle scale data processing with Elasticsearch
Spark in small or middle scale data processing with Elasticsearchchibochibo
 
What's a macro?: Learning by Examples
What's a macro?: Learning by ExamplesWhat's a macro?: Learning by Examples
What's a macro?: Learning by Exampleschibochibo
 
Spring Boot Introduction
Spring Boot IntroductionSpring Boot Introduction
Spring Boot Introductionchibochibo
 

More from chibochibo (14)

Tour of Apache PredictionIO in 10 Minutes
Tour of Apache PredictionIO in 10 MinutesTour of Apache PredictionIO in 10 Minutes
Tour of Apache PredictionIO in 10 Minutes
 
Crawler Commons
Crawler CommonsCrawler Commons
Crawler Commons
 
LocalStack
LocalStackLocalStack
LocalStack
 
Deadly Code! (seriously) Blocking &amp; Hyper Context Switching Pattern
Deadly Code! (seriously) Blocking &amp; Hyper Context Switching PatternDeadly Code! (seriously) Blocking &amp; Hyper Context Switching Pattern
Deadly Code! (seriously) Blocking &amp; Hyper Context Switching Pattern
 
Dynamic SQL in doobie
Dynamic SQL in doobieDynamic SQL in doobie
Dynamic SQL in doobie
 
Is spark streaming based on reactive streams?
Is spark streaming based on reactive streams?Is spark streaming based on reactive streams?
Is spark streaming based on reactive streams?
 
What is doobie? - database access for scala -
What is doobie? - database access for scala -What is doobie? - database access for scala -
What is doobie? - database access for scala -
 
Quartzでcronを範囲検索したい
Quartzでcronを範囲検索したいQuartzでcronを範囲検索したい
Quartzでcronを範囲検索したい
 
ビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streamingビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streaming
 
nioで作ったBufferedWriterに変えたら例外になった
nioで作ったBufferedWriterに変えたら例外になったnioで作ったBufferedWriterに変えたら例外になった
nioで作ったBufferedWriterに変えたら例外になった
 
Spark Streaming on AWS -S3からKinesisへ-
Spark Streaming on AWS -S3からKinesisへ-Spark Streaming on AWS -S3からKinesisへ-
Spark Streaming on AWS -S3からKinesisへ-
 
Spark in small or middle scale data processing with Elasticsearch
Spark in small or middle scale data processing with ElasticsearchSpark in small or middle scale data processing with Elasticsearch
Spark in small or middle scale data processing with Elasticsearch
 
What's a macro?: Learning by Examples
What's a macro?: Learning by ExamplesWhat's a macro?: Learning by Examples
What's a macro?: Learning by Examples
 
Spring Boot Introduction
Spring Boot IntroductionSpring Boot Introduction
Spring Boot Introduction
 

Slick入門