Google Montreal Hackathon
Google Montreal Hackathon
Brought to you by
Google Montreal
Year One Labs
and RPM
Launched in 2008
Simplify web applications
Make Google’s infrastructure
available to the world
u eu es
o r e q
+ M her QPS
H i g it
+ l i m
1 0Min
+
a ge rt
st i m m it pp o
+ F a
G B l i
n ID Su
e r v i ng + 2
a d er +O p e
s i le r e
+ F
u eu es
o r e q
+ M her QPS
H i g it
+ l i m
1 0Min
+
a ge rt
st i m m it pp o
+ F a
G B l i
n ID Su
e r v i ng + 2
a d er +O p e
s i le r e
+ F
class Employee(db.Model):
name = db.StringProperty(required=True)
hire_date = db.DateProperty()
e = Employee(name="Bob")
e.hire_date = datetime.datetime.now().date()
e.put()
DatastoreService datastore =
DatastoreServiceFactory.getDatastoreService();
datastore.put(employee);
intro = memcache.get("intro")
if intro is not None:
return intro
else:
intro = self.render_intro()
memcache.add("intro", intro, 3600)
return greetings
# Other operators
memcache.set("key", value, time)
memcache.set_multi({ ... }, time=3600)
memcache.set(key="counter", 0)
memcache.incr("counter") # Atomically increment
class MyHandler(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
if user:
signout_url = users.create_logout_url("/")
greeting = ("%s <a href=\"%s\">sign out</a>" %
(user.nickname(), signout_url))
else:
signin_url = users.create_login_url("/")
greeting = ("<a href=\"%s\">Sign in</a>." %
signin_url)
self.response.out.write("<html><body>")
self.response.out.write(%s)
self.response.out.write("</body></html>")
class CounterWorker(webapp.RequestHandler):
def post(self):
key = self.request.get('key')
counter = Counter.get_by_key_name(key)
if counter is None:
counter = Counter(key_name=key, count=1)
else:
counter.count += 1
counter.put()
def main():
run_wsgi_app(webapp.WSGIApplication([
('/', CounterHandler),
('/task', CounterWorker),
]))
Saturday, January 22, 2011
Blobstore
uploadurl = blobstore.create_upload_url('/upload')
self.response.out.write('<html><body><form
action="%s" method="POST"
enctype="multipart/form-data">' % uploadurl)
self.response.out.write(
"""Upload File: <input type="file"
name="file"><br> <input type="submit"
name="submit" value="Submit">
</form></body></html>""")
user = '[email protected]'
if xmpp.get_presence(user):
msg = "Hello example!"
status_code = xmpp.send_message(user, msg)
message_sent = (status_code != xmpp.NO_ERROR)
class XMPPHandler(webapp.RequestHandler):
def post(self):
message = xmpp.Message(self.request.POST)
if message.body[0:5].lower() == 'hello':
message.reply("Greetings!")
application = webapp.WSGIApplication(
[('/_ah/xmpp/message/chat/', XMPPHandler)])
self.response.out.write(
template.render('index.html', template_values))
class Photo(db.Model):
title = db.StringProperty()
full_size_image = db.BlobProperty()
class Thumbnailer(webapp.RequestHandler):
def get(self):
photo = Photo.get_by_id(self.request.get("id"))
img = images.Image(photo.full_size_image)
img.resize(width=80, height=100)
thumbnail = img.execute_transforms()
self.response.headers['Content-Type']
= 'image/jpeg'
self.response.out.write(thumbnail)
Mapper: http://code.google.com/p/appengine-mapreduce/
New DB: http://code.google.com/p/appengine-ndb-experiment/
Pipeline: http://code.google.com/p/appengine-pipeline/
Async Tools: http://code.google.com/p/asynctools/
Objectify: http://code.google.com/p/objectify-appengine/