SlideShare uma empresa Scribd logo
1 de 84
Baixar para ler offline
desenvolvimento de aplicações para o
Google App Engine




               http://slideshare.net/chesterbr
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
Palestrante




                   @chesterbr
              http://chester.me
não-especialista




(ou seja: se esse mané pode, eu também posso!)
Como surgem os bons
  aplicativos web?
existem muitas lendas...
A mais popular
Dilema da Hospedagem
   Enquanto o site não fizer sucesso,
   vou ter que custear a hospedagem

Quando ele crescer e meu provedor não
aguentar, vou ter que mudar de provedor
         (e talvez de tecnologia)

        Quanto isso vai custar?
Dilema da Arquitetura

  Projetar uma arquitetura para escalar
 exige tempo e skills, que poderiam ser
    aplicados na aplicação em si (em
particular no início), mas deixar isso pra
 depois pode gerar um problema difícil
Google App Engine
Equilíbrio

Crie seu aplicativo web rapidamente e
a custo zero. Com alguns cuidados, ele
  vai se adaptar a volumes de tráfego
maiores e o custo de hospedagem será
     proporcional a este aumento.
Obstáculos

 O App Engine não é completamente
diferente de outras arquiteturas, mas é
     preciso aprender coisas novas

   Nossa proposta hoje é ver essas
       coisas novas na prática
Escolhendo a Linguagem
?
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...)
Java




X
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/
Go
Python
     Fácil de aprender, poderosa
   (dinâmica, funcional, interativa),
estimula a escrita de código legível e
 tem uma comunidade muito ativa*



                  *
Python
Hello, App Engine
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
SDK (Launcher) no Windows




         http://code.google.com/appengine/downloads.html
SDK (Launcher) no Mac




       http://code.google.com/appengine/downloads.html
Um app é uma pasta
Um app é uma pasta
app.yaml

  Descreve o seu aplicativo para os
servidores do Google (nome, versão,
linguagem), associando os endereços
  (ex.: “/”, “/noticias”) com o código
app.yaml
application: meusite
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
  script: meusite.py
meusite.py
print "Oi, Campus Party!"
Tá pronto, vamos rodar!
acrescentando no Launcher
diga onde ele está...
...e solta o play!
era só isso?
Era!




☺
Falando sério agora...
Criando via Launcher
Criando via Launcher
app.yaml
application: siteserio
version: 1
runtime: python
api_version: 1

Handlers:
- url: /favicon.ico
  static_files: favicon.ico
  upload: favicon.ico

- url: .*
  script: main.py
main.py “sério”
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util

class 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()
webapp

 É a biblioteca (framework) que mapeia
(através de um objeto WSGIApplication)
 cada caminho (ou grupo deles) para a
    classe RequestHandler apropriada
Exemplo: site de notícias
...

def main():
    application = webapp.WSGIApplication([
           ('/', HomeHandler),
           ('/noticias', ListaNoticiasHandler),
           ('/noticia/(w+)', NoticiaHandler),
           ...
        ], debug=True)
    util.run_wsgi_app(application)

...
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)
...
Template (noticia.html)
<html>
  <body>
    <h1>{{titulo}}</h1>
    <h2>{{autor.nickname}}</h2>
    {{texto}}
  </body>
</html>
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):
          ...

...
Alternativas
O webapp é minimalista, mas se isso
 não agradar, o App Engine suporta
   outros frameworks populares




            http://www.franciscosouza.com.br/tag/frameworks/
Armazenando Dados
Jeito clássico (relacional)
Bancos Relacionais

Tê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...
Bancos Relacionais

  ...é difícil paralelizar sem afetar o
aplicativo e/ou abrir mão de algumas
dessas vantagens, o que tem levado à
      busca de novas alternativas
App Engine Datastore
Baseada no Bigtable, que é

“Um mapa ordenado esparso, distribuído,
persistente e multidimensional. O mapa é
  indexado por chave de linha, chave de
