Um aplicativo web on-line tem muitas vantagens e desvantagens – \u00e9 claro – Eu recomendo mesmo assim o desenvolvimento de aplicativos web.<\/p>\n
Todavia, h\u00e1 uma desvantagem que \u00e9 capaz de cortar o f\u00f4lego: a queda da internet. A internet tem uma caracter\u00edstica not\u00e1vel firmemente alicer\u00e7ada na Lei geral de Murphy que quando voc\u00ea n\u00e3o precisa dela, seus filhos a utilizam na boa, mas quando voc\u00ea precisa dela, ela n\u00e3o funciona ou o faz a ritmo de tartaruga ajudando bicho pregui\u00e7a.<\/p>\n
Uma das solu\u00e7\u00f5es pode ser desenvolver um Chrome App<\/a>. Uma das vantagens \u00e9 que toda a interface do usu\u00e1rio j\u00e1 est\u00e1 carregada do lado do cliente. Outra \u00e9 que voc\u00ea pode armazenar dados localmente com \u00a0o que o uso da sua magra largura de banda (sempre \u00e9) \u00e9 melhor utilizada.<\/p>\n Obviamente que isso nos leva a outro conjunto de desvantagens e vantagens que podem ser motivo de um outro artigo mas que – com certeza – n\u00e3o \u00e9 o foco deste. Baste apenas dizer que quase tudo o que voc\u00ea (bem) aprendeu de programa\u00e7\u00e3o web on-line \u00e9 aplic\u00e1vel a um aplicativo Chrome App assim como o \u00e9 para aplicativos de dispositivos m\u00f3veis usando Cordova, por exemplo.<\/p>\n O prop\u00f3sito deste artigo \u00e9 apenas mostrar como usar YeAPF para construir um Chrome App consultando um servi\u00e7o RESTful na web. Dividiremos este exercicio em duas grandes partes: 1) Criar o aplicativo 2) Mostrar os dados puxados da Web. Um outro artigo demonstrar\u00e1 como manter esses dados no banco de dados local. Por enquanto \u00e9 suficiente dizer que tudo o que vc j\u00e1 faz com ycomm.invoke()<\/em> se aplica ao ifc.plead()<\/em>. Invoke, Crave e Plead s\u00e3o as interfaces desenvolvidas na s\u00e9rie 0.8.x. Nosso projeto \u00e9 atingirmos uma interface \u00fanica de consulta de dados na serie 0.9.x com o que o programador apenas indicar\u00e1 se a url de requisi\u00e7\u00e3o e o m\u00e9todo utilizado (XMLHttpRequest, RESTful) e o YeAPF se encarregar\u00e1 do resto.<\/p>\n O banco de dados para os testes \u00e9 p\u00fablico e bem conhecido. Voc\u00ea pode fazer sua pr\u00f3pria copia assim:<\/p>\n Se seu aplicativo \u00e9 distribuido pela loja da Google, este passo n\u00e3o \u00e9 necess\u00e1rio. Mas se estiver desenvolvendo ou quer aprender como funciona, \u00e9 essencial.<\/p>\n Crie uma pasta (n\u00e3o precisa estar sob seu www) e despeje l\u00e1 o conte\u00fado da distribui\u00e7\u00e3o<\/a>.<\/p>\n O arquivo mais importante \u00e9 manifest.json<\/em>. \u00c9 nele que indicamos ao Chrome se se trata de um aplicativo, uma extens\u00e3o, os direitos que precisamos para rodar, etc. Dos valores que ali h\u00e1 dois requerem especial aten\u00e7\u00e3o: o permissions<\/strong><\/em> e o sandbox<\/em><\/strong>. No permissions<\/strong><\/em> especificamos que iremos usar as habilidades de armazenar dados do Chrome e no sanbox<\/strong><\/em>, lhe indicaremos que algumas p\u00e1ginas (no nosso caso apenas uma) dever\u00e1 rodar com certos privilegios (mas sem contato com o mundo exterior)<\/p>\n O segundo arquivo importante \u00e9 o ifc.html<\/em> que faz parte da distribui\u00e7\u00e3o do YeAPF na serie 0.8.x Simplificando quilos de documenta\u00e7\u00e3o<\/a> fica assim: a sua p\u00e1gina principal (sua tela) vai conseguir enxergar o mundo exterior (leia-se RESTful) utilizando a p\u00e1gina que est\u00e1 no sandbox e a sua sandbox n\u00e3o tem contato com o usu\u00e1rio.<\/p>\n O terceiro arquivo importante \u00e9 o background.js<\/em>. Estamos seguindo aqui a nomenclatura utilizada no site do Chrome App para que quando a leia (se \u00e9 que voc\u00ea tem tempo para isso) n\u00e3o fique fazendo tradu\u00e7\u00f5es na sua cabe\u00e7a; mas pode chamar este arquivo de qualquer nome que lhe pare\u00e7a correto. Observe neste arquivo duas coisas: a exist\u00eancia de uma vari\u00e1vel global chamada ySandboxFrame<\/strong> e a fun\u00e7\u00e3o de callback que preenche esta vari\u00e1vel com a janela que est\u00e1 sendo criada.<\/p>\n Se for sua primeira vez, abra chrome:\/\/flags<\/a> e procure por \u201cExperimental Extension APIs<\/em>\u201d. Verifique que esteja habilitada.<\/p>\n Uma vez feito isso, abra chrome:\/\/extensions\/<\/a><\/p>\n Confirme que o modo desenvolvedor esteja habilitado<\/p>\n Clique no bot\u00e3o \u201cLoad Unpacked extension<\/em>\u201d<\/p>\n Procure sua pasta (aquela na que voc\u00ea despejou o zip) e clique em \u201cOpen<\/em>\u201d H\u00e1 duas formas de rodar o aplicativo: Clicando em “launch<\/em>” no chrome:\/\/extensions ou ca\u00e7ando ele no men\u00fa iniciar do seu computador.<\/p>\n A estas alturas j\u00e1 deve estar feliz que nem cachorro com dois rabos e se nunca viu uma ChromeApp na vida e \u00e9 programador Desktop, deve de estar dando pulos de alegria.<\/p>\n Mas, por enquanto \u00e9 apenas uma telinha branca sem muita informa\u00e7\u00e3o, ent\u00e3o pare de dar chilique e volte para sua mesa e tente ficar quieto. Seus vizinhos e parentes v\u00e3o achar que voc\u00ea est\u00e1 louco e n\u00e3o est\u00e3o muito longe da verdade.<\/p>\n Como esses dados chegaram \u00e0 sua tela? Eles foram puxados on-line via RESTful. Especificamente a chamada que \u00e9 feita \u00e9 a seguinte:<\/p>\n Isso \u00e9 definido no departaments.js<\/em> assim:<\/p>\n Qual a gra\u00e7a disso tudo? Trazer apenas os dados do servidor.<\/p>\n Qual a dor de cabe\u00e7a? As mesmas de um aplicativo Desktop: toda vez que voc\u00ea atualiza o fonte, tem que atualizar seus clientes.<\/p>\n Qual a solu\u00e7\u00e3o? Voc\u00ea passar a distribuir seus aplicativos pelo Web Store da Google<\/p>\n Tem custo? N\u00e3o<\/p>\n Por que voc\u00ea n\u00e3o est\u00e1 fazendo isto ainda? N\u00e3o fa\u00e7o ideia. Culpa minha que n\u00e3o \u00e9.<\/p>\n <\/p>\n","protected":false},"excerpt":{"rendered":" Um aplicativo web on-line tem muitas vantagens e desvantagens – \u00e9 claro – Eu recomendo mesmo assim o desenvolvimento de aplicativos web. Todavia, h\u00e1 uma desvantagem que \u00e9 capaz de cortar o f\u00f4lego: a queda da internet. A internet tem uma caracter\u00edstica not\u00e1vel firmemente alicer\u00e7ada na Lei geral de Murphy que quando voc\u00ea n\u00e3o precisa […]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false},"categories":[49,8],"tags":[],"jetpack_featured_media_url":"","jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5O6UV-4y","jetpack-related-posts":[{"id":455,"url":"http:\/\/www.yeapf.com\/wp\/?p=455","url_meta":{"origin":282,"position":0},"title":"Como instalar YeAPF?","date":"agosto 3, 2018","format":false,"excerpt":"Voc\u00ea n\u00e3o precisa instalar YeAPF. O que sim \u00e9 bom ter instalado s\u00e3o as ferramentas dele. Mas antes disso, \u00e9 bom deixar claro como funciona ele sem instalar. A todos os efeitos, vamos supor que voc\u00ea fez download da \u00faltima vers\u00e3o do YeAPF e o colocou na pasta ~\/Downloads\/YeAPF\/ e\u2026","rel":"","context":"Em "Yet Another PHP Framework"","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":167,"url":"http:\/\/www.yeapf.com\/wp\/?p=167","url_meta":{"origin":282,"position":1},"title":"Sem medo de servir","date":"outubro 7, 2014","format":false,"excerpt":"Muitas vezes me encontro ante a tarefa de ajudar outras pessoas a desenvolver a tarefa de desenvolver e vejo que as mesmas dificuldades se repetem de TI a TI. Me explico: Alguns programadores (desenvolvedores) chegam a um ponto da vida em que n\u00e3o mais conseguem desenvolver (levar adiante) o trabalho\u2026","rel":"","context":"Em "Opini\u00e3o"","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":181,"url":"http:\/\/www.yeapf.com\/wp\/?p=181","url_meta":{"origin":282,"position":2},"title":"Como utilizar um mesmo c\u00f3digo em Desktop, Mobile e Web","date":"dezembro 26, 2014","format":false,"excerpt":"O Nirvana do programador O nirvana de todo programador \u00e9 quase com certeza ter um \u00fanico c\u00f3digo para ser utilizado em quantas plataformas seja poss\u00edvel. Isso tem muita vantagens, entre elas n\u00e3o limitar o campo de escolha do cliente e se preocupar uma \u00fanica vez com o c\u00f3digo. Para eliminar\u2026","rel":"","context":"Em "Desenvolvimento"","img":{"alt_text":"","src":"https:\/\/i2.wp.com\/www.yeapf.com\/wp\/wp-content\/uploads\/2019\/05\/work-731198_1920.jpg?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":91,"url":"http:\/\/www.yeapf.com\/wp\/?p=91","url_meta":{"origin":282,"position":3},"title":"Aplicativos mono p\u00e1gina","date":"mar\u00e7o 14, 2014","format":false,"excerpt":"Aplicativos que usam s\u00f3 uma p\u00e1gina t\u00eam um lugar assegurado no desenvolvimento de software atual e futuro. Bem feitos s\u00e3o elegantes e f\u00e1ceis de manter. Tamb\u00e9m s\u00e3o uma m\u00e3o na roda na hora de fazer um aplicativo que funcione tanto em desktop como em mobile. Para construirmos um aplicativo com\u2026","rel":"","context":"Em "Desenvolvimento"","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":318,"url":"http:\/\/www.yeapf.com\/wp\/?p=318","url_meta":{"origin":282,"position":4},"title":"Usando btSync para sincronizar e desenvolver em equipe.","date":"novembro 28, 2016","format":false,"excerpt":"Um dos grandes desafios do desenvolvimento grupal \u00e9 manter o c\u00f3digo sincronizado. Concordo, claro, com aqueles que utilizam as ferramentas git\u00a0para poder criar uma vers\u00e3o tempor\u00e1ria (e pessoal) do c\u00f3digo e depois se enganchar de novo com a \u00e1rvore principal. \u00c9 obvio que\u00a0git \u00e9 bem melhor que\u00a0svn por exemplo. Muit\u00edssimo\u2026","rel":"","context":"Em "Desenvolvimento"","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":216,"url":"http:\/\/www.yeapf.com\/wp\/?p=216","url_meta":{"origin":282,"position":5},"title":"POO ao extremo","date":"janeiro 1, 2015","format":false,"excerpt":"A melhor das piadas Para mim a melhor piada de programadores \u00e9 aquela de \"Como os programadores ca\u00e7am elefantes\" Todavia, me pareceu bem contribuir com esta pequena coloca\u00e7\u00e3o sobre como a POO pode ser levada a um extremo (o que poder\u00edamos chamar de POOX ou XOOP por suas siglas em\u2026","rel":"","context":"Em "Desenvolvimento"","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/282"}],"collection":[{"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=282"}],"version-history":[{"count":3,"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/282\/revisions"}],"predecessor-version":[{"id":285,"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/282\/revisions\/285"}],"wp:attachment":[{"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=282"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=282"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=282"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}cd ~\/dev\r\ngit clone https:\/\/github.com\/datacharmer\/test_db.git<\/pre>\n
Criando o aplicativo<\/h2>\n
Instalando o aplicativo<\/h2>\n
\nSe tudo ocorreu bem, seu app estar\u00e1 na lista de extens\u00f5es (mesmo sendo um Chrome App) e no seu menu iniciar (Imagino que em Windows seja a mesma coisa, estou fazendo isto com Ubuntu)<\/p>\nRodando o aplicativo<\/h2>\n
A fonte de dados<\/h2>\n
http:\/\/www.inovacaosistemas.com.br\/employees\/rest.php?s=emp&a=getDepartamentList&callback=minhaFuncao<\/a><\/pre>\n
ifc.setConnParams(\"http:\/\/www.inovacaosistemas.com.br\/employees\/\");<\/pre>\n