Skip to content
国際化

Play! framework + React サイトの i18n

Play! framework + React サイトの i18n published on Play! framework + React サイトの i18n へのコメントはまだありません

概要

タイトルからある程度想像はつくと思うけど、一応書く。

前提

  • Play! framework の messages ファイルとかを使って、テキストの i18n を行っている。ドキュメントはこの辺
  • 日付とか、その辺の i18n は今のところやっていない

やりたい事

  • React で表示しているメッセージも多言語化したい
  • Play 用、React 用と、ファイルを2セット用意するのは避けたい

環境

  • Play! framework 2.5
  • React 15

結論 (tl;dr)

  • Play JsMessages というライブラリを使用し、messages ファイルの内容を JavaScript のオブジェクトとして出力するエンドポイントを作成 (/i18njs/allMessages という名前にした)
  • Play! framework のビューの中で <script> タグを使ってそのJSオブジェクトを読み込む
  • i18next というライブラリに、その JS オブジェクトを渡す
  • React (やその他 JS コード)でテキストを出力する部分で、i18next を使う

Continue reading Play! framework + React サイトの i18n

Play! frameworkのJsPath.readNullableの挙動

Play! frameworkのJsPath.readNullableの挙動 published on Play! frameworkのJsPath.readNullableの挙動 へのコメントはまだありません

はじめに

Play! framework の JSON ライブラリって、慣れればまぁ普通に使えるけど、ドキュメントがイマイチだし、やりたいことをどう書けばいいかが分からなくて時間を使うことが多い。

今回書くのは、JSONデータである要素が存在しない場合にそれをどう扱うか、という話題。

「なんだ readNullable 使うだけでしょ?」

と思う人もいるかもしれない。まぁ実際にはそうなんだけど、readNullable の挙動が若干分かりにくかったので、それについて。

やりたいこと

JSONデータで、ある要素が存在する場合と存在しない場合が考えられるとき、その要素が存在する場合は Some 、存在しない場合は None としてパースしたい。

具体的な例で説明すると、Facebook APIから以下のようなJSONが返ってくるとする。内容はあるFacebookグループへの書き込み。

Continue reading Play! frameworkのJsPath.readNullableの挙動

Scala や Play! framework で DI

Scala や Play! framework で DI published on Scala や Play! framework で DI へのコメントはまだありません

自分用メモ

 

Slick 2.0.xをPlay! framework2.2から使う

Slick 2.0.xをPlay! framework2.2から使う published on Slick 2.0.xをPlay! framework2.2から使う へのコメントはまだありません

はじめに

タイトルにPlayも含めてるけど、今回のエントリーは主にSlick 2.0.xの話。

そして、最初に一言言わせて欲しい。Slickのドキュメントは分かりにくい or 不十分。ただ、「お前が貢献しろよ」、という真っ当な指摘が来そうなので、これに関してはあまり深入りはしない。

まずは今回の目的を。

目的・ゴール

簡単に今回の目標を書いておく。

  • Play! framework 2.2.xで、Slickを使ってDBにアクセスする。
  • DBのスキーマからコードを自動生成する機能を使う。

後者に関してだけど、DBのテーブルは生のSQLを使うことが多いので、あると非常に便利。幸い、Slickにはコード自動生成の機能があるので、それを使う。

ScalaのDB library

本題に入る前に、今回のエントリーの背景を少し。

今実験的に動いているプロジェクトでは、前回のプロジェクトと同じくPlay! 2.2を使うことにした。慣れてるし。でも、せっかくだし何か新しいことも試さないと、ということで、DBライブラリーは今まで使ったこと無いSlickを使うことにした。

今まではSquerylScalikeJDBCを使った事があって、どちらにも大きな不満はそれほどなかった。実際、両方共いいライブラリだと思う。後から出てきたScalikeJDBCの方が設計は綺麗だと思うけど。

その他、Play!の場合Anormという選択肢もあるけど、知り合いの信頼の置ける開発者から「論外」みたいな話を聞いたことがあるし、ドキュメントを見る限り基本的というか低レベルなので、あまり開発効率向上にはつながらなさそう、ということで除外。

環境

さて、本エントリーの環境。

  • Play! framework 2.2.2
  • play-slick 0.6.0.1 (Play!でSlickを使うためのプラグイン)
  • Slick 2.0.0 (play-slickのバージョンによって使えるSlickのバージョンが異なる)

以下、本題。

