Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
The report of JavaOne2011 about groovy
Search
Yasuharu Nakano
March 25, 2023
Programming
34
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
The report of JavaOne2011 about groovy
Yasuharu Nakano
March 25, 2023
More Decks by Yasuharu Nakano
See All by Yasuharu Nakano
GroovyServ - Technical Part
nobeans
0
90
JavaOne2010 Groovy/Spring Roo
nobeans
0
62
Groovy's Builder
nobeans
0
41
How about Gradle?
nobeans
0
22
レッツゴーデベロッパー2011「プログラミングGroovy〜G*エコシステム編」
nobeans
0
19
JavaSE7 Launch Event: Java7xGroovy
nobeans
0
34
Gr8conf EU 2013 Speed up your development: GroovyServ and Grails Improx Plugin
nobeans
0
33
OSS Product feat. Gradle
nobeans
1
39
Java開発の強力な相棒として今すぐ使えるGroovy
nobeans
0
64
Other Decks in Programming
See All in Programming
自分的「カンファレンスの楽しみ方」
syumai
0
190
[DroidKaigi 2026] Bring your own phones to Gradle Managed Devices
f2lk
0
110
「つくるAI」だけではバグは見つからない ~テストに必要な「見つけるAI」を分離させる戦略~
mfunaki
0
230
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
150
MIZARU@SPAJAM2026 第二回予選
1901drama
0
110
AIを上手に使っていこうとしたら越境せざるを得なくなった話 〜実践1年で見えた境界を越えなければならない理由と進め方〜 / Crossing borders with AI
tomoyakitaura
3
1k
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
2
110
PyO3 で既存 Python 評価器を Rust core 化する ー wasm-bindgen でブラウザにも配るための設計
kdash
1
410
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
340
初めての模倣学習とVLA
natsutan
0
480
新卒PdEのリアル
ryu1013
1
400
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
130
Featured
See All Featured
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
520
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
220
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
4
580
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Embracing the Ebb and Flow
colly
88
5.2k
Typedesign – Prime Four
hannesfritz
42
3.2k
Paper Plane (Part 1)
katiecoart
PRO
1
10k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Documentation Writing (for coders)
carmenintech
77
5.5k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.6k
Bash Introduction
62gerente
615
220k
Transcript
4UBOECZ+BWB http://www.flickr.com/photos/compujeramey (SPPWZͷ͍Ͳ͜Ζ ͭͷಋೖύλʔϯ 2011 ൛ 5IFTFWFO(SPPWZVTBHFQBUUFSOT
8IPBN* 㾎ࢯ໊ɿத༃࣏ʢBLBOPCFBOTʣ 㾎ॴଐɿ/55ιϑτΣΞגࣜձࣾ 㾎ϒϩάɿ౾ແه IUUQEIBUFOBOFKQOPCFBOT 㾎ϓϩμΫτɿ IUUQTHJUIVCDPNOPCFBOT
$ time groovy -e 'println "Hello, world!";' Hello, world! real
0m1.177s user 0m1.321s sys 0m0.171s $ time groovyclient -e 'println "Hello, world!";' Hello, world! real 0m0.029s user 0m0.001s sys 0m0.002s
(SPPWZʙ ͰHSPPWZTFSWFS͕ى ಈ͠ͳ͍ࣄ͕ʂ http://jira.codehaus.org/browse/GROOVY-5101
(SPPWZͰ͏ ͔ɺఆରॲΛೖΕͨ࠷ ৽ιʔε͔ΒϏϧυ͠ͳ ͓͍ͯͩ͘͠͞PS[ https://github.com/downloads/kobo/groovyserv/ groovyserv-0.10-SNAPSHOT-21eda1f.jar
None
None
None
http://gihyo.jp/book/2011/978-4-7741-4727-7 ٕज़ධࣾΑΓ ઈࢍൃചத
&YUFOEJOH+BWBT 3FBDIXJUI(SPPWZ 4FWFO4DFOBSJPT
ষ
(SPPWZʙࣣͭͷಋೖύλʔϯ ສೳணࡎ 4VQFS(MVF ΘΒ͔ͳ৺ଁ -JRVJE)FBSU εϚʔτઃఆ 4NBSU$POpHVSBUJPO ࢹڸखज़ ,FZIPMF4VSHFSZ ແ੍ݶͷղ์
6OMJNJUFE0QFOOFTT ϓϩτλΠϓ 1SPUPUZQF খਓ͞ΜεΫϦϓτ )PVTF&MG ൛
(SPPWZʙࣣͭͷಋೖύλʔϯ ສೳணࡎ 4VQFS(MVF ΘΒ͔ͳ৺ଁ -JRVJE)FBSU εϚʔτઃఆ 4NBSU$POpHVSBUJPO ࢹڸखज़ ,FZIPMF4VSHFSZ ແ੍ݶͷղ์
6OMJNJUFE0QFOOFTT ϓϩτλΠϓ 1SPUPUZQF খਓ͞ΜεΫϦϓτ )PVTF&MG ൛
(SPPWZʙࣣͭͷಋೖύλʔϯ ສೳணࡎ 4VQFS(MVF ΘΒ͔ͳ৺ଁ -JRVJE)FBSU ϦοϓεςΟοΫ -JQTUJDL ࢹڸखज़ ,FZIPMF4VSHFSZ
ແ੍ݶͷղ์ 6OMJNJUFE0QFOOFTT ΰʔετϥΠλʔ (IPTU8SJUFS খਓ͞ΜεΫϦϓτ )PVTF&MG ൛
ͭͣͭ հ͍͖ͯ͠·͢
ສೳணࡎ 4VQFS(MVF http://www.flickr.com/photos/yto/
ສೳணࡎ 4VQFS(MVF +BWBͰ࡞ΒΕͨطଘͷίϯϙʔωϯτϑϨʔϜ ϫʔΫΛ(SPPWZΛάϧʔ ކ ͱͯ͠౷߹͢Δ ݎ࿚ੑύϑΥʔϚϯε͕ඞཁͱ͞ΕΔج൫ओཁ ίϯϙʔωϯτͰ+BWBͷڧΈΛ׆͔͢ ॊೈੑढ़හੑ͕ඞཁͱ͞ΕΔϏϡʔίϯτϩʔ ϥͷϨΠϠͰ(SPPWZͷڧΈΛ׆͔͢
ͨͱ͑ 9.-1BSTFSɺ+BWBͷωοτϫʔΫ"1*ɺ4XJOHΛ Έ߹Θͤͯɺ(SPPWZؔͷຊޠϒϩάͷҰཡΛද ࣔͯ͠ΈΔ
(SPPWZίʔυ // this pipe generated by kiyotaka def url =
'http://pipes.yahoo.com/pipes/pipe.run?_id=081f8f5039 194af0f25909129d6d007d&_render=rss' def items = new XmlParser().parse(url).channel.item def cols = 'pubDate title description'.tokenize() groovy.swing.SwingBuilder.build { frame(id:'f', title: 'Japanese Groovy Blogs', visible:true) { scrollPane { table { tableModel(list: items) { cols.each { col -> closureColumn header: col, read: { it[col].text() } } } } } } f.pack() }
࣮ߦ݁Ռ
ΘΒ͔ͳ৺ଁ -JRVJE)FBSU http://www.flickr.com/photos/luilainez
ΘΒ͔ͳ৺ଁ෦ -JRVJE)FBSU +BWBͰڧݻͳΞϓϦέʔγϣϯߏΛߏங͠ɺγε ςϜͷத֩ʹҐஔ͢ΔɺมԽ͍͢͠Ϗδωεϩ δοΫͷ෦͚ͩΛ(SPPWZ PS(SPPWZʹΑΔ%4- ͰॊೈʹεΫϦϓςΟϯά͢Δ සൟʹมΘΔෳࡶͳϏδωεϧʔϧΛ࣋ͭΞϓϦ έʔγϣϯྖҬʹಛʹద͍ͯ͠Δ
ͨͱ͑ ϘʔφεͷϩδοΫ͚ͩॊೈʹ͍ͨ͠
ϦοϓεςΟοΫ -JQTUJDL New!! http://www.flickr.com/photos/taniasaiz
ϦοϓεςΟοΫ -JQTUJDL (SPPWZͷ͋ΒΏΔػೳɾϓϩμΫτΛͬͯίʔυ ΛಡΈ͘͢͢Δ (%, (SPPWZ#FBOT (1BUI -JTUT .BQT $BMMBCMF
9.- 42- $PNNBOEDIBJOT (1BST 4DSJQUPN ͳͲ ͳͲ ಛʹʮ%4-ʯ (SPPWZ͔Βɺ%4-͕ΑΓॻ͖͘͢ͳͬͨ ʢಛఆ݅ԼͰʣϝιουݺग़ͷׅހ͕লུͰ͖Δ
ͨͱ͑ invite “You” to javaone
ͨͱ͑ invite(“You”).to(javaone)
ίʔυҰࣜ def invite(subject) { [ to : { target ->
target.add(subject) } ] } def javaone = [] assert javaone == ["Nakano”, "<Your Name>"] invite(“You”).to(javaone)
·ͣJOWJUFϝιουͷݺग़ def invite(subject) { [ to : { target ->
target.add(subject) } ] } def javaone = [] assert javaone == ["Nakano”, "<Your Name>"] invite(“You”).to(javaone)
ΫϩʔδϟΛؚΉ.BQΛฦͯ͠ def invite(subject) { [ to : { target ->
target.add(subject) } ] } def javaone = [] assert javaone == ["Nakano”, "<Your Name>"] invite(“You”).to(javaone) Ωʔ͕lUPzɺ͕ΫϩʔδϟͷΤϯ τϦ͚ͩΛ࣋ͭ.BQ͕SFUVSO͞ΕΔ
ͦͷΫϩʔδϟΛݺग़͢ʂ def invite(subject) { [ to : { target ->
target.add(subject) } ] } def javaone = [] assert javaone == ["Nakano”, "<Your Name>"] invite(“You”).to(javaone) ͜ͷΫϩʔδϟͷݺग़ʹͳΔ
݁ہ͜͏͍͏͜ͱ def invite(subject) { [ to : { target ->
target.add(subject) } ] } def javaone = [] assert javaone == ["Nakano”, "<Your Name>"] invite(“You”).to(javaone) ݁ہ͜Εˣ͕࣮ߦ͞Εͨͷͱಉ͡ javaone.add(“You”)
%4-ͷͨΊͷࠐΈΛཪʹӅͯ͠͠·͑ invite “You” to javaone ίʔυͱ͖ͯͬ͢Γͯ͠ɺҙຯҰྎવ
ࢹڸखज़ ,FZIPMF4VSHFSZ http://www.flickr.com/photos/larsjuh
ࢹڸखज़ ,FZIPMF4VSHFSZ (SPPWZεΫϦϓτΛଓͰ͖Δখ͞ͳόοΫυΞΛ γεςϜʹઃ͚͓ͯ͘ ΞϓϦέʔγϣϯશମΛఀࢭͨ͠ΓϦίϯύΠϧ͢ Δ͜ͱͳ͘ɺ(SPPWZεΫϦϓτ͔Βతʹෆ۩߹ ͷੳৼΔ͍ͷมߋͳͲΛ࣮ࢪͰ͖Δ ӡ༻தʹ͓͚ΔஅอकɺόάηΩϡϦςΟ্ͷۓ ٸରԠͳͲͰศརʂ ྫʣ+FOLJOTͷ$-*
ηΩϡϦςΟͷ֬อʹेҙ͢Δ͜ͱʂ
ແ੍ݶͷղ์ 6OMJNJUFE0QFOOFTT http://www.flickr.com/photos/eiriknewth
ແ੍ݶͷ։์ 6OMJNJUFE0QFOOFTT ࠷େݶͷੜ࢈ੑॊೈੑΛಘΔͨΊɺΞϓϦέʔ γϣϯશମΛ(SPPWZ(SBJMTͰߏங͢Δ কདྷͷཁٻʹඋ͑ͯ͋Β͔͡Ίઃܭ͢ΔͳΜͯແཧ શͯͷίʔυ͕มԽΛड͚ೖΕΒΕΔΑ͏ʹ 1FSM1)1ɾ1ZUIPOɾ3VCZʹଓ͜͏ ेͳࣝͱܦݧΛ࣋ͭখنͳνʔϜͰൺֱతγ ϯϓϧͳγεςϜΛ։ൃ͢Δ߹ޮՌ͕ߴ͍ ෳࡶ͕ߴ͍γεςϜɾେنͳνʔϜɾಈతݴޠ
ʹෆ׳Εͳ߹ͳͲʹɺٯޮՌʹͳΔ߹
ΰʔετϥΠλʔ (IPTU8SJUFS New!! http://www.flickr.com/photos/striatic
ΰʔετϥΠλʔ (IPTU8SJUFS ΞϊςʔγϣϯΛϚʔΧʔͱͨ͠ɺ"45มʹΑΔ ίʔυੜΛར༻͢Δ ίʔυΛॻ͍ͯͳ͍ͷʹɺόΠτίʔυϨϕϧͰػೳ͕ Γࠐ·ΕΔ "45มͷྫ !*NNVUBCMF !-PH !%FMFHBUF
!-B[Z !4JOHMFUPO !#JOEBCMF !"VUP$MPOF !5JNFE*OUFSSVQU
ˏ-PH @groovy.util.logging.Log class Foo { def method() { log.info('info message')
log.fine('fine message') log.severe('severe message') } } new Foo().method() $ groovy astLog.groovy Nov 9, 2011 1:09:10 PM java_util_logging_Logger$info call INFO: info message Nov 9, 2011 1:09:10 PM java_util_logging_Logger$severe call SEVERE: severe message
ˏ*NNVUBCMF @Immutable class Foo { int x Date date =
new Date(1000) } def a = new Foo(x:1) assert a.x == 1 assert a.date.getTime() == 1000 a.date.setTime(2000) assert a.date.getTime() == 1000 a.x = 3 ޚతίϐʔ͞ΕΔͨ ΊɺΦϒδΣΫτͷঢ়ଶ Λมߋͯ͠ɺݩͷΦϒ δΣΫτʹӨڹͳ͍ ϑΟʔϧυʹ࠶ೖ͠Α͏ͱ͢Δͱ 3FBE0OMZ1SPQFSUZ&YDFQUJPO͕ൃੜ͢Δ
ˏ4JOHMFUPO @Singleton class Foo { def hello() { "hello" }
} assert Foo.instance.hello() == "hello" // => Caught: java.lang.RuntimeException: // Can't instantiate singleton Foo. Use Foo.instance new Foo() HFU*OTUBODF Λ௨ͯ͠औಘ͢Δ ࣗͰOFX͠Α͏ͱ͢Δͱ 3VOUJNF&YDFQUJPO͕ൃੜ͢Δ
ˏ%FMFHBUF class StringList { @Delegate List<String> list = new ArrayList<String>()
} def stringList = new StringList() stringList.add("A") stringList.add("B") assert stringList == ["A", "B"] stringList.each { print it } // => AB BEEϝιουఆ͍ٛͯ͠ͳ͍͕ɺ ϑΟʔϧυͷMJTUʹҕৡ͞Ε͍ͯΔ
ΦϦδφϧͷ"45มͭ͘ΕΔ @HelloWorld x $ groovy sample.groovy Hello, World! ΞϊςʔγϣϯͷΞϯΧʔϙΠϯ τͱͯ͠ͷμϛʔมએݴ
ΦϦδφϧͷ"45มͭ͘ΕΔ @GroovyASTTransformationClass("org.jggug.kobo.gastah.HelloWorldASTTransformation") @Retention(RetentionPolicy.RUNTIME) public @interface HelloWorld { String value() }
@GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION) class HelloWorldASTTransformation extends ClassCodeVisitorSupport implements ASTTransformation { SourceUnit sourceUnit // forced to override by super class public void visit(ASTNode[] nodes, SourceUnit source) { AnnotatedNode target = (AnnotatedNode) nodes[1] AnnotationNode includeAnnotation = (AnnotationNode) nodes[0] def additionNode = new AstBuilder().buildFromCode({ println "Hello, World!" })[0] def statements = additionNode.statements // ϒϩοΫͷશϦϓϨʔε source.getAST().getStatementBlock().getStatements().clear() source.getAST().getStatementBlock().getStatements().addAll(0, statements) } } https://github.com/nobeans/jggug-20110617 !)FMMP8PSME ͙Β͍ͳΒ ͜ͷ͙Β͍ͷ ίʔυྔͰ0,
খਓ͞ΜεΫϦϓτ )PVTF&MG
খਓ͞ΜεΫϦϓτ )PVTF&MG ϓϩδΣΫτͰར༻͢ΔछʑͷϢʔςΟϦςΟπʔ ϧΛ(SPPWZεΫϦϓτͱͯ͠ॻ͘ ϏϧυࣗಈԽɺ$*ɺσϓϩΠɺΠϯετʔϥɺαʔϏε ࢹɺ௨ɺ౷ܭɺυΩϡϝϯτੜɺػೳςετɺ )5.-εΫϨΠϐϯάɺςετ༻σʔλੜɺσʔλҠ ߦπʔϧͳͲͳͲ (SPPWZͷศར͕͞खͬऔΓૣ࣮͘ײͰ͖ɺϓϩδΣ Ϋτͷ(SPPWZͷཧղ͠Έਂ·Δ
͡Ίͯ(SPPWZಋೖΛࢼͯ͠ΈΔͱ͖ʹ͓͢͢Ί
˻͕࣌ؒ͋Ε˼ ຊ੯͘͠ϨΪϡϥʔ ݍ֎ʹ࿙Εͨύλʔϯ ؆୯ʹհ͠·͢
ϓϩτλΠϓ 1SPUPUZQF Old! http://www.flickr.com/photos/solarbotics
ϓϩτλΠϓ 1SPUPUZQF ৽ٕज़ΞϧΰϦζϜɺϢʔβΠϯλϑΣʔεͳͲ ͷ࣮ݱՄೳੑݕূͷͨΊͷϓϩτλΠϓ։ൃʹ (SPPWZ (SBJMTɺ(SJ⒎PO Λ༻͍Δ ։ൃͨ͠ϓϩτλΠϓɺཁ݅ʹԠͯ͡ඞཁͳΒҰ ෦·ͨશ෦Λ+BWBͰॻ͖͑ɺͦͷ··ɾೲ ೖγεςϜʹൃలͤͨ͞Γ
εϚʔτઃఆ 4NBSU$POGJHVSBUJPO Old!
εϚʔτઃఆ 4NBSU$POGJHVSBUJPO γεςϜͷઃఆϑΝΠϧͱͯ͠ɺ9.-ϓϩύςΟ ϑΝΠϧͰͳ͘(SPPWZεΫϦϓτΛ༻͍Δ (SPPWZͷ؆ܿͰಡΈ͍͢ه๏Λ׆͔ͨ͠ॊೈͳઃ ఆදݱ͕Ͱ͖Δ ܁Γฦ݅͠ذͳͲࣗવʹهड़Ͱ͖Δ (SPPWZͷશػೳ͕͑ΔͷͰɺڥʹಈతʹదԠ͢ ΔʮεϚʔτͳ ݡ͍
ʯઃఆΛهड़ͨ͠Γɺઃఆه ड़༻ͷઐ༻%4-Λಋೖ͢Δ͜ͱͰ͖Δ
(SPPWZ͕ɺԼࠀ্Λૂ͏ /FYU#JH+7.-BOHͰͳ ͘ɺ͋͘·Ͱ+BWBʹدΓఴ͏ ݈ؾͳଘࡏͰ͋Δ͜ͱ͕͏· ͓͑͘Ͱ͖ͨͰ͠ΐ͏͔ʁ
ࢀߟࢿྉ +BWB0OFͷൃදࢿྉ IUUQTPSBDMFVTXJOHBUFXFCDPNQVCMJTIFE PSBDMFVTTFTTJPOT4@QEG ϓϩάϥϛϯά(SPPWZʢٕज़ධࣾʣ IUUQHJIZPKQCPPL