SlideShare a Scribd company logo
1 of 85
Download to read offline
Google App Engine,
    Groovy Baby!
by Patrick Chanezon and Guillaume Laforge
         from Google and SpringSource
Learn about GAE/J and
                 how Groovy it can be!


                  Discover the Google App Engine for Java cloud
                  solution, and how Groovy and Gaelyk can make
                   you more productive and bring you lots of fun
                            coding your app in the cloud!
www.devoxx.com
Patrick Chanezon
                  Google Developer Advocate
                  @chanezon
www.devoxx.com
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,
www.devoxx.com




                     Dynamic Language World, IJTC, and more...
Agenda


    • What does it take to host a Java Web application?
    • Introducing Google App Engine for Java
    • App Engine Review for Java
      – A Complete Java development stack
    • Demos
    • Limitations, Issues
    • Roadmap
    • Scala, Clojure, JRuby
    • Groovy
    • Gaelyk
    • Questions

3
What does it take (for a Java developer) to
    host a Web application?




4
Doing it yourself in Java is still complex!




5
Hosting with Java still means hidden costs


      • Idle capacity
      • Software patches & upgrades
      • License fees
      • IT staff server wrangling
      • Traffic & utilization forecasting
      • Upgrades




6
Google App Engine – now with Java!




         And it’s still…
                               • Easy to build
                               • Easy to maintain
                               • Easy to scale

7
All the same services for Java App Engine as
    with Python




8
18+ months in review

         Apr 2008   Python launch
         May 2008   Memcache, Images API
         Jul 2008   Logs export
         Aug 2008   Batch write/delete
         Oct 2008   HTTPS support
         Dec 2008   Status dashboard, quota details
         Feb 2009   Billing, larger files
         Apr 2009   Java launch, DB import, cron support,
                    SDC

         May 2009   Key-only queries
         Jun 2009   Task queues
         Aug 2009   Kindless queries
         Sep 2009   XMPP
         Oct 2009   Incoming Email
9
Same Distributed web hosting platform




10
Same Distributed web hosting platform



     • Parallel processing
     • Scales automatically
     • Available globally
     • Configuration free
     • Built-in DoS protections




11
Same Distributed web hosting platform




      SCALABILITY
     for Java as well
12
Same Specialized services




13
Same App Engine Dashboard




14
Same initial free use policy as Python


     • ~5M pageviews/month
     • 6.5 CPU hrs/day
     • 1 GB storage
     • 650K URL Fetch calls
     • 2,000 recipients emailed
     • 1 GB/day bandwidth
     • N tasks




15
App Engine and Java Standards




16
Based on Java Standards




17
Based on Java Standards




18
Extended Language support through JVM


      • Java
      • Scala
      • JRuby (Ruby)
      • Groovy
      • Quercus (PHP)
      • Rhino (JavaScript)
      • Jython (Python)              Duke, the Java mascot
                                    Copyright © Sun Microsystems Inc., all rights reserved.




19
Development Tools for Java App Engine




20
Google’s Complete Java Development Stack




                         +

21
Google Plugin for Eclipse




22
Google Plugin for Eclipse




23
NeatBeans Plugin for Java App Engine


           http://kenai.com/projects/nbappengine/




24
Demo


     • Lolcat Wave Robot
      – From the GWT client
        to a Google Wave Bot!




27
Demo

     • Demonstrating “Plane Crazy”
         • Uses DataStore for Airplane, Activities, People data
         • Uses email service for correspondence
         • Uses XMPP for simple chatbot access




              Live Demo: http://plane-crazy.appspot.com
              Source: http://code.google.com/p/plane-crazy-demo/
28
Limitations, Issues


     • No naked domains
     • No SSL for domains
     • First request for scripted languages is slow
     • No MapReduce
     • NoSQL
     • No Sockets
     • No Long running processes
     • No Threads
     • no javax.image APIs
     • No Jax-WS
     • Limit # of File on Apps

29
Roadmap


     • Storing/serving large files
     • Mapping operations across data sets
     • Datastore cursors
     • Notification alerts for application exceptions
     • Datastore dump and restore facility




30
Tips


     • Nick Johnson’s deferred lib article
       – http://code.google.com/appengine/articles/deferred.html
       – Python but applies to Java
       – catch DeadlineExceededError and spawn a new task




31
Scala


     • Modern language on top of VM (Java & .NET)
       – Statically typed
       – Traits -> Mixin style composition
       – More functional style, but not bigot about it: closures
       – Concurrency: Actors
       – Type inference: less verbose than Java
       – Type System
     • Programming Scala, Wample & Payne, O’Reilly
     • People to follow: Jonas Boner, @debasishg, Dave Pollack,
      Alex Payne




32
Scala/Lift


     • Scala’s Web Framework
        – Seaside's highly granular sessions and security
        – Rails fast flash-to-bang
        – Django's "more than just CRUD is included"
        – Wicket's designer-friendly templating style (see Lift View First)
     • Lift in Appengine
        – Not all works: no Threads -> No Actors
     • David Pollack & al, Lift Getting started
       – http://liftweb.net/docs/getting_started/mod_master.html#x1-50001.3
     • ymnk’s Books example
       – git://gist.github.com/98561.git



33
Scala/Lift

 Author.scala
 package net.liftweb.example.model

 import javax.persistence._
 import com.google.appengine.api.datastore.Key

 @Entity
 class Author {
   @Id
   @GeneratedValue(){val strategy = GenerationType.IDENTITY}
   var id : Key = _

     @Column{val nullable = false}
     var name : String = ""

     @OneToMany{val mappedBy = "author", val targetEntity=classOf[Book]}
     var books : java.util.List[Book] = _
 }




34
JRuby

     • Ola Bini’s work on JRuby so that it works on appengine
       – Many presos and blogs about rails on GAE (IO talk)
       – Bumble / Datastore, BeeU / User service
     • Ryan Brown appengine-apis gem
       – http://code.google.com/p/appengine-jruby/
       – Rack::AppEngine task
       – See their Railsconf talk
     • Rails works
     • Sinatra framework
       – sudo gem install sinatra
     • Sam Ruby Wave Robot in JRuby/Sinatra
       – http://intertwingly.net/blog/2009/06/07/Google-Wave-Robot-w-
        Sinatra-JRuby-AppEngine
       – Wave client lib
