SlideShare ist ein Scribd-Unternehmen logo
1 von 150
Lightweight


                  on the

by Tim Berglund
Tell me about
aGreat
Application
  Language
Tell me

a
   Happy
    Tale
      of
Deployment
and


Make  it

   Fast
Gaelyk: Lightweight Groovy on the Google App Engine
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
Gaelyk: Lightweight Groovy on the Google App Engine
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
Gaelyk: Lightweight Groovy on the Google App Engine
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
Gaelyk: Lightweight Groovy on the Google App Engine
Gaelyk: Lightweight Groovy on the Google App Engine
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/

Weitere ähnliche Inhalte

Was ist angesagt?

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
 

Was ist angesagt? (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
 

Andere mochten auch

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
 

Andere mochten auch (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
 

Ähnlich wie 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
 

Ähnlich wie 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
 

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

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

Kürzlich hochgeladen

Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioChristian Posta
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfAijun Zhang
 
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAshyamraj55
 
Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxMatsuo Lab
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Brian Pichman
 
Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.YounusS2
 
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...Aggregage
 
AI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarAI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarPrecisely
 
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...Will Schroeder
 
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py20230202 - Introduction to tis-py
20230202 - Introduction to tis-pyJamie (Taka) Wang
 
Empowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintEmpowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintMahmoud Rabie
 
Designing A Time bound resource download URL
Designing A Time bound resource download URLDesigning A Time bound resource download URL
Designing A Time bound resource download URLRuncy Oommen
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024SkyPlanner
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDELiveplex
 
Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1DianaGray10
 
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1DianaGray10
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfinfogdgmi
 
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesAI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesMd Hossain Ali
 
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UbiTrack UK
 

Kürzlich hochgeladen (20)

Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and Istio
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdf
 
20230104 - machine vision
20230104 - machine vision20230104 - machine vision
20230104 - machine vision
 
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
 
Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptx
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )
 
Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.
 
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
 
AI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarAI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity Webinar
 
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
 
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py20230202 - Introduction to tis-py
20230202 - Introduction to tis-py
 
Empowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintEmpowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership Blueprint
 
Designing A Time bound resource download URL
Designing A Time bound resource download URLDesigning A Time bound resource download URL
Designing A Time bound resource download URL
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
 
Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1
 
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdf
 
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesAI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
 
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
 

Gaelyk: Lightweight Groovy on the Google App Engine

Hinweis der Redaktion

  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.