Google App Engine
                                        Ikai Lan
                            Kuala Lumpur, GTUG Hackathon
                                    Twitter: @ikai
                                     June 18, 2011




Saturday, June 18, 2011
About the speaker
                     • Developer Relations at Google based out
                          of San Francisco, CA
                     • Primarily work in Java and Python
                          nowadays; lots of experience with Ruby,
                          JavaScript, PHP <5.3
                     • Focus: Cloud products
                     • Twitter: @ikai
Saturday, June 18, 2011
Agenda

                     • What is Google App Engine?
                     • Various features of GAE
                     • How to get started
                     • Introduction to Go
                     • Important tools + some tips

Saturday, June 18, 2011
Software

                            Platform


                          Infrastructure

                                           Source: Gartner AADI Summit Dec 2009


Saturday, June 18, 2011
Software

                            Platform


                          Infrastructure

                                           Source: Gartner AADI Summit Dec 2009


Saturday, June 18, 2011
Software

                            Platform


                          Infrastructure

                                           Source: Gartner AADI Summit Dec 2009


Saturday, June 18, 2011
Software

                            Platform


                          Infrastructure

                                           Source: Gartner AADI Summit Dec 2009


Saturday, June 18, 2011
• Easy to build
                     • Easy to manage
                     • Easy to scale

Saturday, June 18, 2011
“We wear pagers so
                           you don’t have to”




Saturday, June 18, 2011
Saturday, June 18, 2011
>90K Developers

                              >130K Apps

                          >700M daily pageviews


Saturday, June 18, 2011
SDK & “The Cloud”

                 Hardware

                 Networking

                 Operating system

                 Application runtime

                          Java, Python, Go

                 Static file serving

                                             20

Saturday, June 18, 2011
Development Cycle

                     • Write code locally
                     • Test, push to Google Servers
                     • Administer via a web interface - http://
                          appengine.google.com




Saturday, June 18, 2011
Admin Console




Saturday, June 18, 2011
Duke, the Java mascot
                          Go Gopher    Copyright © Sun Microsystems Inc., all rights reserved.




Saturday, June 18, 2011
Extended Language support
                                 through JVM
                   • Java
                   • Scala
                   • JRuby (Ruby)
                   • Groovy                    Duke, the Java mascot
                                            Copyright © Sun Microsystems Inc., all rights reserved.



                   • Quercus (PHP)
                   • Rhino (JavaScript)
                   • Jython (Python)
                   • Clojure

Saturday, June 18, 2011
Core APIs
                          Memcache      Datastore   URL Fetch




                            Mail         XMPP       Task Queue




                           Images       Blobstore   User Service


Saturday, June 18, 2011
High Replication

                     • Strongly consistent, multi-datastore, multi-
                          data center serving solution
                     • Write once, have your data be available in a
                          highly consistent manner
                     • No data loss, no datastore outages

Saturday, June 18, 2011
Other APIs

                     • High performance image serving
                     • App Engine Map Reduce
                     • Prospective Search API
                     • Pipeline API
                     • OAuth provider

Saturday, June 18, 2011
Prospective Search
                     • Matches a high rate of incoming documents
                     • 100,000 matches a second
                     • Think: How might we build something like
                          Google Alerts?
                     • http://code.google.com/appengine/docs/
                          python/prospectivesearch/


Saturday, June 18, 2011
A basic Python app

                     • 2 files: app.yaml and main.py
                     • Easier to use when Python SDK is in your
                          system path
                     • Start server with dev_appserver.py
                     • Deploy via appcfg.py

Saturday, June 18, 2011
app.yaml




Saturday, June 18, 2011
main.py




Saturday, June 18, 2011
Getting started with
                                  Java

                     • Servlets API
                     • Google Plugin for Eclipse will generate a
                          skeleton project: http://code.google.com/
                          eclipse/beta/docs/download.html




Saturday, June 18, 2011
Go: why I like it
                     • “The next version of C, brought to you by
                          the guys who didn’t bring you C++”
                     • Modern, type safe compiled language (stdlib
                          includes: json parsing, web server)
                     • Functions as first class objects
                     • Concurrency baked in via goroutines and
                          channels
                     • Very fast compilation times
Saturday, June 18, 2011
Flexible interfaces
                      // This is an interface declaration
                      type myInterface interface {
                      	   set(i int)
                      }

                      // This is a Type declaration. Note that it is a type, not a class
                      type myType struct {
                          i int
                      }

                      // This is how we define a function where myType is a receiver
                      // With an instance of myType we can call myType.set(123)
                      func (p *myType) set(i int) {
                         p.i = i
                      }

                      // Because myType defines a function with the signature set(int i) method,
                      // we can use it anywhere myInterface is accepted!
                      func setToThousand(x myInterface) {
                         myInterface.set(1000)
                      }