35
JRuby


     • Don’t forget to replace net/http by the Google version
       – Based on UrlFetch instead of Sockets
     • Curt Thompson of Best Buy’s Giftag.com
       – http://googleappengine.blogspot.com/2009/02/best-buys-giftag-
        on-app-engine.html
       – Real world use case




36
Guestbook in JRuby

 guestbook.rb
 require 'sinatra'
 require 'dm-core'

 # Configure DataMapper to use the App Engine datastore
 DataMapper.setup(:default, "appengine://auto")

 # Create your model class
 class Shout
   include DataMapper::Resource

   property :id, Serial
   property :message, Text
 end

 # Make sure our template can use <%=h
 helpers do
   include Rack::Utils
   alias_method :h, :escape_html
 end


37
Guestbook in JRuby

     get '/' do
       # Just list all the shouts
       @shouts = Shout.all
       erb :index
     end

     post '/' do
       # Create a new shout and redirect back to the list.
       shout = Shout.create(:message => params[:message])
       redirect '/'
     end

views/index.erb
     <% @shouts.each do |shout| %>
     <p>Someone wrote, <q><%=h shout.message %></q></p>
     <% end %>

     <form method=post>
     <textarea name="message"></textarea>
     <input type=submit value=Shout>
     </form>
38
Clojure


     • Lisp dialect on top of Java VM
     • Programming Clojure, Halloway, PragProg book
     • John Hume appengine-clj lib
       – git://github.com/duelinmarkers/appengine-clj.git
       – users, datastore, test-utils

 (require '[appengine-clj.datastore :as ds])
 (ds/create {:kind "Person" :name "Jimmmy" :age 25})
 => {:kind "Person" :key #<Key Person(1138)> :name "Jimmmy" :age 25}



     • Compojure web framework (inspired by Sinatra)
        • git://github.com/weavejester/compojure.git
        • http://elhumidor.blogspot.com/2009/04/clojure-on-google-
        appengine.html
39
Guestbook in Clojure/Compojure

 (ns guestbook.servlet
   ... you no longer need to import UserServiceFactory ...
   (:require
     [appengine-clj.users :as users]))

 (defroutes guestbook-app
   (GET "/"
     (let [user-info (request :appengine-clj/user-info)
            user (user-info :user)]
       (html
         [:h1 "Hello, " (if user (.getNickname user) "World") "!"]
         [:p (link-to (.createLoginURL (user-info :user-service) "/")
 "sign in")]
         [:p (link-to (.createLogoutURL (user-info :user-service) "/")
 "sign out")]))))

 (defservice (users/wrap-with-user-info guestbook-app))




40
Tools: Emacs


     • clojure-mode, slime, swank
     • Setup tools:
        – http://riddell.us/tutorial/slime_swank/slime_swank.html
     • Interactive Programming with Clojure, Compojure, Google
       App Engine and Emacs
        – http://www.hackers-with-attitude.com/2009/08/intertactive-
        programming-with-clojure.html
        – Edit, C-c C-c, shift-reload
     • Jeff Foster Wave Robot in Clojure
        – http://www.fatvat.co.uk/2009/07/google-wave-and-clojure.html




41
Wave Robot in Clojure

Jeff Foster http://www.fatvat.co.uk/2009/07/google-wave-and-clojure.html

(ns uk.co.fatvat.wave.parrot
  (:import [com.google.wave.api RobotMessageBundle EventType])
  (:gen-class :extends com.google.wave.api.AbstractRobotServlet))
                                      
(defn- add-blip
  [wavelet message]
  (.append (.getDocument (.appendBlip wavelet)) message))
 
(defn -processEvents
  [_ bundle]
  (let [wavelet (.getWavelet bundle)]
    (when (.wasSelfAdded bundle)
      (add-blip wavelet "Greetings. I'm alive!"))
    (let [participant-changed-events (filter
                                       (fn [e] (= (.getType e)
(EventType/WAVELET_PARTICIPANTS_CHANGED)))
                                       (.getEvents bundle))]
      (doseq [event participant-changed-events]
        (add-blip wavelet "Hey! It's me!")))))

42
F
F
http://gaelyk.appspot.com




                            F
http://gaelyk.appspot.com




                            F
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
www.devoxx.com
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


                  We worked with the Google App Engine Java team before
                  the official launch of the platform, to ensure Groovy would
www.devoxx.com




                  run well on this new environment
MVC: Groovlets and templates

                     Groovlets                  Templates
                     (controllers)                (views)



                                     Entities
                                     (domain)
www.devoxx.com
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>
www.devoxx.com




                          <welcome-file>index.gtpl</welcome-file>
                       </welcome-file-list>
                     </web-app>
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
                            }
                        }
www.devoxx.com
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>
www.devoxx.com




                       </html>
Shortcuts
                  Variables available       Google services
                    request / response        datastore
                    context / applicaiton     memcache
                    session                   urlFetch
                    params                    mail
                    header                    userService
                    out / sout / html         user
                  Methods available           defaultQueue
                    include / forward         queues
www.devoxx.com




                    print / println           xmpp
Groovy sugar!
Sending emails with Gaelyk

                    mail.send to: 'foobar@gmail.com',
                        from: 'other@gmail.com',
                        subject: 'Hello World',
                        htmlBody: '<bold>Hello</bold>'
www.devoxx.com
...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) {}
www.devoxx.com
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 {
www.devoxx.com




                               // do stuff with your entities
                               // within the transaction
                           }
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) )
www.devoxx.com
...into something groovier?

                     def entities = datastore.createQuery {
                         select from: savedscript
                         sort DESC, on: dateCreated
                         where author == params.author
                         limit 10
                     } as List
www.devoxx.com
...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
www.devoxx.com
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
www.devoxx.com




                      ]
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()
                       }
www.devoxx.com
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
www.devoxx.com




                         assert status.isSuccessful()
                     }
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
www.devoxx.com




                         assert status.isSuccessful()
                     }
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
www.devoxx.com




                           message.stanza
                           // get a document parsed with XmlSlurper
                           message.xml
                       }
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']
                  }
