Desenvolvimento de Aplicações para o Google App Engine (CPBR5)

  • 1,876 views
Uploaded on

[Video: http://www.youtube.com/watch?feature=player_detailpage&v=nzo9dcCMi-4#t=1169s ] Palestra que introduz o desenvolvimento de aplicativos na plataforma do Google de forma pragmática, apresentada …

[Video: http://www.youtube.com/watch?feature=player_detailpage&v=nzo9dcCMi-4#t=1169s ] Palestra que introduz o desenvolvimento de aplicativos na plataforma do Google de forma pragmática, apresentada na 5a. edição (2012) do Campus Party (#cpbr5)

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,876
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
48
Comments
0
Likes
3

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. desenvolvimento de aplicações para oGoogle App Engine http://slideshare.net/chesterbr
  • 2. Proposta Apresentar de forma simples,prática e ao alcance de todos uma alternativa para a criação de aplicativos na web escaláveis. http://slideshare.net/chesterbr
  • 3. Palestrante @chesterbr http://chester.me
  • 4. não-especialista(ou seja: se esse mané pode, eu também posso!)
  • 5. Como surgem os bons aplicativos web?
  • 6. existem muitas lendas...
  • 7. A mais popular
  • 8. Dilema da Hospedagem Enquanto o site não fizer sucesso, vou ter que custear a hospedagemQuando ele crescer e meu provedor nãoaguentar, vou ter que mudar de provedor (e talvez de tecnologia) Quanto isso vai custar?
  • 9. Dilema da Arquitetura Projetar uma arquitetura para escalar exige tempo e skills, que poderiam ser aplicados na aplicação em si (emparticular no início), mas deixar isso pra depois pode gerar um problema difícil
  • 10. Google App Engine
  • 11. EquilíbrioCrie seu aplicativo web rapidamente ea custo zero. Com alguns cuidados, ele vai se adaptar a volumes de tráfegomaiores e o custo de hospedagem será proporcional a este aumento.
  • 12. Obstáculos O App Engine não é completamentediferente de outras arquiteturas, mas é preciso aprender coisas novas Nossa proposta hoje é ver essas coisas novas na prática
  • 13. Escolhendo a Linguagem
  • 14. ?
  • 15. JavaÉ uma opção para quem já conhece ela (ou C#), mas muita coisa vai ter que ser feita do “jeito App Engine”(e não é lá muito popular hoje em dia...)
  • 16. JavaX
  • 17. Go Criada pelo próprio Google, é boa em tarefas que exigem muita CPU (écompilada e com tipos estáticos), mas o suporte ainda é experimental* e você vai ter pouca companhia * eles mesmos alertam: http://code.google.com/appengine/docs/
  • 18. Go
  • 19. Python Fácil de aprender, poderosa (dinâmica, funcional, interativa),estimula a escrita de código legível e tem uma comunidade muito ativa* *
  • 20. Python
  • 21. Hello, App Engine
  • 22. Ingredientes● Google App Engine SDK para Python● Seu editor de textos favorito● Internet (para colocar no ar) (opcional: Eclipse + plugin do App Engine) http://code.google.com/appengine/downloads.html
  • 23. SDK (Launcher) no Windows http://code.google.com/appengine/downloads.html
  • 24. SDK (Launcher) no Mac http://code.google.com/appengine/downloads.html
  • 25. Um app é uma pasta
  • 26. Um app é uma pasta
  • 27. app.yaml Descreve o seu aplicativo para osservidores do Google (nome, versão,linguagem), associando os endereços (ex.: “/”, “/noticias”) com o código
  • 28. app.yamlapplication: meusiteversion: 1runtime: pythonapi_version: 1handlers:- url: /.* script: meusite.py
  • 29. meusite.pyprint "Oi, Campus Party!"
  • 30. Tá pronto, vamos rodar!
  • 31. acrescentando no Launcher
  • 32. diga onde ele está...
  • 33. ...e solta o play!
  • 34. era só isso?
  • 35. Era!☺
  • 36. Falando sério agora...
  • 37. Criando via Launcher
  • 38. Criando via Launcher
  • 39. app.yamlapplication: siteserioversion: 1runtime: pythonapi_version: 1Handlers:- url: /favicon.ico static_files: favicon.ico upload: favicon.ico- url: .* script: main.py
  • 40. main.py “sério”from google.appengine.ext import webappfrom google.appengine.ext.webapp import utilclass MainHandler(webapp.RequestHandler): def get(self): self.response.out.write(Hello world!)def main(): application = webapp.WSGIApplication( [(/, MainHandler)], debug=True) util.run_wsgi_app(application)if __name__ == __main__: main()
  • 41. webapp É a biblioteca (framework) que mapeia(através de um objeto WSGIApplication) cada caminho (ou grupo deles) para a classe RequestHandler apropriada
  • 42. Exemplo: site de notícias...def main(): application = webapp.WSGIApplication([ (/, HomeHandler), (/noticias, ListaNoticiasHandler), (/noticia/(w+), NoticiaHandler), ... ], debug=True) util.run_wsgi_app(application)...
  • 43. Recuperando a notícia...class NoticiaHandler(webapp.RequestHandler): def get(self, id_not): # id_not contém o item entre # parênteses em /noticia/(w+) # ex.: /noticia/123 => id_not=123 noticia = dao.busca_noticia(id_not) # montando o html com os dados: html = template.render(/noticia.html, noticia) self.response.out.write(noticia)...
  • 44. Template (noticia.html)<html> <body> <h1>{{titulo}}</h1> <h2>{{autor.nickname}}</h2> {{texto}} </body></html>
  • 45. Parâmetros e REST...class AlgumHandler(webapp.RequestHandler): def get(self): # parâmetros de formulário (GET, POST): p = self.request.get(nome_parametro) # Outros verbos HTTP (i.e., REST): def post(self): ... def delete(self): ......
  • 46. AlternativasO webapp é minimalista, mas se isso não agradar, o App Engine suporta outros frameworks populares http://www.franciscosouza.com.br/tag/frameworks/
  • 47. Armazenando Dados
  • 48. Jeito clássico (relacional)
  • 49. Bancos RelacionaisTêm implementações maduras, facilitam operações robustas (ACID), mapeiam (mais-ou-menos) com classes/objetos, performam bem em servidor único e (quase) todo mundo sabe usar SQL mas...
  • 50. Bancos Relacionais ...é difícil paralelizar sem afetar oaplicativo e/ou abrir mão de algumasdessas vantagens, o que tem levado à busca de novas alternativas
  • 51. App Engine Datastore
  • 52. Baseada no Bigtable, que é“Um mapa ordenado esparso, distribuído,persistente e multidimensional. O mapa é indexado por chave de linha, chave decoluna e data/hora; cada valor no mapa é um array não-interpretado de bytes” http://research.google.com/archive/bigtable-osdi06.pdf
  • 53. Na práticaVamos usar uma estrutura mais simples, na qual o aplicativo vai cuidar de maiscoisas (ex.: consistência de dados), mas o sistema poderá escalar facilmente usando a estrutura do Google
  • 54. Boa notíciaO App Engine reduz esse trabalho comclasses que encapsulam o Datastore na forma de “entidades” e permitem até consultar em estilo SQL (GQL) (só tome cuidado com as diferenças)
  • 55. Exemplo...class Noticia(db.Model): id = db.IntegerProperty(required=True) titulo = db.StringProperty(required=True) texto = db.StringProperty(required=True) editoria = db.StringProperty(required=True, choices=set([politica, esportes, informatica])) data_criacao = db.DateTimeProperty( auto_now=True) data_publicacao = db.DateTimeProperty() autor = db.UserProperty() avaliacao = db.IntegerProperty() acessos = db.IntegerProperty()...
  • 56. Cadastrando (put)... noticia = Noticia( id = 123, titulo = SOPA foi pro vinagre!, texto = bla bla bla bla, editoria = politica) noticia.put()...
  • 57. Consulta (query)... # Montando a query q = Noticia.all() q.filter("editoria =", "esportes") q.order("-data_publicacao") # Executando a query noticias = q.fetch(10) for noticia in noticias: print noticia.titulo...
  • 58. Consulta (query) com GQL... # Montando a query q = db.GqlQuery("SELECT * FROM Noticia " + "WHERE editoria = :1" + "ORDER BY data_publicacao DESC", "esportes") # Executando a query (não mudou nada!) noticias = q.fetch(10) for noticia in noticias: print noticia.titulo...
  • 59. Índices Todas as consultas são baseadas em índices definidos no index.yaml (mascriados automaticamente à medida que você testa o site no servidor local) (sim, vale dar uma espiada no arquivo)
  • 60. RestriçõesComo as buscas usam índices, existem algumas restrições. Por exemplo,desigualdades (<, <=, >=, >, !=) só podem afetar um campo por consulta. http://bit.ly/y3xtkk (Documentação: Restrições)
  • 61. Restrições... # Query válida q = Noticia.all() q.filter("avaliacao >=", 3) q.filter("avaliacao <=", 8)... # Query INVÁLIDA q = Noticia.all() q.filter("avaliacao >=", 5) q.filter("acessos >=", 12)... http://bit.ly/y3xtkk (Documentação: Restrições)
  • 62. MemcacheAlguns dados são muito mais acessadosque outros (working set), e o AppEngine disponbiliza o Memcache para manter esses dados em RAM
  • 63. Memcache ... def busca_noticia(self, id): cache = memcache.Client() noticia = cache.get(id) if noticia is None: result = Noticia.all().filter("id =", int(id)).fetch(1) if result: noticia = result[0] cache.add(id, noticia) return noticia ...(não esqueça do cache.delete() se os dados mudarem)
  • 64. Colocando no ar
  • 65. appengine.google.com
  • 66. Cadastrando o aplicativo
  • 67. oh, oh...
  • 68. cadastre com outro nome...
  • 69. ...e altere no app.yamlapplication: appdojoselitoversion: 1runtime: pythonapi_version: 1Handlers:- url: /favicon.ico static_files: favicon.ico upload: favicon.ico- url: .* script: main.py
  • 70. Launcher
  • 71. login do Google
  • 72. ele trabalha, e...
  • 73. Conclusão
  • 74. O poder é de vocês! É preciso estudar e experimentar, mas o App Engine está ao alcance de todos. Basta começar!http://code.google.com/intl/pt-BR/appengine/docs/
  • 75. Dúvidas?Obrigado! @chesterbr http://chester.me http://slideshare.net/chesterbr
  • 76. Créditos e Licenciamento Esta apresentação está disponível para uso e reuso sob os termos da licença Creative Commons “by-nc” 3.0, observadas as exceções abaixo Fotos e ilustrações são em sua maioria logomarcas dos produtos eprojetos referenciados (inclusos sob premissa de “fair use”) e ilustrações de uso supostamente livre cuja autoria foi mencionada sempre quepossível (correções são bem-vindas). Tais elementos são de propriedade de seus autores, e não estão cobertos pela licença acima, não havendo qualquer relação deles com o autor