Play 2.5に入門　⑤Play関連の知識の幅を広げたい。

#Playコードの"歴史"に学ぶ

現行のバージョン2.5系は最近出たばかりだが、Play Frameworkは、10年近い歴史を持つ[^1]。そのため、結構凄いプロダクトがplayで作られ公開されていたり、ためになるサンプル実装が作られていたりする。ここでは、Play関連の知識の幅を広げる意味で役立ちそうな、2つのソースコードを取り上げたい。

# [1] BaasBox
BaasBoxは、Playで実装されたmBaaS(モバイル向けBaaS)であり、ニフティクラウドブログの[オープンソースなmBaaS×9選](http://blog.mb.cloud.nifty.com/?p=2764)でも取り上げられている。

[サイトを訪問](http://www.baasbox.com/cloudservice/pricingplan)すると、月額課金でクラウド上のBaasBox　~~を使える~~　*(の画面が用意されている[^3])*ことが分かる。


![スクリーンショット 2016-04-29 13.18.43.png](https://qiita-image-store.s3.amazonaws.com/0/16455/f31f8ee6-f2ad-b5ba-98a8-630bf2282fe4.png)

左はじに"FREE"という文字があるが、こちらは、ダウンロードして自らbaasboxを動かすユーザー向けのもの。ここから、ダウンロードして、baasboxを任意のサーバーで使い始めることができる。

## 動かしてみる。
github上から、baasboxを直接cloneして、動かすことが出来る。
https://github.com/baasbox/baasbox

注意点は、バージョンがplay 2.2.4に固定されていること。

まずは、[公式サイトのダウンロードページ](https://www.playframework.com/download)の下の方から、play2.2.4のzipをダウンロードして解凍する必要がある。Play2.2系には以下の6つがあって、2.2.6でも動作するかもしれない。

```
play-2.2.6.zip	Nov 14 2014	107.7M
play-2.2.5.zip	Oct 07 2014	107.7M
play-2.2.4.zip	Jul 21 2014	107.7M
play-2.2.3.zip	May 1 2014	107.7M
play-2.2.2.zip	Mar 1 2014	107.7M
play-2.2.1.zip	Oct 31 2013	104.8M
play-2.2.0.zip	Sep 20 2013	105.5M
```

解凍後は、playコマンドを用いる(2.5系と異なり、Play2.2ではplayコマンドでplayを操作する)。コマンドの使い方自体は現バージョンとさほど変わらない[^2])。

ローカル環境で動作させることは簡単。
例えば、解凍したplay2.4.2フォルダのトップに移動して、以下のコマンドを打つだけで良い:

>git clone https://github.com/baasbox/baasbox.git
cd baasbox
../play run

実行後のログインの仕方や他のサーバー向けのビルドは、githubページに書かれている。


これでlocal:9000でbaasboxが動作する。さすがに、商用でも提供されているだけのこともあり、baasboxのダッシュボードは本格的だ:

![スクリーンショット 2016-04-29 13.35.45.png](https://qiita-image-store.s3.amazonaws.com/0/16455/9d2f34d8-bd11-7427-5c9b-637d5082973e.png)

##気になったところ

###① OrientDB
ダッシュボードで気になったのが、"OrientDB"という文字。こちらは、Neo4Jと同様にJVM上で動作するグラフデータベースらしい。

実際、appディレクトリ配下にmodelディレクトリは存在せず、DAOディレクトリのみが存在する。
試しに、app/com/baasbox/dao/UserDao.javaを見てみると、com.orientechnologies.orient.coreという名前空間からのインポートが多数行われている。

```UserDao.java
package com.baasbox.dao;

import java.security.InvalidParameterException;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import org.apache.commons.lang3.exception.ExceptionUtils;

import com.baasbox.service.logging.BaasBoxLogger;
import com.baasbox.dao.exception.SqlInjectionException;
import com.baasbox.dao.exception.UserAlreadyExistsException;
import com.baasbox.db.DbHelper;
import com.baasbox.enumerations.DefaultRoles;
import com.baasbox.exception.OpenTransactionException;
import com.baasbox.exception.UserNotFoundException;
import com.baasbox.service.sociallogin.UserInfo;
import com.baasbox.service.storage.BaasBoxPrivateFields;
import com.baasbox.util.QueryParams;
import com.orientechnologies.orient.core.db.record.OIdentifiable;
import com.orientechnologies.orient.core.index.OIndex;
import com.orientechnologies.orient.core.metadata.security.ORole;
import com.orientechnologies.orient.core.metadata.security.OUser;
import com.orientechnologies.orient.core.metadata.security.OUser.STATUSES;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.tinkerpop.blueprints.impls.orient.OrientGraph;

public class UserDao extends NodeDao  {
...
}
```

実際に動作するグラフデータベースのコードとして学ぶ価値が有るのかもしれない。

### ②Swagger

REST APIのドキュメント生成ツール[Swagger](http://swagger.io/)も使われている。
SwaggerはJavaベースのツールで、開発チームがplay対応を進めてくれている模様。

参考　SwaggerをPlayに組み込んでAPIドキュメントの自動生成をする:
http://blog.share-wis.com/play-swagger

参考　Swaggerの全般的な資料:
http://www.slideshare.net/takurosasaki/swaggerapi

mBaaSにおけるSwaggerの使われどころには、興味がある。



# [2] scalajs-spa-tutorialを試す

お次は、play+scala.jsでSPAアプリを作るチュートリアル。
https://github.com/ochrons/scalajs-spa-tutorial

　SPA(Single-page Application)とは、今後、クロスプラットフォームでブラウザ上での実行が容易という特性から、android/iOS向けのネイティブアプリを超える普及を見せるのではないかと期待されているHTML5+Javascriptアプリのこと。
参考　[SPAがネイティブアプリをぶっ壊す：HTML5/Javascriptが変えるWebの未来](http://qiita.com/KENJU/items/b65d671dc8f79cb42bb6)

react.jsなどのモダンなJSフレームワークで開発されることが多いようだが、AltJSの異端児(?)のscalajsで開発することも出来る。Play Scalaを用いるならば、サーバーもクライアントもscalaで開発できるというわけだ。

もちろん、scalajsがバージョン1.0に達しておらずノウハウも蓄積されていない現時点では、この組み合わせでの実用的なアプリ開発は茨の道。ただ、Scala/Javaな技術者が、SPAを学ぶ教材とはなりうる。

幸い、コードについての丁寧な解説もgit bookとして公開されている。
http://ochrons.github.io/scalajs-spa-tutorial/

play2.5ベースで書かれており、すぐに動作させることができる。

# 感想

BaasBoxは、本格的なオープンソースであり、中身の実装も意欲的。ソースコードを追いかけながら、android/iOSとの組み合わせを試してみたい。

その他、github上には、いろいろなplayベースのアプリやチュートリアルがコミットされている。必要に応じ、それらをお試ししてみたいところ。







[^1]: [①で書いた](http://qiita.com/kmry2045/items/25dc1aadf591e21fbbf2)ように、10年近くの間、時々の新技術を次々と取り入れているため、バージョン毎のフレームワークの作りとコードの書き方がが結構異なる点は、混乱の元でもあるのだが。

[^2]: コマンド名が異なるため、play2.5とplay2.2の併存に問題はない。

[^3]: 現状のBaasBoxには、いろいろとツッコミどころがありそうなため、mBaaSの即戦力として期待している人は注意。。もう少し試すことになったら、このあたりについて書くかも。