SlideShare una empresa de Scribd logo
1 de 150
Lightweight


                  on the

by Tim Berglund
Tell me about
aGreat
Application
  Language
Tell me

a
   Happy
    Tale
      of
Deployment
and


Make  it

   Fast
Tell me about

the
      Googl
        eApp
         Engine
An App Server
In the CLoud
Google
Infrastructure
Usually Free!
Quotas




http://code.google.com/appengine/docs/quotas.html
Quotas




http://code.google.com/appengine/docs/quotas.html
Pricing
Languages
Languages
Languages
Languages
Services
Services


It’s an app server
Services


With a few extra
    features
Services
Services
Datastore
Services
Datastore
Authentication
Services
Datastore
Authentication
Caching
Services
Datastore
Authentication
Caching
XMPP
Services
Datastore
Authentication
Caching
XMPP
Email
Services
Datastore         Task Queue
Authentication
Caching
XMPP
Email
Services
Datastore         Task Queue
Authentication    Image API
Caching
XMPP
Email
Services
Datastore         Task Queue
Authentication    Image API
Caching           URL Fetching
XMPP
Email
Services
Datastore         Task Queue
Authentication    Image API
Caching           URL Fetching
XMPP              OAuth
Email
Services
Datastore         Task Queue
Authentication    Image API
Caching           URL Fetching
XMPP              OAuth
Email             Blobstore
But It’s not Perfect
Limitations
Limitations
The JDK whitelist
Limitations
The JDK whitelist
  http://code.google.com/appengine/docs/java/jrewhitelist.html
Limitations
The JDK whitelist
  http://code.google.com/appengine/docs/java/jrewhitelist.html

No Hibernate
Limitations
The JDK whitelist
  http://code.google.com/appengine/docs/java/jrewhitelist.html

No Hibernate
  Only JPA and JDO
Limitations
The JDK whitelist
  http://code.google.com/appengine/docs/java/jrewhitelist.html

No Hibernate
  Only JPA and JDO
Grails is limited
Limitations
The JDK whitelist
  http://code.google.com/appengine/docs/java/jrewhitelist.html

No Hibernate
  Only JPA and JDO
Grails is limited
Performance problems?
Tell me about
Groovy-based
Groovy-based
Lightweight
Groovy-based
Lightweight
Page-centric
Groovy-based
Lightweight
Page-centric
Tightly coupled to the Google App Engine
Groovy-based
Lightweight
Page-centric
Tightly coupled to the Google App Engine
A better GAE than the GAE
Setting up Gaelyk
Serving Content
Serving Content
Serving Content


Static content (like in a WAR)
Serving Content


Static content (like in a WAR)
Groovy templates
Templates
<% include '/WEB-INF/includes/header.gtpl' %>

<h1>Look Up an Artist</h1>

<form action="/artistLookup.groovy" method="POST">
   <input type="text" size="50" name="artist"/>
   <input type="submit" value="Lookup"/>
</form>

<ul>
<% request.artists.each { artist -> %>

   <li>${artist.name}</li>

<% } %>
</ul>

<% include '/WEB-INF/includes/footer.gtpl' %>
Templates
<% include '/WEB-INF/includes/header.gtpl' %>

<h1>Look Up an Artist</h1>

<form action="/artistLookup.groovy" method="POST">
   <input type="text" size="50" name="artist"/>
   <input type="submit" value="Lookup"/>
</form>

<ul>
<% request.artists.each { artist -> %>

   <li>${artist.name}</li>

<% } %>
</ul>

<% include '/WEB-INF/includes/footer.gtpl' %>
Templates
<% include '/WEB-INF/includes/header.gtpl' %>

<h1>Look Up an Artist</h1>

<form action="/artistLookup.groovy" method="POST">
   <input type="text" size="50" name="artist"/>
   <input type="submit" value="Lookup"/>
</form>

<ul>
<% request.artists.each { artist -> %>

   <li>${artist.name}</li>

<% } %>
</ul>

<% include '/WEB-INF/includes/footer.gtpl' %>
Templates
<% include '/WEB-INF/includes/header.gtpl' %>

<h1>Look Up an Artist</h1>

<form action="/artistLookup.groovy" method="POST">
   <input type="text" size="50" name="artist"/>
   <input type="submit" value="Lookup"/>
</form>

<ul>
<% request.artists.each { artist -> %>

   <li>${artist.name}</li>

<% } %>
</ul>

<% include '/WEB-INF/includes/footer.gtpl' %>
Templates
<% include '/WEB-INF/includes/header.gtpl' %>

<h1>Look Up an Artist</h1>

<form action="/artistLookup.groovy" method="POST">
   <input type="text" size="50" name="artist"/>
   <input type="submit" value="Lookup"/>
</form>

<ul>
<% request.artists.each { artist -> %>

   <li>${artist.name}</li>

<% } %>
</ul>

<% include '/WEB-INF/includes/footer.gtpl' %>
Templates
Templates

Lightweight, Groovy JSPs
Templates

Lightweight, Groovy JSPs
Downside: Scriptlets
Templates

Lightweight, Groovy JSPs
Downside: Scriptlets
Request attributes bound from Groovlets
Groovlets
import java.net.URLEncoder

