[Scala] 初めてのScala on Play Framework on Heroku

# 目標

scalaをyosemiteに入れて、apiサーバー作って、herokuに上げたいと思います。

vagrantで環境をつくってもいいかなと思いましたが、scalaのコンパイルにやたら時間がかかるということなので、vagrantだと不安、、、一旦Mac本体でやります。

![Screen Shot 2014-11-08 at 10.13.01.png](https://qiita-image-store.s3.amazonaws.com/0/18705/4065cf9e-558c-12f0-540d-3e5ea169a203.png)


# svmのインストール

https://github.com/yuroyoro/svm

/usr/local/bin/　に置きました。

```scala
$ chmod 755 /usr/local/bin/svm
```

お使いのシェルに以下を追記。

```zsh
export SCALA_HOME=~/.svm/current/rt
export PATH=$SCALA_HOME/bin:$PATH
```

svmコマンドを叩く。

```scala
$ svm                                                   
currently version is
```

こんな感じになったらOK。

Scalaのバージョンを確かめる
http://www.scala-lang.org/

# Scalaをインストール

```scala
$ svm install 2.11.4
```

インストール完了後


```scala
$ scala
----
Welcome to Scala version 2.11.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_65).
Type in expressions to have them evaluated.
Type :help for more information.

scala>

```

となると思います。


# 上記がめんどい場合は

```scala
$ brew install scala
```

or

```scala
# ここら落とす
http://www.scala-lang.org/
```

でOK。

# PlayFramworkのインストール

```scala
$ brew install play
```

あんまり考えたくないのでこれでいきました。

ビール絵文字が出てきてCompleteってなったらOKです。

## playコマンドを叩いてみる

```scala
$ play
```

![Screen Shot 2014-11-08 at 9.51.57.png](https://qiita-image-store.s3.amazonaws.com/0/18705/b8dfd9b2-95c1-40b8-9fe8-b8e21d935fa0.png)


```scala
$ play new appName
```

![Screen Shot 2014-11-08 at 9.53.55.png](https://qiita-image-store.s3.amazonaws.com/0/18705/7e636585-8665-4367-08ee-7bf95d21a3d9.png)

![Screen Shot 2014-11-08 at 9.54.05.png](https://qiita-image-store.s3.amazonaws.com/0/18705/2efdc563-e3e7-5c1d-7a20-53cac4ab600f.png)

## とりあえず動かしてみる

```scala
$ cd appName
$ play run
```

おっせーーー((((；ﾟДﾟ))))ｶﾞｸｶﾞｸﾌﾞﾙﾌﾞﾙ
この段階で遅いってマジかよ。。。

![Screen Shot 2014-11-08 at 10.02.56.png](https://qiita-image-store.s3.amazonaws.com/0/18705/7806f6a5-fb48-bb34-9e35-0495691949e1.png)

開発を進めていくとコンパイルに3分とか5分とか10分とかかかると聞くので、(´ε｀；)ｳｰﾝ…って感じはしますね。

ちなみに、IPアドレスがIPv6で示されているのは仕様なのかな。。。？

## localhost:9000にアクセス

![Screen Shot 2014-11-08 at 10.04.26.png](https://qiita-image-store.s3.amazonaws.com/0/18705/5d2128e4-d263-452a-2be3-b5eb44afa616.png)

こんな画面が見れたらOK.

# Git

Gitを入れます。
たいていの場合は入っているかと思いますが、なかったら homebrewかなんかでいれます。
（省略）

```scala
$ git init
$ git add .
$ git commit -am "Initial Commit" 
```

ライセンスが云々言われる場合もありますが、流してagreeしちゃえばOKかと。
![Screen Shot 2014-11-08 at 10.09.41.png](https://qiita-image-store.s3.amazonaws.com/0/18705/f0675956-e33b-fea0-7885-787ed9c9e123.png)



# Heroku

## アカウント

アカウントがない場合はつくります。

* www.heroku.com/

## heroku toolbelt

herokuコマンドを使うために、heroku toolbeltをインストールします。

* https://toolbelt.heroku.com/

![Screen Shot 2014-11-08 at 10.15.19.png](https://qiita-image-store.s3.amazonaws.com/0/18705/89d29686-dcb6-b314-3b1d-a4b99ef7df94.png)

## heroku にログイン

```zsh
$ heroku login
```

## heroku に上げる

### herokuにアプリを作ります。

```zsh
$ heroku create app_name
---
Creating app_name... done, stack is cedar-14
https://app_name.herokuapp.com/ | git@heroku.com:app_name.git
```

ここで表示される git＠heroku.com:app_name.git は次で使います。

### git に今作ったアプリのリポジトリを登録します。

```zsh
$ git remote add heroku git@heroku.com:app_name.git 
```

このherokuの部分は好きな文字列でいいです。
リポジトリの登録名になります。
あとから変更も出来ます。

### 鍵

* 作成

```zsh
$ ssh-keygen -t rsa 
```

とかして、なんとか鍵を作成します。

* 登録

```zsh
$ heroku keys:add
```

参考: https://devcenter.heroku.com/articles/keys

### ~/.ssh/config 設定

```zsh:例
Host heroku.com
  HostName heroku.com
  port 22
  User git
  PreferredAuthentications publickey
  identityfile ~/.ssh/heroku_id_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes
```

↑例です

### もしherokuアカウントを複数使っている場合

* http://journal.sooey.com/162

* 疎通確認

```zsh
$ ssh -v git@heroku.com
```

### あげます

```zsh
$ git push heroku master
```

herokuのところは git remote で登録した文字列で。

![Screen Shot 2014-11-09 at 10.12.41.png](https://qiita-image-store.s3.amazonaws.com/0/18705/829153e8-cec8-b03a-bd71-bde808bd4da7.png)

こんな感じでコンパイルが始まります。
エラーがあればここで弾かれます。

## アクセス

herokuアプリのURLにアクセスします。
URLはherokuのマイページやgit push の際のログページに記載されています。
もしくは以下のコマンドでいきます。

```zsh
$ heroku open
```

特に何にも設定しなければこんな画面が見れるかと思います。

![Screen Shot 2014-11-09 at 10.23.01.png](https://qiita-image-store.s3.amazonaws.com/0/18705/4ad9228c-b2d3-8046-6418-e2c0b3bf242a.png)

localで見たあのリッチな画面は production では見れないようです。

コードは　app/views/index.scala.html　ここに。


## postgres に接続

herokuのPostgresに接続できるようにしたいと思います。

* postgresが使われていることを確認

```scala
$ heroku addons
=== app_name Configured Add-ons
heroku-postgresql:hobby-dev  HEROKU_POSTGRESQL_SILVER
```

もしアドオンがなかったら、

```zsh
$ heroku addons:add heroku-postgresql --app app_name
```

* postgresのurlなどを確認

```zsh
$ heroku config
=== app_name Config Vars
DATABASE_URL: postgres://hogehoge
HEROKU_POSTGRESQL_SILVER_URL: postgres://hogehoge
JAVA_OPTS: hogehoge
PATH:                         .jdk/bin:.sbt_home/bin:/usr/local/bin:/usr/bin:/bin
REPO:                         /app/.sbt_home/.ivy2/cache
SBT_OPTS: hogehoge
```

### Procfile

デフォルトではないと思うので、アプリケーションのroot直下に作成します。

```scala:app_name/Procfile
web: target/start -Dhttp.port=${PORT} -DapplyEvolutions.default=true -Ddb.default.url=${DATABASE_URL} -Ddb.default.driver=org.postgresql.Driver
```

### application.conf

```scala
db.default.url="jdbc:postgresql://localhost/XXXXX"
db.default.url=${?DATABASE_URL}
```

# 余談

## vagrantだと

こんな感じでできますね。いろいろ入ってるし。](http://unok.hatenablog.jp/entry/2013/12/09/093845)

# References

* http://yuroyoro.hatenablog.com/entry/20110121/1295610398
* http://www.slideshare.net/mollifier/scala-lt-18717003
* https://devcenter.heroku.com/articles/creating-apps