突如思い立ったので。こういう新しい言語とかに手を付けるの、思い立ったが吉日っぽいとこあるし。
今回確認したものの各種バージョン↓
まずは下調べ
まずは Scala について下調べ。僕は普段 Ruby を使っていて、rbenv で便利にバージョン切り替えを行えているので、Scala でも似たようなことをしておいたほうがいいのかな、と。
で、少し調べてみた結果、「そもそもバージョン切り替えをする必要があるかどうかを考えよう」みたいなお言葉を拝見。んーまぁ、今のところは趣味の域だしなぁ、とは思いつつ、そんなに面倒でないならやっておくか、という結論に。
svm のインストール
なので、まずは svm とやらのインストール。Ruby でいうところの rbenv みたいなものかな?
$ 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 にアクセス。
とりあえず準備はできたっぽ。って、 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
が取得できなきゃいけない。
- index メソッドでは、
- 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
してみる。
動いた!
ローカルでは見れていたようなリッチな index ページが見られないのは、そういうものらしい?
Rails でいう 12factor
みたいなやつが必要なのかなぁ、などという適当な予想で、今回のところはお茶を濁しておく。
感想
なんか急に思い立って、自分にとって新しい言語である Scala と、heroku にもデプロイできるということでとっつきやすそうな Play framework を始めてみた。
正直、この先どういうかんじで Scala + Play とお付き合いしていくことになるのかわからないけど、trait
とか、雰囲気ぐらいでしかわからないものもあるので、もしこのまま何か実際に作ってみようと思うなら、一度 Scala そのものの勉強もしてみる必要がありそう。
ただ、言語ばっかり勉強してもつまんないので(ダメ人間)、言語はまぁそこそこにしておいて、なんかそれっぽく動く Web アプリケーションのサンプルみたいなやつの写経に手を付けそうな気がする。それもまぁ気分で。Rails でいうところの「パーフェクト Ruby on Rails」的な、Scala + Play な良い本、なんかないかなぁ?
参考リンク
- MacにJava(JDK)をインストール
- http://qiita.com/ksomemo/items/acda0cea4392d62d51a7
- Installing - 2.4.x
- ProductionHeroku - 2.5.x
- [Scala]Playframework 2.4[Java] | DevelopersIO
- [Scala] 初めてのScala on Play Framework on Heroku
- ScalaでPlayのプロジェクト作ってHerokuで動かす
- scala - Failure when deploying to heroku - Stack Overflow