SlideShare ist ein Scribd-Unternehmen logo
1 von 49
Google App Engine,
                                                     Groovy and Gaelyk




Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
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, SpringOne, JAX,
     Dynamic Language World, IJTC, and more...

Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   2
Marc-Antoine Guarrigue &
  Gaël Lazzari

   •Marc-Antoine
           – Architecte et Directeur de la R&D chez OCTO
             Technology depuis 2001
                  •Missions d’architecture d’applications Java EE
                  •«Open Sourceur» dans l’âme
                          – JCaptcha
                          – Membre de l’OSSGTP
                  •Developpement des sociétés
                          – MassiveBrainGames.com
                          – XDepend.com


   •Gaël Lazzari
           – Consultant OCTO depuis septembre 2009

Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   3
Cloud
Computing
tiq ue
       rm a
  ’info
l
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
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.          6
Google App Engine Java
Google App Engine Java
Google App Engine

   • Google’s PaaS solution
   • Run your app on Google’s infrastructure
   • Initially just Python supported
   • Since this year, Java supported too
           – Sandboxed JVM
           – Jetty servlet container
   • Several JVM-compatible language supported
   • A few services available
           – Email, XMPP, URL Fetch, Image, User, Task queues...




Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   8
Key aspects

   • You can use most of your usual web frameworks for
     developping apps on App Engine Java
           –A WAR file, basically!

   • No OS image, or software to install
           – Unlike with Amazon EC2

   • All the scaling aspects are handled for you
           – Database / session replication, load balancing

   • There are quotas, but you need a high traffic
     application to start being charged
           –Free to get started

Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   9
Available services

   •Memcache                                                                                                  •XMPP
           – JCache implementation                                                                                   – Send / receive Jabber
           – Save on CPU and DB                                                                                        messages (GTalk)

   •URL Fetch
                                                                                                              •User
           – Access remote resources
                                                                                                                     – Use Google’s user/
           – HttpUrlConnection                                                                                         authentication system
   •Mail
           – Support both incoming                                                                            •Cron & Task queues
             and outgoing emails                                                                                     – Schedule tasks at
                                                                                                                       regular intervals
   •Images
                                                                                                                     – Queue units of work
           – Resize, crop, rotate...

Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                             10
Limitations

   •Not our usual relational database
           – key / value datastore

   •30 seconds request duration limit
   • Forbidden to
           – write on the file system
           – create threads
           – use raw sockets
           – issue system calls
           – use IO / Swing / etc. directly
                  •There’s a whitelist of classes allowed

   • Number of files and their size are limited
Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   11
Quotas




Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   12
Quotas (1/2)

   •Bandwidth                                                                                                 •Mail
           – 1,3M requests/day                                                                                       – 7K calls/day
           – 1GB/day in/out                                                                                          – 2K recepients/day
           – 6.5 CPU hours/day                                                                                       – 5K emails/day
                                                                                                                     – 2K attachments
   •Datastore                                                                                                        – 100MB of attachments
           – 10M calls
           – 1GB/day                                                                                          •URL Fetch
           – 12GB in / 115GB out                                                                                     – 657K calls/day
           – 60 CPU hours/day                                                                                        – 4GB in/out /day



Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                            13
Quotas (2/2)

   •XMPP                                                                                                      •Memcache
           – 657K calls/day                                                                                          – 8.6M calls/day
           – 4GB data sent/day                                                                                       – 10GB in
           – 657K recepients/day                                                                                     – 50GB out
           – 1MB invitations/day
                                                                                                              •Task queues
   •Image manipulation                                                                                               – 100K calls

    –864 calls/day
    –1GB in / 5GB out
    –2.5M transforms



Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                      14
Nice dashboard
The Datastore
The datastore...

   •It’s not your father’s relational database!
           –You’re not even using SQL!
   • Distributed key / value store
           – Based on Google’s «BigTable»
   • Supporting
           – Transactions and partitioning
           – Hierarchies through entity groups
   • Schema-less approach
   • Data access APIs
           – JPA and JDO
           – Direct low-level APIs


Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   17
...and its «limitations»

   • You’re not using SQL
           –No joins
           – No database constraints
           – No aggregation functions (count, avg...)
   • You can only retrieve 1000 records per query
   • In a query, you can only filter on one column for
     inequality
   • Transactions only available in entity groups
   • You can only update an entity once in a transaction




Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   18
F
F
http://gaelyk.appspot.com




                            F
