SlideShare a Scribd company logo
to Infinity
                       and Beyond
mercredi 19 mai 2010
to infinity
                               and beyond!


                       Guillaume Laforge
                       SpringSource, a division of VMWare




mercredi 19 mai 2010
Guillaume Laforge
            Groovy Project Manager
                   on Groovy since 2003!
            JSR-241 Spec Lead
            Head of Groovy Development
            at SpringSource (division of VMWare)
            Initiator of the Grails framework
            Creator of the Gaelyk toolkit
            Co-author of Groovy in Action
            International speaker

mercredi 19 mai 2010
Agenda
            Past
                   Groovy 1.6 flashback


            Present
                   Groovy 1.7 novelties
                   A few Groovy 1.7.x refinements


            Future
                   What’s cooking for 1.8 and beyond


mercredi 19 mai 2010
looking into the Past
mercredi 19 mai 2010
Big highlights of Groovy 1.6
            Greater compile-time and runtime performance
            Multiple assignments
            Optional return for if/else and try/catch/finally
            Java 5 annotation definition
            AST Transformations
            The Grape module and dependency system
            Various Swing related improvements
            JMX Builder
            Metaprogramming additions
            JSR-223 scripting engine built-in
            Out-of-the-box OSGi support

mercredi 19 mai 2010
Multiple assignement
                       // multiple assignment
                       def (a, b) = [1, 2]
                       assert a == 1 && b == 2
                        
                       // with typed variables
                       def (int c, String d) = [3, "Hi"]
                       assert c == 3 && d == "Hi"
                        
                       def geocode(String place) { [48.8, 2.3] }
                       def lat, lng
                       // assignment to existing variables
                       (lat, lng) = geocode('Paris')
                        
                       // classical variable swaping example
                       (a, b) = [b, a]



mercredi 19 mai 2010
More optional return
                       // optional return for if statements
                       def m1() {
                           if (true) 1
                           else 0
                       }
                       assert m1() == 1
                        
                       // optional return for try/catch/finally
                       def m2(bool) {
                           try {
                               if (b) throw new Exception()
                               1
                           } catch (any) { 2 }
                            finally { 3 }
                        }
                        assert m2(true) == 2 && m2(false) == 1



mercredi 19 mai 2010
AST Transformation (1/2)
            Groovy 1.6 introduced AST Transformations
            AST: Abstract Syntax Tree
            Ability to change what’s being compiled by the
            Groovy compiler... at compile time
                   No runtime impact!
                   Change the semantics of your programs! Even hijack the
                   Groovy syntax!
                   Implementing recurring patterns in your code base
                   Remove boiler-plate code
            Two kinds: global and local (triggered by anno)

mercredi 19 mai 2010
AST Transformations (2/2)
            Transformations introduced in 1.6
                   @Singleton
                   @Immutable, @Lazy, @Delegate
                   @Newify
                   @Category, @Mixin
                   @PackageScope
                   Swing’s @Bindable and @Vetoable
                   Grape’s own @Grab




mercredi 19 mai 2010
@Immutable
            To properly implement immutable classes
                   No mutations — state musn’t change
                   Private final fields
                   Defensive copying of mutable components
                   Proper equals() / hashCode() / toString()
                   for comparisons or fas keys in maps
                       @Immutable class Coordinates {
                           Double lat, lng
                       }
                       def c1 = new Coordinates(lat: 48.8, lng: 2.5)
                       def c2 = new Coordinates(48.8, 2.5)
                       assert c1 == c2



mercredi 19 mai 2010
Grab a grape!
            Simple distribution and sharing of Groovy scripts
            Dependencies stored locally
                   Can even use your own local repositories

                       @Grab(group   = 'org.mortbay.jetty',
                             module  = 'jetty‐embedded',
                             version = '6.1.0')
                       def startServer() {
                           def srv = new Server(8080)
                                                                SIONS)
                           def ctx = new Context(srv , "/", SES
                           ctx.resourceBase = "."
                                                                 ovy")
                            ctx.addServlet(GroovyServlet, "*.gro
                           srv.start()
                       }




mercredi 19 mai 2010
Metaprogramming additions (1/2)
            ExpandoMetaClass DSL
                   factoring EMC changes


                       Number.metaClass {
                           multiply { Amount amount ‐> 
                               amount.times(delegate) 
                           }
                           div { Amount amount ‐> 
                               amount.inverse().times(delegate) 
                           }
                       }




mercredi 19 mai 2010
Metaprogramming additions (2/2)
            Runtime mixins
                       class FlyingAbility {
                           def fly() { "I'm ${name} and I fly!" }
                       }
                        
                       class JamesBondVehicle {
                           String getName() { "James Bond's vehicle" }
                       }
                        
                       JamesBondVehicle.mixin FlyingAbility
                        
                       assert new JamesBondVehicle().fly() ==
                           "I'm James Bond's vehicle and I fly!"




mercredi 19 mai 2010
JMX Builder
            A DSL for handling JMX
                   in addition of Groovy MBean
                         // Create a connector server
                         def jmx = new JmxBuilder()
                         jmx.connectorServer(port:9000).start()
                          
                         // Create a connector client
                         jmx.connectorClient(port:9000).connect()
                          
                         //Export a bean
                         jmx.export { bean new MyService() }
                          
                         // Defining a timer
                         jmx.timer(name: "jmx.builder:type=Timer", 
                             event: "heartbeat", period: "1s").start()
                          
                         // JMX listener
                         jmx.listener(event: "someEvent", from: "bean", 
                              call: { evt ‐> /* do something */ })

mercredi 19 mai 2010
into the Present...
mercredi 19 mai 2010
Big highlights of Groovy 1.7
            Anonymous Inner Classes and Nested Classes
            Annotations anywhere
            Grape improvements
            Power Asserts
            AST Viewer
            AST Builder
            Customize the Groovy Truth!
            Rewrite of the GroovyScriptEngine
            Groovy Console improvements
            SQL support refinements

mercredi 19 mai 2010
AIC and NC
            Anonymous Inner Classe and Nested Classes




mercredi 19 mai 2010
AIC and NC
            Anonymous Inner Classe and Nested Classes



                         For J  ava
                                pa  ste
                       co py’n
                            pa tibi lity
                       com
                           sak  e :-)


mercredi 19 mai 2010
Annonymous Inner Classes
                       bo olean called = false
                       Timer ti mer = new Timer()

                       timer.schedule(n ew TimerTask() {
                           void run() {
                                called = true
                           }
                       }, 0)

                       sleep 100
                       assert called




mercredi 19 mai 2010
Annonymous Inner Classes
                       bo olean called = false
                       Timer ti mer = new Timer()

                       timer.schedule(n ew TimerTask() {
                           void run() {
                                called = true
                           }
                                      { called = true }
                       }, 0)                            as TimerTask

                       sleep 100
                       assert called




mercredi 19 mai 2010
Nested Classes

                       class Environment {
                           static class Production
                                extends Environment {}
                           static class Development
                                extends Environment {}
                       }
                        
                       new Environment.Production()




