2010年9月13日月曜日

Acegiプラグインでprincipalをリフレッシュする方法

久々にブログに書くネタが出来たので、備忘録的にメモ。

GrailsのAcegiプラグインを使って認証処理を行ったとき、ログイン中に更新されたユーザ情報はSecurityContextのprincipalとかには更新されなかったりする。
恐らくセッション上に抱えてるユーザ情報はそのままキャッシュに残ってるので、どうにかしてこの情報を更新したいんだけれども、やり方がわからない。
で、google先生に教えを乞うて海外サイトを色々探した結果、こんな記事を発見。

http://blog.lourish.com/2010/03/10/updating-the-logged-in-user-with-acegispring-security-in-grails/

「Refresh the Authentication Token」…おおっ、これだこれ。

方法としては、ようするに認証済みのAuthenticationTokenを作ってSecurityContextにぶち込んでるらしい。…いいのか、これ?
自分の環境でも試してみたけど、とりあえずは動いてる。いい…のか?

まあ、他の方法としてはSecurityConfig.groovyのcacheUsersをfalseにするとかというのもあるらしい。
…まあ、キャッシュ切ればそりゃ勝手に更新されるわな。

2010年6月19日土曜日

Grailsのprojection項目にaliasを設定する

GrailsのCriteria使ってて、「あれ、これ集計項目に対してソートかけたい場合とかどうすんだ?」という問題にひっかかった。
とりあえず調べてみたところ、Hibernateにaliasという属性があって、それを設定するとソートとか出来るようになるらしい。SQLでいうところのMAX(foo) as varみたいなもんか。
じゃあ、そいつをGrailsでやるのはどうするのか? あーでもない、こうでもないと試行錯誤した結果、結論してはどうってことない、こんだけでおkだった。

projection {
max("foo", "bar")
}


ようするにメソッドの最後の引数にエイリアス名指定してやればよかっただけという。
maxでしか試してないけど、多分他のも同じ要領で設定できると思われる。
ドキュメントにもGrails徹底入門にも載ってないから微妙に焦った。…載ってないよね?
まあ、どっかしらで使う機能だし、きっと常識なんだろうけど一応備忘録として残しておく。

2010年5月25日火曜日

flowアクション内でflushスコープの変数にアクセスするとき

flowのアクション中でメッセージを埋め込もうとして、

flash.message = "hogehoge"

とやっておいて、結果のgspで

${flash.message}

とやったところ、何故かメッセージが表示されないという問題にハマる。
小一時間ほど頭を抱えたところ、どうやらセットするときにこうするといけるらしい。

this.flash.message = "hogehoge"

…わかるかい、そんなもん!!

2010年4月27日火曜日

【NovelsM@ster】また春に会いましょう 第4話‐ニコニコ動画(9)
http://www.nicovideo.jp/watch/sm10524770

…何、この胃が痛くなるような展開。
誰だよ、おいしい役回りとか言った奴!!

2010年4月4日日曜日

【NovelsM@ster】また春に会いましょう 第1話‐ニコニコ動画(9)

http://www.nicovideo.jp/watch/sm10237532

何という官能小説。
ってか涼ちんちん、これに限らずなんだけど、色々とおいしいポジションだよね、色んな意味で。
そういや、元々男の娘キャラって自己仮託が云々とかいう話をどっかで聞いた気がする。

こうなることを予見してたのだとすると、やっぱりアイマススタッフの優秀っぷりは半端ないなぁ。

テンプレートを変更。

表示幅が狭すぎるのでテンプレートを変更。
テンプレートの選択の余地がないなぁ…もう少し何かないのか。
かと言って自分でhtmlとかいじるのめんどいしなぁ…。

日本語コメントを入れると何故か(ry、再び。

しばらく鳴りを潜めていた例のエラーがまた出始めた。
ソースファイルのエンコードについては確認済。UTF-8でBOMはなし。
今度はpackage-plugin。テストとかrun-appでは動くくせに、package-pluginしようとするとエラーを吐く。
今回出たエラーはこんな感じ(長いので途中で省略)。

Running script C:\grails-1.2.1\scripts\PackagePlugin_.groovy
Environment set to development
[echo] Compiling plugin descriptor...
startup failed, D:\work\grails\es-common-mail\EsCommonMailGrailsPlugin.groovy: 193: unexpected token: } @ line 193, column 1.
}
^

1 error

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed,
D:\work\flack\grails\es-common-mail\EsCommonMailGrailsPlugin.groovy: 193: unexpected token: } @ line 193, column 1.
}
^

1 error

at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:296)
at org.codehaus.groovy.control.ErrorCollector.addFatalError(ErrorCollector.java:143)
at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:113)
at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:125)
at org.codehaus.groovy.control.SourceUnit.addError(SourceUnit.java:353)
at org.codehaus.groovy.antlr.AntlrParserPlugin.transformCSTIntoAST(AntlrParserPlugin.java:96)
at org.codehaus.groovy.antlr.AntlrParserPlugin.parseCST(AntlrParserPlugin.java:63)
at org.codehaus.groovy.control.SourceUnit.parse(SourceUnit.java:249)
at org.codehaus.groovy.control.CompilationUnit$1.call(CompilationUnit.java:163)
at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:820)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:513)
at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:489)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:466)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:279)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:250)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:189)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

 :
 :
 :

Error executing script PackagePlugin: : Cannot instantiate plugin file
gant.TargetExecutionException: : Cannot instantiate plugin file
at gant.Gant$_dispatch_closure4.doCall(Gant.groovy:331)
at gant.Gant$_dispatch_closure6.doCall(Gant.groovy:334)
at gant.Gant$_dispatch_closure6.doCall(Gant.groovy)
at gant.Gant.withBuildListeners(Gant.groovy:344)
at gant.Gant.this$2$withBuildListeners(Gant.groovy)
at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source)
at gant.Gant.dispatch(Gant.groovy:334)
at gant.Gant.this$2$dispatch(Gant.groovy)
at gant.Gant.invokeMethod(Gant.groovy)
at gant.Gant.processTargets(Gant.groovy:495)
at gant.Gant.processTargets(Gant.groovy:480)
Caused by: : Cannot instantiate plugin file
at org.apache.tools.ant.taskdefs.Exit.execute(Exit.java:142)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at _PluginDependencies_groovy$_run_closure7.doCall(_PluginDependencies_groovy:472)
at _PluginDependencies_groovy$_run_closure7.call(_PluginDependencies_groovy)
at _GrailsPluginDev_groovy$_run_closure1.doCall(_GrailsPluginDev_groovy:78)
at gant.Gant$_dispatch_closure4.doCall(Gant.groovy:324)
... 10 more
Error executing script PackagePlugin: : Cannot instantiate plugin file


unexpected tokenとあるけど、かっこの閉じ忘れとかではない。
今回も日本語のコメント末尾に半角スペースとか入れると再現しなくなる。
対処法としては、コメント末尾に必ず半角スペースを入れる、コメントを//で書かずに/* */で書く(両端に半角SP入れる)、そもそも日本語でコメント書かないといったところか。…うわ、何そのバッドノウハウ。

これ、どうもスクリプト実行周り(自作スクリプトとか、package-pluginとか)でコンパイルやったときにのみ再現してるっぽいんだよなぁ…やっぱバグ?
でも、他でこの現象発生したって話は聞いたことないんだよなぁ…割と致命的な現象っぽいから、本当にバグなら話題に昇っててもおかしくなさげなんだけれども。
そう考えると、バグではなくこっちの設定不備という可能性も。…でも、そんな変なことやってないはずなんだけどなぁ…。