coluna e data/hora; cada valor no mapa é
   um array não-interpretado de bytes”


             http://research.google.com/archive/bigtable-osdi06.pdf
Na prática

Vamos usar uma estrutura mais simples,
 na qual o aplicativo vai cuidar de mais
coisas (ex.: consistência de dados), mas
  o sistema poderá escalar facilmente
     usando a estrutura do Google
Boa notícia

O App Engine reduz esse trabalho com
classes que encapsulam o Datastore na
 forma de “entidades” e permitem até
    consultar em estilo SQL (GQL)

     (só tome cuidado com as diferenças)
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()
...
Cadastrando (put)
...
      noticia = Noticia(
                    id = 123,
                    titulo = 'SOPA foi pro vinagre!',
                    texto = 'bla bla bla bla',
                    editoria = 'politica')
      noticia.put()
...
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
...
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
...
Índices

  Todas as consultas são baseadas em
 índices definidos no index.yaml (mas
criados automaticamente à medida que
  você testa o site no servidor local)

     (sim, vale dar uma espiada no arquivo)
Restrições

Como 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)
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)
Memcache

Alguns dados são muito mais acessados
que outros (working set), e o AppEngine
 disponbiliza o Memcache para manter
         esses dados em RAM
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)
Colocando no ar
appengine.google.com
Cadastrando o aplicativo
oh, oh...
cadastre com outro nome...
...e altere no app.yaml
application: appdojoselito
version: 1
runtime: python
api_version: 1

Handlers:
- url: /favicon.ico
  static_files: favicon.ico
  upload: favicon.ico

- url: .*
  script: main.py
Launcher
login do Google
ele trabalha, e...
Conclusão
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/
Dúvidas?
Obrigado!

                      @chesterbr
                 http://chester.me
   http://slideshare.net/chesterbr
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 e
projetos referenciados (inclusos sob premissa de “fair use”) e ilustrações
   de uso supostamente livre cuja autoria foi mencionada sempre que
possí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

Mais conteúdo relacionado

Mais procurados

Otimizacao de aplicações Zend Framework
Otimizacao de aplicações Zend FrameworkOtimizacao de aplicações Zend Framework
Otimizacao de aplicações Zend FrameworkElton Minetto
 
Dicas para Interfaces Performáticas no seu App Android
Dicas para Interfaces Performáticas no seu App AndroidDicas para Interfaces Performáticas no seu App Android
Dicas para Interfaces Performáticas no seu App AndroidUbiratan Soares
 
Desenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app engineDesenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app enginepugpe
 
Otimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxOtimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxElton Minetto
 
Automação de Testes com SoapUI v1
Automação de Testes com SoapUI v1Automação de Testes com SoapUI v1
Automação de Testes com SoapUI v1mateuscaletti
 

Mais procurados (6)

Otimizacao de aplicações Zend Framework
Otimizacao de aplicações Zend FrameworkOtimizacao de aplicações Zend Framework
Otimizacao de aplicações Zend Framework
 
Dicas para Interfaces Performáticas no seu App Android
Dicas para Interfaces Performáticas no seu App AndroidDicas para Interfaces Performáticas no seu App Android
Dicas para Interfaces Performáticas no seu App Android
 
Desenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app engineDesenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app engine
 
Otimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxOtimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - Tchelinux
 
Automação de Testes com SoapUI v1
Automação de Testes com SoapUI v1Automação de Testes com SoapUI v1
Automação de Testes com SoapUI v1
 
Java script aula 07 - j-query
Java script   aula 07 - j-queryJava script   aula 07 - j-query
Java script aula 07 - j-query
 

Destaque

SEO e Social - Unindo o sentimento das pessoas ao search engine
SEO e Social - Unindo o sentimento das pessoas ao search engineSEO e Social - Unindo o sentimento das pessoas ao search engine
SEO e Social - Unindo o sentimento das pessoas ao search engineFabio Ricotta
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineCampus Party Brasil
 