Continue reading Slick 2.0.xをPlay! framework2.2から使う

FabricでPlay! frameworkアプリのデプロイを自動化してみた

FabricでPlay! frameworkアプリのデプロイを自動化してみた published on FabricでPlay! frameworkアプリのデプロイを自動化してみた へのコメントはまだありません

随分前から、勉強がてら個人でちょこちょこwebサイト作ってる。デプロイはjarファイルのコピーだけとは言え、毎回手動でdeployとサービス再起動をするのはさすがに面倒になってきたので、デプロイを自動化するツールを導入する事にした。

環境等

  • Play! framework 2.2
  • web(app)、DB、バッチでサーバーが分かれている
  • デプロイ先はいずれもLinux
  • ローカル開発環境はOS X Mavericks (10.9)
  • Fabric 1.8.1を使用

Continue reading FabricでPlay! frameworkアプリのデプロイを自動化してみた

Play! frameworkのテンプレートでパターンマッチを使う方法

Play! frameworkのテンプレートでパターンマッチを使う方法 published on Play! frameworkのテンプレートでパターンマッチを使う方法 へのコメントはまだありません

Play!のテンプレートは型安全だし、中でScalaが使えるのでそこそこ便利なんだけど、スペースの有無でコンパイルが通らなかったりとか、色々面倒な部分も。

特にパターンマッチを使いたかったのに、なかなかうまく行かなくて色々試行錯誤した。

結論から言うと、以下のように改行を入れるとOKだった(公式サイトのTemplateのuse caseのページより引用)。

@level match {

  case "success" => {
    <p class="success">
      @body("green")
    </p>
  }

  case "warning" => {
    <p class="warning">
      @body("orange")
    </p>
  }

  case "error" => {
    <p class="error">
      @body("red")
    </p>
  }

}

環境:Play! framework 2.2

Play! frameworkでモバイルサイトを作る

Play! frameworkでモバイルサイトを作る published on Play! frameworkでモバイルサイトを作る へのコメントはまだありません

冬休みの宿題ということで、前からぼちぼち作っているサイトのモバイル版を作ろうと思った。モバイル向けの部分はjQuery Mobileを使うことにした(これに関しては別エントリーで)。

環境

  • Play! framework 2.2

(主に)3種類の選択肢

desktopとmobile (smart phone)の両方に対応したサイトを作る場合、主に以下の3通りがある。

  1. 同じURL。User-Agentで判断して異なるHTML、CSS、JavaScriptを返す。
  2. 異なるURL。(www.example.com と m.example.com など)
  3. 同じURL。レスポンシブデザイン。

(3は今の自分がやるには面倒なのでとりあえず除外するとして)、どれがいいんだろう?と思ってちょっとググってみたところ、Googleのこんなページが見つかった。

正直、ユーザーにとっては同じURLだろうと異なるURLだろうとそんな気にしないだろうから(自動的にリダイレクトしてくれれば)、SEOという観点は重要かなと思った。

で、結論として1番の同じURL、異なるコンテンツ、という方式を選ぶことにした。

Continue reading Play! frameworkでモバイルサイトを作る

Play! framework 2.1 → 2.2に上げた

Play! framework 2.1 → 2.2に上げた published on Play! framework 2.1 → 2.2に上げた への1件のコメント

正月休みを利用して、Play! framework 2.1のプロジェクトを2.2にした。あ、皆様あけましておめでとうございます。

結論から言っちゃうと、Play 2.2 Migration Guideに書いてある情報で大体網羅されていた。

Play自体のアップグレード

Migration Guide通り、Build.scalaとか修正すればOK。最新バージョンは2.2.1なので、ドキュメントに2.2.0って書いてある所は、2.2.1と置き換えて読めばOK。

サードパーティライブラリのアップグレード

Playのプラグインとかライブラリでは、Play 2.1.xの人はバージョンMを、Play 2.2.xの人はバージョンNを使ってくれ、っていうパターンのものが結構ある。

そういったライブラリとかのバージョンを正しいものに変更せずにビルドしようとすると、以下の様なエラーが出た。

