Monday, April 30, 2007

Grails 0.5 リリースノート (翻訳)

多分、寝てる間にリリースされそうなので、先にリリースノート翻訳アップしておきます。
結構ザックリな翻訳ですが・・・。
公式には、4/30 (ロンドン時間)にリリース予定です。



Grails 0.5 リリースノート (翻訳)



Grails開発チームは、もう一つのマイルストーンに到達し、 Webアプリケーション開発フレームワーク Grails0.5のリリースしました。

Grailsは、JavaとGroovyで構築され、JEE分野で最も使用されている、
Spring、Hibernate、SiteMesh等のAPIを使用した、ダイナミックWebアプリケーションフレームワークです。

Grailsは、JavaとGroovy開発者に、既存の知識、長年Java開発者が利用してきた実績有る信頼されたAPIを使用した、
規約によるラピッド開発の楽しさをもたらします。

今回の開発は2月後半の0.4.2のリリースより190以上の課題が有り激しかったでが、
このリリースでは、新任のチームメンバーとユーザーと重要な機能強化から刺激的な貢献を受けました。

チームメンバー、パッチ投稿者、ユーザに感謝します。
多くの努力がこのリリースに反映されていますので、皆さんがGrailsの最新版を楽しんでいただける事を期待しています。

■新機能
・カスタムURLマッピング
・コマンドオブジェクト / フォームバリデーション
・GROMでのListとMapのサポート
・ドメインクラスでの構成コンポーネントのサポート (Hibernate "components")
・Base64コーデック
・Ivyでの依存関係の管理
・プロジェクトメタデータとバージョニングサポート
・スクリプトイベントフック
・全てのアーティファクトオブジェクトへのログの注入
・プラグインで使用できる、アーティファクトAPI
■改善点
・アーティファクト再読込の改善
・GORMのリレーショナル管理メソッドの改善
・バリデーション・カスケード
・Book.getAll(1,2,3)での複数のオブジェクトの取り出し。
・find()での名前付きのHQLパラメータ使用
・古いconstraintsの除去
・Performance improvements (40-50% faster)
・パフォーマンス改善(40-50%向上)
・タグリブの最適化
・スカッフォールドの改善(カラムのソート、大量結果のページネート、他)
・I18N改善(messages_ja.properties(日本語)も追加された)
・GSPビューロードのオーバーホール
・Grailsコアコードのテスト範囲が拡大
・多くのバグ修正


新機能 詳細


カスタムURLマッピング


URLマッピングは、コントローラ/アクションの形式のみでは無く、
ほぼ自由に定義できるようになりました。
定義例

class MyUrlMappings {
static mappings = {
"/product/$id" {
controller = "product"
action = "show
}
"/$id/$year/$month/$day" {
controller = "blog"
action = "show"
constraints {
year(matches:/\d{4}/)
month(matches:/\d{2}/)
day(matches:/\d{2}/)
}
}
}
}

ドキュメント(英)

コマンドオブジェクト / フォームバリデーション


Grailsではドメインクラスで制約条件を決めていました。しかし、フォーム又、リクエストパラメータがドメインクラスに一致するとは限りません。
0.5からは、リクエストが実行されたら、ドメインクラスと同じ制約条件で書かれたコマンドオブジェクトに、
Grailsによって自動的に生成・変換されて、バリデーションをかける事が可能になりました。

使用例

class LoginController {
def login = { LoginCommand cmd ->
if(cmd.hasErrors()) {
redirect(action:'loginForm')
}
else {
// do something else
}
}
}

class LoginCommand {
String username
String password
static constraints = {
username(blank:false, minSize:6)
password(blank:false, minSize:6)
}
}

ドキュメント(英)

GROMでのListとMapのサポート


GORM has been enhanced to support lists of domain objects in a relationship, as opposed to the default Set behaviour, providing ordered lists.
GORMでのリレーション時のドメインクラスでのリストサポートを強化しました。デフォルトのSetのふるまいと対照的に、Listを提供します。

// オブジェクトリストのサポート
class Author {
List books
static hasMany = [books:Book]
}

author.books[0] // 最初のbookを取得例。

ドメイン型では無い型として、Mapのサポート:

