SlideShare une entreprise Scribd logo
1  sur  67
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

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 ConcurrencyAlex Miller
 
Google Go For Ruby Hackers
Google Go For Ruby HackersGoogle Go For Ruby Hackers
Google Go For Ruby HackersEleanor McHugh
 
Java Concurrency Gotchas
Java Concurrency GotchasJava Concurrency Gotchas
Java Concurrency GotchasAlex Miller
 
Java Concurrency Idioms
Java Concurrency IdiomsJava Concurrency Idioms
Java Concurrency IdiomsAlex Miller
 
Java Concurrency Gotchas
Java Concurrency GotchasJava Concurrency Gotchas
Java Concurrency GotchasAlex Miller
 
Clojure concurrency overview
Clojure concurrency overviewClojure concurrency overview
Clojure concurrency overviewSergey Stupin
 
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 gpuMarco 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 DepthYoshifumi 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 abstractionSergey Platonov
 
Java 5 concurrency
Java 5 concurrencyJava 5 concurrency
Java 5 concurrencypriyank09
 
Golang concurrency design
Golang concurrency designGolang concurrency design
Golang concurrency designHyejong
 
Box2D with SIMD in JavaScript
Box2D with SIMD in JavaScriptBox2D with SIMD in JavaScript
Box2D with SIMD in JavaScriptIntel® Software
 
Java 7 JUG Summer Camp
Java 7 JUG Summer CampJava 7 JUG Summer Camp
Java 7 JUG Summer Campjulien.ponge
 

Tendances (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
 

Similaire à 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 LaforgeGuillaume 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 LaforgeGuillaume 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önigGR8Conf
 
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 commitsAndreLeoni1
 
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 LaforgeGR8Conf
 
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 kotlinShem 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 ES6Richard Leland
 
MiamiJS - The Future of JavaScript
MiamiJS - The Future of JavaScriptMiamiJS - The Future of JavaScript
MiamiJS - The Future of JavaScriptCaridy 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 editionIgalia
 
Groovy And Grails JUG Trento
Groovy And Grails JUG TrentoGroovy And Grails JUG Trento
Groovy And Grails JUG TrentoJohn 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 GoRodolfo 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 LaneAndres Almiray
 
Gradle in 45min - JBCN2-16 version
Gradle in 45min - JBCN2-16 versionGradle in 45min - JBCN2-16 version
Gradle in 45min - JBCN2-16 versionSchalk 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
 

Similaire à 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
 
クラウド・アプリケーション・アーキテクチャ
クラウド・アプリケーション・アーキテクチャクラウド・アプリケーション・アーキテクチャ
クラウド・アプリケーション・アーキテクチャ
 

Plus de 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 2013Guillaume Laforge
 
Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Guillaume 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 2013Guillaume 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 Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Guillaume Laforge
 
Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012Guillaume 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 LaforgeGuillaume 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 LanguagesGuillaume Laforge
 
Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012Guillaume 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 2011Guillaume Laforge
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Guillaume 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
 

Plus de 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...
 

Dernier

The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...Aggregage
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAshyamraj55
 
Do we need a new standard for visualizing the invisible?
Do we need a new standard for visualizing the invisible?Do we need a new standard for visualizing the invisible?
Do we need a new standard for visualizing the invisible?SANGHEE SHIN
 
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfUiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfDianaGray10
 
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UbiTrack UK
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioChristian Posta
 
20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdf
20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdf
20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdfJamie (Taka) Wang
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Websitedgelyza
 
Linked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond OntologiesLinked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond OntologiesDavid Newbury
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsSeth Reyes
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Adtran
 
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...Will Schroeder
 
UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7DianaGray10
 
Introduction to Quantum Computing
Introduction to Quantum ComputingIntroduction to Quantum Computing
Introduction to Quantum ComputingGDSC PJATK
 
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationUsing IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationIES VE
 
9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding Team9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding TeamAdam Moalla
 
Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1DianaGray10
 
UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6DianaGray10
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPathCommunity
 

Dernier (20)

The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
 
Do we need a new standard for visualizing the invisible?
Do we need a new standard for visualizing the invisible?Do we need a new standard for visualizing the invisible?
Do we need a new standard for visualizing the invisible?
 
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfUiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
 
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and Istio
 
20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdf
20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdf
20200723_insight_release_plan_v6.pdf20200723_insight_release_plan_v6.pdf
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Website
 
Linked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond OntologiesLinked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond Ontologies
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and Hazards
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™
 
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
 
UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7
 
Introduction to Quantum Computing
Introduction to Quantum ComputingIntroduction to Quantum Computing
Introduction to Quantum Computing
 
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationUsing IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
 
9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding Team9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding Team
 
Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1
 
UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation Developers
 

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