sbt

第1回&第2回 [Play部屋]Playはじめて&もくもく会を行いました

Play frameworkの手を動かす系の勉強会である「[Play部屋]Playはじめて&もくもく会」を開催しています。Play frameworkは、JavaもしくはScalaで開発が可能な、Webアプリケーションフレームワークです。WebSocketなどをはじめとする先進的なウェブの実装にも適しています。

第1回目を行った自体でブログエントリを書けばよかったんですが、ぐずぐずしている間に第2回も終わってしまいました。。

第1回目の話

第1回目は、2013年01月15日(火) 19時00分 – 22時00分に行いました。

-Play部屋- Play 2.0 Javaはじめて&もくもく会 – 日本Playframeworkユーザー会

実はこの日は結構急に決まったので、開催告知もあまり開催日まで時間がない感じで行ったのですが、多くの方に参加していただき、20人の方が集まりました。

当初募集時は「Play 2.0 Javaはじめて&もくもく会」という名称だったんですが、テーブル担当者が名乗り出ていただいたおかげで、JavaとScalaの両方のサポートが可能になりました。

20人というと、それほど多くないじゃないかと思われるかもしれませんが、そもそも会場となったコワーキングスペース茅場町 Co-Edoのハンズオン系の机有りな状態が25人くらいがたぶんMaxな感じなので、結構ぎゅうぎゅうな感じです。

当日は、この会の特色である初心者の人も積極的にPlay frameworkを試せるようにしていくという点を踏まえて、Play 2.0 Javaのはじめてテーブルを僕が、Play 2.0 Scalaのはじめてテーブルを小原さんが担当する感じにしました。

また、別途もくもくテーブルも用意してあり、ベテランな方々はここでもくもくとマイプロジェクトをしたり、談笑したりするという感じになっています。

shinya31さんによる当日のまとめがあります!

2013/01/15 Play 2.0 Javaはじめて&もくもく会 #play_ja

あと、ブログ記事も!

[勉強会][Playframework][Java]Play 2.0 Javaはじめて&もくもく会 に参加してきた #playbeya #play_ja

第2回目の話

続いて、第2回を2013年01月24日(木) 19時00分 – 22時00分に行いました。参加者は16名くらい。

[Play部屋] 第2回 Play 2.0 はじめて&もくもく会

今回も、Play 2.0のJava、Scalaのはじめてテーブルを僕と小原さんで担当したわけですが、今回は、はじめてその後テーブルというのも用意しました。

はじめてその後テーブルというのは、Playのチュートリアルはやってしまったけど、その後どうしようかという感じの方向けのもので、テーマは毎回変えていく予定です。

今回のはじめてその後テーブルのテーマはWebSocketということに決めていまして、参加者は、WebSocketのサンプルコードをいじって動かしたり、改造してちょっと違うアプリに仕立てたりと、取り組んでいました。

今後もはじめてのその後シリーズはやっていこうと思います。 次はテストとかにしようかなとか考えています。

第2回もshinya31さんによる当日のまとめがあります!

2013/01/24 [Play部屋] 第2回 Play 2.0 はじめて&もくもく会 #play_ja #coedo #playbeya

また、レポートも!

[勉強会][Playframework][Java]第2回 Play 2.0 Javaはじめて&もくもく会 に参加してきた #play_ja #coedo #playbeya

というわけで、「Play部屋」を通じてPlay frameworkを広めていけたらと思います。 よろしくお願いします!

※あと、お手伝いいただける方も積極的に募集しています! 参加料も会場代1000円は必要なものの、それ以外はボランティア的な感じで運営していますので、ご協力いただけると助かります! @kara_dまでお気軽に!!

Read More

Play 2.0 JavaでVelocity Plugin for Play2 frameworkを使う

Play frameworkがバージョン2.0になって新しくなった機能にテンプレート機能があります。よくあるテンプレート形式のGroovyテンプレートから、静的型付けかつ、なんか妙に構文ぽい雰囲気のあるScalaテンプレートというスタイルのものに変わったのでした。
これをそのまま使ってもいいけど、Scalaテンプレートなんてちょっと一般のフロント寄りの人は受け付けないでしょう。

そういう人には、別のテンプレート言語を採用するという方法があり、そのうちの1つがvelocityプラグインです。

Furyu/play-velocity-plugin

velocityは、Apache Velocityと言い、Apacheプロジェクトの1つです。Javaで実装されています。Apacheプロジェクトということで安心感があります。
このプラグインは、Scalaベースのプロジェクトでの使用が前提として開発されており、マニュアルでも下記のような形で使えると記載されています。

object YourController extends Controller {
  def index = Action {
    Ok(VM("vm/index.vm", Map("name" -> "__name__", "title" -> "__title__")))
  }
}

今回は、これをJavaベースのプロジェクトでも使ってみましょう。
まず、プラグインを導入します。こんな風にsbtの設定ファイルに依存関係を記述します。