http://gaelyk.appspot.com




                            F
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
           – features its own template engine


   • 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

Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   20
• 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


Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   21
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!
•Launch dev_appserver.sh
•Go to http://localhost:8080/
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>


Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   23
Shortcuts

   •Variables available                                                                                       •Google services
           – request / response                                                                                      – datastoreService
           – context / applicaiton                                                                                   – memcacheService
           – session                                                                                                 – urlFetchService
           – params                                                                                                  – mailService
           – header                                                                                                  – userService
           – out / sout / html                                                                                       – user
                                                                                                                     – defaultQueue
   •Methods available                                                                                                – queues
           – include / forward                                                                                       – xmppService
           – print / println


Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                        24
Groovy sugar!
Sending emails with Gaelyk




              mailService.send to: 'admin@example.com',
                  from: 'user@example.com',
                  subject: 'Hello World',
                  htmlBody: '<bold>Hello</bold>'




Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   26
...compared to Java


Properties props = new Properties();
                                             (props, null);
Session session = Session.getDefaultInstance

String msgBody = "...";

try {
    Message msg = new MimeMessage(session);                     "));
    msg.setFrom(new InternetAddress("admin@example.com", "Admin
                                            TO,
    msg.addRecipient(Message.RecipientType.
                                                        com", "Mr. User"));
                     new InternetAddress("user@example.
                                                             ted");
    msg.setSubject("Your Example.com account has been activa
    msg.setText(msgBody);
    Transport.send(msg);
} catch (AddressException e) {}
} catch (MessagingException e) {}




Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   27
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
                                }
                            }




Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   28
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>



Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   29
Accessing the datastore

   • Direct interaction with the low-level datastore APIs
                                                                                          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()

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



Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   30
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 = datastoreService.prepare(query)
                 
                // return only the first 10 results
                def entities = preparedQuery.asList( withLimit(10) )




Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   31
...into something groovier?




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




Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   32
...into something groovier?




                             def entities = Query.create {
                                 select from: savedscript               d !
                                 sort DESC, on: dateCreated
                                                                    nte
                                 where { author == params.author e }
                                                                 m
                                 limit 10
                             } as List                      p le
                                                                                                                            t Im
                                                                                                                       Ye
                                                                                                                 o   t
                                                                                                               N

Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                 32
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: "Send daily email newsletter",
                                     method: 'PUT', params: [date: '20090914'],
                                     payload: content
                                 ]




Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   33
Jabber / XMPP support (1/3)

   • Sending instant messages


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




Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   34
Jabber / XMPP support (2/3)

   • Sending instant messages with an XML payload

                        String recipient = "service@gmail.com"
                         
                        // check if the service is online
                        if (xmppService.getPresence(recipient).isAvailable()) {
                            // send the message
                            def status = xmppService.send to: recipient, xml: {
                                customers {
                                    customer(id: 1) {
                                        name 'Google'
                                                     }
                                            }
                                  }
                          
                                  // checks the message was successfully delivered to the service
                                  assert status.isSuccessful()
                         }




Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   35
Jabber / XMPP support (2/3)

   • Sending instant messages with an XML payload

                        String recipient = "service@gmail.com"
                         
                        // check if the service is online
                        if (xmppService.getPresence(recipient).isAvailable()) {
                            // send the message
                            def status = xmppService.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()
                         }




Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   35
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
                                    }




Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   36
What’s coming next?

   • Add more sugar around...
           – The Memcache service
           – The incoming email support in GAE SDK 1.2.6
           – The Datastore query system
                  •SQL-like DSL
                  •dynamic finders


   • More generally...
           – Anything that’ll come up in upcoming GAE SDK versions




Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   37
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

Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   38
L aforge elopment
        laume ovy Dev
   Guil
   Hea
    glaf orge@
              ro
        d of G mail.com
               g                                                                                                     Q&A

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




Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Images utilisées
  dans cette présentation
   • Nuages
           – http://www.morguefile.com/archive/display/627059
           – http://www.morguefile.com/archive/display/625552
           – http://www.morguefile.com/archive/display/629785

   • Le village dans les nuages
           – http://www.collectoy.com/photoBDD/Disque/Le%20village%20dans%20les%20nuages%20(%20face%20).jpg
   •     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/




Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   40

Weitere ähnliche Inhalte

Was ist angesagt?

