Grails 1.4.0 2.0 の話 -更新メモ- 2011-07-29@jggug @tyama 途中経過観察 1
Grails 1.4.0 2.0 の話
-更新メモ-
2011-07-29@jggug
@tyama
途中経過観察
1
Who?山本です。
@tyama
はてな id:mottsnite ←ブログここ。
2
経歴・仕事• 仕事
• newcast inc. ってデザイン会社で、印刷系パッケージソフト開発。あと経営。
• 主に、Grails,Groovy,Java,Obj-C,人材等を扱います。
• Grailsの経歴
• 2006/7 旧Grailsドキュメント翻訳。
• 2006/12 Acegiプラグインを公開。
• 2007/10 ”Grails eXchange 2007”に、スピーカーとして参加。
• 2008/8 Grails徹底入門 共著。
• 2006 - 201X Grails日本語リリースノートを即配信を趣味としてる。
3
もう7月も終わりますが、前半
はイベントがいっぱいでした。
4
7月前半のイベント• 7/1 富士山 山開き
• 7/2 キャラ・スーンの誕生日(ZZ)
ミーア・キャンベルの誕生日(SEED DESTINY)
• 7/3 2005年にGrails最初のコミットされた日!
• 7/4 アメリカ独立記念日!
• 7/5 @tyama 誕生日!
• 7/6「プログラミングGroovy」発売!
• 7/7 七夕!
• 7/8 質屋の日!5
プログラミングGroovy!発売!•プログラミングGROOVY [単
行本(ソフトカバー)]
•価格: ¥3,360
6
BTW,
Do you know Grails?
7
8
Grails聖書DGGより、
Grailsは、
プラットフォームです
Grailsを追え。
9
Grails萌え。
10
Grails萌えを追え。• ある程度の。
• 最新のWeb開発アーキテクチャを知る事ができる。
• 最先端・流行のJava開発を知る事ができる。
• Grailsでの開発
• 開発効率の追求。(究極なDRY)
• シンプルかつ柔軟。(DSL)
• DDD。
• ただし!
• 柔軟過ぎて質の悪いアプリケーションも構築できる。
• 意外と作り手によっては、おかしな物になる。11
Grails 1.4.0.M1
12
1.4.0 !? to 2.0 !!!1.4にしておくには、もったいないぐらい内容が良いから2.0になった!
13
Grails 2.0.M1
14
まだM1です!
変わる可能性もあるので、わかる範囲でお伝えします。
動く動かないの前に、自分の環境も確かめましょう。
15
Grails 2.0での更新(予定)内容•コア+その他。
Groovy 1.8, Spring 3.1 M1, Hibernate 3.6,Servlet 3.0, Tomcat 7への更新。Javaエージェントで開発時リロード改善パフォーマンス強化・速度向上!新しいコンソールUIとインタラクティブ(interactive)モードスカッフォルドUIがHTML5に!エラーレポートとスタックトレース表示
•リソース静的リソースハンドリング機能PrototypeからjQueryへ
•GORMGORM API大幅改良、機能強化AST変換を使用したGORM API抽象クラス継承のサポート
•DB基本データベースをH2への変更DBコンソール複数データソースサポートマイグレーションとリバースエンジニアリング
•テストMixinベースUnitテストSpockもサポートした新しいテストAPIUnitテストスカッフォールディング強化されたユニットテストのコンソールへの書き出し
•プラグインバイナリープラグインプラグイン使用統計トラッキングプラグイン開発用のAST変換API
16
Upgradeで更新!
はじめに!いつも気になる事。。。
17
grails upgrade•注意!
BuildConfgで「grails.project.work.dir="target/work"」を定義してると起動しないよ!
成功例
18
1.3.7 to 2.0.M1 (diff)
19
単純な物は
無問題。
20
コア+その他。
21
コア+その他。• Groovy 1.8, Spring 3.1, Hibernate 3.6,
Servlet 3.0, Tomcat 7への更新。
• Javaエージェントで開発時リロード改善
•パフォーマンス強化・速度向上!
•スカッフォルドUIがHTML5に!
•新しいコンソールUIとインタラクティブ(interactive)モード
•エラーレポートとスタックトレース表示
22
コア• Groovy 1.8
•超強化されたGroovyをバンドル
• Spring 3.1
• SpringプロファイルとGrails環境のブリッジ。
• Servlet 3.0
• Asyncとか個人的には注目してる。
• Tomcat 7
• Hibernate 3.623
開発時リロード改善• Javaエージェントの実装により、未サポート
だった静的型のサービス、ドメインクラス等のリロードが可能に。
• -javaagentオプションにSpring-Loaded指定して実装されている。
•起動時の指定でON/OFF可能。
% grails -noreloading
24
パフォーマンス強化・速度向上!
http://www.jtict.com/blog/rails-wicket-grails-play-lift-jsp/
GSPが再度最適化がされた!25
賛否両論あります
が・・。
26
スカッフォルドUI(HTML5)
<input type="number" name="price" required="" value="" id="price" />
Firefox5だと
27
コンソールUI•コンソール表示が1行で表示されるように!
• grails (Ent) で、インタラクティブモードに突入。タブ補完、コマンド履歴有り。(jline使用)
28
コンソール• grails (Ent) で、インタラクティブモードに突入
するので。
29
% grails --help% grails -version
コンソールUI• Entでの前コマンド再実行が無くなった。
•でも、クラス名は補完。
30
エラーレポートとスタックトレース表示
31
Grailsソースの構成改良•ソースツリーのお掃除!
• Gradle使ってる人参考になると思う。
32
リソース
33
リソース•静的リソースハンドリング機能
• resourcesプラグインがコアへ(プラグイン提供)
• http://grails.org/plugin/resources
• PrototypeからjQueryへ
•リソースの改善と平行して、jQueryへの移行も行われた。
34
リソースプラグイン• js,cssをモジュール管理
•リソースをDSLで定義modules = { core { dependsOn 'jquery, utils' resource url: '/js/core.js', disposition: 'head' resource url: '/js/ui.js' resource url: '/css/main.css', resource url: '/css/branding.css' resource url: '/css/print.css', attrs: [media: 'print'] } utils { dependsOn 'jquery' resource url: '/js/utils.js' } forms { dependsOn 'core,utils' resource url: '/css/forms.css' resource url: '/js/forms.js' }}
<html> <head> <r:require module="jquery"/> <r:layoutResources/> </head> <body> … <r:layoutResources/> </body></html>
35
リソースプラグイン•連動するプラグイン
•キャッシュ
• http://grails.org/plugin/cached-resources
• gzip
• http://grails.org/plugin/zipped-resources
36
ドキュメント追記されてると思
うが、使い方がわかりにくかっ
たので。。。
37
簡易resourcesプラグイン講座•まだM1だから、いきなり説明不足。
•公式Doc 6.7 AJAXを試しても。
• <g:javascript library="jquery"/>
•動きません
• Grails初心者キラー。
38
簡易resourcesプラグイン講座• How?
AJAXする対象ページに、 スクリプトタグ追加。以下のどれでも良い <g:javascript library="jquery" plugin="jquery"/> <g:javascript library="jquery"/> <r:require modules="jquery"/>2.0からは、<r:require modules="jquery"/> が、望ましいね。
main.gspの<g:layoutHead/>の下辺りに、<r:layoutResources/>これが無いとJSが出ない。
さらに、これが無いと動かない。Config.groovyにgrails.views.javascript.library="jquery"
39
DB & GORM
40
DB,GORM•基本データベースをH2へ変更
• DBコンソール
•複数データソースサポート
•マイグレーションとリバースエンジニアリング
• GORM API大幅改良、機能強化
• AST変換を使用したGORM API
•抽象クラス継承のサポート41
DB変わったよ!
• HSQDB → H2
• BuildConfigに、runtime 'hsqldb:hsqldb:1.8.0.10'
•何ならこれを期に、H2にしてしまおう!
• jdbcの設定も変えないとね!42
DBコンソール• URLに、 /dbconsoleを指定
43
DBコンソール•基本は開発モードのみで使用可能。
指定する事で productionモードでも可能。(セキュリティ必要)
environments { production { grails.serverURL = "http://www.changeme.com" grails.dbconsole.enabled = true grails.dbconsole.urlRoot = '/admin/dbconsole' } development { grails.serverURL = "http://localhost:8080/${appName}" } test { grails.serverURL = "http://localhost:8080/${appName}" }}
44
複数データソースサポートdataSource { pooled = true driverClassName = 'org.h2.Driver' url = 'jdbc:h2:mem:testDb' username = 'sa' password = '' dbCreate = 'update'}
dataSource_ds2 { pooled = true driverClassName = 'org.h2.Driver' url = 'jdbc:h2:mem:testDb2' username = 'sa' password = '' dialect = org.hibernate.dialect.H2Dialect dbCreate = 'update'}
DataSource.groovy
def book = Book.ds2.get(100)
class Book { String title static mapping = { datasource 'ALL' }}
class Comment { String message static mapping = { datasource 'ds2' }}
ドメインに定義
45
マイグレーションリバースエンジニアリング
•プラグインで提供。詳しくはドキュメントを読みましょう!
• http://grails.org/plugin/database-migration
• http://grails.org/plugin/db-reverse-engineer
46
GORM API大幅改良・機能強化• GORM APIがJavaから使用可能に。
• GORMでの抽象クラス継承のサポート。
• OrCreateとOrSaveクエリーの実装追加。
•名前付きクエリから関係先の名前付きクエリを参照。
•共有制約とコマンドオブジェクト。
47
GORM APIがJavaから使用可能に
• GORM APIは、Groovy ASTによって、GORMエンティティのバイトコードとして注入されます。これによりGORMのメソッドは、Javaコードから、呼び出したり見たりできます。
Book book = new Book();book.setTitle("The Stand")book.save();System.out.println(Book.count());System.out.println(Book.list());
48
GORMでの抽象クラス継承のサポート
• GORMが抽象クラス継承をサポートしました。関連リンクやクエリ等を抽象クラスに定義することができます。
abstract Media { String title …}class Book extends Media {}class Album extends Media {
}class Account { static hasMany = [purchasedMedia:Media]}
..
def allMedia = Media.list()
49
OrCreateとOrSaveクエリーの実装追加
• ドメインクラスに、findWhereやfindByメソッドに似た、nullを返さない、findOrCreateWhere, findOrSaveWhere, findOrCreateBy, findOrSaveByのクエリーをサポート。
• 実行結果にインスタンスが見つからない場合は、指定された値で、新規にインスタンスを作成して返します。findOrSaveWhereとfindOrSaveByの場合はインスタンスを保存してからインスタンスを返します。
def book = Book.findOrCreateWhere(author: 'Douglas Adams', title: "The Hitchiker's Guide To The Galaxy")
def book = Book.findOrSaveWhere(author: 'Daniel Suarez', title: 'Daemon')
def book = Book.findOrCreateByAuthorAndTitle('Daniel Suarez', 'Daemon')
def book = Book.findOrSaveByAuthorAndTitle('Daniel Suarez', 'Daemon')
50
名前付きクエリ•名前付きクエリがドメインクラスのリレーショ
ンを含んでいる場合、そのリレーション先の名前付きクエリを使用することが可能に。
class Author { static hasMany = [publications:Publication]
static namedQueries = { authorsWithRecentPublications { publications { //ここ。 recentPublications() } } }}class Publication { Author author static namedQueries = { recentPublications {//これ def now = new Date() gt 'datePublished', now - 10 } }}
51
共有制約とコマンドオブジェクト
•コマンドオブジェクトが共有制約をサポートしました。実装方法は以前に追加されたドメインクラスと同じです。
grails.gorm.default.constraints = { '*'(nullable: true, size: 1..20)}grails.gorm.default.constraints = { myShared(nullable: true, size: 1..20)}class User { ... static constraints = { login(shared: "myShared") }}
52
テスト
53
Unitテスト• Unitテスト大幅改良!
•フィルター・URLマッピング・ファイルアップロード・コンテントネゴシエーション・テンプレートビューレンダリング・ドメインクラスクライテリアクエリ
• http://grails.org/doc/1.4.x/guide/9.%20Testing.html#9.1%20Unit%20Testing
54
Unitテスト• MixinベースUnitテスト
• (未確認)Spockもサポートした新しいテストAPI
• Unitテストスカッフォールディング
• generate-allでスカッフォールドの内容用のUnitテストが自動生成される。(コード参照)
•強化されたユニットテストのコンソール表示
55
@TestMixin
@Mock
@TestFor56
Unitテスト•コントローラテストの方法が、
公式ドキュメントの "9.1" に詳しく掲載!
•リロード良くなったので、新コンソール(インタラクティブ)でテストしよう!
•ドメインテスト注意点。
• Car.findAllByMaker(.....)とかの、フィールド(この場合maker)にはインデックス定義必要。mappings に maker index:true 。
57
コンソール表示と結果レポート
58
プラグイン
59
プラグイン•プラグイン使用統計トラッキング
•プラグイン使用レポートを収集する機能が実装されました。近いうちにプラグイン使用統計がGrailsのサイトで公開されます。
•プラグイン開発用のAST変換API
• @Artefact ??
•バイナリープラグイン
60
バイナリープラグイン•プラグインを通常のJARファイルとしてプリコ
ンパイルパッケージ可能になります。• Mavenリポジトリで通常のJARファイルで配布可能。
• バイナリプラグインは他のJARと同じように依存管理が行える。
• ソースコードを公開しない商用プラグインが可能。
• 通常のJARになることによって、IDE等の環境で扱いやすくなる。
%grails package-plugin --binary
61
まだあった!
62
アクションがメソッドに•今まではアクションがクロージャで実装されて
ました。今後はメソッドで実装を推奨します!(もちろんクロージャもサポートしてます)
•メソッドにすることによっての利点• メモリ効率
• ステートレスコントローラの使用 (シングルトンスコープ指定)
• サブクラスでのアクションのオーバーライドが可能。スーパークラスのアクションメソッド呼び出しが可能。super.actionName()
• クロージャはフィールドのため複雑だったスタンダードなプロキシを使用したメソッドのインターセプトが可能。
63
アクションがメソッドに
64
grails.compile.artefacts.closures.convert = true
クロージャを使用したい場合、旧版対応:AST変換を使用してクロージャをメソッドに変換したバイトコードを生成
def index() { redirect(action: "list", params: params)}
def list() { params.max = Math.min(params.max ? params.int('max') : 10, 100) [bookList: Book.list(params), bookTotal: Book.count()]}
アクションのメソッドに引数を指定
<g:form name="myForm" action="save">! <input name="name" />! <input name="age" />!</g:form>
def save(String name, int age) {! // remaining}
アクションメソッドに引数を指定してバインド。
指定した型に変換されます。
65
Servlet 3.0 Async•非同期処理。AsyncContext
grails.servlet.version = "3.0"
BuildConfigにサーブレットバージョン指定
def index() { def ctx = startAsync() ctx.start { new Book(title:"The Stand").save() render template:"books", model:[books:Book.list()] ctx.complete() }}
使用方法: def ctx = startAsync()
66
便利API
LinkGenerator grailsLinkGeneratordef generateLink() {! grailsLinkGenerator.link(controller:"book", action:"list")}
Link Generation API
PageRenderer groovyPageRenderervoid welcomeUser(User user) {! def contents = groovyPageRenderer.render(
view:"/emails/welcomeLetter", model:[user: user])! sendEmail {! ! to user.email! ! body contents! }}
Page Rendering API
Grailsのルールでリンクを生成するAPI
Webリクエスト以外の場所でGSPをレンダリングするAPI
67
フィルターの除外定義•フィルターでのコントローラ・アクション・URI
の除外指定が実装されました。filter1(actionExclude: 'log*') { before = { // 共通の前処理 }}filter2(controllerExclude: 'auth') { before = { // 処理 }}
filter3(uriExclude: '/secure*') { before = { // … }}
68
data-mappingの名前が変更され!?• spring-data-mappingが
grails-data-mappimgに変更!?org.grailsのリネームされた。
今後どうなるのかな?
リンク切れ!?
http://www.springsource.org/spring-data
69
さらにその他。•依存ライブラリ・プラグインにSNAPSHOTが有
る場合の自動更新
•パーマネントリダイレクト(301)のサポート• redirect() メソッドにtrueを指定すると、リダイレクトは、301の
HTTPステータスで送信され、その逆であれば、302で送信されます。
• JsonBuilderは非推奨となりました。
•全てのスタティックホルダーは非推奨。
• GORMエンティティを拡張した抽象クラスは必ずsrc/groovyに入れましょう。
70
そして、さらに多くの
細かなFixが多数!!
71
でも、
まだM1です!
72
お気を付けて使用しましょう!
Q&A
73
Thank you.
日本Grails/Groovyユーザーグループhttp://www.jggug.org/
74