É Hora de criar sua própria engine de jogos?
É Hora de criar sua própria engine de jogos?É Hora de criar sua própria engine de jogos?
É Hora de criar sua própria engine de jogos?José Farias
 
Tk03 Google App Engine Fr
Tk03 Google App Engine FrTk03 Google App Engine Fr
Tk03 Google App Engine FrValtech
 
Oficina Python e Google App Engine
Oficina Python e Google App EngineOficina Python e Google App Engine
Oficina Python e Google App EngineRodrigo Amaral
 
Palestra "Teste de Invasão com o Nmap Scripting Engine"" FISL 13
Palestra "Teste de Invasão com o Nmap Scripting Engine"" FISL 13 Palestra "Teste de Invasão com o Nmap Scripting Engine"" FISL 13
Palestra "Teste de Invasão com o Nmap Scripting Engine"" FISL 13 Clavis Segurança da Informação
 
DNUG2015 Frühjahrskonferenz: Brücken bauen, Grenzen überwinden: Domino im Dia...
DNUG2015 Frühjahrskonferenz: Brücken bauen, Grenzen überwinden: Domino im Dia...DNUG2015 Frühjahrskonferenz: Brücken bauen, Grenzen überwinden: Domino im Dia...
DNUG2015 Frühjahrskonferenz: Brücken bauen, Grenzen überwinden: Domino im Dia...JRibbeck
 
Nuxeo WebEngine : Etude de cas
Nuxeo WebEngine : Etude de casNuxeo WebEngine : Etude de cas
Nuxeo WebEngine : Etude de casDamien Metzler
 
An introduction to Google's App Engine
An introduction to Google's App EngineAn introduction to Google's App Engine
An introduction to Google's App EngineStefan Sperber
 
b2performance berth
b2performance berthb2performance berth
b2performance berthITB Berlin
 
Google Cloud Platform. Google App Engine
Google Cloud Platform. Google App Engine Google Cloud Platform. Google App Engine
Google Cloud Platform. Google App Engine Kwaye Kant
 
Search Engine Friendly Design (SEFD) - SMX München 2014
Search Engine Friendly Design (SEFD) - SMX München 2014Search Engine Friendly Design (SEFD) - SMX München 2014
Search Engine Friendly Design (SEFD) - SMX München 2014Daniel Herndler
 
Google App Engine. Zwei Jahre im Produktiveinsatz
Google App Engine. Zwei Jahre im ProduktiveinsatzGoogle App Engine. Zwei Jahre im Produktiveinsatz
Google App Engine. Zwei Jahre im ProduktiveinsatzPer Fragemann
 
Google App Engine For Java
Google App Engine For JavaGoogle App Engine For Java
Google App Engine For Javatcouery
 
FACT-Finder Webinar Recommendation Engine 2.0
FACT-Finder Webinar Recommendation Engine 2.0FACT-Finder Webinar Recommendation Engine 2.0
FACT-Finder Webinar Recommendation Engine 2.0Omikron Data Quality GmbH
 
WordPress State of the Word 2012
WordPress State of the Word 2012WordPress State of the Word 2012
WordPress State of the Word 2012photomatt
 
Introduction à Google App Engine - WAQ 2011
Introduction à Google App Engine - WAQ 2011Introduction à Google App Engine - WAQ 2011
Introduction à Google App Engine - WAQ 2011jimmybourassa
 

Destaque (20)

SEO e Social - Unindo o sentimento das pessoas ao search engine
SEO e Social - Unindo o sentimento das pessoas ao search engineSEO e Social - Unindo o sentimento das pessoas ao search engine
SEO e Social - Unindo o sentimento das pessoas ao search engine
 
Zk Framework
Zk FrameworkZk Framework
Zk Framework
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
É Hora de criar sua própria engine de jogos?
É Hora de criar sua própria engine de jogos?É Hora de criar sua própria engine de jogos?
É Hora de criar sua própria engine de jogos?
 
Tk03 Google App Engine Fr
Tk03 Google App Engine FrTk03 Google App Engine Fr
Tk03 Google App Engine Fr
 