www.devoxx.com
What’s coming next?
                  A new Gaelyk 0.3 release a couple days ago
                    Sugar for the Memcache service
                    The incoming email support in GAE SDK 1.2.6
                  Add more sugar around...
                    The Datastore query system
                     SQL-like DSL, dynamic finders...

                    DSL for the URL Fetch service for accessing REST resources
                  More generally...
                    Anything that’ll come up in upcoming GAE SDK versions
www.devoxx.com
DEMO




       www.devoxx.com
The use case
                  Collaboratively consolidated Twitter search
                  Send a search query to
                     groovydemos@appspot.com
                  The bot will
                     receive your message
                     store the query in the datastore
                     enqueue a task for processing the search
                  The queue handler will
                     parse the Twitter search feed for the query
                     put the results into memcache
www.devoxx.com




                  Browse http://groovydemos.appspot.com
www.devoxx.com
www.devoxx.com
www.devoxx.com
spo t.com
                                  p
                           mos @ap
                          e
                 gro ovyd
www.devoxx.com
spo t.com
                                  p
                           mos @ap
                          e
                 gro ovyd
www.devoxx.com
spo t.com
                                  p
                           mos @ap
                          e
                 gro ovyd
www.devoxx.com
spo t.com
                                  p
                           mos @ap
                          e
                 gro ovyd
www.devoxx.com
spo t.com
                                  p
                           mos @ap
                          e
                 gro ovyd
www.devoxx.com
spo t.com
                                  p
                           mos @ap
                          e
                 gro ovyd
www.devoxx.com
spo t.com
                                  p
                           mos @ap
                          e
                 gro ovyd
www.devoxx.com
spo t.com
                                  p
                           mos @ap
                          e
                 gro ovyd
www.devoxx.com
spo t.com
                                              p
                                       mos @ap
                                      e
                             gro ovyd




                                              pot.com
                                 yde mos.apps
                      ://groov
www.devoxx.com




                 http
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
www.devoxx.com
Thanks for your attention!


                                      e                                             nezon cy Manager
                                 aforg pment                                      a
                         ume L Develo                                     ck Ch Advoca
                  Guilla Groovy                                     Patri Cloud                  m
                     ad of         gmail.c
                                           om                                &
                                                                    Client anezon@go     ogle.co
                  He            e@
                         glaforg rge
                   Email: @glafo                                     E mail: ch chanezon
                                                                                @
                   Twitter
                           :
                                                                     T witter :
                                      References:
                                  •   http://code.google.com/appengine/
                                  •   http://gaelyk.appspot.com/
www.devoxx.com




                                  •   http://groovy.codehaus.org/
                                  •   http://grails.org/
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/
www.devoxx.com

More Related Content

What's hot

Google Cloud - Scale With A Smile (Dec 2014)
Google Cloud - Scale With A Smile (Dec 2014)Google Cloud - Scale With A Smile (Dec 2014)
Google Cloud - Scale With A Smile (Dec 2014)Ido Green
 
Building Enterprise Applications on Google Cloud Platform Cloud Computing Exp...
Building Enterprise Applications on Google Cloud Platform Cloud Computing Exp...Building Enterprise Applications on Google Cloud Platform Cloud Computing Exp...
Building Enterprise Applications on Google Cloud Platform Cloud Computing Exp...Chris Schalk
 
What is Google App Engine
What is Google App EngineWhat is Google App Engine
What is Google App EngineChris Schalk
 
Google App Engine's Latest Features
Google App Engine's Latest FeaturesGoogle App Engine's Latest Features
Google App Engine's Latest FeaturesChris Schalk
 
Google App Engine
Google App EngineGoogle App Engine
Google App EngineCsaba Toth
 
Google app engine - Overview
Google app engine - OverviewGoogle app engine - Overview
Google app engine - OverviewNathan Quach
 
Google app engine
Google app engineGoogle app engine
Google app engineSuraj Mehta
 
Google Cloud Platform Update
Google Cloud Platform UpdateGoogle Cloud Platform Update
Google Cloud Platform UpdateIdo Green
 
App Engine Overview @ Google Hackathon SXSW 2010
App Engine Overview @ Google Hackathon SXSW 2010App Engine Overview @ Google Hackathon SXSW 2010
App Engine Overview @ Google Hackathon SXSW 2010Chris Schalk
 
I've (probably) been using Google App Engine for a week longer than you have
I've (probably) been using Google App Engine for a week longer than you haveI've (probably) been using Google App Engine for a week longer than you have
I've (probably) been using Google App Engine for a week longer than you haveSimon Willison
 
Google App Engine (Introduction)
Google App Engine (Introduction)Google App Engine (Introduction)
Google App Engine (Introduction)Praveen Hanchinal
 
Google App Engine: An Introduction
Google App Engine: An IntroductionGoogle App Engine: An Introduction
Google App Engine: An IntroductionAbu Ashraf Masnun
 
Scale with a smile with Google Cloud Platform At DevConTLV (June 2014)
Scale with a smile with Google Cloud Platform At DevConTLV (June 2014)Scale with a smile with Google Cloud Platform At DevConTLV (June 2014)
Scale with a smile with Google Cloud Platform At DevConTLV (June 2014)Ido Green
 
Building what's next with google cloud's powerful infrastructure
Building what's next with google cloud's powerful infrastructureBuilding what's next with google cloud's powerful infrastructure
Building what's next with google cloud's powerful infrastructureMediaAgility
 
Google cloud Platform
Google cloud PlatformGoogle cloud Platform
Google cloud PlatformJanu Jahnavi
 
Google Cloud for Developers - Devfest Manila
Google Cloud for Developers - Devfest ManilaGoogle Cloud for Developers - Devfest Manila
Google Cloud for Developers - Devfest ManilaPatrick Chanezon
 
Case study of Google Cloud Platform
Case study of Google Cloud PlatformCase study of Google Cloud Platform
Case study of Google Cloud PlatformDavid Chen
 

What's hot (20)

Google App engine
Google App engineGoogle App engine
Google App engine
 
Google Cloud - Scale With A Smile (Dec 2014)
Google Cloud - Scale With A Smile (Dec 2014)Google Cloud - Scale With A Smile (Dec 2014)
Google Cloud - Scale With A Smile (Dec 2014)
 
Building Enterprise Applications on Google Cloud Platform Cloud Computing Exp...
Building Enterprise Applications on Google Cloud Platform Cloud Computing Exp...Building Enterprise Applications on Google Cloud Platform Cloud Computing Exp...
Building Enterprise Applications on Google Cloud Platform Cloud Computing Exp...
 