Acquia Search Overview
Acquia Search OverviewAcquia Search Overview
Acquia Search OverviewAcquia
 
Lessons from Highly Scalable Architectures at Social Networking Sites
Lessons from Highly Scalable Architectures at Social Networking SitesLessons from Highly Scalable Architectures at Social Networking Sites
Lessons from Highly Scalable Architectures at Social Networking SitesPatrick Senti
 
Inside the Hadoop Machine @ VMworld
Inside the Hadoop Machine @ VMworldInside the Hadoop Machine @ VMworld
Inside the Hadoop Machine @ VMworldRichard McDougall
 
App cap2956v2-121001194956-phpapp01 (1)
App cap2956v2-121001194956-phpapp01 (1)App cap2956v2-121001194956-phpapp01 (1)
App cap2956v2-121001194956-phpapp01 (1)outstanding59
 
Big Data and Hadoop in Cloud - Leveraging Amazon EMR
Big Data and Hadoop in Cloud - Leveraging Amazon EMRBig Data and Hadoop in Cloud - Leveraging Amazon EMR
Big Data and Hadoop in Cloud - Leveraging Amazon EMRVijay Rayapati
 
ROMA User-Customizable NoSQL Database in Ruby
ROMA User-Customizable NoSQL Database in RubyROMA User-Customizable NoSQL Database in Ruby
ROMA User-Customizable NoSQL Database in RubyRakuten Group, Inc.
 
Virtualization Primer for Java Developers
Virtualization Primer for Java DevelopersVirtualization Primer for Java Developers
Virtualization Primer for Java DevelopersRichard McDougall
 
Apachecon Euro 2012: Elastic, Multi-tenant Hadoop on Demand
Apachecon Euro 2012: Elastic, Multi-tenant Hadoop on DemandApachecon Euro 2012: Elastic, Multi-tenant Hadoop on Demand
Apachecon Euro 2012: Elastic, Multi-tenant Hadoop on DemandRichard McDougall
 
Hadoop World 2011: The Hadoop Stack - Then, Now and in the Future - Eli Colli...
Hadoop World 2011: The Hadoop Stack - Then, Now and in the Future - Eli Colli...Hadoop World 2011: The Hadoop Stack - Then, Now and in the Future - Eli Colli...
Hadoop World 2011: The Hadoop Stack - Then, Now and in the Future - Eli Colli...Cloudera, Inc.
 
Architecting Virtualized Infrastructure for Big Data
Architecting Virtualized Infrastructure for Big DataArchitecting Virtualized Infrastructure for Big Data
Architecting Virtualized Infrastructure for Big DataRichard McDougall
 
OVERVIEW OF FACEBOOK SCALABLE ARCHITECTURE.
OVERVIEW  OF FACEBOOK SCALABLE ARCHITECTURE.OVERVIEW  OF FACEBOOK SCALABLE ARCHITECTURE.
OVERVIEW OF FACEBOOK SCALABLE ARCHITECTURE.Rishikese MR
 
Architecture of a Modern Web App - SpringOne India
Architecture of a Modern Web App - SpringOne IndiaArchitecture of a Modern Web App - SpringOne India
Architecture of a Modern Web App - SpringOne IndiaJeremy Grelle
 
Chef - Evolving with Infrastructure Automation
Chef - Evolving with Infrastructure AutomationChef - Evolving with Infrastructure Automation
Chef - Evolving with Infrastructure AutomationNathaniel Brown
 
Yahoo Communities Architecture Unlikely Bedfellows
Yahoo Communities Architecture Unlikely BedfellowsYahoo Communities Architecture Unlikely Bedfellows
Yahoo Communities Architecture Unlikely BedfellowsConSanFrancisco123
 
Starting up a cost free library portal for small-funded libraries
Starting up a cost free library portal for small-funded librariesStarting up a cost free library portal for small-funded libraries
Starting up a cost free library portal for small-funded librariesMaria Cecilia Ayson
 
NOSQL, CouchDB, and the Cloud
NOSQL, CouchDB, and the CloudNOSQL, CouchDB, and the Cloud
NOSQL, CouchDB, and the Cloudboorad
 

Was ist angesagt? (19)

Acquia Search Overview
Acquia Search OverviewAcquia Search Overview
Acquia Search Overview
 