mercredi 19 mai 2010
Anotations anywhere

            You can now put annotations
                   on imports
                   on packages
                   on variable declarations


            Examples with @Grab following...




mercredi 19 mai 2010
Grape improvements (1/3)
            @Grab on import

                       @Grab(group = 'net.sf.json‐lib', 
                            module = 'json‐lib', 
                           version = '2.3',
                        classifier = 'jdk15')
                       import net.sf.json.groovy.*
                        
                       assert new JsonSlurper().parseText(
                       new JsonGroovyBuilder().json {
                           book(title: "Groovy in Action", 
                               author:"Dierk König et al")
                                                                  ion"
                       }.toString()).book.title == "Groovy in Act




mercredi 19 mai 2010
Grape improvements (2/3)
            Shorter module / artifact / version parameter
                   Example of an annotation on a variable declaration


               @Grab('net.sf.json‐lib:json‐lib:2.3:jdk15')
                                                                      ()
               def builder = new net.sf.json.groovy.JsonGroovyBuilder

               def books = builder.books {
                                                                      nig")
                   book(title: "Groovy in Action", author: "Dierk Koe
               }
               assert books.toString() ==
                   '{"books":{"book":{"title":"Groovy in Action",' + 
                   '"author":"Dierk Koenig"}}}'''




mercredi 19 mai 2010
Grape improvements (3/3)
            Groovy 1.7 introduced Grab resolver
                   For when you need to specify a specific repository
                   for a given dependency


               @GrabResolver(
                   name = 'restlet.org',
                   root = 'http://maven.restlet.org')
               @Grab('org.restlet:org.restlet:1.1.6')
               import org.restlet.Restlet




mercredi 19 mai 2010
Power Asserts (1/2)
            Much better assert statement!
                   Invented and developed in the Spock framework


            Given this script...

               def energy = 7200 * 10**15 + 1
               def mass = 80
               def celerity = 300000000
                
               assert energy == mass * celerity ** 2


mercredi 19 mai 2010
Power Asserts (2/2)
            You’ll get a more comprehensible output




mercredi 19 mai 2010
Spock testing
                        framework
mercredi 19 mai 2010
Easier AST Transformations
            AST Transformations are a very powerful feature
            But are still rather hard to develop
                   Need to know the AST API closely


            To help with authoring your own transformations,
            we’ve introduced
                   the AST Viewer in the Groovy Console
                   the AST Builder




mercredi 19 mai 2010
AST Viewer




mercredi 19 mai 2010
AST Builder
              // Ability to build AST parts
              // ‐‐> from a String
              new AstBui lder().buildFromString(''' "Hello" ''')
               
              // ‐‐> from code
              new AstBuilder().buildFromCode { "Hello" }
               
              // ‐‐> from a specification
                                                                     {
              List<ASTNo de> nodes = new AstBuilder().buildFromSpec
                  block {
                      returnStatement {
                           constant "Hello"
                       }
                   }
               }



mercredi 19 mai 2010
Customize the Groovy Truth!
            Ability to customize the truth by implementing a
            boolean asBoolean() method

                  class Predicate {
                      boolean value
                      boolean asBoolean() { value }
                  }
                   
                  def tr uePred  = new Predicate(value: true)
                  def fals ePred = new Predicate(value: false)
                   
                  assert truePred && !falsePred



mercredi 19 mai 2010
SQL support refinements
           // batch statements
           sql.withBatch { stmt ‐>
                                                         e ‐>
              ["Paul", "Jochen", "Guillaume"].each { nam                 e)"
                  stmt.addBat ch "insert into PERSON (name) values ($nam
              }
           }
            
           // transaction support
           def persons = sql.dataSet("person")
           sql.withTransaction {
                persons.add name: "Paul"
                persons.add name: "Jochen"
                persons.add name: "Guillaume"
                 persons.add name: "Roshan"
            }




mercredi 19 mai 2010
Groovy 1.7.x changes

            Groovy 1.7.1 and 1.7.2 have been released
            Groovy 1.7.3 is coming soon

            Here’s what’s new!




mercredi 19 mai 2010
Map improvements
            // map auto‐vification
            def m = [:].withDefault { key ‐> "Default" }
            assert m['z'] == "Default" 
            assert m['a'] == "Default"

             // default sort
             m.sort()

              // sort with a comparator
              m.sort({ a, b ‐> a <=> b } as Comparator)




mercredi 19 mai 2010
XML back to String
            Ability to retrieve the XML string from a node
            from an XmlSlurper GPathResult
           def xml = """
           <books>
                <book isbn="12345">Groovy in Action</book>
           </books>
           """
           def root = new XmlSlurper().parseText(xml)
           def someNode = root.book
           def bu ilder = new StreamingMarkupBuilder()

            assert build er.bindNode(someNode).toString() ==
                    "<book  isbn='12345'>Groovy in Action</book>"



mercredi 19 mai 2010
Currying improvements
          // right currying
          def divide = { a, b ‐> a / b }
          def halver = divide.rcurry(2)
          assert halver(8) == 4
           
          // currying n‐th parameter
          def jo inWithSeparator = { one, sep, two ‐>
              one + sep + two
          }
          def joinWithComma = 
              jo inWithSeparator.ncurry(1, ', ')
           assert joinWithComma('a', 'b') == 'a, b'



mercredi 19 mai 2010
New icon for the Swing console




mercredi 19 mai 2010
New icon for the Swing console




mercredi 19 mai 2010
New String methods
                  println """                            println """
                      def method() {                         |def method() {
                          return 'bar'                       |    return 'bar'
                      }                                      |}
                  """.stripIndent()                      """.stripMargin('|')


                   // string "translation" (UNIX tr)
                   assert 'hello'.tr('z‐a', 'Z‐A') == 'HELLO'
                                                                    WAAAA!'
                   asse rt 'Hello World!'.tr('a‐z', 'A') == 'HAAAA
                                                                            2d!'
                   assert 'Hell o World!'.tr('lloo', '1234') == 'He224 W4r

                       // capitalize the first letter
                       assert 'h'.capitalize() == 'H'
                       assert 'hello'.capitalize() == 'Hello'
                                                                       rld'
                       asse rt 'hello world'.capitalize() == 'Hello wo
                                                                  mmand)
                       // tab/space (un)expansion (UNIX expand co
                                                                  7 8        '
                       assert '1234567t8t '.expand() == '123456
                                                                  '
                       assert '    x    '.unexpand() == '    xt 



mercredi 19 mai 2010
...and beyond!
mercredi 19 mai 2010
Groovy 1.8 & beyond
            Still subject to discussion
            Always evolving roadmap
            Things may change!




mercredi 19 mai 2010
What’s cooking?
mercredi 19 mai 2010
What we’re working on
            More runtime performance improvements
            Closure annotations
            Gradle build
            Modularizing Groovy
            Align with JDK 7 / Java 7 / Project Coin
            Enhanced DSL support
            AST Templates
            Towards MOP 2