What is Google App Engine
What is Google App EngineWhat is Google App Engine
What is Google App Engine
 
Google App Engine's Latest Features
Google App Engine's Latest FeaturesGoogle App Engine's Latest Features
Google App Engine's Latest Features
 
Google App Engine
Google App EngineGoogle App Engine
Google App Engine
 
Google app engine - Overview
Google app engine - OverviewGoogle app engine - Overview
Google app engine - Overview
 
Google app engine
Google app engineGoogle app engine
Google app engine
 
Google Cloud Platform Update
Google Cloud Platform UpdateGoogle Cloud Platform Update
Google Cloud Platform Update
 
Introduction to Google App Engine
Introduction to Google App EngineIntroduction to Google App Engine
Introduction to Google App Engine
 
App Engine Overview @ Google Hackathon SXSW 2010
App Engine Overview @ Google Hackathon SXSW 2010App Engine Overview @ Google Hackathon SXSW 2010
App Engine Overview @ Google Hackathon SXSW 2010
 
I've (probably) been using Google App Engine for a week longer than you have
I've (probably) been using Google App Engine for a week longer than you haveI've (probably) been using Google App Engine for a week longer than you have
I've (probably) been using Google App Engine for a week longer than you have
 
Google App Engine (Introduction)
Google App Engine (Introduction)Google App Engine (Introduction)
Google App Engine (Introduction)
 
Google App Engine: An Introduction
Google App Engine: An IntroductionGoogle App Engine: An Introduction
Google App Engine: An Introduction
 
Scale with a smile with Google Cloud Platform At DevConTLV (June 2014)
Scale with a smile with Google Cloud Platform At DevConTLV (June 2014)Scale with a smile with Google Cloud Platform At DevConTLV (June 2014)
Scale with a smile with Google Cloud Platform At DevConTLV (June 2014)
 
Google App Engine
Google App EngineGoogle App Engine
Google App Engine
 
Building what's next with google cloud's powerful infrastructure
Building what's next with google cloud's powerful infrastructureBuilding what's next with google cloud's powerful infrastructure
Building what's next with google cloud's powerful infrastructure
 
Google cloud Platform
Google cloud PlatformGoogle cloud Platform
Google cloud Platform
 
Google Cloud for Developers - Devfest Manila
Google Cloud for Developers - Devfest ManilaGoogle Cloud for Developers - Devfest Manila
Google Cloud for Developers - Devfest Manila
 
Case study of Google Cloud Platform
Case study of Google Cloud PlatformCase study of Google Cloud Platform
Case study of Google Cloud Platform
 

Viewers also liked

Cloud Computing Bootcamp On The Google App Engine v1.2.1
Cloud Computing Bootcamp On The Google App Engine v1.2.1Cloud Computing Bootcamp On The Google App Engine v1.2.1
Cloud Computing Bootcamp On The Google App Engine v1.2.1Matthew McCullough
 
Zope 3 at Google App Engine
Zope 3 at Google App EngineZope 3 at Google App Engine
Zope 3 at Google App EngineQuintagroup
 
Using Technology for Fun (and Profit)
Using Technology for Fun (and Profit)Using Technology for Fun (and Profit)
Using Technology for Fun (and Profit)Amy Latta
 
Snake tron java game by Yoann CAPLAIN
Snake tron java game by Yoann CAPLAINSnake tron java game by Yoann CAPLAIN
Snake tron java game by Yoann CAPLAINYoann Caplain
 
Developing a Cross Platform Game with Java & HTML5
Developing a Cross Platform Game with Java & HTML5Developing a Cross Platform Game with Java & HTML5
Developing a Cross Platform Game with Java & HTML5Josep Prat
 
Using Google App Engine Python
Using Google App Engine PythonUsing Google App Engine Python
Using Google App Engine PythonAkshay Mathur
 
Passion Smart Design Houses presentation (English)
Passion Smart Design Houses presentation (English)Passion Smart Design Houses presentation (English)
Passion Smart Design Houses presentation (English)Signe Soonberg
 
Play Framework on Google App Engine
Play Framework on Google App EnginePlay Framework on Google App Engine
Play Framework on Google App EngineFred Lin
 
Building big things in Java
Building big things in JavaBuilding big things in Java
Building big things in Javascobal
 
Developing Java Web Applications In Google App Engine
Developing Java Web Applications In Google App EngineDeveloping Java Web Applications In Google App Engine
Developing Java Web Applications In Google App EngineTahir Akram
 
OWF: Xen - Open Source Hypervisor Designed for Clouds
OWF: Xen - Open Source Hypervisor Designed for CloudsOWF: Xen - Open Source Hypervisor Designed for Clouds
OWF: Xen - Open Source Hypervisor Designed for CloudsThe Linux Foundation
 
Introduction to Google App Engine
Introduction to Google App EngineIntroduction to Google App Engine
Introduction to Google App Enginerajdeep
 
The Future is Fun - Stop Motion, iCreate, Mindstorms, WeDo, & Game Design
The Future is Fun - Stop Motion, iCreate, Mindstorms, WeDo, & Game DesignThe Future is Fun - Stop Motion, iCreate, Mindstorms, WeDo, & Game Design
The Future is Fun - Stop Motion, iCreate, Mindstorms, WeDo, & Game Designmkc8b
 
Internet 2020: The Future Connection
Internet 2020: The Future ConnectionInternet 2020: The Future Connection
Internet 2020: The Future ConnectionChristine Nolan
 
Future Of Technology
Future Of  TechnologyFuture Of  Technology
Future Of TechnologyMelanie Swan
 
Smart Home technologies
Smart Home technologiesSmart Home technologies
Smart Home technologiesloggcity
 
The Future of Communication Technology
The Future of Communication TechnologyThe Future of Communication Technology
The Future of Communication Technologyanpipt01
 
Home automation using android mobiles
Home automation using android mobilesHome automation using android mobiles
Home automation using android mobilesDurairaja
 

Viewers also liked (20)

Cloud Computing Bootcamp On The Google App Engine v1.2.1
Cloud Computing Bootcamp On The Google App Engine v1.2.1Cloud Computing Bootcamp On The Google App Engine v1.2.1
Cloud Computing Bootcamp On The Google App Engine v1.2.1
 
