Cloud Computing

An overview of web hosting, grid, and cloud computing services.

1 Idea

2 Amazon

2.1 EC2

2.2 S3

2.3 SimpleDB

2.4 Mechanical Turk

3 Google App Engine

3.1 Setup

  1. Download the software (python libs).
  2. Create dir and write helloworld.py:
    print 'Content-Type: text/plain'
    print ''
    print 'Hello, world!'
    
  3. Write app.yaml:
    application: helloworld
    version: 1
    runtime: python
    api_version: 1
    
    handlers:
    - url: /.*
      script: helloworld.py
    
  4. Run the web-server: google_appengine/dev_appserver.py helloworld/
  5. Go to http://localhost:8080/

3.2 webapp

import wsgiref.handlers

from google.appengine.ext import webapp

class MainPage(webapp.RequestHandler):
  def get(self):
    self.response.headers['Content-Type'] = 'text/plain'
    self.response.out.write('Hello, webapp World!')

def main():
  application = webapp.WSGIApplication(
                                       [('/', MainPage)],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == "__main__":
  main()
  

3.3 User Services

import wsgiref.handlers

from google.appengine.api import users
from google.appengine.ext import webapp

class MainPage(webapp.RequestHandler):
  def get(self):
    user = users.get_current_user()

    if user:
      self.response.headers['Content-Type'] = 'text/plain'
      self.response.out.write('Hello, ' + user.nickname())
    else:
      self.redirect(users.create_login_url(self.request.uri))

def main():
  application = webapp.WSGIApplication(
                                       [('/', MainPage)],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == "__main__":
  main()
  

3.4 Forms

import cgi
import wsgiref.handlers

from google.appengine.api import users
from google.appengine.ext import webapp

class MainPage(webapp.RequestHandler):
  def get(self):
    self.response.out.write("""
      <html>
        <body>
          <form action="/sign" method="post">
            <div><textarea name="content" rows="3" cols="60"></textarea></div>
            <div><input type="submit" value="Sign Guestbook"></div>
          </form>
        </body>
      </html>""")


class Guestbook(webapp.RequestHandler):
  def post(self):
    self.response.out.write('<html><body>You wrote:<pre>')
    self.response.out.write(cgi.escape(self.request.get('content')))
    self.response.out.write('</pre></body></html>')

def main():
  application = webapp.WSGIApplication(
                                       [('/', MainPage),
                                        ('/sign', Guestbook)],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == "__main__":
  main()

3.5 Datastore

import cgi
import wsgiref.handlers

from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext import db

class Greeting(db.Model):
    author = db.UserProperty()
    content = db.StringProperty(multiline=True)
    date = db.DateTimeProperty(auto_now_add=True)
  
class MainPage(webapp.RequestHandler):
    def get(self):
        self.response.out.write('<html><body>')

        greetings = db.GqlQuery("SELECT * FROM Greeting ORDER BY date DESC LIMIT 10")

        for greeting in greetings:
            if greeting.author:
                self.response.out.write('<b>%s</b> wrote:' % greeting.author.nickname())
            else:
                self.response.out.write('An anonymous person wrote:')
            self.response.out.write('<blockquote>%s</blockquote>' %
                              cgi.escape(greeting.content))

    # Write the submission form and the footer of the page
        self.response.out.write("""
          <form action="/sign" method="post">
            <div><textarea name="content" rows="3" cols="60"></textarea></div>
            <div><input type="submit" value="Sign Guestbook"></div>
          </form>
        </body>
      </html>""")

class Guestbook(webapp.RequestHandler):
    def post(self):
        greeting = Greeting()
    
        if users.get_current_user():
            greeting.author = users.get_current_user()

        greeting.content = self.request.get('content')
        greeting.put()
        self.redirect('/')

def main():
  application = webapp.WSGIApplication(
                                       [('/', MainPage),
                                        ('/sign', Guestbook)],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == "__main__":
  main()

3.6 Templates

import os
from google.appengine.ext.webapp import template

import cgi
import wsgiref.handlers

from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext import db

class Greeting(db.Model):
    author = db.UserProperty()
    content = db.StringProperty(multiline=True)
    date = db.DateTimeProperty(auto_now_add=True)
  
class MainPage(webapp.RequestHandler):
  def get(self):
    greetings = Greeting.all().order('-date')

    if users.get_current_user():
      url = users.create_logout_url(self.request.uri)
      url_linktext = 'Logout'
    else:
      url = users.create_login_url(self.request.uri)
      url_linktext = 'Login'

    template_values = {
      'greetings': greetings,
      'url': url,
      'url_linktext': url_linktext,
      }

    path = os.path.join(os.path.dirname(__file__), 'index.html')
    self.response.out.write(template.render(path, template_values))

class Guestbook(webapp.RequestHandler):
    def post(self):
        greeting = Greeting()
    
        if users.get_current_user():
            greeting.author = users.get_current_user()

        greeting.content = self.request.get('content')
        greeting.put()
        self.redirect('/')

def main():
  application = webapp.WSGIApplication(
                                       [('/', MainPage),
                                        ('/sign', Guestbook)],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == "__main__":
  main()
<html>
  <body>
    {% for greeting in greetings %}
      {% if greeting.author %}
        <b>{{ greeting.author.nickname }}</b> wrote:
      {% else %}
       An anonymous person wrote:
      {% endif %}
      <blockquote>{{ greeting.content|escape }}</blockquote>
    {% endfor %}

    <form action="/sign" method="post">
      <div><textarea name="content" rows="3" cols="60"></textarea></div>
      <div><input type="submit" value="Sign Guestbook"></div>
    </form>

    <a href="{{ url }}">{{ url_linktext }}</a>

  </body>
</html>

3.7 Static Files

application: helloworld
version: 1
runtime: python
api_version: 1

handlers:
- url: /stylesheets
  static_dir: stylesheets

- url: /.*
  script: helloworld.py

3.8 URL and Mail

4 Google Mashup Editor

5 Heroku

6 MapReduce

7 Conclusion

URLs

  1. wikipedia:Utility_computing, http://www.wikipedia.org/wiki/Utility_computing
  2. web services, http://aws.amazon.com
  3. Bezo's, http://news.zdnet.com/2422-13568_22-153491.html
  4. interviews, http://video.google.com/videoplay?docid=4167005935484308714
  5. Elastic Compute Cloud, http://aws.amazon.com/ec2
  6. video tutorial, http://www.youtube.com/watch?v=bBajLxeKqoY
  7. vmware, http://www.vmware.com
  8. wikipedia:Virtualization, http://www.wikipedia.org/wiki/Virtualization
  9. Simple Storage Service , http://aws.amazon.com/s3
  10. smugmug, http://blogs.smugmug.com/don/2006/11/10/amazon-s3-show-me-the-money/
  11. SimpleDB , http://aws.amazon.com/simpledb
  12. mechanical turk, http://www.mturk.com
  13. fun, http://www.salon.com/tech/feature/2006/07/24/turks/index.html
  14. pay nothing, http://video.google.com/videoplay?docid=-8246463980976635143
  15. more fun game, http://images.google.com/imagelabeler/
  16. app engine, http://code.google.com/appengine/
  17. mashup editor, http://editor.googlemashups.com/
  18. Heroku, http://www.heroku.com
  19. video, http://video.google.com/videoplay?docid=-3876542017297057077
  20. paper, http://labs.google.com/papers/mapreduce.html
  21. Microsoft's Live Mesh, http://www.mesh.com
  22. memo from Ray Ozzie, http://www.readwriteweb.com/archives/full_text_of_ray_ozzie_mesh_memo.php
  23. prism, http://labs.mozilla.com/2008/03/major-update-to-prism-first-prototype-of-browser-integration/

This talk available at http://jmvidal.cse.sc.edu/talks/cloudcomputing/
Copyright © 2009 José M. Vidal . All rights reserved.

23 April 2008, 01:03PM