SlideShare ist ein Scribd-Unternehmen logo
1 von 81
Downloaden Sie, um offline zu lesen
Practical Domain-Specific
Languages in Groovy
Guillaume Laforge
Groovy Project Manager
SpringSource
Guillaume Laforge

Groovy Project Manager
JSR-241 Spec Lead
Head of Groovy Development
at SpringSource
Initiator of the Grails framework
Co-author of Groovy in Action
Speaker: JavaOne, QCon, JavaZone, Sun TechDays,
Devoxx, The Spring Experience, JAX, Dynamic Language
World, IJTC, and more...




                               2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   2
A few words about Groovy

 Groovy is a dynamic language for the JVM
  • with a Meta Object Protocol
  • compiles directly to bytecode, seamless Java interop

 Open Source ASL 2 project hosted at Codehaus

 Relaxed grammar derived from Java 5
  • + borrowed good ideas from Ruby, Python, Smalltalk

 Fast... for a dynlang on the JVM

Closures, properties, optional typing, BigDecimal by
default, nice wrapper APIs, and more...
                                       2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   3
end a
The context and                                  Ag
the usual issues we face
Some real-life examples of Domain-
Specific Languages
Groovy’s DSL capabilities
Integrating a DSL
in your application
Considerations to remember when
designing your own DSL




                                     2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   4
The context
Subject Matter Experts,
  Business analysts...
Developer producing LOLCODE




HAI
CAN HAS STDIO?
I HAS A VAR
IM IN YR LOOP
   UP VAR!!1
   VISIBLE VAR
   IZ VAR BIGGER THAN 10?
KTHXBYE
IM OUTTA YR LOOP
KTHXBYE
Lots of languages...
And in the end...
...nobody understands each other
Expressing requirements...
DSL: a potential solution?

  Use a more expressive language than a general
 purpose one

  Share a common metaphore of understanding between
 developers and subject matter experts

  Have domain experts help with the design of the
 business logic of an application

  Avoid cluttering business code with too much boilerplate
 technical code

  Cleanly separate business logic from application code

  Let business rules have their own lifecycle

                                  2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   11
Towards more readibility (1)




                               2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   12
Towards more readibility (1)




                               2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   12
Towards more readibility (1)




                                                                                                 20%




                               2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   12
Towards more readibility (2)




                               2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   13
Towards more readibility (2)




                               2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   13
Towards more readibility (2)




                                                                               80%

                               2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   13
end a
The context and                                  Ag
the usual issues we face
Some real-life examples of Domain-
Specific Languages
Groovy’s DSL capabilities
Integrating a DSL
in your application
Considerations to remember when
designing your own DSL




                                     2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   14
A collection of DSLs


 In our everyday life, we’re surrounded by DSLs

  • Technical dialects
  • Notations
  • Business languages




                                  2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   15
Technical dialects




                     2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   16
SQL
^[w-.]+@([w-]){2,4}$




                2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   18
Notations




            2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   19
1. e4 e5
2. Nf3 Nc6
3. Bb5 a6
L2 U F-1 B L2 F B -1 U L2
Visual!
Business languages




                     2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   23
Real-life Groovy examples

 Anti-malaria drug resistance simulation
 Human Resources employee skills representation
 Insurance policies risk calculation engine
 Loan acceptance rules engine for a financial platform
 Mathematica-like lingua for nuclear safety simulations
 Market data feeds evolution scenarios

 and more...




                                   2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   24
end a
The context and                                  Ag
the usual issues we face
Some real-life examples of Domain-
Specific Languages
Groovy’s DSL capabilities
Integrating a DSL
in your application
Considerations to remember when
designing your own DSL




                                     2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   25
A flexible & malleable syntax

 No need to write full-blown classes, use scripts
 Optional typing (def)
  • in scripts, you can even omit the def keyword
 Native syntax constructs
 Parentheses & semi-colons are optional
 Named arguments
 BigDecimal by default for decimal numbers
 Closures for custom control structures
 Operator overloading




                                    2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   26
Scripts vs classes

 Hide all the boilerplate technical code
  • an end-user doesn’t need to know about classes

  • public class Rule {
         public static void main(String[] args)
   {
               System.out.println(“Hello”);
         }
   }

  • println “Hello”



                                      2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   27
Optional typing

 No need to bother with types or even generics
  • unless you want to!

 Imagine an interest rate lookup table method returning
 some generified type:

  • Rate<LoanType, Duration,
   BigDecimal>[]
        lookupTable() { ... }
   def table = lookupTable()
 No need to repeat the horrible generics type info!


                                    2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   28
Native syntax constructs

 Lists
  • [Monday, Tuesday, Wednesday]
 Maps
  • [CA: ‘California’, TX: ‘Texas’]
 Ranges
  • def bizDays = Monday..Friday
  • def allowedAge = 18..65
  • You can create your own custom ranges




                                     2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   29
Optional parens & semis

 Make statements and expressions
 look more like natural languages



  • move(left);



  • move left




                                    2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   30
Named arguments

In Groovy you can mix named and unnamed arguments for
method parameters
 • named params are actually put in a map parameter
 • plus optional parens & semis

  take 1.pill,
   of: Chloroquinine,
after: 6.hours


 Corresponds to a method signature like:
  • def take(Map m, MedicineQuantity mq)

                                  2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   31
BigDecimal by default

 Main reason why financial institutions often decide to use
 Groovy for their business rules!
  • Although these days rounding issues are overrated!
 Java vs Groovy for a simple interpolation equation
 BigDecimal uMinusv = c.subtract(a);
 BigDecimal vMinusl = b.subtract(c);
 BigDecimal uMinusl = a.subtract(b);
 return e.multiply(uMinusv)
       .add(d.multiply(vMinusl))
       .divide(uMinusl, 10, BigDecimal.ROUND_HALF_UP);




 (d * (b - c) + e * (c - a)) / (a - b)


                                    2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   32
