カスタム検索

2009年3月30日月曜日

Grails 1.1 warしてみた

Grails1.1でwarしたものを乗せてみた

tomcat 5.5.23 > ×
tomcat 5.5.25 > ×
GlassFish 2.1 > ○

lib関係かな・・・とりあえずメモ、判明したらまた続報入れます

[追記]
tomcat 6.0.18 > ○

6系も安定板出てしばらく立つしこれを機に6へ移行した方が良さそうですね。
メモ
5.5.x > 6.x migration
http://tomcat.apache.org/migration.html

2009年3月26日木曜日

Grails1.x > Grails1.1への移行

Grails 1.0.5 のアプリを Grails1.1 へ移行した時に起きた問題。メモメモ。

とりあえずざっくり grails update をしてみる。
SVNの差分で見てみるとコマンドで変更される内容はたいしてないみたい。
application.propertiesに plugins.hibernate=1.1 が追加されてる、この辺の話しはここで詳しくのっている。


・pluginを読み込まない
pluginの置き場所が変わったため、upgradeしただけでは既存のpluginを読み込んでくれない。
これは 1.1 に追加された BuildConifg.groovy というファイルを書いてやる必要がある。

grails-app/conf/BuildConfig.groovy を作成し、以下のような感じで設定してやる。

grails.plugin.location."pluginName"="plugins/pluginName-version"


ダブルクォートは重要、groovyなんで無いと引き算扱いになってまうよ :)
とりあえず移行ならこれでいいけど、pluginの管理は別リポジトリで自動バージョンアップとか素敵な感じになってるので将来的にはそっちに移行した方が良い。


・xercesImpl.jar が無くなった。
今まではGrails本体のlibフォルダにXercesが入っていたのですがこれがなくなりました。
なのでXercesを使ってたアプリや、Xercesを使っているpluginをいれているとNoClassDefFoundErrorになります。
以前のバージョンからコピーするか、本家から落としてきてアプリケーションの lib フォルダにいれてやりましょう。

・起動時にエラーが出る

以下のようなエラー
ERROR commons.DefaultGrailsControllerClass - The allowedMethods property in ほにゃららController should be declared static. The non static version is supported for now but has been deprecated and may not work in future versions of Grails.

allowedMethods が def から static になったからこのままだと近いうちに使えんくなるよ、と。
単純に def を static にしたら出なくなりました。



とりあえずこれで動作しました。

2009年3月19日木曜日

GrailsCodeReading in 名古屋!

というわけで参加してきました。

お題は「Grails-1.1を斬る!Grails-1.1からのチーム開発」
1.0シリーズ→1.1で結構仕組みが変わっています。
毎度恒例の速度アップやら、GORM(GrailsでのORマッピング)のかゆい所に手が届くようになったとか、正常進化ですね。

もうなんかすげーいっぱい変更点あるんで、ちょっと気になった所だけピックアップ

・<g:form> にuseToken="true" をつけて、受け側の action で以下のように拾える


def save = {
withFormat {
//保存処理
}.invalidToken {
render "二度押し禁止!"
}
}


なかなかいい感じ。だけど画面上には invalidToken 側の処理しか返らないので、スルーして正しい結果を表示ってのは自前実装しないといけない。

・work_dirを選べるようになった
今更感もあるけど、svn とか使ってるとプロジェクトフォルダを trunk とかにしてると、work_dirがかぶってしまう問題があった。
( ~/.grails/{version}/projects/{projectFolder} に固定されていた)
かぶると class とかが入り乱れてまともに動かない状態に・・・
これを BuildConfig.groovy ファイルで好きな場所を指定出来るようになったので、安心して実行出来るようになりました。

・別リポジトリの対応
plugin系で本家のリポジトリ以外に、自前で指定したリポジトリを追加できます。
これを使うと、公式にあげれない/ない plugin を管理出来ます。
さらに1.1では自動インストール/アンインストールがあるので、更新したよーとか最新版いれてーとかしなくても勝手にやってくれる!

2009年3月13日金曜日

FileMakerへのJDBC接続

FileMakerはODBCとJDBCで外部からデータを操作出来るらしい。

JDBCいけるならGrailsでFIleMakerPluginとか作れるんじゃね?という事で接続してみるテスト

まずはJDBCドライバを探す・・・ってここから情報すくなっ
なんか途中のバージョン(7ぐらい?)からSequeLinkDriverで接続するようになったらしい

今回のターゲットは9なのでそれ用のドライバを探す・・・
あ、あったあった、てか公式にあった orz
「FileMaker Pro 9 評価版用 FileMaker ODBC & FileMaker JDBC ドライバ(Mac OS X)」ってのをダウンロード

その中にインストーラー(sljcinstaller.jar)があるのでそれを起動してインストールしていく・・・
インストールした先にはいっぱいファイルがあるけど、とりあえず目的のファイルは driver/lib/sljc.jar