Oficina Python e Google App Engine
Oficina Python e Google App EngineOficina Python e Google App Engine
Oficina Python e Google App Engine
 
Palestra "Teste de Invasão com o Nmap Scripting Engine"" FISL 13
Palestra "Teste de Invasão com o Nmap Scripting Engine"" FISL 13 Palestra "Teste de Invasão com o Nmap Scripting Engine"" FISL 13
Palestra "Teste de Invasão com o Nmap Scripting Engine"" FISL 13
 
DNUG2015 Frühjahrskonferenz: Brücken bauen, Grenzen überwinden: Domino im Dia...
DNUG2015 Frühjahrskonferenz: Brücken bauen, Grenzen überwinden: Domino im Dia...DNUG2015 Frühjahrskonferenz: Brücken bauen, Grenzen überwinden: Domino im Dia...
DNUG2015 Frühjahrskonferenz: Brücken bauen, Grenzen überwinden: Domino im Dia...
 
Google App Engine - INTRO
Google App Engine - INTROGoogle App Engine - INTRO
Google App Engine - INTRO
 
Nuxeo WebEngine : Etude de cas
Nuxeo WebEngine : Etude de casNuxeo WebEngine : Etude de cas
Nuxeo WebEngine : Etude de cas
 
An introduction to Google's App Engine
An introduction to Google's App EngineAn introduction to Google's App Engine
An introduction to Google's App Engine
 
b2performance berth
b2performance berthb2performance berth
b2performance berth
 
Google Cloud Platform. Google App Engine
Google Cloud Platform. Google App Engine Google Cloud Platform. Google App Engine
Google Cloud Platform. Google App Engine
 
Search Engine Friendly Design (SEFD) - SMX München 2014
Search Engine Friendly Design (SEFD) - SMX München 2014Search Engine Friendly Design (SEFD) - SMX München 2014
Search Engine Friendly Design (SEFD) - SMX München 2014
 
Google App Engine. Zwei Jahre im Produktiveinsatz
Google App Engine. Zwei Jahre im ProduktiveinsatzGoogle App Engine. Zwei Jahre im Produktiveinsatz
Google App Engine. Zwei Jahre im Produktiveinsatz
 
Google App Engine For Java
Google App Engine For JavaGoogle App Engine For Java
Google App Engine For Java
 
FACT-Finder Webinar Recommendation Engine 2.0
FACT-Finder Webinar Recommendation Engine 2.0FACT-Finder Webinar Recommendation Engine 2.0
FACT-Finder Webinar Recommendation Engine 2.0
 
WordPress State of the Word 2012
WordPress State of the Word 2012WordPress State of the Word 2012
WordPress State of the Word 2012
 
Google App Engine
Google App EngineGoogle App Engine
Google App Engine
 
Introduction à Google App Engine - WAQ 2011
Introduction à Google App Engine - WAQ 2011Introduction à Google App Engine - WAQ 2011
Introduction à Google App Engine - WAQ 2011
 

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

Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSMatheus Donizete
 
TDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoTDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoCezinha Anjos
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5Erisvaldo Junior
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.jsGiovanni Bassi
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com AngularElmano Cavalcanti
 
Django Apps - Do Núcleo a Otimização
Django Apps - Do Núcleo a OtimizaçãoDjango Apps - Do Núcleo a Otimização
Django Apps - Do Núcleo a OtimizaçãoLeandro Zanuz
 
Mongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopMongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopDiego Sana
 

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

Palestra
PalestraPalestra
Palestra
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JS
 
TDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoTDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direito
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.js
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 
Java e Cloud Computing
Java e Cloud ComputingJava e Cloud Computing
Java e Cloud Computing
 
Google apps script - Parte 2
Google apps script - Parte 2Google apps script - Parte 2
Google apps script - Parte 2
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com Angular
 
