Desenvolvendo aplicativos Web com o Google AppEnginepor Flávio Juvenal
RoteiroIntroduçãoQuem Somos?Arquitetura CloudGoogle AppEngineO que é?Pilha de SoluçõesNa práticaLições aprendidas
Quem Somos?Um website e appsobre pessoas e eventosInformações sociais e Recomendações
Quem Somos?
Quem Somos?
Quem Somos?7 alunos doCentro de Informática - UFPESemi-finalistas do Prêmio Santander de EmpreendedorismoFinalistas Campuseiros Empreendem (categoria mobile)
Arquitetura Cloud
O que é o Google AppEngine?Cloudcomputing com o GooglePermite que você execute seus aplicativos da web na infra-estrutura do Google.Platform as a ServiceAbstrai configuração de software e hardware e oferece uma plataforma de desenvolvimento pronta para o uso!Webapp+ Python 2.5+ Datastore
Pilha de SoluçõesWebappFramework web do Google para desenvolver a camada de apresentação (MVC). Muito fácil de usar.Python 2.5A melhor linguagem de programação para você escrever facilmente o código de controle do seu aplicativo web.DatastoreO jeito Google de armazenar dados. Tudo são chaves e valores. BD não relacional com foco em escalabilidade.
O que é o Google AppEngine?Trabalha na equipe do Google AppEngine!
Na práticaComo fazer um ‘Hello World’?classMainPage(webapp.RequestHandler):  defget(self):self.response.headers['Content-Type'] = 'text/plain'self.response.out.write('Hello World!')
Na práticaVamos fazer um website similar ao deliciousdelicious = Favoritos + Tags
Na práticaVamos fazer um website similar ao delicious
Na práticaVamos fazer um website similar ao delicious
Na práticaNo ar!http://tagyoururl.appspot.com
Na práticaMostrando o HTML (handler do GET)classMainPage(webapp.RequestHandler):   defget(self):self.response.out.write(template.render('index.html', {}))
Na práticaMostrando o HTML (handler do GET)<form class="myform" action="/" method="post">  <input type="text" name="url"/>  <input type="hidden" name="item[tags][]"/>  <input title="Inserir" type="submit"/></form>
Na práticaProcessando formulário (handler do POST)classMainPage(webapp.RequestHandler):   def post(self):url = self.request.get('url')tags = self.request.get_all('item[tags][]')control.insertBookmark(url, tags)self.redirect('/')
Na práticaModelando a entidade de Tagclass Tag(db.Model):    name = db.StringProperty()    @staticmethoddef new(name):        return Tag(key_name = name, name = name)deftoValueObject(self):        return self.name
Na práticaModelando a entidade de Bookmark (Favorito)class Bookmark(db.Model):url = db.StringProperty()    tags = db.ListProperty(db.Key)    date = db.DateTimeProperty(auto_now_add=True)    @staticmethoddef new(url, tags):        return Bookmark(url = url, tags = tags)deftoValueObject(self):tagsObjs = db.get(self.tags)        tags = [tagObj.toValueObject() for tagObj in tagsObjs]        return BookmarkValueObject(self.url, tags, self.date)
Na práticaCódigo de controle (inserção de tag)definsertTagIfNotExists(name):    tag = Tag.new(name)    return tag.put()
Na práticaCódigo de controle (inserção de favorito)definsertBookmark(url, tagsNames):tagsKeys = []    for name in tagsNames:tagsKeys.append(insertTagIfNotExists(name))    bookmark = Bookmark.new(url, tagsKeys)    return bookmark.put()
Na práticaFiltrando urls com uma certa tag (código de controle)defgetAllBookmarks():    bookmarks = Bookmark.all().order("-date").fetch(1000)    bookmarks = [bookmark.toValueObject() for bookmark in bookmarks]return bookmarks defgetBookmarksWithTag(name):tag = Tag.get_by_key_name(name)    bookmarks = Bookmark.all().filter("tags", tag).order("-date").fetch(1000)    bookmarks = [bookmark.toValueObject() for bookmark in bookmarks]return bookmarks
Na práticaFiltrando urls com uma certa tag (handler do GET)classMainPage(webapp.RequestHandler):   defget(self):filter = self.request.get('filter', None)ifnotfilter:            bookmarks = control.getAllBookmarks()else:            bookmarks = control.getBookmarksWithTag(filter)values = dict(                      bookmarks = bookmarks,filter= filter                      )self.response.out.write(template.render('index.html', values))
Na práticaFiltrando urls com uma certa tag (template/HTML){% for bookmark in bookmarks %}<p>  <a href="{{bookmark.url}}“target="_blank">      {{bookmark.url}}  </a>  ( tags:  {% for tag in bookmark.tags %}    <a href="/?filter={{tag}}">{{tag}},</a>  {% endfor %}  )</p>{% endfor %}
Na práticaAuto-complete de tags (código de controle)defgetAllTags():tags = Tag.all().fetch(1000)tags = [tag.toValueObject() for tag in tags]returntags
Na práticaAuto-complete de tags (handler do GET)tags = control.getAllTags()values = dict(bookmarks = bookmarks,tags= tags,filter= filter)
Na práticaAuto-complete de tags (template/HTML)<script>  $(document).ready(function(){    $("#mytags").tagit({availableTags: [{% for tag in tags %}                 '{{tag}}'                        {% ifnotforloop.last %}, {% endif %} {% endfor %}]    });  });</script>
Lições aprendidasEstudeVai usar uma nova tecnologia? Estude ela a fundo antes de começar a desenvolver pra valer! Leia os artigos e veja todas as palestras do Google I/O relacionadas ao Google AppEngine.code.google.com/intl/p/appengine/articles/www.google.com/events/io/2011/
Lições aprendidasNoSQLBDs não relacionais são um pesadelo no início. Mas é tudo questão de costume!
Lições aprendidasTop-downComece de cima para baixo. Ao contrário do que se pensa, é lá nos protótipos de tela que você melhor conseguirá definir suas entidades e relacionamentos.
Dúvidas?www.socialcats.com.br@flaviojuvenal