Custom control structures,
thanks to closures
 When closures are last, they can be put “out” of the
 parentheses surrounding parameters

 unless (account.balance > 100.euros,
     { account.debit 100.euros })
 unless (account.balance > 100.euros) {
     account.debit 100.euros
 }
 Signature def unless(boolean b, Closure c)



                                   2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   33
Operator overloading
a + b    a.plus(b)           Currency amounts
a - b    a.minus(b)
                             • 15.euros + 10.dollars
a * b    a.multiply(b)
a / b    a.divide(b)         Distance handling
a % b    a.modulo(b)         • 10.kilometers - 10.meters
a ** b   a.power(b)
a | b    a.or(b)             Workflow, concurrency
a & b    a.and(b)            • taskA | taskB & taskC
a ^ b    a.xor(b)
a[b]     a.getAt(b)          Credit an account
a << b   a.leftShift(b)
                             •account << 10.dollars
                              account += 10.dollars
a >> b   a.rightShift(b)      account.credit 10.dollars
+a       a.positive()
-a       a.negative()
~a       a.bitwiseNegate()
                                   2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   34
Groovy’s dynamic heart:

The MOP!
MetaObject Protocol
Groovy’s MOP

All the accesses to methods, properties, constructors,
operators, etc. can be intercepted thanks to the MOP

While Java’s behavior is hard-wired at compile-time in the
class

Groovy’s runtime behavior is adaptable at runtime
through the metaclass.

 Different hooks for changing the runtime behavior
  • GroovyObject, custom MetaClass implementation, categories,
   ExpandoMetaClass



                                      2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   36
GroovyObject

All instances of classes created in Groovy implement the
GroovyObject interface:

 • getProperty(String name)
 • setProperty(String name, Object
   value)
 • invokeMethod(String name, Object[]
   params)
 • getMetaClass()
 • setMetaClass(MetaClass mc)
 A GO can have “pretended” methods and properties


                                  2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   37
MetaClass

 The core of Groovy’s MOP system
 • invokeConstructor()
 • invokeMethod() and
   invokeStaticMethod()
 • invokeMissingMethod()
 • getProperty() and setProperty()
 • getAttribute() and setAttribute()
 • respondsTo() and hasProperty()
MetaClasses can change the behavior of existing third-
party classes — even from the JDK


                                 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   38
ExpandoMetaClass

 A DSL for MetaClasses!

MoneyAmount.metaClass.constructor = { ... }
Number.metaClass.getDollars = { ... }
Distance.metaClass.toMeters = { ... }
Distance.metaClass.static.create = { ... }

To avoid repetition of Type.metaClass, you can pass a
closure to metaClass { ... }

The delegate variable in closure represents the current
instance, and it the default parameter


                                 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   39
The Builder pattern
A builder for HR

 softskills {
     ideas {
         capture 2
         formulate 3
     }
     ...
 }
 knowhow {
     languages {
         java 4
         groovy 5
     }
     ...
 }



                       2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   41
A builder for HR

 softskills {
     ideas {
         capture 2
         formulate 3
     }
     ...
 }
 knowhow {
     languages {
         java 4
         groovy 5
     }
     ...
 }



                       2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   41
Builders

Builders are...
 • a mechanism for creating any tree-structered graph
 • the realization of the GoF builder pattern at the syntax level in Groovy
 • simply a clever use of chained method invocation, closures, parentheses
  omission, and use of the GroovyObject methods

Existing builders
 • XML, Object graph, Swing, Ant, JMX, and more...




                                            2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   42
The clever trick

 GroovyObject#invokeMethod() is used to catch all non-
 existing method calls in the context of the builder

 The nesting of closures visually shows the level of nesting /
 depth in the tree

 builder.m1(attr1:1, attr2:2, { builder.m2(..., {...}) }

 becomes equivalent to
 builder.m1(attr1:1, attr2:2) { m2(...) {...} }

 thanks to parens omission


                                    2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   43
Adding properties to numbers

 Three possible approaches

  • create a Category
    •   a category is a kind of decorator for default MCs

  • create a custom MetaClass
    •   a full-blown MC class to implement and to set on the POGO instance

  • use ExpandoMetaClass
    •   friendlier DSL approach but with a catch




                                                   2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   44
With a Category

class DistanceCategory {
    static Distance getMeters(Integer self) {
        new Distance(self, Unit.METERS)
    }
}
use(DistanceCategory) {
    100.meters
}

 Interesting scope: thread-bound & lexical
 Have to surround with “use”
  • but there are ways to hide it



                                   2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   45
With an ExpandoMetaClass

Number.metaClass.getMeters = {->
    new Distance(delegate, Unit.METERS)
}
100.meters

Works for the class hierarchy for POJOs, and a flag exists
to make it work for POGOs too

But the catch is it’s really a global change, so beware EMC
enhancements collisions




                                  2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   46
Compile-time
metaprogramming
Groovy 1.6 introduced AST Transformations
Compile-time == No runtime performance penalty!




                  Transformation
                                2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   47
AST Transformations

 Two kinds of transformations
  • Global transformations
   •   applicable to all compilation units


  • Local transformations
   •   applicable to marked program elements
   •   using specific marker annotations




                                               2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   48
Global transformations

 Implement ASTTransformation

 Annotate the transfo specifying a compilation phase
 @GroovyASTTransformation(phase=CompilePhase.CONVERSION)
 public class MyTransformation
     implements ASTTransformation {
     public void visit(ASTNode[] nodes, SourceUnit unit)
     { ... }
 }

 For discovery, create the file META-INF/services/
 org.codehaus.groovy.transform.ASTTransformation

 Add the fully qualified name of the class in that file

                                     2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   49
Local transformations

 Same approach as Globale transformations
 But you don’t need the META-INF file
 Instead create an annotation to specify on which element
 the transformation should apply

 @Retention(RetentionPolicy.SOURCE)
 @Target([ElementType.METHOD])
 @GroovyASTTransformationClass(
     [quot;fqn.MyTransformationquot;])
 public @interface WithLogging {...}




                                  2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   50
Example: the Spock framework

 Changing the semantics of the original code
 But keeping a valid Groovy syntax
@Speck
class HelloSpock {
    def quot;can you figure out what I'm up to?quot;() {
        expect:
        name.size() == size
          where:
          name << [quot;Kirkquot;, quot;Spockquot;, quot;Scottyquot;]
          size << [4, 5, 6]
     }
}

 Check out http://www.spockframework.org

                                  2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   51
