Your SlideShare is downloading. ×
0
Chicago, October 19 - 22, 2010




              a lightweight Groovy toolkit
              for Google App Engine
        ...
Guillaume Laforge

       • Groovy Project Manager
       • JSR-241 Spec Lead
       • Head of Groovy Development
        ...
Bug killer... real insects with legs!

       • Thanks to Groovy, with one hand left for coding,
         I’m still more p...
Bug killer... real insects with legs!

       • Thanks to Groovy, with one hand left for coding,
         I’m still more p...
Cloud
  Computing
mercredi 20 octobre 2010
IaaS, PaaS, SaaS


       • Software as a Service
             – Gmail, SalesForce.com
                                   ...
IaaS, PaaS, SaaS


       • Software as a Service
             – Gmail, SalesForce.com
                                   ...
IaaS, PaaS, SaaS


       • Software as a Service
             – Gmail, SalesForce.com
                                   ...
Google App Engine

       •   Google’s PaaS solution
       •   Run your app on Google’s infrastructure
       •   Initial...
Key aspects

       • You can use most of your usual web frameworks for
         developping apps on App Engine Java
     ...
Available services

       • Memcache                            – Send / receive Jabber
             – JCache implementat...
Limitations

       • Not our usual relational database
             – key / value datastore
       • 30 seconds request d...
Quotas




                           10
mercredi 20 octobre 2010
Quotas (1/2)

       • Bandwidth                   • Mail
             – 1,3M requests/day       – 7K calls/day
          ...
Quotas (2/2)

       • XMPP                        • Memcache
             – 657K calls/day          – 8.6M calls/day
    ...
Quotas (2/2)

       • XMPP                        • Memcache
             – 657K calls/day          – 8.6M calls/day
    ...
The Datastore




mercredi 20 octobre 2010
The datastore...

       • It’s not your father’s relational database! «NoSQL»

       • Distributed key / value store
   ...
...and its «limitations»

       • You’re not using SQL
             – No joins
             – No database constraints
   ...
Nice dashboard

mercredi 20 octobre 2010
http://gaelyk.appspot.com




mercredi 20 octobre 2010
                                   F
http://gaelyk.appspot.com




mercredi 20 octobre 2010
                                   F
0 .5.6
                           with Ca pabilities and         g
                           Namespace a    ware URL rout...
19     SpringOne 2GX 2010. All rights reserved. Do not distribute without permission.

mercredi 20 octobre 2010
Gaelyk

       • Gaelyk is a lightweight Groovy toolkit on top of the
         Google App Engine Java SDK

       • Gaelyk...
Why Groovy?

       • Groovy is a dynamic language for the JVM
             – very flexible, malleable, expressive and con...
First steps...



 • Go to http://gaelyk.appspot.com
 • Download the template project
 • Put your first Groovlet in /WEB-IN...
The web.xml
                                                                                      ">
                     ...
MVC: Groovlets and templates



                                 Groovlets                  Templates
                    ...
A groovlet

       • Instead of writing full-blown servlets, just write Groovy
         scripts (aka Groovlets)

         ...
A template

                                <html>
                                    <body>
                            ...
Shortcuts

     • Google services           • Variables available
       – datastore                 – request / response
...
Demo




                                  SpringOne 2GX 2010. All rights reserved. Do not distribute without permission.
...
Groovy sugar!




mercredi 20 octobre 2010
Sending emails with Gaelyk




                     mail.send to:   'foobar@gmail.com',
                             from:...
...compared to Java


    Properties props = new Properties();
                                                     ops, n...
Accessing the datastore

       • Direct interaction with the low-level datastore API
                                    ...
Querying to be improved...

                   import com.google.appengine.api.datastore.*
                               ...
