SlideShare ist ein Scribd-Unternehmen logo
1 von 39
Downloaden Sie, um offline zu lesen
Play! framework を使用した

小規模プロジェクトにおける

Best Practices ()
!
鹿島和郎(かしまかずお)
自己紹介
• 鹿島和郎(かしまかずお)
• 家から出ないフリーのエンジニア。
• 同じく出不精のフリーエンジニア数人で

受託開発とかの仕事をしてます。
• リモート開発に最適化させた開発プロセスを作りたい

と思って、いろいろやってます。
• GitHub: k4200, Twitter @k4200jp
話す内容
• Play! framework + その他、で何か作ってます。
• その小規模開発プロジェクトでの Best Practices を
公開します。
• 懇親会の時に、みなさんの事例も聞かせて下さい。
こんなの作ってます
こんなの作ってます
開発チーム向け

内部文書検索エンジン
http://issf.hidebu.info/
こんなの作ってます
自分達用に作り始めた。
結構便利になってきたので

ひっそり一般公開(β版)。
http://issf.hidebu.info/
こんなの作ってます
ひっそりすぎて

殆ど誰も使ってくれません。
http://issf.hidebu.info/
こんなの作ってます
興味のある方は

声をかけてください。
m(_ _)m
http://issf.hidebu.info/
こんなの作ってます
できること
http://issf.hidebu.info/
こんなの作ってます
以下のものをまとめて検索できます。
• GitHub issues
• GitHub wiki
• Slack
• Facebook groups
• Gmail
• 添付ファイル(pdf, docx, xlsx etc.)
• その他、順次対応中です。
こんなの作ってます
こんなことありませんか?
http://issf.hidebu.info/
こんなの作ってます
あれー、この部分の仕様
前にどっかで教えてもらった
気がするなぁ。
http://issf.hidebu.info/
こんなの作ってます
どのissueだっけなー
Slackだったかな
wikiだった気もするし・・・
http://issf.hidebu.info/
こんなの作ってます
とか
http://issf.hidebu.info/
こんなの作ってます
GitHub の wiki って
なんで検索できねーんだよ
http://issf.hidebu.info/
こんなの作ってます
という悩みを解決します。
http://issf.hidebu.info/
こんなの作ってます
デモ
http://issf.hidebu.info/
小規模プロジェクトの

開発環境
※全て個人的な意見です
開発環境
3つの環境
• ローカル開発 → Vagrant
• テスト → VM x 1 on Azure
• 本番 → VM x 3 on Azure
開発環境
ポイント
• Ansibleで一発で構築。
• Chef は小規模環境には向いていない気が。
• Puppet は使ったことない。
• Ansible Best Practices になるべく準拠。
• ディストリビューションは える。
開発環境
CI は CircleCI を使用
• Play (sbt) も当然使える。
• 主要なDBやキャッシュサーバーが
最初から起動している。
• 小規模プロジェクトなら無料プラ
ンで十分。
開発環境
Play! framework の話が

出てこないんですけど・・・
開発環境
テクノロジースタック(DB周り)
• Play! framework 2.3
• Slick 2.1 (ScalikeJDBCじゃなくてすみません)
• Flyway SBT plugin
• PostgreSQL 9.3
開発環境
DB周りのポイント - テスト
• No inMemoryDatabase
• あまりテストにならない。
• 違いを考慮したテストを書く必要があったり、

本末転倒。
• DBを使うテストは並列にしない。
• sbt でテストを動かす際の、3つのレベルの

並列性に注意。
開発環境
DB周りのポイント - マイグレーション
• Evolutions ではなく Flyway を使う。
• Flyway はシンプルにSQLで書けてよい。
• evolutions の嫌なところ。
• ファイル名が <数字>.sql
• よく inconsistent state になる。
開発環境
DB周りのポイント - マイグレーション
• Playアプリケーション起動時に勝手に起
動する系は地雷。
• 設定でオフにしても、テスト時の
FakeApplication で起動したりする。
• コマンドで手動実行、あるいはデプロイ
スクリプトに組み込む。
開発環境
DB周りのポイント - Flyway
• ファイル名は数字ではなくてタイム
スタンプにする。
• 番号がかぶるのを避ける。
• 例:V201507051534__Create_foo.sql
• outOfOrder を有効にする。
開発環境
DB周りのポイント - Flyway
なぜ play-flyway ではなくて