end a
The context and                                  Ag
the usual issues we face
Some real-life examples of Domain-
Specific Languages
Groovy’s DSL capabilities
Integrating a DSL
in your application
Considerations to remember when
designing your own DSL




                                     2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   52
Various integration mechanisms

 Java 6’s javax.script.* APIs (aka JSR-223)
 Spring’s language namespace
 Groovy’s own mechanisms

 But a key idea is to externalize those DSL programs
  • DSL programs can have their own lifecycle
  • no need to redeploy an application because of a rule change
  • business people won’t see the technical code




                                       2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   53
Java 6’s javax.script.* API

 Groovy 1.6 provides its own implementation of the
 javax.script.* API

 ScriptEngineManager mgr =
         new ScriptEngineManager();
 ScriptEngine engine =
         mgr.getEngineByName(“Groovy”);
 String result =
 (String)engine.eval(“2+3”);




                                  2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   54
Spring’s lang namespace

POGOs (Plain Old Groovy Objects) can be pre-compiled as
any POJO and used interchangeably with POJOs in a
Spring application
But Groovy scripts & classes can be loaded at runtime
through the <lang:groovy/> namespace and tag
Reloadable on change
Customizable through a custom MetaClass

<lang:groovy id=quot;eventsquot;
    script-source=quot;classpath:dsl/
eventsChart.groovyquot;
    customizer-ref=quot;eventsMetaClassquot; />




                               2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   55
Groovy’s own mechanisms

 Eval
  • for evaluating simple expressions

 GroovyShell
  • for more complex scripts and DSLs

 GroovyClassLoader
  • the most powerful mechanism




                                        2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   56
Eval

 Simple mechanism to evaluate math-like formulas

Eval.me (              ‘3*4’)
Eval.x (1,             ‘3*x + 4’)
Eval.xy (1, 2,         ‘x + y’)
Eval.xyz(1, 2, 3,      ‘x * y - z’)




                                 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   57
GroovyShell

 A Binding provides a context of execution
  • can implement lazy evaluation if needed

 A base script class can be specified

def binding = new Binding()
binding.mass = 22.3
binding.velocity = 10.6
def shell = new GroovyShell(binding)
shell.evaluate(“mass * velocity ** 2 / 2”)




                                   2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   58
GroovyClassLoader

 Most powerful mechanism
  • could also visit or change the AST
  • scripts & classes can be loaded from elsewhere
  • more control on compilation
GroovyClassLoader gcl =
        new GroovyClassLoader();
Class clazz = gcl.parseClass(
        new File(“f.groovy”));
GroovyObject instance =
(GroovyObject)clazz.newInstance();
instance.setMetaClass(customMC);


                                       2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   59
Externalize business rules

 Although Groovy DSLs can be embedded in normal Groovy
 classes, you should externalize them

 Store them elsewhere
  • in a database, an XML file, etc.

 Benefits
  • Business rules are not entangled
    in technical application code
  • Business rules can have their own lifecycle, without requiring
    application redeployments




                                        2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   60
end a
The context and                                  Ag
the usual issues we face
Some real-life examples of Domain-
Specific Languages
Groovy’s DSL capabilities
Integrating a DSL
in your application
Considerations to remember when
designing your own DSL




                                     2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   61
Start small, with key concepts
Beware overengineering!
Grow your language progressively
Get your hands dirty
Play with the end-users
Let your DSL fly,
it’s not yours,
it’s theirs!
Tight feedback loop
Iterative process
Stay humble.
You can’t get it right the first time.
Don’t design alone at your desk
Involve the end users from the start
Playing it safe
in a sandbox
Various levels
of sandboxing


 Groovy supports the usual Java Security Managers

 Use metaprogramming tricks to prevent calling /
 instanciating certain classes

 Create a special GroovyClassLoader AST code visitor to
 filter only the nodes of the AST you want to keep
   • ArithmeticShell in Groovy’s samples




                                  2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   69
Test, test, test!

 Don’t just test for nominal cases
  • Explicitely test for errors!

 Ensure end-users get meaninful error messages




                                     2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   70
end a
                                  Ag
Summary

Questions & Answers




                      2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   71
Summary

Groovy’s a great fit for Domain-Specific Languages
 • Malleable & flexible syntax
 • Full object-orientation

Metaprogramming capabilities
 • Runtime metaprogramming
 • Compile-time metaprogramming

Groovy’s very often used for mission-critical DSLs




                                  2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   72
?
I kan haz my cheezburgr naw?
 Or do ya reely haz keshtionz?
Appendix




           2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   74
http://www.flickr.com/photos/wheatfields/420088151/sizes/l/
http://www.flickr.com/photos/therefromhere/518053737/sizes/l/
http://www.flickr.com/photos/romainguy/230416692/sizes/l/
http://www.flickr.com/photos/addictive_picasso/2874279971/sizes/l/
http://www.flickr.com/photos/huangjiahui/3127634297/sizes/l/
http://www.flickr.com/photos/25831000@N08/3064515804/sizes/o/
http://www.flickr.com/photos/lanier67/3147696168/sizes/l/
http://www.flickr.com/photos/ktb/4916063/sizes/o/
http://www.flickr.com/photos/nathonline/918128338/sizes/l/
http://www.flickr.com/photos/kevinsteele/39300193/sizes/l/
http://commons.wikimedia.org/wiki/File:Brueghel-tower-of-babel.jpg
http://commons.wikimedia.org/wiki/File:Platypus.jpg
http://www.flickr.com/photos/joaomoura/2317171808/sizes/l/
http://www.flickr.com/photos/wiccked/132687067/
http://www.flickr.com/photos/timsamoff/252370986/sizes/l/
http://www.flickr.com/photos/29738009@N08/2975466425/sizes/l/
http://www.flickr.com/photos/howie_berlin/180121635/sizes/o/
http://www.flickr.com/photos/yogi/1281980605/sizes/l/
http://www.flickr.com/photos/dorseygraphics/1336468896/sizes/l/
http://www.flickr.com/photos/xcbiker/386876546/sizes/l/
http://www.flickr.com/photos/pietel/152403711/sizes/o/

                                             2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   75