Zope 3 at Google App Engine
Zope 3 at Google App EngineZope 3 at Google App Engine
Zope 3 at Google App Engine
 
Using Technology for Fun (and Profit)
Using Technology for Fun (and Profit)Using Technology for Fun (and Profit)
Using Technology for Fun (and Profit)
 
Snake tron java game by Yoann CAPLAIN
Snake tron java game by Yoann CAPLAINSnake tron java game by Yoann CAPLAIN
Snake tron java game by Yoann CAPLAIN
 
Developing a Cross Platform Game with Java & HTML5
Developing a Cross Platform Game with Java & HTML5Developing a Cross Platform Game with Java & HTML5
Developing a Cross Platform Game with Java & HTML5
 
Using Google App Engine Python
Using Google App Engine PythonUsing Google App Engine Python
Using Google App Engine Python
 
Passion Smart Design Houses presentation (English)
Passion Smart Design Houses presentation (English)Passion Smart Design Houses presentation (English)
Passion Smart Design Houses presentation (English)
 
Play Framework on Google App Engine
Play Framework on Google App EnginePlay Framework on Google App Engine
Play Framework on Google App Engine
 
Building big things in Java
Building big things in JavaBuilding big things in Java
Building big things in Java
 
Developing Java Web Applications In Google App Engine
Developing Java Web Applications In Google App EngineDeveloping Java Web Applications In Google App Engine
Developing Java Web Applications In Google App Engine
 
OWF: Xen - Open Source Hypervisor Designed for Clouds
OWF: Xen - Open Source Hypervisor Designed for CloudsOWF: Xen - Open Source Hypervisor Designed for Clouds
OWF: Xen - Open Source Hypervisor Designed for Clouds
 
Introduction to Google App Engine
Introduction to Google App EngineIntroduction to Google App Engine
Introduction to Google App Engine
 
The Future is Fun - Stop Motion, iCreate, Mindstorms, WeDo, & Game Design
The Future is Fun - Stop Motion, iCreate, Mindstorms, WeDo, & Game DesignThe Future is Fun - Stop Motion, iCreate, Mindstorms, WeDo, & Game Design
The Future is Fun - Stop Motion, iCreate, Mindstorms, WeDo, & Game Design
 
Internet 2020: The Future Connection
Internet 2020: The Future ConnectionInternet 2020: The Future Connection
Internet 2020: The Future Connection
 
Future Of Technology
Future Of  TechnologyFuture Of  Technology
Future Of Technology
 
Future technology
Future technologyFuture technology
Future technology
 
Smart Home technologies
Smart Home technologiesSmart Home technologies
Smart Home technologies
 
Multimedia
MultimediaMultimedia
Multimedia
 
The Future of Communication Technology
The Future of Communication TechnologyThe Future of Communication Technology
The Future of Communication Technology
 
Home automation using android mobiles
Home automation using android mobilesHome automation using android mobiles
Home automation using android mobiles
 

Similar to Google App Engine Java, Groovy and Gaelyk

Devfest09 App Engine Java
Devfest09  App Engine  JavaDevfest09  App Engine  Java
Devfest09 App Engine JavaChris Schalk
 
Rapid Application Development on Google App Engine for Java
Rapid Application Development on Google App Engine for JavaRapid Application Development on Google App Engine for Java
Rapid Application Development on Google App Engine for JavaKunal Dabir
 
Gaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume LaforgeGaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume LaforgeGuillaume Laforge
 
App Engine Overview Cloud Futures Publish
App Engine Overview Cloud Futures PublishApp Engine Overview Cloud Futures Publish
App Engine Overview Cloud Futures PublishChris Schalk
 
Cannibalising The Google App Engine
Cannibalising The  Google  App  EngineCannibalising The  Google  App  Engine
Cannibalising The Google App Enginecatherinewall
 
Webdevcon Keynote hh-2012-09-18
Webdevcon Keynote hh-2012-09-18Webdevcon Keynote hh-2012-09-18
Webdevcon Keynote hh-2012-09-18Pierre Joye
 
How to Contribute to Apache Usergrid
How to Contribute to Apache UsergridHow to Contribute to Apache Usergrid
How to Contribute to Apache UsergridDavid M. Johnson
 
Cloud Platforms for Java
Cloud Platforms for JavaCloud Platforms for Java
Cloud Platforms for Java3Pillar Global
 
Creating Modular Test-Driven SPAs with Spring and AngularJS
Creating Modular Test-Driven SPAs with Spring and AngularJSCreating Modular Test-Driven SPAs with Spring and AngularJS
Creating Modular Test-Driven SPAs with Spring and AngularJSGunnar Hillert
 
Introduction to serverless computing on Google Cloud
Introduction to serverless computing on Google CloudIntroduction to serverless computing on Google Cloud
Introduction to serverless computing on Google Cloudwesley chun
 
Web Development using Ruby on Rails
Web Development using Ruby on RailsWeb Development using Ruby on Rails
Web Development using Ruby on RailsAvi Kedar
 
Modern Web Framework : Play framework
Modern Web Framework : Play frameworkModern Web Framework : Play framework
Modern Web Framework : Play frameworkSuman Adak
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Guillaume Laforge
 
JRuby, Ruby, Rails and You on the Cloud
JRuby, Ruby, Rails and You on the CloudJRuby, Ruby, Rails and You on the Cloud
JRuby, Ruby, Rails and You on the CloudHiro Asari
 
Fast, concurrent ruby web applications with EventMachine and EM::Synchrony
Fast, concurrent ruby web applications with EventMachine and EM::SynchronyFast, concurrent ruby web applications with EventMachine and EM::Synchrony
Fast, concurrent ruby web applications with EventMachine and EM::SynchronyKyle Drake
 
MEAN Stack Warm-up
MEAN Stack Warm-upMEAN Stack Warm-up
MEAN Stack Warm-upTroy Miles
 
Ship It ! with Ruby/ Rails Ecosystem
Ship It ! with Ruby/ Rails EcosystemShip It ! with Ruby/ Rails Ecosystem
Ship It ! with Ruby/ Rails EcosystemYi-Ting Cheng
 

Similar to Google App Engine Java, Groovy and Gaelyk (20)