mercredi 19 mai 2010
«Blackdrag»
 revealed
 the black magic!




mercredi 19 mai 2010
Closure annotations
            Groovy 1.5 brought Java 5 annotations
            What if... we could go beyond what Java offered?
                   In 1.7, we can put annotations on packages, imports and
                   variable declarations
                   But annotations are still limited in terms of parameters
                   they allow


            Here comes closure annotations!
                   Groovy 1.8 will give us the ability to access annotation
                   with closure parameters at runtime


mercredi 19 mai 2010
GContracts
            Closures are already allowed in the Groovy 1.7
            Antlr grammar
                   Andre Steingreß created GContracts,
                   a «design by contract» module
               // a class invariant
               @I nvariant({ name.size() > 0 && age > ageLimit() })
                
               // a method pre‐condition
               @Requires({ message != null })
                
               // a method post‐condition
               @Ensures({ returnResult % 2 == 0 })



mercredi 19 mai 2010
mercredi 19 mai 2010
mercredi 19 mai 2010
bu ild
                                dh oc     oo vy
                           ore a lar Gr
                         M       du        s!
                               o
                           e m rom H    an
                       Mor     ef
                          M or


mercredi 19 mai 2010
More modular build
            «Not everybody needs everything!» ™

            A lighter Groovy-core
                   what’s in groovy-all?


            Modules
                   test, jmx, swing, xml, sql, web, template
                   integration (bsf, jsr-223)
                   tools (groovydoc, groovyc, shell, console, java2groovy)


mercredi 19 mai 2010
Java 7 / JDK 7 / Project Coin
            JSR-292 InvokeDynamic
            Simple Closures?
            Proposals from Project Coin
                   Strings in switch
                   Automatic Resource Management
                   Improved generics type inference (diamond <>)
                   Simplified varargs method invocation
                   Better integral literals
                   Language support for collections


mercredi 19 mai 2010
Improved DSL support

            GEP-3: an extended command expression DSL
                   Groovy Extension Proposal #3
                   A Google Summer of Code student will work on that


            Command expressions
                   basically top-level statements without parens
                   combine named and non-named arguments in the mix
                       for nicer Domain-Specific Languages



mercredi 19 mai 2010
Before GEP-3
            The idea: extend command-expressions, beyond
            top-level statements, for chained method calls
            Before
                       send("Hello").to("Jochen")
                       send("Hello", from: "Guillaume").to("Jochen")

                       sell(100.shares).of(MSFT)

                       take(2.pills).of(chloroquinine).in(6.hours)

                       every(10.minutes).execute {  }

                       given { }.when { }.then { }

                       blend(red, green).of(acrylic)



mercredi 19 mai 2010
With GEP-3
            The idea: extend command-expressions, beyond
            top-level statements, for chained method calls
            After
                       send "Hello"  to "Jochen"
                       send "Hello", from: "Guillaume"  to "Jochen"

                       sell 100.shares  of MSFT

                       take 2.pills  of chloroquinine  in 6.hours

                       every 10.minutes  execute {  }

                       given { } when { } then { }

                       blend red, green  of acrylic



mercredi 19 mai 2010
With GEP-3
            The idea: extend command-expressions, beyond
            top-level statements, for chained method calls
            After
                       send "Hello"  to "Jochen"
                       send "Hello", from: "Guillaume"  to "Jochen"

                       sell 100.shares  of MSFT
                                                         Less
                                                              pare
                       take 2.pills  of chloroquinine  in 6.hours
                                                         & co     ns
                       every 10.minutes  execute {  }
                                                              mm
                       given { } when { } then { }               as
                       blend red, green  of acrylic



mercredi 19 mai 2010
AST Templates
            Since AST, it’s easier to write AST Transformations
                   But we can even do better!


            Hamlet D’Arcy is working on a new proposal
                   GEP-4 — AST Templates




mercredi 19 mai 2010
a new
    MOP


mercredi 19 mai 2010
Towards a new MOP?
            The Meta-Object Protocol show its age
                   different stratification layers
                       DGM, categories, custom MetaClasses, ExpandoMetaClass...
                   different characteristics
                       scope: global, local, thread-bound
                       works across the hierarchy or not
            A better MOP could...
                   help for performance
                   offer more granularity
                   let the developer choose the characteristics he needs
                   provide a layered approach of changes

mercredi 19 mai 2010
Some potential modules
            GPars was considered a potential module for
            addition into core
                   but got a life of its own!


            Parser combinators
                   for when you hit the walls of the Groovy syntax
                   and AST transformations won’t cut it


            Pattern matching


mercredi 19 mai 2010
Summary (1/2)
            No need to wait for Java 7, 8, 9...
                   closures, properties, interpolated strings, extended
                   annotations, metaprogramming, [YOU NAME IT]...




mercredi 19 mai 2010
Summary (1/2)
            No need to wait for Java 7, 8, 9...
                   closures, properties, interpolated strings, extended
                   annotations, metaprogramming, [YOU NAME IT]...



                                   oov y’s
                               Gr          ive
                                    no vat
                           sti ll in
                                     20 03!
                              si nce

mercredi 19 mai 2010
Summary (2/2)
            But it’s more than just a language, it’s a very rich
            and active ecosystem!
                   Grails, Griffon, Gradle, GPars, Spock, Gaelyk...




mercredi 19 mai 2010
Thanks for your attention!



                                           e
                                      aforg pment
                              ume L Develo
                       Guilla Groovy            om
                       He ad of      e@ gmail.c
                              glaforg rge
                        Email: @glafo
                                :
                        Twitter




mercredi 19 mai 2010
Questions & Answers




mercredi 19 mai 2010
Images used in this presentation
            House / past: http://www.flickr.com/photos/jasonepowell/3680030831/sizes/o/
            Present clock: http://www.flickr.com/photos/38629278@N04/3784344944/sizes/o/
            Future: http://www.flickr.com/photos/befuddledsenses/2904000882/sizes/l/
            Cooking: http://www.flickr.com/photos/eole/449958332/sizes/l/
            Black dragon: http://www.free-computer-wallpapers.com/pictures/Fantasy-wallpaper/Black_Dragon
            Puzzle: http://www.everystockphoto.com/photo.php?imageId=263521
            Light bulb: https://newsline.llnl.gov/retooling/mar/03.28.08_images/lightBulb.png
            Spock: http://altoladeira.files.wordpress.com/2009/07/spock2.jpg




mercredi 19 mai 2010

More Related Content

What's hot

Python-GTK
Python-GTKPython-GTK
Python-GTKYuren Ju
 
[JavaOne 2011] Models for Concurrent Programming
[JavaOne 2011] Models for Concurrent Programming[JavaOne 2011] Models for Concurrent Programming
[JavaOne 2011] Models for Concurrent ProgrammingTobias Lindaaker
 
Actor Concurrency
Actor ConcurrencyActor Concurrency
Actor Concurrency
Alex Miller
 
Google Go For Ruby Hackers
Google Go For Ruby HackersGoogle Go For Ruby Hackers
Google Go For Ruby Hackers
Eleanor McHugh
 