Mashups: Criando Valor na Web 2.0 (BandTec)
Mashups: Criando Valor na Web 2.0 (BandTec)Mashups: Criando Valor na Web 2.0 (BandTec)
Mashups: Criando Valor na Web 2.0 (BandTec)
 
Django Módulo Básico Parte II
Django Módulo Básico Parte IIDjango Módulo Básico Parte II
Django Módulo Básico Parte II
 
Django Apps - Do Núcleo a Otimização
Django Apps - Do Núcleo a OtimizaçãoDjango Apps - Do Núcleo a Otimização
Django Apps - Do Núcleo a Otimização
 
Android na Prática
Android na PráticaAndroid na Prática
Android na Prática
 
Kotlin first
Kotlin firstKotlin first
Kotlin first
 
Java Seminar
Java SeminarJava Seminar
Java Seminar
 
Mongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopMongo Db - PHP Day Workshop
Mongo Db - PHP Day Workshop
 

Mais de Carlos Duarte do Nascimento

Mais de Carlos Duarte do Nascimento (10)

git fail --force (make it up with your pull requests)
git fail --force (make it up with your pull requests)git fail --force (make it up with your pull requests)
git fail --force (make it up with your pull requests)
 
git fail --force (faça as pazes com seus pull requests)
git fail --force (faça as pazes com seus pull requests)git fail --force (faça as pazes com seus pull requests)
git fail --force (faça as pazes com seus pull requests)
 
ruby2600 - an Atari 2600 emulator written in Ruby
ruby2600 - an Atari 2600 emulator written in Rubyruby2600 - an Atari 2600 emulator written in Ruby
ruby2600 - an Atari 2600 emulator written in Ruby
 
Atari 2600 VCS Programming
Atari 2600 VCS ProgrammingAtari 2600 VCS Programming
Atari 2600 VCS Programming
 
Programação para Atari 2600
Programação para Atari 2600Programação para Atari 2600
Programação para Atari 2600
 
Aplicativos Mobile: Da Idéia ao Produto (ou não)
Aplicativos Mobile: Da Idéia ao Produto (ou não)Aplicativos Mobile: Da Idéia ao Produto (ou não)
Aplicativos Mobile: Da Idéia ao Produto (ou não)
 
Apontador API (para programadores Python)
Apontador API (para programadores Python)Apontador API (para programadores Python)
Apontador API (para programadores Python)
 
Mashups: Criando Valor na Web 2.0
Mashups: Criando Valor na Web 2.0Mashups: Criando Valor na Web 2.0
Mashups: Criando Valor na Web 2.0
 
Cruzalinhas - Palestra Relâmpago no Fisl 11
Cruzalinhas - Palestra Relâmpago no Fisl 11Cruzalinhas - Palestra Relâmpago no Fisl 11
Cruzalinhas - Palestra Relâmpago no Fisl 11
 
