Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
The report of JavaOne2011 about groovy
Search
Yasuharu Nakano
March 25, 2023
Programming
37
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
97
JavaOne2010 Groovy/Spring Roo
nobeans
0
66
Groovy's Builder
nobeans
0
43
How about Gradle?
nobeans
0
22
レッツゴーデベロッパー2011「プログラミングGroovy〜G*エコシステム編」
nobeans
0
22
JavaSE7 Launch Event: Java7xGroovy
nobeans
0
38
Gr8conf EU 2013 Speed up your development: GroovyServ and Grails Improx Plugin
nobeans
0
37
OSS Product feat. Gradle
nobeans
1
40
Java開発の強力な相棒として今すぐ使えるGroovy
nobeans
0
66
Other Decks in Programming
See All in Programming
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
370
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
170
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
330
ActionController meets Protocol Buffers
sorah
0
520
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
380
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
210
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
220
Verilogで学ぶCPU自作入門
uyuki234
8
4.1k
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
35
17k
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
2
640
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
300
ジョジョの世界をXRで再現する
mofurune
0
160
Featured
See All Featured
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
4
4.4k
エンジニアに許された特別な時間の終わり
watany
109
250k
Code Reviewing Like a Champion
maltzj
529
40k
Site-Speed That Sticks
csswizardry
13
1.6k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
800
First, design no harm
axbom
PRO
2
1.3k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Side Projects
sachag
456
43k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
The Cult of Friendly URLs
andyhume
79
7k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
330
Done Done
chrislema
187
17k
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