Lessons from Highly Scalable Architectures at Social Networking Sites
Lessons from Highly Scalable Architectures at Social Networking SitesLessons from Highly Scalable Architectures at Social Networking Sites
Lessons from Highly Scalable Architectures at Social Networking Sites
 
Inside the Hadoop Machine @ VMworld
Inside the Hadoop Machine @ VMworldInside the Hadoop Machine @ VMworld
Inside the Hadoop Machine @ VMworld
 
Email
Email Email
Email
 
App cap2956v2-121001194956-phpapp01 (1)
App cap2956v2-121001194956-phpapp01 (1)App cap2956v2-121001194956-phpapp01 (1)
App cap2956v2-121001194956-phpapp01 (1)
 
Big Data and Hadoop in Cloud - Leveraging Amazon EMR
Big Data and Hadoop in Cloud - Leveraging Amazon EMRBig Data and Hadoop in Cloud - Leveraging Amazon EMR
Big Data and Hadoop in Cloud - Leveraging Amazon EMR
 
ROMA User-Customizable NoSQL Database in Ruby
ROMA User-Customizable NoSQL Database in RubyROMA User-Customizable NoSQL Database in Ruby
ROMA User-Customizable NoSQL Database in Ruby
 
Virtualization Primer for Java Developers
Virtualization Primer for Java DevelopersVirtualization Primer for Java Developers
Virtualization Primer for Java Developers
 
Apachecon Euro 2012: Elastic, Multi-tenant Hadoop on Demand
Apachecon Euro 2012: Elastic, Multi-tenant Hadoop on DemandApachecon Euro 2012: Elastic, Multi-tenant Hadoop on Demand
Apachecon Euro 2012: Elastic, Multi-tenant Hadoop on Demand
 
Hadoop World 2011: The Hadoop Stack - Then, Now and in the Future - Eli Colli...
Hadoop World 2011: The Hadoop Stack - Then, Now and in the Future - Eli Colli...Hadoop World 2011: The Hadoop Stack - Then, Now and in the Future - Eli Colli...
Hadoop World 2011: The Hadoop Stack - Then, Now and in the Future - Eli Colli...
 
Qcon
QconQcon
Qcon
 
Apache performance
Apache performanceApache performance
Apache performance
 
Architecting Virtualized Infrastructure for Big Data
Architecting Virtualized Infrastructure for Big DataArchitecting Virtualized Infrastructure for Big Data
Architecting Virtualized Infrastructure for Big Data
 
OVERVIEW OF FACEBOOK SCALABLE ARCHITECTURE.
OVERVIEW  OF FACEBOOK SCALABLE ARCHITECTURE.OVERVIEW  OF FACEBOOK SCALABLE ARCHITECTURE.
OVERVIEW OF FACEBOOK SCALABLE ARCHITECTURE.
 
Architecture of a Modern Web App - SpringOne India
Architecture of a Modern Web App - SpringOne IndiaArchitecture of a Modern Web App - SpringOne India
Architecture of a Modern Web App - SpringOne India
 
Chef - Evolving with Infrastructure Automation
Chef - Evolving with Infrastructure AutomationChef - Evolving with Infrastructure Automation
Chef - Evolving with Infrastructure Automation
 
Yahoo Communities Architecture Unlikely Bedfellows
Yahoo Communities Architecture Unlikely BedfellowsYahoo Communities Architecture Unlikely Bedfellows
Yahoo Communities Architecture Unlikely Bedfellows
 
Starting up a cost free library portal for small-funded libraries
Starting up a cost free library portal for small-funded librariesStarting up a cost free library portal for small-funded libraries
Starting up a cost free library portal for small-funded libraries
 
NOSQL, CouchDB, and the Cloud
NOSQL, CouchDB, and the CloudNOSQL, CouchDB, and the Cloud
NOSQL, CouchDB, and the Cloud
 

Andere mochten auch

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
 
Groovy introduction - IJTC 2008
Groovy introduction - IJTC 2008Groovy introduction - IJTC 2008
Groovy introduction - IJTC 2008Guillaume Laforge
 
Groovy 1 7 Update, past, present, future - S2G Forum 2010
Groovy 1 7 Update, past, present, future - S2G Forum 2010Groovy 1 7 Update, past, present, future - S2G Forum 2010
Groovy 1 7 Update, past, present, future - S2G Forum 2010Guillaume 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 in the Enterprise - Case Studies - TSSJS Prague 2008 - Guillaume Laforge
Groovy in the Enterprise - Case Studies - TSSJS Prague 2008 - Guillaume LaforgeGroovy in the Enterprise - Case Studies - TSSJS Prague 2008 - Guillaume Laforge
Groovy in the Enterprise - Case Studies - TSSJS Prague 2008 - 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
 

