sbt

「むしろサーバ初心者にオススメな Play 2.x Java」という発表をしてきた

Play framework Advent Calendar 2014の12日目(おい)です。
今頃書いてごめんなさい。

今回は、Playというものをまだ触ったことがない人のために書いています。

ちょっと前に月刊ライトニングトークというイベントが行われました。
IT系のでもいろいろなジャンルが雑多に展開されるLT大会なイベントです。

ここで急きょ飛び入りで「むしろサーバ初心者にオススメな Play 2.x Java」という発表をしてきました。

参加者はバックエンド系というよりはフロントエンド系な方々が多かったので、こういったタイトルにしています。

個人的には結構真面目に、バックエンドがそれほど得意でない方にオススメなのがPlay frameworkだと思っています。特にJava版ならJavaの入門書は山ほどあるし、調べてわからないことがあるというケースはそうそうないでしょう。

確かにPlay界隈は初心者だけでなくScalaでガチな方々も大勢いらっしゃいますが、そういうガチな用途だけでなく、フレームワーク全体に流れる思想に「なるべく間違いが起きにくくなるようにする」という部分が数多く感じられ、それは間違いやすい初心者の人にもきっと得られる恩恵だろうと感じたからです。

実際は3分くらいしか時間がなかったのでActivatorと呼ばれるビルドシステム(実行可能な状態にするツール)+エディタ+テストおよび実行ツールみたいなプラットフォームのデモに終始しました。

おすすめな理由その1:圧倒的に全部入り

Playの特徴の一つにフルスタック(全部入り)さというのがありますが、フルスタック具合はなかなかのものです。

まずフレームワークに、ブラウザ上でコードの編集からビルド、ユニットテスト(自動テスト)、実行まで行えるエディタが標準装備しています。

まず、こういうタイプのフレームワークはなかなかありません。

加えて、フレームワークにWebサーバが標準装備という点も魅力です。フレームワークについてくるWebサーバというと、開発用にしか使えない程度のサーバだったりしますが、Playについてくるのは、結構大規模なサービス運用でもガチで使えるようなシロモノです。つまり、動かしたものをそのまま本番環境に持っていける。

加えて、テストツールとテスト用のデータベース、ビルドツール、テンプレートシステム、IDE(統合開発環境。IntelliJ Ideaとか)用プロジェクト作成、並行並列処理のフレームワークなどがセットでついてきます。

ちょっと試す程度ならエディタすら用意する必要がないくらいに環境が整っているというわけです。必要なのはJavaのSDKくらいでしょう。

上記がまずオススメの一つ、環境編です。

おすすめな理由その2:間違いにくい

もう一つオススメなのが、「なるべく間違いが起きにくくなるようにする」という思想に裏付けられた数々の仕組みです。
とにかく初心者はよく間違えます。

たとえば、コントローラ(Webからリクエストをうけとってハンドリングする部分)からビュー(表示用テンプレート)になにかの情報を渡すとします。

しかし、実際は表示させた画面には何も出てこない。。
受け取るはずだった変数名が違っていたり、受け渡し漏れがあったりとかあるかもしれません。

Playだとこういうことは起きません。なぜかというと、ビューに渡される変数の型、数とコントローラからの呼び出し方が一致しないと、そもそもコンパイルエラーとなるからです。
これにより、ビューをどんどんカスタマイズしていくときに起きがちな変数の受け渡し漏れを防ぐことができます。

これういった仕組みは、URLルーティングにも使われており、IDEで作業するときにいちはやくミスを発見することにつながっています。

ということで冬休みPlayにトライしてみてはいかがでしょう。

Read More

play-clojureその2(ビューでScalaテンプレートを利用する)

Play framework Advent Calendar 2014の20日目です。

昨日のplay-clojure(Play 2アプリをclojureでつくる)その1に続き、play-clojureネタです。
エントリーがないのでそのまま続けてしまっています。

今日はビューテンプレートを表示してみます。
Playのビューは、Scalaテンプレートと呼ばれる仕組みを使っており、Twirlという名前で呼ばれています。

昨日のエントリーでは、単に文字列をResultとして返すだけのアプリケーションでした。ということで、Scalaテンプレートを適用してみましょう。

昨日のプロジェクトをコピーして、play-clojure-example-viewというプロジェクトを作ってみます。

1. ビューテンプレートの用意

まずは、ビューテンプレートを作成します。

