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
33
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
29
OSS Product feat. Gradle
nobeans
1
39
Java開発の強力な相棒として今すぐ使えるGroovy
nobeans
0
63
Other Decks in Programming
See All in Programming
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
230
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
170
継続モナドとリアクティブプログラミング
yukikurage
3
590
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
150
act2-costs.pdf
sumedhbala
0
110
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
220
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
400
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
270
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
240
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.4k
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
200
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
0
110
Featured
See All Featured
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
410
Marketing to machines
jonoalderson
1
5.6k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Docker and Python
trallard
47
4k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
290
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
460
Side Projects
sachag
455
43k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Automating Front-end Workflow
addyosmani
1370
210k
Raft: Consensus for Rubyists
vanstee
141
7.6k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
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