G*workshop sendai 20100424(v2)

2,679 views

Published on

Published in: Technology

G*workshop sendai 20100424(v2)

  1. 1. はじめての Groovy @G* ワークショップ in 仙台 2010/4/24 日本アイ・ビー・エム ( 株 )  須江 信洋 [email_address] http://twitter.com/nobusue ※ 資料の内容は個人としての意見・見解を述べたものであり、 所属する企業・組織が内容を保証するものではありません。
  2. 2. 自己紹介 <ul><li>須江 信洋(すえ のぶひろ) </li></ul><ul><li>1970 年生まれの 40 才 </li></ul><ul><li>ずっと JavaEE 関連の仕事をしています </li></ul><ul><ul><li>職場は何回か変わってます。。。 </li></ul></ul><ul><li>G* との関わり </li></ul><ul><ul><li>Groovy を組み込んだ製品 (WebSphere sMash) を売ってます </li></ul></ul><ul><ul><li>JGGUG 平会員 </li></ul></ul><ul><ul><li>「 Groovy イン・アクション」翻訳メンバーの一味 </li></ul></ul><ul><ul><li>「 Groovy 入門(仮称)」執筆中です。。。 </li></ul></ul>
  3. 3. Groovy とは?
  4. 4. Groovy とは <ul><li>Who/When </li></ul><ul><ul><li>2003 年 8 月 James Strachan, Bob McWhirter </li></ul></ul><ul><li>What </li></ul><ul><ul><li>JVM 上で稼動するオブジェクト指向の動的スクリプト言語 </li></ul></ul><ul><ul><li>Ruby, Python, Dylan および Smalltalk からの影響 </li></ul></ul><ul><li>Why Groovy? </li></ul><ul><ul><li>Java とほぼ同じ文法、 Java との親和性の高さ </li></ul></ul><ul><ul><ul><li>Jython(Python) / (J)Ruby のように新規の API を学ぶ必要がない </li></ul></ul></ul><ul><ul><ul><li>Java 開発者が入りやすい動的スクリプト言語 </li></ul></ul></ul><ul><li>公式ページ:  http://groovy.codehaus.org/ </li></ul><ul><li>API :  http://groovy.codehaus.org/gapi/ </li></ul><ul><li>GDK : http://groovy.codehaus.org/groovy-jdk/ </li></ul>&quot; Groovy is designed to help you get things done on the Java platform in a quicker, more concise and fun way - bringing the power of Python and Ruby inside the Java Platform.&quot; Feature Rich Java Friendly other other other other Groovy
  5. 5. Javaフレンドリーな Groovy <ul><li>Java とのシームレスな統合 </li></ul><ul><ul><li>JVM 上で動作し、 JRE を利用する </li></ul></ul><ul><ul><li>スクリプトから Java クラスの生成が可能 </li></ul></ul><ul><ul><li>Groovy = Java + 便利な拡張機能 </li></ul></ul><ul><li>Java とほぼ同じ文法 </li></ul><ul><ul><li>Groovy のクラスはそのまま Java のクラス </li></ul></ul><ul><ul><li>Java の上位互換、冗長性を排除した文法 </li></ul></ul><ul><li>Groovy による Java の拡張 </li></ul><ul><ul><li>言語仕様 </li></ul></ul><ul><ul><li>Groovy 独自のライブラリー </li></ul></ul><ul><ul><li>既存 Java クラスへの機能追加 (GDK) </li></ul></ul>簡単・コンパクト・読みやすいコード! Groovy コード Java コード JRE JVM GDK ライブラリー 言語仕様
  6. 6. Java 屋におすすめ、 Groovy <ul><li>Java からの段階的な移行が可能 </li></ul><ul><ul><li>Java のクラスライブラリがそのまま使える </li></ul></ul><ul><ul><li>Java の文法がほぼそのまま使える </li></ul></ul><ul><ul><li>Java のノウハウ (Ant,JUnit, ・・ ) がほぼそのまま使える </li></ul></ul><ul><li>硬軟どちらにも対応できる </li></ul><ul><ul><li>オプショナルタイピング(必要なとこだけ型を指定する) </li></ul></ul><ul><ul><li>Java とのシームレスな統合 </li></ul></ul><ul><ul><li>動的プログラミング(クロージャ、 MOP 、・・) </li></ul></ul><ul><ul><li>動的クラス生成(コンパイルするタイミングを選択できる) </li></ul></ul><ul><li>⇒ 日々の作業からアプリ開発まで、幅広く使えます </li></ul><ul><li>⇒ Java の API を対話的に確認するのにも有用 </li></ul>
  7. 7. Groovy はじめの一歩
  8. 8. まずはインストール (Windows の場合 ) <ul><li>groovy.codehaus.org から取得したアーカイブ (groovy-binary-1.7.x.zip) を展開 </li></ul><ul><ul><li>zip ファイル内の groovy-1.7.x ディレクトリを、適当なディレクトリ以下 (c:groovy など ) に展開する </li></ul></ul><ul><li>環境変数 GROOVY_HOME の設定 </li></ul><ul><ul><li>「スタート」 - 「コントロールパネル」 - 「システム」 </li></ul></ul><ul><ul><li>「詳細設定」タブを選択し、「環境設定」をクリック </li></ul></ul><ul><ul><li>“ システム環境変数”の「新規」をクリックし、以下を設定 </li></ul></ul><ul><ul><ul><li>変数名: GROOVY_HOME </li></ul></ul></ul><ul><ul><ul><li>変数値: c:groovygroovy-1.7.x  ※各自の環境に合わせて </li></ul></ul></ul><ul><li>パスの設定 </li></ul><ul><ul><li>“ システム環境変数”から変数名” PATH” を選択し、「編集」をクリック </li></ul></ul><ul><ul><ul><li>変数値の先頭に、「 %GROOVY_HOME%in; 」 を追加する </li></ul></ul></ul><ul><li>コマンドプロンプトから「 groovy –v 」を実行し、正常に起動することを確認 </li></ul>当然ですが、 JDK(1.5 以上 ) も入れておいてね
  9. 9. Groovy スクリプトを実行する <ul><li>コマンド </li></ul><ul><ul><li>groovy Hoge[.groovy] ( 拡張子が .groovy なら省略可 ) </li></ul></ul><ul><ul><li>単発で Groovy スクリプトを実行する </li></ul></ul><ul><li>Groovy シェル </li></ul><ul><ul><li>groovysh </li></ul></ul><ul><ul><li>コマンドライン版対話型シェル </li></ul></ul><ul><li>Groovy コンソール </li></ul><ul><ul><li>groovyConsole </li></ul></ul><ul><ul><li>GUI 版シェル ( SwingBuilder で構築されている) </li></ul></ul>
  10. 10. まずは &quot;Hello world&quot; class HelloWorld { public static void main(String[] args){ System.out. println &quot;Hello world&quot; ; } } [Java] println 'Hello world' [Groovy] 定型的なコード (boilerplate code) を排除して、本質的な処理のみを記述すればよい
  11. 11. groovysh 使用上の注意 <ul><li>シェルの中で変数を定義するとき </li></ul><ul><ul><li>× def x=‘hogehoge’ </li></ul></ul><ul><ul><li>◎ x=‘hogehoge’ </li></ul></ul>※ x がスクリプトの binding に格納されるため、期待通りに動作する。  興味のある人は GINA の 11.2.2 節を参照のこと。
  12. 12. その他 <ul><li>IDE を使う </li></ul><ul><ul><li>Eclipse Groovy plug-in </li></ul></ul><ul><ul><ul><li>Groovy のコードアシスト+デバッグ、 V2.0 になってかなりまともに </li></ul></ul></ul><ul><ul><li>NetBeans </li></ul></ul><ul><ul><ul><li>Grails をけっこう手厚く支援 </li></ul></ul></ul><ul><ul><ul><li>Groovy はそれなり・・・ </li></ul></ul></ul><ul><ul><li>IntelliJ IDEA </li></ul></ul><ul><ul><ul><li>Groovy/Grails サポートの老舗 </li></ul></ul></ul><ul><ul><ul><li>通好みらしいです ⇒詳しくは、いまいさんに・・・ </li></ul></ul></ul><ul><li>Windows の人は、 Installer 版を使うと楽です </li></ul><ul><ul><li>.groovy をダブルクリックするだけで実行できるようになる </li></ul></ul><ul><ul><li>Gant のビルドファイルを gant コマンドに関連付けてくれる、など </li></ul></ul>
  13. 13. Object Browser <ul><li>最後に評価したオブジェクトのプロパティ / メソッドを参照できる </li></ul><ul><ul><li>groovysh: inspect コマンド </li></ul></ul><ul><ul><li>groovyConsole: Ctrl+I or“Script - Inspect Last” </li></ul></ul>
  14. 14. 困った時は・・・ <ul><li>オブジェクトインスタンスのクラス名 </li></ul><ul><ul><li>obj.class.name </li></ul></ul><ul><li>オブジェクトのプロパティ / メソッド / フィールド一覧 </li></ul><ul><ul><li>obj.properties </li></ul></ul><ul><ul><li>obj.class.methods </li></ul></ul><ul><ul><li>obj.class.fields </li></ul></ul><ul><li>オブジェクトの文字列表現 </li></ul><ul><ul><li>obj.dump() </li></ul></ul>
  15. 15. Groovy 基本の ' き '
  16. 16. Groovy :これだけおさえといて! <ul><li>コードとコメントの表記 </li></ul><ul><ul><li>基本的には Java と同じ </li></ul></ul><ul><ul><ul><li>一行コメントは // 、複数行コメントは /* .. */ </li></ul></ul></ul><ul><ul><ul><li>行末の ; ( セミコロン ) は不要だが、あっても良い </li></ul></ul></ul><ul><ul><ul><li>メソッドからの戻り値指定 (return) はオプション(省略時は最後の式が戻り値になる) </li></ul></ul></ul><ul><li>構文 </li></ul><ul><ul><li>以下は、 Java とほぼ同等のものが使える </li></ul></ul><ul><ul><ul><li>package 機構、文 </li></ul></ul></ul><ul><ul><ul><li>クラスとメソッド定義(ただし、インナークラスは Groovy-1.7 でサポート) </li></ul></ul></ul><ul><ul><ul><li>制御構造( for ループは拡張されている ) </li></ul></ul></ul><ul><ul><ul><li>演算子、式、代入、例外処理 </li></ul></ul></ul><ul><ul><ul><li>オブジェクトのインスタンス生成、参照、メソッド呼び出し </li></ul></ul></ul><ul><ul><li>以下は Groovy が拡張しているもの </li></ul></ul><ul><ul><ul><li>オブジェクトアクセスの簡素化(添字演算子、 GPath など) </li></ul></ul></ul><ul><ul><ul><li>リテラルの拡張(リスト、マップ、名前付きパラメータ) </li></ul></ul></ul><ul><ul><ul><li>新しいデータ型(範囲、クロージャなど) </li></ul></ul></ul><ul><ul><ul><li>すべてをオブジェクトとして扱う </li></ul></ul></ul>
  17. 17. Java と Groovy の違い <ul><li>return キーワードはオプション </li></ul><ul><ul><li>省略時には最後に評価した式が戻り値になる </li></ul></ul><ul><li>クラス / メソッド / フィールドはデフォルトで public </li></ul><ul><ul><li>プロパティアクセス時、 private は無視される </li></ul></ul><ul><li>インナークラスは Groovy-1.7 以降でサポート </li></ul><ul><ul><li>Java のインナークラスと完全互換ではないので注意 </li></ul></ul><ul><ul><li>クロージャで代替できる場合が多い </li></ul></ul><ul><li>チェック例外はない </li></ul><ul><ul><li>すべて非チェック例外として処理 </li></ul></ul><ul><li>「 a==b 」 は同値性「 a.eqauls(b) 」の意味 </li></ul><ul><ul><li>オブジェクトの同一性を判定したい場合は、「 a.is(b) 」 </li></ul></ul>
  18. 18. クラス宣言 <ul><li>Groovy のクラス宣言は、 Java とほぼ同等 </li></ul><ul><ul><li>ただし、 Java のパッケージ可視性 ( 修飾子なし ) はサポートされない </li></ul></ul><ul><li>以下のパッケージは自動的に import される </li></ul><ul><ul><li>groovy.lang.*, groovy.util.*, java.lang.*, java.util.*, java.net.*, java.io.*, java.math.BigInteger, java.math.BigDecimal </li></ul></ul>class Book { private String title void setTitle(String theTitle) { title = theTitle } String getTitle(){ return title } } 定型的なコード (boilerplate code)
  19. 19. GroovyBean <ul><li>GroovyBean の特徴 </li></ul><ul><ul><li>可視性が設定されていないフィールドはプロパティとみなされ、 setter/getter が自動生成される </li></ul></ul><ul><ul><li>bean.prop および bean[prop] は、 setter/getter に変換される </li></ul></ul>class Book { String title } def aBook = new Book() aBook. setTitle ('Groovy Recipes') assert aBook. getTitle () == 'Groovy Recipes' aBook. title = 'Groovy in Action' assert aBook. title == 'Groovy in Action' aBook[ 'title' ] = 'Groovy in Action' assert aBook[ 'title' ] == 'Groovy in Action' 前頁と同じクラスの定義 スクリプト
  20. 20. 拡張された文字列リテラル <ul><li>文字列リテラルの表記 </li></ul>def name = 'Bob' def greeting = &quot;Hello, ${name}&quot; def pattern = /d.d/ def multiLineString = ''' Hello, world My name is Groovy.''' def multiLineGString = &quot;&quot;&quot; Hello, ${name} My name is Groovy.&quot;&quot;&quot; String GString GString( のエスケープ不要 ) 複数行 String 複数行 GString
  21. 21. Java のプリミティブ型(非オブジェクト) <ul><li>Java では、以下の型はオブジェクトではない </li></ul><ul><ul><li>boolean, byte, short, int, long, float, double, char </li></ul></ul><ul><li>プリミティブ型の特徴 </li></ul><ul><ul><li>Java の演算子 (+,-,*,/ など ) による演算ができる </li></ul></ul><ul><ul><li>コレクションフレームワーク (List, Map など ) へ格納できない </li></ul></ul><ul><ul><ul><li>ラッパークラスを利用 </li></ul></ul></ul><ul><li>オブジェクト型の特徴 </li></ul><ul><ul><li>Java の演算子 (+,-,*,/ など ) による演算ができない </li></ul></ul><ul><ul><ul><li>演算はメソッドとして実装する必要がある (cf. BigInteger) </li></ul></ul></ul><ul><ul><ul><li>例外: String(Java では特別扱い ) </li></ul></ul></ul><ul><ul><li>コレクションフレームワーク (List, Map など ) へ格納できる </li></ul></ul><ul><li>Autoboxing (Java 5 ~ ) </li></ul><ul><ul><li>必要なコンテキストでは暗黙の変換が行われるようになった </li></ul></ul><ul><ul><ul><li>Ease of Development の実現、 .NET などの影響 </li></ul></ul></ul>Groovy では、プリミティブ型はすべてラッパークラス(オブジェクト)として処理される
  22. 22. 数値とオブジェクト <ul><li>Groovy では、数値もすべてオブジェクトとして扱われる </li></ul><ul><li>演算はメソッド呼び出しに変換される </li></ul><ul><ul><li>メソッドをオーバーライドすることで、独自の演算が定義可能 </li></ul></ul>def x = 1 def y = 2 assert x + y == 3 assert x.plus(y) == 3 assert x instanceof Integer
  23. 23. Groovy の数値リテラル データ型 リテラルの接尾辞 java.lang.Integer (int 範囲内の無印整数 ) 例) 15, 0x1234ffff java.lang.Long L,l java.lang.Float F,f java.lang.Double D,d java.math.BigInteger G,g,(int 範囲外の無印整数 ) java.math.BigDecimal G,g,( 無印小数 ),( 指数表記 ) 例) 1.23, 1.4E4, 2.8e4, 1.23g
  24. 24. Groovy ツアー <ul><ul><li>オブジェクトとコレクション操作 </li></ul></ul><ul><ul><li>制御構造 </li></ul></ul><ul><ul><li>GDK </li></ul></ul><ul><ul><li>演算子オーバーライドと Category </li></ul></ul><ul><ul><li>XML 操作 </li></ul></ul>
  25. 25. オブジェクトとコレクション操作 <ul><li>オブジェクトナビゲーション </li></ul><ul><ul><li>GPath </li></ul></ul><ul><ul><li>Safe dereference </li></ul></ul><ul><li>拡張されたリテラルのサポート </li></ul><ul><ul><li>List </li></ul></ul><ul><ul><li>Map </li></ul></ul><ul><ul><li>範囲 (Range 型、新規導入 ) </li></ul></ul><ul><ul><li>⇒ 利用頻度が高い割に、 Java ではサポートが弱い </li></ul></ul><ul><li>クロージャ </li></ul><ul><li>Expando Metaclass </li></ul>
  26. 26. GPath <ul><li>GPath </li></ul><ul><ul><li>XPath のような簡易な表記で、オブジェクトツリー階層を辿れる </li></ul></ul><ul><ul><ul><li>obj.a.b.c => obj.getA().getB().getC() </li></ul></ul></ul><ul><ul><li>途中にコレクションが含まれても、そのまま扱える </li></ul></ul><ul><ul><li>例)カレントオブジェクトの持つ全ての getter メソッドをソートして出力 </li></ul></ul><ul><ul><ul><li>this.class.methods.name.grep(~/get.*/).sort() </li></ul></ul></ul><ul><li>類似の技術 </li></ul><ul><ul><li>XPath </li></ul></ul><ul><ul><ul><li>/document/order/lineItem[1] </li></ul></ul></ul><ul><ul><ul><ul><li><document> 要素の下の、 <order> 要素の下の、 1 番目の <lineItem> 要素 </li></ul></ul></ul></ul><ul><ul><li>JavaScript のオブジェクト参照 </li></ul></ul><ul><ul><ul><li>document.form.text1.value </li></ul></ul></ul><ul><ul><ul><ul><li>現在のブラウザウィンドウの、フォームの、 text1 要素の内容 </li></ul></ul></ul></ul>
  27. 27. GPath と safe dereferencing operator <ul><li>safe dereferencing operator( 安全な参照演算子 ) : 「 ?. 」 </li></ul><ul><ul><li>GPath を辿る途中で null が含まれる可能性がある場合に利用 </li></ul></ul><ul><ul><ul><li>Java に比べ、シンプルな表記で NPE を回避することができる </li></ul></ul></ul><ul><ul><li>直前のオブジェクトが null なら評価を中断し、結果として null を返す </li></ul></ul><ul><ul><ul><li>obj?.a?.b?.c => if(obj!=null) obj.getA() else null .... </li></ul></ul></ul>
  28. 28. List <ul><li>List 型を言語レベルでサポート </li></ul><ul><ul><li>リテラル表記が可能 </li></ul></ul><ul><ul><li>添字演算子 ([ ]) によるアクセスが可能 </li></ul></ul><ul><li>動的に拡張可能 </li></ul>def roman = ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII'] assert roman[4] == 'IV' roman[8] = 'VIII‘ roman << ‘IX’ assert roman. size() == 10 def list1 = [] def list2 = [] as LinkedList 空の List(java.util.ArrayList) 空の List( 実装を指定 )
  29. 29. List の便利メソッド assert [1,[2,3]]. flatten () == [1,2,3] assert [1,2,3]. intersect ([4,3,1]) == [3,1] assert [3,1,2]. sort () == [1,2,3] def list = [ [1,0], [0,1,2], [2,1,0] ] list = list. sort { a,b -> a[0] <=> b[0] } assert list = [ [0,1,2], [1,0], [2,1,0] ] def doubled = [1,2,3]. collect { it*2 } assert doubled == [2,4,6] assert [1,2,3]. join (‘-’) == ‘1-2-3’
  30. 30. Map <ul><li>Map 型を言語レベルでサポート </li></ul><ul><ul><li>リテラル表記が可能 </li></ul></ul><ul><ul><li>添字演算子 ([ ]) によるアクセスが可能 </li></ul></ul>def http = [ 100 : 'CONTINUE', 200 : 'OK', 400 : 'BAD REQUEST' ] assert http[200] == 'OK' http[500] = 'INTERNAL SERVER ERROR' assert http. size() == 4 def map1 = [:] def list2 = [:] as TreeMap ← new TreeMap() と等価 空の Map(java.util.HashMap)
  31. 31. 範囲 <ul><li>範囲 (Range 型 ) を言語レベルでサポート </li></ul><ul><ul><li>対応する概念は Java に存在しない </li></ul></ul><ul><ul><li>リテラル表記が可能 </li></ul></ul><ul><ul><li>クロージャとの組合せでよく使われる </li></ul></ul>def x = 1..10 assert x.contains(5) assert x.contains(15) == false assert x.from == 1 assert x.to == 10 assert x.reverse() == 10..1 def y = 1..<10 assert y.contains(10) == false 境界値を含む 境界値を含まない
  32. 32. オブジェクトとしてのコード:クロージャ <ul><li>コードフラグメントを First Class Object として扱える </li></ul><ul><ul><li>Ruby のブロック、 JavaScript の関数オブジェクトに相当 </li></ul></ul><ul><li>ロジックの再利用や動的なディスパッチに有効 </li></ul><ul><li>宣言時の環境( Lexical Scope) を保持している </li></ul>log = '' (1..10).each { log += it } assert log == '12345678910' map = ['a':1, 'b':2] def doubler = {key, value -> map[key] = value * 2} map.each(doubler) assert map == ['a':2, 'b':4] クロージャの引数が 1 つのときは、 it で省略可能 クロージャを変数に代入可能
  33. 33. クロージャの例 p [1,2,3,4,5].select {|i| i%2==0 } Ruby println ([1,2,3,4,5].findAll {it%2==0 } ) Groovy <ul><li>「 1,2,3,4,5 」という数字の配列から、偶数を抜き出せ </li></ul>“ 動詞 (find)+ 目的語 (All) ” の Java のメソッド表記ルールに準拠 it : クロージャー内 イテレータのデフォルト定義
  34. 34. Expando – 動的に拡張可能なオブジェクト def obj = new Expando() obj.hello = {println &quot;Hello&quot;} obj.hello()    // Hello obj.param = &quot;world&quot; println obj.param // world インスタンス生成後にメソッドやフィールドの追加が可能 ⇒   Ruby のオープンクラスや、 JavaScript のプロトタイプベース・オブジェクト指向に近い機能
  35. 35. 制御構造 <ul><li>Groovy の真偽判定 </li></ul><ul><li>正規表現 </li></ul><ul><li>拡張された switch case </li></ul>
  36. 36. Groovy の真偽判定 <ul><li>拡張された真偽判定 </li></ul><ul><ul><li>Boolean 式による判定 (Java と同じ ) </li></ul></ul><ul><ul><li>Matcher はマッチしなければ false 、マッチすれば true </li></ul></ul><ul><ul><li>コレクション / マップは空なら false 、それ以外は true </li></ul></ul><ul><ul><li>文字列は空文字列なら false 、それ以外は true </li></ul></ul><ul><ul><li>数値はゼロなら false 、それ以外は true </li></ul></ul><ul><ul><li>オブジェクトは null なら false 、それ以外は true </li></ul></ul><ul><li>利用可能な制御構文 </li></ul><ul><ul><li>if ( 式 ) then ... else </li></ul></ul><ul><ul><li>while ( 式 ) { ... } </li></ul></ul><ul><ul><li>for (elem in 範囲 ) { ... }, for (elem in リスト ) { ... } </li></ul></ul><ul><ul><li>コレクション .each() { ... } </li></ul></ul><ul><ul><li>switch( 式 ) { case c1: ... ; break; case c2: ... ; break; deafult: ... } </li></ul></ul>
  37. 37. 制御構造の例 if (null)   { assert false }   else   { assert true } def i = 0 while (i < 10) { i++ } assert i == 10 def clinks = 0 for (remainingGuests in 0..9) { clinks += remainingGuests } assert clinks == (10*9)/2 def list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] for (j in list) { assert j == list[j] } list.each() { item -> assert item == list[item] }
  38. 38. 正規表現 <ul><li>正規表現を手軽に使うために、専用の演算子を導入 </li></ul><ul><ul><li>=~ : 正規表現検索演算子 </li></ul></ul><ul><ul><ul><li>正規表現に対する部分一致の判定 </li></ul></ul></ul><ul><ul><ul><li>式として評価すると、 java.util.regex.Matcher を返す </li></ul></ul></ul><ul><ul><li>==~ : 正規表現マッチ演算子 </li></ul></ul><ul><ul><ul><li>正規表現に対する全体一致の判定 </li></ul></ul></ul><ul><ul><ul><li>式として評価すると、 Boolean を返す </li></ul></ul></ul><ul><ul><li>~ 文字列 : 正規表現パターン </li></ul></ul><ul><ul><ul><li>文字列をパターンとして扱う( ~/pattern/ の書式を推奨 ) </li></ul></ul></ul><ul><ul><ul><li>式として評価すると、 java.util.regex.Pattern を返す </li></ul></ul></ul>
  39. 39. 正規表現の例 def twister = 'she sells sea shells at the sea shore of Seychelles' assert twister =~ /s.a/ assert (twister ==~ /s.a/) == false assert twister ==~ /w+( w+)*/ def words = twister.split(/ /) assert words.size() == 10 switch('bear'){ case ~/..../ : assert true case ~/b.*/ : assert true; break default : assert false } def animals = ['cat', 'dog', 'bear', 'wolf', 'tiger', 'elephant'] assert animals.grep(~/.../) == ['cat', 'dog']
  40. 40. 実用的に拡張された switch ~ case <ul><li>case に多様な条件式を表記できる </li></ul>def x = 1.23 def result = '' switch (x) { case &quot;foo&quot; : result = &quot;found foo&quot; case &quot;bar&quot; : result += &quot;bar&quot;; break case [4,5,6,'inList'] : result = &quot;list&quot;; break case 12..30 : result = &quot;range&quot;; break case Integer : result = &quot;integer&quot;; break case Number : result = &quot;number&quot;; break default: result = &quot;default&quot; } println result
  41. 41. GDK: JDK のクラスを勝手に拡張 <ul><li>Groovy のメタプログラミング機能を利用して、 JDK のクラスが本来持っていないメソッドを追加 </li></ul>new File('sample.txt'). eachLine { line -> if( line.size() > 4 ) println line } ファイルを 1 行づつ読み込んで、 文字数が4以上の行を表示 java.io.File にメソッド eachLine(Closure) を追加
  42. 42. 演算子オーバーライドと Category <ul><li>Groovy では、すべての演算子はメソッド </li></ul><ul><ul><li>メソッドをオーバーライドすることで、挙動を変えられる </li></ul></ul><ul><ul><ul><li>http://groovy.codehaus.org/Operator+Overloading </li></ul></ul></ul><ul><li>通常はデフォルトの挙動で、特定の箇所のみ演算子の挙動を変えたい場合には Category を使う </li></ul><ul><ul><li>Category (≒mixin) </li></ul></ul><ul><ul><ul><li>任意個の static メソッドを持つ(=カテゴリメソッド) </li></ul></ul></ul><ul><ul><ul><li>use メソッドで、指定した範囲内のみカテゴリメソッドを有効にすることができる </li></ul></ul></ul><ul><ul><ul><ul><li>カンマ区切りで複数個の Category を差し込むこともできる </li></ul></ul></ul></ul><ul><ul><ul><li>既存のメソッドのオーバーライドも可能 </li></ul></ul></ul>
  43. 43. Category の例:日付操作 <ul><li>org.codehaus.groovy.runtime.TimeCategory </li></ul><ul><ul><li>Date の plus()/minus() をオーバーライド </li></ul></ul><ul><ul><li>Integer に getHours()/getMinutes() 等を追加 </li></ul></ul><ul><li>例:現在時刻の 9 時間 5 分後を求める </li></ul>def date = new Date() use(org.codehaus.groovy.runtime.TimeCategory){ date = date + 9.hours + 5.minutes } ⇒ Java では???
  44. 44. XML 操作 <ul><li>XML の読み込みには、以下の方法が使える </li></ul><ul><ul><li>Groovy の XmlParser </li></ul></ul><ul><ul><ul><li>XML 全体をメモリー上にオブジェクト化 </li></ul></ul></ul><ul><ul><ul><ul><li>ノードの内部表現は groovy.util.Node </li></ul></ul></ul></ul><ul><ul><li>Groovy の XmlSlurper </li></ul></ul><ul><ul><ul><li>XML をオンデマンドでオブジェクト化( SAX よりもメモリ消費は多い) </li></ul></ul></ul><ul><ul><ul><ul><li>ノードの内部表現は GPathResult </li></ul></ul></ul></ul><ul><ul><li>Java の DOM </li></ul></ul><ul><ul><ul><li>Groovy 独自のヘルパーを提供 </li></ul></ul></ul><ul><ul><li>その他、 Java の SAX/StAX や JDOM などもそのまま使える </li></ul></ul>
  45. 45. XmlParser def plan = new XmlParser().parse(new File('plan.xml')) println plan.name()                 // plan println plan.week[0].name()           // week println plan.week[0].task[0].name() // task println plan.week[0].task[0].‘@title‘ // ProjectZero をダウンロードする <?xml version=&quot;1.0&quot; encoding=&quot;Shift_JIS&quot; ?> <plan>   <week capacity=&quot;8&quot;>    <task done=&quot;1&quot; cost=&quot;2&quot; title=&quot;ProjectZero をダウンロードする &quot; />    <task done=&quot;1&quot; cost=&quot;3&quot; title=&quot;Groovy プロジェクトを作成する &quot; />   </week>   <week capacity=&quot;8&quot;>    <task done=“0” cost=“1” title=“ テストケース作成 &quot; />    <task done=“0” cost=“3” title=“ テスト実施する &quot; />   </week> </plan> plan.xml Groovy   (GPath による Xpath の様なパス式 )
  46. 46. XmlBuilder < tasks project=‘2'> < title >Install ProjectZero< /title > < title >Make Groovy project< /title > < title >Code it< /title > < /tasks >groovy.xml.MarkupBuilder@120cc56 def builder = new groovy.xml.MarkupBuilder(); builder. tasks ([project:2]) { title (&quot;Install ProjectZero&quot;) title (&quot;Make Groovy project&quot;) title (&quot;Code it&quot;) } println builder Groovy 実行結果
  47. 47. Groovy お得情報 <ul><ul><li>手軽に Groovy を試す </li></ul></ul><ul><ul><li>ライブラリの配布を楽にする </li></ul></ul><ul><ul><li>ビルドを便利にする </li></ul></ul><ul><ul><li>テストを便利にする </li></ul></ul><ul><ul><li>Google AppEngine をサクッと使う </li></ul></ul><ul><ul><li>Groovy の起動を早くする </li></ul></ul><ul><ul><li>Groovy のパフォーマンスを改善する </li></ul></ul>
  48. 48. 手軽に Groovy を試す <ul><li>Groovy をカジュアルに使いたい!! </li></ul><ul><ul><li>面白そうだけど、いちいちインストールするのは面倒だな・・・ </li></ul></ul><ul><ul><li>知り合いに紹介したいんだけど、手軽にデモするには? </li></ul></ul><ul><li>そんなあなたにお勧め: Groovy web console </li></ul><ul><ul><li>ブラウザだけで Groovy のコードが実行できます!! </li></ul></ul><ul><ul><ul><li>実体は Google AppEngine 上のアプリケーション </li></ul></ul></ul><ul><ul><li>本家: http://groovyconsole.appspot.com/ </li></ul></ul><ul><ul><li>JGGUG 版 : http://jggugcode.appspot.com/ </li></ul></ul>
  49. 49. Groovy web console(JGGUG ver.)
  50. 50. ライブラリの配布を楽にする :Grape <ul><li>Grape(@Grab) で、 maven リポジトリから jar を自動取得 </li></ul><ul><ul><li>Groovy-1.6 の新機能( 1.7 でさらに改善) </li></ul></ul><ul><ul><li>内部では Apache Ivy を利用 </li></ul></ul>@Grab( group = 'net.homeip.yusuke', module='twitter4j', version='*') import twitter4j.Twitter Twitter twitter = new Twitter(&quot;<user>&quot;,&quot;<pass>&quot;) twitter.update(args[0]) Twitter4j を使った Twitter クライアント このファイルだけで動きます!! ( 要 Groovy-1.7 以上 )
  51. 51. ビルドを便利にする <ul><li>AntBuilder </li></ul><ul><ul><li>Groovy のディストリビューションに含まれている </li></ul></ul><ul><ul><li>Groovy プログラムの中から、 Ant タスクを呼べる </li></ul></ul><ul><ul><li>ビルドの手続きをクロージャで書ける </li></ul></ul><ul><li>Gant </li></ul><ul><ul><li>Ant のビルド定義を Groovy で置き換え (build.xml⇒build.groovy) </li></ul></ul><ul><ul><li>別途インストールが必要 </li></ul></ul><ul><li>Gradle / GMaven </li></ul><ul><ul><li>Maven のビルド定義を Groovy で置き換え </li></ul></ul><ul><ul><li>別途インストールが必要 </li></ul></ul>
  52. 52. テストを楽にする : Power Assert <ul><li>要するに、「超親切な Assert 」 </li></ul><ul><ul><li>Groovy-1.7 の新機能 </li></ul></ul><ul><ul><li>Spock(BDD フレームワーク ) から取り込まれた機能 </li></ul></ul>def a = 1 def b = 2 def c = 3 assert (a+b)*c == 5 途中結果や、どこで fail したかまで教えてくれる。 assertEquals() とかを組み合わせる必要ナシ。
  53. 53. GAEJ をサクッと使う : Gaelyk <ul><li>Google AppEngine に手っ取り早くアプリを置きたい人に </li></ul><ul><ul><li>Groovy でロジックを書いて </li></ul></ul><ul><ul><li>Groovy Template で View を書いて </li></ul></ul><ul><ul><li>appcfg update war 、で OK </li></ul></ul><ul><li>GAEJ の API をラップして、簡単に使えるようになってます </li></ul><ul><ul><li>詳細はこちらを: http://dl.dropbox.com/u/132573/Gaelyk-Tutorial.html </li></ul></ul>
  54. 54. Groovy の起動を早くする : GroovyServ <ul><li>Groovy が便利なのは分かったけど、 JavaVM の起動に時間がかかるから、気軽に使えないよね? </li></ul><ul><li>という声にお応えして!! kobo project(JGGUG 上原さん・中野さん ) が開発 </li></ul><ul><ul><li>Groovy を実行するための JavaVM を常駐し、 クライアント・サーバーモデルでスクリプトを実行 </li></ul></ul><ul><ul><li>JavaVM 起動時のオーバーヘッドを解消し、 圧倒的なサクサク感 を提供 </li></ul></ul><ul><ul><li>Groovy コミッタの Paul King さんも使ってるとか </li></ul></ul><ul><li>http://kobo.github.com/groovyserv/ </li></ul>論より証拠。 デモをご覧ください。
  55. 55. Groovy のパフォーマンスを改善する <ul><li>Groovy が便利なのは分かったけど、動的型を扱うからパフォーマンスは Java に負けるよね? </li></ul><ul><ul><li>パフォーマンスが要求されるところは Java で書けばよい! Groovy は Java のクラスをシームレスに呼び出せる。 </li></ul></ul><ul><ul><li>とは言っても、全部 Groovy で書けたら楽だよね。。。。 </li></ul></ul><ul><li>という声にお応えして!! </li></ul><ul><ul><li>Groovy++(Groovy Booster) が登場 </li></ul></ul><ul><ul><ul><li>http://code.google.com/p/groovypptest/ </li></ul></ul></ul><ul><ul><li>@Typed を付けるだけで、 Java 相当の静的型に変身 </li></ul></ul><ul><ul><ul><li>http://d.hatena.ne.jp/uehaj/20100225/1267106256 </li></ul></ul></ul><ul><ul><li>今のところ Groovy 本体とは別に開発されているが、将来的には取り込まれるかもです。 </li></ul></ul>
  56. 56. まとめ
  57. 57. Groovy 、面白いのでとにかく使ってみて! <ul><li>「はじめての Groovy 」にしては、ちょっと濃すぎた? </li></ul><ul><ul><li>いえいえ、今日の内容ではまだまだ上っ面をなめただけです </li></ul></ul><ul><ul><ul><li>もっと濃い話が聞きたい方は、 http://d.hatena.ne.jp/uehaj を購読すべし </li></ul></ul></ul><ul><ul><li>が、 Groovy の面白さは 一通りお伝えしたつもりです </li></ul></ul><ul><li>Java に限界を感じているエンジニア諸兄に </li></ul><ul><ul><li>近頃話題の彼女( Scala たんや Ruby たん)も いいけど・・・ </li></ul></ul><ul><ul><li>近くにいる娘( Groovy たん)とも付き合ってみると、 意外な発見があるかも・・・ </li></ul></ul>
  58. 58. さて、ここで問題です。 <ul><li>[ 問題 1] Groovy で def a=1 と書いた場合、 a の型はなんでしょう? </li></ul><ul><ul><li>(a) int </li></ul></ul><ul><ul><li>(b) java.lang.Integer </li></ul></ul><ul><ul><li>(c) java.lang.BigInteger </li></ul></ul><ul><li>[ 問題 2] Groovy で a,b が BigInteger 型の場合、 a - b と書くと何が起こるでしょう? </li></ul><ul><ul><li>(a) コンパイルエラー </li></ul></ul><ul><ul><li>(b) 実行時エラー </li></ul></ul><ul><ul><li>(c) a.minus(b) が実行される </li></ul></ul>
  59. 59. Groovy の情報源 <ul><li>日本語書籍「 Groovy イン・アクション」 毎日コミュニケーションズより発売中 </li></ul><ul><ul><li>Groovy の基礎から活用まで、幅広い話題を網羅 </li></ul></ul><ul><li>Groovy 本既刊(英語版) </li></ul><ul><ul><li>&quot;Groovy in Action&quot; (Manning) Groovy のバイブル本。 </li></ul></ul><ul><ul><li>&quot;Programming Groovy&quot; (Pragmatic Bookshelf) 初心者向けの入門書。 Groovy-1.5 ベース </li></ul></ul><ul><ul><li>&quot;Groovy Recipe&quot; (Pragmatic Bookshelf) 具体的なコードサンプル集。 Groovy-1.5 ベース </li></ul></ul><ul><li>コミュニティ </li></ul><ul><ul><li>日本 Grails/Groovy ユーザーグループ http://www.jggug.org/ </li></ul></ul><ul><ul><ul><li>G* ワークショップやってます。気軽にご参加ください。 </li></ul></ul></ul>
  60. 60. Let’s get groovy!

×