http://www.flickr.com/photos/forezt/192554677/sizes/o/
http://keremkosaner.files.wordpress.com/2008/04/softwaredevelopment.gif
http://www.jouy.inra.fr
http://www.flickr.com/photos/ejpphoto/408101818/sizes/o/
http://www.flickr.com/photos/solaro/2127576608/sizes/l/
http://www.flickr.com/photos/biggreymare/2846899405/sizes/l/




                                        2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone   76

Weitere ähnliche Inhalte

Was ist angesagt?

Bolt C++ Standard Template Libary for HSA by Ben Sanders, AMD
Bolt C++ Standard Template Libary for HSA  by Ben Sanders, AMDBolt C++ Standard Template Libary for HSA  by Ben Sanders, AMD
Bolt C++ Standard Template Libary for HSA by Ben Sanders, AMDHSA Foundation
 
Quick Intro To JRuby
Quick Intro To JRubyQuick Intro To JRuby
Quick Intro To JRubyFrederic Jean
 
PIL - A Platform Independent Language
PIL - A Platform Independent LanguagePIL - A Platform Independent Language
PIL - A Platform Independent Languagezefhemel
 
PL-4048, Adapting languages for parallel processing on GPUs, by Neil Henning
PL-4048, Adapting languages for parallel processing on GPUs, by Neil HenningPL-4048, Adapting languages for parallel processing on GPUs, by Neil Henning
PL-4048, Adapting languages for parallel processing on GPUs, by Neil HenningAMD Developer Central
 
Hierarchy Viewer Internals
Hierarchy Viewer InternalsHierarchy Viewer Internals
Hierarchy Viewer InternalsKyungmin Lee
 
Skia & Freetype - Android 2D Graphics Essentials
Skia & Freetype - Android 2D Graphics EssentialsSkia & Freetype - Android 2D Graphics Essentials
Skia & Freetype - Android 2D Graphics EssentialsKyungmin Lee
 
Introduction to segmentation fault handling
Introduction to segmentation fault handling Introduction to segmentation fault handling
Introduction to segmentation fault handling Larion
 

Was ist angesagt? (11)

Intro to J Ruby
Intro to J RubyIntro to J Ruby
Intro to J Ruby
 
Bolt C++ Standard Template Libary for HSA by Ben Sanders, AMD
Bolt C++ Standard Template Libary for HSA  by Ben Sanders, AMDBolt C++ Standard Template Libary for HSA  by Ben Sanders, AMD
Bolt C++ Standard Template Libary for HSA by Ben Sanders, AMD
 
Jvm Language Summit Rose 20081016
Jvm Language Summit Rose 20081016Jvm Language Summit Rose 20081016
Jvm Language Summit Rose 20081016
 
Quick Intro To JRuby
Quick Intro To JRubyQuick Intro To JRuby
Quick Intro To JRuby
 
PIL - A Platform Independent Language
PIL - A Platform Independent LanguagePIL - A Platform Independent Language
PIL - A Platform Independent Language
 
PL-4048, Adapting languages for parallel processing on GPUs, by Neil Henning
PL-4048, Adapting languages for parallel processing on GPUs, by Neil HenningPL-4048, Adapting languages for parallel processing on GPUs, by Neil Henning
PL-4048, Adapting languages for parallel processing on GPUs, by Neil Henning
 
Day CRX Introduction
Day CRX IntroductionDay CRX Introduction
Day CRX Introduction
 
Hierarchy Viewer Internals
Hierarchy Viewer InternalsHierarchy Viewer Internals
Hierarchy Viewer Internals
 
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?
 
Skia & Freetype - Android 2D Graphics Essentials
Skia & Freetype - Android 2D Graphics EssentialsSkia & Freetype - Android 2D Graphics Essentials
Skia & Freetype - Android 2D Graphics Essentials
 
Introduction to segmentation fault handling
Introduction to segmentation fault handling Introduction to segmentation fault handling
Introduction to segmentation fault handling
 

Ähnlich wie Practical Groovy Domain-Specific Languages

Jangaroo @ FlashCodersNY
Jangaroo @ FlashCodersNYJangaroo @ FlashCodersNY
Jangaroo @ FlashCodersNYFrank Wienberg
 
Accelerate your digital transformation
Accelerate your digital transformationAccelerate your digital transformation
Accelerate your digital transformationMichael Dawson
 
Yet another DSL for cross platforms mobile development
Yet another DSL for cross platforms mobile developmentYet another DSL for cross platforms mobile development
Yet another DSL for cross platforms mobile developmentOlivier Le Goaër
 
A Detailed Look at Cairo's OpenGL Spans Compositor Performance
A Detailed Look at Cairo's OpenGL Spans Compositor PerformanceA Detailed Look at Cairo's OpenGL Spans Compositor Performance
A Detailed Look at Cairo's OpenGL Spans Compositor PerformanceSamsung Open Source Group
 
Developing Sleek and Collaborative Applications with OpenSocial and AJAX Push
Developing Sleek and Collaborative Applications with OpenSocial and AJAX PushDeveloping Sleek and Collaborative Applications with OpenSocial and AJAX Push
Developing Sleek and Collaborative Applications with OpenSocial and AJAX PushChris Schalk
 
CommunityOneEast 09 - Dynamic Languages: the next big thing for the JVM or an...
CommunityOneEast 09 - Dynamic Languages: the next big thing for the JVM or an...CommunityOneEast 09 - Dynamic Languages: the next big thing for the JVM or an...
CommunityOneEast 09 - Dynamic Languages: the next big thing for the JVM or an...Chris Richardson
 