[error] Modules were resolved with conflicting cross-version suffixes in {file:/Users/kazu/Documents/workspace/projectfoo/}projectfoo:
[error]    org.scala-stm:scala-stm _2.10, _2.10.0
[trace] Stack trace suppressed: run last projectfoo/*:update for the full output.
[error] (projectfoo/*:update) Conflicting cross-version suffixes in: org.scala-stm:scala-stm
[error] Total time: 0 s, completed Jan 1, 2014 12:31:37 AM

個人的に使っていて、バージョン変更する必要があったのはこの辺。

ソースの変更

自分が必要となったところだけ記載。

Result -> SimpleResult

これもMigration Guideに書いてあるけど、play.api.mvc.Resultはdeprecatedになった。

play2-auth関連のコードも修正が必要。具体的にはAuthConfigImpleの各メソッドのシグニチャーを変更すればOK。

Jackson

パッケージ名が変わってる。org.codehaus.jackson → com.fasterxml.jackson

その他(追記)

evolutionsが再実行されそうに

開発環境で起動したら、evolutionsでかなり昔まで戻ってから再実行されそうになった。例えば、現在の最新が50.sqlだとして、20.sqlまでDownが実行され、その後再度20〜50.sqlのUpが実行されそうになった。

原因は、20.sql を適用した後に、20.sql をいじった為だと思う。ただ、Play 2.1の時には、適用済みの古いスクリプトを修正してもそこまで巻き戻らなかったんだけど、Play 2.2で若干仕組みが変わったらしい。詳しくはこちらを参照。

対策として、新しいまっさらなDBを作ってそこでevolutionsを実行し、その後play_evolutionsテーブルから必要なエントリーを元のDBに移し替えること。

specs2関連

以前は以下のようなのがOKだったが、

listOfStrings must contain("A", "B") //A, Bが両方含まれていないとダメ
listOfStrings must not contain("C", "D") // C, Dのどっちかでも含まれていたらダメ

以下のように書き換えないとダメだった。specs2のバージョンは一緒なのに何でだろう。Scalaのバージョンが変わったからかな?

listOfStrings must contain(allOf("A", "B")) //A, Bが両方含まれていないとダメ
listOfStrings must not contain("C")
listOfStrings must not contain("D")

最後に

Play 2.0 → 2.1の時よりは楽だった気がする。あの時はJson周りとか結構変更になったし。

現状、コンパイル通っただけで、まだあんまりテストしてないので、何かあれば追記予定。

ScalaのFutureがブロックする?(深く調べてない)

ScalaのFutureがブロックする?(深く調べてない) published on ScalaのFutureがブロックする?(深く調べてない) への3件のコメント

ScalaのFutureで(あるいはPlay?)で処理がブロックされてしまう現象があった。

環境

  • Scala 2.10.1
  • Play 2.1.3
  • (Playのモデルクラスを使っているだけで、scalaコマンドから起動されるバッチ処理)

簡略化するとこんなコード(実際はもっと分割されてるし、whileじゃなくてtailrecだけど)。

import scala.concurrent.Await
import scala.concurrent.duration._
import play.api.libs.concurrent.Execution.Implicits._
 
for {
  photo <- listOfPhotos
} yield {
  // downloadはサードパーティライブラリのメソッドで
  // Future[java.io.File]を返す
  val fut = photo.download map { file =>
    Logger.debug("start!") //ここまでは実行される。
    // SomeApi.postFileの挙動は、responseが返るまでブロックする。
    // しかし、↓が実行されない
    SomeApi.postFile(file) map { jobId =>
      var complete = false
      var result = None
      while (!complete) {
        Thread.sleep(5000)
        val job = SomeApi.getJob(jobId)
        if (job.isComplete()) {
          complete = true
          result = job.getResult()
          // resultに対して処理
        }
      }
    }
  }
  try {
    Await.result(fut, 120 seconds)
  } catch {
    case e: Exception => Logger.error(e.getMessage())
  }
}

Continue reading ScalaのFutureがブロックする?(深く調べてない)

Play! framework 2.xでJSONを扱う方法をいくつか

Play! framework 2.xでJSONを扱う方法をいくつか published on Play! framework 2.xでJSONを扱う方法をいくつか へのコメントはまだありません

Webサイト作ってると、JSONを扱うことが多い。なので、Play! frameworkで、ScalaのオブジェクトからJSON文字列に、あるいはその逆をやりたいよね、と(特に前者)。

そんな今回はObject -> JSONの方法をいくつかまとめてみた。

環境は Play 2.1.1。そのうち2.2にアップグレードしようと思うけど。

ちなみに Scala Advent Calendar 2013 の 12日目の記事ですら。

Continue reading Play! framework 2.xでJSONを扱う方法をいくつか