Java Concurrency Gotchas
Java Concurrency GotchasJava Concurrency Gotchas
Java Concurrency Gotchas
Alex Miller
 
Java Concurrency Idioms
Java Concurrency IdiomsJava Concurrency Idioms
Java Concurrency Idioms
Alex Miller
 
Java Concurrency Gotchas
Java Concurrency GotchasJava Concurrency Gotchas
Java Concurrency Gotchas
Alex Miller
 
Clojure concurrency overview
Clojure concurrency overviewClojure concurrency overview
Clojure concurrency overview
Sergey Stupin
 
JavaScript Patterns
JavaScript PatternsJavaScript Patterns
JavaScript Patterns
Giordano Scalzo
 
JNI 使用淺談
JNI 使用淺談JNI 使用淺談
JNI 使用淺談
KentPon Wang
 
2011.02.18 marco parenzan - modelli di programmazione per le gpu
2011.02.18   marco parenzan - modelli di programmazione per le gpu2011.02.18   marco parenzan - modelli di programmazione per le gpu
2011.02.18 marco parenzan - modelli di programmazione per le gpu
Marco Parenzan
 
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
A Brief History of UniRx/UniTask, IUniTaskSource in DepthA Brief History of UniRx/UniTask, IUniTaskSource in Depth
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
Yoshifumi Kawai
 
Gor Nishanov, C++ Coroutines – a negative overhead abstraction
Gor Nishanov,  C++ Coroutines – a negative overhead abstractionGor Nishanov,  C++ Coroutines – a negative overhead abstraction
Gor Nishanov, C++ Coroutines – a negative overhead abstraction
Sergey Platonov
 
Java 5 concurrency
Java 5 concurrencyJava 5 concurrency
Java 5 concurrencypriyank09
 
front-end dev
front-end devfront-end dev
front-end dev
Paul Comanici
 
Golang concurrency design
Golang concurrency designGolang concurrency design
Golang concurrency design
Hyejong
 
04 - Qt Data
04 - Qt Data04 - Qt Data
04 - Qt Data
Andreas Jakl
 
Box2D with SIMD in JavaScript
Box2D with SIMD in JavaScriptBox2D with SIMD in JavaScript
Box2D with SIMD in JavaScript
Intel® Software
 
Java 7 JUG Summer Camp
Java 7 JUG Summer CampJava 7 JUG Summer Camp
Java 7 JUG Summer Camp
julien.ponge
 

What's hot (19)

Python-GTK
Python-GTKPython-GTK
Python-GTK
 
[JavaOne 2011] Models for Concurrent Programming
[JavaOne 2011] Models for Concurrent Programming[JavaOne 2011] Models for Concurrent Programming
[JavaOne 2011] Models for Concurrent Programming
 
Actor Concurrency
Actor ConcurrencyActor Concurrency
Actor Concurrency
 
Google Go For Ruby Hackers
Google Go For Ruby HackersGoogle Go For Ruby Hackers
Google Go For Ruby Hackers
 
Java Concurrency Gotchas
Java Concurrency GotchasJava Concurrency Gotchas
Java Concurrency Gotchas
 
Java Concurrency Idioms
Java Concurrency IdiomsJava Concurrency Idioms
Java Concurrency Idioms
 
Java Concurrency Gotchas
Java Concurrency GotchasJava Concurrency Gotchas
Java Concurrency Gotchas
 
Clojure concurrency overview
Clojure concurrency overviewClojure concurrency overview
Clojure concurrency overview
 
JavaScript Patterns
JavaScript PatternsJavaScript Patterns
JavaScript Patterns
 
JNI 使用淺談
JNI 使用淺談JNI 使用淺談
JNI 使用淺談
 
2011.02.18 marco parenzan - modelli di programmazione per le gpu
2011.02.18   marco parenzan - modelli di programmazione per le gpu2011.02.18   marco parenzan - modelli di programmazione per le gpu
2011.02.18 marco parenzan - modelli di programmazione per le gpu
 
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
A Brief History of UniRx/UniTask, IUniTaskSource in DepthA Brief History of UniRx/UniTask, IUniTaskSource in Depth
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
 
Gor Nishanov, C++ Coroutines – a negative overhead abstraction
Gor Nishanov,  C++ Coroutines – a negative overhead abstractionGor Nishanov,  C++ Coroutines – a negative overhead abstraction
Gor Nishanov, C++ Coroutines – a negative overhead abstraction
 
Java 5 concurrency
Java 5 concurrencyJava 5 concurrency
Java 5 concurrency
 
front-end dev
front-end devfront-end dev
front-end dev
 
Golang concurrency design
Golang concurrency designGolang concurrency design
Golang concurrency design
 
04 - Qt Data
04 - Qt Data04 - Qt Data
04 - Qt Data
 
Box2D with SIMD in JavaScript
Box2D with SIMD in JavaScriptBox2D with SIMD in JavaScript
Box2D with SIMD in JavaScript
 
Java 7 JUG Summer Camp
Java 7 JUG Summer CampJava 7 JUG Summer Camp
Java 7 JUG Summer Camp
 

Similar to Groovy to infinity and beyond - GR8Conf Europe 2010 - Guillaume Laforge

Groovy: to Infinity and Beyond -- JavaOne 2010 -- Guillaume Laforge
Groovy: to Infinity and Beyond -- JavaOne 2010 -- Guillaume LaforgeGroovy: to Infinity and Beyond -- JavaOne 2010 -- Guillaume Laforge
Groovy: to Infinity and Beyond -- JavaOne 2010 -- Guillaume Laforge
Guillaume Laforge
 
Groovy Update, Groovy Ecosystem, and Gaelyk -- Devoxx 2010 -- Guillaume Laforge
Groovy Update, Groovy Ecosystem, and Gaelyk -- Devoxx 2010 -- Guillaume LaforgeGroovy Update, Groovy Ecosystem, and Gaelyk -- Devoxx 2010 -- Guillaume Laforge
Groovy Update, Groovy Ecosystem, and Gaelyk -- Devoxx 2010 -- Guillaume Laforge
Guillaume Laforge
 
GR8Conf 2009: Groovy Usage Patterns by Dierk König
GR8Conf 2009: Groovy Usage Patterns by Dierk KönigGR8Conf 2009: Groovy Usage Patterns by Dierk König
GR8Conf 2009: Groovy Usage Patterns by Dierk König
GR8Conf
 
Clojure And Swing
Clojure And SwingClojure And Swing
Clojure And Swing
Skills Matter
 
do ruby ao golang: o que aprendi criando um microserviço depois de 5000 commits
do ruby ao golang: o que aprendi criando um microserviço depois de 5000 commitsdo ruby ao golang: o que aprendi criando um microserviço depois de 5000 commits
do ruby ao golang: o que aprendi criando um microserviço depois de 5000 commits
AndreLeoni1
 