SlideMeme - Habilitando o SlideShare dentro do Yahoo! Meme - Yahoo! Open Hack...
SlideMeme - Habilitando o SlideShare dentro do Yahoo! Meme - Yahoo! Open Hack...SlideMeme - Habilitando o SlideShare dentro do Yahoo! Meme - Yahoo! Open Hack...
SlideMeme - Habilitando o SlideShare dentro do Yahoo! Meme - Yahoo! Open Hack...
 

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

  • 1. desenvolvimento de aplicações para o Google 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?
  • 8. Dilema da Hospedagem Enquanto o site não fizer sucesso, vou ter que custear a hospedagem Quando ele crescer e meu provedor não aguentar, 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 (em particular no início), mas deixar isso pra depois pode gerar um problema difícil
  • 11. Equilíbrio Crie seu aplicativo web rapidamente e a custo zero. Com alguns cuidados, ele vai se adaptar a volumes de tráfego maiores e o custo de hospedagem será proporcional a este aumento.
  • 12. Obstáculos O App Engine não é completamente diferente de outras arquiteturas, mas é preciso aprender coisas novas Nossa proposta hoje é ver essas coisas novas na prática
  • 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...)
  • 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* *
  • 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.
  • 26. Um app é uma pasta
  • 27. Um app é uma pasta
  • 28. app.yaml Descreve o seu aplicativo para os servidores do Google (nome, versão, linguagem), associando os endereços (ex.: “/”, “/noticias”) com o código
  • 29. app.yaml application: meusite version: 1 runtime: python api_version: 1 handlers: - url: /.* script: meusite.py
  • 30.
  • 32.
  • 35. diga onde ele está...
  • 36. ...e solta o play!
  • 42.
  • 43.
  • 44. app.yaml application: siteserio version: 1 runtime: python api_version: 1 Handlers: - url: /favicon.ico static_files: favicon.ico upload: favicon.ico - url: .* script: main.py
  • 45. main.py “sério” from google.appengine.ext import webapp from google.appengine.ext.webapp import util class 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()
  • 46. webapp É a biblioteca (framework) que mapeia (através de um objeto WSGIApplication) cada caminho (ou grupo deles) para a classe RequestHandler apropriada
  • 47. Exemplo: site de notícias ... def main(): application = webapp.WSGIApplication([ ('/', HomeHandler), ('/noticias', ListaNoticiasHandler), ('/noticia/(w+)', NoticiaHandler), ... ], debug=True) util.run_wsgi_app(application) ...
  • 48. 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) ...
  • 49. Template (noticia.html) <html> <body> <h1>{{titulo}}</h1> <h2>{{autor.nickname}}</h2> {{texto}} </body> </html>
  • 50. 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): ... ...
  • 51. Alternativas O webapp é minimalista, mas se isso não agradar, o App Engine suporta outros frameworks populares http://www.franciscosouza.com.br/tag/frameworks/
  • 54. Bancos Relacionais Tê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...
  • 55. Bancos Relacionais ...é difícil paralelizar sem afetar o aplicativo e/ou abrir mão de algumas dessas vantagens, o que tem levado à busca de novas alternativas
  • 57. Baseada no Bigtable, que é “Um mapa ordenado esparso, distribuído, persistente e multidimensional. O mapa é indexado por chave de linha, chave de coluna e data/hora; cada valor no mapa é um array não-interpretado de bytes” http://research.google.com/archive/bigtable-osdi06.pdf
  • 58. Na prática Vamos usar uma estrutura mais simples, na qual o aplicativo vai cuidar de mais coisas (ex.: consistência de dados), mas o sistema poderá escalar facilmente usando a estrutura do Google
  • 59. Boa notícia O App Engine reduz esse trabalho com classes que encapsulam o Datastore na forma de “entidades” e permitem até consultar em estilo SQL (GQL) (só tome cuidado com as diferenças)
  • 60. 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() ...
  • 61. Cadastrando (put) ... noticia = Noticia( id = 123, titulo = 'SOPA foi pro vinagre!', texto = 'bla bla bla bla', editoria = 'politica') noticia.put() ...
  • 62. 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 ...
  • 63. 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 ...
  • 64. Índices Todas as consultas são baseadas em índices definidos no index.yaml (mas criados automaticamente à medida que você testa o site no servidor local) (sim, vale dar uma espiada no arquivo)
  • 65. Restrições Como 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)
  • 66. 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)
  • 67. Memcache Alguns dados são muito mais acessados que outros (working set), e o AppEngine disponbiliza o Memcache para manter esses dados em RAM
  • 68. 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)
  • 70.
  • 75. ...e altere no app.yaml application: appdojoselito version: 1 runtime: python api_version: 1 Handlers: - url: /favicon.ico static_files: favicon.ico upload: favicon.ico - url: .* script: main.py
  • 79.
  • 80.
  • 82. 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/
  • 83. Dúvidas? Obrigado! @chesterbr http://chester.me http://slideshare.net/chesterbr
  • 84. 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 e projetos referenciados (inclusos sob premissa de “fair use”) e ilustrações de uso supostamente livre cuja autoria foi mencionada sempre que possí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