読者です 読者をやめる 読者になる 読者になる

えいのうにっき

あたまのなかのデトックスを、不定期的に。主に Web 系技術ネタ。

Scala + Play framework を始めてみました

Scala Play framework heroku

突如思い立ったので。こういう新しい言語とかに手を付けるの、思い立ったが吉日っぽいとこあるし。

今回確認したものの各種バージョン↓

  • Java
    • 1.8.0_74
  • Scala
    • 2.11.7
  • typesafe-activator
    • 0.13.8
  • Play
    • 2.5.0

まずは下調べ

まずは Scala について下調べ。僕は普段 Ruby を使っていて、rbenv で便利にバージョン切り替えを行えているので、Scala でも似たようなことをしておいたほうがいいのかな、と。

で、少し調べてみた結果、「そもそもバージョン切り替えをする必要があるかどうかを考えよう」みたいなお言葉を拝見。んーまぁ、今のところは趣味の域だしなぁ、とは思いつつ、そんなに面倒でないならやっておくか、という結論に。

svm のインストール

なので、まずは svm とやらのインストール。Ruby でいうところの rbenv みたいなものかな?

github.com

$ git clone git@github.com:yuroyoro/svm.git ~/.svm

以下を shell に追加。

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

svm のかくにん。

$ svm
currently version is 

よかった♡

Java のバージョン確認

続いて、Scala のインストール...の前に、自分のマシンの Java のバージョンを確認。ここしばらく、完全に使ってなかったからなー、と見てみたら、 Java 7 Update 45 。最新は Java 8 Update 74 ってことなんで、あんまし考えずに上げてみることにした。

Java SE - Downloads | Oracle Technology Network | Oracle に行ってダウンロード。その後、 JAVA_HOME の設定をする。(ぼくのマシンにはいろんなバージョンの Java が入ってしまってるので、以下のようにしている。)

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

 

$ java -version
java version "1.8.0_74"
Java(TM) SE Runtime Environment (build 1.8.0_74-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)

ほい。次、Scala のインストール。

Scala のインストール

Scala も、どうせなら最新版の Scala がいいよねってことで、 http://www.scala-lang.org/ に行ってみた、ら、2.11.7 が最新ぽいので、それのインストール。

$ svm install 2.11.7

ダウンロードがはじまった。しばし待った後に、確認。

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

scala> 

よさそう。

typesafe-activator のインストール

続いて、Play framework のインストール。Play は typesafe-activator のインストールがそれに該当するようす。 (https://www.playframework.com/documentation/ja/2.4.x/Installing

$ brew install typesafe-activator
$ activator --version
sbt launcher version 0.13.8

ちなみにこの activator コマンド、定義されてないオプションとか指定しちゃうとなぜかブラウザが開く...。。 あと、これでほんとに Play の 2.4.x が入ったのかどうか、よくわからないなー。

その後、プロジェクトの作成。

プロジェクトの作成と起動

$ activator new hello-scala-play

Fetching the latest list of templates...

Browse the list of templates: http://typesafe.com/activator/templates
Choose from these featured templates or enter a template name:
  1) minimal-akka-java-seed
  2) minimal-akka-scala-seed
  3) minimal-java
  4) minimal-scala
  5) play-java
  6) play-scala
(hit tab to see a list of all templates)
> 6
OK, application "hello-scala-play" is being created using the "play-scala" template.

起動してみる。

$ cd hello-scala-play 
$ activator run
Getting org.scala-sbt sbt 0.13.11 ...
...
[info] Done updating.

--- (Running the application, auto-reloading is enabled) ---

[info] p.c.s.NettyServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

これがまた遅い!w ぼくの環境では、localhost が立ち上がるまで 34分 掛かった。初回は特に遅いとのこと。立ち上がったら http://localhost:9000 にアクセス。

f:id:a-know:20160312111553p:plain

とりあえず準備はできたっぽ。って、 You’re using Play 2.5.0 って 2.5 系じゃん...、、まじで...。。

いろいろ見てみる

表示されたページで目を引く Why do you see this page? に目を通して、helloworld 的な仕組みの理解を試みる。

  • conf/routes でルーティングの定義
  • GET / controllers.HomeController.index のようなルーティングが定義されているとき、 / にアクセスすると app/controllers/HomeController の index メソッドが呼び出される。
    • index メソッドでは、 Action が取得できなきゃいけない。
  • HomeController の index メソッドは def index = Action { Ok(views.html.index("Your new application is ready.")) } と定義されている。
    • Action てのは HTTP リクエストをハンドリングして HTTP レスポンスを返すための関数(function)。
    • Action { Ok(views.html.index("Your new application is ready.")) } だと、view のテンプレート views/index.scala.html を使って、 200 ok のレスポンスを返す...となる
  • views/index.scala.html は、↓こんなん。