Saturday, June 18, 2011
First class functions
                package main
                import "fmt"

                // Make a function that returns a new function
                func makeAdd(increment int) (counter func(int) int) {
                        return func(v int) int {
                                return v + increment;
                        }
                }

                func main() {
                        fmt.Printf("value of makeAdd(100)(1) is %vn", makeAdd(100)(1));
                        fmt.Printf("value of makeAdd(200)(2) is %vn", makeAdd(200)(2));
                }

                // Outputs:
                // value of makeAdd(100)(1) is 101
                // value of makeAdd(200)(2) is 202




Saturday, June 18, 2011
Goroutines and
                          package main
                                      Channels
                          import (
                              "fmt"
                              "time"
                          )

                          func doLotsOfWork(until int, ch chan int) {
                              c := 0
                              for i := 0; i < until; i++ {
                                  c += i
                                  time.Sleep(1000)
                              }
                              ch <- c
                          }

                          func main() {
                              ch := make(chan int)

                              // First the work off into the background
                              go doLotsOfWork(5, ch)

                              // Do more work here while we wait for this process to complete

                              // Block until doLotsOfWork sends data back on this channel
                              i := <- ch
                              fmt.Printf("Final value: %vn", i)
                          }


Saturday, June 18, 2011
It runs on App Engine!
                     • Currently requires whitelisting
                     • Experimental status
                     • Goroutines allow for concurrency within
                          request; concurrent requests coming
                     • Demo app: http://moustach-io.appspot.com/
                     • Source: https://code.google.com/p/
                          appengine-go/source/browse/example/


Saturday, June 18, 2011
Mustachio




Saturday, June 18, 2011
General tips
                     • The datastore is built on top of BigTable. It
                          is non-relational!

                     • Be aware of limits: 30 second requests, 10
                          minute tasks queues/cron jobs, whitelisted
                          classes
                     • Python 2.5 compatible (but can use 2.6 or
                          2.7 locally)


Saturday, June 18, 2011
Useful Python tools
                     • Tipfy: http://www.tipfy.org/
                     • Django non-rel: http://
                          www.allbuttonspressed.com/projects/
                          django-nonrel
                     • Testbed API: http://code.google.com/
                          appengine/docs/python/tools/
                          localunittesting.html


Saturday, June 18, 2011
Java tips
                     • Use low-level datastore API or third party
                          API: http://code.google.com/p/objectify-
                          appengine/
                     • Start with servlets API - will have to do
                          some work to make your favorite
                          framework work. Slim3 is a good GAE
                          specific framework


Saturday, June 18, 2011
Summary

                     • Hopefully people here are interested in
                          hacking on App Engine
                     • Java, Python and Go
                     • Ask me if you have general questions, I will
                          be around all weekend



Saturday, June 18, 2011
Questions?


                     • Twitter: @ikai
                     • App Engine: http://code.google.com/
                          appengine




Saturday, June 18, 2011