Andere mochten auch (6)

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
 
Groovy introduction - IJTC 2008
Groovy introduction - IJTC 2008Groovy introduction - IJTC 2008
Groovy introduction - IJTC 2008
 
Groovy 1 7 Update, past, present, future - S2G Forum 2010
Groovy 1 7 Update, past, present, future - S2G Forum 2010Groovy 1 7 Update, past, present, future - S2G Forum 2010
Groovy 1 7 Update, past, present, future - S2G Forum 2010
 
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
 
Groovy in the Enterprise - Case Studies - TSSJS Prague 2008 - Guillaume Laforge
Groovy in the Enterprise - Case Studies - TSSJS Prague 2008 - Guillaume LaforgeGroovy in the Enterprise - Case Studies - TSSJS Prague 2008 - Guillaume Laforge
Groovy in the Enterprise - Case Studies - TSSJS Prague 2008 - 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
 

Ähnlich wie Google App Engine, Groovy and Gaelyk presentation at the Paris JUG

Gaelyk - Paris GGUG 2011 - Guillaume Laforge
Gaelyk - Paris GGUG 2011 - Guillaume LaforgeGaelyk - Paris GGUG 2011 - Guillaume Laforge
Gaelyk - Paris GGUG 2011 - Guillaume LaforgeGuillaume Laforge
 
Petabyte scale on commodity infrastructure
Petabyte scale on commodity infrastructurePetabyte scale on commodity infrastructure
Petabyte scale on commodity infrastructureelliando dias
 
Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge
Gaelyk - SpringOne2GX - 2010 - Guillaume LaforgeGaelyk - SpringOne2GX - 2010 - Guillaume Laforge
Gaelyk - SpringOne2GX - 2010 - Guillaume LaforgeGuillaume Laforge
 
Red Dirt Ruby Conference
Red Dirt Ruby ConferenceRed Dirt Ruby Conference
Red Dirt Ruby ConferenceJohn Woodell
 
Distributed Data processing in a Cloud
Distributed Data processing in a CloudDistributed Data processing in a Cloud
Distributed Data processing in a Cloudelliando dias
 
Cloud Connected Devices on a Global Scale (CPN303) | AWS re:Invent 2013
Cloud Connected Devices on a Global Scale (CPN303) | AWS re:Invent 2013Cloud Connected Devices on a Global Scale (CPN303) | AWS re:Invent 2013
Cloud Connected Devices on a Global Scale (CPN303) | AWS re:Invent 2013Amazon Web Services
 
Gaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume LaforgeGaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume LaforgeGuillaume Laforge
 
Cloud Computing from an Entrpreneur's Viewpoint
Cloud Computing from an Entrpreneur's ViewpointCloud Computing from an Entrpreneur's Viewpoint
Cloud Computing from an Entrpreneur's ViewpointJ Singh
 
BDM8 - Near-realtime Big Data Analytics using Impala
BDM8 - Near-realtime Big Data Analytics using ImpalaBDM8 - Near-realtime Big Data Analytics using Impala
BDM8 - Near-realtime Big Data Analytics using ImpalaDavid Lauzon
 
Jan 2013 HUG: Cloud-Friendly Hadoop and Hive
Jan 2013 HUG: Cloud-Friendly Hadoop and HiveJan 2013 HUG: Cloud-Friendly Hadoop and Hive
Jan 2013 HUG: Cloud-Friendly Hadoop and HiveYahoo Developer Network
 
Splunking the JVM (Java Virtual Machine)
Splunking the JVM (Java Virtual Machine)Splunking the JVM (Java Virtual Machine)
Splunking the JVM (Java Virtual Machine)Damien Dallimore
 
Aloha on-rails-2009
Aloha on-rails-2009Aloha on-rails-2009
Aloha on-rails-2009John Woodell
 
Azug - successfully breeding rabits
Azug - successfully breeding rabitsAzug - successfully breeding rabits
Azug - successfully breeding rabitsYves Goeleven
 