Flyway SBT plugin なのか?
• 後述のコード生成と相性が悪い。
• そもそも、起動するタイミングとかコン
トロールしたいし、プラグインを使う意
味があまりない。
開発環境
DB周りのポイント - boilerplate
• Slick の code generator が便利。
• DB構造を読み込んでScalaのソー
スを作成してくれる。
• sbtプラグインがあるらしい。
開発環境
/** Entity class storing rows of table Conversation
* @param id Database column id DBType(serial), AutoInc, PrimaryKey
* @param dataSourceId Database column data_source_id DBType(int2)
* @param lastUpdatedAt Database column last_updated_at DBType(timestamp)
* @param status Database column status DBType(int2) */
case class ConversationRow(id: Int, dataSourceId: Short, lastUpdatedAt: DateTime, status: Short)
/** GetResult implicit for fetching ConversationRow objects using plain SQL queries */
implicit def GetResultConversationRow(implicit e0: GR[Int], e1: GR[Short], e2: GR[DateTime]): GR[ConversationRow] = GR{
prs => import prs._
ConversationRow.tupled((<<[Int], <<[Short], <<[DateTime], <<[Short]))
}
/** Table description of table conversation. Objects of this class serve as prototypes for rows in queries. */
class Conversation(_tableTag: Tag) extends Table[ConversationRow](_tableTag, "conversation") {
def * = (id, dataSourceId, lastUpdatedAt, status) <> (ConversationRow.tupled, ConversationRow.unapply)
/** Maps whole row to an option. Useful for outer joins. */
def ? = (id.?, dataSourceId.?, lastUpdatedAt.?, status.?).shaped.<>({r=>import r._; _1.map(_=>
ConversationRow.tupled((_1.get, _2.get, _3.get, _4.get)))}, (_:Any) => throw new Exception("Inserting into ? projection not
supported."))
/** Database column id DBType(serial), AutoInc, PrimaryKey */
val id: Column[Int] = column[Int]("id", O.AutoInc, O.PrimaryKey)
/** Database column data_source_id DBType(int2) */
val dataSourceId: Column[Short] = column[Short]("data_source_id")
/** Database column last_updated_at DBType(timestamp) */
val lastUpdatedAt: Column[DateTime] = column[DateTime]("last_updated_at")
/** Database column status DBType(int2) */
val status: Column[Short] = column[Short]("status")
/** Index over (dataSourceId) (database name conversation_data_source_id_key) */
val index1 = index("conversation_data_source_id_key", dataSourceId)
}
/** Collection-like TableQuery object for table Conversation */
lazy val Conversation = new TableQuery(tag => new Conversation(tag))
1つのテーブルでこれくらい。
使ってて

便利なライブラリ
便利なライブラリ
SecureSocial
OAuth を使っている

各種SNS、webサービスへの

ログイン機能を簡単に作れる

Play用のライブラリ
便利なライブラリ
SecureSocial
• 2月から更新されてない。
• 作者はやる気はあるらしい。
• Play 2.4対応とか。
便利なライブラリ
SecureSocial
• その間、とりあえず fork したバージョ
ンを使っている。
• Slack 対応などを独自で追加。
• 本家に PR は送っている。
• "tv.kazu" %% "securesocial" % "3.0.2"
便利なライブラリ
scalacache
• 複数のバックエンドを透過的に扱える。
• memoize が簡単で便利。
import scalacache._
import memoization._
!
implicit val scalaCache = ScalaCache(new MyCache())
!
def getUser(id: Int): User = memoize {
// Do DB lookup here...
User(id, s"user${id}")
}
便利なライブラリ
scalacache
• 質問とかにも、作者の Chris さん

(日本語堪能)が親切に対応してくれる。
その他にも
色々話したいのですが、
続きは懇親会で。
ありがとうございました。

Weitere ähnliche Inhalte

Ähnlich wie Play meetup-2-dev-best-practices

Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoGo言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoShoot Morii
 
Play2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだことPlay2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだことdcubeio
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)Hiroaki KOBAYASHI
 
DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~
DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~
DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~decode2016
 
Small Basic を実務で使ってみませんか - CLR/H第56回勉強会ライトニングトーク
Small Basic を実務で使ってみませんか - CLR/H第56回勉強会ライトニングトークSmall Basic を実務で使ってみませんか - CLR/H第56回勉強会ライトニングトーク
Small Basic を実務で使ってみませんか - CLR/H第56回勉強会ライトニングトークJun-ichi Sakamoto
 
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころJunya Hayashi
 
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE辰徳 斎藤
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackkimukou_26 Kimukou
 
Easy scripting in Go
Easy scripting in GoEasy scripting in Go
Easy scripting in Gonaoty_bot
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんかcch-robo
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介Shinya Okano
 
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用Akira Inoue
 
10min r study_tokyor25
10min r study_tokyor2510min r study_tokyor25
10min r study_tokyor25Nobuaki Oshiro
 
10min r study_tokyor25
10min r study_tokyor2510min r study_tokyor25
10min r study_tokyor25Nobuaki Oshiro
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介Shinya Okano
 
TypeScript と Visual Studio Code
TypeScript と Visual Studio CodeTypeScript と Visual Studio Code
TypeScript と Visual Studio CodeAkira Inoue
 
Python東海GAEやってみた
Python東海GAEやってみたPython東海GAEやってみた
Python東海GAEやってみたMori Shingo
 
Go Friday 傑作選
Go Friday 傑作選Go Friday 傑作選
Go Friday 傑作選Takuya Ueda
 

Ähnlich wie Play meetup-2-dev-best-practices (20)

Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoGo言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
 
Play2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだことPlay2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだこと
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
 
DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~
DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~
DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~
 
Small Basic を実務で使ってみませんか - CLR/H第56回勉強会ライトニングトーク
Small Basic を実務で使ってみませんか - CLR/H第56回勉強会ライトニングトークSmall Basic を実務で使ってみませんか - CLR/H第56回勉強会ライトニングトーク
Small Basic を実務で使ってみませんか - CLR/H第56回勉強会ライトニングトーク
 
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころ
 
実は怖くないDevOps
実は怖くないDevOps実は怖くないDevOps
実は怖くないDevOps
 
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE
 
Fluentd casual
Fluentd casualFluentd casual
Fluentd casual
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
 
Easy scripting in Go
Easy scripting in GoEasy scripting in Go
Easy scripting in Go
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介
 
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
 
10min r study_tokyor25
10min r study_tokyor2510min r study_tokyor25
10min r study_tokyor25
 
10min r study_tokyor25
10min r study_tokyor2510min r study_tokyor25
10min r study_tokyor25
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介
 
TypeScript と Visual Studio Code
TypeScript と Visual Studio CodeTypeScript と Visual Studio Code
TypeScript と Visual Studio Code
 
Python東海GAEやってみた
Python東海GAEやってみたPython東海GAEやってみた
Python東海GAEやってみた
 
Go Friday 傑作選
Go Friday 傑作選Go Friday 傑作選
Go Friday 傑作選
 

Mehr von k4200

sbt 0.10 for beginners?
sbt 0.10 for beginners?sbt 0.10 for beginners?
sbt 0.10 for beginners?k4200
 
Lifthub (rpscala #31)
Lifthub (rpscala #31)Lifthub (rpscala #31)
Lifthub (rpscala #31)k4200
 
Lifthub (#rpscala 26)
Lifthub (#rpscala 26)Lifthub (#rpscala 26)
Lifthub (#rpscala 26)k4200
 
Scala勉強会 in 渋谷 2010→2011(鹿島)
Scala勉強会 in 渋谷 2010→2011(鹿島)Scala勉強会 in 渋谷 2010→2011(鹿島)
Scala勉強会 in 渋谷 2010→2011(鹿島)k4200
 
Grass
GrassGrass
Grassk4200
 
Chat+twitter app with lift
Chat+twitter app with liftChat+twitter app with lift
Chat+twitter app with liftk4200
 
第5回scala勉強会in渋谷
第5回scala勉強会in渋谷第5回scala勉強会in渋谷
第5回scala勉強会in渋谷k4200
 
第4回scala勉強会in渋谷
第4回scala勉強会in渋谷第4回scala勉強会in渋谷
第4回scala勉強会in渋谷k4200
 

Mehr von k4200 (8)

sbt 0.10 for beginners?
sbt 0.10 for beginners?sbt 0.10 for beginners?
sbt 0.10 for beginners?
 
Lifthub (rpscala #31)
Lifthub (rpscala #31)Lifthub (rpscala #31)
Lifthub (rpscala #31)
 
Lifthub (#rpscala 26)
Lifthub (#rpscala 26)Lifthub (#rpscala 26)
Lifthub (#rpscala 26)
 
Scala勉強会 in 渋谷 2010→2011(鹿島)
Scala勉強会 in 渋谷 2010→2011(鹿島)Scala勉強会 in 渋谷 2010→2011(鹿島)
Scala勉強会 in 渋谷 2010→2011(鹿島)
 
Grass
GrassGrass
Grass
 
Chat+twitter app with lift
Chat+twitter app with liftChat+twitter app with lift
Chat+twitter app with lift
 
第5回scala勉強会in渋谷
第5回scala勉強会in渋谷第5回scala勉強会in渋谷
第5回scala勉強会in渋谷
 
第4回scala勉強会in渋谷
第4回scala勉強会in渋谷第4回scala勉強会in渋谷
第4回scala勉強会in渋谷
 

Play meetup-2-dev-best-practices