Sunday, December 31, 2006

Grails Tips : run-app時に大量のエラーが・・

3回目にして書くことが無くなってきたので、
(まだいっぱいあるだろ!)
今回は人によっては意外と便利なエラー内容を知る方法を1つ。

EclipseでGroovy Pluginを使って開発している人には
あまり関係ないかもしれないですが、
テキストエディタ(自分はTextMate使ってる)などで開発をしている人は、
コード書いてrun-appしたあとに、意味不明の大量のエラーが出て
時間かけてよくコードを確認していくと、
ただのシンタックスエラーだった・・・なんてことが。。
そんなときは、
grails shell
または、
grails console
を実行すると、内容にもよるが意外と分かりやすくエラー内容を教えてくれます。

ちなみに、開発中は、いきなりrun-appしても良いが、
grails console 等で、DB登録テストをしてみるとかの癖をつけておくと、
うっかりな文法ミスを発見できてオススメです。



そういえば、Grails本、The Definitive Guide to Grailsの
誤字等紹介するページができてました。
購入した方はご参考に^^
http://docs.codehaus.org/display/GRAILS/Errata+in+The+Definitive+Guide+to+Grails


Labels: ,

Saturday, December 30, 2006

Grails Tips : GrailsとSitemeshとマルチバイト文字問題

最近、Grailsを色々な人に説明することが多くなりましたが、
やはり最初に心配するのが、日本語どうよ!?ちゃんと使えるの?
答えは・・・も・・問題ないです。UTF-8なので・・(ジャッカンジシンナクコタエル)
ユーザの環境によっては・・ってのもあるし。

確実にUTF-8を使うためには、
必ずプログラムは文字コード "UTF-8"で作業しましょう。
Jspなどで、MS921(SJIS)等で編集して、
"UTF-8"で表示させる等の方法で開発することが有ると思いますが
(ぇ、無い?・・)
必ず"UTF-8"で開発すれば大抵大丈夫だと思います。
UTF-8で保存しているにも関わらず、文字化けしたよ・・・と言う方。
以下を参照。
Javaランタイムのfile.encodingを"UTF-8"に!
0.4-SNAPSHOTでWindowsの場合:
{GRAILS_HOME}¥bin¥startGrails.bat ファイルの
set JAVA_OPTS=%JAVA_OPTS% -Dgroovy.starter.conf="%STARTER_CONF%"
あたりに、
set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding="UTF-8"
を追加。
Unix系、Mac OSXの場合:
{GRAILS_HOME}/bin/startGrails ファイルの
最初の辺りならどこでも良いので、以下を追加。
JAVA_OPTS="-Dfile.encoding=utf-8"

自分の環境では、この方法で文字化けは一切起きていません。

しかし、文字が最後だけ切れてしまう現象が起きることが有ります。
この問題は、0.3のころJiraにもIssueがあがっていて直っているらしいのですが、
やはり、問題が起きるときがあります。(自分の環境だけかも)
この問題は、Sitemeshを最新版(2.3またはSNAPSHOT版)に入れかえることで解消できます。

Sitemesh問題の詳しい情報は以下のリンク参照
http://jira.opensymphony.com/browse/SIM-157
Multi-byte characters result in page truncation if page is mapped to a decorator that isn't found (eg "none")
起きる現象は全くこの内容通りです。
現在Grailsで使用しているSitemeshのバージョンは、sitemesh-2.2.1です。
一応、最近GrailsのJiraにUpgrade to Sitemesh 2.3が増えていたので近々更新されるでしょう。

なんだか長いこと自分でビルドしたSitemeshを使ってましたが、
いつの間にか、Sitemesh-2.3がリリースになっていたのですね。
以下から入手可能
https://sitemesh.dev.java.net/servlets/ProjectDocumentList?folderID=6239
リリースはしていたけど、発表していなかったとか・・・
http://www.nabble.com/Re%3A-Progress-on-Sitemesh--p7757635.html


一応入れかえ方法
{GRAILS_HOME}/lib/sitemesh-2.2.1.jar を削除。
sitemesh-2.3.jar を {GRAILS_HOME}/lib/ ディレクトリに追加
既存のプロジェクトは、必ず grails clean をしましょう。

Labels: ,

Tuesday, December 26, 2006

Grails Tips 一つのドメインクラスをManyToManyする方法


このブログを見ている人も増えつつあるので、
Tipsなんて物を書いてみようと思います。
本日の内容は、「一つのドメインクラスをManyToManyする方法」です。
いきなり、そこかよ・・と言われそうですが、いきなりそこからです。
普通は、簡単なことから始めた方が良いのかもしれませんが、
それだとTipsでは無くなるような気がして・・・

というわけで、開始です。

「一つのドメインクラスをManyToManyする方法」


例えば・・
Book は複数の Author を持つ
Author は複数の Book を持つ
Author は複数の Author を持つ
この場合、Authorが自分自身のAuthorを複数持つことになります。
Grailsデフォルトで、static hasMany = [ books : Book ,authors : Author ] と記述しても、動作しません。
さぁ、困った・・

そこで、hibernate.cfg.xmlと、Author.hbm.xmlの出番です。
Grailsでは、直接Hibernateをつかったドメインクラスのマッピングを行うことも可能です。
詳しくは、こちら

では、上記のリレーションを作成してみましょう。
まずは、ドメインクラスを用意します。

ドメインクラス:Book {grails-project}/grails-app/domain/Book.groovy

