2010-05-04 優しい Scala の育て方 [長年日記]

[Scala] play scala はじめの一歩

インストール

インスコ手順

  1. scala 本体
  2. play framework
  3. play scala module

1. scala

これからはじめる人は2.8系(まだRCだけど)がお薦めです。(2.7 からいい感じに進化してるので)。ディストリのパッケージはまだ2.7系のはずなので、本家http://www.scala-lang.org/downloads から取ります。

  1. 2.8の 最新版(2010/05/04現在は scala-2.8.0.RC1.tgz) をDL
  2. 適当な場所に展開
  3. その scala-2.8.0.RC1/bin に PATH を追加
  4. あと java も適当に入れます (ubuntu なら sun-java6-jre とか)

scala と打って、console が立ち上がればOK。(終了はCtl-dで)

2. play framework

これも開発中バージョンですが高機能なので1.1系を入れます。但し、nightly build (毎晩の適当パック)なので当たり外れが大きいので、これは最新版よりも一番動作報告が多い 1.1-r881 がお薦めです。(私もこれを使っています)

% wget http://download.playframework.org/1.1-nightly/play-1.1-unstable-r881.zip
% unzip play-1.1-unstable-r881.zip

この play-1.1-unstable-r881/bin にも PATH を通します (playコマンド用)

[訂正] 「PATHを通すのは play-1.1-unstable-r881/bin ではなくて play-1.1-unstable-r881」 でした。(thx iwamot)

3. play scala module

play コマンドは rails コマンドみたいなもので、project を新規に作ったりします。(server の起動とかもできるので merb の方により近い)。そして、play 用の module をインストールするのにも、この play コマンドが使えます。便利です。インストールするのはもちろん scala モジュールです。以下のコマンドはどこで実行しても大丈夫です。

% play install scala

「scala-0.3を入れるか?」と聞いてくるので "y" で。これで、play を入れたディレクトリの modules の下に scala-0.3 が入ったはずです。

プロジェクト作成

新しいプロジェクトを作成します。サブコマンド名は "new" です。プロジェクト名は適当に "hello" あたりで。ここで、

% play new hello

と実行すると、通常の Java 用の開発環境が作成されてしまいます。(scala) module を有効にするには "with" で指定します。

% play new hello --with scala

アプリケーション名を聞かれるので、ここも "hello" ぐらいで。(この辺まだ理解できてません)。これで hello ディレクトリが作成されて、scala 用の設定になっています。

サーバ起動

ディレクトリ構造は rails 互換なので安心です。app/controllers/Application.scala を見て、短っ!と言うのも一興でしょう。というか、ファイル名がクラス名と同じ大文字になってるのが新鮮ですね。AS的な命名規則はないので、違う名前でも動くはずです。が、慣れるまでは一緒にしておくのが無難でしょう。

もう1点 rails と違う点は、Application は抽象クラスでなく、実コントローラという点です。ということは、既にページがあるということなので、早速起動して確認してみましょう。(サンプルドキュメントを表示するアプリケーションとして稼動可能になっています)

% play run

で foreground で起動します。デフォルトポートは 9000です。(conf/application.confで変更可能)

で無事にページが見えましたね。ルーティングは conf/routes で制御され、この中で

GET /    Application.index

が指定されています。同 index アクションは、render() が呼ばれ、rails と同じようにapp/views/Application/index.html が評価されます。でもコンテンツの実体は、その index.html の中で、さらに welcome タグが参照されて、そのタグは play framework の

  • play-1.1-unstable-r881/framework/templates/tags/

あたりまで飛んでいってて、そこの welcome.html ぽいんですが、自前で tag を作る方法とかはまだ理解できてません。誰か教えて下さい。

テスト

play framework ではブラウザ上からテストをすることが可能です。先ほどは play run で起動しましたが、play test を実行すると test 環境での実行になります。test 環境下では、

という謎の URL にアクセスすると、ブラウザ上にテスト画面が開きます。ここで、テストしたい spec ファイル名を個別に選択すると(「unit test」「function test」単位でも可)、上の「Start」リンクが実行可能になって、あー、楽しい!Selenium まで標準装備だなんて、rails を真似るどころか、あっという間に最先端のフレームワークになってる感じです。

console

scala-0.3 には待望の console コマンドが追加されました。"play scala:console" コマンドによって、play 環境の REPL が立ち上がります。通常のREPL(scalaコマンドによるconsole)は、対話的な実行には向いていますが、ある程度のファイル(群)を扱うには少し不便です。そこで play scala をwebフレームワークとしてではなく、scala の勉強用途に使うのもありだと思います。

  • 好きなだけ app/models/*.scala にコードを書いて
  • LLのように console でたわむれて
  • specをブラウザでつついてキャッキャウフフする

これが、優しい scala の学び方。

app/models/AKB.scala

package models

import scala.xml.{XML, Elem}

case class AKB(xml: Elem) {
  // Accessor Methods
  def name  = get("name")
  def nick  = get("nick")
  def team  = get("team")

  // Getter Methods
  def get(key: String) = xml \ key text
  override def toString = name + "(" + nick + ") [Team " + team + "]"
}

object AKB {
  def loadXML(path: String) = AKB(XML.loadFile(path))
  def loadUrl(url:  String) = AKB(XML.load(url))
}

mayuyu.xml

<member>
  <name>渡辺麻友</name>
  <nick>まゆゆ</nick>
  <team>B</team>
</member>

% play scala:console
scala> import models._   // ← package の読み込みは忘れないように
import models._

scala> val mayu = AKB.loadXML("mayuyu.xml")
mayu: models.AKB = 渡辺麻友(まゆゆ) [Team B]

scala> mayu.name
res0: String = 渡辺麻友

言語に組み込みなせいか、すこぶる楽ちん。

scala の XML の扱いやすさは異常

test/AKBTest.scala

import java.util._
import play.test._
import models._

import org.scalatest.FlatSpec
import org.scalatest.matchers.ShouldMatchers

class AKBTest extends UnitTest with FlatSpec with ShouldMatchers {

  it should "キャッキャウフフ" in {
    var mayu = AKB.loadXML("mayuyu.xml")

    "渡辺麻友" should equal (mayu.name)
    "渡辺麻友" should equal (mayu.toString)
  }
}

akb-spec.png

あ〜ん、可愛い〜!この赤を早く緑にしてあげたい♪

参考

本日のツッコミ(全1件) [ツッコミを入れる]
_ iwamot (2010-05-06 19:18)

play frameworkに触りはじめたばかりなので、とても参考になりました。細かいですが、PATHを通すのは play-1.1-unstable-r881/bin ではなくて play-1.1-unstable-r881 ですよね。


サイト内検索 (by Google)

| JRuby | Rails | Berryz | ℃-ute | エッグ | jQuery |

過去

2010年
5月
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

未来

コンタクト