// Map のサポート
class Author {
Map books // ISBN:book名のMap
}

def a = new Author()
a.books = ["1590597583":"Grails Book"]
a.save()

通常型キーとドメインオブジェクトのマップも可能;

// ドメインクラスのマップを作成したい場合以下のようにできます。
class Book {
Map authors
static hasMany = [authors:Author]
}

def a = new Author(name:"Stephen King")

def book = new Book()
book.authors = [stephen:a]
book.save()

ドキュメント(英)

ドメインクラスでの構成コンポーネントのサポート (Hibernate "components")


GORMでは、データベースにクラスの階層に対してのテーブルマッピングを使用しています。
これはリレーションされたクラスは別のテーブルに収納することを意味します。
これからは、Hibernateの構成コンポーネントの仕組みを使った、”embedded”宣言を使って、
通常リレーションと見なされるオブジェクトのデータを埋め込むことができるようになります。

class Address {
String street
// ...
String country
}

class Person {
String firstName
String lastName

Address homeAddress
Address workAddress

static embedded = ['homeAddress', 'workAddress']
}

”embedded”に、プロパティー名のリストを定義すると、リレーションの代わりにテーブルに直に書き込まれます。
ドキュメント(英)

Base64コーデック


0.4で実装された、かなり使えるコーデックに、Base64コーデックが追加されました。

Your registration code is: user.registrationCode.encodeAsBase64()


ドキュメント(英)

Ivyでの依存関係の管理


プロジェクト内でIvyでの依存関係の管理が追加されました。
以下の2つのコマンドでおこなえます。
このコマンドをプロジェクトで1回実行
# grails install-ivy
そして、以下でプロジェクトの依存を更新
# grails get-dependencies

プロジェクトメタデータとバージョニングサポート


必要なGrailsのバージョンが設定されることによって、違うGrailsのバージョンを間違えて実行できなくしたり、
自分のアプリケーションのバージョン管理等に使用できます。
warファイルを書き出すときに、バージョン番号が付加されるようになります。
Ex. SomeApp-1.0,war
アプリケーション名の変更も可能です。

ドキュメント(英)

スクリプトイベントフック


ターゲットスクリプトでイベントフックが可能になりました。

全てのアーティファクトオブジェクトへのログの注入


0.4では、コントローラに”log”を追加しました。0.5からは全てのアーティファクトオブジェクトに追加されます。
ドキュメント(英)

プラグインで使用できる、アーティファクトAPI


アーティファクトの実装がオーバーホールされ、プラグインで自信で特別なアーティファクトの実装が可能になり、
他のアーティファクトと同じように操作ができるようになりました。
ドキュメント(英)

改善点 詳細(説明が必要そうな物だけ・・)


アーティファクト再読込の改善


ドメインオブジェクト、トランザクショナルサービス、Quarts Jobsのリロードのサポート

GORMのリレーショナル管理メソッドの改善


0.4でのaddXXXXメソッドの見直しをおこない変更しました。addXXXXは先々無くなります。
0.5からは、addToXXXX と、追加でremoveFromXXXXが実装されました。

def a = new Author(name:"Stephen King")
.addToBooks(title:"IT")
.addToBooks(title:"The Stand")
.save()

author.removeFromBooks(myBook)

Labels:

Friday, April 27, 2007

Grails 0.5 Release Candidate 2

Grails 0.5 RC2が発表されました。
来週リリースされる、0.5に向けての最終RCリリースです。
大きな問題を発見したら、報告してあげましょう!

0.3,0.4の時の教訓がいかされてるようで、
今回は慎重に、RCで問題点を洗い出しているので、完成度はたかそうです。

さぁ、テストしよっと・

Labels:

Wednesday, April 25, 2007

Grails 0.5 Release Candidate 1

Grails 0.5 RC1が発表されました。
来週、0.5がリリースになるようです。

色々更新されていますので、
古いバージョンで構築した、アプリケーションには、
以下のコマンドで更新が必要です。
(必ずバックアップしてから実行しましょう。)

# grails clean
# grails upgrade



現在出ている問題?:render(text:"")が効かない?。createLinkでparamsの値を落とす。(等がメール報告にもあがってますね・)

