The NERD Commenter がちょいとばかりお馬鹿

最近 Emacs の勉強をしていたのですが、結局よく使うのは Vim だよなということで、Vim についてまじめに学び始めた @itoasuka です。こんにちは。

こんな私ですから .vimrc は日々変わり続けているわけですが、目下の悩みはコメントアウト用のプラグインは何を使おうかということです。

とりあえず「The NERD Commenter」を使っていますが、こいつの「NERDCommenterToggle」がちょいとばかりお馬鹿で困っています。

たとえば、以下の3行をビジュアルモードで選択するとします。

" Nerd_Commenter の基本設定
let g:NERDCreateDefaultMappings = 0
let NERDSpaceDelims = 1

これに NERDCommenterToggle をかけると以下のようになります。

Nerd_Commenter の基本設定
let g:NERDCreateDefaultMappings = 0
let NERDSpaceDelims = 1

一行目しか見てねぇ!

もちろん下みたいになるのを望んでいました。

" " Nerd_Commenter の基本設定
" let g:NERDCreateDefaultMappings = 0
" let NERDSpaceDelims = 1

設定? それともそもそもできない?

Play 2.0 の Cache API が使うに耐えない

Play 2.0(厳密にはこの記事の執筆時の最新 2.0.3)の Cache API はほんとうに使うに耐えません(Scala での話。Java ではどうだか試してません)。Ehcache を直で扱ったほうがよっぽどよさそうです。

1. キャッシュを削除できない。

キャッシュってそんなに任意で消すようなものでもないと思いますが、それにしても任意に消せないのはどうも不便です。ちなみに以下のようなコードがキャッシュを消すコードとして一部で出回っていますがデタラメです。null 値が永遠にキャッシュされるだけです。

Cache.set("YourCacheKey", null, 0)

2. キャッシュの寿命のデフォルト値を制御できない。

現在の実装では、キャッシュの寿命を指定しないと 0 を指定したことになります。0 を指定すると永遠にキャッシュするという意味になります。設定ファイルなどで調整できません。

3. null 値をキャッシュできない(取り出せない)。

null をキャッシュする意味があるのかというと、たまにあります。非常に長い処理の結果が null だったりしたら null も重要な情報のひとつです。Scala なら None 使えよって話もありますが。

それで、null 値をキャッシュに入れることはできるのです。ところが取り出そうとすると NullPointerException で落ちます。なので、前述のデタラメキャッシュ削除コードを使っていたりすると潜在バグの温床になります。NullPointerException が出ること自体 Play のバグのような気もしますが……。

Play 2.0 の i18n のはじめかた

なにげにハマりやすい Play 2.0 の i18n。日本語最優先の場合は新たにプロジェクトを作成したら、とりあえず以下をやればいいかも。

1. アプリケーションの言語の設定

conf/application.conf 内のapplication.langsの値を”ja-JP”にする。

2. メッセージファイルを作る

conf/messages.ja-JPというファイルを作って内容を以下のようにする。

# デフォルトメッセージ

# --- Constraints
constraint.required=必須
constraint.min=最小値: {0}
constraint.max=最大値: {0}
constraint.minLength=最小長さ: {0}
constraint.maxLength=最大長さ: {0}
constraint.email=Email

# --- Formats
format.date=日付 (''{0}'')
format.numeric=数値

# --- Errors
error.invalid=不正な値
error.required=この欄は必須です
error.number=数値でなければなりません
error.min={0} 以上でなければなりません
error.max={0} 以下でなければなりません
error.minLength=最小長さは {0} です
error.maxLength=最大長さは {0} です
error.email=正しいEmailアドレスでなければなりません
error.pattern={0} の形式でなければなりません

これでとりあえず、標準のエラーメッセージが日本語化されます。あとは、お好みで文言を修正してください。

Scala-Tools のサービスが終了した件

sbt で標準で参照しているリポジトリ、scala-tools のサービスが先日終了したようです。しばらく移行期間として移行先のリポジトリにリダイレクトをしていたのですが、それも終了したとのこと(たまたま今落ちてるだけかもしれないとのこと。でも将来なくなるのは確か)。

そこで scala-tools を参照しているビルドツールは設定変更を余儀なくされています。とりあえず、Play 2.0 は、project/Build.scala を以下のように修正すれば良いようです。

import sbt._
import Keys._
import PlayProject._

object ApplicationBuild extends Build {

  val appName = "myapp"
  val appVersion = "1.0-SNAPSHOT"

  val appDependencies = Seq(
    // Add your project dependencies here,
  )

  val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
    // Add your own project settings here
    // 以下のように移転先リポジトリを指定
    resolvers ++= Seq(
      "sonatype-releases" at "https://oss.sonatype.org/content/repositories/releases/",
    ),
    // 以下のようにこれまでの Scala-Tools リポジトリを見ないようにする
    externalResolvers ~= (_.filter(_.name != "Scala-Tools Maven2 Repository"))
  )

}

Heroku で Play! 製アプリケーションが文字化けしてお困りの方に

ローカルでは上手く行っているのに Heroku にデプロイすると上手くいかないという方に朗報! 先日 Heroku が提供する Scala の BuildPack が更新されまして、これを使用することで文字化けしないようになります。

Heroku にデプロイすると文字化けすると困っているプロジェクト下で以下のコマンドを実行してみてください。

heroku config:add BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-scala.git

これで以降のビルドから文字化けしなくなります。