MobiCloud: Towards Cloud Mobile Hybrid Application Generation using Semantica...
MobiCloud: Towards Cloud Mobile Hybrid Application Generation using Semantica...MobiCloud: Towards Cloud Mobile Hybrid Application Generation using Semantica...
MobiCloud: Towards Cloud Mobile Hybrid Application Generation using Semantica...Amit Sheth
 
Crossing the low-code and pro-code chasm: a platform approach
Crossing the low-code and pro-code chasm: a platform approachCrossing the low-code and pro-code chasm: a platform approach
Crossing the low-code and pro-code chasm: a platform approachAsanka Abeysinghe
 
INTERFACE, by apidays - Crossing the low-code and pro-code chasm: a platform...
INTERFACE, by apidays  - Crossing the low-code and pro-code chasm: a platform...INTERFACE, by apidays  - Crossing the low-code and pro-code chasm: a platform...
INTERFACE, by apidays - Crossing the low-code and pro-code chasm: a platform...apidays
 
IBM Connect 2014 KEY102
IBM Connect 2014 KEY102IBM Connect 2014 KEY102
IBM Connect 2014 KEY102Scott Souder
 
Reporting Server_Reporting Server Domains - OpenbravoWiki.pdf
Reporting Server_Reporting Server Domains - OpenbravoWiki.pdfReporting Server_Reporting Server Domains - OpenbravoWiki.pdf
Reporting Server_Reporting Server Domains - OpenbravoWiki.pdfAbul Khayer
 
Jumbo Vision - Control Room Design & Operations Conference 2013
Jumbo Vision - Control Room Design & Operations Conference 2013Jumbo Vision - Control Room Design & Operations Conference 2013
Jumbo Vision - Control Room Design & Operations Conference 2013Lena Kimenkowski
 
Release webinar architecture
Release webinar   architectureRelease webinar   architecture
Release webinar architectureBigData_Europe
 
Kandroid for nhn_deview_20131013_v5_final
Kandroid for nhn_deview_20131013_v5_finalKandroid for nhn_deview_20131013_v5_final
Kandroid for nhn_deview_20131013_v5_finalNAVER D2
 
Breathe Life Into Your IDE
Breathe Life Into Your IDEBreathe Life Into Your IDE
Breathe Life Into Your IDEBenoit Combemale
 
Optimization: from mathematical tools to real applications
Optimization: from mathematical tools to real applicationsOptimization: from mathematical tools to real applications
Optimization: from mathematical tools to real applicationsPhilippe Laborie
 
Mobile Cross-Platform Development in C++
Mobile Cross-Platform Development in C++Mobile Cross-Platform Development in C++
Mobile Cross-Platform Development in C++Ragi Burhum Espinoza
 
Db2 developer ecosystem
Db2 developer ecosystemDb2 developer ecosystem
Db2 developer ecosystemModusOptimum
 

Ähnlich wie Practical Groovy Domain-Specific Languages (20)

Jangaroo @ FlashCodersNY
Jangaroo @ FlashCodersNYJangaroo @ FlashCodersNY
Jangaroo @ FlashCodersNY
 
Accelerate your digital transformation
Accelerate your digital transformationAccelerate your digital transformation
Accelerate your digital transformation
 
Yet another DSL for cross platforms mobile development
Yet another DSL for cross platforms mobile developmentYet another DSL for cross platforms mobile development
Yet another DSL for cross platforms mobile development
 
A Detailed Look at Cairo's OpenGL Spans Compositor Performance
A Detailed Look at Cairo's OpenGL Spans Compositor PerformanceA Detailed Look at Cairo's OpenGL Spans Compositor Performance
A Detailed Look at Cairo's OpenGL Spans Compositor Performance
 
Developing Sleek and Collaborative Applications with OpenSocial and AJAX Push
Developing Sleek and Collaborative Applications with OpenSocial and AJAX PushDeveloping Sleek and Collaborative Applications with OpenSocial and AJAX Push
Developing Sleek and Collaborative Applications with OpenSocial and AJAX Push
 
CommunityOneEast 09 - Dynamic Languages: the next big thing for the JVM or an...
CommunityOneEast 09 - Dynamic Languages: the next big thing for the JVM or an...CommunityOneEast 09 - Dynamic Languages: the next big thing for the JVM or an...
CommunityOneEast 09 - Dynamic Languages: the next big thing for the JVM or an...
 
MobiCloud: Towards Cloud Mobile Hybrid Application Generation using Semantica...
MobiCloud: Towards Cloud Mobile Hybrid Application Generation using Semantica...MobiCloud: Towards Cloud Mobile Hybrid Application Generation using Semantica...
MobiCloud: Towards Cloud Mobile Hybrid Application Generation using Semantica...
 
Crossing the low-code and pro-code chasm: a platform approach
Crossing the low-code and pro-code chasm: a platform approachCrossing the low-code and pro-code chasm: a platform approach
Crossing the low-code and pro-code chasm: a platform approach
 
INTERFACE, by apidays - Crossing the low-code and pro-code chasm: a platform...
INTERFACE, by apidays  - Crossing the low-code and pro-code chasm: a platform...INTERFACE, by apidays  - Crossing the low-code and pro-code chasm: a platform...
INTERFACE, by apidays - Crossing the low-code and pro-code chasm: a platform...
 
Enterprise 2020
Enterprise 2020Enterprise 2020
Enterprise 2020
 
IBM Connect 2014 KEY102
IBM Connect 2014 KEY102IBM Connect 2014 KEY102
IBM Connect 2014 KEY102
 
Reporting Server_Reporting Server Domains - OpenbravoWiki.pdf
Reporting Server_Reporting Server Domains - OpenbravoWiki.pdfReporting Server_Reporting Server Domains - OpenbravoWiki.pdf
Reporting Server_Reporting Server Domains - OpenbravoWiki.pdf
 
Jumbo Vision - Control Room Design & Operations Conference 2013
Jumbo Vision - Control Room Design & Operations Conference 2013Jumbo Vision - Control Room Design & Operations Conference 2013
Jumbo Vision - Control Room Design & Operations Conference 2013
 