@*
 * This template takes a single argument, a String containing a
 * message to display.
 *@
@(message: String)

@*
 * Call the the `main` template with two arguments. The first
 * argument is a `String` with the title of the page, the second
 * argument is an `Html` object containing the body of the page.
 *@
@main("Welcome to Play") {

    @*
     * Get an `Html` object by calling the built-in Play welcome
     * template and passing a `String` message.
     *@
    @play20.welcome(message, style = "Scala")

}
  • 一行目で @(message: String) とすることで、 message に Your new application is ready. が入ることになるみたい。
  • @main("Welcome to Play") で、別の view テンプレート app/views/main.scala.html が読み込まれるみたいだけど、正直わかりにくなと思った

ルーティングは他にも2つ、あったので、そっちも見てみた。

  • /count
    • このパスにリクエストするたび、atomic にカウントするだけの処理
    • Counter というのが trait Counter と定義されていて、 AtomicCounter クラスが class AtomicCounter extends Counter で定義されている。
      • override def nextCount(): Int = atomicCounter.getAndIncrement() ともされている。
      • Interface ?的なもんだろうか?
  • /message
    • アクセスしても Hi! としか表示されない。なんじゃこりゃ?
    • Action.async とか promise.future とかっていう実装があるんで、非同期処理の簡単な例、ってかんじっぽい

heroku に deploy してみる

してみる。今回 Scala + Play framework をやってみようと思えたのも、heroku でイケる(= Rack に準拠してる...ってことかと思ってたけど、そうではない?)から、ってのがかなり大きい。

$ git init
$ git add .
$ git commit -am 'Initial Commit'
$ heroku login
$ heroku create hello-scala-play
heroku-cli: Installing core plugins... done
Creating hello-scala-play... done, stack is cedar-14
https://hello-scala-play.herokuapp.com/ | https://git.heroku.com/hello-scala-play.git
$ git push heroku master

なんとなく予想はしていたのだけど、heroku に push してからちょっと待たされる。でも今回は数分程度。

push が完了したので、Rails と同じ感覚で http://hello-scala-play.herokuapp.com にアクセスしてみたが、エラー。 heroku logs してみると、

[error] p.a.l.c.CryptoConfigParser - The application secret has not been set,
and we are in prod mode. Your application is not secure.
[error] p.a.l.c.CryptoConfigParser - To set the application secret, please
read http://playframework.com/documentation/latest/ApplicationSecret

というメッセージが。なるほど、これ Play でもいるのね。 application secret 文字列、どうやって生成しようかと思ったけど、取り急ぎ、自分の手数の中から生成。

$ bundle exec rake secret             
fbaa86ae...
$ heroku config:set APPLICATION_SECRET="fbaa86ae..." -a hello-scala-play

下記のような内容の Procfile を作成し、

web: target/universal/stage/bin/hello-scala-play \
-Dhttp.port=${PORT} \
-Dplay.crypto.secret=${APPLICATION_SECRET}

commit、heroku に push。 heroku open してみる。

f:id:a-know:20160312111647p:plain

f:id:a-know:20160312111656p:plain

動いた!

ローカルでは見れていたようなリッチな index ページが見られないのは、そういうものらしい? Rails でいう 12factor みたいなやつが必要なのかなぁ、などという適当な予想で、今回のところはお茶を濁しておく。

github.com

感想

なんか急に思い立って、自分にとって新しい言語である Scala と、heroku にもデプロイできるということでとっつきやすそうな Play framework を始めてみた。

正直、この先どういうかんじで Scala + Play とお付き合いしていくことになるのかわからないけど、trait とか、雰囲気ぐらいでしかわからないものもあるので、もしこのまま何か実際に作ってみようと思うなら、一度 Scala そのものの勉強もしてみる必要がありそう。

ただ、言語ばっかり勉強してもつまんないので(ダメ人間)、言語はまぁそこそこにしておいて、なんかそれっぽく動く Web アプリケーションのサンプルみたいなやつの写経に手を付けそうな気がする。それもまぁ気分で。Rails でいうところの「パーフェクト Ruby on Rails」的な、Scala + Play な良い本、なんかないかなぁ?

参考リンク

関連エントリ

blog.a-know.me

blog.a-know.me

follow us in feedly