Labels:

Tuesday, April 17, 2007

Grails Tips : Grails Artefacts Class をいじる

ドメインクラス関連に引き続き、どうせなら他のクラスもいじってみましょう。
Grailsの、"規約によるコーディング"に使われる「Artefacts」(米語スペルだとArtifacts)、
ドキュメント翻訳時は、なんと翻訳して良いのかわからず、
他の技術系の資料を参考にして「成果物」と訳しました。
今回ここでは、カタカナで「アーティファクト」と書きます。

その「Artefacts」関係が、Grails 0.5 から、GrailsApplicationが大幅改良されて、
結構おもしろそう。(おかげでPlugin関連一部作り直しです。)
というわけで、よく使うであろう項目をまとめてみます。

GrailsApplicationは、コントローラ、
タグリブ、GSP内などで、grailsApplication と記述して呼びだします。
class DashboardController{
def index = {
println grailsApplication
}
}


全アーティファクトクラスリストを返す
Grailsが起動している際に、使用されているアーティファクトClassリストを返す。
grailsApplication.allArtefacts.each{
println it
}




アーティファクト以外
grailsApplication.allClasses.each{
//falseのみをアウトプット
if(!grailsApplication.isArtefact(it)) println it
}


アーティファクトクラスを名前で取得
前回と同じ内容(0.5版)
def domainCls = grailsApplication.getDomainClass("Book")
//又は、
def domainCls = grailsApplication.getArtefact("Domain","Book")


各アーティファクトクラスのリストを返す
ドメインクラスを名指しで取得する場合と同じように、
grailsApplication.getArtefact("Domain","Book")
と書いて、"Domain"の部分を各アーティファクト名に変更することで、
他のアーティファクトクラスも取得できます。

・ Domain - ドメインクラス
・ Controller - コントローラクラス
・ TagLib - タグリブクラス
・ Service - サービスクラス
・ Codec - コーデック
・ Task - タスク
・ DataSource - データソース
・ UrlMappings - URLマッピング
・ Bootstrap - ブートストラップ

以下は、ドメインクラスを取得する例:
def domainsInfo = grailsApplication.getArtefactInfo("Domain")
domainsInfo.getClassesByName().each{
println "クラス名:${it.key} クラス:${it.value}"
}


GSPで、ザックリとアーティファクトリストを出すサンプル:
<%
def artefactsMap = ["Domain":"ドメインクラス",
"Controller":"コントローラクラス",
"TagLib":"タグリブクラス",
"Service":"サービスクラス",
"Codec":"コーデック",
"Task":"タスク",
"DataSource":"データソース",
"UrlMappings":"URLマッピング",
"Bootstrap":"ブートストラップ"]
%>
<g:each var="art" in="${artefactsMap}">
<div id="aset">
<h1>${art.key} : ${art.value}</h1>
<%
def info = grailsApplication.getArtefactInfo(art.key)
def cls = info.getClassesByName()
%>
<ul>
<g:each in="${cls}">
<li>${it}</li>
</g:each>
</ul>
</div>
</g:each>

これと、各アーティファクトクラスの情報を色々取得してまとめると、
概要仕様書( GrailsDocs )っぽいのもができそうですね。

作ってみようかな?

Labels: ,

Monday, April 16, 2007

Ext-1.0 リリース!

本日は、連続投稿です。

Ext-1.0 (extjs) がリリースになりました。
説明するよりは、見てもらった方が:http://extjs.com/
Yui-Extのころから、かなり愛用しています。
社内用に、Grailsプラグインも作って活用してます。
( 分かる人には分かる話:Sigiにソースを渡したら、彼の元で進化してるっぽい。)
最近オススメのJavascriptライブラリーです。

LGPLであり、Commercialライセンスもあるというライセンス形式。
Yui-Extのころは、ドネートだったのですが、色々あるようで・・・
(詳しくは、公式フォーラムを探すと色々濃い話が・・)

まあ、賛否両論ありそうですが、良い物は良いってことで・・

