Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Play 2.3 から 2.4 へアップデートした話
Search
tsuyoshi yoshizawa
July 05, 2015
Technology
3.1k
7
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Play 2.3 から 2.4 へアップデートした話
Play meetup 2 で発表した内容です。
https://playframeworkja.doorkeeper.jp/events/27023
tsuyoshi yoshizawa
July 05, 2015
More Decks by tsuyoshi yoshizawa
See All by tsuyoshi yoshizawa
Scala Fukuoka Play 25 2016
tsuyoshizawa
2
2.4k
seasar_conf_2015.pdf
tsuyoshizawa
3
2.8k
Other Decks in Technology
See All in Technology
20260801_スクフェス大阪
kgnkhkr
1
1.2k
Forza Horizon 6 のテレメトリ機能で 自動運転に使えそうな学習データを集める話
henjin0
0
130
モバイルアプリ開発概論2026
recruitengineers
PRO
1
350
Invisible to AI? Making TYPO3 Sites Quotable by AI Search Systems
wolfgangwagner
0
110
Redmine 7.0 新機能・機能強化解説(OSC2026京都ダイジェスト版)
vividtone
1
190
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.2k
【CEDEC2026】『GRANBLUE FANTASY: Relink - Endless Ragnarok』のバトル制作事例 ~最高のキャラゲーを目指して~
cygames
PRO
0
200
研究開発部の紹介 / Sansan R&D Profile
sansan33
PRO
4
24k
変化の早いClaude Codeを 書籍に落とし込む
oikon48
6
1.3k
SnowflakeCoCoでデータエンジニアリング!
foursue
0
180
Flutterをカメラで動かしたかった話
sony
0
120
もう一度考える SRE チームの作り方・育て方 / Rethinking SRE #1: Building and Growing SRE Teams
rrreeeyyy
5
990
Featured
See All Featured
Facilitating Awesome Meetings
lara
57
7.1k
So, you think you're a good person
axbom
PRO
2
2.1k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
630
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
440
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
330
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Visualization
eitanlees
152
17k
The Curse of the Amulet
leimatthew05
2
13k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
760
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
230
Transcript
Play 2.3 ͔Β Play 2.4 ʹ্͛ͨ - Play meetup 2
-
ࣗݾհ Tsuyoshi Yoshizawa ussy00 tsuyoshizawa scala-oauth2-provider ϝϯςͯ͠·͢ גࣜձࣾψʔϥϘͰ Typetalk ͱ͍͏
chat αʔ ϏεΛ Play Ͱͭͬͯ͘·͢
Play 2.4 ʹͯ͠ ຊ൪ڥͰͳ͘Քಇ ࡉ͔͍όάग़͍ͯͯɺطʹ 2.4.2 ·ͰϦϦʔε [2.4] Still a
thread leak in development environment https://github.com/playframework/playframework/issues/4649
2.4 ͰԿ͕มΘͬͨͷ͔ • Dependency Injection ͷαϙʔτ • Plugin ͔Β Module
• i18n ͷΈ͕มߋ • ઃఆΩʔͷมߋ What’s new in Play 2.4 https://playframework.com/documentation/2.4.x/Highlights24 Play 2.4 Migration Guide https://playframework.com/documentation/2.4.x/Migration24
Dependency Injection Controller ʹίϯϙʔωϯτΛ DI ͢ΔʹɺΠϯε λϯελΠϓΛ object ͔Β class
ʹมߋ͢Δඞཁ͋Γ Guice Λͬͯ DI ʢJSR 330 ϕʔεʣ import javax.inject._ import play.api.libs.ws._ class MyComponent @Inject() (ws: WSClient) { // ... }
Module Plugin ඇਪʹͳΓɺ DI ϕʔεͳ Module ʹ Ҡߦ͍ͯ͘͠ඞཁ͋Γ Play 2.4
ͷ Module ͷ࡞Γํͱ Plugin ͔ΒͷҠߦ ʹ͍ͭͯ http://tototoshi.hatenablog.com/entry/2014/12/14/170745
i18n Messages ʹ͢ܕ͕ Lang ͔Β Messages ࠃࡍԽରԠͯ͠ΔͱόʔδϣϯΞοϓ͕໘ case class Messages(lang:
Lang, messages: MessagesApi) object Messages { def apply(key: String, args: Any*)(implicit messages: Messages): String
ઃఆΩʔͷมߋ • ઃఆ͕ແࢹ͞ΕΔΘ͚Ͱͳ͍ • ࣮ߦ࣌ʹܯࠂ͕ग़ྗ͞Εͯؾ͚ͮΔΈ͋Γ • ৽͍͠ͷʹஔ͖͍͑ͯ͘ application.secret session.*
play.crypto.secret play.http.session.*
ΞοϓάϨʔυ
ݱঢ়ͷ֬ೝ • ෳਓͰ Git Λͬͯฒߦ։ൃΛ͍ͯ͠Δ • ͋Δఔେ͖͍ϒϥϯν͋Δ • ϓϩδΣΫτதنఔ •
ͦΕͳΓʹमਖ਼ൣғେ͖͘ͳΓͦ͏ • Play 2.4 ఆҠߦͰ͖ΔͷΛఏڙ͍ͯ͠Δ
ஈ֊తΞοϓάϨʔυ 1. Play 2.3 ελΠϧͰɺ·ͣίϯύΠϧΛ௨͢ 2. ςετΛ௨͠ಈ࡞֬ೝͯ͠ίϛοτ 3. Play 2.4
ελΠϧʹগͣͭ͠Ҡߦ͍ͯ͘͠ ΞοϓάϨʔυ ා͘ͳ͍
ࣗ࡞ϓϥάΠϯͷҠߦ Redis ΛΩϟογϡʹ͏ͨΊʹ Plugin Λࣗ࡞ (scala-redis Λར༻) class RedisModule extends
Module { def bindings(environment: Environment, configuration: Configuration) = Seq( bind[CacheApi].to[RedisCacheApi] ) } play.modules.enabled += "modules.RedisModule" play.modules.disabled += "play.api.cache.EhCacheModule" build.sbt
ScalikeJDBC Play Support play.modules.enabled += "scalikejdbc.PlayDBApiAdapterModule" db {
default { driver = org.postgresql.Driver url = "jdbc:postgresql://localhost/test" username = test password = test hikaricp { poolName = "play" registerMbeans = true } } } HikariCP ͷઃఆΛར༻͔ͨͬͨ͠ͷͰ scalikejdbc-play-dbapi-adapter Λར༻ 2.4 ͔Β HikariCP
application.conf
Thread pool configuration akka { actor {
default-‐dispatcher { fork-‐join-‐executor { parallelism-‐min = 300 parallelism-‐max = 300 } } } } play { akka { actor { default-‐dispatcher = { fork-‐join-‐executor { parallelism-‐min = 300 parallelism-‐max = 300 } } } } } 2.3 2.4 Akka ͱಉ͡هड़ʹͳͬͨ http://doc.akka.io/docs/akka/2.3.11/general/configuration.html
Remote address औಘ trustxforwarded=true 2.3 ·ͰϦόʔεϓϩΩγΛհ͢Δͱ͖ʹɺҎ ԼͷઃఆΛ͢Δඞཁ͕͕͋ͬͨෆཁʹ 2.4 ͔Β x-forwarded
ʹՃ͑ͯ RFC7239 αϙʔ τɻ play.http.forwarded.version ͰΓସ͑Մೳ https://www.playframework.com/documentation/2.4.x/HTTPServer
i18n
i18n ରԠ Controller ͷΠϯελϯελΠϓ͕ object ͷ߹ s/implicit lang: Lang/implicit messages:
Messages/g import play.api.play.current import play.api.i18n.Messages.Implicits._ Lang ͔Β Messages ʹ҉తมΛߦͬͯ͘ΕΔ Controller ʹҎԼͷ 2 ߦΛՃ͢Δ
withLang/clearingLang object FooController extends Controller with LegacyI18nSupport val lang =
user.toLang Ok(Messages("hello.world")).withLang(lang) trait LegacyI18nSupport { implicit class ResultWithLang(result: Result)(implicit messagesApi: MessagesApi) { def withLang(lang: Lang): Result = messagesApi.setLang(result, lang) def clearingLang: Result = messagesApi.clearLang(result) } } ҉తʹ messagesApi Λݺͼग़ͯ͘͠ΕΔ Result ͔Β MessagesApi ʹҠಈ͍ͯ͠Δ
ࢦ͖͢ 2.4 style import javax.inject.Inject import play.api.i18n.{MessagesApi, I18nSupport}
import play.api.mvc.Controller class FooController @Inject() (val messagesApi: MessagesApi) extends Controller with I18nSupport { } Controller ʹ MessagesApi Λ DI ͯ͠ i18nSupport Λ mixin RequestHeader Λ Messages ʹ҉తʹม͢Δ
class Controller GET /
@controllers.Application.index 2.3 ํࣜͰ @ Λ͚ͭΔ͜ͱͰಛఆͷ Controller ͔ Β class Խ͍ͯ͘͜͠ͱ͕Մೳ routesGenerator := InjectedRoutesGenerator routes build.sbt 2.4 ඪ४ͷΓํɻ Controller ͯ͢ class
2.4 style ʹ͚ͯ
Removing GlobalSettings GlobalSettings HttpErrorHandler HttpRequestHandler HttpFilter ApplicationLifecycle GlobalSettings 2.4
Ͱ Ҿ͖ଓ͖ར༻Ͱ͖Δ͕ɾɾɾ
ApplicationLifecyle @Singleton class IntervalJobs @Inject() ( system:
ActorSystem, lifecycle: ApplicationLifecycle) { val minuteJob = system.scheduler.schedule(1.minutes, 1.minutes) { // … } lifecycle.addStopHook { () => Future.successful(minuteJob.cancel()) } } • GlobalSettings#onStart • DI ରΫϥεͷίϯετϥΫλ • GlobalSettings#onStop • ApplicationLifecycle#addStopHook
HttpErrorHandler class ErrorHandler @Inject() ( env: Environment,
config: Configuration, sourceMapper: OptionalSourceMapper, router: Provider[Router], val messagesApi: MessagesApi ) extends DefaultHttpErrorHandler(env, config, sourceMapper, router) with I18nSupport { def onBadRequest(request: RequestHeader, message: String) = ??? def onForbidden(request: RequestHeader, message: String) = ??? def onNotFound(request: RequestHeader, message: String) = ??? def onOtherClientError(request: RequestHeader, statusCode: Int, message: String) = ??? def onServerError(request: RequestHeader, exception: Throwable) = ??? } DefaultHttpErrorHandler Λܧঝ͢ΔͱҠߦ͍͢͠ I18nSupport ΛͬͯΤϥʔը໘ͷࠃࡍԽରԠՄ
͍ͭ·ͰʹҠߦͨ͠Β͍͍ͷ͔ʁ
Play Roadmap 3.0 Play 3 Implementation Plan https://docs.google.com/document/d/1OejviUX5TDlRVeKg1JD9L4qh2Tn21giItmyxRXCydN0/edit Play 3.0.0
1st June 2016 Remove global state Play 2.5.0 1st October 2015 Deprecate every API that relies on global state for which there exists a DI alternative.
·ͱΊ • վળ͞Ε͍ͯ͘ Play • Play 2.4 3.0 ʹ͚ͨελʔτ
• Play νʔϜҠߦΛߟྀͯ͘͠Ε͓ͯΓɺஈ֊ తʹΞοϓάϨʔυՄೳ • Play 2.4 ͔Β࢝ΊΔਓݹ͍ใʹΘ͞Εͳ͍ Α͏ʹ