GR8Conf 2009: What's New in Groovy 1.6? by Guillaume Laforge
GR8Conf 2009: What's New in Groovy 1.6? by Guillaume LaforgeGR8Conf 2009: What's New in Groovy 1.6? by Guillaume Laforge
GR8Conf 2009: What's New in Groovy 1.6? by Guillaume Laforge
GR8Conf
 
Groovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume Laforge
Groovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume LaforgeGroovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume Laforge
Groovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume LaforgeGuillaume Laforge
 
Building android apps with kotlin
Building android apps with kotlinBuilding android apps with kotlin
Building android apps with kotlin
Shem Magnezi
 
Living in harmony - a brief into to ES6
Living in harmony - a brief into to ES6Living in harmony - a brief into to ES6
Living in harmony - a brief into to ES6
Richard Leland
 
MiamiJS - The Future of JavaScript
MiamiJS - The Future of JavaScriptMiamiJS - The Future of JavaScript
MiamiJS - The Future of JavaScript
Caridy Patino
 
What is new with JavaScript in Gnome: The 2021 edition
What is new with JavaScript in Gnome: The 2021 editionWhat is new with JavaScript in Gnome: The 2021 edition
What is new with JavaScript in Gnome: The 2021 edition
Igalia
 
Groovy And Grails JUG Trento
Groovy And Grails JUG TrentoGroovy And Grails JUG Trento
Groovy And Grails JUG Trento
John Leach
 
Go 1.10 Release Party - PDX Go
Go 1.10 Release Party - PDX GoGo 1.10 Release Party - PDX Go
Go 1.10 Release Party - PDX Go
Rodolfo Carvalho
 
Oscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast LaneOscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast Lane
Andres Almiray
 
Groovy Testing
Groovy TestingGroovy Testing
Groovy Testing
Davide Rossi
 
Gradle in 45min - JBCN2-16 version
Gradle in 45min - JBCN2-16 versionGradle in 45min - JBCN2-16 version
Gradle in 45min - JBCN2-16 version
Schalk Cronjé
 
Introduction to the Java bytecode - So@t - 20130924
Introduction to the Java bytecode - So@t - 20130924Introduction to the Java bytecode - So@t - 20130924
Introduction to the Java bytecode - So@t - 20130924yohanbeschi
 
クラウド・アプリケーション・アーキテクチャ
クラウド・アプリケーション・アーキテクチャクラウド・アプリケーション・アーキテクチャ
クラウド・アプリケーション・アーキテクチャTomoharu ASAMI
 

Similar to Groovy to infinity and beyond - GR8Conf Europe 2010 - Guillaume Laforge (20)

Groovy: to Infinity and Beyond -- JavaOne 2010 -- Guillaume Laforge
Groovy: to Infinity and Beyond -- JavaOne 2010 -- Guillaume LaforgeGroovy: to Infinity and Beyond -- JavaOne 2010 -- Guillaume Laforge
Groovy: to Infinity and Beyond -- JavaOne 2010 -- Guillaume Laforge
 
Groovy Update, Groovy Ecosystem, and Gaelyk -- Devoxx 2010 -- Guillaume Laforge
Groovy Update, Groovy Ecosystem, and Gaelyk -- Devoxx 2010 -- Guillaume LaforgeGroovy Update, Groovy Ecosystem, and Gaelyk -- Devoxx 2010 -- Guillaume Laforge
Groovy Update, Groovy Ecosystem, and Gaelyk -- Devoxx 2010 -- Guillaume Laforge
 
What's New in Groovy 1.6?
What's New in Groovy 1.6?What's New in Groovy 1.6?
What's New in Groovy 1.6?
 
GR8Conf 2009: Groovy Usage Patterns by Dierk König
GR8Conf 2009: Groovy Usage Patterns by Dierk KönigGR8Conf 2009: Groovy Usage Patterns by Dierk König
GR8Conf 2009: Groovy Usage Patterns by Dierk König
 
Clojure And Swing
Clojure And SwingClojure And Swing
Clojure And Swing
 
Os Secoske
Os SecoskeOs Secoske
Os Secoske
 
do ruby ao golang: o que aprendi criando um microserviço depois de 5000 commits
do ruby ao golang: o que aprendi criando um microserviço depois de 5000 commitsdo ruby ao golang: o que aprendi criando um microserviço depois de 5000 commits
do ruby ao golang: o que aprendi criando um microserviço depois de 5000 commits
 
GR8Conf 2009: What's New in Groovy 1.6? by Guillaume Laforge
GR8Conf 2009: What's New in Groovy 1.6? by Guillaume LaforgeGR8Conf 2009: What's New in Groovy 1.6? by Guillaume Laforge
GR8Conf 2009: What's New in Groovy 1.6? by Guillaume Laforge
 
Groovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume Laforge
Groovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume LaforgeGroovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume Laforge
Groovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume Laforge
 
Building android apps with kotlin
Building android apps with kotlinBuilding android apps with kotlin
Building android apps with kotlin
 
Living in harmony - a brief into to ES6
Living in harmony - a brief into to ES6Living in harmony - a brief into to ES6
Living in harmony - a brief into to ES6
 
MiamiJS - The Future of JavaScript
MiamiJS - The Future of JavaScriptMiamiJS - The Future of JavaScript
MiamiJS - The Future of JavaScript
 
What is new with JavaScript in Gnome: The 2021 edition
What is new with JavaScript in Gnome: The 2021 editionWhat is new with JavaScript in Gnome: The 2021 edition
What is new with JavaScript in Gnome: The 2021 edition
 
Groovy And Grails JUG Trento
Groovy And Grails JUG TrentoGroovy And Grails JUG Trento
Groovy And Grails JUG Trento
 
Go 1.10 Release Party - PDX Go
Go 1.10 Release Party - PDX GoGo 1.10 Release Party - PDX Go
Go 1.10 Release Party - PDX Go
 
Oscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast LaneOscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast Lane
 
Groovy Testing
Groovy TestingGroovy Testing
Groovy Testing
 
Gradle in 45min - JBCN2-16 version
Gradle in 45min - JBCN2-16 versionGradle in 45min - JBCN2-16 version
Gradle in 45min - JBCN2-16 version
 
Introduction to the Java bytecode - So@t - 20130924
Introduction to the Java bytecode - So@t - 20130924Introduction to the Java bytecode - So@t - 20130924
Introduction to the Java bytecode - So@t - 20130924
 
クラウド・アプリケーション・アーキテクチャ
クラウド・アプリケーション・アーキテクチャクラウド・アプリケーション・アーキテクチャ
クラウド・アプリケーション・アーキテクチャ
 

More from Guillaume Laforge

Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013
Guillaume Laforge
 
Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013
Guillaume Laforge
 
Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013
Guillaume Laforge
 
Groovy 2 and beyond
Groovy 2 and beyondGroovy 2 and beyond
Groovy 2 and beyond
Guillaume Laforge
 
Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012Guillaume Laforge
 