val appDependencies = Seq(
  "jp.furyu" %% "play-velocity-plugin" % "1.0"
)

続いて、プラグインの実行順序を規定するために下記のようにconf/play.pluginsファイルに記載します。

5000:jp.furyu.play.velocity.VelocityPlugin

まあ、ここまでは、Scalaベースと同じ感じです。
Play 2.0 Javaでは、ScalaのコードをJavaから扱うことになるので、インポートの書き方が少し変わります。
まず、下記のようにインポートを指定します。

import play.libs.Scala;
import jp.furyu.play.velocity.mvc.package$;

play.libs.Scalaというのは、JavaからScalaのコードを使ったり、逆をつかったりするために便利なライブラリで、例えばJavaのMapやList、ArrayなどをScalaのものとしてScalaで作られているライブラリに受け渡すためのラッパーとして使えます。おそらくこのファイルは今後もっと充実していく気がします。

次の、jp.furyu.play.velocity.mvc.package$という書き方ですが、velocityプラグインが定義されているVelocityPlugin.scalaでは、mvcというオブジェクト(ここでいうオブジェクトはScalaのObjectのこと)として定義されている上にpackage宣言がされているので、このような参照スタイルになると思われます。

インポートをした後で、こんな風にコントローラを書きます。

public static Result index() {
    HashMap<String, Object> map = new HashMap<String, Object>();
    map.put("name", "__name__");
    map.put("title", "__title__");
    return ok(package$.MODULE$.VM("vm/index.vm", Scala.asScala(map), "utf-8"));
}

ポイントは、HashMapを<String, String>でなく<String, Object>にしないといけないのと、呼び出し方が「package$.MODULE$.VM(“vm/index.vm”, Scala.asScala(map), “utf-8″)」となる点です。これは、Scalaで生成されたクラスを逆コンパイルすると出てくる$つきの表記で、シングルトンとして定義されるobjectを使っているとこんな風にJavaからはStaticなメソッドとして扱う事ができるぽいです。

Scala.asScala(map)は、play.libs.Scala.asScalaメソッドを使ってScalaのMapへと変換をしています。

以上で、あとはテンプレートを任意の位置に配置することでレンダリングが行えます。

ただし、「package$.MODULE$.VM(“vm/index.vm”, Scala.asScala(map), “utf-8″)」となるのはちょっとかっこわるいので、適当なところにラッパー用のクラスを用意して対応したほうがよいと思います。
例えばこんな感じでインターフェースを持てるといいかもです。

return ok(velocity.vm("/index", map, "utf-8"));

以上、興味があったらPlay 2.0 Javaプロジェクトでも導入してみてください。

Read More

Short filter module for Play2!をリリースしました

Play framework 2.0 で、Play各種テキストフィルターやエスケープなどの処理を簡単に記述できるPlayテンプレートタグ系のプラグイン「Short filter module for Play2!」をリリースしました。

というか、リリースしましたなんていうのもおこがましいプラグインなのですが、、、。

たぶん世界最小のPlayプラグインだと思います(笑

そもそもの話

元々、これはPlayの中の人であるErwanさんの飲み会の時に、相談したもので、現状Scalaテンプレート内で「{」や「}」を使用する場合は、必ず対にするという必要があります。

「{}」部分は、テンプレートシンタックスでない部分もパースされてしまっているため、対でないと怒られるというわけです。

そこで、例えば「@{」とか「@}」みたいに書けると結構嬉しいという話をしました。が、僕自身はすぐにでもこれを使いたいので、どうやって実装していいかいろいろ探りました。

1つは、play.api.templates.ScalaTemplates.scala をいじる方法。
これは、頑張ってソースを読み解いていったのですが、具体的にどう改善していいかよくわかりませんでした(笑

そこで、別の方法としていくつかの実装を考えてみたのですが、結局落ち着いたのは、@format.raw(“STRING”)の短縮版でいいんではないかという結論です。

導入と使い方

導入方法は、Playプロジェクト内のproject/Build.scalaに

val appDependencies = Seq(
  "jp.greative" % "play2-short-filtr_2.9.1" % "0.1"
)

val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(
  resolvers += "Greative Repository" at "https://github.com/karad/maven-repo/raw/master/release/"
)

と書いて、プラグインを組み込みます。

文法は、

@r("{や}などのエスケープしたい文字")

しか今のところはありません(笑

Scalaテンプレート内で、例えば

@import tags._

@main() {
   
    @r("{")
        OUTPUT
    @r("}")

}

のように記述すると、

{
    OUTPUT
}

と出力されます。

それだけのプラグインです:笑)

あ、でも、いろいろ今後タグを増やしていく予定ですよ!

今回は、タグ型のプラグインの配布練習みたいなことも兼ねてます。
コンソール型のプラグインに比べたら遥かに簡単に作成でき、すぐ配布できますね。

Read More