Release webinar architecture
Release webinar   architectureRelease webinar   architecture
Release webinar architecture
 
X Means Y
X Means YX Means Y
X Means Y
 
Kandroid for nhn_deview_20131013_v5_final
Kandroid for nhn_deview_20131013_v5_finalKandroid for nhn_deview_20131013_v5_final
Kandroid for nhn_deview_20131013_v5_final
 
Breathe Life Into Your IDE
Breathe Life Into Your IDEBreathe Life Into Your IDE
Breathe Life Into Your IDE
 
Optimization: from mathematical tools to real applications
Optimization: from mathematical tools to real applicationsOptimization: from mathematical tools to real applications
Optimization: from mathematical tools to real applications
 
Mobile Cross-Platform Development in C++
Mobile Cross-Platform Development in C++Mobile Cross-Platform Development in C++
Mobile Cross-Platform Development in C++
 
Db2 developer ecosystem
Db2 developer ecosystemDb2 developer ecosystem
Db2 developer ecosystem
 

Mehr von 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
 

Mehr von 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...
 

Kürzlich hochgeladen

Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integrationmarketing932765
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructureitnewsafrica
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Alkin Tezuysal
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesKari Kakkonen
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Nikki Chapple
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observabilityitnewsafrica
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024TopCSSGallery
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 

Kürzlich hochgeladen (20)

Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examples
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 

