SlideShare une entreprise Scribd logo
1  sur  39
Télécharger pour lire hors ligne
F GAELYK
                          a lightweight Groovy toolkit
                          for Google App Engine



                       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
Cloud
  Computing
mercredi 19 mai 2010
IaaS, PaaS, SaaS

            Software as a Service
                   Gmail, SalesForce.com   SaaS
            Platform as a Service
                   Google App Engine       PaaS
            Infrastructure as a Service
                   Amazon EC2              IaaS
mercredi 19 mai 2010
IaaS, PaaS, SaaS

            Software as a Service
                   Gmail, SalesForce.com   SaaS
            Platform as a Service
                   Google App Engine       PaaS
            Infrastructure as a Service
                   Amazon EC2              IaaS
mercredi 19 mai 2010
IaaS, PaaS, SaaS

            Software as a Service
                   Gmail, SalesForce.com   SaaS
            Platform as a Service
                   Google App Engine       PaaS
            Infrastructure as a Service
                   Amazon EC2              IaaS
mercredi 19 mai 2010
http://gaelyk.appspot.com




mercredi 19 mai 2010
                                  F
http://gaelyk.appspot.com




mercredi 19 mai 2010
                                  F
mercredi 19 mai 2010
Gaelyk
            Gaelyk is a lightweight Groovy toolkit on top of the
            Google App Engine Java SDK

            Gaelyk builds on Groovy’s servlet support
                   Groovlets: Groovy scripts instead of raw servlets!
                   Groovy templates: JSP-like template engine
                   Both allow for a clean separation of views and logic


            Gaelyk provides several enhancements around the GAE Java
            SDK to make life easier, thanks to Groovy’s dynamic nature




mercredi 19 mai 2010
Why Groovy?
            Groovy is a dynamic language for the JVM
                   very flexible, malleable, expressive and concise syntax
                   easy to learn for Java developers
                       deriving from the Java 5 grammar

                   provides powerful APIs to simplify the life of developers
                       possibility to dynamically enrich existing APIs

                   support for Groovlets and its own template engine


            The truth: We worked with the Google App Engine Java
            team before the official launch of the platform, to ensure
            Groovy would run well on this new environment



mercredi 19 mai 2010
First steps...




       • Go to http://gaelyk.appspot.com
       • Download the template project
       • Put your first Groovlet in /WEB-INF/
              groovy
       • And your templates at the root
       • And you’re ready to go!
mercredi 19 mai 2010
The web.xml
                                                                                       ">
                       <web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5
                         <servlet>
                            <servlet-name>GroovletServlet</servlet-name>
                            <servlet-class>groovyx.gaelyk.GaelykServlet</servlet-class>
                         </servlet>
                            <servlet>
                            <servlet-name>TemplateServlet</servlet-name>
                                                                                         -class>
                            <servlet-class>groovyx.gaelyk.GaelykTemplateServlet</servlet
                          </servlet>
                          <servlet-mapping>
                            <servlet-name>GroovletServlet</servlet-name>
                            <url-pattern>*.groovy</url-pattern>
                          </servlet-mapping>
                          <servlet-mapping>
                            <servlet-name>TemplateServlet</servlet-name>
                            <url-pattern>*.gtpl</url-pattern>
                          </servlet-mapping>
                          <welcome-file-list>
                             <welcome-file>index.gtpl</welcome-file>
                          </welcome-file-list>
                        </web-app>




mercredi 19 mai 2010
MVC: Groovlets and templates

                       Groovlets                  Templates
                       (controllers)                (views)



                                       Entities
                                       (domain)




mercredi 19 mai 2010
A groovlet
            Instead of writing full-blown servlets, just write
            Groovy scripts (aka Groovlets)
                       def numbers = [1, 2, 3, 4]
                       def now = new Date()

                       html.html {
                           body {
                               numbers.each { number -> p number }
                               p now
                           }
                       }




mercredi 19 mai 2010
A template
                       <html>
                           <body>
                                <p><%
                                    def message = "Hello World!"
                                    print message %>
                                </p>
                                <p><%= message %></p>
                                <p>${message}</p>
                                <ul>
                                <% 3.times { %>
                                     <li>${message}</li>
                                <% } %>
                                </ul>
                            </body>
                        </html>




mercredi 19 mai 2010
Shortcuts                              Variables available
                                             request / response
            Google services                  context / applicaiton
                   datastore                 session
                   blobstore                 params / header
                   memcache                  out / sout / html
                   urlFetch                  localMode / app.*
                   mail
                   userService / user      Methods available
                   defaultQueue / queues     include / forward / redirect
                   xmpp                      print / println