Cloud infrastructure. Google File System and MapReduce - Andrii Vozniuk
Cloud infrastructure. Google File System and MapReduce - Andrii VozniukCloud infrastructure. Google File System and MapReduce - Andrii Vozniuk
Cloud infrastructure. Google File System and MapReduce - Andrii VozniukAndrii Vozniuk
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Guillaume Laforge
 
Suning OpenStack Cloud and Heat
Suning OpenStack Cloud and HeatSuning OpenStack Cloud and Heat
Suning OpenStack Cloud and HeatQiming Teng
 
Patterns for Building High Performance Applications in Cloud - CloudConnect2012
Patterns for Building High Performance Applications in Cloud - CloudConnect2012Patterns for Building High Performance Applications in Cloud - CloudConnect2012
Patterns for Building High Performance Applications in Cloud - CloudConnect2012Munish Gupta
 
Mongo DB for Java, Python and PHP Developers
Mongo DB for Java, Python and PHP DevelopersMongo DB for Java, Python and PHP Developers
Mongo DB for Java, Python and PHP DevelopersRick Hightower
 
Hands on Performance Tuning - Mike Croft
Hands on Performance Tuning - Mike CroftHands on Performance Tuning - Mike Croft
Hands on Performance Tuning - Mike CroftJAXLondon2014
 

Ähnlich wie Google App Engine, Groovy and Gaelyk presentation at the Paris JUG (20)

Gaelyk - Paris GGUG 2011 - Guillaume Laforge
Gaelyk - Paris GGUG 2011 - Guillaume LaforgeGaelyk - Paris GGUG 2011 - Guillaume Laforge
Gaelyk - Paris GGUG 2011 - Guillaume Laforge
 
Petabyte scale on commodity infrastructure
Petabyte scale on commodity infrastructurePetabyte scale on commodity infrastructure
Petabyte scale on commodity infrastructure
 
Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge
Gaelyk - SpringOne2GX - 2010 - Guillaume LaforgeGaelyk - SpringOne2GX - 2010 - Guillaume Laforge
Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge
 
Red Dirt Ruby Conference
Red Dirt Ruby ConferenceRed Dirt Ruby Conference
Red Dirt Ruby Conference
 
Distributed Data processing in a Cloud
Distributed Data processing in a CloudDistributed Data processing in a Cloud
Distributed Data processing in a Cloud
 
Cloud Connected Devices on a Global Scale (CPN303) | AWS re:Invent 2013
Cloud Connected Devices on a Global Scale (CPN303) | AWS re:Invent 2013Cloud Connected Devices on a Global Scale (CPN303) | AWS re:Invent 2013
Cloud Connected Devices on a Global Scale (CPN303) | AWS re:Invent 2013
 
Gaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume LaforgeGaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume Laforge
 
Cloud Computing from an Entrpreneur's Viewpoint
Cloud Computing from an Entrpreneur's ViewpointCloud Computing from an Entrpreneur's Viewpoint
Cloud Computing from an Entrpreneur's Viewpoint
 
BDM8 - Near-realtime Big Data Analytics using Impala
BDM8 - Near-realtime Big Data Analytics using ImpalaBDM8 - Near-realtime Big Data Analytics using Impala
BDM8 - Near-realtime Big Data Analytics using Impala
 
Jan 2013 HUG: Cloud-Friendly Hadoop and Hive
Jan 2013 HUG: Cloud-Friendly Hadoop and HiveJan 2013 HUG: Cloud-Friendly Hadoop and Hive
Jan 2013 HUG: Cloud-Friendly Hadoop and Hive
 
Splunking the JVM (Java Virtual Machine)
Splunking the JVM (Java Virtual Machine)Splunking the JVM (Java Virtual Machine)
Splunking the JVM (Java Virtual Machine)
 
Aloha on-rails-2009
Aloha on-rails-2009Aloha on-rails-2009
Aloha on-rails-2009
 
Azug - successfully breeding rabits
Azug - successfully breeding rabitsAzug - successfully breeding rabits
Azug - successfully breeding rabits
 
Cloud infrastructure. Google File System and MapReduce - Andrii Vozniuk
Cloud infrastructure. Google File System and MapReduce - Andrii VozniukCloud infrastructure. Google File System and MapReduce - Andrii Vozniuk
Cloud infrastructure. Google File System and MapReduce - Andrii Vozniuk
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
 
Suning OpenStack Cloud and Heat
Suning OpenStack Cloud and HeatSuning OpenStack Cloud and Heat
Suning OpenStack Cloud and Heat
 
