こんにちは  Groovy #ghello  で学ぶ Groovy 第 1 回プログラミング Groovy 勉強会 @irof
#ghello?
こんなの
#ghello ルール? <ul><li>とにかく 1Tweet に収まること
Hello Worldっぽいものなら何でもOK </li><ul><li>画像でも、Helloだけでも </li></ul><li>環境依存は番外編扱い
今でも勝手に延長戦していいっぽい </li></ul>
感想 おもしろい レベル高すぎ 意味が判らない 勉強になる
んじゃ解説でもするか 私もわからないし
なんかすみません…
#1 @kazuchika
String#toURI() <ul><li>GDK </li><ul><li>Groovy JDK
プログラミングGROOVY P.177 </li></ul><li>文字列をURIにする。だけ。 </li></ul>
Desktop.desktop.browse(URI) <ul><li>class java.awt.Desktop </li><ul><li>Javaに普通にある </li></ul><li>Desktop#brouse(URI) </li>...
#2 @kiy0taka
SwingBuilder <ul><li>Builderの代表格 </li><ul><li>Swingが簡単に書けるよ!
プログラミングGROOVY P.139 </li></ul></ul>
#3 @nobeans groovy:000> (上のコード) hello ===> null
propertyMissing(String) <ul><li>素直に実行すると例外 </li><ul><li>MissingPropertyException </li></ul><li>定義しとけばこれが呼ばれる
methodMissingってのもある
http://groovy.codehaus.org/Using+methodMissing+and+propertyMissing </li></ul>
[h,e,l*2,o] <ul><li>Listリテラル </li><ul><li>プログラミングGROOVY P.82
大カッコで囲むだけ </li><ul><li>add並べなくて良い
中身はjava.util.ArrayList </li></ul></ul></ul>
[h,e,l*2,o] <ul><li>String * 2 </li><ul><li>文字列が掛け算できます
assert ‘a’ * 3 == ‘aaa’
*は multiply(Number) のこと </li><ul><li>‘l’.multiply(2) と同じ </li></ul></ul></ul>
List#join() <ul><li>Listをくっつけてくれる </li><ul><li>引数でセパレータ指定できる </li></ul></ul>assert [a,b,c].join() == ‘abc’ assert [a,b,c]....
println(String) <ul><li>Objectクラスに追加されてるメソッド
System.out.printlnってめんどい </li><ul><li>めんどいからメソッド追加しといたよ! </li></ul><li>3つ目でやっと登場 </li></ul>
#4 @fumokmm groovy:000>  (上のコード) Hello World ===> null
String#toURL() <ul><li>省略 </li></ul>
URL#getText() <ul><li>URLの指定しているページを取得する </li><ul><li>これJavaでやろうとすると超面倒
API叩くのとかこれで良いわけで…
Groovyの反則技代表だと思ってる </li><ul><li>FileのgetTextとかeachLineとか </li></ul></ul></ul>
Closure (P.71) <ul><li>def clos = {arg -> println arg}
引数は -> の前に書く </li><ul><li>省略した場合は暗黙でitになる
def clos = {println it} </li></ul><li>ザックリ言うと処理の断片 </li><ul><li>他の処理と組み合わせて使うもの </li></ul></ul>
String#find( Pattern,Closure ) <ul><li>~はパターンオブジェクト生成 (P.116)
/hoge/ は文字列リテラル (P.67) </li><ul><li>だから ~'hoge' と書くのと同じ </li></ul><li>Closureのitは(この場合)ArrayList </li><ul><li>丸カッコ無しだとString
Groovy1.6 あたりでかわったっぽい </li></ul></ul>
“何らかの文字列”[33..43] <ul><li>インデックス指定で一部が取り出せる </li><ul><li>assert 'abcde'[3] == 'd' </li></ul><li>範囲も使える </li><ul><li>33..43...
assert 'abcde'[2..4] == 'cde' </li></ul></ul>
#5 @orange_clover  groovy:000>  (上のコード) Hello World ===> null
Object.each(Closure) <ul><li>個々の要素をClosureで処理できる
何気にCollectionじゃなくObject
引数のClosureは丸カッコの外に出せる </li><ul><li>Object.each({closure})
Object.each(){closure}
Object.each{closure} </li></ul></ul>
そのご
#6 @kyon_mm groovy:000>  (上のコード) [echo] Hello World ===> org.apache.tools.ant.taskdefs.Echo@259 27275
AntBuilder <ul><li>みんなだいすき Ant </li><ul><li>のBuilder (P.134)
実行まで出来ちゃう </li></ul><li>echo(‘hello’) </li><ul><li><echo message=”hello”/> </li></ul><li>Gantってのもある (P.233) </li></ul>
#7 @bluepapa32
SwingBuilder <ul><li>今度はダイアログじゃなくFrame
画像をダウンロードしてきて貼り付けてる </li></ul>
#8 @irof groovy:000> ( 上のコード ) Hello, world! ===> null
JsonSlurper#parseText <ul><li>文字列をJSONとして解釈する
変換前 </li><ul><li>{&quot;k1&quot;:&quot;Hello&quot;,&quot;k2&quot;:&quot;world&quot;} </li></ul><li>変換後 </li><ul><li>HashMap
[k1:&quot;Hello&quot;, k2:&quot;world&quot;] </li></ul></ul>
Object#with(Closure) <ul><li>ちょっと便利 (P.181)
Closureの中の名前解決をwithが実行されたオブジェクトで行う
VB.NETの With-End Withと似た感じ </li></ul>
GString <ul><li>Stringの中に変数や式が入れられる
ダブルクォートで囲んだ時 </li><ul><li>println &quot;${k1}, ${k2}!&quot; </li></ul><li>ここではGStringをwithで囲んでるのでMapのキーに対応する値に置換されてる </li>...
#9 @mike_neck groovy:000> (上のコード) Hello World ===> null
String#execute() <ul><li>文字列がそのままコマンドとして実行できる
Mac な人は  say  しとけばいいよ </li></ul>
#10 @kimukou_26 groovy:000> (上のコード) Hello world ===> null
Javaっぽい <ul><li>普通に substring とか indexOf とかも使える
new URL(String) でいい </li><ul><li>String#toURL() もあるけど </li></ul><li>URL#getText とか、わかりやすく便利なのをしれっと使っておけばGroovyっぽい </li></ul>
#11 @tyuki39 groovy:000> (上のコード) Hello World ===> [Ljava.lang.reflect.Field;@29cb2 795
今まで出て来たのいろいろ <ul><li>C.class.fields, Field.name </li><ul><li>Class#getFields(),Field#getName() </li></ul><li>Field[].each {}
it[0..4] + ' ' + it[5..-1] </li><ul><li>範囲リテラル
-1で一番最後 </li></ul></ul>
#12 @nightmare_tim groovy:000> (上のコード) Hello World! ===> null
for (P.108) <ul><li>for(i in 0..10) とか書ける
Listリテラルは勝手に拡張する </li><ul><li>def a=[1,2,3]
a[4] = 9
assert a == [1,2,3,null,9] </li><ul><li>List#add(4, 9)は例外になる </li></ul></ul></ul>
#13 @backpaper0 PS> (上のコード) hello world PS>
コマンドラインで実行 <ul><li>-e に続けて書くとそのまま実行できる
Windowsだとたまに別の解釈されて変なファイルが出来たりして困る </li></ul>
#14 @uehaj groovy:000> (上のコード) Hello, World ===> null
リソース読んで切り出して <ul><li>Class#getResource の戻りは URL
それを getText() </li><ul><li>エンコード不要なので text で取得 </li></ul><li>インデックス指定で切り出し
取り出してるのはJavadocの一部っぽい </li></ul>
#15 @nagai_masato
Object#each(Closure) <ul><li>再び(三度?)登場
Upcoming SlideShare
Loading in …5
×

