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

謎言語使いの徒然

適当に気になった技術や言語を流すブログ。

Playframework2.5.x でプロジェクト分離してみた

サブプロジェクト自体は、Playframework2.3 から存在していて、当時はあまり使い道も思い浮かばなかったが、今では大分使いやすくなってたのでメモ。 完全独立した sbt プロジェクトを取り込む このケースでは、完全に独立した sbt モジュールを取り込みます…

Playframework 2.5 で足りてなさそうなセキュリティヘッダ設定を追加する

セキュリティヘッダなんて、ヘッダに組み込むだけのものなので、ザクッと。 package filters import javax.inject.{Inject, Singleton} import akka.stream.Materializer import play.api.Configuration import play.api.mvc.{Filter, RequestHeader, Result…

Play2.4 でネストしたJsonをバインドする

何で今更かというと、これつかえねーかなと思ったから。 最初は、Forms でのバインドをしようとしたのだけど、早速フォーラムが見つかりました。 キーワードは Play recursive form https://groups.google.com/forum/#!topic/play-framework/Ya1hPmR2QtY こ…

フォームヘルパーをタグ調整する(Play 2.4.x) with マルチセレクトチェックボックス

Playframework 2.4 において、フィールドコンストラクタの仕様も変わったので、対応したチェックボックスを作ってみる。 Custom Field Constructors これがなんなのかというと、input とかの helpers の外枠の事。 いつぞや Bootstrap 対応した フォームヘル…

Play2.4 の DI を弄ってみる

まず適当に Singleton アノテーションをくっつけて使用する。 package utils.modules import javax.inject._ /** * アクセスカウンター */ @Singleton class AccessCounter { @volatile private var price = 0 def add(p: Int) = price += p def get = price…

Playframework 2.4.x でセキュリティヘッダの設定など

まず前提として、Playframework にはフィルタという機能がある。 Playframework 2.3.x 以下の場合は、Global オブジェクトにミックスインする形式をとっていた。 ScalaHttpFilters だが、Playframework 2.4.x 以降は、DI も含めて形式が変更となり、root パ…

Playframework2.4.xのサブプロジェクトの扱い

完全に親子関係でしたねってだけ。 子のオブジェクトは親から参照できるけど、親のオブジェクトを子は参照できない。 同時に、子は横つながりを持たない。 まぁなんとなく想像通りな訳で、使い道的には、幾つかのプロジェクトで共有しておきたい機能をサブプ…

PlayFramework 2.4 でサブプロジェクトで一部URLを切り出してみる

教科書は下記 SBTSubProjects で、まずはプロジェクト root ディレクトリに下記を一気に作成 modules /rest_apis /controllers /conf そして、 modules/rest_apis/build.sbt を作成する。 ここに実は二つ罠があった。 公式では下記(20015/7/8 時点)が書か…

Play 2.4.x をいい加減調べてみる

色々変わったそうなので、まずはハイライトを見てみる。 https://www.playframework.com/documentation/2.4.x/Highlights24 DI サポート テストにおけるモックを容易にしたかった 軽量な組み込みPlayアプリケーションや、一つのJVM上で複数のPlayアプリケー…

フォームヘルパーをタグ調整する(Play 2.3.x)

何がしたかったかと言うと、Bootstrap の形状にうまく乗せたかった。 で、試行錯誤して自分で使っててまぁ違和感がなくなったのでメモ書き Playframework の Form については本家を参照すべし。 まず、Playframework の helper で吐き出すと、デフォルトは以…

Playframework 2.2.x と 2.3.x のUT

基本的に ApplicationSpec と IntegrationSpec の二つ まずは 2.2.x のが下記 import org.specs2.mutable._ import org.specs2.runner._ import org.junit.runner._ import play.api.test._ import play.api.test.Helpers._ /** * Add your spec here. * You…

Playframework2.3、RequireJS と AngularJS を同時に運用してみる

それぞれがなんなのかは下記参照 AngularJS の入門をしてみる - 謎言語使いの徒然 Playframework2.3 で RequireJS 弄ってみる - 謎言語使いの徒然 で、特に難しい話とかはなくて。 build.sbt で Angular 読んで libraryDependencies ++= Seq( jdbc, anorm, c…

AngularJS の入門をしてみる

まずは WebJars の使い方おさらい Playframework2.3 では WebJars にデフォルト対応しているという事で、まず単純に Bootstrap を読んでみる。 libraryDependencies ++= Seq( jdbc, anorm, cache, ws, "org.webjars" % "bootstrap" % "3.0.2", "org.webjars"…

Playframework 2.2, 2.3 現状のおさらい。

まず最初に断っておく。現状(2014/08/25) 2.4 が RC 状態にある。 そして、2.4 には触れない事を断っておく。 Playframework2.2 おさらい 仕事で Playframework 2.2.3 を延々使ってると、新しいバージョンアップに疎くなるので、とりあえず乗り換えも視野に…

HikariCP + ScalaActiveRecord + MySQL5.1 をやってみた

何故にメモかというと、HikariCP がそもそもサンプル無さ過ぎて地獄を見たから。 まずは基本的な ScalaActiveRecord アプリを作る Play のサンプルアプリケーションをまずは作る。 play new HikariSample ウィザードくらいは任せた。 で、速攻、 ScalaActive…

可変長の追加フォームを作成する

可変長のフォームに対応する - 謎言語使いの徒然 の続き。 ついでだから動的にフォームを突っ込んでみる。 まずは build.sbt に下記を突っ込む。 coffeescriptOptions := Seq("bare") Coffee コードをコンパイルする際に、ラップをしない操作。 で、coffee …

可変長のフォームに対応する

まぁ特に難しい話はなし。 リピートしたい類のモデルを用意する。 package models case class Game(name: String, vendor: String) object Game { import play.api.data._ import play.api.data.Forms._ def form = Form(maps) def multiForm = Form(single(…

Chef で CentOS に Playframework2.2.x アプリをデプロイする

CentOS5.10 で動作確認。多分 CentOS 6.x もそんな変わらない筈。 段階を踏もうか。 Play アプリをリリース用にコンパイルする Chef を使ってJavaを突っ込む Chef でデプロイ用 Cookbook を作って配置する 起動スクリプトを書いてデプロイする knife solo co…

Playframework へのアクセス全部に共通のセキュリティヘッダを食わせる

まぁやってる事は ServletFilter とあんまり変わらない。 まずは適当にフィルタを作る。 コピペで安心はモットーです(2.2.1 で確認他のバージョンは知らん) package utils import play.api.mvc.{RequestHeader, Filter} import scala.concurrent.Future impo…

ログイン必須のアクション定義

ログインしてなかったら…という処理は皆書く筈。 Playframework 2.1 あたりから Security クラスが出来たらしい。 当然 2.2 でも使えるのでメモ。 package controllers.helpers import play.api.mvc._ import controllers.routes trait LoginController { se…

Thymeleaf をPlayframework2.2.Xで無理やり使ってみた。

Java のテンプレートエンジン - 謎言語使いの徒然 でさくっと見たテンプレートを、じゃぁPlayframeworkでどうやるんだろうと、ドキュメント眺めながらやってみた。 で、まずはファイルが何処に配置されてるのかを返すクラスを作成。 package utils import or…

Playframework2.2 でファイルアップロードとか

結構みんな探しそう、、、というかきっとアクセス増えそうというあざとい意図で書いてみる。 で、HTTPからファイルを送信するパターンは二つ。 純粋に HTTP Request body にバイナリ突っ込む方法これは単純ですよね。 // routes に追加 // POST /simple cont…

Play2.2.1のWSがもう少しどうにかならんかと思って解析してみた

経緯:試しに書いたらこんなことになり、フォーラムでは対応してないとか言ってて、じゃぁテストとかどうすんだろう?とか思ったらこの辺 で テストで「WS.url で multipart 飛ばせないの?」→「FakeRequest作りこんでテストして」とかそういう話があったの…

Playframework2.2.1 の dist されたアプリを Ubuntu13.10 でサービス化する

適当なサンプルアプリを作る。 play new sample で、それを dist する。 play dist すると、下記が出来上がる。 sample/target/universal/sample-1.0-SNAPSHOT.zip アプリケーション名-バージョン.zip これを適当にサービス化できそうなディレクトリに展開す…

Playframework2.2 から scala activerecord を使う

Scala ActiveRecord まずは build.sbt でプラグインを指定Playframework2.2 でまだフォームインテグレーションは試してないけど、O/R として使う分には問題なかったのでメモ。 libraryDependencies ++= Seq( "com.github.aselab" %% "scala-activerecord" % …

WSライブラリの Playframework2.1 以降の変更

WSライブラリ Playframework 2.0.x 系は WS コマンドで外部サイトアクセスできるのですが、2.0 系から気づけば応答値が変更されていて色々戸惑ったので。 2.0.x 系は val promise:Promise[Response] = WS.url("http://xxx.xxxx.net").get() Promise 型は独自…

自力でFacebookのOAuth2に対応してみた

やることはFacebookアカウントでサイトのアカウント作って、ログイン認証したいだけだったのだが、どうも Playframework2.2 では Pac4J が対応していなかったので、自力で認証してみた。 まずは設定に Facebook のアプリケーション情報を突っ込む auth { fac…

Pac4J をPlayframework2.2 に突っ込んでみて挫折(2013/11/01 時点で未対応)

Playframework2.2 になってから projects/Build.scala が抜けて、build.sbt に直接書くようになってるので注意。 っても、sbt 知ってればどうという事もない。 resolvers += "Sonatype snapshots repository" at "https://oss.sonatype.org/content/reposito…

暗号化を利用する

といってもハッシュを作るだけですが、Playにはcryptが存在する ライブラリは play.api.libs.Crypto で、基本的に下記の定義がある 不可逆(ハッシュ化) sign(String):String sign(String, Array[Byte]):String 可逆 encryptAES(String):String encryptAES(St…

定期実行処理を書く

一番手っ取り早いのは Global の onStart に仕掛ける方法 import play.api.libs.concurrent.Akka import play.api.{Application, GlobalSettings} import scala.concurrent.duration.DurationLong object Global extends GlobalSettings { override def onSt…

テンプレート配置を階層構造化する

公式では view 直下にしか配置されていないが、複数階層を用意すると、下記の様なクラスにコンパイルされる。 import views.html.path.to.class.templateName

evolutionsを利用する

conf/evolutions/defaults ディレクトリに「(数字).sql」ファイルを配置します。 この数字順に実行されますので、テーブルの作成等をここに記述していきます。 尚、コメントで特別なもので、下記があります。 # --- !Ups # --- !Downs Ups : 新規にアップデ…

WS API でWeb上のデータを引っ張る

HTTP なコマンドで拾えるものは大概拾える。 import play.api.libs.concurrent.Execution.Implicits._ import play.api.libs.ws.{Response, WS} import scala.util.{Failure, Success} object RssLoader extends Logger { def firstUri(uri:String) = { def …

フォームエラーをまとめて表示したい

Playframework2.1.1 のフォームに値をバインドし、エラーを表示する際に、エラーのみを一覧表示で取得したい場合がある。 その方法を探してみた。(そのまま今作ってるやつ) val userCreateForm = Form( tuple( "account" -> nonEmptyText(6, 16).verifying(M…

Form をテンプレート上でバインドする

先ずはフォームヘルパーを使用します。 @helper.form(action = controllers.routes.User.create, 'id -> "user") { @* any contents here */ }ここにフォームをバインド下HTMLコンポーネントを配置していきます。テンプレートヘルパーは /framework/src/play…

Playプロジェクトを作成する

作成したいディレクトリまで移動し、下記のコマンドを実行する。 play new [プロジェクト名]するとウィザードが起動しますので、順に回答していきます。 この例では、デフォルトディレクトリに Sample というアプリケーションを作成しています。 azalea@samp…

Form を使う

Playframework にはPOSTデータ等を簡単にバリデーション、及びオブジェクトマップする方法があります。先ずは簡単にフォームを使いましょう。 import play.api.data._ import play.api.data.Forms._ val loginForm = Form( tuple( "email" -> text, "passwor…

Playframework の Form メッセージ多言語化

この Forms を使用した時のバリデーションエラーメッセージや、画面にバインドしたときのメッセージを多言語化する場合の方法。 まず、このフォームバリデーション定義がどこにあるかというと、 ディレクトリ : play-2.1.1/framework/src/play/src/main/scal…

Playframework の Akka 設定を読み解く

※ Play2.0.3 時代の古いやつです Playframework は Akka を利用しており、性能に直結してる。 もし、CPUやメモリに余裕があり、更に大規模なアクセスに対応したい場合は、設定を上書きできる。application.conf で設定可能だが、Playのデフォルト設定は下記…

PlayFramework をインストールする

Playframework 2.1.1 をインストールする手順です Java6 以上を入れます(この詳細はJavaの物を探してください) Play Framework - Build Modern & Scalable Web Apps with Java and Scalaから2.1.1 をダウンロードしてきます 適当なディレクトリへ解凍し、パ…

Playframework のバグに全力でハメられたのでメモ

https://github.com/playframework/Play20/issues/1086このバグ、、、要するに Playframework 2.1.1 は何らかの問題*1で less css を正常に認識できずコンパイルできないらしい。 これで 2h 位嵌められたよ、、、、。 *1:コード追ってないけど

Playframework 2.1.1 ビルドとテストを非同期に

Playframework でそれなりにプロジェクトの規模が大きくなると無視できなくなるのがビルド時間、、、。 特にUT走らせるとなると、ビルド時間が指数関数的に増えること請け合いです。 しかもコンパイル中はソースの改修もなにもできないという、、、、。後IDE…

Playframework2.1.0 で ComboBox のテンプレートを使ってみる

無いかなーと思ってソースコード読んでて見つけた。 公式ドキュメントに乗ってない(まだ書いてないだけ?)のでこれはみんな難儀するだろうなーということで共有。 /play-2.1.0/framework/src/play/src/main/scala/views/helper この辺開くとテンプレートヘ…

Playframework2.0.4 のgzip転送について調べてみた

そもそもPlayにこの機能ないの?って思ってソースを追っかける。 すると、https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/controllers/Assets.scala惜しい、Assets じゃ無いんですよ、、、。 とは言え、s…

PlayFramework2.0x でファイルをストリーム転送する

実装そのものは大した問題ではなく、http://scala.playframework.org/documentation/2.0.4/ScalaStreamなわけなのだが、どれだけ速度が出るものなのか確認してみる。設定をこう書いて、 directory.path="C:/Users/XXXX/Pictures" directory.extension="jpg"…

Play2.0 で一部ハマったのでメモ

忘れると色々ヒーヒー言いそうなのでメモ WS.irl("http://localhost/sample/xxxx").withHeader("Content-Type" -> "text/plain").post(byteArray) でバイナリを自身のサービスにファイルを送りつけてもコントローラ側で val sendedBytes = sample.body.asRaw…

PlayFramework からHectorライブラリ経由でCassandraへアクセスする。

設定自体は簡単なものだった。Build.scala に下記を記載する。 object ApplicationBuild extends Build { val appName = "cassandra-sample" val appVersion = "1.0-SNAPSHOT" val appDependencies = Seq( // Add your project dependencies here, "me.prett…

Play の開発に使いやすい情報

メモ。既にある情報を書くまでも無い気がしてリンクだけ。 動作時に別の設定ファイルをロードする方法。http://www.playframework.org/documentation/2.0.4/ProductionConfigurationちなみに、start コマンドはリリース用動作モード。http://www.playframewo…

Play Framework2.0 いじってみる。

https://github.com/playframework/Play20/wikiこのへんのチュートリアルに沿ってインストールはできると。 SBT ベースになってるので、そのままいけるかなーと思ったけど、コレが案外ハマった。まず、SBT-Idea突っ込もうとして、「project/plugins.sbt」に …