Devfest09 App Engine Java
Devfest09  App Engine  JavaDevfest09  App Engine  Java
Devfest09 App Engine Java
 
Rapid Application Development on Google App Engine for Java
Rapid Application Development on Google App Engine for JavaRapid Application Development on Google App Engine for Java
Rapid Application Development on Google App Engine for Java
 
Gaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume LaforgeGaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume Laforge
 
App Engine Overview Cloud Futures Publish
App Engine Overview Cloud Futures PublishApp Engine Overview Cloud Futures Publish
App Engine Overview Cloud Futures Publish
 
Cannibalising The Google App Engine
Cannibalising The  Google  App  EngineCannibalising The  Google  App  Engine
Cannibalising The Google App Engine
 
Webdevcon Keynote hh-2012-09-18
Webdevcon Keynote hh-2012-09-18Webdevcon Keynote hh-2012-09-18
Webdevcon Keynote hh-2012-09-18
 
How to Contribute to Apache Usergrid
How to Contribute to Apache UsergridHow to Contribute to Apache Usergrid
How to Contribute to Apache Usergrid
 
Mobile native-hacks
Mobile native-hacksMobile native-hacks
Mobile native-hacks
 
Cloud Platforms for Java
Cloud Platforms for JavaCloud Platforms for Java
Cloud Platforms for Java
 
Creating Modular Test-Driven SPAs with Spring and AngularJS
Creating Modular Test-Driven SPAs with Spring and AngularJSCreating Modular Test-Driven SPAs with Spring and AngularJS
Creating Modular Test-Driven SPAs with Spring and AngularJS
 
Introduction to serverless computing on Google Cloud
Introduction to serverless computing on Google CloudIntroduction to serverless computing on Google Cloud
Introduction to serverless computing on Google Cloud
 
GAE_20100112
GAE_20100112GAE_20100112
GAE_20100112
 
Web Development using Ruby on Rails
Web Development using Ruby on RailsWeb Development using Ruby on Rails
Web Development using Ruby on Rails
 
Modern Web Framework : Play framework
Modern Web Framework : Play frameworkModern Web Framework : Play framework
Modern Web Framework : Play framework
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
 
Node.js
Node.jsNode.js
Node.js
 
JRuby, Ruby, Rails and You on the Cloud
JRuby, Ruby, Rails and You on the CloudJRuby, Ruby, Rails and You on the Cloud
JRuby, Ruby, Rails and You on the Cloud
 
Fast, concurrent ruby web applications with EventMachine and EM::Synchrony
Fast, concurrent ruby web applications with EventMachine and EM::SynchronyFast, concurrent ruby web applications with EventMachine and EM::Synchrony
Fast, concurrent ruby web applications with EventMachine and EM::Synchrony
 
MEAN Stack Warm-up
MEAN Stack Warm-upMEAN Stack Warm-up
MEAN Stack Warm-up
 
Ship It ! with Ruby/ Rails Ecosystem
Ship It ! with Ruby/ Rails EcosystemShip It ! with Ruby/ Rails Ecosystem
Ship It ! with Ruby/ Rails Ecosystem
 

More from Guillaume Laforge

Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 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
 

More from Guillaume Laforge (20)

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

Recently uploaded

2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch TuesdayIvanti
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructureitnewsafrica
 
All These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDFAll These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDFMichael Gough
 
React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...Karmanjay Verma
 
Français Patch Tuesday - Avril
Français Patch Tuesday - AvrilFrançais Patch Tuesday - Avril
Français Patch Tuesday - AvrilIvanti
 
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
 
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)Mark Simos
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Nikki Chapple
 
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
 
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
 
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
 
Accelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with PlatformlessAccelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with PlatformlessWSO2
 
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...Jeffrey Haguewood
 
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
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkPixlogix Infotech
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesBernd Ruecker
 
Landscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdfLandscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdfAarwolf Industries LLC
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...panagenda
 
QMMS Lesson 2 - Using MS Excel Formula.pdf
QMMS Lesson 2 - Using MS Excel Formula.pdfQMMS Lesson 2 - Using MS Excel Formula.pdf
QMMS Lesson 2 - Using MS Excel Formula.pdfROWELL MARQUINA
 
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
 

Recently uploaded (20)

2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch Tuesday
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
 
All These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDFAll These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDF
 
React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...
 
Français Patch Tuesday - Avril
Français Patch Tuesday - AvrilFrançais Patch Tuesday - Avril
Français Patch Tuesday - Avril
 
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
 
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
 
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
 
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
 
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
 
Accelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with PlatformlessAccelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with Platformless
 
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
 
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...
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App Framework
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architectures
 
Landscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdfLandscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdf
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
 
QMMS Lesson 2 - Using MS Excel Formula.pdf
QMMS Lesson 2 - Using MS Excel Formula.pdfQMMS Lesson 2 - Using MS Excel Formula.pdf
QMMS Lesson 2 - Using MS Excel Formula.pdf
 
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
 