class Book {
static hasMany = [ authors : Author ]
static belongsTo = Author
String title

static constraints = {
}
}

ドメインクラス:Author {grails-project}/grails-app/domain/Author.groovy

class Author {
static hasMany = [ books : Book ,authors : Author ] // AuthorをhasManyする
def optionals = [ "authors","books" ]
String name

static constraints = {
}
}


次に、hibernate関連のファイルを作成します。
全て、 {grails-project}/hibernate/ に作成。
hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<mapping resource="Book.hbm.xml"/>
<mapping resource="Author.hbm.xml"/>
</session-factory>

</hibernate-configuration>

Author.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">


<hibernate-mapping>
<class name="Author" table="author">
<id name="id" column="id" unsaved-value="null">

<generator class="sequence">
<param name="sequence">author_author_id_seq</param>
</generator>
</id>

<version name="version" column="version" type="java.lang.Long"/>
<property name="name" column="name" />

<set name="books" table="author_book" lazy="true" inverse="false">

<key>
<column name="author_id" not-null="true"/>
</key>

<many-to-many class="Book">
<column name="book_id" not-null="true"/>
</many-to-many>

</set>
<set name="authors" table="author_author" lazy="true" inverse="false">

<key>
<column name="author_id" not-null="true"/>
</key>

<many-to-many class="Author">
<column name="author_m_id" not-null="true"/>
</many-to-many>

</set>
</class>
</hibernate-mapping>


Book.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class name="Book" table="book">
<id name="id" column="id" unsaved-value="null">

<generator class="sequence">
<param name="sequence">book_book_id_seq</param>
</generator>
</id>

<version name="version" column="version" type="java.lang.Long"/>
<property name="title" column="title"/>

<set name="authors" table="author_book" lazy="true" inverse="true">

<key>
<column name="book_id" not-null="true"/>
</key>

<many-to-many class="Author">
<column name="author_id" not-null="true"/>
</many-to-many>

</set>
</class>
</hibernate-mapping>


データ登録サンプル

def a1 = new Author(name:"one")
a1.save()
def a2 = new Author(name:"two")
a2.save()
def a3 = new Author(name:"tree")
a3.save()
def b = new Book(title:"wow")
b.add(to:"authors",a3)
b.save()

a1.add(to:"books",b)
a1.add(to:"authors",a2)
a1.add(to:"authors",a3)
a1.save()


.hbm.xmlを書いたドメインクラスと書いてないドメインクラスは混在もできるので、
必要に応じて.hbm.xmlを活用すると結構複雑なデータベース構造も構築可能のようです。



PS
さすが、欧州発のフレームワーク、クリスマス休暇はメーリングリストがおとなしいです。。

Labels: ,

Friday, December 22, 2006

Grails Plugins [Acegi on Grails Plugin]

Acegi on Grails Plugin
まだ作り途中ですが、何となく公開しておきます。
以下のURLに説明書いてあります。(英語版)
http://sky.geocities.jp/acegiongrails/

  • ユーザ管理インターフェイスはまだありません。
  • タグライブラリも含まれません。
  • rememberMeProcessingFilterが使えません。
  • grails run-appを2回くらい実行しないと動かない・・


The Definitive Guide to Grails 届きました:-)

Labels:

Wednesday, December 13, 2006

Grails Plugins 作成メモ (1)

Grails Plugins開発メモ
開発の流れ:
  1. grails create-plugin プラグイン名 で、プラグインプロジェクト作成
  2. 中身を開発:説明省略
  3. grails distribute-plugin で、プラグインのZipファイルが出来上がる。
  4. 他のディレクトリの grails create-app で、プロジェクト作成。
  5. grails install-plugin Pluginプロジェクトのパス/grails-web-app-root-key-0.1.zip で、インストール。
  6. grails run-app で起動して確認。
他に良い方法有るのかも。


感想:
  • css,JS程度追加するプラグインなどはかなり簡単に作成可能。
  • Springへのbean追加などは、かなりハード。
  • Pluginで提供された、viewファイルは、プロジェクト側で同じ名称でファイルを作成することによって、オーバーライド出来る(実行時に上書きされる)
  • Pluginは、プロジェクト本体には入り込まない+書き換えができないので、ブート時の基本定義などは説明が必要。
  • デバッグしにくい・・・方法が有るのかも。※GroovyTestCaseでのテストは結構使った。
  • カスタムタグ、サービスを作成=>便利ならプラグインにする=>公開する=>みんなウマー

とりあえず作ってみたプラグイン(まだ未公開ですが・):
  • Acegi on Grails Plugin - 基本的には、ジョー氏待ちだが、作ってしまった・・・
  • yui-ext Plugin - yui-extのJSファイル群追加と、サンプルページ+サンプルレイアウト。
  • web-app-root-key Plugin
  • Grails 0.4からは、Spring2.0のため、その仕様により、複数のアプリケーションを1つのアプリケーションサーバで起動するには、context-paramにwebAppRootKeyパラメータが必要。それを補うためだけのプラグイン

Labels:

Tuesday, December 05, 2006

Groovy RC-1 がリリース


Groovy RC-1 がリリースされました。
リリース情報
RC-1はGroovyプロジェクトで最も重要なマイルストーンだったらしいです。
さらに、RC-1のリリースは、すぐに1.0がリリースされることを意味するらしいです。
さらにさらに、今月末には、最終版をリリースする計画だとか^^
詳しい実装情報は JIRA を参照。

Labels: