SlideShare une entreprise Scribd logo
1  sur  32
Télécharger pour lire hors ligne
Desenvolvendo aplicativos Web com o Google AppEngine por Flávio Juvenal
Roteiro Introdução Quem Somos? Arquitetura Cloud Google AppEngine O que é? Pilha de Soluções Na prática Lições aprendidas
Quem Somos? Um website e appsobre pessoas e eventos Informações sociais e Recomendações
Quem Somos?
Quem Somos?
Quem Somos? 7 alunos doCentro de Informática - UFPE Semi-finalistas do Prêmio Santander de Empreendedorismo Finalistas Campuseiros Empreendem (categoria mobile)
Arquitetura Cloud
O que é o Google AppEngine? Cloudcomputing com o Google Permite que você execute seus aplicativos da web na infra-estrutura do Google. Platform as a Service Abstrai configuração de software e hardware e oferece uma plataforma de desenvolvimento pronta para o uso! Webapp+ Python 2.5+ Datastore
Pilha de Soluções Webapp Framework web do Google para desenvolver a camada de apresentação (MVC). Muito fácil de usar. Python 2.5 A melhor linguagem de programação para você escrever facilmente o código de controle do seu aplicativo web. Datastore O 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ática Como fazer um ‘Hello World’? classMainPage(webapp.RequestHandler):   defget(self): self.response.headers['Content-Type'] = 'text/plain' self.response.out.write('Hello World!')
Na prática Vamos fazer um website similar ao delicious delicious = Favoritos + Tags
Na prática Vamos fazer um website similar ao delicious
Na prática Vamos fazer um website similar ao delicious
Na prática No ar! http://tagyoururl.appspot.com
Na prática Mostrando o HTML (handler do GET) classMainPage(webapp.RequestHandler):    defget(self): self.response.out.write(template.render('index.html', {}))
Na prática Mostrando 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ática Processando 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ática Modelando a entidade de Tag class Tag(db.Model):     name = db.StringProperty()     @staticmethod def new(name):         return Tag(key_name = name, name = name) deftoValueObject(self):         return self.name
Na prática Modelando a entidade de Bookmark (Favorito) class Bookmark(db.Model): url = db.StringProperty()     tags = db.ListProperty(db.Key)     date = db.DateTimeProperty(auto_now_add=True)     @staticmethod def 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ática Código de controle (inserção de tag) definsertTagIfNotExists(name):     tag = Tag.new(name)     return tag.put()
Na prática Có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ática Filtrando 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ática Filtrando 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ática Filtrando 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ática Auto-complete de tags (código de controle) defgetAllTags(): tags = Tag.all().fetch(1000) tags = [tag.toValueObject() for tag in tags] returntags
Na prática Auto-complete de tags (handler do GET) tags = control.getAllTags() values = dict( bookmarks = bookmarks, tags= tags, filter= filter )
Na prática Auto-complete de tags (template/HTML) <script>   $(document).ready(function(){     $("#mytags").tagit({ availableTags: [ {% for tag in tags %}                  '{{tag}}'                        {% ifnotforloop.last %}, {% endif %}  {% endfor %} ]     });   }); </script>
Lições aprendidas Estude Vai 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 aprendidas NoSQL BDs não relacionais são um pesadelo no início. Mas é tudo questão de costume!
Lições aprendidas Top-down Comece 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

Contenu connexe

Tendances

Técnicas de Refactoring
Técnicas de RefactoringTécnicas de Refactoring
Técnicas de RefactoringRodrigo Branas
 
Cucumber Best Practices
Cucumber Best PracticesCucumber Best Practices
Cucumber Best PracticesKaroline Leite
 
11 Java Script - Exemplos com eventos
11 Java Script - Exemplos com eventos11 Java Script - Exemplos com eventos
11 Java Script - Exemplos com eventosCentro Paula Souza
 
Prototype Framework Javascript
Prototype Framework JavascriptPrototype Framework Javascript
Prototype Framework JavascriptMarcio Romu
 
Introdução à MEAN Stack
Introdução à MEAN StackIntrodução à MEAN Stack
Introdução à MEAN StackBruno Catão
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Carlos Duarte do Nascimento
 

Tendances (10)

Python 07
Python 07Python 07
Python 07
 
Técnicas de Refactoring
Técnicas de RefactoringTécnicas de Refactoring
Técnicas de Refactoring
 
Cucumber Best Practices
Cucumber Best PracticesCucumber Best Practices
Cucumber Best Practices
 
Java script aula 05 - funções
Java script   aula 05 - funçõesJava script   aula 05 - funções
Java script aula 05 - funções
 
11 Java Script - Exemplos com eventos
11 Java Script - Exemplos com eventos11 Java Script - Exemplos com eventos
11 Java Script - Exemplos com eventos
 
Prototype Framework Javascript
Prototype Framework JavascriptPrototype Framework Javascript
Prototype Framework Javascript
 
Java script aula 02 - operadores
Java script   aula 02 - operadoresJava script   aula 02 - operadores
Java script aula 02 - operadores
 
Introdução à MEAN Stack
Introdução à MEAN StackIntrodução à MEAN Stack
Introdução à MEAN Stack
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
Java script aula 07 - eventos
Java script   aula 07 - eventosJava script   aula 07 - eventos
Java script aula 07 - eventos
 

En vedette

Qml + Python
Qml + PythonQml + Python
Qml + Pythonpugpe
 
Python na formacao_de_jovens
Python na formacao_de_jovensPython na formacao_de_jovens
Python na formacao_de_jovensMarcos Egito
 
Coding Dojo e Test Driven Development
Coding Dojo e Test Driven DevelopmentCoding Dojo e Test Driven Development
Coding Dojo e Test Driven Developmentpugpe
 
Rain Toolbox - Previsão de Chuvas
Rain Toolbox -  Previsão de ChuvasRain Toolbox -  Previsão de Chuvas
Rain Toolbox - Previsão de Chuvaspugpe
 
Criando comunidades bem sucedidas
Criando comunidades bem sucedidasCriando comunidades bem sucedidas
Criando comunidades bem sucedidaspugpe
 
Python Debugger - PUG-PE
Python Debugger - PUG-PE Python Debugger - PUG-PE
Python Debugger - PUG-PE Arthur Alvim
 
Porque foi bom aprender com Python
Porque foi bom aprender com PythonPorque foi bom aprender com Python
Porque foi bom aprender com PythonFernando Rocha
 
Python e Cadeias de Markov GHMM
Python e Cadeias de Markov GHMMPython e Cadeias de Markov GHMM
Python e Cadeias de Markov GHMMpugpe
 
NoSQL com Cassandra e Python
NoSQL com Cassandra e PythonNoSQL com Cassandra e Python
NoSQL com Cassandra e Pythonpugpe
 
Computação Científica com Python
Computação Científica com PythonComputação Científica com Python
Computação Científica com PythonHugo Serrano
 
Palestra sobre Inteligência Coletiva
Palestra sobre Inteligência ColetivaPalestra sobre Inteligência Coletiva
Palestra sobre Inteligência Coletivapugpe
 
Pyjamas: Uma Ferramenta Pythônica para Web
Pyjamas: Uma Ferramenta Pythônica para WebPyjamas: Uma Ferramenta Pythônica para Web
Pyjamas: Uma Ferramenta Pythônica para WebNielson Santana
 
Palestra sobre Collections com Python
Palestra sobre Collections com PythonPalestra sobre Collections com Python
Palestra sobre Collections com Pythonpugpe
 
Migrando do App Engine para o Heroku
Migrando do App Engine para o HerokuMigrando do App Engine para o Heroku
Migrando do App Engine para o HerokuFilipe Ximenes
 
Apresentando o I Toró de Palestras do PUG-PE
Apresentando o I Toró de Palestras do PUG-PEApresentando o I Toró de Palestras do PUG-PE
Apresentando o I Toró de Palestras do PUG-PEMarcel Caraciolo
 
Blender Com Python
Blender Com PythonBlender Com Python
Blender Com Pythonpugpe
 

En vedette (20)

Qml + Python
Qml + PythonQml + Python
Qml + Python
 
Python na formacao_de_jovens
Python na formacao_de_jovensPython na formacao_de_jovens
Python na formacao_de_jovens
 
Coding Dojo e Test Driven Development
Coding Dojo e Test Driven DevelopmentCoding Dojo e Test Driven Development
Coding Dojo e Test Driven Development
 
Rain Toolbox - Previsão de Chuvas
Rain Toolbox -  Previsão de ChuvasRain Toolbox -  Previsão de Chuvas
Rain Toolbox - Previsão de Chuvas
 
Criando comunidades bem sucedidas
Criando comunidades bem sucedidasCriando comunidades bem sucedidas
Criando comunidades bem sucedidas
 
Pep 8
Pep 8Pep 8
Pep 8
 
Python Debugger - PUG-PE
Python Debugger - PUG-PE Python Debugger - PUG-PE
Python Debugger - PUG-PE
 
REST APIs com Django
REST APIs com DjangoREST APIs com Django
REST APIs com Django
 
Porque foi bom aprender com Python
Porque foi bom aprender com PythonPorque foi bom aprender com Python
Porque foi bom aprender com Python
 
Pug
PugPug
Pug
 
Python e Cadeias de Markov GHMM
Python e Cadeias de Markov GHMMPython e Cadeias de Markov GHMM
Python e Cadeias de Markov GHMM
 
NoSQL com Cassandra e Python
NoSQL com Cassandra e PythonNoSQL com Cassandra e Python
NoSQL com Cassandra e Python
 
Computação Científica com Python
Computação Científica com PythonComputação Científica com Python
Computação Científica com Python
 
Palestra sobre Inteligência Coletiva
Palestra sobre Inteligência ColetivaPalestra sobre Inteligência Coletiva
Palestra sobre Inteligência Coletiva
 
Pyjamas: Uma Ferramenta Pythônica para Web
Pyjamas: Uma Ferramenta Pythônica para WebPyjamas: Uma Ferramenta Pythônica para Web
Pyjamas: Uma Ferramenta Pythônica para Web
 
Arduino e python
Arduino e pythonArduino e python
Arduino e python
 
Palestra sobre Collections com Python
Palestra sobre Collections com PythonPalestra sobre Collections com Python
Palestra sobre Collections com Python
 
Migrando do App Engine para o Heroku
Migrando do App Engine para o HerokuMigrando do App Engine para o Heroku
Migrando do App Engine para o Heroku
 
Apresentando o I Toró de Palestras do PUG-PE
Apresentando o I Toró de Palestras do PUG-PEApresentando o I Toró de Palestras do PUG-PE
Apresentando o I Toró de Palestras do PUG-PE
 
Blender Com Python
Blender Com PythonBlender Com Python
Blender Com Python
 

Similaire à Desenvolvendo aplicativos Web com Google AppEngine

Desenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpDesenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpRodrigo Aramburu
 
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
 
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
 
Python e Django
Python e DjangoPython e Django
Python e Djangopugpe
 
Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosDjango: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosRodrigo Nossal
 
LPII_Aula_7-JQuery.pdf
LPII_Aula_7-JQuery.pdfLPII_Aula_7-JQuery.pdf
LPII_Aula_7-JQuery.pdfGabrielaMota46
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoFreedom DayMS
 
ASP.NET MVC Mini Curso
ASP.NET MVC Mini CursoASP.NET MVC Mini Curso
ASP.NET MVC Mini CursoVinicius Rocha
 
Mini curso de django
Mini curso de djangoMini curso de django
Mini curso de djangorosenclever
 
Novidades do Django 1.2 e o que vem por ai
Novidades do Django 1.2 e o que vem por aiNovidades do Django 1.2 e o que vem por ai
Novidades do Django 1.2 e o que vem por aiMarcos Petry
 
Django - Criando Aplicacoes Plugaveis
Django - Criando Aplicacoes PlugaveisDjango - Criando Aplicacoes Plugaveis
Django - Criando Aplicacoes PlugaveisMarinho Brandão
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Desenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPDesenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPMarcelo Andrade
 
Introdução ao framework CakePHP
Introdução ao framework CakePHPIntrodução ao framework CakePHP
Introdução ao framework CakePHPigorpimentel
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkMarcelo Rodrigo
 

Similaire à Desenvolvendo aplicativos Web com Google AppEngine (20)

Desenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpDesenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephp
 
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
 
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
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 
Python e Django
Python e DjangoPython e Django
Python e Django
 
Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosDjango: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutos
 
LPII_Aula_7-JQuery.pdf
LPII_Aula_7-JQuery.pdfLPII_Aula_7-JQuery.pdf
LPII_Aula_7-JQuery.pdf
 
Wicket 2008
Wicket 2008Wicket 2008
Wicket 2008
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com Django
 
ASP.NET MVC Mini Curso
ASP.NET MVC Mini CursoASP.NET MVC Mini Curso
ASP.NET MVC Mini Curso
 
Mini curso de django
Mini curso de djangoMini curso de django
Mini curso de django
 
Novidades do Django 1.2 e o que vem por ai
Novidades do Django 1.2 e o que vem por aiNovidades do Django 1.2 e o que vem por ai
Novidades do Django 1.2 e o que vem por ai
 
Groovy grails
Groovy grailsGroovy grails
Groovy grails
 
Django - Criando Aplicacoes Plugaveis
Django - Criando Aplicacoes PlugaveisDjango - Criando Aplicacoes Plugaveis
Django - Criando Aplicacoes Plugaveis
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Desenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPDesenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHP
 
Google apps script - Parte 2
Google apps script - Parte 2Google apps script - Parte 2
Google apps script - Parte 2
 
Introdução ao framework CakePHP
Introdução ao framework CakePHPIntrodução ao framework CakePHP
Introdução ao framework CakePHP
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
 
Google apps script - Parte - 1
Google apps script - Parte - 1Google apps script - Parte - 1
Google apps script - Parte - 1
 

Plus de pugpe

Projeto Amadeus
Projeto AmadeusProjeto Amadeus
Projeto Amadeuspugpe
 
E o que danado é o PUG-PE?
E o que danado é o PUG-PE?E o que danado é o PUG-PE?
E o que danado é o PUG-PE?pugpe
 
Intro
IntroIntro
Intropugpe
 
Construindo uma startup em 54 horas com Python
Construindo uma startup em 54 horas com PythonConstruindo uma startup em 54 horas com Python
Construindo uma startup em 54 horas com Pythonpugpe
 
Automatizando tarefas com Python
Automatizando tarefas com PythonAutomatizando tarefas com Python
Automatizando tarefas com Pythonpugpe
 
Visualização da Informação
Visualização da InformaçãoVisualização da Informação
Visualização da Informaçãopugpe
 
Wikilytics
WikilyticsWikilytics
Wikilyticspugpe
 
Pip - Instalando Pacotes facilmente para Python
Pip - Instalando Pacotes facilmente para PythonPip - Instalando Pacotes facilmente para Python
Pip - Instalando Pacotes facilmente para Pythonpugpe
 
Pug pe vii - luciano rodrigues - debugger
Pug pe vii - luciano rodrigues - debuggerPug pe vii - luciano rodrigues - debugger
Pug pe vii - luciano rodrigues - debuggerpugpe
 
Pug pe viii - luciano rodrigues - debugger
Pug pe viii - luciano rodrigues - debuggerPug pe viii - luciano rodrigues - debugger
Pug pe viii - luciano rodrigues - debuggerpugpe
 
Python e Dispositivos Móveis
Python e Dispositivos MóveisPython e Dispositivos Móveis
Python e Dispositivos Móveispugpe
 
Redes Neurais e Python
Redes Neurais e PythonRedes Neurais e Python
Redes Neurais e Pythonpugpe
 
CATS: Sistema de Recomendação de Eventos
CATS: Sistema de Recomendação de EventosCATS: Sistema de Recomendação de Eventos
CATS: Sistema de Recomendação de Eventospugpe
 
Python Funcional
Python FuncionalPython Funcional
Python Funcionalpugpe
 
Open Allure
Open AllureOpen Allure
Open Allurepugpe
 
Iron Python
Iron PythonIron Python
Iron Pythonpugpe
 

Plus de pugpe (16)

Projeto Amadeus
Projeto AmadeusProjeto Amadeus
Projeto Amadeus
 
E o que danado é o PUG-PE?
E o que danado é o PUG-PE?E o que danado é o PUG-PE?
E o que danado é o PUG-PE?
 
Intro
IntroIntro
Intro
 
Construindo uma startup em 54 horas com Python
Construindo uma startup em 54 horas com PythonConstruindo uma startup em 54 horas com Python
Construindo uma startup em 54 horas com Python
 
Automatizando tarefas com Python
Automatizando tarefas com PythonAutomatizando tarefas com Python
Automatizando tarefas com Python
 
Visualização da Informação
Visualização da InformaçãoVisualização da Informação
Visualização da Informação
 
Wikilytics
WikilyticsWikilytics
Wikilytics
 
Pip - Instalando Pacotes facilmente para Python
Pip - Instalando Pacotes facilmente para PythonPip - Instalando Pacotes facilmente para Python
Pip - Instalando Pacotes facilmente para Python
 
Pug pe vii - luciano rodrigues - debugger
Pug pe vii - luciano rodrigues - debuggerPug pe vii - luciano rodrigues - debugger
Pug pe vii - luciano rodrigues - debugger
 
Pug pe viii - luciano rodrigues - debugger
Pug pe viii - luciano rodrigues - debuggerPug pe viii - luciano rodrigues - debugger
Pug pe viii - luciano rodrigues - debugger
 
Python e Dispositivos Móveis
Python e Dispositivos MóveisPython e Dispositivos Móveis
Python e Dispositivos Móveis
 
Redes Neurais e Python
Redes Neurais e PythonRedes Neurais e Python
Redes Neurais e Python
 
CATS: Sistema de Recomendação de Eventos
CATS: Sistema de Recomendação de EventosCATS: Sistema de Recomendação de Eventos
CATS: Sistema de Recomendação de Eventos
 
Python Funcional
Python FuncionalPython Funcional
Python Funcional
 
Open Allure
Open AllureOpen Allure
Open Allure
 
Iron Python
Iron PythonIron Python
Iron Python
 

Desenvolvendo aplicativos Web com Google AppEngine

  • 1. Desenvolvendo aplicativos Web com o Google AppEngine por Flávio Juvenal
  • 2. Roteiro Introdução Quem Somos? Arquitetura Cloud Google AppEngine O que é? Pilha de Soluções Na prática Lições aprendidas
  • 3. Quem Somos? Um website e appsobre pessoas e eventos Informações sociais e Recomendações
  • 6. Quem Somos? 7 alunos doCentro de Informática - UFPE Semi-finalistas do Prêmio Santander de Empreendedorismo Finalistas Campuseiros Empreendem (categoria mobile)
  • 8. O que é o Google AppEngine? Cloudcomputing com o Google Permite que você execute seus aplicativos da web na infra-estrutura do Google. Platform as a Service Abstrai 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ções Webapp Framework web do Google para desenvolver a camada de apresentação (MVC). Muito fácil de usar. Python 2.5 A melhor linguagem de programação para você escrever facilmente o código de controle do seu aplicativo web. Datastore O 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ática Como fazer um ‘Hello World’? classMainPage(webapp.RequestHandler): defget(self): self.response.headers['Content-Type'] = 'text/plain' self.response.out.write('Hello World!')
  • 12. Na prática Vamos fazer um website similar ao delicious delicious = Favoritos + Tags
  • 13. Na prática Vamos fazer um website similar ao delicious
  • 14. Na prática Vamos fazer um website similar ao delicious
  • 15. Na prática No ar! http://tagyoururl.appspot.com
  • 16. Na prática Mostrando o HTML (handler do GET) classMainPage(webapp.RequestHandler): defget(self): self.response.out.write(template.render('index.html', {}))
  • 17. Na prática Mostrando 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>
  • 18. Na prática Processando 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ática Modelando a entidade de Tag class Tag(db.Model): name = db.StringProperty() @staticmethod def new(name): return Tag(key_name = name, name = name) deftoValueObject(self): return self.name
  • 20. Na prática Modelando a entidade de Bookmark (Favorito) class Bookmark(db.Model): url = db.StringProperty() tags = db.ListProperty(db.Key) date = db.DateTimeProperty(auto_now_add=True) @staticmethod def 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ática Código de controle (inserção de tag) definsertTagIfNotExists(name): tag = Tag.new(name) return tag.put()
  • 22. Na prática Có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()
  • 23. Na prática Filtrando 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
  • 24. Na prática Filtrando 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))
  • 25. Na prática Filtrando 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 %}
  • 26. Na prática Auto-complete de tags (código de controle) defgetAllTags(): tags = Tag.all().fetch(1000) tags = [tag.toValueObject() for tag in tags] returntags
  • 27. Na prática Auto-complete de tags (handler do GET) tags = control.getAllTags() values = dict( bookmarks = bookmarks, tags= tags, filter= filter )
  • 28. Na prática Auto-complete de tags (template/HTML) <script> $(document).ready(function(){ $("#mytags").tagit({ availableTags: [ {% for tag in tags %} '{{tag}}' {% ifnotforloop.last %}, {% endif %} {% endfor %} ] }); }); </script>
  • 29. Lições aprendidas Estude Vai 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/
  • 30. Lições aprendidas NoSQL BDs não relacionais são um pesadelo no início. Mas é tudo questão de costume!
  • 31. Lições aprendidas Top-down Comece 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.