Desenvolvendo aplicativos web com o google app engine

  • 1.
    Desenvolvendo aplicativos Webcom o Google AppEnginepor Flávio Juvenal
  • 2.
    RoteiroIntroduçãoQuem Somos?Arquitetura CloudGoogleAppEngineO que é?Pilha de SoluçõesNa práticaLições aprendidas
  • 3.
    Quem Somos?Um websitee appsobre pessoas e eventosInformações sociais e Recomendações
  • 4.
  • 5.
  • 6.
    Quem Somos?7 alunosdoCentro de Informática - UFPESemi-finalistas do Prêmio Santander de EmpreendedorismoFinalistas Campuseiros Empreendem (categoria mobile)
  • 7.
  • 8.
    O que éo Google AppEngine?Cloudcomputing com o GooglePermite que você execute seus aplicativos da web na infra-estrutura do Google.Platform as a ServiceAbstrai configuração de software e hardware e oferece uma plataforma de desenvolvimento pronta para o uso!Webapp+ Python 2.5+ Datastore
  • 9.
    Pilha de SoluçõesWebappFrameworkweb do Google para desenvolver a camada de apresentação (MVC). Muito fácil de usar.Python 2.5A melhor linguagem de programação para você escrever facilmente o código de controle do seu aplicativo web.DatastoreO jeito Google de armazenar dados. Tudo são chaves e valores. BD não relacional com foco em escalabilidade.
  • 10.
    O que éo Google AppEngine?Trabalha na equipe do Google AppEngine!
  • 11.
    Na práticaComo fazerum ‘Hello World’?classMainPage(webapp.RequestHandler): defget(self):self.response.headers['Content-Type'] = 'text/plain'self.response.out.write('Hello World!')
  • 12.
    Na práticaVamos fazerum website similar ao deliciousdelicious = Favoritos + Tags
  • 13.
    Na práticaVamos fazerum website similar ao delicious
  • 14.
    Na práticaVamos fazerum website similar ao delicious
  • 15.
  • 16.
    Na práticaMostrando oHTML (handler do GET)classMainPage(webapp.RequestHandler): defget(self):self.response.out.write(template.render('index.html', {}))
  • 17.
    Na práticaMostrando oHTML (handler do GET)<form class="myform" action="/" method="post"> <input type="text" name="url"/> <input type="hidden" name="item[tags][]"/> <input title="Inserir" type="submit"/></form>
  • 18.
    Na práticaProcessando formulário(handler do POST)classMainPage(webapp.RequestHandler): def post(self):url = self.request.get('url')tags = self.request.get_all('item[tags][]')control.insertBookmark(url, tags)self.redirect('/')
  • 19.
    Na práticaModelando aentidade de Tagclass Tag(db.Model): name = db.StringProperty() @staticmethoddef new(name): return Tag(key_name = name, name = name)deftoValueObject(self): return self.name
  • 20.
    Na práticaModelando aentidade de Bookmark (Favorito)class Bookmark(db.Model):url = db.StringProperty() tags = db.ListProperty(db.Key) date = db.DateTimeProperty(auto_now_add=True) @staticmethoddef new(url, tags): return Bookmark(url = url, tags = tags)deftoValueObject(self):tagsObjs = db.get(self.tags) tags = [tagObj.toValueObject() for tagObj in tagsObjs] return BookmarkValueObject(self.url, tags, self.date)
  • 21.
    Na práticaCódigo decontrole (inserção de tag)definsertTagIfNotExists(name): tag = Tag.new(name) return tag.put()
  • 22.
    Na práticaCódigo decontrole (inserção de favorito)definsertBookmark(url, tagsNames):tagsKeys = [] for name in tagsNames:tagsKeys.append(insertTagIfNotExists(name)) bookmark = Bookmark.new(url, tagsKeys) return bookmark.put()
  • 23.
    Na práticaFiltrando urlscom uma certa tag (código de controle)defgetAllBookmarks(): bookmarks = Bookmark.all().order("-date").fetch(1000) bookmarks = [bookmark.toValueObject() for bookmark in bookmarks]return bookmarks defgetBookmarksWithTag(name):tag = Tag.get_by_key_name(name) bookmarks = Bookmark.all().filter("tags", tag).order("-date").fetch(1000) bookmarks = [bookmark.toValueObject() for bookmark in bookmarks]return bookmarks
  • 24.
    Na práticaFiltrando urlscom uma certa tag (handler do GET)classMainPage(webapp.RequestHandler): defget(self):filter = self.request.get('filter', None)ifnotfilter: bookmarks = control.getAllBookmarks()else: bookmarks = control.getBookmarksWithTag(filter)values = dict( bookmarks = bookmarks,filter= filter )self.response.out.write(template.render('index.html', values))
  • 25.
    Na práticaFiltrando urlscom uma certa tag (template/HTML){% for bookmark in bookmarks %}<p> <a href="{{bookmark.url}}“target="_blank"> {{bookmark.url}} </a> ( tags: {% for tag in bookmark.tags %} <a href="/?filter={{tag}}">{{tag}},</a> {% endfor %} )</p>{% endfor %}
  • 26.
    Na práticaAuto-complete detags (código de controle)defgetAllTags():tags = Tag.all().fetch(1000)tags = [tag.toValueObject() for tag in tags]returntags
  • 27.
    Na práticaAuto-complete detags (handler do GET)tags = control.getAllTags()values = dict(bookmarks = bookmarks,tags= tags,filter= filter)
  • 28.
    Na práticaAuto-complete detags (template/HTML)<script> $(document).ready(function(){ $("#mytags").tagit({availableTags: [{% for tag in tags %} '{{tag}}' {% ifnotforloop.last %}, {% endif %} {% endfor %}] }); });</script>
  • 29.
    Lições aprendidasEstudeVai usaruma nova tecnologia? Estude ela a fundo antes de começar a desenvolver pra valer! Leia os artigos e veja todas as palestras do Google I/O relacionadas ao Google AppEngine.code.google.com/intl/p/appengine/articles/www.google.com/events/io/2011/
  • 30.
    Lições aprendidasNoSQLBDs nãorelacionais são um pesadelo no início. Mas é tudo questão de costume!
  • 31.
    Lições aprendidasTop-downComece decima para baixo. Ao contrário do que se pensa, é lá nos protótipos de tela que você melhor conseguirá definir suas entidades e relacionamentos.
  • 32.