mercredi 19 mai 2010
Groovy sugar!




mercredi 19 mai 2010
Sending emails with Gaelyk

                       mail.send to: 'foobar@gmail.com',
                           from: 'other@gmail.com',
                           subject: 'Hello World',
                           htmlBody: '<bold>Hello</bold>'




mercredi 19 mai 2010
...compared to Java
    Properties props = new Properties();
                                                     ops, null);
    Ses sion session = Session.getDefaultInstance(pr

    String msgBody = "...";

     try {
         Message msg = new MimeMessage(session);
                                                            m", "Admin"));
         msg.se tFrom(new InternetAddress("admin@example.co
                                                 TO,
         msg.addRecipient(Message.RecipientType.                    "Mr. User"));
                           new InternetAddress("user@example.com",
                                                           n activated");
         msg .setSubject("Your Example.com account has bee
         msg.setText(msgBody);
         Transport.send(msg);
     } catch (AddressException e) {}
     } catch (MessagingException e) {}




mercredi 19 mai 2010
Accessing the datastore
            Direct interaction with the low-level datastore API
                                                                      ty
                       import com.google.appengine.api.datastore.Enti
                        
                       Entity entity = new Entity("person")
                        
                                                                    map
                       // subscript notation, like when accessing a
                       entity['name'] = "Guillaume Laforge"
                        
                       // normal property access notation
                       entity.age = 32

                       entity.save()
                       entity.delete()

                       datastore.withTransaction {
                           // do stuff with your entities
                           // within the transaction
                       }




mercredi 19 mai 2010
Querying to be improved...
                  import com.google.appengine.api.datastore.*
                                                                                     der.*
                  import static com.google.appengine.api.datastore.FetchOptions.Buil
                   
                  // query the scripts stored in the datastore
                  def query = new Query("savedscript")
                    
                   // sort results by descending order of the creation date
                   query.addSort("dateCreated", Query.SortDirection.DESCENDING)
                    
                                                                                     author
                   // filters the entities so as to return only scripts by a certain
                                                                                      r)
                   query.addFilter("author", Query.FilterOperator.EQUAL, params.autho
                    
                   PreparedQuery preparedQuery = datastore.prepare(query)
                    
                   // return only the first 10 results
                   def entities = preparedQuery.asList( withLimit(10) )




mercredi 19 mai 2010
...into something groovier?

                       def entities = datastore.createQuery {
                           select from: savedscript
                           sort DESC, on: dateCreated
                           where author == params.author
                           limit 10
                       } as List




mercredi 19 mai 2010
...into something groovier?

                       def entities = datastore.createQuery {
                           select from: savedscript
                           sort DESC, on: dateCreated
                           where author == params.author
                                                              te d!
                           limit 10                         en
                       } as List                       l
                                                       p em
                                                  t Im
                                           t Ye
                                       N o



mercredi 19 mai 2010
Task queue API
                       // access a configured queue using the subscript notation
                       queues['dailyEmailQueue']
                        
                       // or using the property access notation
                       queues.dailyEmailQueue
                        
                       // you can also access the default queue with:
                       queues.default
                       defaultQueue

                       // add a task to the queue
                       queue << [
                           countdownMillis: 1000, url: "/task/dailyEmail",
                           taskName: "sendDailyEmailNewsletter",
                           method: 'PUT', params: [date: '20090914'],
                           payload: content
                       ]




mercredi 19 mai 2010
Jabber / XMPP support (1/3)
            Sending instant messages

                       String recipient = "someone@gmail.com"
                        
                       // check if the user is online
                       if (xmpp.getPresence(recipient).isAvailable()) {
                           // send the message
                           def status = xmpp.send(to: recipient,
                                                body: "Hello, how are you?")
                        
                           // checks the message was successfully
                           // delivered to all the recipients
                           assert status.isSuccessful()
                       }




mercredi 19 mai 2010
Jabber / XMPP support (2/3)
            Sending instant messages with an XML payload
                       String recipient = "service@gmail.com"
                        
                       // check if the service is online
                       if (xmpp.getPresence(recipient).isAvailable()) {
                           // send the message
                           def status = xmpp.send(to: recipient, xml: {
                               customers {
                                   customer(id: 1) {
                                       name 'Google'
                                    }
                                }
                           })
                        
                           // checks the message was successfully delivered to the service
                           assert status.isSuccessful()
                       }




mercredi 19 mai 2010
Jabber / XMPP support (2/3)
            Sending instant messages with an XML payload
                       String recipient = "service@gmail.com"
                        
                       // check if the service is online
                       if (xmpp.getPresence(recipient).isAvailable()) {
                           // send the message
                           def status = xmpp.send(to: recipient, xml: {
                               customers {
                                   customer(id: 1) {               <customers>
                                       name 'Google'                   <customer id=’1’>
                                   }                                        <name>Google</name>
                               }                                        </customer>
                           })                                      </customers>
                        
                           // checks the message was successfully delivered to the service
                           assert status.isSuccessful()
                       }




mercredi 19 mai 2010
Jabber / XMPP support (3/3)
            Receving incoming instant messages
                   Configure the XmppServlet in web.xml
                   Add the inbound message service in appengine-web.xml
                       // get the body of the message
                       message.body
                       // get the sender Jabber ID
                       message.from
                       // get the list of recipients Jabber IDs
                       message.recipients
                        
                       // if the message is an XML document instead of a raw string
                       message
                       if (message.isXml()) {
                           // get the raw XML
                           message.stanza
                           // get a document parsed with XmlSlurper
                           message.xml
                       }




mercredi 19 mai 2010
Memcache service
            Map notation access to the cache

                                                              }
           class Country implements Serialzable { String name
            
           def countryFr = new Country(name: 'France')
            
                                                                 in the cache
           // use the subscript notation to put a country object
           // (you can also use non-string keys)
           memcache['FR'] = countryFr
            
           // check that a key is present in the cache
           if ('FR' in memcache) {
                                                                  the cache using a key
               // use the subscript notation to get an entry from
               def countryFromCache = memcache['FR']
            }




mercredi 19 mai 2010
URL Routing system
            You can have friendly URL mappings with the URL
            routing system introduce in Gaelyk 0.3.2

          all "/blog/@year/@month/@day/@title",
                                                                  @day@title=@title"
              forward: "/blog.groovy?year=@year&month=@month@day=

          get "/blog/@year/@month/@day",
                                                                  @day"
              forward: "/blog.groovy?year=@year&month=@month@day=

          all "/aboutus",
              redirect: "/blog/2008/10/20/about-us"

          get "/book/isbn/@isbn",
              forward: "/book.groovy?isbn=@isbn",
              validate: { isbn ==~ /d{9}(d|X)/ }




mercredi 19 mai 2010
Simple plugin system (1/3)
            Gaelyk 0.4 introduces a simple plugin system for
            extending your apps and share commonalities
            A plugin lets you
                   provide additional groovlets and templates
                   contribute new URL routes
                   add new categories
                   define variables in the binding
                   provide any static content
                   add new libraries
                   do any initialization

mercredi 19 mai 2010
Simple plugin system (2/3)
            A plugin is actually just a zip file!
                   Basically, just a Gaelyk application, minus...
                       the Groovy / Gaelyk / GAE JARs
                       the web.xml and appengine-web.xml descriptors

                   But with a /WEB-INF/plugins/myplugin.groovy descriptor


            A plugin must be referenced in /WEB-INF/
            plugins.groovy with
                   install myplugin
                       shortcut to /WEB-INF/plugins/myplugin.groovy




mercredi 19 mai 2010
Simple plugin system (3/3)
            An example plugin descriptor
                   /WEB-INF/plugins/jsonPlugin.groovy
             import net.sf.json.*
             import net.sf.json.groovy.*
              
             // add new variables in the binding
             binding {
                                                                           le
                 jsonLibVersion = "2.3"          // a simple string variab
                                                                            of a 3rd‐party JAR
                 json = new JsonGroovyBuilder()  // an instance of a class
             }
              
             // add new routes with the usual routing system format
             routes {
                 get "/json", forward: "/json.groovy"
             }
              
             // install a category you've developped
              categories jsonlib.JsonlibCategory
               
              // any other initialization code you'd need



mercredi 19 mai 2010
What’s coming next?
            Gaelyk 0.4 was released a few days ago
                   Features a lightweight plugin system
                   A 0.4.1 bug fix is coming soon
            Expect more sugar around the Datastore
                       An SQL-like query DSL
                       Easier relationship management (builder)

            Perhaps pre-compiled groovlets and templates
            More generally...
                   Anything that’ll come up in upcoming GAE SDK versions



mercredi 19 mai 2010
Summary
            Easy access to a cloud solution
                   Deploying Java apps, as easily as you would with PHP

            Familiar to Java folks
                   Your good old Servlet centric webapps style

            Pretty cheap
                   You need a high-trafficed website to reach the quotas

            Gaelyk provides a simplified approach to creating
            Servlet centric webapps in a productive manner
                   Leveraging Groovy’s servlet / template support and dynamic
                   capabilities

mercredi 19 mai 2010
Questions & Answers




mercredi 19 mai 2010
Thanks for your attention!


                                          e
                                    aforg pment
                           ume L Develo
                  Guilla Groovy
                  Hea d of             m ail.com
                             afo rge@g
                   E mail: gl glaforge
                              @
                   T witter :

                                                       References:
                                                   •   http://gaelyk.appspot.com/
                                                   •   http://groovy.codehaus.org/
                                                   •   http://code.google.com/appengine/




mercredi 19 mai 2010
Images used in this presentation
            Clouds
                   http://www.morguefile.com/archive/display/627059
                   http://www.morguefile.com/archive/display/625552
                   http://www.morguefile.com/archive/display/629785
            Duke ok GAE
                   http://code.google.com/images/duke-on-gae.jpg
                   http://weblogs.java.net/blog/felipegaucho/archive/ae_gwt_java.png
            Python logo : http://python.org/images/python-logo.gif
            Gaelyc cross with clouds : http://www.morguefile.com/archive/display/37889
            Speed limit : http://www.morguefile.com/archive/display/18492
            Warehouse : http://www.morguefile.com/archive/display/85628
            Snow foot steps : http://www.flickr.com/photos/robinvanmourik/2875929243/
            Sugar : http://www.flickr.com/photos/ayelie/441101223/sizes/l/




mercredi 19 mai 2010

Contenu connexe

En vedette

Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012Guillaume Laforge
 
Groovy Update - JavaPolis 2007
Groovy Update - JavaPolis 2007Groovy Update - JavaPolis 2007
Groovy Update - JavaPolis 2007Guillaume 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 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 Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Guillaume 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
 

En vedette (9)

Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012
 
Groovy Update - JavaPolis 2007
Groovy Update - JavaPolis 2007Groovy Update - JavaPolis 2007
Groovy Update - JavaPolis 2007
 
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 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.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 2 and beyond
Groovy 2 and beyondGroovy 2 and beyond
Groovy 2 and beyond
 
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
 

Similaire à Gaelyk quickie - GR8Conf Europe 2010 - Guillaume Laforge

Tek 2013 - Building Web Apps from a New Angle with AngularJS
Tek 2013 - Building Web Apps from a New Angle with AngularJSTek 2013 - Building Web Apps from a New Angle with AngularJS
Tek 2013 - Building Web Apps from a New Angle with AngularJSPablo Godel
 
Lone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New AngleLone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New AnglePablo Godel
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Guillaume Laforge
 
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...Guillaume Laforge
 
Gaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume LaforgeGaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume LaforgeGuillaume Laforge
 
Frozen Rails Slides
Frozen Rails SlidesFrozen Rails Slides
Frozen Rails Slidescarllerche
 
Movable Type Seminar 2011
Movable Type Seminar 2011Movable Type Seminar 2011
Movable Type Seminar 2011Six Apart KK
 
Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5
Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5
Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5Sadaaki HIRAI
 
Ratpack - Classy and Compact Groovy Web Apps
Ratpack - Classy and Compact Groovy Web AppsRatpack - Classy and Compact Groovy Web Apps
Ratpack - Classy and Compact Groovy Web AppsJames Williams
 
cdac@parag.gajbhiye@test123
cdac@parag.gajbhiye@test123cdac@parag.gajbhiye@test123
cdac@parag.gajbhiye@test123Parag Gajbhiye
 
Googleappengineintro 110410190620-phpapp01
Googleappengineintro 110410190620-phpapp01Googleappengineintro 110410190620-phpapp01
Googleappengineintro 110410190620-phpapp01Tony Frame
 
HTML5 Who what where when why how
HTML5 Who what where when why howHTML5 Who what where when why how
HTML5 Who what where when why howbrucelawson
 
Play Framework on Google App Engine
Play Framework on Google App EnginePlay Framework on Google App Engine
Play Framework on Google App EngineFred Lin
 
The Rich Standard: Getting Familiar with HTML5
The Rich Standard: Getting Familiar with HTML5The Rich Standard: Getting Familiar with HTML5
The Rich Standard: Getting Familiar with HTML5Todd Anglin
 
Javascript Frameworks Comparison - Angular, Knockout, Ember and Backbone
Javascript Frameworks Comparison - Angular, Knockout, Ember and BackboneJavascript Frameworks Comparison - Angular, Knockout, Ember and Backbone
Javascript Frameworks Comparison - Angular, Knockout, Ember and BackboneDeepu S Nath
 

Similaire à Gaelyk quickie - GR8Conf Europe 2010 - Guillaume Laforge (20)

Tek 2013 - Building Web Apps from a New Angle with AngularJS
Tek 2013 - Building Web Apps from a New Angle with AngularJSTek 2013 - Building Web Apps from a New Angle with AngularJS
Tek 2013 - Building Web Apps from a New Angle with AngularJS
 
Lone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New AngleLone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New Angle
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
 
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...
 
Gaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume LaforgeGaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume Laforge
 
Frozen Rails Slides
Frozen Rails SlidesFrozen Rails Slides
Frozen Rails Slides
 
GWT♥HTML5
GWT♥HTML5GWT♥HTML5
GWT♥HTML5
 
Django introduction
Django introductionDjango introduction
Django introduction
 
Movable Type Seminar 2011
Movable Type Seminar 2011Movable Type Seminar 2011
Movable Type Seminar 2011
 
Základy GWT
Základy GWTZáklady GWT
Základy GWT
 
Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5
Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5
Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5
 
Ratpack - Classy and Compact Groovy Web Apps
Ratpack - Classy and Compact Groovy Web AppsRatpack - Classy and Compact Groovy Web Apps
Ratpack - Classy and Compact Groovy Web Apps
 
HTML5 Intro
HTML5 IntroHTML5 Intro
HTML5 Intro
 
cdac@parag.gajbhiye@test123
cdac@parag.gajbhiye@test123cdac@parag.gajbhiye@test123
cdac@parag.gajbhiye@test123
 
Googleappengineintro 110410190620-phpapp01
Googleappengineintro 110410190620-phpapp01Googleappengineintro 110410190620-phpapp01
Googleappengineintro 110410190620-phpapp01
 
HTML5 Who what where when why how
HTML5 Who what where when why howHTML5 Who what where when why how
HTML5 Who what where when why how
 
Croogo
CroogoCroogo
Croogo
 
Play Framework on Google App Engine
Play Framework on Google App EnginePlay Framework on Google App Engine
Play Framework on Google App Engine
 
The Rich Standard: Getting Familiar with HTML5
The Rich Standard: Getting Familiar with HTML5The Rich Standard: Getting Familiar with HTML5
The Rich Standard: Getting Familiar with HTML5
 
Javascript Frameworks Comparison - Angular, Knockout, Ember and Backbone
Javascript Frameworks Comparison - Angular, Knockout, Ember and BackboneJavascript Frameworks Comparison - Angular, Knockout, Ember and Backbone
Javascript Frameworks Comparison - Angular, Knockout, Ember and Backbone
 

Plus de Guillaume Laforge

Groovy 1.8 et 2.0 au BreizhC@mp 2012
Groovy 1.8 et 2.0 au BreizhC@mp 2012Groovy 1.8 et 2.0 au BreizhC@mp 2012
Groovy 1.8 et 2.0 au BreizhC@mp 2012Guillaume Laforge
 
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012Guillaume Laforge
 
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume LaforgeGroovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume 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
 
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
 
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...Guillaume Laforge
 
Cloud foundry intro with groovy
Cloud foundry intro with groovyCloud foundry intro with groovy
Cloud foundry intro with groovyGuillaume Laforge
 
Groovy update - S2GForum London 2011 - Guillaume Laforge
Groovy update - S2GForum London 2011 - Guillaume LaforgeGroovy update - S2GForum London 2011 - Guillaume Laforge
Groovy update - S2GForum London 2011 - Guillaume LaforgeGuillaume Laforge
 
Groovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume LaforgeGroovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume LaforgeGuillaume Laforge
 
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011Guillaume Laforge
 
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011Guillaume Laforge
 
Groovy Ecosystem - JFokus 2011 - Guillaume Laforge
Groovy Ecosystem - JFokus 2011 - Guillaume LaforgeGroovy Ecosystem - JFokus 2011 - Guillaume Laforge
Groovy Ecosystem - JFokus 2011 - Guillaume LaforgeGuillaume Laforge
 
Groovy and Gaelyk - Lausanne JUG 2011 - Guillaume Laforge
Groovy and Gaelyk - Lausanne JUG 2011 - Guillaume LaforgeGroovy and Gaelyk - Lausanne JUG 2011 - Guillaume Laforge
Groovy and Gaelyk - Lausanne JUG 2011 - Guillaume LaforgeGuillaume Laforge
 
Gaelyk - Paris GGUG 2011 - Guillaume Laforge
Gaelyk - Paris GGUG 2011 - Guillaume LaforgeGaelyk - Paris GGUG 2011 - Guillaume Laforge
Gaelyk - Paris GGUG 2011 - Guillaume LaforgeGuillaume Laforge
 

Plus de Guillaume Laforge (20)

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
 
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...
 
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
 
Cloud foundry intro with groovy
Cloud foundry intro with groovyCloud foundry intro with groovy
Cloud foundry intro with groovy
 
Groovy update - S2GForum London 2011 - Guillaume Laforge
Groovy update - S2GForum London 2011 - Guillaume LaforgeGroovy update - S2GForum London 2011 - Guillaume Laforge
Groovy update - S2GForum London 2011 - Guillaume Laforge
 
Groovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume LaforgeGroovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume Laforge
 
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
 
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
 
Groovy Ecosystem - JFokus 2011 - Guillaume Laforge
Groovy Ecosystem - JFokus 2011 - Guillaume LaforgeGroovy Ecosystem - JFokus 2011 - Guillaume Laforge
Groovy Ecosystem - JFokus 2011 - Guillaume Laforge
 
Groovy and Gaelyk - Lausanne JUG 2011 - Guillaume Laforge
Groovy and Gaelyk - Lausanne JUG 2011 - Guillaume LaforgeGroovy and Gaelyk - Lausanne JUG 2011 - Guillaume Laforge
Groovy and Gaelyk - Lausanne JUG 2011 - Guillaume Laforge
 
Gaelyk - Paris GGUG 2011 - Guillaume Laforge
Gaelyk - Paris GGUG 2011 - Guillaume LaforgeGaelyk - Paris GGUG 2011 - Guillaume Laforge
Gaelyk - Paris GGUG 2011 - Guillaume Laforge
 

Dernier

08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 

Dernier (20)

08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 

Gaelyk quickie - GR8Conf Europe 2010 - Guillaume Laforge

  • 1. F GAELYK a lightweight Groovy toolkit for Google App Engine Guillaume Laforge SpringSource, a division of VMWare mercredi 19 mai 2010
  • 2. 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. IaaS, PaaS, SaaS Software as a Service Gmail, SalesForce.com SaaS Platform as a Service Google App Engine PaaS Infrastructure as a Service Amazon EC2 IaaS mercredi 19 mai 2010
  • 5. IaaS, PaaS, SaaS Software as a Service Gmail, SalesForce.com SaaS Platform as a Service Google App Engine PaaS Infrastructure as a Service Amazon EC2 IaaS mercredi 19 mai 2010
  • 6. IaaS, PaaS, SaaS Software as a Service Gmail, SalesForce.com SaaS Platform as a Service Google App Engine PaaS Infrastructure as a Service Amazon EC2 IaaS mercredi 19 mai 2010
  • 10. Gaelyk Gaelyk is a lightweight Groovy toolkit on top of the Google App Engine Java SDK Gaelyk builds on Groovy’s servlet support Groovlets: Groovy scripts instead of raw servlets! Groovy templates: JSP-like template engine Both allow for a clean separation of views and logic Gaelyk provides several enhancements around the GAE Java SDK to make life easier, thanks to Groovy’s dynamic nature mercredi 19 mai 2010
  • 11. Why Groovy? Groovy is a dynamic language for the JVM very flexible, malleable, expressive and concise syntax easy to learn for Java developers deriving from the Java 5 grammar provides powerful APIs to simplify the life of developers possibility to dynamically enrich existing APIs support for Groovlets and its own template engine The truth: We worked with the Google App Engine Java team before the official launch of the platform, to ensure Groovy would run well on this new environment mercredi 19 mai 2010
  • 12. First steps... • Go to http://gaelyk.appspot.com • Download the template project • Put your first Groovlet in /WEB-INF/ groovy • And your templates at the root • And you’re ready to go! mercredi 19 mai 2010
  • 13. The web.xml "> <web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5 <servlet> <servlet-name>GroovletServlet</servlet-name> <servlet-class>groovyx.gaelyk.GaelykServlet</servlet-class> </servlet> <servlet> <servlet-name>TemplateServlet</servlet-name> -class> <servlet-class>groovyx.gaelyk.GaelykTemplateServlet</servlet </servlet> <servlet-mapping> <servlet-name>GroovletServlet</servlet-name> <url-pattern>*.groovy</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>TemplateServlet</servlet-name> <url-pattern>*.gtpl</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.gtpl</welcome-file> </welcome-file-list> </web-app> mercredi 19 mai 2010
  • 14. MVC: Groovlets and templates Groovlets Templates (controllers) (views) Entities (domain) mercredi 19 mai 2010
  • 15. A groovlet Instead of writing full-blown servlets, just write Groovy scripts (aka Groovlets) def numbers = [1, 2, 3, 4] def now = new Date() html.html { body { numbers.each { number -> p number } p now } } mercredi 19 mai 2010
  • 16. A template <html> <body> <p><% def message = "Hello World!" print message %> </p> <p><%= message %></p> <p>${message}</p> <ul> <% 3.times { %> <li>${message}</li> <% } %> </ul> </body> </html> mercredi 19 mai 2010
  • 17. Shortcuts Variables available request / response Google services context / applicaiton datastore session blobstore params / header memcache out / sout / html urlFetch localMode / app.* mail userService / user Methods available defaultQueue / queues include / forward / redirect xmpp print / println mercredi 19 mai 2010
  • 19. Sending emails with Gaelyk mail.send to: 'foobar@gmail.com', from: 'other@gmail.com', subject: 'Hello World', htmlBody: '<bold>Hello</bold>' mercredi 19 mai 2010
  • 20. ...compared to Java Properties props = new Properties(); ops, null); Ses sion session = Session.getDefaultInstance(pr String msgBody = "..."; try { Message msg = new MimeMessage(session); m", "Admin"));     msg.se tFrom(new InternetAddress("admin@example.co TO,     msg.addRecipient(Message.RecipientType. "Mr. User"));                      new InternetAddress("user@example.com", n activated");     msg .setSubject("Your Example.com account has bee     msg.setText(msgBody);     Transport.send(msg); } catch (AddressException e) {} } catch (MessagingException e) {} mercredi 19 mai 2010
  • 21. Accessing the datastore Direct interaction with the low-level datastore API ty import com.google.appengine.api.datastore.Enti   Entity entity = new Entity("person")   map // subscript notation, like when accessing a entity['name'] = "Guillaume Laforge"   // normal property access notation entity.age = 32 entity.save() entity.delete() datastore.withTransaction { // do stuff with your entities // within the transaction } mercredi 19 mai 2010
  • 22. Querying to be improved... import com.google.appengine.api.datastore.* der.* import static com.google.appengine.api.datastore.FetchOptions.Buil   // query the scripts stored in the datastore def query = new Query("savedscript")   // sort results by descending order of the creation date query.addSort("dateCreated", Query.SortDirection.DESCENDING)   author // filters the entities so as to return only scripts by a certain r) query.addFilter("author", Query.FilterOperator.EQUAL, params.autho   PreparedQuery preparedQuery = datastore.prepare(query)   // return only the first 10 results def entities = preparedQuery.asList( withLimit(10) ) mercredi 19 mai 2010
  • 23. ...into something groovier? def entities = datastore.createQuery { select from: savedscript sort DESC, on: dateCreated where author == params.author limit 10 } as List mercredi 19 mai 2010
  • 24. ...into something groovier? def entities = datastore.createQuery { select from: savedscript sort DESC, on: dateCreated where author == params.author te d! limit 10 en } as List l p em t Im t Ye N o mercredi 19 mai 2010
  • 25. Task queue API // access a configured queue using the subscript notation queues['dailyEmailQueue']   // or using the property access notation queues.dailyEmailQueue   // you can also access the default queue with: queues.default defaultQueue // add a task to the queue queue << [ countdownMillis: 1000, url: "/task/dailyEmail", taskName: "sendDailyEmailNewsletter", method: 'PUT', params: [date: '20090914'], payload: content ] mercredi 19 mai 2010
  • 26. Jabber / XMPP support (1/3) Sending instant messages String recipient = "someone@gmail.com"   // check if the user is online if (xmpp.getPresence(recipient).isAvailable()) { // send the message def status = xmpp.send(to: recipient, body: "Hello, how are you?")   // checks the message was successfully // delivered to all the recipients assert status.isSuccessful() } mercredi 19 mai 2010
  • 27. Jabber / XMPP support (2/3) Sending instant messages with an XML payload String recipient = "service@gmail.com"   // check if the service is online if (xmpp.getPresence(recipient).isAvailable()) { // send the message def status = xmpp.send(to: recipient, xml: { customers { customer(id: 1) { name 'Google' } } })   // checks the message was successfully delivered to the service assert status.isSuccessful() } mercredi 19 mai 2010
  • 28. Jabber / XMPP support (2/3) Sending instant messages with an XML payload String recipient = "service@gmail.com"   // check if the service is online if (xmpp.getPresence(recipient).isAvailable()) { // send the message def status = xmpp.send(to: recipient, xml: { customers { customer(id: 1) { <customers> name 'Google' <customer id=’1’> } <name>Google</name> } </customer> }) </customers>   // checks the message was successfully delivered to the service assert status.isSuccessful() } mercredi 19 mai 2010
  • 29. Jabber / XMPP support (3/3) Receving incoming instant messages Configure the XmppServlet in web.xml Add the inbound message service in appengine-web.xml // get the body of the message message.body // get the sender Jabber ID message.from // get the list of recipients Jabber IDs message.recipients   // if the message is an XML document instead of a raw string message if (message.isXml()) { // get the raw XML message.stanza // get a document parsed with XmlSlurper message.xml } mercredi 19 mai 2010
  • 30. Memcache service Map notation access to the cache } class Country implements Serialzable { String name   def countryFr = new Country(name: 'France')   in the cache // use the subscript notation to put a country object // (you can also use non-string keys) memcache['FR'] = countryFr   // check that a key is present in the cache if ('FR' in memcache) { the cache using a key // use the subscript notation to get an entry from def countryFromCache = memcache['FR'] } mercredi 19 mai 2010
  • 31. URL Routing system You can have friendly URL mappings with the URL routing system introduce in Gaelyk 0.3.2 all "/blog/@year/@month/@day/@title", @day@title=@title" forward: "/blog.groovy?year=@year&month=@month@day= get "/blog/@year/@month/@day", @day" forward: "/blog.groovy?year=@year&month=@month@day= all "/aboutus", redirect: "/blog/2008/10/20/about-us" get "/book/isbn/@isbn", forward: "/book.groovy?isbn=@isbn", validate: { isbn ==~ /d{9}(d|X)/ } mercredi 19 mai 2010
  • 32. Simple plugin system (1/3) Gaelyk 0.4 introduces a simple plugin system for extending your apps and share commonalities A plugin lets you provide additional groovlets and templates contribute new URL routes add new categories define variables in the binding provide any static content add new libraries do any initialization mercredi 19 mai 2010
  • 33. Simple plugin system (2/3) A plugin is actually just a zip file! Basically, just a Gaelyk application, minus... the Groovy / Gaelyk / GAE JARs the web.xml and appengine-web.xml descriptors But with a /WEB-INF/plugins/myplugin.groovy descriptor A plugin must be referenced in /WEB-INF/ plugins.groovy with install myplugin shortcut to /WEB-INF/plugins/myplugin.groovy mercredi 19 mai 2010
  • 34. Simple plugin system (3/3) An example plugin descriptor /WEB-INF/plugins/jsonPlugin.groovy import net.sf.json.* import net.sf.json.groovy.*   // add new variables in the binding binding { le jsonLibVersion = "2.3"          // a simple string variab  of a 3rd‐party JAR json = new JsonGroovyBuilder()  // an instance of a class }   // add new routes with the usual routing system format routes { get "/json", forward: "/json.groovy" }   // install a category you've developped categories jsonlib.JsonlibCategory   // any other initialization code you'd need mercredi 19 mai 2010
  • 35. What’s coming next? Gaelyk 0.4 was released a few days ago Features a lightweight plugin system A 0.4.1 bug fix is coming soon Expect more sugar around the Datastore An SQL-like query DSL Easier relationship management (builder) Perhaps pre-compiled groovlets and templates More generally... Anything that’ll come up in upcoming GAE SDK versions mercredi 19 mai 2010
  • 36. Summary Easy access to a cloud solution Deploying Java apps, as easily as you would with PHP Familiar to Java folks Your good old Servlet centric webapps style Pretty cheap You need a high-trafficed website to reach the quotas Gaelyk provides a simplified approach to creating Servlet centric webapps in a productive manner Leveraging Groovy’s servlet / template support and dynamic capabilities mercredi 19 mai 2010
  • 38. Thanks for your attention! e aforg pment ume L Develo Guilla Groovy Hea d of m ail.com afo rge@g E mail: gl glaforge @ T witter : References: • http://gaelyk.appspot.com/ • http://groovy.codehaus.org/ • http://code.google.com/appengine/ mercredi 19 mai 2010
  • 39. Images used in this presentation Clouds http://www.morguefile.com/archive/display/627059 http://www.morguefile.com/archive/display/625552 http://www.morguefile.com/archive/display/629785 Duke ok GAE http://code.google.com/images/duke-on-gae.jpg http://weblogs.java.net/blog/felipegaucho/archive/ae_gwt_java.png Python logo : http://python.org/images/python-logo.gif Gaelyc cross with clouds : http://www.morguefile.com/archive/display/37889 Speed limit : http://www.morguefile.com/archive/display/18492 Warehouse : http://www.morguefile.com/archive/display/85628 Snow foot steps : http://www.flickr.com/photos/robinvanmourik/2875929243/ Sugar : http://www.flickr.com/photos/ayelie/441101223/sizes/l/ mercredi 19 mai 2010