Groovy 2.0 webinar
Groovy 2.0 webinarGroovy 2.0 webinar
Groovy 2.0 webinar
Guillaume Laforge
 
Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012
Guillaume Laforge
 
Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012
Guillaume Laforge
 
JavaOne 2012 Groovy update
JavaOne 2012 Groovy updateJavaOne 2012 Groovy update
JavaOne 2012 Groovy update
Guillaume Laforge
 
Groovy 1.8 et 2.0 au BreizhC@mp 2012
Groovy 1.8 et 2.0 au BreizhC@mp 2012Groovy 1.8 et 2.0 au BreizhC@mp 2012
Groovy 1.8 et 2.0 au BreizhC@mp 2012Guillaume Laforge
 
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012Guillaume Laforge
 
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume LaforgeGroovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
Guillaume Laforge
 
Going to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific LanguagesGoing to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific Languages
Guillaume Laforge
 
Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012
Guillaume Laforge
 
Whats new in Groovy 2.0?
Whats new in Groovy 2.0?Whats new in Groovy 2.0?
Whats new in Groovy 2.0?
Guillaume Laforge
 
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011Guillaume Laforge
 
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGuillaume Laforge
 
Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011
Guillaume Laforge
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Guillaume Laforge
 
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Guillaume Laforge
 

More from Guillaume Laforge (20)

Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013
 
Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013
 
Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013
 
Groovy 2 and beyond
Groovy 2 and beyondGroovy 2 and beyond
Groovy 2 and beyond
 
Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012
 
Groovy 2.0 webinar
Groovy 2.0 webinarGroovy 2.0 webinar
Groovy 2.0 webinar
 
Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012
 
Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012
 
JavaOne 2012 Groovy update
JavaOne 2012 Groovy updateJavaOne 2012 Groovy update
JavaOne 2012 Groovy update
 
Groovy 1.8 et 2.0 au BreizhC@mp 2012
Groovy 1.8 et 2.0 au BreizhC@mp 2012Groovy 1.8 et 2.0 au BreizhC@mp 2012
Groovy 1.8 et 2.0 au BreizhC@mp 2012
 
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
 
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume LaforgeGroovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
 
Going to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific LanguagesGoing to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific Languages
 
Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012
 
Whats new in Groovy 2.0?
Whats new in Groovy 2.0?Whats new in Groovy 2.0?
Whats new in Groovy 2.0?
 
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
 
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
 
Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
 
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
 

Recently uploaded

Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Paige Cruz
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
Sri Ambati
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
Safe Software
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
Ralf Eggert
 
Removing Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software FuzzingRemoving Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software Fuzzing
Aftab Hussain
 
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
James Anderson
 
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex ProofszkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
Alex Pruden
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
UiPathCommunity
 
UiPath Community Day Dubai: AI at Work..
UiPath Community Day Dubai: AI at Work..UiPath Community Day Dubai: AI at Work..
UiPath Community Day Dubai: AI at Work..
UiPathCommunity
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
ControlCase
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdfSAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
Peter Spielvogel
 
Video Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the FutureVideo Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the Future
Alpen-Adria-Universität
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
Dorra BARTAGUIZ
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance
 

Recently uploaded (20)

Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
 
Removing Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software FuzzingRemoving Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software Fuzzing
 
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
 
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex ProofszkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
 
UiPath Community Day Dubai: AI at Work..
UiPath Community Day Dubai: AI at Work..UiPath Community Day Dubai: AI at Work..
UiPath Community Day Dubai: AI at Work..
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdfSAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
 
Video Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the FutureVideo Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the Future
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
 