What's up?
What's up?What's up?
What's up?
 
Patterns for Building High Performance Applications in Cloud - CloudConnect2012
Patterns for Building High Performance Applications in Cloud - CloudConnect2012Patterns for Building High Performance Applications in Cloud - CloudConnect2012
Patterns for Building High Performance Applications in Cloud - CloudConnect2012
 
Mongo DB for Java, Python and PHP Developers
Mongo DB for Java, Python and PHP DevelopersMongo DB for Java, Python and PHP Developers
Mongo DB for Java, Python and PHP Developers
 
Hands on Performance Tuning - Mike Croft
Hands on Performance Tuning - Mike CroftHands on Performance Tuning - Mike Croft
Hands on Performance Tuning - Mike Croft
 

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

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

Kürzlich hochgeladen

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
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
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
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...AliaaTarek5
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfNeo4j
 
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
 
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
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...Wes McKinney
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesThousandEyes
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI AgeCprime
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
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
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rick Flair
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 

Kürzlich hochgeladen (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...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
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
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdf
 
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...
 
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
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI Age
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
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
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 

Google App Engine, Groovy and Gaelyk presentation at the Paris JUG

  • 1. Google App Engine, Groovy and Gaelyk Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 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, SpringOne, JAX, Dynamic Language World, IJTC, and more... Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 2
  • 3. Marc-Antoine Guarrigue & Gaël Lazzari •Marc-Antoine – Architecte et Directeur de la R&D chez OCTO Technology depuis 2001 •Missions d’architecture d’applications Java EE •«Open Sourceur» dans l’âme – JCaptcha – Membre de l’OSSGTP •Developpement des sociétés – MassiveBrainGames.com – XDepend.com •Gaël Lazzari – Consultant OCTO depuis septembre 2009 Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 3
  • 4.
  • 6.
  • 7.
  • 8. tiq ue rm a ’info l
  • 9. 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 Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 6
  • 12. Google App Engine • Google’s PaaS solution • Run your app on Google’s infrastructure • Initially just Python supported • Since this year, Java supported too – Sandboxed JVM – Jetty servlet container • Several JVM-compatible language supported • A few services available – Email, XMPP, URL Fetch, Image, User, Task queues... Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 8
  • 13. Key aspects • You can use most of your usual web frameworks for developping apps on App Engine Java –A WAR file, basically! • No OS image, or software to install – Unlike with Amazon EC2 • All the scaling aspects are handled for you – Database / session replication, load balancing • There are quotas, but you need a high traffic application to start being charged –Free to get started Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 9
  • 14. Available services •Memcache •XMPP – JCache implementation – Send / receive Jabber – Save on CPU and DB messages (GTalk) •URL Fetch •User – Access remote resources – Use Google’s user/ – HttpUrlConnection authentication system •Mail – Support both incoming •Cron & Task queues and outgoing emails – Schedule tasks at regular intervals •Images – Queue units of work – Resize, crop, rotate... Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 10
  • 15. Limitations •Not our usual relational database – key / value datastore •30 seconds request duration limit • Forbidden to – write on the file system – create threads – use raw sockets – issue system calls – use IO / Swing / etc. directly •There’s a whitelist of classes allowed • Number of files and their size are limited Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 11
  • 16. Quotas Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 12
  • 17. Quotas (1/2) •Bandwidth •Mail – 1,3M requests/day – 7K calls/day – 1GB/day in/out – 2K recepients/day – 6.5 CPU hours/day – 5K emails/day – 2K attachments •Datastore – 100MB of attachments – 10M calls – 1GB/day •URL Fetch – 12GB in / 115GB out – 657K calls/day – 60 CPU hours/day – 4GB in/out /day Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 13
  • 18. Quotas (2/2) •XMPP •Memcache – 657K calls/day – 8.6M calls/day – 4GB data sent/day – 10GB in – 657K recepients/day – 50GB out – 1MB invitations/day •Task queues •Image manipulation – 100K calls –864 calls/day –1GB in / 5GB out –2.5M transforms Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 14
  • 21. The datastore... •It’s not your father’s relational database! –You’re not even using SQL! • Distributed key / value store – Based on Google’s «BigTable» • Supporting – Transactions and partitioning – Hierarchies through entity groups • Schema-less approach • Data access APIs – JPA and JDO – Direct low-level APIs Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 17
  • 22. ...and its «limitations» • You’re not using SQL –No joins – No database constraints – No aggregation functions (count, avg...) • You can only retrieve 1000 records per query • In a query, you can only filter on one column for inequality • Transactions only available in entity groups • You can only update an entity once in a transaction Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 18
  • 23. F
  • 24. F
  • 27. 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 – features its own template engine • 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 Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 20
  • 28. • 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 Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 21
  • 29. 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! •Launch dev_appserver.sh •Go to http://localhost:8080/
  • 30. 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> Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 23
  • 31. Shortcuts •Variables available •Google services – request / response – datastoreService – context / applicaiton – memcacheService – session – urlFetchService – params – mailService – header – userService – out / sout / html – user – defaultQueue •Methods available – queues – include / forward – xmppService – print / println Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 24
  • 33. Sending emails with Gaelyk mailService.send to: 'admin@example.com', from: 'user@example.com', subject: 'Hello World', htmlBody: '<bold>Hello</bold>' Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 26
  • 34. ...compared to Java Properties props = new Properties(); (props, null); Session session = Session.getDefaultInstance String msgBody = "..."; try { Message msg = new MimeMessage(session); "));     msg.setFrom(new InternetAddress("admin@example.com", "Admin TO,     msg.addRecipient(Message.RecipientType. com", "Mr. User"));                      new InternetAddress("user@example. ted");     msg.setSubject("Your Example.com account has been activa     msg.setText(msgBody);     Transport.send(msg); } catch (AddressException e) {} } catch (MessagingException e) {} Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 27
  • 35. 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 } } Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 28
  • 36. 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> Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 29
  • 37. Accessing the datastore • Direct interaction with the low-level datastore APIs 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() datastoreService.withTransaction { // do stuff with your entities // within the transaction } Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 30
  • 38. 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 = datastoreService.prepare(query)   // return only the first 10 results def entities = preparedQuery.asList( withLimit(10) ) Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 31
  • 39. ...into something groovier? def entities = Query.create { select from: savedscript sort DESC, on: dateCreated where { author == params.author } limit 10 } as List Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 32
  • 40. ...into something groovier? def entities = Query.create { select from: savedscript d ! sort DESC, on: dateCreated nte where { author == params.author e } m limit 10 } as List p le t Im Ye o t N Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 32
  • 41. 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: "Send daily email newsletter", method: 'PUT', params: [date: '20090914'], payload: content ] Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 33
  • 42. Jabber / XMPP support (1/3) • Sending instant messages String recipient = "someone@gmail.com"   // check if the user is online if (xmppService.getPresence(recipient).isAvailable()) { // send the message def status = xmppService.send(to: recipient, body: "Hello, how are you?")   // checks the message was successfully // delivered to all the recipients assert status.isSuccessful() } Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 34
  • 43. Jabber / XMPP support (2/3) • Sending instant messages with an XML payload String recipient = "service@gmail.com"   // check if the service is online if (xmppService.getPresence(recipient).isAvailable()) { // send the message def status = xmppService.send to: recipient, xml: { customers { customer(id: 1) { name 'Google' } } }   // checks the message was successfully delivered to the service assert status.isSuccessful() } Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 35
  • 44. Jabber / XMPP support (2/3) • Sending instant messages with an XML payload String recipient = "service@gmail.com"   // check if the service is online if (xmppService.getPresence(recipient).isAvailable()) { // send the message def status = xmppService.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() } Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 35
  • 45. 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 } Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 36
  • 46. What’s coming next? • Add more sugar around... – The Memcache service – The incoming email support in GAE SDK 1.2.6 – The Datastore query system •SQL-like DSL •dynamic finders • More generally... – Anything that’ll come up in upcoming GAE SDK versions Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 37
  • 47. 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 Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 38
  • 48. L aforge elopment laume ovy Dev Guil Hea glaf orge@ ro d of G mail.com g Q&A References: • http://code.google.com/appengine/ • http://gaelyk.appspot.com/ • http://groovy.codehaus.org/ • http://grails.org/ Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 49. Images utilisées dans cette présentation • Nuages – http://www.morguefile.com/archive/display/627059 – http://www.morguefile.com/archive/display/625552 – http://www.morguefile.com/archive/display/629785 • Le village dans les nuages – http://www.collectoy.com/photoBDD/Disque/Le%20village%20dans%20les%20nuages%20(%20face%20).jpg • 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/ Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 40