Practical Groovy Domain-Specific Languages

  • 1. Practical Domain-Specific Languages in Groovy Guillaume Laforge Groovy Project Manager SpringSource
  • 2. Guillaume Laforge Groovy Project Manager JSR-241 Spec Lead Head of Groovy Development at SpringSource Initiator of the Grails framework Co-author of Groovy in Action Speaker: JavaOne, QCon, JavaZone, Sun TechDays, Devoxx, The Spring Experience, JAX, Dynamic Language World, IJTC, and more... 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 2
  • 3. A few words about Groovy Groovy is a dynamic language for the JVM • with a Meta Object Protocol • compiles directly to bytecode, seamless Java interop Open Source ASL 2 project hosted at Codehaus Relaxed grammar derived from Java 5 • + borrowed good ideas from Ruby, Python, Smalltalk Fast... for a dynlang on the JVM Closures, properties, optional typing, BigDecimal by default, nice wrapper APIs, and more... 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 3
  • 4. end a The context and Ag the usual issues we face Some real-life examples of Domain- Specific Languages Groovy’s DSL capabilities Integrating a DSL in your application Considerations to remember when designing your own DSL 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 4
  • 6. Subject Matter Experts, Business analysts...
  • 7. Developer producing LOLCODE HAI CAN HAS STDIO? I HAS A VAR IM IN YR LOOP UP VAR!!1 VISIBLE VAR IZ VAR BIGGER THAN 10? KTHXBYE IM OUTTA YR LOOP KTHXBYE
  • 9. And in the end... ...nobody understands each other
  • 11. DSL: a potential solution? Use a more expressive language than a general purpose one Share a common metaphore of understanding between developers and subject matter experts Have domain experts help with the design of the business logic of an application Avoid cluttering business code with too much boilerplate technical code Cleanly separate business logic from application code Let business rules have their own lifecycle 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 11
  • 12. Towards more readibility (1) 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 12
  • 13. Towards more readibility (1) 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 12
  • 14. Towards more readibility (1) 20% 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 12
  • 15. Towards more readibility (2) 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 13
  • 16. Towards more readibility (2) 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 13
  • 17. Towards more readibility (2) 80% 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 13
  • 18. end a The context and Ag the usual issues we face Some real-life examples of Domain- Specific Languages Groovy’s DSL capabilities Integrating a DSL in your application Considerations to remember when designing your own DSL 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 14
  • 19. A collection of DSLs In our everyday life, we’re surrounded by DSLs • Technical dialects • Notations • Business languages 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 15
  • 20. Technical dialects 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 16
  • 21. SQL
  • 22. ^[w-.]+@([w-]){2,4}$ 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 18
  • 23. Notations 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 19
  • 24. 1. e4 e5 2. Nf3 Nc6 3. Bb5 a6
  • 25. L2 U F-1 B L2 F B -1 U L2
  • 27. Business languages 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 23
  • 28. Real-life Groovy examples Anti-malaria drug resistance simulation Human Resources employee skills representation Insurance policies risk calculation engine Loan acceptance rules engine for a financial platform Mathematica-like lingua for nuclear safety simulations Market data feeds evolution scenarios and more... 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 24
  • 29. end a The context and Ag the usual issues we face Some real-life examples of Domain- Specific Languages Groovy’s DSL capabilities Integrating a DSL in your application Considerations to remember when designing your own DSL 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 25
  • 30. A flexible & malleable syntax No need to write full-blown classes, use scripts Optional typing (def) • in scripts, you can even omit the def keyword Native syntax constructs Parentheses & semi-colons are optional Named arguments BigDecimal by default for decimal numbers Closures for custom control structures Operator overloading 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 26
  • 31. Scripts vs classes Hide all the boilerplate technical code • an end-user doesn’t need to know about classes • public class Rule { public static void main(String[] args) { System.out.println(“Hello”); } } • println “Hello” 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 27
  • 32. Optional typing No need to bother with types or even generics • unless you want to! Imagine an interest rate lookup table method returning some generified type: • Rate<LoanType, Duration, BigDecimal>[] lookupTable() { ... } def table = lookupTable() No need to repeat the horrible generics type info! 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 28
  • 33. Native syntax constructs Lists • [Monday, Tuesday, Wednesday] Maps • [CA: ‘California’, TX: ‘Texas’] Ranges • def bizDays = Monday..Friday • def allowedAge = 18..65 • You can create your own custom ranges 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 29
  • 34. Optional parens & semis Make statements and expressions look more like natural languages • move(left); • move left 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 30
  • 35. Named arguments In Groovy you can mix named and unnamed arguments for method parameters • named params are actually put in a map parameter • plus optional parens & semis take 1.pill, of: Chloroquinine, after: 6.hours Corresponds to a method signature like: • def take(Map m, MedicineQuantity mq) 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 31
  • 36. BigDecimal by default Main reason why financial institutions often decide to use Groovy for their business rules! • Although these days rounding issues are overrated! Java vs Groovy for a simple interpolation equation BigDecimal uMinusv = c.subtract(a); BigDecimal vMinusl = b.subtract(c); BigDecimal uMinusl = a.subtract(b); return e.multiply(uMinusv) .add(d.multiply(vMinusl)) .divide(uMinusl, 10, BigDecimal.ROUND_HALF_UP); (d * (b - c) + e * (c - a)) / (a - b) 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 32
  • 37. Custom control structures, thanks to closures When closures are last, they can be put “out” of the parentheses surrounding parameters unless (account.balance > 100.euros, { account.debit 100.euros }) unless (account.balance > 100.euros) { account.debit 100.euros } Signature def unless(boolean b, Closure c) 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 33
  • 38. Operator overloading a + b a.plus(b) Currency amounts a - b a.minus(b) • 15.euros + 10.dollars a * b a.multiply(b) a / b a.divide(b) Distance handling a % b a.modulo(b) • 10.kilometers - 10.meters a ** b a.power(b) a | b a.or(b) Workflow, concurrency a & b a.and(b) • taskA | taskB & taskC a ^ b a.xor(b) a[b] a.getAt(b) Credit an account a << b a.leftShift(b) •account << 10.dollars account += 10.dollars a >> b a.rightShift(b) account.credit 10.dollars +a a.positive() -a a.negative() ~a a.bitwiseNegate() 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 34
  • 39. Groovy’s dynamic heart: The MOP! MetaObject Protocol
  • 40. Groovy’s MOP All the accesses to methods, properties, constructors, operators, etc. can be intercepted thanks to the MOP While Java’s behavior is hard-wired at compile-time in the class Groovy’s runtime behavior is adaptable at runtime through the metaclass. Different hooks for changing the runtime behavior • GroovyObject, custom MetaClass implementation, categories, ExpandoMetaClass 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 36
  • 41. GroovyObject All instances of classes created in Groovy implement the GroovyObject interface: • getProperty(String name) • setProperty(String name, Object value) • invokeMethod(String name, Object[] params) • getMetaClass() • setMetaClass(MetaClass mc) A GO can have “pretended” methods and properties 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 37
  • 42. MetaClass The core of Groovy’s MOP system • invokeConstructor() • invokeMethod() and invokeStaticMethod() • invokeMissingMethod() • getProperty() and setProperty() • getAttribute() and setAttribute() • respondsTo() and hasProperty() MetaClasses can change the behavior of existing third- party classes — even from the JDK 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 38
  • 43. ExpandoMetaClass A DSL for MetaClasses! MoneyAmount.metaClass.constructor = { ... } Number.metaClass.getDollars = { ... } Distance.metaClass.toMeters = { ... } Distance.metaClass.static.create = { ... } To avoid repetition of Type.metaClass, you can pass a closure to metaClass { ... } The delegate variable in closure represents the current instance, and it the default parameter 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 39
  • 45. A builder for HR softskills { ideas { capture 2 formulate 3 } ... } knowhow { languages { java 4 groovy 5 } ... } 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 41
  • 46. A builder for HR softskills { ideas { capture 2 formulate 3 } ... } knowhow { languages { java 4 groovy 5 } ... } 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 41
  • 47. Builders Builders are... • a mechanism for creating any tree-structered graph • the realization of the GoF builder pattern at the syntax level in Groovy • simply a clever use of chained method invocation, closures, parentheses omission, and use of the GroovyObject methods Existing builders • XML, Object graph, Swing, Ant, JMX, and more... 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 42
  • 48. The clever trick GroovyObject#invokeMethod() is used to catch all non- existing method calls in the context of the builder The nesting of closures visually shows the level of nesting / depth in the tree builder.m1(attr1:1, attr2:2, { builder.m2(..., {...}) } becomes equivalent to builder.m1(attr1:1, attr2:2) { m2(...) {...} } thanks to parens omission 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 43
  • 49. Adding properties to numbers Three possible approaches • create a Category • a category is a kind of decorator for default MCs • create a custom MetaClass • a full-blown MC class to implement and to set on the POGO instance • use ExpandoMetaClass • friendlier DSL approach but with a catch 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 44
  • 50. With a Category class DistanceCategory { static Distance getMeters(Integer self) { new Distance(self, Unit.METERS) } } use(DistanceCategory) { 100.meters } Interesting scope: thread-bound & lexical Have to surround with “use” • but there are ways to hide it 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 45
  • 51. With an ExpandoMetaClass Number.metaClass.getMeters = {-> new Distance(delegate, Unit.METERS) } 100.meters Works for the class hierarchy for POJOs, and a flag exists to make it work for POGOs too But the catch is it’s really a global change, so beware EMC enhancements collisions 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 46
  • 52. Compile-time metaprogramming Groovy 1.6 introduced AST Transformations Compile-time == No runtime performance penalty! Transformation 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 47
  • 53. AST Transformations Two kinds of transformations • Global transformations • applicable to all compilation units • Local transformations • applicable to marked program elements • using specific marker annotations 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 48
  • 54. Global transformations Implement ASTTransformation Annotate the transfo specifying a compilation phase @GroovyASTTransformation(phase=CompilePhase.CONVERSION) public class MyTransformation implements ASTTransformation { public void visit(ASTNode[] nodes, SourceUnit unit) { ... } } For discovery, create the file META-INF/services/ org.codehaus.groovy.transform.ASTTransformation Add the fully qualified name of the class in that file 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 49
  • 55. Local transformations Same approach as Globale transformations But you don’t need the META-INF file Instead create an annotation to specify on which element the transformation should apply @Retention(RetentionPolicy.SOURCE) @Target([ElementType.METHOD]) @GroovyASTTransformationClass( [quot;fqn.MyTransformationquot;]) public @interface WithLogging {...} 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 50
  • 56. Example: the Spock framework Changing the semantics of the original code But keeping a valid Groovy syntax @Speck class HelloSpock { def quot;can you figure out what I'm up to?quot;() { expect: name.size() == size where: name << [quot;Kirkquot;, quot;Spockquot;, quot;Scottyquot;] size << [4, 5, 6] } } Check out http://www.spockframework.org 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 51
  • 57. end a The context and Ag the usual issues we face Some real-life examples of Domain- Specific Languages Groovy’s DSL capabilities Integrating a DSL in your application Considerations to remember when designing your own DSL 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 52
  • 58. Various integration mechanisms Java 6’s javax.script.* APIs (aka JSR-223) Spring’s language namespace Groovy’s own mechanisms But a key idea is to externalize those DSL programs • DSL programs can have their own lifecycle • no need to redeploy an application because of a rule change • business people won’t see the technical code 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 53
  • 59. Java 6’s javax.script.* API Groovy 1.6 provides its own implementation of the javax.script.* API ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine = mgr.getEngineByName(“Groovy”); String result = (String)engine.eval(“2+3”); 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 54
  • 60. Spring’s lang namespace POGOs (Plain Old Groovy Objects) can be pre-compiled as any POJO and used interchangeably with POJOs in a Spring application But Groovy scripts & classes can be loaded at runtime through the <lang:groovy/> namespace and tag Reloadable on change Customizable through a custom MetaClass <lang:groovy id=quot;eventsquot; script-source=quot;classpath:dsl/ eventsChart.groovyquot; customizer-ref=quot;eventsMetaClassquot; /> 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 55
  • 61. Groovy’s own mechanisms Eval • for evaluating simple expressions GroovyShell • for more complex scripts and DSLs GroovyClassLoader • the most powerful mechanism 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 56
  • 62. Eval Simple mechanism to evaluate math-like formulas Eval.me ( ‘3*4’) Eval.x (1, ‘3*x + 4’) Eval.xy (1, 2, ‘x + y’) Eval.xyz(1, 2, 3, ‘x * y - z’) 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 57
  • 63. GroovyShell A Binding provides a context of execution • can implement lazy evaluation if needed A base script class can be specified def binding = new Binding() binding.mass = 22.3 binding.velocity = 10.6 def shell = new GroovyShell(binding) shell.evaluate(“mass * velocity ** 2 / 2”) 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 58
  • 64. GroovyClassLoader Most powerful mechanism • could also visit or change the AST • scripts & classes can be loaded from elsewhere • more control on compilation GroovyClassLoader gcl = new GroovyClassLoader(); Class clazz = gcl.parseClass( new File(“f.groovy”)); GroovyObject instance = (GroovyObject)clazz.newInstance(); instance.setMetaClass(customMC); 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 59
  • 65. Externalize business rules Although Groovy DSLs can be embedded in normal Groovy classes, you should externalize them Store them elsewhere • in a database, an XML file, etc. Benefits • Business rules are not entangled in technical application code • Business rules can have their own lifecycle, without requiring application redeployments 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 60
  • 66. end a The context and Ag the usual issues we face Some real-life examples of Domain- Specific Languages Groovy’s DSL capabilities Integrating a DSL in your application Considerations to remember when designing your own DSL 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 61
  • 67. Start small, with key concepts Beware overengineering!
  • 68. Grow your language progressively
  • 69. Get your hands dirty Play with the end-users
  • 70. Let your DSL fly, it’s not yours, it’s theirs!
  • 72. Stay humble. You can’t get it right the first time. Don’t design alone at your desk Involve the end users from the start
  • 73. Playing it safe in a sandbox
  • 74. Various levels of sandboxing Groovy supports the usual Java Security Managers Use metaprogramming tricks to prevent calling / instanciating certain classes Create a special GroovyClassLoader AST code visitor to filter only the nodes of the AST you want to keep • ArithmeticShell in Groovy’s samples 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 69
  • 75. Test, test, test! Don’t just test for nominal cases • Explicitely test for errors! Ensure end-users get meaninful error messages 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 70
  • 76. end a Ag Summary Questions & Answers 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 71
  • 77. Summary Groovy’s a great fit for Domain-Specific Languages • Malleable & flexible syntax • Full object-orientation Metaprogramming capabilities • Runtime metaprogramming • Compile-time metaprogramming Groovy’s very often used for mission-critical DSLs 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 72
  • 78. ? I kan haz my cheezburgr naw? Or do ya reely haz keshtionz?
  • 79. Appendix 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 74
  • 80. http://www.flickr.com/photos/wheatfields/420088151/sizes/l/ http://www.flickr.com/photos/therefromhere/518053737/sizes/l/ http://www.flickr.com/photos/romainguy/230416692/sizes/l/ http://www.flickr.com/photos/addictive_picasso/2874279971/sizes/l/ http://www.flickr.com/photos/huangjiahui/3127634297/sizes/l/ http://www.flickr.com/photos/25831000@N08/3064515804/sizes/o/ http://www.flickr.com/photos/lanier67/3147696168/sizes/l/ http://www.flickr.com/photos/ktb/4916063/sizes/o/ http://www.flickr.com/photos/nathonline/918128338/sizes/l/ http://www.flickr.com/photos/kevinsteele/39300193/sizes/l/ http://commons.wikimedia.org/wiki/File:Brueghel-tower-of-babel.jpg http://commons.wikimedia.org/wiki/File:Platypus.jpg http://www.flickr.com/photos/joaomoura/2317171808/sizes/l/ http://www.flickr.com/photos/wiccked/132687067/ http://www.flickr.com/photos/timsamoff/252370986/sizes/l/ http://www.flickr.com/photos/29738009@N08/2975466425/sizes/l/ http://www.flickr.com/photos/howie_berlin/180121635/sizes/o/ http://www.flickr.com/photos/yogi/1281980605/sizes/l/ http://www.flickr.com/photos/dorseygraphics/1336468896/sizes/l/ http://www.flickr.com/photos/xcbiker/386876546/sizes/l/ http://www.flickr.com/photos/pietel/152403711/sizes/o/ 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 75