if(params.artist) {
  def response = urlFetch.fetch(new URL("http://musicbrainz.org/
ws/1/artist/?type=xml&name=${URLEncoder.encode(params.artist)}"))
  def text = new String(response.content)
  def xml = new XmlSlurper().parseText(text)
  request.artists = xml.'artist-list'.artist
}
else {
  request.artists = []
}

forward '/artistLookup.gtpl'
Groovlets
Groovlets
Groovy script, meet Servlet
Groovlets
Groovy script, meet Servlet
Intrinsic variables
Groovlets
Groovy script, meet Servlet
Intrinsic variables
Forwarding
Groovlets
Groovy script, meet Servlet
Intrinsic variables
Forwarding
Redirecting
Groovlets
Groovy script, meet Servlet
Intrinsic variables
Forwarding
Redirecting
MarkupBuilder
import java.net.URLEncoder

if(params.artist) {
  def response = urlFetch.fetch(new URL("http://
musicbrainz.org/ws/1/artist/?type=xml&name=$
{URLEncoder.encode(params.artist)}"))
  def text = new String(response.content)
  def xml = new XmlSlurper().parseText(text)
  request.artists = xml.'artist-list'.artist
}
else {
  request.artists = []
}

forward '/artistLookup.gtpl'
import java.net.URLEncoder

if(params.artist) {
  def response = urlFetch.fetch(new URL("http://
musicbrainz.org/ws/1/artist/?type=xml&name=$
{URLEncoder.encode(params.artist)}"))
  def text = new String(response.content)
  def xml = new XmlSlurper().parseText(text)
  request.artists = xml.'artist-list'.artist
}
else {
  request.artists = []
}

forward '/artistLookup.gtpl'
import java.net.URLEncoder

if(params.artist) {
  def response = urlFetch.fetch(new URL("http://
musicbrainz.org/ws/1/artist/?type=xml&name=$
{URLEncoder.encode(params.artist)}"))
  def text = new String(response.content)
  def xml = new XmlSlurper().parseText(text)
  request.artists = xml.'artist-list'.artist
}
else {
  request.artists = []
}

forward '/artistLookup.gtpl'
import java.net.URLEncoder

if(params.artist) {
  def response = urlFetch.fetch(new URL("http://
musicbrainz.org/ws/1/artist/?type=xml&name=$
{URLEncoder.encode(params.artist)}"))
  def text = new String(response.content)
  def xml = new XmlSlurper().parseText(text)
  request.artists = xml.'artist-list'.artist
}
else {
  request.artists = []
}

forward '/artistLookup.gtpl'
import com.google.appengine.api.datastore.*
import static com.google.appengine.api.datastore.FetchOption

if(!user) {
  redirect users.createLoginURL(request.requestURL.toString(
  return
}

def query = new Query("project")
query.addSort("dateCreated", Query.SortDirection.ASCENDING)
PreparedQuery preparedQuery = datastore.prepare(query)

request.projects = preparedQuery.asList( withOffset(0) )

forward "/WEB-INF/views/project/list.gtpl"
import com.google.appengine.api.datastore.*
import static com.google.appengine.api.datastore.FetchOption

if(!user) {
  redirect users.createLoginURL(request.requestURL.toString(
  return
}

def query = new Query("project")
query.addSort("dateCreated", Query.SortDirection.ASCENDING)
PreparedQuery preparedQuery = datastore.prepare(query)

request.projects = preparedQuery.asList( withOffset(0) )

forward "/WEB-INF/views/project/list.gtpl"
import com.google.appengine.api.datastore.*
import static com.google.appengine.api.datastore.FetchOption

if(!user) {
  redirect users.createLoginURL(request.requestURL.toString(
  return
}

def query = new Query("project")
query.addSort("dateCreated", Query.SortDirection.ASCENDING)
PreparedQuery preparedQuery = datastore.prepare(query)

request.projects = preparedQuery.asList( withOffset(0) )

forward "/WEB-INF/views/project/list.gtpl"
import com.google.appengine.api.datastore.*
import static com.google.appengine.api.datastore.FetchOption

if(!user) {
  redirect users.createLoginURL(request.requestURL.toString(
  return
}

def query = new Query("project")
query.addSort("dateCreated", Query.SortDirection.ASCENDING)
PreparedQuery preparedQuery = datastore.prepare(query)

request.projects = preparedQuery.asList( withOffset(0) )

forward "/WEB-INF/views/project/list.gtpl"
import com.google.appengine.api.datastore.*
import static com.google.appengine.api.datastore.FetchOption

if(!user) {
  redirect users.createLoginURL(request.requestURL.toString(
  return
}

def query = new Query("project")
query.addSort("dateCreated", Query.SortDirection.ASCENDING)
PreparedQuery preparedQuery = datastore.prepare(query)

request.projects = preparedQuery.asList( withOffset(0) )

forward "/WEB-INF/views/project/list.gtpl"
import com.google.appengine.api.datastore.*
import static com.google.appengine.api.datastore.FetchOption

if(!user) {
  redirect users.createLoginURL(request.requestURL.toString(
  return
}

def query = new Query("project")
query.addSort("dateCreated", Query.SortDirection.ASCENDING)
PreparedQuery preparedQuery = datastore.prepare(query)

request.projects = preparedQuery.asList( withOffset(0) )

forward "/WEB-INF/views/project/list.gtpl"
URL Mapping
URL Mapping

Templates in war/*.gtpl
URL Mapping

Templates in war/*.gtpl
Groovlets in war/WEB-INF/groovy/*.groovy
URL Mapping

Templates in war/*.gtpl
Groovlets in war/WEB-INF/groovy/*.groovy
Pretty URLs with
war/WEB-INF/routes.groovy
The Datastore
The Datastore
The Datastore
Google’s BigTable infrastructure
The Datastore
Google’s BigTable infrastructure
Schemaless
The Datastore
Google’s BigTable infrastructure
Schemaless
Named entities (property bundles)
The Datastore
Google’s BigTable infrastructure
Schemaless
Named entities (property bundles)
Indexed, queryable, sortable
The Datastore
Google’s BigTable infrastructure
Schemaless
Named entities (property bundles)
Indexed, queryable, sortable
Transactional
The Datastore
Google’s BigTable infrastructure
Schemaless
Named entities (property bundles)
Indexed, queryable, sortable
Transactional
Great Groovy wrapper
Datastore Indexes
Datastore Indexes
Automatically generated by default
Datastore Indexes
Automatically generated by default
Override in WEB-INF/datastore-indexes.xml
Datastore Indexes
      Automatically generated by default
      Override in WEB-INF/datastore-indexes.xml
<?xml version="1.0" encoding="utf-8"?>
<datastore-indexes
  autoGenerate="true">
    <datastore-index kind="Employee" ancestor="false">
        <property name="lastName" direction="asc" />
        <property name="hireDate" direction="desc" />
    </datastore-index>

    <datastore-index kind="Project" ancestor="false">
        <property name="dueDate" direction="asc" />
    </datastore-index>
</datastore-indexes>
Tell me about

  Other
      Services
Email   in Java
Email
                               with Gaelyk


mail.send sender: 'story-admin@augusttechgroup.com',
          to: 'tlberglund@gmail.com',
          subject: 'Story Complete',
          textBody: "A story you edited has increased
in priority. Check it out."
Inbound Email
Inbound Email

Enable in appengine-web.xml
Inbound Email

Enable in appengine-web.xml
Enable built-in servlet in web.xml
Inbound Email

Enable in appengine-web.xml
Enable built-in servlet in web.xml
email.groovy Groovlet
Inbound Email

Enable in appengine-web.xml
Enable built-in servlet in web.xml
email.groovy Groovlet
The “message” intrinsic variable
Memcache
      in Java
Memcache
                             with Gaelyk

def countryFr = new Country(name: 'France')

memcache['FR'] = countryFr

if ('FR' in memcache) {
  countryFromCache = memcache['FR']
}
URL Fetch
        in Java
URL Fetch
                                     with Gaelyk



def response = urlFetch.fetch(new URL("http://example.com"))
def text = new String(response.content)
Task Queues

queue.add countdownMillis: 10000,
          url: '/task/emailTaskList',
          taskName: 'Email current story assignments',
          method: 'PUT',
          params: [date: new Date()]
Task Queues
Task Queues

Timed HTTP requests
Task Queues

Timed HTTP requests
Configure in war/WEB-INF/queue.xml
Task Queues

Timed HTTP requests
Configure in war/WEB-INF/queue.xml
 http://code.google.com/appengine/docs/java/config/queue.html
Task Queues

Timed HTTP requests
Configure in war/WEB-INF/queue.xml
 http://code.google.com/appengine/docs/java/config/queue.html

Can update without redeploying
Task Queues

Timed HTTP requests
Configure in war/WEB-INF/queue.xml
 http://code.google.com/appengine/docs/java/config/queue.html

Can update without redeploying
Can be secured
XMPP
XMPP

User notification
XMPP

User notification
XML payloads for distributed communication
XMPP

User notification
XML payloads for distributed communication
Send messages with a Groovier API
XMPP

User notification
XML payloads for distributed communication
Send messages with a Groovier API
Receive messages through a servlet
XMPP Sending
         in Java
XMPP Sending
        with Gaelyk
XMPP Sending
                                      with Gaelyk

def recipient = 'tlberglund@gmail.com'
if (xmpp.getPresence(recipient).isAvailable()) {
  def status = xmpp.send(to: recipient,
                         body: "Glad you're into Gaelyk!")

  if (!status.isSuccessful()) {
XMPP Sending
                                      with Gaelyk

def recipient = 'tlberglund@gmail.com'
if (xmpp.getPresence(recipient).isAvailable()) {
  def status = xmpp.send(to: recipient,
                         body: "Glad you're into Gaelyk!")

  if (!status.isSuccessful()) {
     // ...
XMPP Sending
                                      with Gaelyk

def recipient = 'tlberglund@gmail.com'
if (xmpp.getPresence(recipient).isAvailable()) {
  def status = xmpp.send(to: recipient,
                         body: "Glad you're into Gaelyk!")

    if (!status.isSuccessful()) {
       // ...
    }
}
XMPP Receiving
XMPP Receiving

Enable in appengine-web.xml
XMPP Receiving

Enable in appengine-web.xml
Enable built-in servlet in web.xml
XMPP Receiving

Enable in appengine-web.xml
Enable built-in servlet in web.xml
/war/WEB-INF/groovy/jabber.groovy
XMPP Receiving

Enable in appengine-web.xml
Enable built-in servlet in web.xml
/war/WEB-INF/groovy/jabber.groovy
The “message” intrinsic variable
Plugins
Plugins
Plugins
Analogous to Grails plugins
Plugins
Analogous to Grails plugins
Mini Gaelyk apps
Plugins
Analogous to Grails plugins
Mini Gaelyk apps
plugins/xxxPluginDescriptor.groovy
Plugins
Analogous to Grails plugins
Mini Gaelyk apps
plugins/xxxPluginDescriptor.groovy
Bundled as ZIP files
Plugins
Analogous to Grails plugins
Mini Gaelyk apps
plugins/xxxPluginDescriptor.groovy
Bundled as ZIP files
Ad-hoc discovery and distribution
Development
What about


      Services
      in development?
GAE Emulation
GAE Emulation
Datastore simulated in filesystem
GAE Emulation
Datastore simulated in filesystem
General Administration
GAE Emulation
Datastore simulated in filesystem
General Administration
  http://localhost:8080/_ah/admin
GAE Emulation
Datastore simulated in filesystem
General Administration
  http://localhost:8080/_ah/admin
Authentication
GAE Emulation
Datastore simulated in filesystem
General Administration
  http://localhost:8080/_ah/admin
Authentication
  http://localhost:8080/_ah/login
GAE Emulation
Datastore simulated in filesystem
General Administration
  http://localhost:8080/_ah/admin
Authentication
  http://localhost:8080/_ah/login
  http://localhost:8080/_ah/logout
Code
On github

git@github.com:tlberglund/august-stories.git

git@github.com:tlberglund/august-demo.git
Thank You
             Tim Berglund
         www.augusttechgroup.com
     tim.berglund@augusttechgroup.com
                 @tlberglund

Using Your Existing Team
Photo Credits
Parchment Background
http://www.photoshopstar.com/effects/recreate-indiana-jones-text-effect/

Más contenido relacionado

La actualidad más candente

Expression Language in JSP
Expression Language in JSPExpression Language in JSP
Expression Language in JSPcorneliuskoo
 
Joomla security nuggets
Joomla security nuggetsJoomla security nuggets
Joomla security nuggetsguestbd1cdca
 
One Person's Perspective on a Pragmatic REST Interface
One Person's Perspective on a Pragmatic REST InterfaceOne Person's Perspective on a Pragmatic REST Interface
One Person's Perspective on a Pragmatic REST Interfaceabrummett
 
@IndeedEng: Tokens and Millicents - technical challenges in launching Indeed...
@IndeedEng:  Tokens and Millicents - technical challenges in launching Indeed...@IndeedEng:  Tokens and Millicents - technical challenges in launching Indeed...
@IndeedEng: Tokens and Millicents - technical challenges in launching Indeed...indeedeng
 
Action Controller Overview, Season 2
Action Controller Overview, Season 2Action Controller Overview, Season 2
Action Controller Overview, Season 2RORLAB
 
Introduction to plugin development
Introduction to plugin developmentIntroduction to plugin development
Introduction to plugin developmentCaldera Labs
 
Cucumber Ru09 Web
Cucumber Ru09 WebCucumber Ru09 Web
Cucumber Ru09 WebJoseph Wilk
 
jQuery from the very beginning
jQuery from the very beginningjQuery from the very beginning
jQuery from the very beginningAnis Ahmad
 
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010singingfish
 
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)Joshua Warren
 
HTML5: It goes to ELEVEN
HTML5: It goes to ELEVENHTML5: It goes to ELEVEN
HTML5: It goes to ELEVENMathias Bynens
 
[@IndeedEng] Building Indeed Resume Search
[@IndeedEng] Building Indeed Resume Search[@IndeedEng] Building Indeed Resume Search
[@IndeedEng] Building Indeed Resume Searchindeedeng
 
django Forms in a Web API World
django Forms in a Web API Worlddjango Forms in a Web API World
django Forms in a Web API WorldTareque Hossain
 
REST API Best Practices & Implementing in Codeigniter
REST API Best Practices & Implementing in CodeigniterREST API Best Practices & Implementing in Codeigniter
REST API Best Practices & Implementing in CodeigniterSachin G Kulkarni
 
[@IndeedEng] Managing Experiments and Behavior Dynamically with Proctor
[@IndeedEng] Managing Experiments and Behavior Dynamically with Proctor[@IndeedEng] Managing Experiments and Behavior Dynamically with Proctor
[@IndeedEng] Managing Experiments and Behavior Dynamically with Proctorindeedeng
 
Designing and developing mobile web applications with Mockup, Sencha Touch an...
Designing and developing mobile web applications with Mockup, Sencha Touch an...Designing and developing mobile web applications with Mockup, Sencha Touch an...
Designing and developing mobile web applications with Mockup, Sencha Touch an...Matteo Collina
 
RESTful API Design Best Practices Using ASP.NET Web API
RESTful API Design Best Practices Using ASP.NET Web APIRESTful API Design Best Practices Using ASP.NET Web API
RESTful API Design Best Practices Using ASP.NET Web API💻 Spencer Schneidenbach
 
Building Better Web APIs with Rails
Building Better Web APIs with RailsBuilding Better Web APIs with Rails
Building Better Web APIs with RailsAll Things Open
 

La actualidad más candente (20)

Expression Language in JSP
Expression Language in JSPExpression Language in JSP
Expression Language in JSP
 
Joomla security nuggets
Joomla security nuggetsJoomla security nuggets
Joomla security nuggets
 
One Person's Perspective on a Pragmatic REST Interface
One Person's Perspective on a Pragmatic REST InterfaceOne Person's Perspective on a Pragmatic REST Interface
One Person's Perspective on a Pragmatic REST Interface
 
@IndeedEng: Tokens and Millicents - technical challenges in launching Indeed...
@IndeedEng:  Tokens and Millicents - technical challenges in launching Indeed...@IndeedEng:  Tokens and Millicents - technical challenges in launching Indeed...
@IndeedEng: Tokens and Millicents - technical challenges in launching Indeed...
 
Action Controller Overview, Season 2
Action Controller Overview, Season 2Action Controller Overview, Season 2
Action Controller Overview, Season 2
 
Introduction to plugin development
Introduction to plugin developmentIntroduction to plugin development
Introduction to plugin development
 
Cucumber Ru09 Web
Cucumber Ru09 WebCucumber Ru09 Web
Cucumber Ru09 Web
 
jQuery from the very beginning
jQuery from the very beginningjQuery from the very beginning
jQuery from the very beginning
 
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
 
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
 
HTML5: It goes to ELEVEN
HTML5: It goes to ELEVENHTML5: It goes to ELEVEN
HTML5: It goes to ELEVEN
 
[@IndeedEng] Building Indeed Resume Search
[@IndeedEng] Building Indeed Resume Search[@IndeedEng] Building Indeed Resume Search
[@IndeedEng] Building Indeed Resume Search
 
django Forms in a Web API World
django Forms in a Web API Worlddjango Forms in a Web API World
django Forms in a Web API World
 
A Phing fairy tale - ConFoo13
A Phing fairy tale - ConFoo13A Phing fairy tale - ConFoo13
A Phing fairy tale - ConFoo13
 
REST API Best Practices & Implementing in Codeigniter
REST API Best Practices & Implementing in CodeigniterREST API Best Practices & Implementing in Codeigniter
REST API Best Practices & Implementing in Codeigniter
 
[@IndeedEng] Managing Experiments and Behavior Dynamically with Proctor
[@IndeedEng] Managing Experiments and Behavior Dynamically with Proctor[@IndeedEng] Managing Experiments and Behavior Dynamically with Proctor
[@IndeedEng] Managing Experiments and Behavior Dynamically with Proctor
 
Designing and developing mobile web applications with Mockup, Sencha Touch an...
Designing and developing mobile web applications with Mockup, Sencha Touch an...Designing and developing mobile web applications with Mockup, Sencha Touch an...
Designing and developing mobile web applications with Mockup, Sencha Touch an...
 
RESTful API Design Best Practices Using ASP.NET Web API
RESTful API Design Best Practices Using ASP.NET Web APIRESTful API Design Best Practices Using ASP.NET Web API
RESTful API Design Best Practices Using ASP.NET Web API
 
I Love codeigniter, You?
I Love codeigniter, You?I Love codeigniter, You?
I Love codeigniter, You?
 
Building Better Web APIs with Rails
Building Better Web APIs with RailsBuilding Better Web APIs with Rails
Building Better Web APIs with Rails
 

Destacado

Disruptive Innovation in Higher Education: Why business schools should be wel...
Disruptive Innovation in Higher Education: Why business schools should be wel...Disruptive Innovation in Higher Education: Why business schools should be wel...
Disruptive Innovation in Higher Education: Why business schools should be wel...Jeremy Williams
 
坪井創吾さん / "王子様本のRuby1.9対応を調べる"
坪井創吾さん / "王子様本のRuby1.9対応を調べる"坪井創吾さん / "王子様本のRuby1.9対応を調べる"
坪井創吾さん / "王子様本のRuby1.9対応を調べる"toRuby
 
Increased FDI in defence manufacturing Press Note (7), 2014 series.
Increased FDI in defence manufacturing Press Note (7), 2014 series.Increased FDI in defence manufacturing Press Note (7), 2014 series.
Increased FDI in defence manufacturing Press Note (7), 2014 series.Ankur Gupta
 
Playful learningプレゼンテーション 佐宗
Playful learningプレゼンテーション 佐宗Playful learningプレゼンテーション 佐宗
Playful learningプレゼンテーション 佐宗kunitake saso
 
Offset 2012 Analysis
Offset 2012 AnalysisOffset 2012 Analysis
Offset 2012 AnalysisAnkur Gupta
 
Sözcükte Anlam Özellikleri
Sözcükte Anlam ÖzellikleriSözcükte Anlam Özellikleri
Sözcükte Anlam Özellikleriyardimt
 
Zientzia Hezkuntza Moodle Tere Santos
Zientzia Hezkuntza Moodle Tere SantosZientzia Hezkuntza Moodle Tere Santos
Zientzia Hezkuntza Moodle Tere SantosMoodleMoot Euskadi
 
Ses Bil.
Ses Bil.Ses Bil.
Ses Bil.yardimt
 
Romanii pot face cariera
Romanii pot face carieraRomanii pot face cariera
Romanii pot face carieraCarla Alman
 
Mktg Final Report
Mktg Final ReportMktg Final Report
Mktg Final Reportctringham
 
Play play playトークイベント
Play play playトークイベントPlay play playトークイベント
Play play playトークイベントkunitake saso
 
Fiillerde çAtı
Fiillerde çAtıFiillerde çAtı
Fiillerde çAtıyardimt
 
Why it takes 7 13 touches dmanc 011514-presentation_slides
Why it takes 7 13 touches dmanc 011514-presentation_slidesWhy it takes 7 13 touches dmanc 011514-presentation_slides
Why it takes 7 13 touches dmanc 011514-presentation_slidesDirect Marketing Partners
 
5 söz öbekleri-3-(atasözleri-özdeyişler-dolaylama-güzel adlandırma)
5 söz öbekleri-3-(atasözleri-özdeyişler-dolaylama-güzel adlandırma)5 söz öbekleri-3-(atasözleri-özdeyişler-dolaylama-güzel adlandırma)
5 söz öbekleri-3-(atasözleri-özdeyişler-dolaylama-güzel adlandırma)yardimt
 
Green Jobsfor Refugees
Green Jobsfor RefugeesGreen Jobsfor Refugees
Green Jobsfor Refugeessturmstories
 

Destacado (20)

Disruptive Innovation in Higher Education: Why business schools should be wel...
Disruptive Innovation in Higher Education: Why business schools should be wel...Disruptive Innovation in Higher Education: Why business schools should be wel...
Disruptive Innovation in Higher Education: Why business schools should be wel...
 
坪井創吾さん / "王子様本のRuby1.9対応を調べる"
坪井創吾さん / "王子様本のRuby1.9対応を調べる"坪井創吾さん / "王子様本のRuby1.9対応を調べる"
坪井創吾さん / "王子様本のRuby1.9対応を調べる"
 
Economia
EconomiaEconomia
Economia
 
Isimler
IsimlerIsimler
Isimler
 
Increased FDI in defence manufacturing Press Note (7), 2014 series.
Increased FDI in defence manufacturing Press Note (7), 2014 series.Increased FDI in defence manufacturing Press Note (7), 2014 series.
Increased FDI in defence manufacturing Press Note (7), 2014 series.
 
Playful learningプレゼンテーション 佐宗
Playful learningプレゼンテーション 佐宗Playful learningプレゼンテーション 佐宗
Playful learningプレゼンテーション 佐宗
 
Offset 2012 Analysis
Offset 2012 AnalysisOffset 2012 Analysis
Offset 2012 Analysis
 
February25 2010 Wcb Board Meeting Final For Web
February25 2010 Wcb Board Meeting Final For WebFebruary25 2010 Wcb Board Meeting Final For Web
February25 2010 Wcb Board Meeting Final For Web
 
Sözcükte Anlam Özellikleri
Sözcükte Anlam ÖzellikleriSözcükte Anlam Özellikleri
Sözcükte Anlam Özellikleri
 
Zientzia Hezkuntza Moodle Tere Santos
Zientzia Hezkuntza Moodle Tere SantosZientzia Hezkuntza Moodle Tere Santos
Zientzia Hezkuntza Moodle Tere Santos
 
Ses Bil.
Ses Bil.Ses Bil.
Ses Bil.
 
Movie making
Movie makingMovie making
Movie making
 
Romanii pot face cariera
Romanii pot face carieraRomanii pot face cariera
Romanii pot face cariera
 
Mktg Final Report
Mktg Final ReportMktg Final Report
Mktg Final Report
 
Play play playトークイベント
Play play playトークイベントPlay play playトークイベント
Play play playトークイベント
 
Fiillerde çAtı
Fiillerde çAtıFiillerde çAtı
Fiillerde çAtı
 
Imt
ImtImt
Imt
 
Why it takes 7 13 touches dmanc 011514-presentation_slides
Why it takes 7 13 touches dmanc 011514-presentation_slidesWhy it takes 7 13 touches dmanc 011514-presentation_slides
Why it takes 7 13 touches dmanc 011514-presentation_slides
 
5 söz öbekleri-3-(atasözleri-özdeyişler-dolaylama-güzel adlandırma)
5 söz öbekleri-3-(atasözleri-özdeyişler-dolaylama-güzel adlandırma)5 söz öbekleri-3-(atasözleri-özdeyişler-dolaylama-güzel adlandırma)
5 söz öbekleri-3-(atasözleri-özdeyişler-dolaylama-güzel adlandırma)
 
Green Jobsfor Refugees
Green Jobsfor RefugeesGreen Jobsfor Refugees
Green Jobsfor Refugees
 

Similar a Gaelyk: Lightweight Groovy on the Google App Engine

The Big Picture and How to Get Started
The Big Picture and How to Get StartedThe Big Picture and How to Get Started
The Big Picture and How to Get Startedguest1af57e
 
How Bitbucket Pipelines Loads Connect UI Assets Super-fast
How Bitbucket Pipelines Loads Connect UI Assets Super-fastHow Bitbucket Pipelines Loads Connect UI Assets Super-fast
How Bitbucket Pipelines Loads Connect UI Assets Super-fastAtlassian
 
Reactive Type safe Webcomponents with skateJS
Reactive Type safe Webcomponents with skateJSReactive Type safe Webcomponents with skateJS
Reactive Type safe Webcomponents with skateJSMartin Hochel
 
Working with Javascript in Rails
Working with Javascript in RailsWorking with Javascript in Rails
Working with Javascript in RailsSeungkyun Nam
 
The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2fishwarter
 
The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2fishwarter
 
The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2fishwarter
 
The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2fishwarter
 
cdac@parag.gajbhiye@test123
cdac@parag.gajbhiye@test123cdac@parag.gajbhiye@test123
cdac@parag.gajbhiye@test123Parag Gajbhiye
 
Course CodeSchool - Shaping up with Angular.js
Course CodeSchool - Shaping up with Angular.jsCourse CodeSchool - Shaping up with Angular.js
Course CodeSchool - Shaping up with Angular.jsVinícius de Moraes
 
RESTful web services with Groovy on Grails by Vugar Suleymanov
RESTful web services with Groovy on Grails by Vugar SuleymanovRESTful web services with Groovy on Grails by Vugar Suleymanov
RESTful web services with Groovy on Grails by Vugar SuleymanovVuqar Suleymanov
 
Stop the noise! - Introduction to the JSON:API specification in Drupal
Stop the noise! - Introduction to the JSON:API specification in DrupalStop the noise! - Introduction to the JSON:API specification in Drupal
Stop the noise! - Introduction to the JSON:API specification in DrupalBjörn Brala
 
243329387 angular-docs
243329387 angular-docs243329387 angular-docs
243329387 angular-docsAbhi166803
 
Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model
Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect ModelComprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model
Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect ModelvodQA
 

Similar a Gaelyk: Lightweight Groovy on the Google App Engine (20)

The Big Picture and How to Get Started
The Big Picture and How to Get StartedThe Big Picture and How to Get Started
The Big Picture and How to Get Started
 
How Bitbucket Pipelines Loads Connect UI Assets Super-fast
How Bitbucket Pipelines Loads Connect UI Assets Super-fastHow Bitbucket Pipelines Loads Connect UI Assets Super-fast
How Bitbucket Pipelines Loads Connect UI Assets Super-fast
 
Gohan
GohanGohan
Gohan
 
Django
DjangoDjango
Django
 
EVOLVE'14 | Enhance | Gabriel Walt | Sightly Component Development
EVOLVE'14 | Enhance | Gabriel Walt | Sightly Component DevelopmentEVOLVE'14 | Enhance | Gabriel Walt | Sightly Component Development
EVOLVE'14 | Enhance | Gabriel Walt | Sightly Component Development
 
前端概述
前端概述前端概述
前端概述
 
Reactive Type safe Webcomponents with skateJS
Reactive Type safe Webcomponents with skateJSReactive Type safe Webcomponents with skateJS
Reactive Type safe Webcomponents with skateJS
 
Working with Javascript in Rails
Working with Javascript in RailsWorking with Javascript in Rails
Working with Javascript in Rails
 
The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2
 
The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2
 
The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2
 
The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2
 
cdac@parag.gajbhiye@test123
cdac@parag.gajbhiye@test123cdac@parag.gajbhiye@test123
cdac@parag.gajbhiye@test123
 
Course CodeSchool - Shaping up with Angular.js
Course CodeSchool - Shaping up with Angular.jsCourse CodeSchool - Shaping up with Angular.js
Course CodeSchool - Shaping up with Angular.js
 
RESTful web services with Groovy on Grails by Vugar Suleymanov
RESTful web services with Groovy on Grails by Vugar SuleymanovRESTful web services with Groovy on Grails by Vugar Suleymanov
RESTful web services with Groovy on Grails by Vugar Suleymanov
 
Stop the noise! - Introduction to the JSON:API specification in Drupal
Stop the noise! - Introduction to the JSON:API specification in DrupalStop the noise! - Introduction to the JSON:API specification in Drupal
Stop the noise! - Introduction to the JSON:API specification in Drupal
 
Angular js
Angular jsAngular js
Angular js
 
243329387 angular-docs
243329387 angular-docs243329387 angular-docs
243329387 angular-docs
 
Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model
Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect ModelComprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model
Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model
 
Introduction to PHP
Introduction to PHPIntroduction to PHP
Introduction to PHP
 

Más de Tim Berglund

Distributed Systems In One Lesson
Distributed Systems In One LessonDistributed Systems In One Lesson
Distributed Systems In One LessonTim Berglund
 
Decision Making in Software Teams
Decision Making in Software TeamsDecision Making in Software Teams
Decision Making in Software TeamsTim Berglund
 
Then our buildings shape us 10 minutes
Then our buildings shape us   10 minutesThen our buildings shape us   10 minutes
Then our buildings shape us 10 minutesTim Berglund
 
Complexity Theory and Software Development
Complexity Theory and Software DevelopmentComplexity Theory and Software Development
Complexity Theory and Software DevelopmentTim Berglund
 
Slaying The Legacy Dragon: Practical Lessons in Replacing Old Software
Slaying The Legacy Dragon: Practical Lessons in Replacing Old SoftwareSlaying The Legacy Dragon: Practical Lessons in Replacing Old Software
Slaying The Legacy Dragon: Practical Lessons in Replacing Old SoftwareTim Berglund
 
Test First Refresh Second: Test-Driven Development in Grails
Test First Refresh Second: Test-Driven Development in GrailsTest First Refresh Second: Test-Driven Development in Grails
Test First Refresh Second: Test-Driven Development in GrailsTim Berglund
 
Test First, Refresh Second: Web App TDD in Grails
Test First, Refresh Second: Web App TDD in GrailsTest First, Refresh Second: Web App TDD in Grails
Test First, Refresh Second: Web App TDD in GrailsTim Berglund
 
Agile Database Development with Liquibase
Agile Database Development with LiquibaseAgile Database Development with Liquibase
Agile Database Development with LiquibaseTim Berglund
 
Database Refactoring With Liquibase
Database Refactoring With LiquibaseDatabase Refactoring With Liquibase
Database Refactoring With LiquibaseTim Berglund
 

Más de Tim Berglund (10)

Distributed Systems In One Lesson
Distributed Systems In One LessonDistributed Systems In One Lesson
Distributed Systems In One Lesson
 
NoSQL Smackdown!
NoSQL Smackdown!NoSQL Smackdown!
NoSQL Smackdown!
 
Decision Making in Software Teams
Decision Making in Software TeamsDecision Making in Software Teams
Decision Making in Software Teams
 
Then our buildings shape us 10 minutes
Then our buildings shape us   10 minutesThen our buildings shape us   10 minutes
Then our buildings shape us 10 minutes
 
Complexity Theory and Software Development
Complexity Theory and Software DevelopmentComplexity Theory and Software Development
Complexity Theory and Software Development
 
Slaying The Legacy Dragon: Practical Lessons in Replacing Old Software
Slaying The Legacy Dragon: Practical Lessons in Replacing Old SoftwareSlaying The Legacy Dragon: Practical Lessons in Replacing Old Software
Slaying The Legacy Dragon: Practical Lessons in Replacing Old Software
 
Test First Refresh Second: Test-Driven Development in Grails
Test First Refresh Second: Test-Driven Development in GrailsTest First Refresh Second: Test-Driven Development in Grails
Test First Refresh Second: Test-Driven Development in Grails
 
Test First, Refresh Second: Web App TDD in Grails
Test First, Refresh Second: Web App TDD in GrailsTest First, Refresh Second: Web App TDD in Grails
Test First, Refresh Second: Web App TDD in Grails
 
Agile Database Development with Liquibase
Agile Database Development with LiquibaseAgile Database Development with Liquibase
Agile Database Development with Liquibase
 
Database Refactoring With Liquibase
Database Refactoring With LiquibaseDatabase Refactoring With Liquibase
Database Refactoring With Liquibase
 

Último

From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vázquez
 
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Principled Technologies
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 

Último (20)

From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 

Gaelyk: Lightweight Groovy on the Google App Engine

Notas del editor

  1. On the JDK, we&amp;#x2019;ve got options, and they&amp;#x2019;re growing. Groovy is a better Java focused on strong Java interop, an easy migration path, and easy application coding.
  2. Often the Java deployment story is less than happy. The Ops team gets it and feels great about it, but the PHP guys don&amp;#x2019;t know what to do with us. We&amp;#x2019;ve got great framework choices,
  3. It should be an easy framework to learn and use.
  4. Demo starting up a Gaelyk app.
  5. You&amp;#x2019;re running your app on Google&amp;#x2019;s nearly infinitely scalable infrastructure. Go ahead, DDOS it!
  6. You&amp;#x2019;re running your app on Google&amp;#x2019;s nearly infinitely scalable infrastructure. Go ahead, DDOS it!
  7. You&amp;#x2019;re running your app on Google&amp;#x2019;s nearly infinitely scalable infrastructure. Go ahead, DDOS it!
  8. You can sign up and get started and not pay a dime. You get certain free quotas.
  9. GAE offers more than just transfer in and out and CPU. All services have their own quotas described at that URL. Since we&amp;#x2019;re talking about Gaelyk, not GAE, we&amp;#x2019;ll move on.
  10. If you grow beyond the free quotas, you can always buy more. Internet scale, baby!
  11. Started at Python. Now any language of the JVM, within limitations.
  12. Started at Python. Now any language of the JVM, within limitations.
  13. Started at Python. Now any language of the JVM, within limitations.
  14. Started at Python. Now any language of the JVM, within limitations.
  15. Started at Python. Now any language of the JVM, within limitations.
  16. Started at Python. Now any language of the JVM, within limitations.
  17. Remember, it&amp;#x2019;s basically an app server.
  18. Remember, it&amp;#x2019;s basically an app server.
  19. Remember, it&amp;#x2019;s basically an app server.
  20. Most of java.awt, javax.imageio, some java.nio, etc. Performance problems in Java have to do with first-request performance after a delay of no requests.
  21. Most of java.awt, javax.imageio, some java.nio, etc. Performance problems in Java have to do with first-request performance after a delay of no requests.
  22. Most of java.awt, javax.imageio, some java.nio, etc. Performance problems in Java have to do with first-request performance after a delay of no requests.
  23. Most of java.awt, javax.imageio, some java.nio, etc. Performance problems in Java have to do with first-request performance after a delay of no requests.
  24. Most of java.awt, javax.imageio, some java.nio, etc. Performance problems in Java have to do with first-request performance after a delay of no requests.
  25. Most of java.awt, javax.imageio, some java.nio, etc. Performance problems in Java have to do with first-request performance after a delay of no requests.
  26. All examples will be with TextMate and the Console. No Eclipse plugin necessary!
  27. Attachments are optional.
  28. Attachments are optional.
  29. A discussion
  30. PluginDescriptor can add bindings, etc.
  31. PluginDescriptor can add bindings, etc.
  32. PluginDescriptor can add bindings, etc.
  33. PluginDescriptor can add bindings, etc.
  34. PluginDescriptor can add bindings, etc.
  35. The GAE SDK contains an embedded Jetty instance that emulates all appropriate services. The Eclipse plugin does this as well, but you don&amp;#x2019;t have to use it.
  36. It&amp;#x2019;s also easy to deploy to GAE from the command line.