Google App Engine Java, Groovy and Gaelyk

  • 1. Google App Engine, Groovy Baby! by Patrick Chanezon and Guillaume Laforge from Google and SpringSource
  • 2. Learn about GAE/J and how Groovy it can be! Discover the Google App Engine for Java cloud solution, and how Groovy and Gaelyk can make you more productive and bring you lots of fun coding your app in the cloud! www.devoxx.com
  • 3. Patrick Chanezon Google Developer Advocate @chanezon www.devoxx.com
  • 4. 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, www.devoxx.com Dynamic Language World, IJTC, and more...
  • 5. Agenda • What does it take to host a Java Web application? • Introducing Google App Engine for Java • App Engine Review for Java – A Complete Java development stack • Demos • Limitations, Issues • Roadmap • Scala, Clojure, JRuby • Groovy • Gaelyk • Questions 3
  • 6. What does it take (for a Java developer) to host a Web application? 4
  • 7. Doing it yourself in Java is still complex! 5
  • 8. Hosting with Java still means hidden costs • Idle capacity • Software patches & upgrades • License fees • IT staff server wrangling • Traffic & utilization forecasting • Upgrades 6
  • 9. Google App Engine – now with Java! And it’s still… • Easy to build • Easy to maintain • Easy to scale 7
  • 10. All the same services for Java App Engine as with Python 8
  • 11. 18+ months in review Apr 2008 Python launch May 2008 Memcache, Images API Jul 2008 Logs export Aug 2008 Batch write/delete Oct 2008 HTTPS support Dec 2008 Status dashboard, quota details Feb 2009 Billing, larger files Apr 2009 Java launch, DB import, cron support, SDC May 2009 Key-only queries Jun 2009 Task queues Aug 2009 Kindless queries Sep 2009 XMPP Oct 2009 Incoming Email 9
  • 12. Same Distributed web hosting platform 10
  • 13. Same Distributed web hosting platform • Parallel processing • Scales automatically • Available globally • Configuration free • Built-in DoS protections 11
  • 14. Same Distributed web hosting platform SCALABILITY for Java as well 12
  • 16. Same App Engine Dashboard 14
  • 17. Same initial free use policy as Python • ~5M pageviews/month • 6.5 CPU hrs/day • 1 GB storage • 650K URL Fetch calls • 2,000 recipients emailed • 1 GB/day bandwidth • N tasks 15
  • 18. App Engine and Java Standards 16
  • 19. Based on Java Standards 17
  • 20. Based on Java Standards 18
  • 21. Extended Language support through JVM • Java • Scala • JRuby (Ruby) • Groovy • Quercus (PHP) • Rhino (JavaScript) • Jython (Python) Duke, the Java mascot Copyright © Sun Microsystems Inc., all rights reserved. 19
  • 22. Development Tools for Java App Engine 20
  • 23. Google’s Complete Java Development Stack + 21
  • 24. Google Plugin for Eclipse 22
  • 25. Google Plugin for Eclipse 23
  • 26. NeatBeans Plugin for Java App Engine http://kenai.com/projects/nbappengine/ 24
  • 27. Demo • Lolcat Wave Robot – From the GWT client to a Google Wave Bot! 27
  • 28. Demo • Demonstrating “Plane Crazy” • Uses DataStore for Airplane, Activities, People data • Uses email service for correspondence • Uses XMPP for simple chatbot access Live Demo: http://plane-crazy.appspot.com Source: http://code.google.com/p/plane-crazy-demo/ 28
  • 29. Limitations, Issues • No naked domains • No SSL for domains • First request for scripted languages is slow • No MapReduce • NoSQL • No Sockets • No Long running processes • No Threads • no javax.image APIs • No Jax-WS • Limit # of File on Apps 29
  • 30. Roadmap • Storing/serving large files • Mapping operations across data sets • Datastore cursors • Notification alerts for application exceptions • Datastore dump and restore facility 30
  • 31. Tips • Nick Johnson’s deferred lib article – http://code.google.com/appengine/articles/deferred.html – Python but applies to Java – catch DeadlineExceededError and spawn a new task 31
  • 32. Scala • Modern language on top of VM (Java & .NET) – Statically typed – Traits -> Mixin style composition – More functional style, but not bigot about it: closures – Concurrency: Actors – Type inference: less verbose than Java – Type System • Programming Scala, Wample & Payne, O’Reilly • People to follow: Jonas Boner, @debasishg, Dave Pollack, Alex Payne 32
  • 33. Scala/Lift • Scala’s Web Framework – Seaside's highly granular sessions and security – Rails fast flash-to-bang – Django's "more than just CRUD is included" – Wicket's designer-friendly templating style (see Lift View First) • Lift in Appengine – Not all works: no Threads -> No Actors • David Pollack & al, Lift Getting started – http://liftweb.net/docs/getting_started/mod_master.html#x1-50001.3 • ymnk’s Books example – git://gist.github.com/98561.git 33
  • 34. Scala/Lift Author.scala package net.liftweb.example.model import javax.persistence._ import com.google.appengine.api.datastore.Key @Entity class Author { @Id @GeneratedValue(){val strategy = GenerationType.IDENTITY} var id : Key = _ @Column{val nullable = false} var name : String = "" @OneToMany{val mappedBy = "author", val targetEntity=classOf[Book]} var books : java.util.List[Book] = _ } 34
  • 35. JRuby • Ola Bini’s work on JRuby so that it works on appengine – Many presos and blogs about rails on GAE (IO talk) – Bumble / Datastore, BeeU / User service • Ryan Brown appengine-apis gem – http://code.google.com/p/appengine-jruby/ – Rack::AppEngine task – See their Railsconf talk • Rails works • Sinatra framework – sudo gem install sinatra • Sam Ruby Wave Robot in JRuby/Sinatra – http://intertwingly.net/blog/2009/06/07/Google-Wave-Robot-w- Sinatra-JRuby-AppEngine – Wave client lib 35
  • 36. JRuby • Don’t forget to replace net/http by the Google version – Based on UrlFetch instead of Sockets • Curt Thompson of Best Buy’s Giftag.com – http://googleappengine.blogspot.com/2009/02/best-buys-giftag- on-app-engine.html – Real world use case 36
  • 37. Guestbook in JRuby guestbook.rb require 'sinatra' require 'dm-core' # Configure DataMapper to use the App Engine datastore DataMapper.setup(:default, "appengine://auto") # Create your model class class Shout include DataMapper::Resource property :id, Serial property :message, Text end # Make sure our template can use <%=h helpers do include Rack::Utils alias_method :h, :escape_html end 37
  • 38. Guestbook in JRuby get '/' do # Just list all the shouts @shouts = Shout.all erb :index end post '/' do # Create a new shout and redirect back to the list. shout = Shout.create(:message => params[:message]) redirect '/' end views/index.erb <% @shouts.each do |shout| %> <p>Someone wrote, <q><%=h shout.message %></q></p> <% end %> <form method=post> <textarea name="message"></textarea> <input type=submit value=Shout> </form> 38
  • 39. Clojure • Lisp dialect on top of Java VM • Programming Clojure, Halloway, PragProg book • John Hume appengine-clj lib – git://github.com/duelinmarkers/appengine-clj.git – users, datastore, test-utils (require '[appengine-clj.datastore :as ds]) (ds/create {:kind "Person" :name "Jimmmy" :age 25}) => {:kind "Person" :key #<Key Person(1138)> :name "Jimmmy" :age 25} • Compojure web framework (inspired by Sinatra) • git://github.com/weavejester/compojure.git • http://elhumidor.blogspot.com/2009/04/clojure-on-google- appengine.html 39
  • 40. Guestbook in Clojure/Compojure (ns guestbook.servlet ... you no longer need to import UserServiceFactory ... (:require [appengine-clj.users :as users])) (defroutes guestbook-app (GET "/" (let [user-info (request :appengine-clj/user-info) user (user-info :user)] (html [:h1 "Hello, " (if user (.getNickname user) "World") "!"] [:p (link-to (.createLoginURL (user-info :user-service) "/") "sign in")] [:p (link-to (.createLogoutURL (user-info :user-service) "/") "sign out")])))) (defservice (users/wrap-with-user-info guestbook-app)) 40
  • 41. Tools: Emacs • clojure-mode, slime, swank • Setup tools: – http://riddell.us/tutorial/slime_swank/slime_swank.html • Interactive Programming with Clojure, Compojure, Google App Engine and Emacs – http://www.hackers-with-attitude.com/2009/08/intertactive- programming-with-clojure.html – Edit, C-c C-c, shift-reload • Jeff Foster Wave Robot in Clojure – http://www.fatvat.co.uk/2009/07/google-wave-and-clojure.html 41
  • 42. Wave Robot in Clojure Jeff Foster http://www.fatvat.co.uk/2009/07/google-wave-and-clojure.html (ns uk.co.fatvat.wave.parrot   (:import [com.google.wave.api RobotMessageBundle EventType])   (:gen-class :extends com.google.wave.api.AbstractRobotServlet))                                        (defn- add-blip   [wavelet message]   (.append (.getDocument (.appendBlip wavelet)) message))   (defn -processEvents   [_ bundle]   (let [wavelet (.getWavelet bundle)]     (when (.wasSelfAdded bundle)       (add-blip wavelet "Greetings. I'm alive!"))     (let [participant-changed-events (filter                                        (fn [e] (= (.getType e) (EventType/WAVELET_PARTICIPANTS_CHANGED)))                                        (.getEvents bundle))]       (doseq [event participant-changed-events]         (add-blip wavelet "Hey! It's me!"))))) 42
  • 43. F
  • 44. F
  • 47. 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 www.devoxx.com
  • 48. 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 We worked with the Google App Engine Java team before the official launch of the platform, to ensure Groovy would www.devoxx.com run well on this new environment
  • 49. MVC: Groovlets and templates Groovlets Templates (controllers) (views) Entities (domain) www.devoxx.com
  • 50. 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/
  • 51. 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> www.devoxx.com <welcome-file>index.gtpl</welcome-file> </welcome-file-list> </web-app>
  • 52. 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 } } www.devoxx.com
  • 53. 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> www.devoxx.com </html>
  • 54. Shortcuts Variables available Google services request / response datastore context / applicaiton memcache session urlFetch params mail header userService out / sout / html user Methods available defaultQueue include / forward queues www.devoxx.com print / println xmpp
  • 56. Sending emails with Gaelyk mail.send to: 'foobar@gmail.com', from: 'other@gmail.com', subject: 'Hello World', htmlBody: '<bold>Hello</bold>' www.devoxx.com
  • 57. ...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) {} www.devoxx.com
  • 58. 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 { www.devoxx.com // do stuff with your entities // within the transaction }
  • 59. 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) ) www.devoxx.com
  • 60. ...into something groovier? def entities = datastore.createQuery { select from: savedscript sort DESC, on: dateCreated where author == params.author limit 10 } as List www.devoxx.com
  • 61. ...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 www.devoxx.com
  • 62. 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 www.devoxx.com ]
  • 63. 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() } www.devoxx.com
  • 64. 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 www.devoxx.com assert status.isSuccessful() }
  • 65. 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 www.devoxx.com assert status.isSuccessful() }
  • 66. 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 www.devoxx.com message.stanza // get a document parsed with XmlSlurper message.xml }
  • 67. 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'] } www.devoxx.com
  • 68. What’s coming next? A new Gaelyk 0.3 release a couple days ago Sugar for the Memcache service The incoming email support in GAE SDK 1.2.6 Add more sugar around... The Datastore query system SQL-like DSL, dynamic finders... DSL for the URL Fetch service for accessing REST resources More generally... Anything that’ll come up in upcoming GAE SDK versions www.devoxx.com
  • 69. DEMO www.devoxx.com
  • 70. The use case Collaboratively consolidated Twitter search Send a search query to groovydemos@appspot.com The bot will receive your message store the query in the datastore enqueue a task for processing the search The queue handler will parse the Twitter search feed for the query put the results into memcache www.devoxx.com Browse http://groovydemos.appspot.com
  • 74. spo t.com p mos @ap e gro ovyd www.devoxx.com
  • 75. spo t.com p mos @ap e gro ovyd www.devoxx.com
  • 76. spo t.com p mos @ap e gro ovyd www.devoxx.com
  • 77. spo t.com p mos @ap e gro ovyd www.devoxx.com
  • 78. spo t.com p mos @ap e gro ovyd www.devoxx.com
  • 79. spo t.com p mos @ap e gro ovyd www.devoxx.com
  • 80. spo t.com p mos @ap e gro ovyd www.devoxx.com
  • 81. spo t.com p mos @ap e gro ovyd www.devoxx.com
  • 82. spo t.com p mos @ap e gro ovyd pot.com yde mos.apps ://groov www.devoxx.com http
  • 83. 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 www.devoxx.com
  • 84. Thanks for your attention! e nezon cy Manager aforg pment a ume L Develo ck Ch Advoca Guilla Groovy Patri Cloud m ad of gmail.c om & Client anezon@go ogle.co He e@ glaforg rge Email: @glafo E mail: ch chanezon @ Twitter : T witter : References: • http://code.google.com/appengine/ • http://gaelyk.appspot.com/ www.devoxx.com • http://groovy.codehaus.org/ • http://grails.org/
  • 85. 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/ www.devoxx.com

Editor's Notes

  1. - Scalable web hosting platform - Built on Google technology - Utilizing the same infrastructure you already use each day * Return web search result &lt; 0.25s
  2. Beneficios son los mismos del python
  3. SPECIALIZATION =&gt; SCALABILITY
  4. Show building an running apps in orkut, Ning, hi5..
  5. Show building an running apps in orkut, Ning, hi5..