Groovy to infinity and beyond - GR8Conf Europe 2010 - Guillaume Laforge

  • 1. to Infinity and Beyond mercredi 19 mai 2010
  • 2. to infinity and beyond! Guillaume Laforge SpringSource, a division of VMWare mercredi 19 mai 2010
  • 3. Guillaume Laforge Groovy Project Manager on Groovy since 2003! JSR-241 Spec Lead Head of Groovy Development at SpringSource (division of VMWare) Initiator of the Grails framework Creator of the Gaelyk toolkit Co-author of Groovy in Action International speaker mercredi 19 mai 2010
  • 4. Agenda Past Groovy 1.6 flashback Present Groovy 1.7 novelties A few Groovy 1.7.x refinements Future What’s cooking for 1.8 and beyond mercredi 19 mai 2010
  • 5. looking into the Past mercredi 19 mai 2010
  • 6. Big highlights of Groovy 1.6 Greater compile-time and runtime performance Multiple assignments Optional return for if/else and try/catch/finally Java 5 annotation definition AST Transformations The Grape module and dependency system Various Swing related improvements JMX Builder Metaprogramming additions JSR-223 scripting engine built-in Out-of-the-box OSGi support mercredi 19 mai 2010
  • 7. Multiple assignement // multiple assignment def (a, b) = [1, 2] assert a == 1 && b == 2   // with typed variables def (int c, String d) = [3, "Hi"] assert c == 3 && d == "Hi"   def geocode(String place) { [48.8, 2.3] } def lat, lng // assignment to existing variables (lat, lng) = geocode('Paris')   // classical variable swaping example (a, b) = [b, a] mercredi 19 mai 2010
  • 8. More optional return // optional return for if statements def m1() {     if (true) 1     else 0 } assert m1() == 1   // optional return for try/catch/finally def m2(bool) {     try {         if (b) throw new Exception()         1     } catch (any) { 2 }     finally { 3 } } assert m2(true) == 2 && m2(false) == 1 mercredi 19 mai 2010
  • 9. AST Transformation (1/2) Groovy 1.6 introduced AST Transformations AST: Abstract Syntax Tree Ability to change what’s being compiled by the Groovy compiler... at compile time No runtime impact! Change the semantics of your programs! Even hijack the Groovy syntax! Implementing recurring patterns in your code base Remove boiler-plate code Two kinds: global and local (triggered by anno) mercredi 19 mai 2010
  • 10. AST Transformations (2/2) Transformations introduced in 1.6 @Singleton @Immutable, @Lazy, @Delegate @Newify @Category, @Mixin @PackageScope Swing’s @Bindable and @Vetoable Grape’s own @Grab mercredi 19 mai 2010
  • 11. @Immutable To properly implement immutable classes No mutations — state musn’t change Private final fields Defensive copying of mutable components Proper equals() / hashCode() / toString() for comparisons or fas keys in maps @Immutable class Coordinates {     Double lat, lng } def c1 = new Coordinates(lat: 48.8, lng: 2.5) def c2 = new Coordinates(48.8, 2.5) assert c1 == c2 mercredi 19 mai 2010
  • 12. Grab a grape! Simple distribution and sharing of Groovy scripts Dependencies stored locally Can even use your own local repositories @Grab(group   = 'org.mortbay.jetty',       module  = 'jetty‐embedded',       version = '6.1.0') def startServer() {     def srv = new Server(8080) SIONS)     def ctx = new Context(srv , "/", SES     ctx.resourceBase = "." ovy")      ctx.addServlet(GroovyServlet, "*.gro     srv.start() } mercredi 19 mai 2010
  • 13. Metaprogramming additions (1/2) ExpandoMetaClass DSL factoring EMC changes Number.metaClass {     multiply { Amount amount ‐>          amount.times(delegate)      }     div { Amount amount ‐>          amount.inverse().times(delegate)      } } mercredi 19 mai 2010
  • 14. Metaprogramming additions (2/2) Runtime mixins class FlyingAbility {     def fly() { "I'm ${name} and I fly!" } }   class JamesBondVehicle {     String getName() { "James Bond's vehicle" } }   JamesBondVehicle.mixin FlyingAbility   assert new JamesBondVehicle().fly() ==     "I'm James Bond's vehicle and I fly!" mercredi 19 mai 2010
  • 15. JMX Builder A DSL for handling JMX in addition of Groovy MBean // Create a connector server def jmx = new JmxBuilder() jmx.connectorServer(port:9000).start()   // Create a connector client jmx.connectorClient(port:9000).connect()   //Export a bean jmx.export { bean new MyService() }   // Defining a timer jmx.timer(name: "jmx.builder:type=Timer",      event: "heartbeat", period: "1s").start()   // JMX listener jmx.listener(event: "someEvent", from: "bean",      call: { evt ‐> /* do something */ }) mercredi 19 mai 2010
  • 17. Big highlights of Groovy 1.7 Anonymous Inner Classes and Nested Classes Annotations anywhere Grape improvements Power Asserts AST Viewer AST Builder Customize the Groovy Truth! Rewrite of the GroovyScriptEngine Groovy Console improvements SQL support refinements mercredi 19 mai 2010
  • 18. AIC and NC Anonymous Inner Classe and Nested Classes mercredi 19 mai 2010
  • 19. AIC and NC Anonymous Inner Classe and Nested Classes For J ava pa ste co py’n pa tibi lity com sak e :-) mercredi 19 mai 2010
  • 20. Annonymous Inner Classes bo olean called = false Timer ti mer = new Timer() timer.schedule(n ew TimerTask() {     void run() {          called = true     } }, 0) sleep 100 assert called mercredi 19 mai 2010
  • 21. Annonymous Inner Classes bo olean called = false Timer ti mer = new Timer() timer.schedule(n ew TimerTask() {     void run() {          called = true     } { called = true } }, 0) as TimerTask sleep 100 assert called mercredi 19 mai 2010
  • 22. Nested Classes class Environment {     static class Production          extends Environment {}     static class Development          extends Environment {} }   new Environment.Production() mercredi 19 mai 2010
  • 23. Anotations anywhere You can now put annotations on imports on packages on variable declarations Examples with @Grab following... mercredi 19 mai 2010
  • 24. Grape improvements (1/3) @Grab on import @Grab(group = 'net.sf.json‐lib',       module = 'json‐lib',      version = '2.3',  classifier = 'jdk15') import net.sf.json.groovy.*   assert new JsonSlurper().parseText( new JsonGroovyBuilder().json {     book(title: "Groovy in Action",          author:"Dierk König et al") ion" }.toString()).book.title == "Groovy in Act mercredi 19 mai 2010
  • 25. Grape improvements (2/3) Shorter module / artifact / version parameter Example of an annotation on a variable declaration @Grab('net.sf.json‐lib:json‐lib:2.3:jdk15') () def builder = new net.sf.json.groovy.JsonGroovyBuilder def books = builder.books { nig")     book(title: "Groovy in Action", author: "Dierk Koe } assert books.toString() ==     '{"books":{"book":{"title":"Groovy in Action",' +      '"author":"Dierk Koenig"}}}''' mercredi 19 mai 2010
  • 26. Grape improvements (3/3) Groovy 1.7 introduced Grab resolver For when you need to specify a specific repository for a given dependency @GrabResolver(     name = 'restlet.org',     root = 'http://maven.restlet.org') @Grab('org.restlet:org.restlet:1.1.6') import org.restlet.Restlet mercredi 19 mai 2010
  • 27. Power Asserts (1/2) Much better assert statement! Invented and developed in the Spock framework Given this script... def energy = 7200 * 10**15 + 1 def mass = 80 def celerity = 300000000   assert energy == mass * celerity ** 2 mercredi 19 mai 2010
  • 28. Power Asserts (2/2) You’ll get a more comprehensible output mercredi 19 mai 2010
  • 29. Spock testing framework mercredi 19 mai 2010
  • 30. Easier AST Transformations AST Transformations are a very powerful feature But are still rather hard to develop Need to know the AST API closely To help with authoring your own transformations, we’ve introduced the AST Viewer in the Groovy Console the AST Builder mercredi 19 mai 2010
  • 32. AST Builder // Ability to build AST parts // ‐‐> from a String new AstBui lder().buildFromString(''' "Hello" ''')   // ‐‐> from code new AstBuilder().buildFromCode { "Hello" }   // ‐‐> from a specification  { List<ASTNo de> nodes = new AstBuilder().buildFromSpec     block {         returnStatement {             constant "Hello"         }     } } mercredi 19 mai 2010
  • 33. Customize the Groovy Truth! Ability to customize the truth by implementing a boolean asBoolean() method class Predicate {     boolean value     boolean asBoolean() { value } }   def tr uePred  = new Predicate(value: true) def fals ePred = new Predicate(value: false)   assert truePred && !falsePred mercredi 19 mai 2010
  • 34. SQL support refinements // batch statements sql.withBatch { stmt ‐> e ‐> ["Paul", "Jochen", "Guillaume"].each { nam e)"  stmt.addBat ch "insert into PERSON (name) values ($nam } }   // transaction support def persons = sql.dataSet("person") sql.withTransaction {   persons.add name: "Paul"   persons.add name: "Jochen"   persons.add name: "Guillaume"   persons.add name: "Roshan" } mercredi 19 mai 2010
  • 35. Groovy 1.7.x changes Groovy 1.7.1 and 1.7.2 have been released Groovy 1.7.3 is coming soon Here’s what’s new! mercredi 19 mai 2010
  • 36. Map improvements // map auto‐vification def m = [:].withDefault { key ‐> "Default" } assert m['z'] == "Default"  assert m['a'] == "Default" // default sort m.sort() // sort with a comparator m.sort({ a, b ‐> a <=> b } as Comparator) mercredi 19 mai 2010
  • 37. XML back to String Ability to retrieve the XML string from a node from an XmlSlurper GPathResult def xml = """ <books>      <book isbn="12345">Groovy in Action</book> </books> """ def root = new XmlSlurper().parseText(xml) def someNode = root.book def bu ilder = new StreamingMarkupBuilder() assert build er.bindNode(someNode).toString() ==         "<book  isbn='12345'>Groovy in Action</book>" mercredi 19 mai 2010
  • 38. Currying improvements // right currying def divide = { a, b ‐> a / b } def halver = divide.rcurry(2) assert halver(8) == 4   // currying n‐th parameter def jo inWithSeparator = { one, sep, two ‐>     one + sep + two } def joinWithComma =      jo inWithSeparator.ncurry(1, ', ') assert joinWithComma('a', 'b') == 'a, b' mercredi 19 mai 2010
  • 39. New icon for the Swing console mercredi 19 mai 2010
  • 40. New icon for the Swing console mercredi 19 mai 2010
  • 41. New String methods println """ println """     def method() {     |def method() {         return 'bar'     |    return 'bar'     }     |} """.stripIndent() """.stripMargin('|') // string "translation" (UNIX tr) assert 'hello'.tr('z‐a', 'Z‐A') == 'HELLO'  WAAAA!' asse rt 'Hello World!'.tr('a‐z', 'A') == 'HAAAA 2d!' assert 'Hell o World!'.tr('lloo', '1234') == 'He224 W4r // capitalize the first letter assert 'h'.capitalize() == 'H' assert 'hello'.capitalize() == 'Hello' rld' asse rt 'hello world'.capitalize() == 'Hello wo mmand) // tab/space (un)expansion (UNIX expand co 7 8        ' assert '1234567t8t '.expand() == '123456 ' assert '    x    '.unexpand() == '    xt  mercredi 19 mai 2010
  • 43. Groovy 1.8 & beyond Still subject to discussion Always evolving roadmap Things may change! mercredi 19 mai 2010
  • 45. What we’re working on More runtime performance improvements Closure annotations Gradle build Modularizing Groovy Align with JDK 7 / Java 7 / Project Coin Enhanced DSL support AST Templates Towards MOP 2 mercredi 19 mai 2010
  • 46. «Blackdrag» revealed the black magic! mercredi 19 mai 2010
  • 47. Closure annotations Groovy 1.5 brought Java 5 annotations What if... we could go beyond what Java offered? In 1.7, we can put annotations on packages, imports and variable declarations But annotations are still limited in terms of parameters they allow Here comes closure annotations! Groovy 1.8 will give us the ability to access annotation with closure parameters at runtime mercredi 19 mai 2010
  • 48. GContracts Closures are already allowed in the Groovy 1.7 Antlr grammar Andre Steingreß created GContracts, a «design by contract» module // a class invariant @I nvariant({ name.size() > 0 && age > ageLimit() })   // a method pre‐condition @Requires({ message != null })   // a method post‐condition @Ensures({ returnResult % 2 == 0 }) mercredi 19 mai 2010
  • 51. bu ild dh oc oo vy ore a lar Gr M du s! o e m rom H an Mor ef M or mercredi 19 mai 2010
  • 52. More modular build «Not everybody needs everything!» ™ A lighter Groovy-core what’s in groovy-all? Modules test, jmx, swing, xml, sql, web, template integration (bsf, jsr-223) tools (groovydoc, groovyc, shell, console, java2groovy) mercredi 19 mai 2010
  • 53. Java 7 / JDK 7 / Project Coin JSR-292 InvokeDynamic Simple Closures? Proposals from Project Coin Strings in switch Automatic Resource Management Improved generics type inference (diamond <>) Simplified varargs method invocation Better integral literals Language support for collections mercredi 19 mai 2010
  • 54. Improved DSL support GEP-3: an extended command expression DSL Groovy Extension Proposal #3 A Google Summer of Code student will work on that Command expressions basically top-level statements without parens combine named and non-named arguments in the mix for nicer Domain-Specific Languages mercredi 19 mai 2010
  • 55. Before GEP-3 The idea: extend command-expressions, beyond top-level statements, for chained method calls Before send("Hello").to("Jochen") send("Hello", from: "Guillaume").to("Jochen") sell(100.shares).of(MSFT) take(2.pills).of(chloroquinine).in(6.hours) every(10.minutes).execute {  } given { }.when { }.then { } blend(red, green).of(acrylic) mercredi 19 mai 2010
  • 56. With GEP-3 The idea: extend command-expressions, beyond top-level statements, for chained method calls After send "Hello"  to "Jochen" send "Hello", from: "Guillaume"  to "Jochen" sell 100.shares  of MSFT take 2.pills  of chloroquinine  in 6.hours every 10.minutes  execute {  } given { } when { } then { } blend red, green  of acrylic mercredi 19 mai 2010
  • 57. With GEP-3 The idea: extend command-expressions, beyond top-level statements, for chained method calls After send "Hello"  to "Jochen" send "Hello", from: "Guillaume"  to "Jochen" sell 100.shares  of MSFT Less pare take 2.pills  of chloroquinine  in 6.hours & co ns every 10.minutes  execute {  } mm given { } when { } then { } as blend red, green  of acrylic mercredi 19 mai 2010
  • 58. AST Templates Since AST, it’s easier to write AST Transformations But we can even do better! Hamlet D’Arcy is working on a new proposal GEP-4 — AST Templates mercredi 19 mai 2010
  • 59. a new MOP mercredi 19 mai 2010
  • 60. Towards a new MOP? The Meta-Object Protocol show its age different stratification layers DGM, categories, custom MetaClasses, ExpandoMetaClass... different characteristics scope: global, local, thread-bound works across the hierarchy or not A better MOP could... help for performance offer more granularity let the developer choose the characteristics he needs provide a layered approach of changes mercredi 19 mai 2010
  • 61. Some potential modules GPars was considered a potential module for addition into core but got a life of its own! Parser combinators for when you hit the walls of the Groovy syntax and AST transformations won’t cut it Pattern matching mercredi 19 mai 2010
  • 62. Summary (1/2) No need to wait for Java 7, 8, 9... closures, properties, interpolated strings, extended annotations, metaprogramming, [YOU NAME IT]... mercredi 19 mai 2010
  • 63. Summary (1/2) No need to wait for Java 7, 8, 9... closures, properties, interpolated strings, extended annotations, metaprogramming, [YOU NAME IT]... oov y’s Gr ive no vat sti ll in 20 03! si nce mercredi 19 mai 2010
  • 64. Summary (2/2) But it’s more than just a language, it’s a very rich and active ecosystem! Grails, Griffon, Gradle, GPars, Spock, Gaelyk... mercredi 19 mai 2010
  • 65. Thanks for your attention! e aforg pment ume L Develo Guilla Groovy om He ad of e@ gmail.c glaforg rge Email: @glafo : Twitter mercredi 19 mai 2010
  • 67. Images used in this presentation House / past: http://www.flickr.com/photos/jasonepowell/3680030831/sizes/o/ Present clock: http://www.flickr.com/photos/38629278@N04/3784344944/sizes/o/ Future: http://www.flickr.com/photos/befuddledsenses/2904000882/sizes/l/ Cooking: http://www.flickr.com/photos/eole/449958332/sizes/l/ Black dragon: http://www.free-computer-wallpapers.com/pictures/Fantasy-wallpaper/Black_Dragon Puzzle: http://www.everystockphoto.com/photo.php?imageId=263521 Light bulb: https://newsline.llnl.gov/retooling/mar/03.28.08_images/lightBulb.png Spock: http://altoladeira.files.wordpress.com/2009/07/spock2.jpg mercredi 19 mai 2010