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
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
36
Gr8conf EU 2013 Speed up your development: GroovyServ and Grails Improx Plugin
nobeans
0
34
OSS Product feat. Gradle
nobeans
1
39
Java開発の強力な相棒として今すぐ使えるGroovy
nobeans
0
64
Other Decks in Programming
See All in Programming
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
610
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
240
自分的「カンファレンスの楽しみ方」
syumai
0
200
What We Talk About When We Talk About XP
m_seki
2
570
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.5k
アクセシビリティから考える情報設計
high_g_engineer
0
360
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
9
4k
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
440
スマート反転とウェブアクセシビリティ
camiha
0
200
AIエージェント時代のコードレビューを設計する
nogu66
6
2.7k
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
190
AI駆動開発にグラフDBを重ねてみた
satoshi256kbyte
2
790
Featured
See All Featured
Discover your Explorer Soul
emna__ayadi
2
1.3k
Optimizing for Happiness
mojombo
378
71k
So, you think you're a good person
axbom
PRO
2
2.2k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
850
Crafting Experiences
bethany
1
330
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
520
The agentic SEO stack - context over prompts
schlessera
0
930
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Documentation Writing (for coders)
carmenintech
77
5.5k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
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