...into something groovier?



                                def entities = datastore.query {
                          ...
...into something groovier?



                                def entities = datastore.query {
                          ...
Task queue API

                     // access a configured queue using the subscript notation
                     queues...
Jabber / XMPP support (1/3)

       • Sending instant messages

                 String recipient = "someone@gmail.com"
  ...
Jabber / XMPP support (2/3)

       • Sending instant messages with an XML payload
                 String recipient = "se...
Jabber / XMPP support (2/3)

       • Sending instant messages with an XML payload
                 String recipient = "se...
Jabber / XMPP support (3/3)

       • Receving incoming instant messages
             – Configure the XmppServlet in web.x...
Memcache service

       • Map notation access to the cache


                                                            ...
Closure memoization

       • Cache the return values for each dinstinct invocation (for a
         given arguments set)

...
Blobstore enhancements

       • The blobstore allows to store some large content
             – images, videos, etc.

   ...
Images service

       • Readable DSL for manipulating images

                      def blobKey = ...

                  ...
Capabilities

       • Google App Engine allows you to know the status and
         availability of the various services
 ...
URL Routing system (1/2)

       • You can have friendly URL mappings with the URL routing
         system

           all...
URL Routing system (2/2)

       • Namespace awareness: nice for multitenancy
       • Capability awareness: for graceful ...
Simple plugin system (1/3)

     • Gaelyk 0.4 introduced a simple plugin system for
       extending your apps and share c...
Simple plugin system (2/3)

     • A plugin is actually just a zip file!
           – Basically, just a Gaelyk application...
Simple plugin system (3/3)

     • An example plugin descriptor
           – /WEB-INF/plugins/jsonPlugin.groovy
          ...
Summary




                            SpringOne 2GX 2010. All rights reserved. Do not distribute without permission.

me...
What’s coming next?

     • Gaelyk 0.5.5 released a week ago with additional URL
       routing support (capabilities, nam...
Summary

     • Easy access to a cloud solution
           – Deploying Java apps, as easily as you would with PHP

     • ...
Q&A




                                 SpringOne 2GX 2010. All rights reserved. Do not distribute without permission.

m...
Thanks for your attention!




                                      e
                              e Laforg velopment
  ...
Images used in this presentation

           Bandage http://image.made-in-china.com/2f0j00fIGaTPEYDQnB/Elastic-Crepe-Banda...
Upcoming SlideShare
Loading in...5
×

Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge

2,098

Published on

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,098
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
26
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Transcript of "Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge"

  1. 1. Chicago, October 19 - 22, 2010 a lightweight Groovy toolkit for Google App Engine Guillaume Laforge — SpringSource mercredi 20 octobre 2010
  2. 2. Guillaume Laforge • Groovy Project Manager • JSR-241 Spec Lead • Head of Groovy Development at SpringSource • Initiator of the Grails framework • Founder of the Gaelyk toolkit • Co-author of Groovy in Action • Speaker: JavaOne, QCon, JavaZone, Sun TechDays, Devoxx, The Spring Experience, SpringOne2GX, JAX, Dynamic Language World, IJTC, and more... 2 mercredi 20 octobre 2010
  3. 3. Bug killer... real insects with legs! • Thanks to Groovy, with one hand left for coding, I’m still more productive than with Java! 3 mercredi 20 octobre 2010
  4. 4. Bug killer... real insects with legs! • Thanks to Groovy, with one hand left for coding, I’m still more productive than with Java! 3 mercredi 20 octobre 2010
  5. 5. Cloud Computing mercredi 20 octobre 2010
  6. 6. IaaS, PaaS, SaaS • Software as a Service – Gmail, SalesForce.com SaaS • Platform as a Service – Google App Engine PaaS • Infrastructure as a Service – Amazon EC2 IaaS 5 mercredi 20 octobre 2010
  7. 7. 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 5 mercredi 20 octobre 2010
  8. 8. 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 5 mercredi 20 octobre 2010
  9. 9. Google App Engine • Google’s PaaS solution • Run your app on Google’s infrastructure • Initially just Python supported • 1+ year ago, Java supported added too – Sandboxed JVM – Jetty servlet container • Several JVM-compatible language supported • A few services available – Email, XMPP, URL Fetch, Image, User, Task queues... 6 mercredi 20 octobre 2010
  10. 10. Key aspects • You can use most of your usual web frameworks for developping apps on App Engine Java – A WAR file, basically! – Uploading to the cloud by sending deltas of changes • 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 7 mercredi 20 octobre 2010
  11. 11. Available services • Memcache – Send / receive Jabber – JCache implementation messages (GTalk) – Save on CPU and DB • User – Use Google’s user/ • URL Fetch authentication system – Access remote resources – OAuth support – HttpUrlConnection • Cron & Task queues • Mail – Schedule tasks at regular – Support both incoming and intervals outgoing emails – Queue units of work • Images • Blobstore – Resize, crop, rotate... – For storing large content • XMPP • And much more... 8 mercredi 20 octobre 2010
  12. 12. 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 9 mercredi 20 octobre 2010
  13. 13. Quotas 10 mercredi 20 octobre 2010
  14. 14. 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 11 mercredi 20 octobre 2010
  15. 15. 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 12 mercredi 20 octobre 2010
  16. 16. 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 ur es – 1GB in / 5GB out fig – 2.5M transforms at ed u td O 12 mercredi 20 octobre 2010
  17. 17. The Datastore mercredi 20 octobre 2010
  18. 18. The datastore... • It’s not your father’s relational database! «NoSQL» • Distributed key / value store – Based on Google’s «BigTable» – Schema-less approach • Supporting – Transactions and partitioning – Hierarchies through entity groups • Data access APIs – JPA and JDO • but adds a big request load time factor – Direct low-level APIs 14 mercredi 20 octobre 2010
  19. 19. ...and its «limitations» • You’re not using SQL – No joins – No database constraints – No aggregation functions (count, avg...) • 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 15 mercredi 20 octobre 2010
  20. 20. Nice dashboard mercredi 20 octobre 2010
  21. 21. http://gaelyk.appspot.com mercredi 20 octobre 2010 F
  22. 22. http://gaelyk.appspot.com mercredi 20 octobre 2010 F
  23. 23. 0 .5.6 with Ca pabilities and g Namespace a ware URL routin 18 SpringOne 2GX 2010. All rights reserved. Do not distribute without permission. mercredi 20 octobre 2010
  24. 24. 19 SpringOne 2GX 2010. All rights reserved. Do not distribute without permission. mercredi 20 octobre 2010
  25. 25. 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 20 mercredi 20 octobre 2010
  26. 26. Why Groovy? • Groovy is a dynamic language for the JVM – very flexible, malleable, expressive and concise syntax – easy to learn for Java developers • deriving from the Java 5 grammar – provides powerful APIs to simplify the life of developers • possibility to dynamically enrich existing APIs – support for Groovlets and its own template engine • The truth: We worked with the Google App Engine Java team before the official launch of the platform, to ensure Groovy would run well on this new environment, and Gaelyk emerged from our test-bed project, and people asked me to Open-Source it! 21 mercredi 20 octobre 2010
  27. 27. 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/ mercredi 20 octobre 2010
  28. 28. 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> 23 mercredi 20 octobre 2010
  29. 29. MVC: Groovlets and templates Groovlets Templates (controllers) (views) Entities (domain) 24 mercredi 20 octobre 2010
  30. 30. 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 } } 25 mercredi 20 octobre 2010
  31. 31. 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> 26 mercredi 20 octobre 2010
  32. 32. Shortcuts • Google services • Variables available – datastore – request / response – blobstore – context / application – memcache – sessions – capabilities – params / headers – images – out / sout / html – urlFetch – localMode / app.* – mail – userService / user • Methods available – defaultQueue / queues – include / forward / redirect – xmpp – println / print – namespace 27 mercredi 20 octobre 2010
  33. 33. Demo SpringOne 2GX 2010. All rights reserved. Do not distribute without permission. mercredi 20 octobre 2010
  34. 34. Groovy sugar! mercredi 20 octobre 2010
  35. 35. Sending emails with Gaelyk mail.send to: 'foobar@gmail.com', from: 'other@gmail.com', subject: 'Hello World', htmlBody: '<bold>Hello</bold>' 30 mercredi 20 octobre 2010
  36. 36. ...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) {} 31 mercredi 20 octobre 2010
  37. 37. Accessing the datastore • Direct interaction with the low-level datastore API ty import com.google.appengine.api.datastore.Enti   Entity entity = new Entity("person")   map // subscript notation, like when accessing a entity['name'] = "Guillaume Laforge"   // normal property access notation entity.age = 32 entity.save() entity.delete() datastore.withTransaction { // do stuff with your entities // within the transaction } 32 mercredi 20 octobre 2010
  38. 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 = datastore.prepare(query)   // return only the first 10 results def entities = preparedQuery.asList( withLimit(10) ) 33 mercredi 20 octobre 2010
  39. 39. ...into something groovier? def entities = datastore.query { select all from savedscript sort desc by dateCreated where author == params.author limit 10 } as List 34 mercredi 20 octobre 2010
  40. 40. ...into something groovier? def entities = datastore.query { select all from savedscript sort desc by dateCreated where author == params.author limit 10 te d! } as List m en ple et Im o tY N 34 mercredi 20 octobre 2010
  41. 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: "sendDailyEmailNewsletter", method: 'PUT', params: [date: '20090914'], payload: content ] 35 mercredi 20 octobre 2010
  42. 42. 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() } 36 mercredi 20 octobre 2010
  43. 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 (xmpp.getPresence(recipient).isAvailable()) { // send the message def status = xmpp.send(to: recipient, xml: { customers { customer(id: 1) { name 'Google' } } })   // checks the message was successfully delivered to the service assert status.isSuccessful() } 37 mercredi 20 octobre 2010
  44. 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 (xmpp.getPresence(recipient).isAvailable()) { // send the message def status = xmpp.send(to: recipient, xml: { customers { customer(id: 1) { <customers> name 'Google' <customer id=’1’> } <name>Google</name> } </customer> </customers> })   // checks the message was successfully delivered to the service assert status.isSuccessful() } 37 mercredi 20 octobre 2010
  45. 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 } 38 mercredi 20 octobre 2010
  46. 46. 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'] } 39 mercredi 20 octobre 2010
  47. 47. Closure memoization • Cache the return values for each dinstinct invocation (for a given arguments set) -> def countEntities = memcache.memoize { String kind datastore.prepare( new Query(kind) ) .countEntities() } // first call def totalPics = countEntityes('photos') // second call, hitting the cache totalPics = countEntityes('photos') 40 mercredi 20 octobre 2010
  48. 48. Blobstore enhancements • The blobstore allows to store some large content – images, videos, etc. def blob = ... print blob.filename // contentType, creation, size // output the content of the blob to the response blob.serve response // read the content of the blob blob.withReader { Reader r -> ... } blob.withStream { InputStream is -> ... } // delete the blob blob.delete() 41 mercredi 20 octobre 2010
  49. 49. Images service • Readable DSL for manipulating images def blobKey = ... def image = blobKey.image.transform { resize 1600, 1200 crop 0.1, 0.1, 0.9, 0.9 horizontal flip // vertical flip too rotate 90 feeling lucky // image corrections } def thumbnail = image.resize(100, 100) 42 mercredi 20 octobre 2010
  50. 50. Capabilities • Google App Engine allows you to know the status and availability of the various services – DATASTORE, DATESTORE_WRITE, MEMCACHE, etc. – ENABLED, DISABLED, UNKNOWN, SCHEDULED_MAINTENANCE – is() and not() methods if (capabilities[DATASTORE_WRITE].is(ENABLED)) { // write some content in the datastore } else { // otherwise, redirect to some maintenance page } 43 mercredi 20 octobre 2010
  51. 51. URL Routing system (1/2) • You can have friendly URL mappings with the URL routing system all "/blog/@year/@month/@day/@title", @day@title=@title" forward: "/blog.groovy?year=@year&month=@month@day= get "/blog/@year/@month/@day", @day" forward: "/blog.groovy?year=@year&month=@month@day= all "/aboutus", redirect: "/blog/2008/10/20/about-us" get "/book/isbn/@isbn", forward: "/book.groovy?isbn=@isbn", validate: { isbn ==~ /d{9}(d|X)/ } 44 mercredi 20 octobre 2010
  52. 52. URL Routing system (2/2) • Namespace awareness: nice for multitenancy • Capability awareness: for graceful degradation // @cust customer variable could be « acme » post "/@cust/update", forward: "/update.groovy", namespace: { "ns-$cust" } es status // different destinations depending on the GAE servic get "/speakers", forward { to "/speakers.groovy" // default destination // when the datastore is not available to "/unavailable.gtpl" on DATASTORE not ENABLED // show some maintenance is upcoming to "/speakers.groovy?maintenance=true" on DATASTORE is SCHEDULED_MAINTENANCE } 45 mercredi 20 octobre 2010
  53. 53. Simple plugin system (1/3) • Gaelyk 0.4 introduced a simple plugin system for extending your apps and share commonalities • A plugin lets you – provide additional groovlets and templates – contribute new URL routes – add new categories – define variables in the binding – provide any static content – add new libraries – do any initialization 46 mercredi 20 octobre 2010
  54. 54. Simple plugin system (2/3) • A plugin is actually just a zip file! – Basically, just a Gaelyk application, minus... • the Groovy / Gaelyk / GAE JARs • the web.xml and appengine-web.xml descriptors – But with a /WEB-INF/plugins/myplugin.groovy descriptor • A plugin must be referenced in /WEB-INF/plugins.groovy with – install myplugin • shortcut to /WEB-INF/plugins/myplugin.groovy 47 mercredi 20 octobre 2010
  55. 55. Simple plugin system (3/3) • An example plugin descriptor – /WEB-INF/plugins/jsonPlugin.groovy import net.sf.json.* import net.sf.json.groovy.*   // add new variables in the binding binding { le jsonLibVersion = "2.3"          // a simple string variab  of a 3rd‐party JAR json = new JsonGroovyBuilder()  // an instance of a class }   // add new routes with the usual routing system format routes { get "/json", forward: "/json.groovy" }   // install a category you've developped categories jsonlib.JsonlibCategory   // any other initialization code you'd need 48 mercredi 20 octobre 2010
  56. 56. Summary SpringOne 2GX 2010. All rights reserved. Do not distribute without permission. mercredi 20 octobre 2010
  57. 57. What’s coming next? • Gaelyk 0.5.5 released a week ago with additional URL routing support (capabilities, namespace) – and a 0.5.6 bug fix this past weekend • Expect more sugar around the Datastore • An SQL-like query DSL • Easier relationship management (builder) • Perhaps pre-compiled groovlets and templates • More generally... – Anything that’ll come up in upcoming GAE SDK versions 50 mercredi 20 octobre 2010
  58. 58. 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 51 mercredi 20 octobre 2010
  59. 59. Q&A SpringOne 2GX 2010. All rights reserved. Do not distribute without permission. mercredi 20 octobre 2010
  60. 60. Thanks for your attention! e e Laforg velopment Gu illaum oovy De m of Gr e@gmail.co Head laforg E mail: g glaforge @ T witter: • References: • http://gaelyk.appspot.com/ • http://groovy.codehaus.org/ • http://code.google.com/appengine/ 53 mercredi 20 octobre 2010
  61. 61. Images used in this presentation Bandage http://image.made-in-china.com/2f0j00fIGaTPEYDQnB/Elastic-Crepe-Bandage-Gauze-.jpg RIP http://gipsydan.files.wordpress.com/2009/11/rip.jpg Puzzle: http://www.everystockphoto.com/photo.php?imageId=263521 Light bulb: https://newsline.llnl.gov/retooling/mar/03.28.08_images/lightBulb.png 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://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/ Press release: http://www.napleswebdesign.net/wp-content/uploads/2009/06/press_release_11.jpg 54 mercredi 20 octobre 2010
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×