Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

JJUG CCC 2012 Real World Groovy/Grails

9,687 views

Published on

JJUG CCC 2012 Spring
slide for Groovy/Grails on Business

  • Follow the link, new dating source: ♥♥♥ http://bit.ly/2F7hN3u ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating direct: ♥♥♥ http://bit.ly/2F7hN3u ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

JJUG CCC 2012 Real World Groovy/Grails

  1. 1. Grails/Groovy の開発活用術(1)NTTソフトウェアのとりくみ 2012/5/28 JJUG CCC NTTソフトウェア Grails推進室 上原潤二 2012
  2. 2. 自己紹介上原潤二(@uehaj)NTTソフトウェア株式会社Grails推進室JGGUG(日本Grails/Groovyユーザグループ)運営委員書籍執筆: プログラミングGROOVY(技術評論社), Grails徹底入門(翔泳社)ブログ「Grな日々」GroovyServ, LispBuilder, GVM開発者 2012
  3. 3. はじめにNTTソフトウェアでは、Grails推進室を設置し、組織的にGroovy/Grailsに関わる技術蓄積とコミュニティ活動を含むGroovy/Grailsの普及に取り組んでいます。 対外活動: JGGUG(日本Grails/Groovyユーザ会法人会員)、運営委員 OSS開発・貢献(GroovyServ,GExcelAPI,機能拡張パッチ等) 社内での利用事例の拡大、ノウハウの蓄積などに加 え、社外への研修やサポートの提供なども検討してい ます本日は、Groovy/Grailsへの取り組み状況や背景を説明すると共に、適用のメリットを示します。 3 2012
  4. 4. Groovy/GrailsについてGroovy … Java仮想マシン上で動作する動的言語 文法はJavaと上位互換だが、冗長部分を省略し、短く書ける 既存のJavaコードやライブラリをそのまま利用可能 Rubyと同様に表現力が高く、生産性が高いGrails …Groovyを使ったオープンソースの高生産性Webアプリケーションフレームワーク WebAP開発に必要なフレームワークやライブラリなどを使いやすくカプセル化し、AllInOneで提供 Ruby on Railsの特長を取り込んだ上で、改良を行っている(Java版Ruby on Railsとも言える) 簡単なコードでGUIを自動生成(Scaffold) 周辺ノウハウを含めたコンポーネントの再利用が容易 Java基盤が持つ安定性、スケーラビリティ、資産をそのまま引き継げる 4 2012
  5. 5. なぜGrails・Groovyか? http://www.flickr.com/photos/omcoc/6751047205/ 5 2012
  6. 6. 背景ソフトウェア開発の現実: ビジネスの変化が速い 仕様確定が遅れがち/確定しない 開発期間・費用の縮減 小規模化する開発体制 クラウドの勃興(IaaS,PaaS)➡ 従来通りの「人月ビジネス」モデルの限界 6 2012
  7. 7. 人月ビジネスからの脱却課題ビジネスモデル、契約形態開発プロセスツールフレームワーク・言語 7 2012
  8. 8. Javaの問題点 コードが冗長。 UserListView(ビュークラス) 「何をしたいか(what)」 UserListHB(ヘルパーBeanクラス) UserSC(サービスコントローラー) UserSR(サービス呼び出し結果) と UserListEv(イベント) UserListEL(イベントリスナー) UserListER(イベント結果) 「実際に動作させるための記述(how)」 UserMO(DTO) UserDAO(DAO実装) UserDAOIF(DAOインターフェース) の乖離が大きい (http://d.hatena.ne.jp/ryoasai/20101025/1288008546 より引用 低レベル記述、多クラス主義➡これらは「変更しにくさ」を導く➡インクリメンタルな開発=連続的な変更➡「ビジネスの変化が速い」「開発期間・費用の縮 減」という課題に応えられない 8 2012
  9. 9. そこで9 2012
  10. 10. そこで Ruby onRailsですよ!! 9 2012
  11. 11. そこで Ruby onRailsですよ!! (違 9 2012
  12. 12. 実際問題としては…インフラとしてのJVM/Java EEの性能・安定性は捨て難い移行コストは無視できない教育コスト開発や維持管理の要員既存システムからの継続・連携APサーバやライブラリなどの資産➡SIerにとっては、上記は顧客側が負担するコストでもある 10 2012
  13. 13. なので Ruby onRailsですよ!! 11 2012
  14. 14. なので11 2012
  15. 15. なので移行の痛みを最小化しつつ、果実を得る 11 2012
  16. 16. なのでGroovy&Grailで!!移行の痛みを最小化しつつ、果実を得る 11 2012
  17. 17. Groovy12 2012
  18. 18. Groovyを10秒で説明する基本がJavaであるJava VM上で動作する文法や構造がJava上位互換で簡潔にも書ける 13 2012
  19. 19. Groovyを10秒で説明する 基本がJavaである Java VM上で動作する 文法や構造がJava上位互換で簡潔にも書ける public class HelloWorld {Java     public static void main(String[] args) {         System.out.println("Hello world");     } } 13 2012
  20. 20. Groovyを10秒で説明する 基本がJavaである Java VM上で動作する 文法や構造がJava上位互換で簡潔にも書ける public class HelloWorld {Java     public static void main(String[] args) {         System.out.println("Hello world");     } }Groovy1 public class HelloWorld {     public static void main(String[] args) {         System.out.println("Hello world");     } } 13 2012
  21. 21. Groovyを10秒で説明する 基本がJavaである Java VM上で動作する 文法や構造がJava上位互換で簡潔にも書ける public class HelloWorld {Java     public static void main(String[] args) {         System.out.println("Hello world");     } } Groovy2Groovy1 public class HelloWorld { println "Hello world"     public static void main(String[] args) {         System.out.println("Hello world");     } } 13 2012
  22. 22. Groovyの良いところ(2)GroovyのライブラリはJavaのライブラリ(ArrayList,HashMap,..)の拡張 JRubyの場合はRubyライブラリを使用。演算子オーバーローディング人間の思考に近いレベルで表現できる(次項) 14 2012
  23. 23. JavaとGroovyの比較(制約解決エンジンchoco solverで魔方陣を解くための記述を題材にして) ※http://www.emn.fr/z-info/choco-solver/ 15 2012
  24. 24. JavaとGroovyの比較 (制約解決エンジンchoco solverで魔方陣を解くための記述を題材にして) //横の列の合計がM model.addConstraints(cols); Constraint[] rows = new Constraint[n]; // 斜め合計がM for (int i = 0; i < n; i++) { IntegerVariable[][] diags=new IntegerVariable[2][n];   rows[i] = Choco.eq(Choco.sum(cells[i]), M); for (int i = 0; i < n; i++) { }   diags[0][i] = cells[i][i]; model.addConstraints(rows);   diags[1][i] = cells[i][(n - 1) - i]; //縦の列の合計がM }Java IntegerVariable[][] cellsDual = new model.addConstraint(Choco.eq(Choco.sum(diags[0]),M)); IntegerVariable[n][n]; model.addConstraint(Choco.eq(Choco.sum(diags[1]),M)); for (int i = 0; i < n; i++) { // 全ての要素が異る4   for (int j = 0; j < n; j++) { IntegerVariable[] allVars=new IntegerVariable[n*n];     cellsDual[i][j] = cells[j][i]; for (int i = 0; i < n; i++) {   }   for (int j = 0; j < n; j++) { }     allVars[i * n + j] = cells[i][j]; Constraint[] cols = new Constraint[n];   } for (int i = 0; i < n; i++) { }   cols[i]=Choco.eq(Choco.sum(cellsDual[i]), model.addConstraint(Choco.allDifferent(allVars)); M); } ※http://www.emn.fr/z-info/choco-solver/ 15 2012
  25. 25. JavaとGroovyの比較 (制約解決エンジンchoco solverで魔方陣を解くための記述を題材にして) //横の列の合計がM model.addConstraints(cols); Constraint[] rows = new Constraint[n]; // 斜め合計がM for (int i = 0; i < n; i++) { IntegerVariable[][] diags=new IntegerVariable[2][n];   rows[i] = Choco.eq(Choco.sum(cells[i]), M); for (int i = 0; i < n; i++) { }   diags[0][i] = cells[i][i]; model.addConstraints(rows);   diags[1][i] = cells[i][(n - 1) - i]; //縦の列の合計がM }Java IntegerVariable[][] cellsDual = new model.addConstraint(Choco.eq(Choco.sum(diags[0]),M)); IntegerVariable[n][n]; model.addConstraint(Choco.eq(Choco.sum(diags[1]),M)); for (int i = 0; i < n; i++) { // 全ての要素が異る4   for (int j = 0; j < n; j++) { IntegerVariable[] allVars=new IntegerVariable[n*n];     cellsDual[i][j] = cells[j][i]; for (int i = 0; i < n; i++) {   }   for (int j = 0; j < n; j++) { }     allVars[i * n + j] = cells[i][j]; Constraint[] cols = new Constraint[n];   } for (int i = 0; i < n; i++) { }   cols[i]=Choco.eq(Choco.sum(cellsDual[i]), model.addConstraint(Choco.allDifferent(allVars)); M); } cells.each{ model << it.sum().eq(M) } //横の列の合計がMGroovy cells.transpose().each{ model << it.sum().eq(M) } //縦の列の合計がM model << (0..<n).collect{ cells[it][it] }.sum().eq(M) //斜め合計がM model << (0..<n).collect{ cells[it][-(it+1)] }.sum().eq(M) //斜め合計がM model << cells.flatten().allDifferent() //全ての要素が異る ※http://www.emn.fr/z-info/choco-solver/ 15 2012
  26. 26. Grails16 2012
  27. 27. Grails Plug-inhttp://www.flickr.com/photos/cicciopizzettaro/5551554162/ 17 2012
  28. 28. GrailsプラグインGrailsで開発するアプリに組み込める機能拡張モジュールコマンド1発オンラインインストール mavenモジュール互換更新検出/伝播・リロードの枠組み豊富なプラグイン(標準リポジトリで790個以上)再利用単位として秀逸 2012
  29. 29. プラグインの構造プラグインはフルスタック MyApp MyPlugin 2012
  30. 30. プラグインの構造プラグインはフルスタック MyApp MyPluginビューを含むことができる 2012
  31. 31. プラグインの構造プラグインはフルスタック MyApp MyPluginビューを含むことができるテストを含むことができる 2012
  32. 32. プラグインの構造 プラグインはフルスタック MyApp MyPlugin ビューを含むことができるサポートスクリプトを含むことができる テストを含むことができる 2012
  33. 33. プラグインの構造 プラグインはフルスタック カスタムタグを含むことができ る MyApp MyPlugin ビューを含むことができるサポートスクリプトを含むことができる テストを含むことができる 2012
  34. 34. 再利用に関するGrailsプラグインの優位性 クラスライブラリ(Jar,pom..)の再利用 アプリケーション クラスライブラリ クラスライブラリは、自分を呼び出すアプリケーションについて情報を持たず、前提を置くことができない 例:データはどんなUIで表示される? ロギングはどう行う? 情報保 持のためにファイル書き込みはできる?→わからない。 結果としてそれらをアプリ側の責任で書き上げる必要がある 20 2012
  35. 35. 再利用に関するGrailsプラグインの優位性 Grailsプラグインの再利用 アプリケーション Grailsプラグインアプリケーションの構造はGrailsの規定に従うので、Grailsプラグインはアプリケーションの実行に介在し、操作することができる。Grailsプラグインは、自身のデータを表示・操作するためのビュー・タグを提供したり、永続化層を用いて保存したりすることもできるアプリロジックに介入する、相対的に複雑で高度な機能を、再利用モジュールとして実現することができる 21 2012
  36. 36. 導入事例http://www.flickr.com/photos/inlinguamanchester/5036313154/ 22 2012
  37. 37. 開発事例 弊社開発プロジェクト(一部)におけるGrails 適用効果は以下のとおり項 プロジェクト Grails Javaとのコー 顧客 効果 規模番 名 スキル ド量比較 顧客名簿管理 詳細設計∼結合テスト工程が、Javaの1 社内 高 Javaの約1/10 50KL システム 約1/2∼1/5の期間で開発 ProgOffice 詳細設計∼プログラム作成工程が、2 ネットワーク 社外 中 Javaの約半分の工数で開発(開発全体 未測定 未測定 電話帳(後述) で工数2割減) 詳細設計∼結合テスト工程まで、Java3 ー 社外 高 Javaの約1/10 20KL の約1/7∼1/10の期間で開発 ※1、3における期間・開発工数の比較は、当社の見積りシステムによる予測に対しての比較。 ※工程名称については共通フレーム98(SLCP-JCF98)における用語を使用した。 23 2012
  38. 38. 効果分析概要定義および、総合テスト工程以 共通フレーム 98(SLCP-降は従来と変わらない(変えていない) JCF98)における工 程名称:結合テストまでの工程における削減効果は大きい。 •外部仕様 •概要定義➡全体としては2∼3割削減と評価 •詳細定義 •内部仕様測定対象はGroovy/Grailsに適したプ •設計 •プログラム設計ロジェクトなので、一般に適用した •製造 •プログラム作成場合の評価は未。 •製品のテスト •結合テスト➡「適したプロジェクトで採用すれ •総合テスト ば効果は大きい」と言える。 •設置 •導入 24 2012
  39. 39. Grails適用事例: ProgOfficeネットワーク電話帳 当社の製品ProgOfficeの開発にGrailsを適用 (2008∼現在) 1年間に2∼3回の機能追加リリース実施 ネットワーク電話帳はNTTソフトウェアの次世代セキュアオ フィスソリューションの1つ。携帯電話やスマートフォンの 電話帳情報をサーバで一元管理・共有し、端末内部に個人情 報、発着信履歴などを持たせずに利用できるシステム 25 2012
  40. 40. Grails適用結果(感想)習熟が容易: Grails未経験のメンバーでも、Grailsの内部構造等を意識することなく、基本的にGroovyでの実装でアプリケーション開発が完成する。Javaスキルが活かせた: Javaと言語仕様が共通しており、Java部分の開発と並行して作業しても違和感が少ない。プロトタイプ開発: 画面・ロジック・DBそれぞれ間のIF設計を省略することができ、設計工数を削減できた。 26 2012
  41. 41. Grails導入実績(世の中)http://grails.org/Success+Storiesには、二百数十件のGrailsで開発されたサイトが掲示されている。例えば… 北米ニッサンにおける電気自動車leafの新製品キャンペーン・ 予約サイト WalmartのMP 3ストア スズキ自動車カナダのサイト WEBマガジン「WIRED」(wired.com) 英国の放送界の巨人「BskyB」のポータルで利用 ソーシャルネットワーク「LinkedIn」で部分利用 米国最大のバーゲンセールサイト「 biglots.com」で全面的利 用(Fortune 500企業) テレビ番組「リアリティTV」の投票システム 13 2012 13
  42. 42. 問題点http://www.flickr.com/photos/monkeydlueffy/4373070372/ 28 2012
  43. 43. 問題点日本語情報の不足英語情報は包括的リファレンスがあり充実 Grailsリファレンスを@tyamaさんと仲間達に よって翻訳中プラグインの互換性問題ノウハウ収集中 29 2012
  44. 44. まとめ http://www.flickr.com/photos/limonada/214375219/30 2012
  45. 45. まとめJavaを中心に開発してきたSIerである弊社にとって、Groovy/Grails技術は「ほどほどの痛みで、大きな果実を得るための解」 「地続きの移行」を可能とする 今後、プラグイン活用によって更なる効果を期待NTTソフトウェアは、コミュニティと連携してGroovy/Grails技術の普及発展を目指します。 31 2012

×