Your SlideShare is downloading. ×
Grails 2.0.0.M1の話
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Grails 2.0.0.M1の話

4,036
views

Published on


0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
4,036
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
18
Comments
0
Likes
5
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 1
  • 2. 2
  • 3. • 仕事 • 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
  • 4. 4
  • 5. • 7/1 富士山 山開き• 7/2 キャラ・スーンの誕生日(ZZ)   ミーア・キャンベルの誕生日(SEED DESTINY)• 7/3  2005年にGrails最初のコミットされた日!• 7/4  アメリカ独立記念日!• 7/5  @tyama 誕生日!• 7/6「プログラミングGroovy」発売!• 7/7 七夕!• 7/8 質屋の日! 5
  • 6. • プログラミングGROOVY [単 行本(ソフトカバー)]• 価格: ¥3,360 6
  • 7. 7
  • 8. 8
  • 9. 9
  • 10. 10
  • 11. • ある程度の。 • 最新のWeb開発アーキテクチャを知る事ができる。 • 最先端・流行のJava開発を知る事ができる。• Grailsでの開発 • 開発効率の追求。(究極なDRY)  • シンプルかつ柔軟。(DSL)  • DDD。• ただし! • 柔軟過ぎて質の悪いアプリケーションも構築できる。 • 意外と作り手によっては、おかしな物になる。 11
  • 12. 12
  • 13. 1.4にしておくには、もったいないぐらい内容が良いから2.0になった! 13
  • 14. 14
  • 15. 変わる可能性もあるので、わかる範囲でお伝えします。 動く動かないの前に、自分の環境も確かめましょう。 15
  • 16. •コア+その他。 •DB Groovy 1.8, Spring 3.1 M1, Hibernate 基本データベースをH2への変更 3.6,Servlet 3.0, Tomcat 7への更新。 DBコンソール Javaエージェントで開発時リロード改善 複数データソースサポート パフォーマンス強化・速度向上! マイグレーションとリバースエンジニア 新しいコンソールUIとインタラクティブ リング (interactive)モード •テスト スカッフォルドUIがHTML5に! MixinベースUnitテスト エラーレポートとスタックトレース表示 Spockもサポートした新しいテストAPI•リソース Unitテストスカッフォールディング 静的リソースハンドリング機能 強化されたユニットテストのコンソール PrototypeからjQueryへ への書き出し•GORM •プラグイン GORM API大幅改良、機能強化 バイナリープラグイン AST変換を使用したGORM API プラグイン使用統計トラッキング 抽象クラス継承のサポート プラグイン開発用のAST変換API 16
  • 17. 17
  • 18. • 注意! BuildConfgで 「grails.project.work.dir="target/work"」を 定義してると起動しないよ!成功例 18
  • 19. 19
  • 20. 20
  • 21. 21
  • 22. • Groovy 1.8, Spring 3.1, Hibernate 3.6, Servlet 3.0, Tomcat 7への更新。• Javaエージェントで開発時リロード改善• パフォーマンス強化・速度向上!• スカッフォルドUIがHTML5に!• 新しいコンソールUIとインタラクティブ (interactive)モード• エラーレポートとスタックトレース表示 22
  • 23. • Groovy 1.8 • 超強化されたGroovyをバンドル• Spring 3.1 • SpringプロファイルとGrails環境のブリッジ。• Servlet 3.0 • Asyncとか個人的には注目してる。• Tomcat 7• Hibernate 3.6 23
  • 24. • Javaエージェントの実装により、未サポート だった静的型のサービス、ドメインクラス等の リロードが可能に。• -javaagentオプションにSpring-Loaded指定 して実装されている。• 起動時の指定でON/OFF可能。 % grails -noreloading 24
  • 25. http://www.jtict.com/blog/rails-wicket-grails-play-lift-jsp/ GSPが再度最適化がされた! 25
  • 26. 26
  • 27. Firefox5だと<input type="number" name="price" required="" value="" id="price" /> 27
  • 28. • コンソール表示が1行で表示されるように!• grails (Ent) で、インタラクティブモードに突 入。タブ補完、コマンド履歴有り。(jline使用) 28
  • 29. • grails (Ent) で、インタラクティブモードに突入 するので。 % grails --help % grails -version 29
  • 30. • Entでの前コマンド再実行が無くなった。• でも、クラス名は補完。 30
  • 31. 31
  • 32. • ソースツリーのお掃除!• Gradle使ってる人参考に なると思う。 32
  • 33. 33
  • 34. • 静的リソースハンドリング機能 • resourcesプラグインがコアへ (プラグイン提供) • http://grails.org/plugin/resources• PrototypeからjQueryへ • リソースの改善と平行して、jQueryへの移行 も行われた。 34
  • 35. • 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 { <html>        dependsOn jquery <head>        resource url: /js/utils.js <r:require module="jquery"/>    } <r:layoutResources/>    forms { </head>        dependsOn core,utils <body>        resource url: /css/forms.css …        resource url: /js/forms.js <r:layoutResources/>    } </body>} </html> 35
  • 36. • 連動するプラグイン • キャッシュ • http://grails.org/plugin/cached-resources • gzip • http://grails.org/plugin/zipped-resources 36
  • 37. 37
  • 38. • まだM1だから、いきなり説明不足。• 公式Doc 6.7 AJAXを試しても。 • <g:javascript library="jquery"/> • 動きません • Grails初心者キラー。 38
  • 39. • How? main.gsp <g:layoutHead/> <r:layoutResources/> JSAJAX        <g:javascript library="jquery" plugin="jquery"/>        <g:javascript library="jquery"/>        <r:require modules="jquery"/>2.0<r:require modules="jquery"/> Config.groovy grails.views.javascript.library="jquery" 39
  • 40. 40
  • 41. • 基本データベースをH2へ変更• DBコンソール• 複数データソースサポート• マイグレーションとリバースエンジニアリング• GORM API大幅改良、機能強化• AST変換を使用したGORM API• 抽象クラス継承のサポート41
  • 42. • HSQDB → H2• BuildConfigに、 runtime hsqldb:hsqldb:1.8.0.10• 何ならこれを期に、H2にしてしまおう!• jdbcの設定も変えないとね! 42
  • 43. • URLに、 /dbconsoleを指定 43
  • 44. • 基本は開発モードのみで使用可能。 指定する事で 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
  • 45. DataSource.groovydataSource {    pooled = true ドメインに定義    driverClassName = org.h2.Driver    url = jdbc:h2:mem:testDb class Book {    username = sa     String title    password =     static mapping = {    dbCreate = update         datasource ALL}     }dataSource_ds2 { }    pooled = true    driverClassName = org.h2.Driver    url = jdbc:h2:mem:testDb2 class Comment {    username = sa     String message    password =     static mapping = {    dialect = org.hibernate.dialect.H2Dialect         datasource ds2    dbCreate = update}     } } def book = Book.ds2.get(100) 45
  • 46. • プラグインで提供。 詳しくはドキュメントを読みましょう!• http://grails.org/plugin/database-migration• http://grails.org/plugin/db-reverse-engineer 46
  • 47. • GORM APIがJavaから使用可能に。• GORMでの抽象クラス継承のサポート。• OrCreateとOrSaveクエリーの実装追加。• 名前付きクエリから関係先の名前付きクエリを 参照。• 共有制約とコマンドオブジェクト。 47
  • 48. • 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
  • 49. • GORMが抽象クラス継承をサポートしました。 関連リンクやクエリ等を抽象クラスに定義する ことができます。 abstract Media { String title … } class Book extends Media { } class Album extends Media { } class Account { static hasMany = [purchasedMedia:Media] } .. def allMedia = Media.list() 49
  • 50. • ドメインクラスに、findWhereやfindByメソッドに似 た、nullを返さない、findOrCreateWhere, findOrSaveWhere, findOrCreateBy, findOrSaveByのクエリーをサポート。• 実行結果にインスタンスが見つからない場合は、指定 された値で、新規にインスタンスを作成して返しま す。findOrSaveWhereとfindOrSaveByの場合はイン スタンスを保存してからインスタンスを返します。def book = Book.findOrCreateWhere(author: Douglas Adams, title: "The Hitchikers Guide To The Galaxy")def book = Book.findOrSaveWhere(author: Daniel Suarez, title: Daemon)def book = Book.findOrCreateByAuthorAndTitle( Daniel Suarez, Daemon)d e f b o o k = B o o k . f i n d O r S a v e B y A u t h o r A n d T i t l e ( D a n i e l S u a r e z , D a e m o n ) 50
  • 51. • 名前付きクエリがドメインクラスのリレーショ ンを含んでいる場合、そのリレーション先の名 前付きクエリを使用することが可能に。 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
  • 52. • コマンドオブジェクトが共有制約をサポートし ました。 実装方法は以前に追加されたドメインクラスと 同じです。 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. 53
  • 54. • Unitテスト大幅改良!• フィルター・URLマッピング・ファイルアップ ロード・コンテントネゴシエーション・テンプ レートビューレンダリング・ドメインクラスク ライテリアクエリ• http://grails.org/doc/1.4.x/guide/ 9.%20Testing.html#9.1%20Unit%20Testing 54
  • 55. • MixinベースUnitテスト• (未確認)Spockもサポートした新しいテストAPI• Unitテストスカッフォールディング • generate-allでスカッフォールドの内容用のUnitテスト が自動生成される。(コード参照)• 強化されたユニットテストのコンソール表示 55
  • 56. @TestMixin @Mock@TestFor 56
  • 57. • コントローラテストの方法が、 公式ドキュメントの "9.1" に詳しく掲載!• リロード良くなったので、 新コンソール(インタラクティブ)でテストしよ う!• ドメインテスト注意点。 • Car.findAllByMaker(.....)とかの、フィールド (この場合maker)にはインデックス定義必要。 mappings に maker index:true 。 57
  • 58. 58
  • 59. 59
  • 60. • プラグイン使用統計トラッキング • プラグイン使用レポートを収集する機能が実 装されました。近いうちにプラグイン使用統 計がGrailsのサイトで公開されます。• プラグイン開発用のAST変換API • @Artefact ??• バイナリープラグイン 60
  • 61. • プラグインを通常のJARファイルとしてプリコ ンパイルパッケージ可能になります。• Mavenリポジトリで通常のJARファイルで配布可能。• バイナリプラグインは他のJARと同じように依存管理が行える。• ソースコードを公開しない商用プラグインが可能。• 通常のJARになることによって、IDE等の環境で扱いやすくなる。 %grails package-plugin --binary 61
  • 62. 62
  • 63. • 今まではアクションがクロージャで実装されて ました。今後はメソッドで実装を推奨します! (もちろんクロージャもサポートしてます)• メソッドにすることによっての利点• メモリ効率• ステートレスコントローラの使用 (シングルトンスコープ指定)• サブクラスでのアクションのオーバーライドが可能。スー パークラスのアクションメソッド呼び出しが可能。 super.actionName()• クロージャはフィールドのため複雑だったスタンダードなプ ロキシを使用したメソッドのインターセプトが可能。 63
  • 64. 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()]}クロージャを使用したい場合、旧版対応:AST変換を使用してクロージャをメソッドに変換したバイトコードを生成 grails.compile.artefacts.closures.convert = true 64
  • 65. アクションメソッドに引数を指定してバインド。<g:form name="myForm" action="save">! <input name="name" />! <input name="age" />!</g:form> 指定した型に変換されます。 def save(String name, int age) { ! // remaining } 65
  • 66. • 非同期処理。AsyncContext BuildConfigにサーブレットバージョン指定 grails.servlet.version = "3.0" 使用方法: def ctx = startAsync() def index() { def ctx = startAsync() ctx.start { new Book(title:"The Stand").save() render template:"books", model:[books:Book.list()] ctx.complete() } } 66
  • 67. Link Generation APIGrailsのルールでリンクを生成するAPILinkGenerator grailsLinkGeneratordef generateLink() {! grailsLinkGenerator.link(controller:"book", action:"list")}Page Rendering APIWebリクエスト以外の場所でGSPをレンダリングするAPIPageRenderer groovyPageRenderervoid welcomeUser(User user) {! def contents = groovyPageRenderer.render( view:"/emails/welcomeLetter", model:[user: user])! sendEmail {! ! to user.email! ! body contents! }} 67
  • 68. • フィルターでのコントローラ・アクション・URI の除外指定が実装されました。 filter1(actionExclude: log*) { before = { // } } filter2(controllerExclude: auth) { before = { // } } filter3(uriExclude: /secure*) { before = { // … } } 68
  • 69. • spring-data-mappingが grails-data-mappimgに変更!? org.grailsのリネームされた。 http://www.springsource.org/spring-data リンク切れ!? 今後どうなるのかな? 69
  • 70. • 依存ライブラリ・プラグインにSNAPSHOTが有 る場合の自動更新• パーマネントリダイレクト(301)のサポート• redirect() メソッドにtrueを指定すると、リダイレクトは、301の HTTPステータスで送信され、その逆であれば、302で送信されます。• JsonBuilderは非推奨となりました。• 全てのスタティックホルダーは非推奨。• GORMエンティティを拡張した抽象クラスは必 ずsrc/groovyに入れましょう。 70
  • 71. 71
  • 72. お気を付けて使用しましょう! 72
  • 73. 73
  • 74. 74

×