2011 june-kuala-lumpur-gtug-hackathon

  • 1.
    Google App Engine Ikai Lan Kuala Lumpur, GTUG Hackathon Twitter: @ikai June 18, 2011 Saturday, June 18, 2011
  • 2.
    About the speaker • Developer Relations at Google based out of San Francisco, CA • Primarily work in Java and Python nowadays; lots of experience with Ruby, JavaScript, PHP <5.3 • Focus: Cloud products • Twitter: @ikai Saturday, June 18, 2011
  • 3.
    Agenda • What is Google App Engine? • Various features of GAE • How to get started • Introduction to Go • Important tools + some tips Saturday, June 18, 2011
  • 4.
    Software Platform Infrastructure Source: Gartner AADI Summit Dec 2009 Saturday, June 18, 2011
  • 5.
    Software Platform Infrastructure Source: Gartner AADI Summit Dec 2009 Saturday, June 18, 2011
  • 6.
    Software Platform Infrastructure Source: Gartner AADI Summit Dec 2009 Saturday, June 18, 2011
  • 7.
    Software Platform Infrastructure Source: Gartner AADI Summit Dec 2009 Saturday, June 18, 2011
  • 8.
    • Easy tobuild • Easy to manage • Easy to scale Saturday, June 18, 2011
  • 9.
    “We wear pagersso you don’t have to” Saturday, June 18, 2011
  • 10.
  • 11.
    >90K Developers >130K Apps >700M daily pageviews Saturday, June 18, 2011
  • 12.
    SDK & “TheCloud” Hardware Networking Operating system Application runtime Java, Python, Go Static file serving 20 Saturday, June 18, 2011
  • 13.
    Development Cycle • Write code locally • Test, push to Google Servers • Administer via a web interface - http:// appengine.google.com Saturday, June 18, 2011
  • 14.
  • 15.
    Duke, the Javamascot Go Gopher Copyright © Sun Microsystems Inc., all rights reserved. Saturday, June 18, 2011
  • 16.
    Extended Language support through JVM • Java • Scala • JRuby (Ruby) • Groovy Duke, the Java mascot Copyright © Sun Microsystems Inc., all rights reserved. • Quercus (PHP) • Rhino (JavaScript) • Jython (Python) • Clojure Saturday, June 18, 2011
  • 17.
    Core APIs Memcache Datastore URL Fetch Mail XMPP Task Queue Images Blobstore User Service Saturday, June 18, 2011
  • 18.
    High Replication • Strongly consistent, multi-datastore, multi- data center serving solution • Write once, have your data be available in a highly consistent manner • No data loss, no datastore outages Saturday, June 18, 2011
  • 19.
    Other APIs • High performance image serving • App Engine Map Reduce • Prospective Search API • Pipeline API • OAuth provider Saturday, June 18, 2011
  • 20.
    Prospective Search • Matches a high rate of incoming documents • 100,000 matches a second • Think: How might we build something like Google Alerts? • http://code.google.com/appengine/docs/ python/prospectivesearch/ Saturday, June 18, 2011
  • 21.
    A basic Pythonapp • 2 files: app.yaml and main.py • Easier to use when Python SDK is in your system path • Start server with dev_appserver.py • Deploy via appcfg.py Saturday, June 18, 2011
  • 22.
  • 23.
  • 24.
    Getting started with Java • Servlets API • Google Plugin for Eclipse will generate a skeleton project: http://code.google.com/ eclipse/beta/docs/download.html Saturday, June 18, 2011
  • 25.
    Go: why Ilike it • “The next version of C, brought to you by the guys who didn’t bring you C++” • Modern, type safe compiled language (stdlib includes: json parsing, web server) • Functions as first class objects • Concurrency baked in via goroutines and channels • Very fast compilation times Saturday, June 18, 2011
  • 26.
    Flexible interfaces // This is an interface declaration type myInterface interface { set(i int) } // This is a Type declaration. Note that it is a type, not a class type myType struct { i int } // This is how we define a function where myType is a receiver // With an instance of myType we can call myType.set(123) func (p *myType) set(i int) { p.i = i } // Because myType defines a function with the signature set(int i) method, // we can use it anywhere myInterface is accepted! func setToThousand(x myInterface) { myInterface.set(1000) } Saturday, June 18, 2011
  • 27.
    First class functions package main import "fmt" // Make a function that returns a new function func makeAdd(increment int) (counter func(int) int) { return func(v int) int { return v + increment; } } func main() { fmt.Printf("value of makeAdd(100)(1) is %vn", makeAdd(100)(1)); fmt.Printf("value of makeAdd(200)(2) is %vn", makeAdd(200)(2)); } // Outputs: // value of makeAdd(100)(1) is 101 // value of makeAdd(200)(2) is 202 Saturday, June 18, 2011
  • 28.
    Goroutines and package main Channels import ( "fmt" "time" ) func doLotsOfWork(until int, ch chan int) { c := 0 for i := 0; i < until; i++ { c += i time.Sleep(1000) } ch <- c } func main() { ch := make(chan int) // First the work off into the background go doLotsOfWork(5, ch) // Do more work here while we wait for this process to complete // Block until doLotsOfWork sends data back on this channel i := <- ch fmt.Printf("Final value: %vn", i) } Saturday, June 18, 2011
  • 29.
    It runs onApp Engine! • Currently requires whitelisting • Experimental status • Goroutines allow for concurrency within request; concurrent requests coming • Demo app: http://moustach-io.appspot.com/ • Source: https://code.google.com/p/ appengine-go/source/browse/example/ Saturday, June 18, 2011
  • 30.
  • 31.
    General tips • The datastore is built on top of BigTable. It is non-relational! • Be aware of limits: 30 second requests, 10 minute tasks queues/cron jobs, whitelisted classes • Python 2.5 compatible (but can use 2.6 or 2.7 locally) Saturday, June 18, 2011
  • 32.
    Useful Python tools • Tipfy: http://www.tipfy.org/ • Django non-rel: http:// www.allbuttonspressed.com/projects/ django-nonrel • Testbed API: http://code.google.com/ appengine/docs/python/tools/ localunittesting.html Saturday, June 18, 2011
  • 33.
    Java tips • Use low-level datastore API or third party API: http://code.google.com/p/objectify- appengine/ • Start with servlets API - will have to do some work to make your favorite framework work. Slim3 is a good GAE specific framework Saturday, June 18, 2011
  • 34.
    Summary • Hopefully people here are interested in hacking on App Engine • Java, Python and Go • Ask me if you have general questions, I will be around all weekend Saturday, June 18, 2011
  • 35.
    Questions? • Twitter: @ikai • App Engine: http://code.google.com/ appengine Saturday, June 18, 2011