こんにちはGroovy

5,370 views

Published on

第1回プログラミングGroovy勉強会(大阪)のスライドです。

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

No Downloads
Views
Total views
5,370
On SlideShare
0
From Embeds
0
Number of Embeds
2,442
Actions
Shares
0
Downloads
9
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

こんにちはGroovy

  1. 1. こんにちは Groovy #ghello で学ぶ Groovy 第 1 回プログラミング Groovy 勉強会 @irof
  2. 2. #ghello?
  3. 3. こんなの
  4. 4. #ghello ルール? <ul><li>とにかく 1Tweet に収まること
  5. 5. Hello Worldっぽいものなら何でもOK </li><ul><li>画像でも、Helloだけでも </li></ul><li>環境依存は番外編扱い
  6. 6. 今でも勝手に延長戦していいっぽい </li></ul>
  7. 7. 感想 おもしろい レベル高すぎ 意味が判らない 勉強になる
  8. 8. んじゃ解説でもするか 私もわからないし
  9. 9. なんかすみません…
  10. 10. #1 @kazuchika
  11. 11. String#toURI() <ul><li>GDK </li><ul><li>Groovy JDK
  12. 12. プログラミングGROOVY P.177 </li></ul><li>文字列をURIにする。だけ。 </li></ul>
  13. 13. Desktop.desktop.browse(URI) <ul><li>class java.awt.Desktop </li><ul><li>Javaに普通にある </li></ul><li>Desktop#brouse(URI) </li><ul><li>Javaに普通に(ry </li></ul><li>static Desktop getDesktop() </li><ul><li>getterはプロパティとして扱える </li></ul></ul>
  14. 14. #2 @kiy0taka
  15. 15. SwingBuilder <ul><li>Builderの代表格 </li><ul><li>Swingが簡単に書けるよ!
  16. 16. プログラミングGROOVY P.139 </li></ul></ul>
  17. 17. #3 @nobeans groovy:000> (上のコード) hello ===> null
  18. 18. propertyMissing(String) <ul><li>素直に実行すると例外 </li><ul><li>MissingPropertyException </li></ul><li>定義しとけばこれが呼ばれる
  19. 19. methodMissingってのもある
  20. 20. http://groovy.codehaus.org/Using+methodMissing+and+propertyMissing </li></ul>
  21. 21. [h,e,l*2,o] <ul><li>Listリテラル </li><ul><li>プログラミングGROOVY P.82
  22. 22. 大カッコで囲むだけ </li><ul><li>add並べなくて良い
  23. 23. 中身はjava.util.ArrayList </li></ul></ul></ul>
  24. 24. [h,e,l*2,o] <ul><li>String * 2 </li><ul><li>文字列が掛け算できます
  25. 25. assert ‘a’ * 3 == ‘aaa’
  26. 26. *は multiply(Number) のこと </li><ul><li>‘l’.multiply(2) と同じ </li></ul></ul></ul>
  27. 27. List#join() <ul><li>Listをくっつけてくれる </li><ul><li>引数でセパレータ指定できる </li></ul></ul>assert [a,b,c].join() == ‘abc’ assert [a,b,c].join(‘,’) == ‘a,b,c’
  28. 28. println(String) <ul><li>Objectクラスに追加されてるメソッド
  29. 29. System.out.printlnってめんどい </li><ul><li>めんどいからメソッド追加しといたよ! </li></ul><li>3つ目でやっと登場 </li></ul>
  30. 30. #4 @fumokmm groovy:000> (上のコード) Hello World ===> null
  31. 31. String#toURL() <ul><li>省略 </li></ul>
  32. 32. URL#getText() <ul><li>URLの指定しているページを取得する </li><ul><li>これJavaでやろうとすると超面倒
  33. 33. API叩くのとかこれで良いわけで…
  34. 34. Groovyの反則技代表だと思ってる </li><ul><li>FileのgetTextとかeachLineとか </li></ul></ul></ul>
  35. 35. Closure (P.71) <ul><li>def clos = {arg -> println arg}
  36. 36. 引数は -> の前に書く </li><ul><li>省略した場合は暗黙でitになる
  37. 37. def clos = {println it} </li></ul><li>ザックリ言うと処理の断片 </li><ul><li>他の処理と組み合わせて使うもの </li></ul></ul>
  38. 38. String#find( Pattern,Closure ) <ul><li>~はパターンオブジェクト生成 (P.116)
  39. 39. /hoge/ は文字列リテラル (P.67) </li><ul><li>だから ~'hoge' と書くのと同じ </li></ul><li>Closureのitは(この場合)ArrayList </li><ul><li>丸カッコ無しだとString
  40. 40. Groovy1.6 あたりでかわったっぽい </li></ul></ul>
  41. 41. “何らかの文字列”[33..43] <ul><li>インデックス指定で一部が取り出せる </li><ul><li>assert 'abcde'[3] == 'd' </li></ul><li>範囲も使える </li><ul><li>33..43 は範囲(Range)の生成
  42. 42. assert 'abcde'[2..4] == 'cde' </li></ul></ul>
  43. 43. #5 @orange_clover groovy:000> (上のコード) Hello World ===> null
  44. 44. Object.each(Closure) <ul><li>個々の要素をClosureで処理できる
  45. 45. 何気にCollectionじゃなくObject
  46. 46. 引数のClosureは丸カッコの外に出せる </li><ul><li>Object.each({closure})
  47. 47. Object.each(){closure}
  48. 48. Object.each{closure} </li></ul></ul>
  49. 49. そのご
  50. 50. #6 @kyon_mm groovy:000> (上のコード) [echo] Hello World ===> org.apache.tools.ant.taskdefs.Echo@259 27275
  51. 51. AntBuilder <ul><li>みんなだいすき Ant </li><ul><li>のBuilder (P.134)
  52. 52. 実行まで出来ちゃう </li></ul><li>echo(‘hello’) </li><ul><li><echo message=”hello”/> </li></ul><li>Gantってのもある (P.233) </li></ul>
  53. 53. #7 @bluepapa32
  54. 54. SwingBuilder <ul><li>今度はダイアログじゃなくFrame
  55. 55. 画像をダウンロードしてきて貼り付けてる </li></ul>
  56. 56. #8 @irof groovy:000> ( 上のコード ) Hello, world! ===> null
  57. 57. JsonSlurper#parseText <ul><li>文字列をJSONとして解釈する
  58. 58. 変換前 </li><ul><li>{&quot;k1&quot;:&quot;Hello&quot;,&quot;k2&quot;:&quot;world&quot;} </li></ul><li>変換後 </li><ul><li>HashMap
  59. 59. [k1:&quot;Hello&quot;, k2:&quot;world&quot;] </li></ul></ul>
  60. 60. Object#with(Closure) <ul><li>ちょっと便利 (P.181)
  61. 61. Closureの中の名前解決をwithが実行されたオブジェクトで行う
  62. 62. VB.NETの With-End Withと似た感じ </li></ul>
  63. 63. GString <ul><li>Stringの中に変数や式が入れられる
  64. 64. ダブルクォートで囲んだ時 </li><ul><li>println &quot;${k1}, ${k2}!&quot; </li></ul><li>ここではGStringをwithで囲んでるのでMapのキーに対応する値に置換されてる </li><ul><li>[k1:&quot;Hello&quot;, k2:&quot;world&quot;] </li></ul></ul>
  65. 65. #9 @mike_neck groovy:000> (上のコード) Hello World ===> null
  66. 66. String#execute() <ul><li>文字列がそのままコマンドとして実行できる
  67. 67. Mac な人は say しとけばいいよ </li></ul>
  68. 68. #10 @kimukou_26 groovy:000> (上のコード) Hello world ===> null
  69. 69. Javaっぽい <ul><li>普通に substring とか indexOf とかも使える
  70. 70. new URL(String) でいい </li><ul><li>String#toURL() もあるけど </li></ul><li>URL#getText とか、わかりやすく便利なのをしれっと使っておけばGroovyっぽい </li></ul>
  71. 71. #11 @tyuki39 groovy:000> (上のコード) Hello World ===> [Ljava.lang.reflect.Field;@29cb2 795
  72. 72. 今まで出て来たのいろいろ <ul><li>C.class.fields, Field.name </li><ul><li>Class#getFields(),Field#getName() </li></ul><li>Field[].each {}
  73. 73. it[0..4] + ' ' + it[5..-1] </li><ul><li>範囲リテラル
  74. 74. -1で一番最後 </li></ul></ul>
  75. 75. #12 @nightmare_tim groovy:000> (上のコード) Hello World! ===> null
  76. 76. for (P.108) <ul><li>for(i in 0..10) とか書ける
  77. 77. Listリテラルは勝手に拡張する </li><ul><li>def a=[1,2,3]
  78. 78. a[4] = 9
  79. 79. assert a == [1,2,3,null,9] </li><ul><li>List#add(4, 9)は例外になる </li></ul></ul></ul>
  80. 80. #13 @backpaper0 PS> (上のコード) hello world PS>
  81. 81. コマンドラインで実行 <ul><li>-e に続けて書くとそのまま実行できる
  82. 82. Windowsだとたまに別の解釈されて変なファイルが出来たりして困る </li></ul>
  83. 83. #14 @uehaj groovy:000> (上のコード) Hello, World ===> null
  84. 84. リソース読んで切り出して <ul><li>Class#getResource の戻りは URL
  85. 85. それを getText() </li><ul><li>エンコード不要なので text で取得 </li></ul><li>インデックス指定で切り出し
  86. 86. 取り出してるのはJavadocの一部っぽい </li></ul>
  87. 87. #15 @nagai_masato
  88. 88. Object#each(Closure) <ul><li>再び(三度?)登場
  89. 89. 今回の対象は String
  90. 90. 文字列に each したら1文字ずつClosureに渡される </li><ul><li>‘abc’.each{print it*2} </li><ul><li>aabbcc </li></ul></ul></ul>
  91. 91. String#toInteger() <ul><li>とくになし </li></ul>
  92. 92. #16 @toby55kij groovy:000> (上のコード) Hello World ===> {Hello=World}
  93. 93. JsonBuilder <ul><li>JSONを組み立てるやつ
  94. 94. BuilderのインスタンスにMapを渡したら新しい要素として扱うみたい
  95. 95. Closureで書いても良いみたい
  96. 96. 出来上がった後はMapになる </li><ul><li>いまんとこは LinkedHashMap になる </li></ul></ul>
  97. 97. Map.each(Closure) <ul><li>Closureの引数が1つの場合 </li><ul><li>Map$Entryが渡される </li><ul><li>[a:1].each{println it} </li></ul></ul><li>Closureの引数が2つの場合 </li><ul><li>第一引数にKey,第二引数にValueになる </li><ul><li>[a:1].each{k,v->println k+v} </li></ul></ul></ul>
  98. 98. #17 @nobusue groovy:000> (上のコード) Hello World! ===> null
  99. 99. JavaScriptはじめました <ul><li>ScriptEngineManagerはJavaの
  100. 100. Javaのライブラリとかを手軽に試せたりするのもGroovyの魅力 </li></ul>
  101. 101. #18 @primnum groovy:000> (上のコード) Hello World ===> 0..10
  102. 102. Object#eachWithIndex(Closure) <ul><li>引数を2つとるClosureを渡す </li></ul>groovy:000> 'abc'.eachWithIndex{a, b->println &quot;val:$a, index:$b&quot;} val:a, index:0 val:b, index:1 val:c, index:2 ===> abc
  103. 103. #19 @torazuka groovy:000> (上のコード) HELLO, WORLD!! ===> null
  104. 104. String#getAt <ul><li>引数は int, IntRange, EmptyRange, Range, Collection
  105. 105. 指定したインデックスの文字を取り出す
  106. 106. getAtは省略できたりする </li></ul>assert &quot;Oh! Well, Lord!&quot;[1,5,6,7,11] == &quot;hello&quot;
  107. 107. #20 @bikisuke groovy> (上のコード) Hello World JUnit 4 Runner, Tests: 1, Failures: 0, Time: 114
  108. 108. (補足)Spock 1.8の場合 @Grab('org.spockframework:spock-core:0.5-groovy-1.8') @GrabExclude('org.codehaus.groovy:groovy-all') class g extends spock.lang.Specification{ def&quot;h&quot;(){expect:println'Hello World'}}
  109. 109. @Grab <ul><li>本編初登場
  110. 110. Grape (P.194)
  111. 111. アノテーション書いとくだけでライブラリ使える </li><ul><li>勝手にダウンロードしてきてクラスパスに追加してくれる </li></ul></ul>
  112. 112. Spock (P.241) <ul><li>BDDフレームワーク
  113. 113. あそこに座ってる人のほうが詳しい
  114. 114. 実行結果見ればわかるようにJUnitで動いてる
  115. 115. なのでJUnitテストとして実行できたり </li><ul><li>(IntelliJ IDEAではできた) </li></ul></ul>
  116. 116. #21 @masanobuimai groovy> (GroovyConsole) Hello.World
  117. 117. String#capitalize() <ul><li>since 1.7.3
  118. 118. 先頭を大文字にしてくれる
  119. 119. だけ。
  120. 120. なんか嬉しい?
  121. 121. 英語圏だと嬉しいのかな? </li></ul>
  122. 122. mainメソッド <ul><li>classに書いとけばそれが実行される </li><ul><li>classだけだとmainネーヨとか怒られる </li></ul><li>実行できれば良いから外に出す手もある </li></ul>package hello class World {} println World.class.name.capitalize()
  123. 123. #22 @lemur314 groovy:000> (上のコード) Hello World ===> null
  124. 124. String#reverse() <ul><li>since 1.0 </li><ul><li>昔からある! </li><ul><li>……何に使うの? </li><ul><li>やっぱこういうとき? </li></ul></ul></ul></ul>
  125. 125. #23 touchez_du_bois groovy:000> (上のコード) println &quot;Hallo, Welt!&quot; ===> null
  126. 126. SimpleTemplateEngine <ul><li>templateを作れる </li><ul><li>これの make にMapで渡せばOK </li></ul><li>P.262 </li><ul><li>Groovyイン・アクション </li></ul></ul>
  127. 127. #24 @tyama groovy> (上のコード) hello world!
  128. 128. 日本語DSL <ul><li>せっかく ={}, 逃げてたのに ={} </li><ul><li>暗黙の引数itを受ける空クロージャ </li><ul><li>引数はnull </li><ul><li>def 涙 , 笑 </li></ul></ul></ul><li>せっかく ( 涙 );; 逃げてたのに ( 笑 ) </li><ul><li>;; は単にセミコロン </li></ul></ul>
  129. 129. まっマジ={a,b->...} <ul><li>まっマジ っすか , せっかく ( 涙 ) </li><ul><li>カッコが省略されてる
  130. 130. まっマジ ( っすか , せっかく ( 涙 )) </li><ul><li>両方nullですけども </li></ul><li>このクロージャで出力されてる </li></ul></ul>
  131. 131. #25 @kanemu groovy:000>(上のコード) hello,world! ===> {a=h, b=e, c=l, d=l, e=o, f=,, g=w, h=o, i=r, j=l, k=d, l=!}
  132. 132. Map#sort() <ul><li>Since 1.7.2 って書いてるよ
  133. 133. Map#sort(Closure) </li><ul><li>[:].sort { a, b -> a.value <=> b.value } </li></ul><li>Map#sort(Comparator) </li><ul><li>[:].sort({ a, b -> a[-1] <=> b[-1] } as Comparator) </li></ul></ul>
  134. 134. #26 @osimajp
  135. 135. Object#each(Closure) <ul><li>とりあえずこの辺のクロージャ渡せるのは一通り覚えとくのが良いと思う </li><ul><li>Collection (P.85)
  136. 136. Object (P.183) </li><ul><li>any, every, each
  137. 137. collect, find, findAll </li></ul></ul></ul>
  138. 138. #27 @fumokmm groovy:000> (上のコード) Hello World ===> null
  139. 141. #28 @kazuchika groovy:000> (上のコードに;足したの) Thanks for joining #ghello! ===> null
  140. 142. new Event(name:&quot;#ghello&quot;) <ul><li>コンストラクタにマップを渡してフィールドを初期化できる (P.49)
  141. 143. コンストラクタが無い時だけ </li></ul>
  142. 144. 他にも...
  143. 145. 他にも...
  144. 146. 他にも...
  145. 147. 他にも...
  146. 148. 他にも...
  147. 149. #ghello 延長戦中 (かも) 思いついたらつぶやいたら良いと思います ありがとうございました

×