で、なんやかんや試してみるけど綱がらない・・・
どうやらFileMakerProでは localhost からしか接続出来ないらしい :(
MacからODBCではうまくいかないしセットアップも大変になるので、同マシンで動かして外からクエリうけて実行出来るみたいなのでいいや、と思いつつ設定。

FileMaker起動して、JDBC/ODBCの共有をONにして、2399ポートがあいてるのを確認。

そしたらJDBCドライバをロードして、
Class.forName("com.ddtek.jdbc.sequelink.SequeLinkDriver")

Connectionで接続キター!
Connection con = DriverManager.getConnection("jdbc:sequelink://localhost:2399","user","pass")

2009年3月11日水曜日

Grails Flex Pluginの罠

FlexPluginを使うとサービスでのBlazeDSがめっさ簡単になるんで重宝していたのですが、今日はこいつにやられました。

run-app しているときはシレっと動いてたのですが、warしてGlassFishにのっけてみたら web.xml が DTD にはじかれて登録出来ない・・・
で、調べていったら FlexGrailsPlugin.groovy で注入している所で servlet にたいして display-name を設定しているのが問題っぽい。
これをはずして再度 war したら何事もなく動きました。

余談ですが、GlassFishでWebアプリケーションを配備する時は war のサイズがあんまり大きいとうまくいかないみたい。
なんらかの方法でサーバへファイルをアップし、「Application Server からアクセス可能なローカルのパッケージファイルまたはディレクトリ 」を使うのが良いみたい。

grailsアプリを使う上では glassfish v3より glassfish v2.1の方が早くて安定している気がする・・・
Cubbyでもv2のが相性が良いみたい。 v3はもうちょっと様子見かなぁ

2009年3月7日土曜日

GrailsとRESTのただならぬ事情

GrailsでRESTfulなWebアプリを作るのは凄く簡単です。

URLMappingで以下のように振分けが出来ます。

"/rest/$id?"(controller:"rest"){
action = [GET:"show", PUT:"update", DELETE:"delete", POST:"save"]
}


これで /rest に来たアクセスはメソッドによりアクションへ振分けされます。
GET(普通にブラウザで開いたり)した場合は show アクションへ、POST(フォーム送信とか)なら save アクションへ飛ばされます。

詳しくはIBMの記事を参照下さい。

ではGrailsでRESTfulなサービスを使用するには、というとデフォではそのような機能はありません。(多分)
ここで前に使ったHTTPBuilderを使おうと思ったのですが、こいつがGrailsと組み合わせてしまうと思うように動かないメソッドがあったりします・・・
http.request(GET,TEXT) { req -> }  とか・・・ responseが正常に取得出来ません :(

HTTPBuilderは中でApache HttpClientを使ってるだけなんで、こいつを直接使う事にしました。


def client = new HttpClient()
def getMethod = new GetMethod("http://localhost:8080/restProject/rest/1")
getMethod.setRequestHeader("Accept", "text/json")
client.executeMethod(getMethod)
def result=getMethod.getResponseBodyAsString().toString()


これでGETを実行し、結果をStringで受け取れます。
それぞれ PostMethod、PutMethod、DeleteMethodが用意されているのでそれらに置き換えれば他のメソッドを実行出来ます。

RESTってHTTPプロトコルの標準な機能なのでクライアントに特別なライブラリ等を追加する必要がない反面、WSDLのようにメソッドの仕様や型の制御などが作り手次第になってしまうのがちょっと難点な気がします。

でもWSDLと違って、認証等はacegi pluginいれてbasic認証使えば比較的セキュアかつ統合された作りが簡単に出来るのは良いですね!

2009年3月2日月曜日

GrailsでMySQLに接続

特に書くほどの事でも無いですが一応メモ・・・

MySQLへの接続は Connector/J で行いますんで、MySQLのサイトから接続するDBバージョンにあわせたConnector/Jをダウンロードします。
今回は 5.1 なので mysql-connector-java-5.1.7.tar.gz をダウンロードしました。
こいつを解凍して mysql-connector-java-5.1.7-bin.jar を grails の lib フォルダに入れます。

まずはDB側の設定。my.cnf に以下を入れておく。

default-character-set=utf8

MySQLAdministrator の設定画面から行くと↓のへん


DBを先に作っておき(今回はdbnameという名称で仮定)、 conf/DataSource.groovy の設定を

pooled = true
dialect = org.hibernate.dialect.MySQLDialect.class
driverClassName = "org.gjt.mm.mysql.Driver"
username = "root"
password = ""
dbCreate = "update"
url = "jdbc:mysql://localhost/dbname?useUnicode=true&characterEncoding=UTF8"

以上のようにして起動すればめでたしめでたし。