app/views/MyControllerというディレクトリを作成し、index.scala.htmlという名前で下記のテンプレートを用意します。

@(message:String)

Clojure view @message is OK.

これは、単に一つの引数を持つだけのシンプルなテンプレートです。

2. コントローラにアクションを追加

続いて、コントローラの拡張です。
app/clojure/controllers/myController.cljを下記のように書き換えてみましょう。

(ns controllers.myController
  (:import (play.mvc Results)
           (views.html.MyController index))
  (:gen-class
    :methods [#^{:static true} [index [] play.mvc.Result]
              #^{:static true} [view  [] play.mvc.Result]]
    :extends play.mvc.Controller))

(defn -index []
  (Results/ok "Hello world from Clojure!!"))

(defn -view []
  (Results/ok (index/render "TEST")))

変更になった点は、ビューテンプレートのクラスをインポートしている下記の部分

(ns controllers.myController
  (:import (play.mvc Results)
           (views.html.MyController index))

と、新しいviewという関数をstaticメソッドとして出力する部分

  (:gen-class
    :methods [#^{:static true} [index [] play.mvc.Result]
              #^{:static true} [view  [] play.mvc.Result]]
    :extends play.mvc.Controller))

それと、実際のアクション定義となります。

(defn -view []
  (Results/ok (index/render "TEST")))

ちなみにJavaでこのアクション定義を書くとこんな感じになります。

public static Result index() {
        return ok(views.html.MyController.index.render("TEST"));
}

ルーティングの定義

続いて、ルーティングも追加します。
conf/routesに下記を追記しましょう。

GET        /clj                 controllers.myController.view()

これで、http://localhost:9000/cljでアクセスすると「Clojure view TEST is OK.」と表示されるようになりました。

…僕の環境では。おそらくリポジトリからクローンして実行するとコンパイルエラーとなるかと思います。
原因は、clojureがコンパイルされる際に、まだビューのコンパイルが終わっていない状態にあり、それで「 java.lang.ClassNotFoundException」が出力されてしまうのです。

うーむ。。sbtでなにかしないといけないのでしょうか。

以下のリポジトリにて、これらのサンプルは公開しています。

karad/play-clojure
https://github.com/karad/play-clojure

Read More

play-clojure(Play 2アプリをclojureでつくる)その1

Play framework Advent Calendar 2014の19日目です。

しばらく間があいてしまってましたね。
ネタ投下します。

ここ1年くらい、新しい言語勉強としてclojureを使うことを心掛けてきました。

もともとPlay Javaを日々使っていたこともあり、これをミックスできないかと思い始め、play-clojureという企画をはじめてみました。

sbtには、sbt-clojure(https://github.com/Geal/sbt-clojure)というプラグインが存在しており、sbtを使ってclojureのコンパイルが可能になっています。

playは、sbt上で動いているのでこれを使うと面白いことができそうだというのがことの発端です。ScalaのパワーにClojureのシンプルさ!というわけです。

超簡単なhello worldを今回はやってみます。Play-Javaでプロジェクトを作成しおえた状態から始めます。

1. ビルド周りの定義

まず、build.sbtに下記を書きます

seq(clojure.settings :_*)

libraryDependencies += "org.clojure" % "clojure" % "1.5.1"

つづいて、project/plugins.sbtに下記を書きます

addSbtPlugin("com.unhandledexpression" % "sbt-clojure" % "0.1")

これでsbt-clojureの導入は終わりです。

2. コントローラの作成

app以下にclojureというディレクトリを用意し、その中にcontrollersというディレクトリを作成します。

そしてその中にmyController.cljというファイルを作成し、下記のように記述します。

(ns controllers.myController
  (:import (play.mvc Results))
  (:gen-class
    :methods [#^{:static true} [index [] play.mvc.Result]]
    :extends play.mvc.Controller))

(defn -index []
  (Results/ok "Hello world from Clojure!!"))

これでコントローラの記述はおわり。

3. routesにルーティングを記述

conf/routesに下記のようにルーティングを定義します。

GET     /                           controllers.myController.index()

以上で、作業は終了です。

$ sbt run

をすると、localhost:9000でアクセスすると、下記のような画面が表示されます!!

こんな感じでClojureでコントローラを書くことができました。

このシリーズのサンプルはここに今後まとめていきます。

karad/play-clojure
https://github.com/karad/play-clojure

Read More