ちなみに、日本語翻訳のlangファイルを寄贈しましたので、微妙に日本語対応しています。
ぁぁ、Grailsのmessages_ja.propertiesも翻訳しましたが、内容が微妙です、
訳した時期が同じなので、両方とも微妙な翻訳になっています。
Extドキュメントは、翻訳しません。(Groovyも、Grailsも、終わってないので・・)

Labels: ,

Grails Skinning Challenge!

Grails eXchange 2007 の 10/17 - 10/19 再出発を記念して、
Skills Matterが、Grailsスキニング チャレンジを開催するらしいです。
カッコイ見た目のスキン、また、プラグインを使った
スカッフォールドで色々な機能を持った、スキンなどを募集してます。
(翻訳合ってるのか?・・)
まあ、とにかく、Extを使った見た目がかなりメーリングリストで盛り上がった結果、
こうなったとです。

優勝賞品は、 Grails eXchange 2007 のチケット1枚。
準優勝は、
Dierk Koenig著書の"Groovy in Action" また、
Graeme Rocher著書の"The Definitive Guide to Grails"
(わぉ、両方もってるさ・・・)

応募締め切りは、2007/5/1
結果発表は、2007/5/7 JavaOneにて!

応募方法は、作ったスキンをメールで、Graeme Rocherに送ってくださいとのこと、
graeme.rocher _at_ skillsmatter.com

Labels:

Sunday, April 15, 2007

Grails Tips : ドメインクラスを奥までさわる

久しぶりの更新!!!
そういえば、Grails eXchange 2007の日程が変わりました。
http://www.grails-exchange.com/
色々あって、10月に移動。理由書いて良いのか?わからないので知りたい人は、メールください。


本日の内容「ドメインクラスを奥までさわる」
Java Doc見ればわかるよと言われれば、それまでですが・・・

ドメインクラスを名指しで取り出す

def domainCls = grailsApplication.getDomainClass("Book")
//又は、(0.5から対応)
def domainCls = grailsApplication.getArtefact("Domain","Book")


ドメインクラスから色々取得
ドメインクラスを取り出したら:

println domainCls.name // クラス名
println domainCls.propertyName // 頭も小文字の名前 Book -> book
println domainCls.clazz.list() // MetaMethods実行 clazz.findAll* 等
println domainCls.getRelatedClassType("projects")//リレークラスの型取得
//メソッド一覧
domainCls.class.methods.each{
println it.name
}


プロパティーリスト取得
そして、constraints 内容順にソート

def comparator = org.codehaus.groovy.grails.scaffolding.DomainClassPropertyComparator.class
def props = domainCls.properties.findAll { it.name != 'version' }
Collections.sort(props, comparator.constructors[0].newInstance([domainCls] as Object[]))
println props


プロパティーリストから、色々取得

props.each{prop->
println "------"
println "getName ${prop.name}"
println "getType ${prop.type} ${prop.type.name}"
println "getNaturalName ${prop.naturalName}" // fieldNameOne => Field Name One
println "getDomainClass ${prop.domainClass}"
println "getFieldName ${prop.fieldName}"

println "isOneToMany ${prop.isOneToMany()}"
println "isManyToOne ${prop.isManyToOne()}"
println "isBidirectional ${prop.isBidirectional()}"
println "isAssociation ${prop.isAssociation()}"
println "isPersistent ${prop.isPersistent()}"
println "isManyToMany ${prop.isManyToMany()}"
println "isOwningSide ${prop.isOwningSide()}"
println "isOptional ${prop.isOptional()}"
println "isOneToOne ${prop.isOneToOne()}"
println "isCircular ${prop.isCircular()}"

println "getReferencedPropertyType ${prop.referencedPropertyType}"
println "getReferencedDomainClass ${prop.referencedDomainClass}"
println "getReferencedPropertyName ${prop.referencedPropertyName}"
println "getFetchMode ${prop.getFetchMode()}"
println "getOtherSide ${prop.getOtherSide()}"
println "getTypePropertyName ${prop.name}"

println "isInherited ${prop.isInherited()}"
println "isIdentity ${prop.isIdentity()}"
}



こんな感じで、ドメインクラスの色々を紹介しました。
これだけできると、ダイナミックに色々操作する仕組みが結構想像できます。

Labels: ,