Play 2.5に入門　①近況を概観

# 序
JavaとScalaの両方をサポートするWebアプリケーション・フレームワーク(WAF)の"Play"を、2.0が出た頃に使ったことがある。
...が、sbtを発展(?)させたactivatorベースになり、2.4でDIが導入され...と、だいぶ環境が変わっている模様。ということで、2016年4月現在、最新の2.5系に改めて入門してみる。今回は、環境構築に先立ち、**なぜ"Play"なのか、なぜ"2.5"なのか**を、自分なりに書いておく。視点としては、Javaの人とScalaの人とがチームを組んで、プロトタイピングから本番稼働/保守していくための基礎調査を意識。日本人が過半数のチームを想定しているため、日本語情報を重視。

**現時点の[本家ホームページ](https://www.playframework.com/):**

![スクリーンショット 2016-04-24 4.07.12.png](https://qiita-image-store.s3.amazonaws.com/0/16455/e32999fa-c091-26b7-5fd2-769b3a149f10.png)

## cf.いますぐ環境構築したい人
*Ubuntu14.04での構築事例が[こちら](http://symfoware.blog68.fc2.com/blog-entry-1870.html)に書かれている。*

##当シリーズの現時点の進捗

- Java:[②環境構築とPlay Javaつまみ食い](http://qiita.com/kmry2045/items/f5d271eee0e71f74bc98)　
- Java:[③環境構築続き(MySQL接続、はまり道)](http://qiita.com/kmry2045/items/5b2994eb8294c7982029)
- Poem:[④(ぽえむ)プロトタイピングするアプリ:OtaCal](http://qiita.com/kmry2045/items/fdd0636c14f4e8d17d9e)
- Etc.:[⑤Play関連の知識の幅を広げたい。](http://qiita.com/kmry2045/items/11575702a2943c559f67)
- Scala:[⑥コレクション指向のRESTフレームワークPlay'R](http://qiita.com/kmry2045/items/3aa09eec99277b5b14e7)
- Scala:[⑦httpieを使いながらPlay'Rの例題を手直し](http://qiita.com/kmry2045/items/e6ea58f5fc23c8f5791a)
- Scala:[⑧Scala.jsのSPAチュートリアルの翻訳開始](http://qiita.com/kmry2045/items/b07ed568fb31c0e22c85)

※　Java : [[番外編]　Play1.4系でJava webアプリ入門してみる。](http://qiita.com/kmry2045/items/662984cdc6413825c7d5)

#なぜ"Play"に(再)入門なのか?
## ①　Java界隈で認知されている。
個人的には、これが最大の理由。もちろん、Java EEとかSpringとかが王道であろう、Java使いの人にとってPlayはけっしてメジャーではない。が、当初Java向けのフレームワークとして始まった、Playの歴史は結構長いので、許容可能な選択肢となっているものと思う。

Android開発を(Kotlinではなく)Javaですることになったので、WAFについては、Javaと親和的で自分になじみがあってそこそこ学びがいがありそうで、本番稼働させられるであろう環境となるとPlay一択となった*(個人的にPlay 1.x系の時、小さなサービスを本番稼働させた経験あり)*。
対抗馬はSpring boot([参考](http://maplesystems.co.jp/blog/programming/18474.html))。Kotlin採用ならば、Spring bootを使うことになったと思う(その他、Java 8ベースの、マイクロサービス向けのお手軽フレームワークなどもあるようだが、本番向きかどうか、自分には判断できなそう)。

個人的には、Android N以降でないとAndroid開発ではなかなか試し難いところがある、Java8、lombokといったあたりをPlayで使ってみたい。

## ②　Scala界隈で一番人気。
Scala界隈で、わりとメジャーなWAF対抗馬はservletベースのものとfinagleベースのものとのこと(このあたり、[竹添さんが紹介してないScalaのWebフレームワークも含めて2015年現在の状況を色々紹介](http://d.hatena.ne.jp/xuwei/20151007/1444242831)に書かれている)。自分は、lift、scalatra、finatraを使ったことがある。軽く使ったところでは、finatraはなんとかなりそうな感はあった。上の"2015年現在の状況"を読んで、finchもいいかなと思った...が、Javaな人々から遠く離れることになるので、今回は却下。
### 

#なぜ"Play 2.5"に入門なのか?
## ①学びがいがありそう*(..ありすぎ!?)*
### 今なお"攻めてる"Play
完全に離れていたので、Play 2.1以降の歴史はあまり知らないのだが、マイナー番号が上がっているだけにもかからわず、Play2.2->2.3->2.4とけっこう大きな変化があった模様。
参考になるのは、Info Q記事の[Play 2.4が依存性注入を採用，Java 8に移行](http://www.infoq.com/jp/news/2015/06/play-24-dependency-injection)と、Qiita記事の[Play 2.4でのCRUD処理（＋Akka）をJavaとScalaの2つの実装で比較してみる](http://qiita.com/erin/items/4bbdcfa27b766309bda4)。

前者記事では、メジャーアップデートであるPlay 3でバックエンド基盤の入れ替え(Netty->Akka HTTP)を行う予定であり、* Play 3の前に準メジャーリリースのPlay 2.5があるかも知れませんが，互換性を損なうような大きな変更は行わない予定です。*と書かれているが、、実際には、"[いつのまにか Play 2.5 が出ていた。New Streaming API based on Akka Streamなど。](http://b.hatena.ne.jp/entry/281461326/comment/legoboku)"とある通り、Play 2.5でけっこうな変更があった模様。

[What’s new in Play 2.5](https://playframework.com/documentation/2.5.x/Highlights25):
> The main theme of Play 2.5 has been moving from Play’s iteratee-based asynchronous IO API to Akka Streams.

...むむっ、Web屋さんも生唾ごくりな変更かも[要調査]...。
cf.[Akka HTTPからAkka Streamへのつなぎ込み...](http://qiita.com/mananan/items/3153a64732853eaa6be3)

後者記事の方、Play Scalaでの、Slick 3.xでのデータベースアクセスのコードが、PlayJavaのコードよりDAOが長くなってしまうといったあたりは、貴重な実情報。*...バックエンドの"Functional"、やや厳しいかも。*


### Play、*攻めすぎ!?*
2.x系それぞれに変更点が多いため、Webの情報、特に日本語情報が、バージョン違いで役に立たないことが多い。軽くググッた感じでは、現時点では、Play2.3あたりの日本語情報が引っかかりやすい気がした。

- ググると検索上位にくる[日本語版Play 2.3.x documentation](https://www.playframework.com/documentation/ja/2.3.x/Home)
- Qiitaでストック数が多い[Play Framework 2.3 (Scala) を使った Web システム開発入門](http://qiita.com/kukita/items/6326f1439abec013a479)
- Javaな人向けの[Play Framework 2.3 For Javaの入門記事一覧](http://mpon.hatenablog.com/entry/2014/07/22/220207)

これら情報とPlay2.5、さらには、Play3.0との差分は、誰かが"人柱"になって埋めなければならない感じ。*Playが登場して約10年、いまなお"攻めすぎ"ってのはすごいな。。。*

## ②人柱を始める理由
### Scala使いが"人柱"すべき。
Playは2.0以降、基盤部分がScalaで書かれている。breaking changeが多いのも、Typesafe社界隈のScalaな人が攻めているため。
実サービスを作るという観点から、どこまで学ぶ必要があるかはさておき、scala界隈独特のキーワード/新たなキーワードに親近感がないと、"人柱"は辛い。そして、並みのScala使いにとってPlay2.5以降が辛すぎる際には、Javaな人にはより辛いということで、Play2.3系あたりを使うことになると思う。


### Scala使いの個人的な学習としては楽しそう。
Akka HTTPとか、Akka Streamとか、ほとんどウォッチしてこなかったので、少なくとも個人的な学習としては楽しそう。昔々、Play1.x系とPlay2.0とがどう違うか的なブログネタがけっこう盛んだったことを少し思い出す。

###多分なんとかなる。
Scala 2.0以降、少なくとも、大きなアーキテクチャは変わっていない。で、Play2.x系で、けっこうな数の本番稼働があるわけだから、情報もアップされてくるだろうし、再入門は多分そんなに難しくない、はず。

# 次回以降の取り組み。
##必須の取り組み:

- Play2.5のインストール。
- Play2.5をJavaで書いた場合とScalaで書いた場合の違いを検証していく。
- Play2.4/2.3との相違点を知る。
- Play2.5上で、JavaとScalaとの組み合わせも検証してみる。
- Play3.0がどうなるかの情報を収集する。
- Play2.5以降がチーム開発で採用可能か、自分なりに考察する。

##Play2.5以降を採用する場合の取り組み:

- Android開発でPlayをお試ししてみる。 *# てきればScaloid(≒Scala on Android)を試してみたい*
- Web/Android/iOSの共通サービスをPlayで開発 => 実開発で取り組みたいこと。