<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-6914598597686640327</atom:id><lastBuildDate>Fri, 01 Nov 2024 10:35:34 +0000</lastBuildDate><category>programação</category><category>celulares</category><category>aprendizado</category><category>dicas</category><category>tendências celulares</category><category>android</category><category>JAVA</category><category>video-aula</category><category>javascript</category><category>motorola</category><category>eclipse</category><category>estudo</category><category>ferramentas</category><category>mercado</category><category>java me</category><category>futuro</category><category>java se</category><category>nokia</category><category>tutoriais</category><category>IDE</category><category>cesar</category><category>engenharia software</category><category>experiência</category><category>pesquisa</category><category>software</category><category>API</category><category>POO</category><category>bada</category><category>código</category><category>debug</category><category>debugging</category><category>dinheiro</category><category>html 5</category><category>jedi</category><category>motivação</category><category>open source</category><category>produtividade</category><category>relato</category><category>software livre</category><category>Douglas Frari</category><category>UIQ</category><category>apresentação</category><category>c++</category><category>carcast</category><category>devtools</category><category>emulador</category><category>iOS</category><category>internacionalização</category><category>mtj</category><category>pesquisa quantitativa</category><category>podcast</category><category>posts</category><category>série</category><category>templates</category><category>GET</category><category>HTML</category><category>Internationalization</category><category>JVM</category><category>Java lambda programação</category><category>LA</category><category>Professor</category><category>SET</category><category>SaaS</category><category>algoritmos</category><category>animação</category><category>aniversário</category><category>anos</category><category>banco dados</category><category>baterias</category><category>blog</category><category>browser</category><category>cafeteira</category><category>canvas</category><category>chrome</category><category>cloud</category><category>code</category><category>compilador</category><category>configuração</category><category>criatividade</category><category>css</category><category>debate</category><category>defesa mestrado</category><category>desafios</category><category>desenvolvedores</category><category>development</category><category>efeitos sonoros</category><category>encapsulamento</category><category>ensino</category><category>estágio</category><category>evento</category><category>example</category><category>facebook</category><category>ferramenta</category><category>finep</category><category>firefox</category><category>git</category><category>github</category><category>guia</category><category>herança</category><category>hibernate</category><category>iniciantes</category><category>interpretador</category><category>java ee</category><category>jogo</category><category>landscape</category><category>liderança</category><category>linguagem</category><category>lições aprendidas</category><category>localization</category><category>localização</category><category>mysql</category><category>método</category><category>netbeans</category><category>node.js</category><category>oportunidades</category><category>orientação objetos</category><category>palestra</category><category>parse</category><category>persistência dados</category><category>pesquisa qualitativa</category><category>polimorfismo</category><category>portrait</category><category>powerpoint</category><category>pragmático</category><category>programing</category><category>projetos</category><category>práticas</category><category>prêmio</category><category>rcp</category><category>rede social</category><category>samsung</category><category>scratch</category><category>serviço</category><category>site</category><category>sons</category><category>startup</category><category>storyboard</category><category>swing</category><category>tela</category><category>tendências orientação</category><category>titan</category><category>vitória</category><category>web 2</category><category>xib</category><category>youtube</category><category>áudio</category><title>Prof. Douglas Frari - mobile programming</title><description>coisas de programador</description><link>http://profdouglas.blogspot.com/</link><managingEditor>noreply@blogger.com (Anonymous)</managingEditor><generator>Blogger</generator><openSearch:totalResults>101</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-3784853171131367181</guid><pubDate>Mon, 19 Sep 2016 13:03:00 +0000</pubDate><atom:updated>2016-09-19T10:03:29.563-03:00</atom:updated><title>PvP path no Dark Souls 3 (o caminho do Player vs Player)</title><description>&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;270&quot; src=&quot;https://www.youtube.com/embed/-sXamv23Q_c&quot; width=&quot;480&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
Tribute to game Dark Souls 3 showing the way that the Players will pass over the PvP fights.&lt;br /&gt;
&lt;br /&gt;
Homenagem do jogo Dark Souls 3 mostrando o caminho do jogador tem no PvP.*</description><link>http://profdouglas.blogspot.com/2016/09/pvp-path-no-dark-souls-3-o-caminho-do.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/-sXamv23Q_c/default.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-7804011887276433474</guid><pubDate>Mon, 07 Sep 2015 18:08:00 +0000</pubDate><atom:updated>2015-09-07T15:08:44.295-03:00</atom:updated><title>#2.(1/2) - Como baixar o projeto da vídeo-aula usando o GIT</title><description>&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;344&quot; src=&quot;https://www.youtube.com/embed/QFUWA2MLPBk&quot; width=&quot;459&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
Criei um tutorial disponível no meu outro blog (medium) como as explicações detalhadas:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;

&lt;script async src=&quot;https://static.medium.com/embed.js&quot;&gt;&lt;/script&gt;&lt;a class=&quot;m-story&quot; data-collapsed=&quot;true&quot; href=&quot;https://medium.com/@douglasddf/tutorial-como-baixar-o-projeto-da-v%C3%ADdeo-aula-usando-o-git-15c459612260&quot;&gt;Tutorial: como baixar o projeto da vídeo-aula usando o GIT&lt;/a&gt;</description><link>http://profdouglas.blogspot.com/2015/09/212-como-baixar-o-projeto-da-video-aula.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/QFUWA2MLPBk/default.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-3281672076696881992</guid><pubDate>Sun, 30 Aug 2015 22:50:00 +0000</pubDate><atom:updated>2015-08-30T19:51:44.031-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">criatividade</category><category domain="http://www.blogger.com/atom/ns#">youtube</category><title>Nova série no Youtube</title><description>&quot;Criei uma nova série no meu canal do Youtube: Tutorial Rápido — como fazer. A ideia é produzir vídeos com simplicidade e melhor qualidade. Para isso, vou testar um novo formato, que ainda estou avaliando, mas que me parece interessante para quem assiste e para quem produz. Vou comentar um pouco sobre essa ideia e minha experiência de produtor de conteúdo para Youtube.&quot;&lt;br /&gt;
&lt;br /&gt;
&lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;https://www.youtube.com/embed/videoseries?list=PLWW0LwR0Sm2gW_OM3T44MbgHR7ixQc61M&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O texto na íntegra pode ser lido na página que vai carregar abaixo.&lt;br /&gt;
&lt;br /&gt;
&lt;script async src=&quot;https://static.medium.com/embed.js&quot;&gt;&lt;/script&gt;&lt;a class=&quot;m-story&quot; data-collapsed=&quot;true&quot; href=&quot;https://medium.com/@douglasddf/nova-s%C3%A9rie-no-youtube-fac05c7fbb82&quot;&gt;Nova série no Youtube&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Caso não carregue, o link pode ser acessado aqui:&lt;br /&gt;
https://medium.com/@douglasddf/nova-s%C3%A9rie-no-youtube-fac05c7fbb82</description><link>http://profdouglas.blogspot.com/2015/08/nova-serie-no-youtube.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/videoseries/default.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-9122653972965213090</guid><pubDate>Thu, 27 Aug 2015 22:45:00 +0000</pubDate><atom:updated>2015-08-28T10:56:08.835-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">internacionalização</category><category domain="http://www.blogger.com/atom/ns#">iOS</category><title>projeto iOS: Language Localization</title><description>&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;i&gt;Aplicativos estão cada vez mais aptos a serem utilizados globalmente. No entanto, para alcançar esse mercado, os envolvidos na produção do software precisam se atentar à necessidade de &lt;/i&gt;&lt;b&gt;&lt;i&gt;internacionalizar &lt;/i&gt;&lt;/b&gt;&lt;i&gt;os textos que aparecerão na interface. A proposta deste tutorial é demonstrar uma solução que tenho adotado em projetos iOS.&lt;/i&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;
Você poderá ler o artigo completo acessando o link abaixo. &lt;br /&gt;
&lt;br /&gt;
&lt;script async src=&quot;https://static.medium.com/embed.js&quot;&gt;&lt;/script&gt;&lt;a class=&quot;m-story&quot; data-collapsed=&quot;true&quot; href=&quot;https://medium.com/@douglasddf/language-localization-em-projetos-ios-2bbfa8c4d5df&quot;&gt;Language Localization em projetos iOS&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Originalmente publicado &lt;a href=&quot;https://medium.com/@douglasddf/language-localization-em-projetos-ios-2bbfa8c4d5df&quot; target=&quot;_blank&quot;&gt;aqui&lt;/a&gt;.</description><link>http://profdouglas.blogspot.com/2015/08/projeto-ios-language-localization.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-5072395774372050899</guid><pubDate>Thu, 06 Aug 2015 21:41:00 +0000</pubDate><atom:updated>2015-08-12T14:19:04.645-03:00</atom:updated><title>Criando um projeto open-source: iOS-Check-Permission</title><description>No dia a dia do programador é bastante comum trabalhar com diversos algoritmos para resolver problemas específicos da empresa ou do cliente. Muitos dos programas as vezes ficam esquecidos quando o projeto acaba. Uma forma de preservar as soluções de código desenvolvidos é criar um ou mais componentes e publicá-los em comunidades abertas. Vou descrever uma experiência de publicar um componente no &lt;a href=&quot;http://github.com/&quot;&gt;Github.com&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;O componente iOS-Check-Permission&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt; Criei um componente para permitir as aplicações em iOS solicitarem a permissão de uso dos seguintes recursos nativos do celular de forma transparente a o mais simples possível:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Calendar&lt;/b&gt; (permitir acessar o calendário do usuário para marcar eventos)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Reminder&lt;/b&gt; (permitir usar o recurso de agendamentos de lembretes)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Gallery&lt;/b&gt; (ter acesso as fotos ou vídeos da galeria do aparelho)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Location&lt;/b&gt; (para usar o GPS obtendo a localização atual)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioSEkSdt5_411V4BS0mQlKDUeXoeO3AyJQMb2DGlFLYepR-D-8UUFjbhll1SrCU_iWOuB5LYdfuC21eCQB3apKXwvqJ20kZ6BFs-AT06-NsKY6F4D2ihMQhrlVOmGTPpP05PmvyEd9d37X/s1600/ios-check-permission-art2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;368&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioSEkSdt5_411V4BS0mQlKDUeXoeO3AyJQMb2DGlFLYepR-D-8UUFjbhll1SrCU_iWOuB5LYdfuC21eCQB3apKXwvqJ20kZ6BFs-AT06-NsKY6F4D2ihMQhrlVOmGTPpP05PmvyEd9d37X/s640/ios-check-permission-art2.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;iOS-Check-Permission [&lt;a href=&quot;https://github.com/douglasddf/ios-check-permissions&quot; target=&quot;_blank&quot;&gt;1&lt;/a&gt;]&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Ouça também o podcast:&lt;br /&gt;
&lt;br /&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/218932566&amp;amp;color=ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Por que criar um componente/biblioteca?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Havia necessidade de escrever um código para ter acesso a galeria de imagens do usuário usando a tecnologia do iOS, bem como, a necessidade de obter a permissão da Câmera do celular para tirar fotos com o iPhone. Um código inicial foi escrito para fazer isso funcionar usando a linguagem Objective-C. Porém, percebi que poderíamos reusar essa solução em outros projetos, caso isso fosse necessário. &lt;br /&gt;
&lt;br /&gt;
No início, havia uma classe utilitária para ser usada dentro do projeto, com a solução de código que permitia reusar o recurso para usar a câmera nativa sempre que fosse necessária. Esse recurso requer solicitar autorização do usuário para poder ser utilizado no aparelho. Com o andar do projeto, algumas outras permissões foram sendo necessárias, pois a medida que novos recursos foram sendo requisitados, tais como uso da galeria de imagens do iPhone e do recurso de lembretes (Reminders), também precisei de uma solução parecida com o que já tinha feito.&lt;br /&gt;
&lt;br /&gt;
Então venho a ideia de &lt;i&gt;&lt;b&gt;componentizar&lt;/b&gt;&lt;/i&gt; a atual classe utilitária para se tornar um componente reusável. Embora essa ideia não tenha nada de sofisticado, para se tornar um componente na prática é preciso decidir onde vai colocar isso. Poderia ser, por exemplo, no próprio repositório do projeto, dentro da empresa que você trabalha.&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: red; font-size: large;&quot;&gt;Mas será que outras pessoas iriam encontrar?&lt;br /&gt;
Será que os próprios colegas da empresa em questão saberiam que isso está ali disponível?&lt;/span&gt;&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;
A prática mostra que não. E que seria preciso colocar o componente em outro repositório, preferencialmente que seja popular e conhecido entre a comunidade de usuários de desenvolvedores. Assim, pensei e resolvi colocar no repositório Github, cujo nome do componente se tornou&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: red; font-family: Georgia, Times New Roman, serif;&quot;&gt;iOS-Check-Permission&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; - &lt;a href=&quot;https://github.com/douglasddf/iOS-Check-Permission&quot;&gt;https://github.com/douglasddf/iOS-Check-Permission&lt;/a&gt;&amp;nbsp; &lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;O resultado foi que encontrei um pretexto para continuar fazendo o que mais gosto: programar.&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;
Após alguns resultados positivos, surgiu a necessidade de fazer um exemplo de uso para demonstrar as funcionalidades básicas do componente, bem como, já servir de base para outros entenderem como poderia ser usado. O vídeo abaixo foi feito para ilustrar sem que o desenvolvedor precise instalar as ferramentas Xcode.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;480&quot; src=&quot;https://www.youtube.com/embed/JxdlaEp6dC0&quot; width=&quot;640&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
Para colocar no GITHUB foi necessária criar uma conta e ler os guias para entender como enviar o código para lá. Como o próprio nome diz, GIT&amp;nbsp;+ HUB se baseia na ferramenta do GIT {&lt;a href=&quot;http://profdouglas.blogspot.com.br/2015/05/githubcom-e-o-git.html&quot; target=&quot;_blank&quot;&gt;já escrevi outro post aqui sobre ele&lt;/a&gt;}. Outros conhecimentos foram necessários, como escrever um pequeno texto em &lt;b&gt;&lt;i&gt;English&lt;/i&gt;&lt;/b&gt; para descrever o que o componente faz. Afinal, se não explicar, como os outros vão saber para que serve?&lt;br /&gt;
&lt;br /&gt;
Outro ponto que posso destacar é que no processo de estar fazendo, surgiu a demanda de fazer a biblioteca suportar o recurso de Localização (Location). No entanto, para minha surpresa, a forma de fazer isso funcionar não se parecia em nada com a abordagem dos outros recursos. Ou seja, surge um novo desafio pessoal. :)&lt;br /&gt;
&lt;br /&gt;
Além disso, após já ter publicada a biblioteca no repositório e ter avisado os colegas, vem aquele amigo e diz que ainda não está bom o suficiente, precisa suportar o &lt;a href=&quot;https://cocoapods.org/&quot; target=&quot;_blank&quot;&gt;COCOAPOD&lt;/a&gt;. Mais um desafio que surge e que você não previu antes, mas que passou a ser importante para que o componente possa ter maior alcance.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Então você percebe que não tem tempo. O que você faz?&lt;/span&gt;&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;
A relação do tempo têm haver com a priorização que queremos dar as tarefas diárias. Programar é muito bom quando se faz com prazer, logo, posso arrumar tempo para isso no dia a dia. Pois quanto maior for o desafio, maior será o seu aprendizado. Mas não se sabe ou não se aprende somente na teoria, mas na prática e gerando resultados que vai prover as lições para nos mostrar as respostas.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: red; font-size: large;&quot;&gt;Resultados só vem após tentar, fazer e conseguir.&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;br /&gt;
Compartilhar uma solução na comunidade de open-source, tal como o github, faz com que haja uma preocupação extra com a qualidade do código final. Mas para mim, o mais legal é ter o sentimento de contribuir com a comunidade e porque não: contribuir com a humanidade, do seu jeito, da sua forma, com seu esforço.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;i&gt;Pode não ter dinheiro envolvido, mas tem a causa de contribuir que essa, de uma forma desconhecida, há de se ter um benefício a longo prazo a você e a muitos outros.&lt;/i&gt;&lt;/span&gt; &amp;nbsp;&lt;/blockquote&gt;&lt;br /&gt;
&lt;iframe src=&quot;http://i.giflike.com/embed/FKLOTzK&quot; width=&quot;326&quot; height=&quot;600&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
</description><link>http://profdouglas.blogspot.com/2015/08/criando-um-projeto-open-source-ios.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioSEkSdt5_411V4BS0mQlKDUeXoeO3AyJQMb2DGlFLYepR-D-8UUFjbhll1SrCU_iWOuB5LYdfuC21eCQB3apKXwvqJ20kZ6BFs-AT06-NsKY6F4D2ihMQhrlVOmGTPpP05PmvyEd9d37X/s72-c/ios-check-permission-art2.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-6523362120917646105</guid><pubDate>Thu, 02 Jul 2015 02:42:00 +0000</pubDate><atom:updated>2015-09-28T21:13:27.063-03:00</atom:updated><title>Memory Leak / vazamento de memória na programação</title><description>&lt;br /&gt;
Recentemente me deparei com problemas de&lt;b&gt; memory leak&lt;/b&gt; no desenvolvimento de uma aplicação para iOS (iPhone/iPad) e foi difícil de resolver e achar a causa do problema. Comentarei um pouco sobre isso.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuRIOV0s1ln_SQkiVjnty1I1N7Zey1c9LFu6Ba7czEXXqZaznHwxLEBHx6BCN62h2tZo0Ndm7JKlLJYzidx6BSgE3kb_HhlCZEmMHFQgQ-Fu392Lm_8OoqCombTYwgso9PFr222zWXc8jK/s1600/Captura+de+tela+2015-07-01+23.21.46.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;225&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuRIOV0s1ln_SQkiVjnty1I1N7Zey1c9LFu6Ba7czEXXqZaznHwxLEBHx6BCN62h2tZo0Ndm7JKlLJYzidx6BSgE3kb_HhlCZEmMHFQgQ-Fu392Lm_8OoqCombTYwgso9PFr222zWXc8jK/s400/Captura+de+tela+2015-07-01+23.21.46.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Memória é um recurso excelente para fazer nossos aplicativos rodarem de acordo com o esperado. Porém, quando falta memória o aplicativo pode fechar inesperadamente. Também conhecido como CRASH.&lt;br /&gt;
&lt;br /&gt;
Em aplicações iOS, que são baseados em linguagem C, trabalhamos com as linguagens &lt;b&gt;Objective-c&lt;/b&gt; ou &lt;b&gt;Swift&lt;/b&gt;, que normalmente fazem uso de ponteiros e acesso a endereços de memória. Qualquer &quot;&lt;i&gt;vacilada&lt;/i&gt;&quot; ou descuido durante a programação, levamos a erros que geram &lt;b&gt;CRASHs&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Memory leak é um tipo de erro muito indesejado e são problemas de memória alocada, mas que na prática, não liberada, ficando acumulada e retida (presa). Assim, se deixar vazamento de memória em algum ponto do programa, o acesso consecutivo a esse ponto vai gerar acúmulo de recursos de memória. O problema ocorre porque o &lt;b&gt;SO&lt;/b&gt; não consegue desalocar esse recurso porque ficou retido.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Há várias possíveis razões:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;variáveis alocadas ficam referenciadas em algum ponto durante a &amp;nbsp;execução do algoritmo;&lt;/li&gt;
&lt;li&gt;recursos que consomem mais memória podem ficar retidos em processos Zombis;&lt;/li&gt;
&lt;li&gt;componentes da plataforma consomem recursos e não são fortemente liberados (ex. &lt;i&gt;UIImagePickerController&lt;/i&gt; - iOS / manipular a câmera que tira as fotos &lt;a href=&quot;http://stackoverflow.com/questions/6554225/uiimagepickercontroller-memory-leak&quot;&gt;possui memory leak&lt;/a&gt;);&lt;/li&gt;
&lt;li&gt;uso de propriedades de componentes visuais com tipo &quot;&lt;i&gt;&lt;b&gt;strong&lt;/b&gt;&lt;/i&gt;&quot; pode reter memória (em iOS/MacOS...);&lt;/li&gt;
&lt;li&gt;uso de bibliotecas ou modificações nesses componentes sem analisar essa questão, etc.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;&lt;b&gt;Como evitar vazamento de memória&lt;/b&gt;&lt;/h3&gt;&lt;br /&gt;
Uma forma interessante é utilizar ferramentas de Profiling. No iOS temos o &quot;instruments&quot;, que é um conjunto de ferramentas que podem ser usadas para analisar a execução do programa para avaliar graficamente e os dados estatísticos, onde estão os pontos errados. Identificar esses pontos permitirá avaliar o código melhor e tomar decisões para corrigir as falhas.&lt;br /&gt;
&lt;br /&gt;
Uma forma eficiente que aprendi, quando temos leaks identificados, mas sem saber a causa, pode-se ir comentando funcionalidades chaves e rodar novamente o Profiling. Se ocorrer mudanças significativas para melhor, significa que o provável memory leak está no ponto comentado, caso contrário, continue comentando códigos e rodando o analisador novamente até que encontre o &quot;vilão&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/226029112&amp;amp;color=ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&quot;&gt;&lt;/iframe&gt;</description><link>http://profdouglas.blogspot.com/2015/07/memory-leak-vazamento-de-memoria-na.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuRIOV0s1ln_SQkiVjnty1I1N7Zey1c9LFu6Ba7czEXXqZaznHwxLEBHx6BCN62h2tZo0Ndm7JKlLJYzidx6BSgE3kb_HhlCZEmMHFQgQ-Fu392Lm_8OoqCombTYwgso9PFr222zWXc8jK/s72-c/Captura+de+tela+2015-07-01+23.21.46.png" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-4841859491277653603</guid><pubDate>Sat, 30 May 2015 12:22:00 +0000</pubDate><atom:updated>2015-08-07T07:56:35.815-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">git</category><category domain="http://www.blogger.com/atom/ns#">github</category><category domain="http://www.blogger.com/atom/ns#">podcast</category><category domain="http://www.blogger.com/atom/ns#">programação</category><category domain="http://www.blogger.com/atom/ns#">programing</category><title>GitHub.com e o GIT</title><description>&lt;div&gt;O&amp;nbsp;&lt;b&gt;&lt;a href=&quot;https://github.com/&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;&lt;/b&gt;&amp;nbsp;é&amp;nbsp;um&amp;nbsp;serviço&amp;nbsp;de&amp;nbsp;hospedagem&amp;nbsp;de&amp;nbsp;código&amp;nbsp;público&amp;nbsp;ou&amp;nbsp;privado,&amp;nbsp;que&amp;nbsp;usa&amp;nbsp;a&amp;nbsp;tecnologia do &lt;a href=&quot;http://pt.wikipedia.org/wiki/Git&quot; target=&quot;_blank&quot;&gt;GIT&lt;/a&gt;&amp;nbsp;para&amp;nbsp;a&amp;nbsp;gestão&amp;nbsp;dos&amp;nbsp;códigos&amp;nbsp;fontes.&amp;nbsp;A&amp;nbsp;tecnologia&amp;nbsp;&lt;a href=&quot;http://pt.wikipedia.org/wiki/Git&quot; target=&quot;_blank&quot;&gt;GIT&lt;/a&gt;&amp;nbsp;é&amp;nbsp;um&amp;nbsp;sistema&amp;nbsp;de&amp;nbsp;controle&amp;nbsp;de&amp;nbsp;versão&amp;nbsp;distribuído.&amp;nbsp;Oferecer&amp;nbsp;a&amp;nbsp;infraestrutura&amp;nbsp;do&amp;nbsp;&lt;a href=&quot;http://pt.wikipedia.org/wiki/Git&quot; target=&quot;_blank&quot;&gt;GIT&lt;/a&gt;&amp;nbsp;como&amp;nbsp;um&amp;nbsp;serviço&amp;nbsp;transparente&amp;nbsp;aos&amp;nbsp;desenvolvedores,&amp;nbsp;de&amp;nbsp;nível&amp;nbsp;de&amp;nbsp;escala&amp;nbsp;mundial,&amp;nbsp;através&amp;nbsp;de&amp;nbsp;um&amp;nbsp;modelo&amp;nbsp;de&amp;nbsp;negócio&amp;nbsp;pago&amp;nbsp;ou&amp;nbsp;gratuito,&amp;nbsp;foi,&amp;nbsp;ao&amp;nbsp;meu&amp;nbsp;ver,&amp;nbsp;a&amp;nbsp;grande&amp;nbsp;sacada&amp;nbsp;que&amp;nbsp;tornou&amp;nbsp;o&amp;nbsp;&lt;a href=&quot;https://github.com/&quot;&gt;GITHUB.com&lt;/a&gt;,&amp;nbsp;um&amp;nbsp;dos&amp;nbsp;mais&amp;nbsp;populares&amp;nbsp;serviços&amp;nbsp;oferecidos&amp;nbsp;aos&amp;nbsp;programadores. &lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLTv5be_-EpdH6wnR7M9mCN7z7Jqg-n7JjDgoZ7HFjPB6ZnRwskkLCU3UllKjMJ8Cm2rwPS30WpMF3YnGir-rF8B3HSkQXkurJNw8w1sPVVSFlWw9E74n4-nL2bx_899RX0Tm6IG2X1Fke/s1600/setuptocat1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLTv5be_-EpdH6wnR7M9mCN7z7Jqg-n7JjDgoZ7HFjPB6ZnRwskkLCU3UllKjMJ8Cm2rwPS30WpMF3YnGir-rF8B3HSkQXkurJNw8w1sPVVSFlWw9E74n4-nL2bx_899RX0Tm6IG2X1Fke/s320/setuptocat1.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Gravei&amp;nbsp;um&amp;nbsp;podcast&amp;nbsp;para&amp;nbsp;falar&amp;nbsp;dele.&amp;nbsp;Ouça&amp;nbsp;se&amp;nbsp;tiver&amp;nbsp;interesse:&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/216645240&amp;amp;color=ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
Durante&amp;nbsp;o&amp;nbsp;podcast,&amp;nbsp;não&amp;nbsp;pude&amp;nbsp;explicar&amp;nbsp;como&amp;nbsp;usar&amp;nbsp;o&amp;nbsp;GIT,&amp;nbsp;apenas&amp;nbsp;citei&amp;nbsp;alguns&amp;nbsp;exemplos&amp;nbsp;básicos.&amp;nbsp;Vou&amp;nbsp;sugerir que você procure um tutorial na internet. Eu indico o meu tutorial preferido logo abaixo, mas estou ciente que para aprender a usar o GIT, você precisará ir mais afundo.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;Veja mais:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://rogerdudler.github.io/git-guide/index.pt_BR.html&quot; target=&quot;_blank&quot;&gt;Guia Prático - sem complicação!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.github.com/articles/set-up-git/&quot;&gt;Set Up Git&lt;/a&gt;&amp;nbsp;(do próprio GitHub)&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><link>http://profdouglas.blogspot.com/2015/05/githubcom-e-o-git.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLTv5be_-EpdH6wnR7M9mCN7z7Jqg-n7JjDgoZ7HFjPB6ZnRwskkLCU3UllKjMJ8Cm2rwPS30WpMF3YnGir-rF8B3HSkQXkurJNw8w1sPVVSFlWw9E74n4-nL2bx_899RX0Tm6IG2X1Fke/s72-c/setuptocat1.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-3646799012456010816</guid><pubDate>Wed, 11 Mar 2015 10:40:00 +0000</pubDate><atom:updated>2015-03-11T07:41:51.250-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">algoritmos</category><category domain="http://www.blogger.com/atom/ns#">carcast</category><category domain="http://www.blogger.com/atom/ns#">linguagem</category><category domain="http://www.blogger.com/atom/ns#">podcast</category><category domain="http://www.blogger.com/atom/ns#">programação</category><title>Algoritmos e Lógica de programação: conhecimento essencial!</title><description>As linguagens de programação são excelentes formas de aprender a programar. Mas para se aventurar na programação é preciso do conhecimento básico e essencial: &lt;a href=&quot;http://www.wikiwand.com/pt/Algoritmo&quot; target=&quot;_blank&quot;&gt;ALGORITMO&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Neste podcast falo sobre os Algoritmos e as suas formas de representações. Além do entendimento dos 4 comandos básicos essenciais: Entrada de dados; Saída de Dados; Processamento e Decisão.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
E para não esquecer de nada: &lt;b&gt;o que a lógica de programação tem haver com algoritmos e a programação?&lt;/b&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;iframe frameborder=&quot;no&quot; height=&quot;450&quot; scrolling=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/195223526&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;visual=true&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Além disso, comentamos, em linhas gerais, sobre como as Linguagens de Programação fazem para converter os Algoritmos em linguagem de máquina, através das ferramentas &lt;a href=&quot;http://www.wikiwand.com/pt/Compilador&quot; target=&quot;_blank&quot;&gt;Compiladores&lt;/a&gt;.</description><link>http://profdouglas.blogspot.com/2015/03/algoritmos-e-logica-de-programacao.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-1311343232263010846</guid><pubDate>Fri, 06 Mar 2015 10:27:00 +0000</pubDate><atom:updated>2015-03-06T07:27:20.873-03:00</atom:updated><title>Dicas sobre programação para dispositivos móveis + podcast</title><description>&lt;span style=&quot;background-color: #f2f2f2; color: #333333; font-family: Interstate, &#39;Lucida Grande&#39;, &#39;Lucida Sans Unicode&#39;, &#39;Lucida Sans&#39;, Garuda, Verdana, Tahoma, sans-serif; font-size: 14px; line-height: 19.6000003814697px;&quot;&gt;Algumas dicas pessoais sobre o mercado de desenvolvimento de aplicativos móveis para&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://soundcloud.com/tags/Android&quot; style=&quot;background-color: #f2f2f2; color: #3388dd; font-family: Interstate, &#39;Lucida Grande&#39;, &#39;Lucida Sans Unicode&#39;, &#39;Lucida Sans&#39;, Garuda, Verdana, Tahoma, sans-serif; font-size: 14px; line-height: 19.6000003814697px; text-decoration: none;&quot;&gt;#Android&lt;/a&gt;&lt;span style=&quot;background-color: #f2f2f2; color: #333333; font-family: Interstate, &#39;Lucida Grande&#39;, &#39;Lucida Sans Unicode&#39;, &#39;Lucida Sans&#39;, Garuda, Verdana, Tahoma, sans-serif; font-size: 14px; line-height: 19.6000003814697px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://soundcloud.com/tags/iOS&quot; style=&quot;background-color: #f2f2f2; color: #3388dd; font-family: Interstate, &#39;Lucida Grande&#39;, &#39;Lucida Sans Unicode&#39;, &#39;Lucida Sans&#39;, Garuda, Verdana, Tahoma, sans-serif; font-size: 14px; line-height: 19.6000003814697px; text-decoration: none;&quot;&gt;#iOS&lt;/a&gt;&lt;span style=&quot;background-color: #f2f2f2; color: #333333; font-family: Interstate, &#39;Lucida Grande&#39;, &#39;Lucida Sans Unicode&#39;, &#39;Lucida Sans&#39;, Garuda, Verdana, Tahoma, sans-serif; font-size: 14px; line-height: 19.6000003814697px;&quot;&gt;&amp;nbsp;e&lt;/span&gt;&lt;a href=&quot;https://soundcloud.com/tags/WindowsPhone&quot; style=&quot;background-color: #f2f2f2; color: #3388dd; font-family: Interstate, &#39;Lucida Grande&#39;, &#39;Lucida Sans Unicode&#39;, &#39;Lucida Sans&#39;, Garuda, Verdana, Tahoma, sans-serif; font-size: 14px; line-height: 19.6000003814697px; text-decoration: none;&quot;&gt;#WindowsPhone&lt;/a&gt;&lt;span style=&quot;background-color: #f2f2f2; color: #333333; font-family: Interstate, &#39;Lucida Grande&#39;, &#39;Lucida Sans Unicode&#39;, &#39;Lucida Sans&#39;, Garuda, Verdana, Tahoma, sans-serif; font-size: 14px; line-height: 19.6000003814697px;&quot;&gt;.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #f2f2f2; color: #333333; font-family: Interstate, &#39;Lucida Grande&#39;, &#39;Lucida Sans Unicode&#39;, &#39;Lucida Sans&#39;, Garuda, Verdana, Tahoma, sans-serif; font-size: 14px; line-height: 19.6000003814697px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: #f2f2f2; color: #333333; font-family: Interstate, &#39;Lucida Grande&#39;, &#39;Lucida Sans Unicode&#39;, &#39;Lucida Sans&#39;, Garuda, Verdana, Tahoma, sans-serif; font-size: 14px; line-height: 19.6000003814697px;&quot;&gt;Como começar, vantagens e desvantagens de cada tecnologia. Além disso, um relato pessoal e verdadeiro, de onde está o custo principal envolvido hoje em dia:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #f2f2f2; color: #333333; font-family: Interstate, &#39;Lucida Grande&#39;, &#39;Lucida Sans Unicode&#39;, &#39;Lucida Sans&#39;, Garuda, Verdana, Tahoma, sans-serif; font-size: 14px; line-height: 19.6000003814697px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;background-color: #f2f2f2; color: #333333; font-family: Interstate, &#39;Lucida Grande&#39;, &#39;Lucida Sans Unicode&#39;, &#39;Lucida Sans&#39;, Garuda, Verdana, Tahoma, sans-serif; font-size: 14px; line-height: 19.6000003814697px;&quot;&gt;&lt;i&gt;&lt;b&gt;na construção da experiência de uso do aplicativo ou game e menos no esforço da codificação em si.&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;span style=&quot;background-color: #f2f2f2; color: #333333; font-family: Interstate, &#39;Lucida Grande&#39;, &#39;Lucida Sans Unicode&#39;, &#39;Lucida Sans&#39;, Garuda, Verdana, Tahoma, sans-serif; font-size: 14px; line-height: 19.6000003814697px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;iframe frameborder=&quot;no&quot; height=&quot;450&quot; scrolling=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/194426665&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;visual=true&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Links relacionados&lt;/b&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.apple.com/&quot;&gt;https://developer.apple.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://developer.android.com/index.html&quot;&gt;http://developer.android.com/index.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.windows.com/pt-br/&quot;&gt;https://dev.windows.com/pt-br/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><link>http://profdouglas.blogspot.com/2015/03/dicas-sobre-programacao-para.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-5483304780918130227</guid><pubDate>Fri, 12 Dec 2014 10:48:00 +0000</pubDate><atom:updated>2014-12-12T08:50:33.625-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">debate</category><category domain="http://www.blogger.com/atom/ns#">iOS</category><category domain="http://www.blogger.com/atom/ns#">programação</category><category domain="http://www.blogger.com/atom/ns#">storyboard</category><category domain="http://www.blogger.com/atom/ns#">xib</category><title>Desenvolvimento #iOS usando Objective-C e Swift / Storyboard vs. XIB file ?</title><description>Olá pessoal!&lt;br /&gt;
&lt;br /&gt;
Desta vez vou divulgar aqui dois temas que discuti nos últimos podcasts produzidos no &lt;b&gt;&lt;i&gt;&lt;a href=&quot;https://soundcloud.com/carcastprogramming/&quot;&gt;Carcast Programming&lt;/a&gt;&lt;/i&gt;&lt;/b&gt; sobre o desenvolvimento iOS. Abaixo o video onde especialistas debatem sobre usar Storyboard e XIB file no desenvolvimento de Apps.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe frameborder=&quot;no&quot; height=&quot;166&quot; scrolling=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/179560476&amp;amp;color=ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;iframe frameborder=&quot;no&quot; height=&quot;166&quot; scrolling=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/181159554&amp;amp;color=ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se quiser contribuir com o carcast, sugestões ou críticas, envie email para:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;a href=&quot;mailto:carcastprogramming@gmail.com&quot;&gt;carcastprogramming@gmail.com&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Storyboards vs NIBS vs Code Debate&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;//www.youtube.com/embed/XciUazpOfFU&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;</description><link>http://profdouglas.blogspot.com/2014/12/desenvolvimento-ios-usando-objective-c.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-7514762836900351011</guid><pubDate>Wed, 15 Oct 2014 11:17:00 +0000</pubDate><atom:updated>2014-10-15T08:17:34.435-03:00</atom:updated><title>Podcast nas ruas do Recife sobre relatos de experiências em desenvolvimento de software</title><description>&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;&lt;b&gt;&quot;Bom dia, boa tarde e boa noite!&quot;&lt;/b&gt;&lt;/i&gt; (inspirado no &lt;a href=&quot;https://macmagazine.com.br/category/podcast/&quot;&gt;podcast do MacMagazine&lt;/a&gt;)&lt;/blockquote&gt;
&lt;br /&gt;
Estou criando alguns podcasts e estou chamando de &lt;b&gt;carcast&lt;/b&gt;, já que a gravação do áudio está sendo feito durante meu deslocamento de carro pelas ruas da cidade do Recife (PE, Brasil). Sempre quis compartilhar um pouco da experiência que venho acumulando e achei interessante criar um podcast.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe frameborder=&quot;no&quot; height=&quot;450&quot; scrolling=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/users/13850449&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;visual=true&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
A ideia é falar sobre as experiências e das tecnologias que estou utilizando para desenvolver software no mercado de trabalho. Pontos de vista e lições aprendidas são comentadas. Quando achar pertinente,&amp;nbsp; escreverei um post no blog para citar os links e até mesmo, comentar mais sobre o assunto em questão.&lt;br /&gt;
&lt;br /&gt;
Sinta-se convidado para ouvir os áudios e fazer comentários ou críticas. </description><link>http://profdouglas.blogspot.com/2014/10/podcast-nas-ruas-do-recife-sobre.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-4752998291227939610</guid><pubDate>Thu, 09 Oct 2014 11:34:00 +0000</pubDate><atom:updated>2014-10-09T08:35:40.256-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">carcast</category><category domain="http://www.blogger.com/atom/ns#">experiência</category><category domain="http://www.blogger.com/atom/ns#">LA</category><category domain="http://www.blogger.com/atom/ns#">lições aprendidas</category><category domain="http://www.blogger.com/atom/ns#">produtividade</category><category domain="http://www.blogger.com/atom/ns#">projetos</category><title>(LA) - Lições Aprendidas em projetos de software</title><description>&lt;br /&gt;
&lt;b&gt;O que é LA&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
“Lições Aprendidas” é “o conhecimento adquirido durante o projeto, que mostra como os eventos do projeto foram abordados ou devem ser tratados no futuro com o objetivo de melhorar o desempenho futuro” (&lt;a href=&quot;http://pt.wikipedia.org/wiki/Project_Management_Body_of_Knowledge&quot;&gt;PMBOK 5a Ed&lt;/a&gt;.).&lt;/blockquote&gt;
Ouça o podcast que comento minha experiência usando o processo de LA em projetos de software.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;iframe frameborder=&quot;no&quot; height=&quot;450&quot; scrolling=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/171234187&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;visual=true&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description><link>http://profdouglas.blogspot.com/2014/10/la-licoes-aprendidas-em-projetos-de.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-4523090480596258222</guid><pubDate>Thu, 02 Oct 2014 00:17:00 +0000</pubDate><atom:updated>2014-10-01T21:22:41.297-03:00</atom:updated><title>O que aprendi com a programação hoje: dia 12 - ciclo de vida com Javascript</title><description>&lt;span style=&quot;background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20.7900009155273px;&quot;&gt;Esse post faz parte de uma série: o que aprendi com a programação, e tudo&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://profdouglas.blogspot.com.br/2014/08/o-que-aprendi-com-programacao-hoje-dia-1.html&quot; style=&quot;background-color: white; color: #771000; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20.7900009155273px; text-decoration: none;&quot;&gt;&lt;span class=&quot;s1&quot;&gt;começou no dia 1&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Entender o ciclo de vida de uma aplicação de software, é essencial para o desenvolvedor compreender como criar seus programas para a tecnologia desejada. Cada linguagem pode ter sua própria variação destes comportamentos, que chamamos de ciclo de vida do software. Neste post, vou mostrar minha percepção para aplicações em Javascript e o que eu aprendi com isso.&lt;br /&gt;
&lt;br /&gt;
Ouça o podcast 6 (carinhosamente chamado de &lt;b&gt;Carcast&lt;/b&gt;), para contextualiza-lo melhor sobre o tema deste post.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe frameborder=&quot;no&quot; height=&quot;166&quot; scrolling=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/170221895&amp;amp;color=ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
De forma genérica, de acordo com Wikipédia, o ciclo de vida pode ser definido:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;i&gt;&quot;... o conjunto de transformações que podem passar os indivíduos de uma espécie para assegurar a sua continuidade.&quot;&lt;/i&gt; &amp;nbsp;(&lt;a href=&quot;http://www.wikiwand.com/pt/Ciclo_de_vida&quot;&gt;fonte&lt;/a&gt;)&lt;/blockquote&gt;&lt;br /&gt;
Para um aplicativo, podemos considerar o ciclo de vida sendo uma abstração do conceito anterior, porém voltado para software. Portanto, teríamos uma definição:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;&quot;&lt;i&gt;... um conceito fundamental do processo de Engenharia de Sistemas, ... onde se desenrolam todas as fases de desenvolvimento de sistemas artificiais, ou sistemas feito pelo homem, desde a concepção até a sua eliminação.&lt;/i&gt;&quot; (&lt;a href=&quot;http://www.wikiwand.com/pt/Ciclo_de_vida_dos_sistemas&quot;&gt;fonte&lt;/a&gt;)&lt;/blockquote&gt;&lt;br /&gt;
De forma simples, o ciclo de vida do software é onde a execução do programa começa até chegar ao seu fim. Ou seja, o programa &quot;tem vida&quot;, quando ele é alocado na memória RAM do dispositivo, e ele &quot;morre&quot;, quando o mesmo é removido da memória. Este processo deve estar claro para você. Por exemplo, em Java temos a codificação do método main(), que representa o ponto de início e fim ao mesmo tempo.&lt;br /&gt;
&lt;br /&gt;
Já em Android, embora utilizamos a linguagem Java, temos a classe Activity que define alguns métodos que trabalham em conjunto para fornecer um ciclo de vida (onCreate, onStart, onResume, onStop, onPause e onDestroy). &lt;a href=&quot;http://developer.android.com/training/basics/activity-lifecycle/starting.html&quot;&gt;Veja aqui&lt;/a&gt; para detalhes.&lt;br /&gt;
&lt;br /&gt;
Inclusive já abordei aqui um post relacionado com ciclo de vida no Android: [&lt;a href=&quot;http://profdouglas.blogspot.com.br/2012/09/mudancas-de-perspectivas-em-aplicacoes.html&quot;&gt;Mudanças de perspectivas em aplicações Android: evite recriar a Activity&lt;/a&gt;]&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;O ciclo de vida em Javascript&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Tudo começa quando o Browser carrega a página HTML. Se ela tiver declarado um bloco ou arquivo Javascript, então sabemos que a página foi carregada, portanto, foi criada. Assim, o ciclo de vida foi iniciado. Mas como saber se aplicação relacionada está &quot;morta&quot;?&lt;br /&gt;
&lt;br /&gt;
Essa é a questão chave. Existem algumas formas de saber. Uma delas é tentar monitorar os eventos que ocorrem sobre a tela HTML no Browser, e caso algum evento de transição de tela ocorrer ou algumas ações na janela do navegador, tal com a operação de minimizada a tela, podemos inferir que alguma coisa ocorreu com a tela atual, podendo assim, deduzir chamadas para o ciclo de vida.&lt;br /&gt;
&lt;br /&gt;
Uma alternativa que usamos aqui é representar uma estrutura de código que cheque quando os eventos da tela HTML ocorrerem, e assim, podemos inferir o ciclo de vida básico: INICIAR, PAUSAR, MORRER.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;300&quot; src=&quot;http://jsfiddle.net/douglasddf/gv5ox3q2/1/embedded/&quot; allowfullscreen=&quot;allowfullscreen&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
O exemplo acima demonstra um trecho de código Javascript no qual pode-se conferir o uso deste método. Vale notar que talvez Browser que não seja o Chrome pode não funcionar. Para testar abra uma aba nova e retorne ao exemplo.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;Aprendi com essa experiência que podemos simular um ciclo de vida em aplicações Web que utilizam linguagem Javascript. Porém, existem limitações e nem todos os navegadores suportam o código acima. &lt;/blockquote&gt;&lt;br /&gt;
Uma sugestão seria usar um bloco:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt;var doc = window.document;
  if (doc.hidden || doc.msHidden || doc.webkitHidden) {
    // possui a propriedade de visibilidade compatível com vários navegadores
  } 
&lt;/pre&gt;</description><link>http://profdouglas.blogspot.com/2014/10/o-que-aprendi-com-programacao-hoje-dia.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-6307154571721127506</guid><pubDate>Tue, 23 Sep 2014 10:29:00 +0000</pubDate><atom:updated>2014-09-23T07:29:42.631-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">aprendizado</category><category domain="http://www.blogger.com/atom/ns#">code</category><category domain="http://www.blogger.com/atom/ns#">ferramenta</category><category domain="http://www.blogger.com/atom/ns#">programação</category><category domain="http://www.blogger.com/atom/ns#">video-aula</category><title>Iniciando em programação de forma divertida: code.org</title><description>Uma das coisas que mais gosto de fazer é ensinar a programação as pessoas. Imagine então, quando você encontra um site que tem esse propósito? :) O site &lt;a href=&quot;http://code.org/&quot;&gt;&lt;b&gt;code.org&lt;/b&gt;&lt;/a&gt; tem essa ideia e oferece uma oportunidade para aprender a programação, porém, de forma lúdica, ou seja, divertida.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;360&quot; src=&quot;//www.youtube.com/embed/nKIu9yen5nc&quot; width=&quot;640&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
Esse video acima mostra vários profissionais e pessoas conhecidas que falam da importância de aprender a programação. Eu já falei aqui no blog do porque isso é relevante [&lt;a href=&quot;http://profdouglas.blogspot.com.br/2014/09/o-que-aprendi-com-programacao-hoje-dia-6.html&quot;&gt;O que aprendi com a programação hoje: dia 6 - por que programar?&lt;/a&gt;], e não é somente eu quem está dizendo.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;Estou utilizando o site do &lt;a href=&quot;http://code.org/&quot;&gt;&lt;b&gt;code.org&lt;/b&gt;&lt;/a&gt; para estimular alunos a gostarem da programação. Muitas vezes aprender a programar não é uma tarefa fácil para alunos, e nem para quem ensina. Mas quando tornamos o processo mais divertido: &lt;b&gt;porque ELE pode SER assim&lt;/b&gt;, há bons resultados. &lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;360&quot; src=&quot;//www.youtube.com/embed/wQ6effu-FwA?list=PLWW0LwR0Sm2i3Y1Lof9YiZBTTLZLRv4wo&quot; width=&quot;640&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
O vídeo acima demonstra um exemplo do que você pode encontrar no site indicado neste post.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtJYMGoy89X1nPZxkk8WlKOFj5cITxwAiaEcbKdZXxtmUbPgYb9he0-hKCbPsHZ0jlefSvpo8iREsuvoov-ohyDrJMk-p7mgHL8GQJuwwjmixaazqqHqyZuOEIHhyphenhyphen524La_PA7DN76rB4c/s1600/Captura+de+tela+2014-09-23+07.04.38.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtJYMGoy89X1nPZxkk8WlKOFj5cITxwAiaEcbKdZXxtmUbPgYb9he0-hKCbPsHZ0jlefSvpo8iREsuvoov-ohyDrJMk-p7mgHL8GQJuwwjmixaazqqHqyZuOEIHhyphenhyphen524La_PA7DN76rB4c/s1600/Captura+de+tela+2014-09-23+07.04.38.png&quot; height=&quot;341&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Certificado de sucesso.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;Ao final dos módulos, quando supera os desafios, você ganha o certificado e vai se sentir estimulado ir em frente ainda mais. :)&lt;/i&gt;&lt;/blockquote&gt;
</description><link>http://profdouglas.blogspot.com/2014/09/iniciando-em-programacao-de-forma.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtJYMGoy89X1nPZxkk8WlKOFj5cITxwAiaEcbKdZXxtmUbPgYb9he0-hKCbPsHZ0jlefSvpo8iREsuvoov-ohyDrJMk-p7mgHL8GQJuwwjmixaazqqHqyZuOEIHhyphenhyphen524La_PA7DN76rB4c/s72-c/Captura+de+tela+2014-09-23+07.04.38.png" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-2644379227259825271</guid><pubDate>Sat, 20 Sep 2014 04:11:00 +0000</pubDate><atom:updated>2014-10-01T10:14:15.256-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">aprendizado</category><category domain="http://www.blogger.com/atom/ns#">liderança</category><category domain="http://www.blogger.com/atom/ns#">produtividade</category><category domain="http://www.blogger.com/atom/ns#">programação</category><title>O que aprendi com a programação hoje: dia 11 - liderando um time</title><description>Esse post faz parte de uma série: o que aprendi com a programação, e tudo&amp;nbsp;&lt;a href=&quot;http://profdouglas.blogspot.com.br/2014/08/o-que-aprendi-com-programacao-hoje-dia-1.html&quot;&gt;&lt;span class=&quot;s1&quot;&gt;começou no dia 1&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Por mais técnico que possa parecer, a programação lhe permite aprender e exercitar aspectos que não são necessariamente técnicos, aprendizados que só se aprende fazendo, vivenciando o dia a dia: trata-se da liderança.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;Como é liderar um time de desenvolvimento de software? Não existe uma resposta simples, mas me arrisco a falar um pouco do que estou aprendendo com essa experiência atual. Ouça o &quot;carcast&quot; 4 e tire as suas próprias conclusões.&lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;iframe frameborder=&quot;no&quot; height=&quot;450&quot; scrolling=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/168481458&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;visual=true&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Links citados no podcast&lt;/b&gt;:&lt;br /&gt;
&lt;br /&gt;
- O Monge e o Executivo: &lt;a href=&quot;https://www.youtube.com/watch?v=57t8MAYErqI&quot;&gt;https://www.youtube.com/watch?v=57t8MAYErqI&lt;/a&gt;&lt;br /&gt;
- Palestra sobre liderança na atualidade: &lt;a href=&quot;http://pt.slideshare.net/mcmoraescosta/liderana-na-atualidade&quot;&gt;http://pt.slideshare.net/mcmoraescosta/liderana-na-atualidade&lt;/a&gt;</description><link>http://profdouglas.blogspot.com/2014/09/o-que-aprendi-com-programacao-hoje-dia_20.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-6087250427818670846</guid><pubDate>Tue, 16 Sep 2014 03:01:00 +0000</pubDate><atom:updated>2014-09-16T07:39:53.222-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">configuração</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">dicas</category><category domain="http://www.blogger.com/atom/ns#">facebook</category><category domain="http://www.blogger.com/atom/ns#">html 5</category><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">programação</category><category domain="http://www.blogger.com/atom/ns#">rede social</category><category domain="http://www.blogger.com/atom/ns#">serviço</category><title>O que aprendi com a programação: dia 10 - integração com Facebook</title><description>Eu sempre quis implementar um aplicativo que faz integração com as redes sociais, mas ainda não tinha oportunidades de experimentar. Porém, tudo mudou quando precisei integrar nosso aplicativo com a rede social do Facebook.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8jjOtaF6vXJIMhYYIFVJJThSt35KTX2Qun_anDfiv8hWB4OYaIDiDTyJ9CvNDUcPt4kkpxbQpZ2Q7PBkCeDI-AGpt5RCZ0tv4GQcyeweo7nVuz0qpALq9sUFcjjwahz6Krf29ztZCbhmI/s1600/Captura+de+tela+2014-09-15+22.04.00.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8jjOtaF6vXJIMhYYIFVJJThSt35KTX2Qun_anDfiv8hWB4OYaIDiDTyJ9CvNDUcPt4kkpxbQpZ2Q7PBkCeDI-AGpt5RCZ0tv4GQcyeweo7nVuz0qpALq9sUFcjjwahz6Krf29ztZCbhmI/s1600/Captura+de+tela+2014-09-15+22.04.00.png&quot; height=&quot;196&quot; title=&quot;&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
A ideia deste post é mostrar, resumidamente, como você pode integrar o seu aplicativo ou site com a rede social do Facebook, compreender como realizar o login e como obter os dados do usuário da rede social, que precisam ser autorizados ao aplicativo para ter acesso as diversas informações disponíveis na conta. &lt;br /&gt;
&lt;br /&gt;
Ouça o podcast para entender sobre alguns pontos importantes dessa integração com o Facebook usando um aplicativo ou site:&lt;br /&gt;
&lt;br /&gt;
&lt;iframe frameborder=&quot;no&quot; height=&quot;166&quot; scrolling=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/167873276&amp;amp;color=ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
A primeira coisa que você deve fazer é registrar o seu aplicativo no site do &lt;a href=&quot;http://developer.facebook.com/&quot;&gt;desenvolvedor do Facebook&lt;/a&gt;, clicando na opção &quot;&lt;i&gt;Add a New App&lt;/i&gt;&quot;, e deste ponto em diante, as configurações vão depender da plataforma escolhida:&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhireHTM18eRXJRAOUy0JPIltZK9qT4YipYJsPYjc6ByJi4qSexiKORlkfsmSyRfJj128lRuFCVeOd29jX-EWR_8-xKCfXSKLYbojOxE_9u2LroffVPEenQYoxh2NWpOpKx4xSphVB1T9rh/s1600/Captura+de+tela+2014-09-15+22.10.10.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhireHTM18eRXJRAOUy0JPIltZK9qT4YipYJsPYjc6ByJi4qSexiKORlkfsmSyRfJj128lRuFCVeOd29jX-EWR_8-xKCfXSKLYbojOxE_9u2LroffVPEenQYoxh2NWpOpKx4xSphVB1T9rh/s1600/Captura+de+tela+2014-09-15+22.10.10.png&quot; height=&quot;344&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Escolha da plataforma do app. do Facebook&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Para o exemplo deste post, escolhi a opção &quot;Site&quot;. Então você terá que categorizar seu aplicativo de acordo com algumas opções pré-definidas, bastando clicar em um botão de Confirmação que seu aplicativo será criado.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;360&quot; src=&quot;//www.youtube.com/embed/YHuDByY1pnk&quot; width=&quot;640&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
O próximo passo o próprio Facebook exibirá uma tela com as próximas configurações que podem ser feitas. Haverá um código exemplo que pode ser testado no seu Website. O ponto aqui é observar a chave de acesso: AppId, que deve ser usada sempre que precisaremos acessar o Facebook para realizar o login e assim, obter os dados do usuário.&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2v2TcFAQe9QLyBPALocx4bAVFEwrLV4u3mfL0ZOqFhQA1D1REgEtrk83ElWYX77na_iEZ5gPYnrzJCqIwua-1gaRfaJdqcEQztQ-HEHkv8FoqhYSCRGgN_a_Jd3JBrm35oWN8xJ7xFlkS/s1600/Captura_de_tela_2014-09-15_22_16_58.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2v2TcFAQe9QLyBPALocx4bAVFEwrLV4u3mfL0ZOqFhQA1D1REgEtrk83ElWYX77na_iEZ5gPYnrzJCqIwua-1gaRfaJdqcEQztQ-HEHkv8FoqhYSCRGgN_a_Jd3JBrm35oWN8xJ7xFlkS/s1600/Captura_de_tela_2014-09-15_22_16_58.png&quot; height=&quot;444&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Configuração do aplicativo do Facebook com exemplos básicos&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Logo abaixo da tela acima temos uma opção muito importante. Como escolhemos a plataforma web, temos que cadastrar o domínio do nosso Web site que desejamos utilizar a funcionalidade de login:&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDaznaxyhB_Gee_fqvVEew8kP4mf9Ddk945hadH6dci47foOUj8fJ_96WCvnI9PGFxMTLIcoya0pImdjX80ydNOhhrmXMKcsqJk2bjrJT3VaOu0E47chkLrkSqmnfN1_82gWgjXGkDocNB/s1600/Captura_de_tela_2014-09-15_22_23_16.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDaznaxyhB_Gee_fqvVEew8kP4mf9Ddk945hadH6dci47foOUj8fJ_96WCvnI9PGFxMTLIcoya0pImdjX80ydNOhhrmXMKcsqJk2bjrJT3VaOu0E47chkLrkSqmnfN1_82gWgjXGkDocNB/s1600/Captura_de_tela_2014-09-15_22_23_16.png&quot; height=&quot;231&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Configuração do site que pretende suportar o login&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Com a configuração acima realizada, já podemos testar a funcionalidade do login no site cadastrado. Para isso, &amp;nbsp;selecione o produto &quot;&lt;i&gt;Facebook Login&lt;/i&gt;&quot;: &lt;a href=&quot;https://developers.facebook.com/docs/facebook-login/v2.1&quot;&gt;https://developers.facebook.com/docs/facebook-login/v2.1&lt;/a&gt;&amp;nbsp;e copie o código exemplo que tem já. Tal como:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt;&lt;html&gt;

&lt;script&gt;
  // This is called with the results from from FB.getLoginStatus().
  function statusChangeCallback(response) {
    console.log(&#39;statusChangeCallback&#39;);
    console.log(response);
    // The response object is returned with a status field that lets the
    // app know the current login status of the person.
    // Full docs on the response object can be found in the documentation
    // for FB.getLoginStatus().
    if (response.status === &#39;connected&#39;) {
      // Logged into your app and Facebook.
      testAPI();
    } else if (response.status === &#39;not_authorized&#39;) {
      // The person is logged into Facebook, but not your app.
      document.getElementById(&#39;status&#39;).innerHTML = &#39;Please log into this app.&#39;;
    } else {
      // The person is not logged into Facebook, so we&#39;re not sure if
      // they are logged into this app or not.
      document.getElementById(&#39;status&#39;).innerHTML = &#39;Please log into Facebook.&#39;;
    }
  }

  // This function is called when someone finishes with the Login
  // Button.  See the onlogin handler attached to it in the sample
  // code below.
  function checkLoginState() {
    FB.getLoginStatus(function(response) {
      statusChangeCallback(response);
    });
  }

  window.fbAsyncInit = function() {
  FB.init({
    appId      : &#39;{your-app-id}&#39;,
    cookie     : true,  // enable cookies to allow the server to access 
                        // the session
    xfbml      : true,  // parse social plugins on this page
    version    : &#39;v2.1&#39; // use version 2.1
  });

  // Now that we&#39;ve initialized the JavaScript SDK, we call 
  // FB.getLoginStatus().  This function gets the state of the
  // person visiting this page and can return one of three states to
  // the callback you provide.  They can be:
  //
  // 1. Logged into your app (&#39;connected&#39;)
  // 2. Logged into Facebook, but not your app (&#39;not_authorized&#39;)
  // 3. Not logged into Facebook and can&#39;t tell if they are logged into
  //    your app or not.
  //
  // These three cases are handled in the callback function.

  FB.getLoginStatus(function(response) {
    statusChangeCallback(response);
  });

  };

  // Load the SDK asynchronously
  (function(d, s, id) {
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return;
    js = d.createElement(s); js.id = id;
    js.src = &quot;//connect.facebook.net/en_US/sdk.js&quot;;
    fjs.parentNode.insertBefore(js, fjs);
  }(document, &#39;script&#39;, &#39;facebook-jssdk&#39;));

  // Here we run a very simple test of the Graph API after login is
  // successful.  See statusChangeCallback() for when this call is made.
  function testAPI() {
    console.log(&#39;Welcome!  Fetching your information.... &#39;);
    FB.api(&#39;/me&#39;, function(response) {
      console.log(&#39;Successful login for: &#39; + response.name);
      document.getElementById(&#39;status&#39;).innerHTML =
        &#39;Thanks for logging in, &#39; + response.name + &#39;!&#39;;
    });
  }
&lt;/script&gt;

&lt;/html&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Não se esqueça de atualizar seu APP_ID no lugar correspondente. Ao acessar a página com o código acima, se clicar em login, o facebook irá realizar o login, porém, dependendo do seu User, vai exibir uma página de autorização. Se o usuário confirmar, então as resposta de sucesso ou falha serão chamadas usando a lógica demonstrada no exemplo acima.&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl835DwMu4VfyfXSIV5Oldsb16CsME9UXb97nrkSpJrhdW3qp5fY2w7noZ_IEnirwAqzpG3THV-Uu2q3TkyFVN4rPjXLJDUc1CRBRf4tlFKmihJ_lTApbImylF2aazXIkUDQ-r8JfhhUPa/s1600/Captura+de+tela+2014-09-15+22.32.25.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl835DwMu4VfyfXSIV5Oldsb16CsME9UXb97nrkSpJrhdW3qp5fY2w7noZ_IEnirwAqzpG3THV-Uu2q3TkyFVN4rPjXLJDUc1CRBRf4tlFKmihJ_lTApbImylF2aazXIkUDQ-r8JfhhUPa/s1600/Captura+de+tela+2014-09-15+22.32.25.png&quot; height=&quot;371&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Tela de autorização do usuário do Facebook após fazer o login&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Esse processo é descrito na página do Facebook Development e deve ser entendido se você deseja realizar o login. Umas das mudanças da &lt;a href=&quot;https://developers.facebook.com/docs/facebook-login/login-flow-for-web/v2.1&quot;&gt;nova API 2.1&lt;/a&gt;, é que o usuário poderá rever as informações que o aplicativo está utilizando, podendo alterar ao acessar na opção &quot;Reveja as informações que você compartilha&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoeI6NY3znknngV0RJJqSpdB8zmSGwttoKValnvTSLBXSUe6jfsPj6Z2dXYc6Oxr-LsQmXY6whgXPsNGCtCt5r-9iasFPrs9bBbgrZTfRKkU-Y4bkUKhzQ4DebWEH7RdwvVpvwaPJKeBra/s1600/Captura+de+tela+2014-09-15+22.32.58.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoeI6NY3znknngV0RJJqSpdB8zmSGwttoKValnvTSLBXSUe6jfsPj6Z2dXYc6Oxr-LsQmXY6whgXPsNGCtCt5r-9iasFPrs9bBbgrZTfRKkU-Y4bkUKhzQ4DebWEH7RdwvVpvwaPJKeBra/s1600/Captura+de+tela+2014-09-15+22.32.58.png&quot; height=&quot;335&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Informações que o aplicativo usará antes do login do usuário&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Podemos ver na tela abaixo o login sendo exibido. Para você testar, tente acessar a URL com o código citado anteriormente e acessando o aplicativo criado no Facebook para realizar login:&lt;br /&gt;
&lt;a href=&quot;http://profdouglas.blogspot.com.br/p/login-test-facebook.html&quot;&gt;http://profdouglas.blogspot.com.br/p/login-test-facebook.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaCFn4bt-A8VHKA9M-uYp_vnGkPfGcfhes3ZSAHKeDjVDd8EKi2bodIz4dgJtW-1PMVDhPzcBHIljSALKJCt6C3WbxSIy0OyzBKhyphenhyphen4ap3eDsSNLQLSxkzlGyGlToK_s71H1pwmF8LyZeNN/s1600/Captura_de_tela_2014-09-15_22_40_00.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaCFn4bt-A8VHKA9M-uYp_vnGkPfGcfhes3ZSAHKeDjVDd8EKi2bodIz4dgJtW-1PMVDhPzcBHIljSALKJCt6C3WbxSIy0OyzBKhyphenhyphen4ap3eDsSNLQLSxkzlGyGlToK_s71H1pwmF8LyZeNN/s1600/Captura_de_tela_2014-09-15_22_40_00.png&quot; height=&quot;233&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Tela com o login sendo chamado&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;b&gt;O que aprendi com o login do Facebook&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Existem algumas diferenças quando tentamos acessar o login usando um aplicativo nativo (ex. Android, iOS e outros). Uma delas é que temos que possuir uma URL para redirecionar quando o login for feito com sucesso. Então, se você não tiver um server side (servidor) com um domínio registrado, pode-se utilizar uma URL temporária provida pelo próprio Facebook.&lt;br /&gt;
&lt;br /&gt;
Neste caso, temos que acessar a tela de configuração do aplicativo, acessar a opção de &quot;&lt;b&gt;&lt;i&gt;Settings/Advanced&lt;/i&gt;&lt;/b&gt;&quot;, procurando a opção &quot;&lt;span style=&quot;background-color: white; color: #4e5665; font-family: &#39;helvetica neue&#39;, helvetica, arial, &#39;lucida grande&#39;, sans-serif; font-size: 14px; line-height: 20px;&quot;&gt;&lt;b&gt;&lt;i&gt;Valid OAuth redirect URIs&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&quot; e adicionar a URL:&lt;br /&gt;
&lt;i&gt;https://www.facebook.com/connect/login_success.html&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Desta forma, quando as requisições foram feitas pelo seu aplicativo nativo, após o usuário efetuar o login, o Facebook irá redirecionar para essa página e lhe enviar o Token com as credenciais aceitas. Eu encontrei &lt;a href=&quot;https://developer.tizen.org/documentation/articles/facebook-app-tizen&quot;&gt;neste site umas dicas de como implementar&lt;/a&gt; esse esquema para uma aplicação web nativa.&lt;br /&gt;
&lt;br /&gt;
Outro aprendizado que me custou algum tempo para entender... o código de exemplo do Facebook talvez não funcione na sua página local ou no seu Browser. Lembre-se que esses códigos precisam estar executando em algum servidor web. Ou então os códigos podem não funcionar no browser Chrome por conta das restrições de segurança. Se testar no Firefox a probabilidade de que funciona aumenta. Além disso, procure exibir a tela de &lt;b&gt;&lt;i&gt;console&lt;/i&gt;&lt;/b&gt; para certificar que o fluxo previsto está sendo chamado.</description><link>http://profdouglas.blogspot.com/2014/09/o-que-aprendi-com-programacao-dia-10.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8jjOtaF6vXJIMhYYIFVJJThSt35KTX2Qun_anDfiv8hWB4OYaIDiDTyJ9CvNDUcPt4kkpxbQpZ2Q7PBkCeDI-AGpt5RCZ0tv4GQcyeweo7nVuz0qpALq9sUFcjjwahz6Krf29ztZCbhmI/s72-c/Captura+de+tela+2014-09-15+22.04.00.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-1017131489536333356</guid><pubDate>Fri, 12 Sep 2014 10:43:00 +0000</pubDate><atom:updated>2014-09-12T07:43:21.425-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">debug</category><category domain="http://www.blogger.com/atom/ns#">debugging</category><category domain="http://www.blogger.com/atom/ns#">devtools</category><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">programação</category><category domain="http://www.blogger.com/atom/ns#">video-aula</category><title>O que aprendi com a programação hoje: dia 9 - devtools e javascript</title><description>&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
Esse post faz parte de uma série: o que aprendi com a programação, e tudo&amp;nbsp;&lt;a href=&quot;http://profdouglas.blogspot.com.br/2014/08/o-que-aprendi-com-programacao-hoje-dia-1.html&quot;&gt;&lt;span class=&quot;s1&quot;&gt;começou no dia 1&lt;/span&gt;&lt;/a&gt;.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Um grande aprendizado que me permitiu rever os meus &quot;preconceitos&quot; com a linguagem javascript foi entender como testar o meu código usando o Browser, e foi a série do vídeo abaixo que me ajudou.&lt;br /&gt;
&lt;br /&gt;
Recomendo assistir:&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;360&quot; src=&quot;//www.youtube.com/embed/XUgfwYzv-WQ&quot; width=&quot;640&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
Depois de assistir esse vídeo comecei a compreender como fazer a depuração usando o ambiente DevTool, que inclusive me permiti escrever um &lt;a href=&quot;http://profdouglas.blogspot.com.br/2014/08/o-que-aprendi-com-programacao-hoje-dia-3.html&quot;&gt;post sobre ele aqui [dia 3]&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://profdouglas.blogspot.com/2014/09/o-que-aprendi-com-programacao-hoje-dia_12.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-2856927919475774700</guid><pubDate>Tue, 09 Sep 2014 11:07:00 +0000</pubDate><atom:updated>2014-09-10T07:18:54.179-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">css</category><category domain="http://www.blogger.com/atom/ns#">example</category><category domain="http://www.blogger.com/atom/ns#">experiência</category><category domain="http://www.blogger.com/atom/ns#">html 5</category><category domain="http://www.blogger.com/atom/ns#">internacionalização</category><category domain="http://www.blogger.com/atom/ns#">Internationalization</category><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">localization</category><category domain="http://www.blogger.com/atom/ns#">localização</category><category domain="http://www.blogger.com/atom/ns#">node.js</category><category domain="http://www.blogger.com/atom/ns#">relato</category><title>O que aprendi com a programação hoje: dia 8 - internacionalização em Javascript</title><description>&lt;span style=&quot;background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20.7900009155273px;&quot;&gt;Esse post faz parte de uma série: o que aprendi com a programação, e tudo&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://profdouglas.blogspot.com.br/2014/08/o-que-aprendi-com-programacao-hoje-dia-1.html&quot; style=&quot;background-color: white; color: #771000; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20.7900009155273px; text-decoration: none;&quot; target=&quot;_blank&quot;&gt;começou no dia 1&lt;/a&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20.7900009155273px;&quot;&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: white; font-family: Verdana, Helvetica, sans-serif; font-size: 16px; line-height: 24px;&quot;&gt;&lt;b&gt;&lt;i&gt;2/4/95&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Você consegue distinguir o formato de data acima? Não se sabe ao certo se o 2 indica o dia e o 4 o mês, pois poderia ser o contrário (&lt;span style=&quot;background-color: white; font-family: Verdana, Helvetica, sans-serif; font-size: 16px; line-height: 24px;&quot;&gt;1995-04-02 ou 1995-02-04&lt;/span&gt;). Sabe-se, no entanto que é um padrão de formato de data usado e aceito tanto nos EUA como na Inglaterra.&amp;nbsp;Segundo&amp;nbsp;&lt;a href=&quot;http://www.cl.cam.ac.uk/~mgk25/iso-time.html&quot; target=&quot;_blank&quot;&gt;destaca esse post&lt;/a&gt;, há pelo menos 6 possíveis interpretações.&amp;nbsp;Mas agora veja o formato abaixo, será que o mesmo é familiar para você?&lt;br /&gt;
&lt;br /&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: right; text-align: right;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz8RnbqegQ_IwIvzb53OWlpIzZlD5hbKApjWdolIhL1CpIxIjj_HMv69lkDCfH6yQGO-omxLTWbqKkHzLqycUtDccfyrf-WjmAMbMrGQdXpHzhOMnCOQ0ojR5yGOebcNLu6Bu4U_wQlBbD/s1600/Captura+de+tela+2014-09-09+08.04.55.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz8RnbqegQ_IwIvzb53OWlpIzZlD5hbKApjWdolIhL1CpIxIjj_HMv69lkDCfH6yQGO-omxLTWbqKkHzLqycUtDccfyrf-WjmAMbMrGQdXpHzhOMnCOQ0ojR5yGOebcNLu6Bu4U_wQlBbD/s1600/Captura+de+tela+2014-09-09+08.04.55.png&quot; height=&quot;200&quot; width=&quot;198&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;globalização do software (&lt;a href=&quot;http://blog.qs-asia.com/wp-content/uploads/2014/06/flags.jpg&quot;&gt;fonte da imagem&lt;/a&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;b style=&quot;font-family: Verdana, Helvetica, sans-serif; font-size: 16px; line-height: 24px;&quot;&gt;&lt;i&gt;09/09/2014&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Provavelmente você terá condição de entender melhor, &lt;a href=&quot;http://www.ehow.com.br/maneiras-escrever-data-diferentes-paises-info_283002/&quot; target=&quot;_blank&quot;&gt;o formato de data&lt;/a&gt; que é mais familiar para você ou aquele que você já conhece. O formato de datas possui diversas representações universais, mas dependendo do país que o pratique, haverá maior familiaridade e facilidade de identificação de sua parte. A mesma coisa ocorre com os usuário do mundo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Por que esses formatos são relevantes e qual a relação com a programação?&lt;/b&gt;&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Quando estamos querendo popularizar nosso site ou nosso aplicativo, qual será a sua abrangência desejada? Será global ou continental, regional ou talvez local? Em qual país pretende disponibiliza-lo? &amp;nbsp;&lt;/blockquote&gt;
Essas são apenas algumas das perguntas que terás que responder se desejar publicar um site ou aplicativo universal, no qual temos que levar em consideração o lugar, a cultura, os padrões estabelecidos do idioma do usuário. &amp;nbsp;&lt;span style=&quot;background-color: yellow;&quot;&gt;Dependendo das suas respostas e de como decidir representar as informações, terás que traduzir os termos e textos contidos para mais de um idioma.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Haverá preocupação também com a moeda local, da representação do dinheiro, além do seu formato de datas considerando onde o usuário está agora, ou seja, a sua localização geográfica. Essa preocupação de representar a informação &quot;correta&quot;, dependendo do idioma preferido do usuário, é uma das preocupações mais relevantes para um aplicativo que deseja ser global. Trata-se da tradução e da localização dos dados, e chamamos esse tratamento e implementação de: internacionalização.&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrcbN-yYd4tS0yrBb9ztWuH51Grv7n-1riyAUI8rCjUaZctGd6P3e_DD8vPTdizKnXHwZ_Ts3wymx7dQNCE_ALqEWDfQH515tzU9diIwXmunW8j3nzcZDgSP5NCmft3P9geH2LhiWwvowR/s1600/Captura+de+tela+2014-09-09+07.28.22.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrcbN-yYd4tS0yrBb9ztWuH51Grv7n-1riyAUI8rCjUaZctGd6P3e_DD8vPTdizKnXHwZ_Ts3wymx7dQNCE_ALqEWDfQH515tzU9diIwXmunW8j3nzcZDgSP5NCmft3P9geH2LhiWwvowR/s1600/Captura+de+tela+2014-09-09+07.28.22.png&quot; height=&quot;323&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Processo de Internacionalização e localização (&lt;a href=&quot;http://www.wikiwand.com/en/Internationalization_and_localization&quot; target=&quot;_blank&quot;&gt;fonte Wikipédia&lt;/a&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
O processo de internacionalização pode ser feito com qualquer software e linguagens modernas, preparando e definindo diversos arquivos de dados para cada idioma pretendido. Geralmente, damos suporte para &lt;a href=&quot;http://pt.wikipedia.org/wiki/Anexo:Lista_de_l%C3%ADnguas_por_total_de_falantes&quot; target=&quot;_blank&quot;&gt;idiomas mais falados no mundo&lt;/a&gt;: Inglês, Espanhol, Mandarim e o idioma nativo da equipe envolvida na produção do software. Mas isso depende sempre da demanda do projeto do cliente, da equipe envolvida e da natureza do que se está fazendo. Além disso, &lt;span style=&quot;background-color: yellow;&quot;&gt;não estou dizendo que é fácil de fazer, uma vez que traduzir conteúdo de qualidade consome esforço que deve ser considerado&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
Em projetos com Android e iOS já existem formas padronizadas pelas tecnologias para usar a internacionalização. Basta seguir os procedimentos indicados e que estão detalhados na documentação de ambas. Essas padronizações, favorecem o impacto do esforço envolvido no que tange a codificação dos dados, mas não diminui o esforço de tradução.&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Um bom tradutor pode valer mais do que um Google Translate? Essa discussão está fora de questão para o meu blog. :) Mas fique &quot;esperto&quot; sobre isso!&amp;nbsp;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;b&gt;Como fazer a internacionalização em um projeto Web que utiliza a linguagem Javascript, HTML 5 e CSS?&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Existem várias bibliotecas disponíveis em Javascript e que podem ser usadas. &lt;a href=&quot;http://stackoverflow.com/questions/9640630/javascript-i18n-internationalization-frameworks-libraries-for-client-side-use&quot; target=&quot;_blank&quot;&gt;Veja essa discussão no Stackoverflow.com&lt;/a&gt; sobre isso.&lt;br /&gt;
&lt;br /&gt;
Em nosso projeto experimentamos utilizar a biblioteca chamada &lt;a href=&quot;http://i18next.com/&quot; target=&quot;_blank&quot;&gt;i18Next&lt;/a&gt;, e após um pouco de estudo, achamos interessante utilizá-la primeiramente porque é simples, em segundo porque possui integração com outra biblioteca que já estamos utilizando, a conhecida &lt;a href=&quot;http://jquery.com/&quot; target=&quot;_blank&quot;&gt;jQuery&lt;/a&gt;. E em terceiro lugar, podemos criar mais de um arquivo de tradução usando o formato de dados &lt;a href=&quot;http://www.wikiwand.com/pt/JSON&quot; target=&quot;_blank&quot;&gt;JSON&lt;/a&gt;, um arquivo para cada idioma de tradução.&lt;br /&gt;
&lt;br /&gt;
Dessa forma, vamos entender como usar essa biblioteca. Baixe as seguintes bibliotecas i18Next e jQuery, depois poderá referenciá-las no seu código HTML. Abaixo, veja o código HTML que demonstra uso de internacionalização preparado para esse post (no final do post coloquei o link para baixar o exemplo completo):&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: html&quot;&gt;&lt;html&gt;
&lt;head&gt;

&lt;title&gt;Insert title here&lt;/title&gt;
&lt;script src=&quot;./js/jquery-1.11.1.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;./js/i18next.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;./js/internalizacao.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;h2&gt;
&lt;span data-i18n=&quot;goal&quot;&gt;&lt;/span&gt; : &lt;span data-i18n=&quot;app.name&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
termos específicos:
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;coming&lt;/b&gt;: &lt;span data-i18n=&quot;coming&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;completed&lt;/b&gt;: &lt;span data-i18n=&quot;completed&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;congratulations&lt;/b&gt;: &lt;span data-i18n=&quot;congratulations&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
termos comuns:
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;key1&lt;/b&gt;: &lt;span data-i18n=&quot;key1&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;key2&lt;/b&gt;: &lt;span data-i18n=&quot;key2&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;

&lt;/pre&gt;
&lt;br /&gt;
Agora que já declaramos nossas dependências na tag &lt;i&gt;&lt;head&gt;...&lt;/head&gt;&lt;/i&gt;, podemos ver o código que utiliza a tag (&lt;b&gt;&lt;i&gt;data-i18n=&quot;chave&quot;&lt;/i&gt;&lt;/b&gt;), que permite usar o valor associado à chave e descrito dos arquivos de tradução. Já o código abaixo utiliza uma estrutura Javascript criada para representar o uso da biblioteca i18Next:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt;/*global i18n */

var Internacionalizacao = {

 LANGUAGES_AVAILABLE : [ &#39;en-US&#39;, &#39;pt-BR&#39; ],

 /*
  * Inicializa arquivo de traducao de acordo com a lib i18Next.
  * Veja mais detalhes aqui: 
  */
 init : function() {
  var language = Internacionalizacao.getLanguage();

  // detecta a lingua do browser e se nao tiver a desejada, setamos uma default
  if (!(Internacionalizacao.LANGUAGES_AVAILABLE.indexOf(language) &amp;gt; -1)) {
   language = Internacionalizacao.LANGUAGES_AVAILABLE[0]; // default en-US
  }


  i18n.init({
   lng : language,
   load : &#39;current&#39;
  }, function(t) {
   Internacionalizacao.translateElements(t);
  });
 },

 /* 
  * Detecta a linguagem atual do browser do usuario
  * @return linguagem atual, exemplo: pt-BR, en-US... 
  */
 getLanguage : function() {
  var userLang = navigator.language || navigator.userLanguage;
  return userLang;
 },

 /*
  * Funcao que traduz todos os elementos que possuem data-i18n e substitui 
  * pela traduz contida em sua chave. 
  * 
  * O arquivo deve estar em &lt;locales sua_pasta_idioma=&quot;&quot;&gt;/arquivo_traducao.json&amp;gt;.
  */
 translateElements : function(t) {
  var elements, element;

  elements = document.querySelectorAll(&#39;[data-i18n]&#39;);

  for (var index = 0; index &amp;lt; elements.length; index++) {
   element = elements[index];
   element.innerHTML = t(element.getAttribute(&#39;data-i18n&#39;));
  }
 }
};

// inicializar biblioteca de traducao i18Next durante o load da página
Internacionalizacao.init();

&lt;/locales&gt;&lt;/pre&gt;
&lt;br /&gt;
Esse código foi criado com o nome &lt;b&gt;&lt;i&gt;internacionalizacao.js&lt;/i&gt;&lt;/b&gt; com o objetivo de parametrizar as configurações da biblioteca i18Next. Existem várias opções disponíveis. Veja mais detalhes no site do &lt;a href=&quot;http://i18next.com/pages/doc_init.html&quot; target=&quot;_blank&quot;&gt;desenvolvedor aqui&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Por fim, teremos 4 pastas com conteúdos semelhantes a estrutura do arquivo a seguir. Cada pasta, representa um idioma suportado usando um padrão de nomes internacional para representar um idioma_país (ex. pt-BR (português do Brasil), en-US (inglês norte americano), es (espanhol), dev (padrão e comum para o aplicativo como um todo)). Sendo que o &quot;dev&quot; representa neste caso, palavras em comum para qualquer idioma.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt;{
  &quot;coming&quot;: &quot;Em breve teremos novos desafios a ...&quot;,
  &quot;completed&quot;: &quot;Você completou todos os desafios!&quot;,
  &quot;congratulations&quot;: &quot;Parabéns!&quot;,
  &quot;goal&quot;: &quot;Objetivo&quot;
}

&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Rodando em alguns Browsers, por que nem todos funcionam?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
A primeira coisa que demorei a compreender tem haver com a pergunta acima. Os exemplos que estava utilizando não pareciam funcionar. As mensagens de logs que a tela de inspeção de elementos (Debugging) [&lt;a href=&quot;http://profdouglas.blogspot.com.br/2014/08/o-que-aprendi-com-programacao-hoje-dia-3.html&quot; target=&quot;_blank&quot;&gt;veja o post do dia 3 para mais detalhe&lt;/a&gt;], usando a view de Console, não me permitiram entender o que estava acontecendo. Pior ainda, me levando a crer que eu estava fazendo alguma coisa errada no código ou no uso da biblioteca i18Next. Tentei outras bibliotecas também. Acho que no total, foram umas 8 horas de pesquisas e testes.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Após ler uma dica do desenvolvedor do i18Next, sugerindo que testasse o exemplo do seu site no browser Firefox, me dei conta que eu estava testando apenas no Chrome. Então percebi que o Chrome possui validações de segurança para impedir que códigos maliciosos possam danificar o sistema operacional. Assim, &lt;span style=&quot;background-color: yellow;&quot;&gt;por padrão alguns códigos não tem permissão de rodarem&lt;/span&gt;. A menos que usemos um server side instalado em nossa máquina, como &lt;a href=&quot;http://www.apache.org/&quot; target=&quot;_blank&quot;&gt;Apache&lt;/a&gt;, &lt;a href=&quot;http://nodejs.org/&quot;&gt;node.js&lt;/a&gt;, etc. Neste caso, o browser roda sem problemas.&lt;/blockquote&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyfrvZ04yMrNKKhYxR1CmdZHvm3pXQYdbyIpfJjjb_Ka8NF4wd0uphKRl6yPqWdhOHPWtcAMyPWpixxuSlZLluJR12yY75uI5eyLNtqRom-ZSIpz8eyFNEQLpFbuF-970OzDffFSEoYxkA/s1600/Firefox.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyfrvZ04yMrNKKhYxR1CmdZHvm3pXQYdbyIpfJjjb_Ka8NF4wd0uphKRl6yPqWdhOHPWtcAMyPWpixxuSlZLluJR12yY75uI5eyLNtqRom-ZSIpz8eyFNEQLpFbuF-970OzDffFSEoYxkA/s1600/Firefox.png&quot; height=&quot;290&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Rodando no browser Firefox&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
A imagem acima mostra como o Browser exibe o nosso pequeno exemplo. Veja que no Firefox (acima), o resultado esperado está certo, enquanto que o Chrome (abaixo), não funciona pelo motivo explicado anteriormente.&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr8qNrgCvJ66V1-hdNU5dnUAdf7s2bwAWSv3iOLcbMxioHfdfnDT_RDKjYv4-9CjIKrutZoVIn3zTGkWRT9gO1LeNZ44ftgDfrx6tT0ZomOVWFC8TnTMW5EoiqJDFUh-PX9Ljxg6FG1iu2/s1600/Chrome.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr8qNrgCvJ66V1-hdNU5dnUAdf7s2bwAWSv3iOLcbMxioHfdfnDT_RDKjYv4-9CjIKrutZoVIn3zTGkWRT9gO1LeNZ44ftgDfrx6tT0ZomOVWFC8TnTMW5EoiqJDFUh-PX9Ljxg6FG1iu2/s1600/Chrome.png&quot; height=&quot;400&quot; width=&quot;370&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Rodando browser Chrome&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
Moral da história: &lt;span style=&quot;background-color: yellow;&quot;&gt;&lt;i&gt;&lt;b&gt;em programação para Web, não use somente um Browser para realizar seus testes. Utilize os mais recentes,&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&amp;nbsp;usando diferentes resoluções de telas. Os principais browsers são ilustrados na imagem abaixo:&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhubBIlbEnRwo0QN1aCtcPmNfsTERxjVx6gSnjDAMu8tbRmmqMEr80JxBeeEaMCQnx4J7sCXbeNYitc-28cCdVvLW-NZcZreA-rSb4cbjch1jypMSeRv98v_-rAJYtWawfsFMc-23fv-SCi/s1600/Captura+de+tela+2014-09-09+07.55.11.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhubBIlbEnRwo0QN1aCtcPmNfsTERxjVx6gSnjDAMu8tbRmmqMEr80JxBeeEaMCQnx4J7sCXbeNYitc-28cCdVvLW-NZcZreA-rSb4cbjch1jypMSeRv98v_-rAJYtWawfsFMc-23fv-SCi/s1600/Captura+de+tela+2014-09-09+07.55.11.png&quot; height=&quot;242&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Browsers (&lt;a href=&quot;https://www.google.com.br/url?sa=i&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=images&amp;amp;cd=&amp;amp;cad=rja&amp;amp;uact=8&amp;amp;docid=bsZhILig08JlhM&amp;amp;tbnid=HynxKqRiC8xArM:&amp;amp;ved=0CAUQjRw&amp;amp;url=http%3A%2F%2Fwww.nofearbridge.co.uk%2Fhelp.php&amp;amp;ei=gtwOVL3hE4XDggT8kIGoDQ&amp;amp;bvm=bv.74649129,d.eXY&amp;amp;psig=AFQjCNHirG0q7KJ9x45LT5iACk8fjpG82w&amp;amp;ust=1410346396059966&quot;&gt;fonte&lt;/a&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
O que aprendi com a programação usando a internacionalização é que podemos tornar nossa aplicação mais globalizada, considerando a região e localização do usuário. Assim, &lt;span style=&quot;background-color: yellow;&quot;&gt;espera-se maior aceitação do aplicativo, além de considerar uma maior abrangência de sua comercialização&lt;/span&gt;, podendo expandir sua distribuição geográfica.&amp;nbsp;&lt;/blockquote&gt;
&lt;br /&gt;
Também aprendi que temos que tomar cuidado com os termos usados na tradução, pois o significado de uma palavra mal traduzida pode expressar outro significado, correndo risco de errar, e no pior caso, cometendo uma grande gafe ou equívoco.&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;A programação com javascript usando internacionalização torna o processo bem mais fácil, mas somente do ponto de vista técnico. Isso não garante conteúdo traduzido de qualidade.&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
Outras estratégias também podem ser usadas para realizar a internacionalização tais como, usar imagens e metáforas visuais para representar significados. Mas isso deve ser ponderado ainda mais, pois se uma imagem vale mil palavras, errar essa representação da imagem pode representar 1000 problemas. Você tem ideia do quanto isso pode lhe custar? Mas isso é um assunto que transcende esse post. Talvez possa ser discutido em outra ocasião.&lt;br /&gt;
&lt;br /&gt;
Se gostou desse post, tiver críticas ou sugestões, ou mesmo se souber de algum material que complemente o assunto discutido aqui, sinta-se encorajado em contribuir, comentando ou compartilhando em sua rede social, expandindo ainda mais nosso papo que não se encerra aqui.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;:)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Os códigos fontes dos exemplos criados para esse post &lt;a href=&quot;https://www.dropbox.com/sh/liaa2kje65kdkxt/AABr7O7E5VhJWqbOeU3IxbiGa?dl=0&quot;&gt;podem ser baixados aqui&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description><link>http://profdouglas.blogspot.com/2014/09/o-que-aprendi-com-programacao-hoje-dia_9.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz8RnbqegQ_IwIvzb53OWlpIzZlD5hbKApjWdolIhL1CpIxIjj_HMv69lkDCfH6yQGO-omxLTWbqKkHzLqycUtDccfyrf-WjmAMbMrGQdXpHzhOMnCOQ0ojR5yGOebcNLu6Bu4U_wQlBbD/s72-c/Captura+de+tela+2014-09-09+08.04.55.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-3185597537938199113</guid><pubDate>Thu, 04 Sep 2014 12:58:00 +0000</pubDate><atom:updated>2014-09-05T07:28:21.572-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">cloud</category><category domain="http://www.blogger.com/atom/ns#">experiência</category><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">parse</category><category domain="http://www.blogger.com/atom/ns#">programação</category><category domain="http://www.blogger.com/atom/ns#">relato</category><category domain="http://www.blogger.com/atom/ns#">SaaS</category><category domain="http://www.blogger.com/atom/ns#">áudio</category><title>O que aprendi com a programação hoje: dia 7 - Parse.com</title><description>&lt;span style=&quot;background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20.7900009155273px;&quot;&gt;Esse post faz parte de uma série: o que aprendi com a programação, e tudo&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://profdouglas.blogspot.com.br/2014/08/o-que-aprendi-com-programacao-hoje-dia-1.html&quot; style=&quot;background-color: white; color: #771000; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20.7900009155273px; text-decoration: none;&quot; target=&quot;_blank&quot;&gt;começou no dia 1&lt;/a&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20.7900009155273px;&quot;&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
A plataforma &lt;a href=&quot;http://parse.com/&quot; target=&quot;_blank&quot;&gt;Parse&lt;/a&gt; fornece uma solução de &lt;a href=&quot;http://www.wikiwand.com/pt/Front-end_e_back-end&quot; target=&quot;_blank&quot;&gt;back-end&lt;/a&gt; completa para o um aplicativo móvel. Segundo a sua documentação, o objetivo do Parse é eliminar totalmente a necessidade de escrever código do servidor ou manutenção de servidores. Hoje vou abordar um pouco sobre essa tecnologia que permitiu validar uma funcionalidade de nosso projeto, no qual, dependia da infraestrutura de &lt;a href=&quot;http://www.wikiwand.com/pt/Server-side&quot; target=&quot;_blank&quot;&gt;server side&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
Para contextualizar, escute o áudio que preparei para que você entenda melhor o contexto da nossa necessidade em questão, pelo qual foi necessário encontrar soluções alternativas como serviços (&lt;a href=&quot;http://www.wikiwand.com/pt/Software_como_servi%C3%A7o&quot; target=&quot;_blank&quot;&gt;SAAS&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;iframe frameborder=&quot;no&quot; height=&quot;166&quot; scrolling=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/166179694&amp;amp;color=ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
A ideia é eliminar a dependência da infraestrutura de servidor para armazenar os dados dos diferentes clientes, que rodam nosso aplicativo em seus celulares. Com o Parse, podemos viabilizar essa estrutura com pouco esforço. O objetivo é minimizar a configuração e rapidamente começar a construir seu aplicativo com JavaScript e HTML5 em Parse.&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4lUANOvM1fbvDE039dT1M_wNmgP5ghdd0gTZBIWw0pZRYFubUWHcBwLCMe6tt9gsyMMxOFymV3DrBqBwIfxJz-kBtPNxV07UhT7dSZsVoDrAuRQF8pry6bG_jOspBrdKZ0yoN4mbuflga/s1600/Captura+de+tela+2014-09-04+07.29.03.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4lUANOvM1fbvDE039dT1M_wNmgP5ghdd0gTZBIWw0pZRYFubUWHcBwLCMe6tt9gsyMMxOFymV3DrBqBwIfxJz-kBtPNxV07UhT7dSZsVoDrAuRQF8pry6bG_jOspBrdKZ0yoN4mbuflga/s1600/Captura+de+tela+2014-09-04+07.29.03.png&quot; height=&quot;352&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Site do &lt;a href=&quot;http://parse.com/&quot;&gt;Parse.com&lt;/a&gt; com tradução Google Translate&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;b&gt;Apps&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Em Parse, você cria um aplicativo para cada um de seus aplicativos móveis. Cada aplicativo tem seu próprio ID e sua chave de cliente JavaScript, assim você poderá usar na sua aplicação web. Sua conta no Parse pode acomodar vários Apps. Isto é útil mesmo se você tiver um aplicativo, uma vez que você pode implantar versões diferentes para teste e produção.&lt;br /&gt;
&lt;br /&gt;
Acesse o site do Parse, crie uma conta e cadastre seu aplicativo. Leia a &lt;a href=&quot;https://parse.com/tutorials&quot; target=&quot;_blank&quot;&gt;documentação&lt;/a&gt; que ele possui para entender melhor.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Dependências&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
O JavaScript SDK do Parse, praticamente não necessita de quaisquer bibliotecas externas. A única exceção é a classe do &lt;i&gt;&lt;b&gt;Parse.View&lt;/b&gt;&lt;/i&gt;, que exige que você forneça &lt;i&gt;jQuery&lt;/i&gt; ou &lt;i&gt;jQuery&lt;/i&gt; compatível &lt;b&gt;$&lt;/b&gt; método.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Modelo de Objetos (Parse.Object)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Armazenamento de dados em Parse é construído em torno &lt;b&gt;Parse.Object&lt;/b&gt;. Cada Parse.Object contém pares de chave-valores de dados JSON-compatíveis. Este dado é sem esquema, o que significa que você não precisa especificar de antemão que existem chaves em cada Parse.Object. Você simplesmente define qualquer pares de chave-valor que você quer, e a infraestrutura do Parse irá armazená-la.&lt;br /&gt;
&lt;br /&gt;
Por exemplo, digamos que você está acompanhando altas pontuações para um jogo. Um único Parse.Object poderia conter:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;pontuacao: 20500, nomeJogador: &quot;Douglas Frari&quot; , faseAtual: 3&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
As chaves devem ser sequências de caracteres alfanuméricos. Os valores podem ser strings, números, boleanos, ou mesmo matrizes e dicionários - qualquer coisa que pode ser JSON codificado.&lt;br /&gt;
&lt;br /&gt;
Cada Parse.Object é uma instância de uma subclasse específica com um nome de classe que você pode usar para distinguir diferentes tipos de dados. Por exemplo, poderíamos chamar a pontuação mais alta como um objeto de nome GameScore. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Salvando objetos&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Vamos dizer que você deseja salvar o GameScore descrito acima para o Parse Cloud. Poderia fazer assim:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt;var GameScore = Parse.Object.extend(&quot;GameScore&quot;);
var gameScore = new GameScore();
 
gameScore.set(&quot;score&quot;, 1337);
gameScore.set(&quot;playerName&quot;, &quot;Sean Plott&quot;);
gameScore.set(&quot;cheatMode&quot;, false);
 
gameScore.save(null, {
  success: function(gameScore) {
    // Execute any logic that should take place after the object is saved.
    alert(&#39;New object created with objectId: &#39; + gameScore.id);
  },
  error: function(gameScore, error) {
    // Execute any logic that should take place if the save fails.
    // error is a Parse.Error with an error code and description.
    alert(&#39;Failed to create new object, with error code: &#39; + error.message);
  }
});

&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Recuperando os dados&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
Pode-se recuperar os objetos usando uma forma simples, porém, com muitas possibilidades para fazer filtros. Veja essa página com dicas: &lt;a href=&quot;https://parse.com/docs/js_guide#objects-retrieving&quot;&gt;https://parse.com/docs/js_guide#objects-retrieving&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt; var GameScore = Parse.Object.extend(&quot;GameScore&quot;);
  query = new Parse.Query(GameScore);
  query.limit(10);
  // Sorts the results in descending order by the score field
  query.descending(&quot;score&quot;);

  query.find({
   success : function(results) {
    console.log(&quot;Successfully retrieved &quot; + results.length
      + &quot; scores.&quot;);
    // Do something with the returned Parse.Object values
    var object, i;

    for (i = 0; i &amp;lt; results.length; i++) {
     object = results[i];
     console.log(object.id + &#39; - &#39;
       + object.get(&quot;playerName&quot;) + &#39;: &#39;
       + object.get(&quot;score&quot;));
    }

   },
   error : function(error) {
    console.log(&quot;Error: &quot; + error.code + &quot; &quot; + error.message);
   }
  });
 
&lt;/pre&gt;
Essa foi a dica do Parse.com, um serviço como alternativa a servidores externos.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;Aprendi que esses serviços estão sendo muito usados por aplicativos móveis em Android e iOS, pois oferecem transparência e simplicidade aos desenvolvedores, reduz custos de desenvolvimento e eliminam a necessidade de manter um servidor externo.&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
Além disso, não há preocupações com a hospedagem e manutenção desse server side. Mas nem tudo são flores. Para serviços externos mais complexos, talvez o Parse não seja tão interessante. Mas isso é tópico para se investigar por demanda em futuros posts. </description><link>http://profdouglas.blogspot.com/2014/09/o-que-aprendi-com-programacao-hoje-dia.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4lUANOvM1fbvDE039dT1M_wNmgP5ghdd0gTZBIWw0pZRYFubUWHcBwLCMe6tt9gsyMMxOFymV3DrBqBwIfxJz-kBtPNxV07UhT7dSZsVoDrAuRQF8pry6bG_jOspBrdKZ0yoN4mbuflga/s72-c/Captura+de+tela+2014-09-04+07.29.03.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-5558124738099638076</guid><pubDate>Wed, 03 Sep 2014 08:00:00 +0000</pubDate><atom:updated>2014-09-10T07:18:30.661-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">aprendizado</category><category domain="http://www.blogger.com/atom/ns#">programação</category><title>O que aprendi com a programação hoje: dia 6 - por que programar?</title><description>&lt;span style=&quot;background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20.7900009155273px;&quot;&gt;Esse post faz parte de uma série: o que aprendi com a programação, e tudo&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://profdouglas.blogspot.com.br/2014/08/o-que-aprendi-com-programacao-hoje-dia-1.html&quot; style=&quot;background-color: white; color: #771000; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20.7900009155273px; text-decoration: none;&quot; target=&quot;_blank&quot;&gt;começou no dia 1&lt;/a&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20.7900009155273px;&quot;&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Hoje vou lembrar um aprendizado antigo, mas que continua me inspirando até hoje: &lt;b&gt;a importância da programação&lt;/b&gt;. Foi após perceber que pela programação, através do seu processo intrínseco de criação, vários estímulos criativos são ativados em nossa mente, desafiando nossa imaginação e nos motivando a decifrar um problema.&lt;br /&gt;
&lt;br /&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: right; margin-left: 1em; text-align: right;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSQ1-AI0MjrmL3v98ujCxy5p2SRBAO6AV1P7yD0lL_ckLiVAK4dpGdU1C9pMJOiHqJ9v8J-wTzPG9rlIdpDS3ZCcoWWIK-DBuiWbdVhw_EdQXAPaYQMZRgycMrzHota28OpQhs5K71g5iS/s1600/Captura+de+tela+2014-09-02+21.57.14.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSQ1-AI0MjrmL3v98ujCxy5p2SRBAO6AV1P7yD0lL_ckLiVAK4dpGdU1C9pMJOiHqJ9v8J-wTzPG9rlIdpDS3ZCcoWWIK-DBuiWbdVhw_EdQXAPaYQMZRgycMrzHota28OpQhs5K71g5iS/s1600/Captura+de+tela+2014-09-02+21.57.14.png&quot; height=&quot;192&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://www.theguardian.com/education/2012/jan/09/computer-science-courses-digital-skills&quot; target=&quot;_blank&quot;&gt;Governo Britânico adota programação no currículo básico&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
O problema em questão é similar a um quebra-cabeças, nos desafia em certa medida, a ponto de tornar esse desafio uma coisa potencialmente promissora de se exercitar. É como praticar um esporte, quanto mais se faz, mais se desperta interesse a medida que ganhamos algo com isso. Na programação se usam muitos neurônios, talvez por isso que o café é&amp;nbsp;&lt;a href=&quot;http://www.mexidodeideias.com.br/index.php/curiosidades/vida-de-programador-o-cafe-e-seus-codigos/&quot; target=&quot;_blank&quot;&gt;bastante popular&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
E se você pensa que isso é papo de programador, o que justifica alguns governos da Europa (&lt;a href=&quot;http://www.theguardian.com/education/2012/jan/09/computer-science-courses-digital-skills&quot; target=&quot;_blank&quot;&gt;britânico por exemplo&lt;/a&gt;), adotarem o ensino da programação tornando-a parte do currículo básico na formação educacional? &lt;a href=&quot;http://www.forbes.com/sites/parmyolson/2012/09/06/why-estonia-has-started-teaching-its-first-graders-to-code/&quot; target=&quot;_blank&quot;&gt;Não é de hoje que isso vem acontecendo&lt;/a&gt;&amp;nbsp;lá na Europa.&lt;br /&gt;
&lt;br /&gt;
Vou mostrar alguns argumentos para tentar justificar a importância e necessidade de usar a programação agora.&lt;br /&gt;
&lt;br /&gt;
O uso dos computadores, celulares e dispositivos eletrônicos em geral estão se tornando cada vez mais populares, pois são utilizados para diversos propósitos, tais como nas áreas do entretenimento, finanças, lazer, comunicação, etc. Os aplicativos assumiram um papel relevante para as pessoas.&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
A demanda por software tem alcançado níveis gigantescos. &lt;b style=&quot;background-color: yellow;&quot;&gt;A área do conhecimento que contribui para agrupar os diferentes níveis do software é a programação.&lt;/b&gt; O profissional programador tem um papel relevante na criação do software e para tal requer conhecimentos de lógica de programação e algoritmos, além de compreender o uso das linguagens de programação.&lt;/blockquote&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
A programação é considerada por especialistas da educação como uma extensão da língua, pois permite ao aprendiz desenvolver o raciocínio de forma sistemática e lógica, motivando a construção de relações com os outros campos do conhecimento humano. Escrever código engaja as pessoas em um novo caminho do pensamento. Elas aprendem a organizar, refinar e refletir sobre suas ideias.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
As habilidades de programação permitem aos alunos &quot;escreverem&quot; novos tipos de &lt;b&gt;&lt;i style=&quot;background-color: yellow;&quot;&gt;coisas/pensamentos/conhecimentos&lt;/i&gt;&lt;/b&gt; - estórias interativas, jogos, animações e simulações. Consequentemente, há cada vez mais demandas da sociedade por pessoas ou profissionais que saibam &quot;mexer&quot;/programar com a criação de software.&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
No processo de aprender a codificar os programas os alunos aprendem muitas outras coisas. Eles não aprendem apenas a codificar, eles estão codificando o aprendizado. Aprendendo matemática e ideias computacionais (como variáveis e condicionais), eles estão aprendendo estratégias para resolver problemas, criando projetos e comunicando ideias. Essas habilidades são uteis não apenas para cientistas da computação, mas para qualquer um, independente da idade, conhecimentos prévios ou ocupação.&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div&gt;
Esses foram apenas alguns dos argumentos que eu posso citar. Imagine quantas pesquisas estão sendo feitas e quanto potencial e demanda existe?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYBXKOYDeRDZcKAaUDgTMn928D_NAu6Vm3dgRgusx-2g1vWKpCQoW-qtf_Ted8IcKNvkGPKPgsf6hmOILGftRzKOw5uRcBfg545_QhI57azC-k4Wmzoo-Ir4LRnmk5JX3Kqzt0w3Pcaj1W/s1600/Captura+de+tela+2014-09-02+21.52.04.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYBXKOYDeRDZcKAaUDgTMn928D_NAu6Vm3dgRgusx-2g1vWKpCQoW-qtf_Ted8IcKNvkGPKPgsf6hmOILGftRzKOw5uRcBfg545_QhI57azC-k4Wmzoo-Ir4LRnmk5JX3Kqzt0w3Pcaj1W/s1600/Captura+de+tela+2014-09-02+21.52.04.png&quot; height=&quot;574&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Uso de linguagens por idade e experiência (&lt;a href=&quot;http://www.wikiwand.com/en/List_of_educational_programming_languages#/Languages_by_age_and_experience&quot; target=&quot;_blank&quot;&gt;fonte&lt;/a&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
Essa &lt;a href=&quot;http://www.wikiwand.com/en/List_of_educational_programming_languages&quot; target=&quot;_blank&quot;&gt;pesquisa&lt;/a&gt; mostra quais as linguagens estão sendo usadas, para quais grades escolares e para qual faixa de idade estão sendo usados para o ensino da programação. Não é legal?&lt;br /&gt;
&lt;br /&gt;
Se você tem ouvidos e olhos, &amp;nbsp;veja com os próprios esses dois vídeos. O primeiro é de um garoto que foi apresentar no &lt;a href=&quot;https://www.ted.com/&quot; target=&quot;_blank&quot;&gt;TED&lt;/a&gt; a sua experiência com a programação. O segundo é um depoimento de Bill Gates sobre coisas que não lhe dizem na escola.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;A importância de aprender a programar&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;360&quot; src=&quot;//www.youtube.com/embed/qW3XT30F0ck&quot; width=&quot;640&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;11 coisas que não se aprende na escola &lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;360&quot; src=&quot;//www.youtube.com/embed/3UnNyfkkvnc&quot; width=&quot;640&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description><link>http://profdouglas.blogspot.com/2014/09/o-que-aprendi-com-programacao-hoje-dia-6.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSQ1-AI0MjrmL3v98ujCxy5p2SRBAO6AV1P7yD0lL_ckLiVAK4dpGdU1C9pMJOiHqJ9v8J-wTzPG9rlIdpDS3ZCcoWWIK-DBuiWbdVhw_EdQXAPaYQMZRgycMrzHota28OpQhs5K71g5iS/s72-c/Captura+de+tela+2014-09-02+21.57.14.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-1904676177300982276</guid><pubDate>Tue, 02 Sep 2014 11:20:00 +0000</pubDate><atom:updated>2014-09-10T07:17:46.299-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">dicas</category><category domain="http://www.blogger.com/atom/ns#">efeitos sonoros</category><category domain="http://www.blogger.com/atom/ns#">experiência</category><category domain="http://www.blogger.com/atom/ns#">html 5</category><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">jogo</category><category domain="http://www.blogger.com/atom/ns#">persistência dados</category><category domain="http://www.blogger.com/atom/ns#">programação</category><category domain="http://www.blogger.com/atom/ns#">relato</category><title>O que aprendi com a programação hoje: dia 5 - persistência em Javascript</title><description>&lt;span style=&quot;background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20.7900009155273px;&quot;&gt;Esse post faz parte de uma série: o que aprendi com a programação, e tudo&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://profdouglas.blogspot.com.br/2014/08/o-que-aprendi-com-programacao-hoje-dia-1.html&quot; style=&quot;background-color: white; color: #771000; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20.7900009155273px; text-decoration: none;&quot; target=&quot;_blank&quot;&gt;começou no dia 1&lt;/a&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20.7900009155273px;&quot;&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Imagine como seria usar um sistema que não guardasse suas informações? Ao tentar acessar seus dados e sempre que você quisesse manipular uma informação, se não estivessem armazenados, você teria que cadastrá-los antes de utilizá-los. Isso seria possível, porém bastaria reiniciar o sistema que haveria necessidade de repetir o processo anterior. Portanto, guardar informações em um sistema, tecnicamente chamada de &lt;b&gt;persistência&lt;/b&gt;, é uma funcionalidade essencial em qualquer programa.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVf4P4buMOSt8G17o8yzTB8A51AfekD5zOeDXPkHRPFrnu1zs0sPQAAV8wICI3g7Aqg-BREb2AHDXOjox8kDQKoSIk8QsPDCVIawqHxhVlbk8hGPQA0RN_a7LYg84SiMibtoTcjqUTyXqz/s1600/Captura+de+tela+2014-09-02+08.15.20.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVf4P4buMOSt8G17o8yzTB8A51AfekD5zOeDXPkHRPFrnu1zs0sPQAAV8wICI3g7Aqg-BREb2AHDXOjox8kDQKoSIk8QsPDCVIawqHxhVlbk8hGPQA0RN_a7LYg84SiMibtoTcjqUTyXqz/s1600/Captura+de+tela+2014-09-02+08.15.20.png&quot; height=&quot;198&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Um dos primeiros tablets que eu me lembro e que foram lançados no mercado, isso se podemos considerá-lo tablet, chamado &lt;i&gt;&lt;a href=&quot;http://www.mochileirodigital.com.br/tudo-sobre-tablets/&quot; target=&quot;_blank&quot;&gt;Palm&lt;/a&gt;&lt;/i&gt;, possuía vários recursos interessantes para sua época, tal como uma caneta, tela com toque, programas de agenda e aplicativos com ênfase em produtividade (tais como notas, calculadora, calendário, ...). No entanto, se a bateria descarregasse, as informações previamente escritas seriam perdidas. (só os primeiros modelos) Não demorou muito para uma solução ser proposta como uma memória externa para permitir manter os dados persistentes. É claro que a experiência mostrou que esse tipo de funcionalidade deve ser integrada de forma transparente aos usuários, ou seja, deve ser utilizado de forma natural, sem que o usuário perceba, assim como você utiliza a sua memória cerebral para guardar informações.&lt;br /&gt;
&lt;br /&gt;
Os programas feitos para internet usando HTML e tecnologias para Web, têm propostos diferentes abordagens para realizar uma forma de persistência. Cada linguagem propõe diferentes mecanismos. Talvez a mais simples e conhecida seja aquela abordagem de HTML, usando os chamados Cookies. Estes são apenas um conjunto de dados agrupados na representação de chave e valor, no qual a chave é uma forma de associar a informação e o valor é a própria informação propriamente dita. Essa informação é gerenciada usando o Browser do usuário e tem sido usado até hoje pela simplicidade. Porém, em termos de segurança podemos questionar o seu uso. &lt;br /&gt;
&lt;br /&gt;
A proposta dos &lt;a href=&quot;http://www.dicas-l.com.br/arquivo/o_que_sao_cookies_e_como_funcionam.php#.VAXa_WRdVuA&quot; target=&quot;_blank&quot;&gt;Cookies&lt;/a&gt; são simplicidade para armazenar e recuperar a informação quando necessário. O grande problema, talvez seja porque se diferentes browsers forem utilizados, em diferentes sistemas operacionais, por diferentes plataformas de hardware, temos uma necessidade de utilizar as linguagens de programação e suas tecnologias de banco de dados. Mas neste caso, para onde vai nossa simplicidade? &lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Neste sentido, o armazenamento de persistência em HTML 5 não se propõe a resolver o problema do parágrafo anterior, mas tornar ainda mais simples a forma que o Cookie propôs, ou seja, manter a possibilidade para registrar dados usando chave e valor. Só que agora, na minha opinião, usando de forma padrão para que todos que desejarem usar HTML utilizem uma maneira em comum de se fazer isso, permitindo maior compatibilidade e reuso.&lt;/blockquote&gt;
&lt;br /&gt;
&lt;b&gt;Em HTML 5 podemos escolher persistir a informação em duas áreas: área de sessão e a área local. &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
A área de sessão mantém os dados salvos em memória RAM enquanto a sessão do navegador estiver ativa. No momento que o Browser é fechado os dados armazenados nesta área serão apagados automaticamente. Na prática os dados irão para o &quot;céu dos computadores&quot;.&lt;br /&gt;
&lt;br /&gt;
Já a área chamada de local, os dados poderão permanecer persistentes após o Browser ser fechado. Isso permite manter e recuperar os dados associadas a chaves específicas. Então se você precisa salvar os dados e recuperá-los quando a sua página é carregada, use essa área, tecnicamente conhecida como localStorage.&lt;br /&gt;
&lt;br /&gt;
Vejamos um exemplo de trecho de código Javascript para fazer a persistência usando um método setar(minhaChave,meuValor):&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt; function set(key, data) {
  if (window.hasOwnProperty(&#39;localStorage&#39;)) {
   window.localStorage.setItem(key, data);
  }
 }

&lt;/pre&gt;
&lt;br /&gt;
A dinâmica dessa verificação é simples. A função &lt;b&gt;&lt;i&gt;set(key,data)&lt;/i&gt;&lt;/b&gt; possui dois parâmetros com a chave desejada e um valor para associar com essa chave. O bloco da condição &lt;i&gt;&lt;b&gt;IF&lt;/b&gt;&lt;/i&gt; verifica se o atual usuário já possui a área de local disponível para ser utilizada. Caso afirmativo, podemos usar o atributo do objeto window.localStorage invocando a função &lt;b&gt;&lt;i&gt;setItem&lt;/i&gt;&lt;/b&gt;(...).&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt; function get(key) {
  if (window.hasOwnProperty(&#39;localStorage&#39;)) {
   return window.localStorage.getItem(key);
  }
 },

&lt;/pre&gt;
&lt;br /&gt;
A forma para recuperar a informação é ainda mais simples. Só precisamos saber qual a chave que contém os dados associados com a chave apropriada. O cuidado aqui é criar chaves específicas para informações específicas. Evite nomes de chaves complicados ou com caracteres especiais. Pense em um nome de variável para renomear suas chaves.&lt;br /&gt;
&lt;br /&gt;
Uma estrutura que achamos interessante utilizar e poderia ser usado através de um arquivo Javascript chamado &lt;b&gt;persistencia.js&lt;/b&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt;var Persistencia = {

 property : &#39;localStorage&#39;,

 set : function(key, data) {
  if (window.hasOwnProperty(Persistencia.property)) {
   window.localStorage.setItem(key, data);
  }
 },

 setHash : function(key, data) {
  Persistencia.set(key, JSON.stringify(data));
 },

 get : function(key) {
  if (window.hasOwnProperty(Persistencia.property)) {
   return window.localStorage.getItem(key);
  }
 },

 getHash : function(key) {
  var data = Persistencia.get(key);

  if (data) {
   return JSON.parse(data);
  }
 },

 remove : function(key) {
  if (window.hasOwnProperty(Persistencia.property)) {
   window.localStorage.removeItem(key);
  }
 },

 clear : function() {
  if (window.hasOwnProperty(Persistencia.property)) {
   if (localStorage.length &amp;gt; 0) {
    localStorage.clear();
    console.log(&quot;clear function&quot;);
   }
  }
 }

};



&lt;/pre&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: right; margin-left: 1em; text-align: right;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7DgHVPefdPEZJaqNzgnZrmpgJqx9ygOmrMrHT6cKagPJUwv1kkMDOEwt3i2Cp-87JPrChOL6lrs6yzb52pOVtnYUvGlVv-UYL6w6PtOP8mdTlWCtlU5tm4TLk24_tYwATlwcj8TehJFFP/s1600/Captura+de+tela+2014-09-02+08.08.32.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7DgHVPefdPEZJaqNzgnZrmpgJqx9ygOmrMrHT6cKagPJUwv1kkMDOEwt3i2Cp-87JPrChOL6lrs6yzb52pOVtnYUvGlVv-UYL6w6PtOP8mdTlWCtlU5tm4TLk24_tYwATlwcj8TehJFFP/s1600/Captura+de+tela+2014-09-02+08.08.32.png&quot; height=&quot;320&quot; width=&quot;186&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Implementação da persistência&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Que tal um pouco de prática?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Vamos complementar nosso exemplo de animação anterior e adicionar uma informação de forma persistente. Contar a quantidade de cliques na tela e manter essa informação persistente na área local. Assim, no momento que acessar o HTML da animação do nosso exemplo, a última atualização realizada deverá ser exibida na tela. Caso desejar resetar o valor atualmente persistente, pode utilizar o comando abaixo usando a ferramenta DevTools, na área de Console:&lt;br /&gt;
&lt;br /&gt;
localStorage.clear();&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://www.dropbox.com/sh/z6bvk931bf392sa/AACtIQ4j9c6rMPI3orbsx3Yga?dl=0&quot; target=&quot;_blank&quot;&gt;Para baixar todos os arquivos com seus códigos fontes acesse aqui&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
A imagem ao lado demonstra a execução do arquivo Bola.html que pode ser baixado, junto com os demais arquivos, no link indicado acima.&lt;br /&gt;
&lt;br /&gt;
Se você tiver alguma sugestão de tópico, sugestão ou crítica, fique a vontade para comentar ou solicitar aqui. </description><link>http://profdouglas.blogspot.com/2014/09/o-que-aprendi-com-programacao-hoje-dia-5.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVf4P4buMOSt8G17o8yzTB8A51AfekD5zOeDXPkHRPFrnu1zs0sPQAAV8wICI3g7Aqg-BREb2AHDXOjox8kDQKoSIk8QsPDCVIawqHxhVlbk8hGPQA0RN_a7LYg84SiMibtoTcjqUTyXqz/s72-c/Captura+de+tela+2014-09-02+08.15.20.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-6997547892920809752</guid><pubDate>Mon, 01 Sep 2014 09:00:00 +0000</pubDate><atom:updated>2014-09-10T07:17:13.692-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">animação</category><category domain="http://www.blogger.com/atom/ns#">API</category><category domain="http://www.blogger.com/atom/ns#">código</category><category domain="http://www.blogger.com/atom/ns#">HTML</category><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">programação</category><category domain="http://www.blogger.com/atom/ns#">práticas</category><category domain="http://www.blogger.com/atom/ns#">sons</category><title>O que aprendi com a programação hoje: dia 4 - sons em Javascript</title><description>&lt;span style=&quot;background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20.7900009155273px;&quot;&gt;Esse post faz parte de uma série: o que aprendi com a programação, e tudo&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://profdouglas.blogspot.com.br/2014/08/o-que-aprendi-com-programacao-hoje-dia-1.html&quot; style=&quot;background-color: white; color: #771000; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20.7900009155273px; text-decoration: none;&quot; target=&quot;_blank&quot;&gt;começou no dia 1&lt;/a&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20.7900009155273px;&quot;&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Se você está fazendo um jogo ou pretende fazê-lo, ou simplesmente está com curiosidade em saber do que se trata, considere compreender como adicionar efeitos sonoros no seu aplicativo ou game, pois a experiência do usuário fica bem melhor. Neste pequeno post vou mostrar como usar os sons, pois com a linguagem Javascript, tudo fica super simples.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuvlc4WTV-UxiuUjkVj4yYfglKnV0c3F5k-hzOUt8FRmpJWWxtcqZhIu6YnKp3gjev-_FK2zzy-TtA5ju1v_McZolCLIILPh3FDLsDLM013RFhwqboqCtzV_E_95uZzmSKovFjoe6v8cBK/s1600/Captura+de+tela+2014-08-31+23.24.38.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;2&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuvlc4WTV-UxiuUjkVj4yYfglKnV0c3F5k-hzOUt8FRmpJWWxtcqZhIu6YnKp3gjev-_FK2zzy-TtA5ju1v_McZolCLIILPh3FDLsDLM013RFhwqboqCtzV_E_95uZzmSKovFjoe6v8cBK/s1600/Captura+de+tela+2014-08-31+23.24.38.png&quot; height=&quot;237&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Para tocar uma música ou som, você precisa ter um código Javascript que rode algo como isso:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt;var audio = new Audio(&#39;audio.mp3&#39;);
audio.play();

&lt;/pre&gt;
&lt;br /&gt;
Considerando o exemplo publicado no &lt;a href=&quot;http://profdouglas.blogspot.com.br/2014/08/o-que-aprendi-com-programacao-hoje-dia-2.html&quot; target=&quot;_blank&quot;&gt;post do dia 2&lt;/a&gt;, sobre animação, que tal adicionar uns efeitos para entender como se faz na prática? Podemos adicionar um tema musical, no qual ficará sempre tocando, além de alguns efeitos sonoros de acordo com o desejado. Neste caso vou demonstrar o efeito de um click na tela, que junto animação da bola, vai tocar efeito sonoro a cada click.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt;var Sound = {

 init : function() {
  Sound.audio = new Audio(&#39;main_theme.mp3&#39;);
  Sound.audio.loop = true;
  Sound.play();
 },

 play : function() {
   Sound.audio.play();
 },

 resetAndPlay : function() {
  Sound.audio.currentTime = 6;
  Sound.play();
 },

 pause : function() {
  Sound.audio.pause();
 },

 playSound : function(sound) {
   var audioFile, audio;
   audioFile = sound;
   audio = new Audio(audioFile);
   audio.play();
 },

 playClick : function() {
  var audio = &quot;smb_kick.wav&quot;;
  Sound.playSound(audio);
 },

 gameOver : function() {
  Sound.pause();
  var audio = &quot;smb_gameover.wav&quot;;
  Sound.playSound(audio);
 },

};

Sound.init();


&lt;/pre&gt;
&lt;br /&gt;
O código é relativamente simples. Em Javascript temos o objeto Audio, e neste temos alguns controles padrões, tais como: loop do áudio e currentTime. O loop podemos configurar para tornar a música repetitiva quando ela acabar. Enquanto que em currentTime podemos configurar para a música começar a partir de um determinado intervalo de tempo.&lt;br /&gt;
&lt;br /&gt;
Podemos criar funções para tocar ou pausar os sons específicos. Vários formatos de arquivos são suportados pelo Browser. Eu já testei com MP3, WAV e OGG. Todos funcionaram. É importante destacar que se uma música está em execução, e você desejar tocar outra, basta chamá-la que o novo som vai tocar em paralelo com o atual. Se desejar parar ou pausar a música atual, pode chamar o método pausar. Para estudar melhor sobre sons em Javascript de uma olhada&amp;nbsp;&lt;a href=&quot;http://goldfirestudios.com/blog/104/howler.js-Modern-Web-Audio-Javascript-Library&quot; target=&quot;_blank&quot;&gt;neste link&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Vejamos como o jogo principal foi atualizado para possuir as chamadas do sound.js pelo arquivo bola.js:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt;var Animacao = {
 // variaveis globais
 CANVAS : null,
 CONTEXT : null,
 bola : null,
 emProcessoAnimacao : false,
 contadorAnimacao : 0,

 // inicializa a Animacao
 init : function() {
  // variaveis de canvas
  Animacao.CANVAS = document.querySelector(&quot;.canvas&quot;);
  Animacao.CONTEXT = Animacao.CANVAS.getContext(&quot;2d&quot;);

  // registra eventos
  Animacao.addEventListeners();


  bola = new Bola(0,0);
  bola.init();

  setTimeout(Animacao.pintar,100);


 },

 // limpa a tela
 clearCanvas : function() {
  Animacao.CONTEXT.clearRect(0, 0, Animacao.CANVAS.width, Animacao.CANVAS.height);
 },

 // registra eventos
 addEventListeners : function() {
  Animacao.CANVAS.addEventListener(&quot;click&quot;, Animacao.clickAnimacaoHandler);
 },

 clickAnimacaoHandler : function(e) {

  Animacao.emProcessoAnimacao = true;

  // SOM de click
  Sound.playClick();

  Animacao.pintar();
 },

 pintar : function() {

  // desenha a Animacao aqui
  Animacao.clearCanvas();

  // atualizar posicao e pintar objeto
  bola.update();
  bola.draw();


  // se objeto saiu da tela
  if (bola.y &amp;gt; Animacao.CANVAS.height) {

   console.log(&quot;Animacao saiu da tela -&amp;gt; gameOver&quot;);

   bola.y = 0;
   bola.draw();

   // SOM de game over

   Sound.gameOver();
   setTimeout(Sound.resetAndPlay,4000);
  }

  // chamar novamente o metodo (pelo menos 5 vezes)
  if (Animacao.emProcessoAnimacao) {

    Animacao.contadorAnimacao++;

    if (Animacao.contadorAnimacao &amp;gt;= 5) {
     Animacao.contadorAnimacao = 0;
     Animacao.emProcessoAnimacao = false;

    } else {

     // repintar a tela novamente
     requestAnimationFrame(Animacao.pintar);
    }
  }
 },

};


function Sprite(image) {
 this.image = new Image();
 this.image.src = image + &quot;.jpg&quot;;

 this.draw = function(x, y) {
  Animacao.CONTEXT.drawImage(this.image, x, y);
 };
}

function Bola(x, y) {
 this.x = x;
 this.y = y;
 this.clicked = false;
 this.sprite;

 this.init = function() {
  this.sprite = new Sprite(&quot;bola&quot;);
 };

 this.update = function() {

  this.y += (this.sprite.image.height/10);

 };

 this.draw = function() {
  this.sprite.draw(this.x, this.y);
 };

 this.click = function() {
  this.clicked = true;
  this.draw();
 };

 this.animate = function() {
  this.type.sprite.animate();
 };

}


// o javascript vai carregar esse metodo a cada refresh no browser
window.onload = Animacao.init;


&lt;/pre&gt;
&lt;br /&gt;
Baixei alguns sons prontos que encontrei em uma busca na internet. No entanto, tenha cuidado para não sair copiando da internet qualquer som que você achar legal, pois há licenças proibitivas (copyrights), e que podem não estarem autorizados pelos detentores da propriedade intelectual. Para fins de testes, eu copiei as músicas do &lt;a href=&quot;http://themushroomkingdom.net/media/smb/wav&quot; target=&quot;_blank&quot;&gt;Mário neste site&lt;/a&gt;.&amp;nbsp;Se desejar publicar, recomendo utilizar sons de domínio público ou produzir seus próprios. &lt;br /&gt;
&lt;br /&gt;
Um detalhe importante: se deseja fazer diferentes partes do código Javascript chamarem os sons específicos, garanta que o arquivo sound.js seja declarado no HTML antes dos demais Javascripts para que sejam reconhecidos.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: html&quot;&gt;&lt;html&gt;
&lt;head&gt;
 
 &lt;title&gt;Bola&lt;/title&gt;
&lt;/head&gt;

&lt;body class=&quot;gameScreen&quot;&gt;
 &lt;header&gt;
 &lt;h2&gt;
início&lt;/h2&gt;
&lt;/header&gt;

 &lt;canvas class=&quot;canvas&quot; height=&quot;500&quot; id=&quot;gameCanvasScreen&quot; width=&quot;500&quot;&gt;
        This browser is not supported
    &lt;/canvas&gt;

 &lt;footer&gt;
  &lt;h2&gt;
fim&lt;/h2&gt;
&lt;/footer&gt;


 &lt;script src=&quot;./sound.js&quot;&gt;&lt;/script&gt;
 &lt;script src=&quot;./bola.js&quot;&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;


&lt;/pre&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Aprendi com a programação para tratamento de sons usando Javascript que é muito simples de usá-los. Percebi também que o mais difícil não é fazê-los tocarem, mas encontrar um som de nosso agrado. O ideal seria produzir os próprios sons. Mas isso também envolve um custo adicional.&amp;nbsp;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;a href=&quot;https://www.dropbox.com/sh/gbs9rdzsj622b6l/AACZM5GBW0j-gEh-SDZYy5bra?dl=0&quot; target=&quot;_blank&quot;&gt;Para baixar todos os arquivos com seus códigos fontes acesse aqui&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Que tal usar persistência em Javascript/HTML 5. De forma simples poderemos salvar dados do usuário e tornar nosso aplicativo bem mais &quot;inteligente&quot;. No próximo post vou tentar explicar como gravar dados.&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://profdouglas.blogspot.com/2014/09/o-que-aprendi-com-programacao-hoje-dia-4.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuvlc4WTV-UxiuUjkVj4yYfglKnV0c3F5k-hzOUt8FRmpJWWxtcqZhIu6YnKp3gjev-_FK2zzy-TtA5ju1v_McZolCLIILPh3FDLsDLM013RFhwqboqCtzV_E_95uZzmSKovFjoe6v8cBK/s72-c/Captura+de+tela+2014-08-31+23.24.38.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-4194864725997712942</guid><pubDate>Sat, 30 Aug 2014 13:41:00 +0000</pubDate><atom:updated>2014-09-10T07:16:54.824-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">browser</category><category domain="http://www.blogger.com/atom/ns#">chrome</category><category domain="http://www.blogger.com/atom/ns#">debug</category><category domain="http://www.blogger.com/atom/ns#">debugging</category><category domain="http://www.blogger.com/atom/ns#">devtools</category><category domain="http://www.blogger.com/atom/ns#">dicas</category><category domain="http://www.blogger.com/atom/ns#">ferramentas</category><category domain="http://www.blogger.com/atom/ns#">firefox</category><category domain="http://www.blogger.com/atom/ns#">javascript</category><title>O que aprendi com a programação hoje: dia 3 - DevTools</title><description>Esse post faz parte de uma série: o que aprendi com a programação, e tudo &lt;a href=&quot;http://profdouglas.blogspot.com.br/2014/08/o-que-aprendi-com-programacao-hoje-dia-1.html&quot; target=&quot;_blank&quot;&gt;começou no dia 1&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Sabem o que mais fiquei surpreso com Javascript? Ao preparar os ambientes de desenvolvimento para realizar a execução dos testes, percebi o quanto os navegadores de internet evoluíram. Pois é, você deve estar se perguntando: quanto tempo esse cara não se informa sobre as tendências de desenvolvimento Web? Foram pelo menos 10 anos sem me preocupar com Javascript. Mas antes tarde que nunca, não é mesmo? :)&lt;br /&gt;
&lt;br /&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: right; margin-left: 1em; text-align: right;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjojOR1DOOf8W0Vrc0JoRdx0Yq980FXSRGLJyBe2WNv6T302sVntmqLvmUTKT1EDxPweO20jUEFW91LWRCn-F1b5VycHIlMaOl0j9i86bg2wdsSNThYP8hnOnwDhS2TWL-rfgBKapE_SBIy/s1600/tirinha354.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjojOR1DOOf8W0Vrc0JoRdx0Yq980FXSRGLJyBe2WNv6T302sVntmqLvmUTKT1EDxPweO20jUEFW91LWRCn-F1b5VycHIlMaOl0j9i86bg2wdsSNThYP8hnOnwDhS2TWL-rfgBKapE_SBIy/s1600/tirinha354.png&quot; height=&quot;320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://vidadeprogramador.com.br/2011/11/23/breakpoint/&quot; target=&quot;_blank&quot;&gt;Copyright&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Com advento dos novos recursos da especificação do &lt;a href=&quot;http://www.wikiwand.com/pt/HTML5&quot; target=&quot;_blank&quot;&gt;HTML 5&lt;/a&gt;, surgiram novas possibilidades de desenvolvimento, e com elas, há uma nítida evolução dos navegadores de internet. Quem ainda usa Internet Explorer? É claro que muita gente usa, porém, é o &lt;a href=&quot;https://www.google.com/intl/pt-BR/chrome/browser/&quot; target=&quot;_blank&quot;&gt;Chrome&lt;/a&gt; e &lt;a href=&quot;https://www.mozilla.org/pt-BR/firefox/new/&quot; target=&quot;_blank&quot;&gt;Firefox&lt;/a&gt; que &lt;a href=&quot;http://www.w3counter.com/globalstats.php&quot; target=&quot;_blank&quot;&gt;são os lideres do rankink mundial&lt;/a&gt; de uso pelas pessoas. Mas o que isso tem haver com a programação?&lt;br /&gt;
&lt;br /&gt;
No caso do Chrome, da Google, para desenvolvedores Web, podem facilmente testarem seus aplicativos utilizando seu próprio browser, e, praticamente não se precisam de muitas outras ferramentas. Mesmo assim, não deixamos de utilizar editores para realizar a codificação, porque elas melhoram a produtividade.&lt;br /&gt;
&lt;br /&gt;
Vou abordar aqui um pouco de como podemos usar as ferramentas de desenvolvimento, tentando relatar brevemente, como foi o nosso aprendizado nesta jornada de preparação do ambiente de programação Javascript, além de sua forma de execução e teste no browser.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;b&gt;Ambiente de Desenvolvimento para Web ou Mobile?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Já que estamos falando de ambientes de programação voltados para Web, deixa eu lhe explicar o contexto do projeto que estou contribuindo para sintuá-lo melhor. Me refiro às tecnologias móveis (voltada para smartphones), utilizando front-end HTML 5, CSS e Javascript para implementação do projeto. Normalmente usamos essas tecnologias para desenvolvimento voltado para Web, mas neste caso, a ideia é aplicá-lo para tecnologia mobile. Este é o cenário que estou inserido.&lt;br /&gt;
&lt;br /&gt;
As aplicações voltadas para esse mobile target (celulares), normalmente utilizam a própria linguagem nativa para seu desenvolvimento. Por exemplo, no Android usamos a linguagem Java, no iOS usamos a linguagem Objective-C (agora com a nova linguagem Swift), no Windows Phone a linguagem C#, e assim sucessivamente. E se usássemos a expertise de Web (HTML 5, CSS e Javascript) para programar para tecnologias móveis? Essa é a proposta da tecnologia &lt;a href=&quot;https://www.tizen.org/&quot; target=&quot;_blank&quot;&gt;TIZEN&lt;/a&gt;, no qual estou investigando. &lt;br /&gt;
&lt;br /&gt;
Ao instalar o &lt;a href=&quot;https://developer.tizen.org/downloads/tizen-sdk&quot; target=&quot;_blank&quot;&gt;SDK do Tizen&lt;/a&gt; e iniciar o desenvolvimento do projeto, em algum momento precisamos testá-lo. Há duas possibilidades: usando o próprio emulador do Tizen, ou usando um navegador de internet, tal como o Chrome para reproduzir o nosso aplicativo. Você gostaria que eu falasse mais sobre Tizen? Deixe seu comentário se preferir.&lt;br /&gt;
&lt;br /&gt;
Mas voltando ao ponto deste post: &lt;b&gt;o que aprendi com a programação&lt;/b&gt; usando essa tecnologia: o conhecimento da tríade HTML, CSS e Javascript já estão bastante consolidados e facilmente entendemos como fazer as coisas aparecerem na tela, tudo que se precisa é a inteligência do browser para compreender as especificações dessas tecnologias. Foi o que a Samsung está fazendo com o Tizen. Mas vamos deixar esse assunto para outro momento.&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Aprendi que o browser Chrome possui ferramentas que todo desenvolvedor Web, possivelmente já sabem que tem, mas que eu somente as descobri agora. Pelo menos isso me animou, pois assim posso testar de forma rápida os códigos Javascript, HTML e CSS.&amp;nbsp;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;b&gt;Usando a ferramenta DevTools&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Quando usamos o Chrome, podemos usar a ferramenta integrada DevTool: &lt;a href=&quot;https://developer.chrome.com/devtools&quot;&gt;https://developer.chrome.com/devtools&lt;/a&gt;&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;&quot;The Chrome Developer Tools (DevTools for short), are a set web authoring and debugging tools built into Google Chrome. The DevTools provide web developers deep access into the internals of the browser and their web application. Use the DevTools to efficiently track down layout issues, set JavaScript breakpoints, and get insights for code optimization.&quot;&lt;/i&gt;&lt;/blockquote&gt;
&lt;b&gt;Para abrir o DevTools, podemos fazê-lo de 3 formas:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
1) Selecione o menu do Chrome, e no topo direito acesse Tools/Developers Tools (talvez esses nomes estejam em português);&lt;br /&gt;
&lt;br /&gt;
2) Com o botão direito em qualquer área da página atual sendo exibida, selecione Inspect Element (Inspecionar Elemento);&lt;br /&gt;
&lt;br /&gt;
3) Usar atalhos de comandos do teclados do seu computador. Ex. para o MAC OS use:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXn70lLZB37AIpoTJi2OsgQhYLm8Km3YL8yadJEqzGyOWA9EJKVugm6W1PNQWzrzu4BE5laxjmrrjzkrSg91D5zanQddQ5Qf_k4KR1uORMOLlX0PT9vasuRX2AYRlUbM9oqMms3CTz3k0n/s1600/Captura+de+tela+2014-08-29+17.03.25.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXn70lLZB37AIpoTJi2OsgQhYLm8Km3YL8yadJEqzGyOWA9EJKVugm6W1PNQWzrzu4BE5laxjmrrjzkrSg91D5zanQddQ5Qf_k4KR1uORMOLlX0PT9vasuRX2AYRlUbM9oqMms3CTz3k0n/s1600/Captura+de+tela+2014-08-29+17.03.25.png&quot; height=&quot;153&quot; title=&quot;Atalhos no Mac OS. &quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Atalhos (&lt;a href=&quot;https://developer.chrome.com/devtools/docs/shortcuts&quot; target=&quot;_blank&quot;&gt;veja fonte&lt;/a&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;b&gt;Área do DevTools &lt;/b&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
As áreas são organizadas dentro de grupos de tarefas e estão organizadas na barra de ferramenta superior da janela principal. Cada item da área corresponde a um painel de trabalho com um tipo específico de finalidade ou propósito, incluindo elementos DOM, recursos e códigos fontes dos conteúdos carregados atualmente pela janela do browser.&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN2-s6-uEfLKkRG77rrmw_6OBVrlUnaMm2gyuKNlXz80JTiIYnvTgV-iXbpAsy2vpgOMFzpoCE8ppEFxGKRVNHrHXE2hyphenhyphen8udEwbQV0RsUwMGtbk-4tMsOfj_lEq774cOafkr6neEiqmh7b/s1600/devtools-window.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN2-s6-uEfLKkRG77rrmw_6OBVrlUnaMm2gyuKNlXz80JTiIYnvTgV-iXbpAsy2vpgOMFzpoCE8ppEFxGKRVNHrHXE2hyphenhyphen8udEwbQV0RsUwMGtbk-4tMsOfj_lEq774cOafkr6neEiqmh7b/s1600/devtools-window.png&quot; height=&quot;191&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;DevTools do Chrome&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Em resumo temos 8 diferentes tipos principais de ferramentas disponíveis: Elementos, Recursos, Rede, &lt;b&gt;Fontes&lt;/b&gt;, Linha Tempo, Profiles, Armazenamento, &quot;Auditoria&quot; e &lt;b&gt;&lt;a href=&quot;https://developer.chrome.com/devtools/docs/console&quot; target=&quot;_blank&quot;&gt;Console&lt;/a&gt;&lt;/b&gt;. As principais áreas que observei foram a Console e Fontes. Em Console podemos visualizar uma saída de dados textual referente ao comando abaixo:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;background-color: #ffd966;&quot;&gt;console.log(&quot;alguma coisa para mostrar no console...&quot;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Extremamente útil para exibir alguma coisa nos blocos do nosso algoritmo. Fácil de usar e rápido de visualizar. Basta acrescentar o comando nas linhas do programa, como código Javascript e carregar a página HTML que usa o código javascript. Somente quando exibirmos essa tela Console que poderemos perceber seu uso.&lt;br /&gt;
&lt;br /&gt;
A outra ferramenta fica em Fontes (Sources), que considero a mais incrível de todas, a tela mais inovadora dessa ferramenta. Sabe por que? Ela permite fazer Debugging JavaScript, ou seja, depuração de código passo a passo. Semelhante as IDEs tradicionais das outras linguagens.&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOxMbDLS8xyGwEA29YfkLoJ5E717E-SE07AjnLFitSbmM2Hk7RegdoeZDDsMlcPEDMow4v1Pjg7Tcinv93OQiUjJ1qCg4NtvqgmiX1VlrypUYcXD0IwRtY4FLkSCsB16E2AXH03XyB9h4K/s1600/javascript-debugging.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOxMbDLS8xyGwEA29YfkLoJ5E717E-SE07AjnLFitSbmM2Hk7RegdoeZDDsMlcPEDMow4v1Pjg7Tcinv93OQiUjJ1qCg4NtvqgmiX1VlrypUYcXD0IwRtY4FLkSCsB16E2AXH03XyB9h4K/s1600/javascript-debugging.png&quot; height=&quot;188&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Ferramenta de &lt;a href=&quot;https://developer.chrome.com/devtools/docs/javascript-debugging&quot; target=&quot;_blank&quot;&gt;Debugging&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;&quot;As the complexity of JavaScript applications increase, developers need powerful debugging tools to help quickly discover the cause of an issue and fix it efficiently. The Chrome DevTools include a number of useful tools to help make debugging JavaScript less painful.&quot;&lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
Para usar simplesmente carregue primeiro sua página HTML, que utiliza o seu código Javascript, em seguida abra o DevTools seguindo os procedimentos mencionados anteriormente, e então acesse a área &lt;i&gt;Sources&lt;/i&gt;/&lt;i&gt;Fontes&lt;/i&gt;. Procure o seu arquivo Javascript ou HTML que possua o javascript, e o abra clicando duas vezes. Por fim, procure a linha no qual gostaria de realizar a depuração e clique com o mouse na borda da linha. &lt;a href=&quot;https://developer.chrome.com/devtools/docs/javascript-debugging&quot; target=&quot;_blank&quot;&gt;Instruções detalhadas veja aqui&lt;/a&gt;.&lt;imagem aqui=&quot;&quot;&gt;&lt;/imagem&gt;&lt;br /&gt;
&lt;br /&gt;
Agora quando você rodar o seu HTML interagindo ou recarregando a página, quando a execução do algoritmo chegar na função no qual definiu seu breakpoints, a linha irá parar naquele ponto, e você poderá rodar passa a passo usando os botões Step Into ou Step Over. Existem atalhos de teclado que podem ser aprendidos para fazer isso de forma mais rápida no dia a dia.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;b&gt;Depois que aprendi a depurar em código Javascript, todos os algoritmos mais complexos, puderam ser validados considerando essa funcionalidade, permitindo acelerar ainda mais o desenvolvimento do algoritmo.&lt;/b&gt;&lt;/blockquote&gt;
&lt;br /&gt;
No próximo post, que tal mostrar como colocar sons e como gerenciá-los com Javascript? Isso permite inserir efeitos sonoros em sua aplicação. Por se tratar de um jogo, essa funcionalidade é extremamente interessante.&lt;/div&gt;
</description><link>http://profdouglas.blogspot.com/2014/08/o-que-aprendi-com-programacao-hoje-dia-3.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjojOR1DOOf8W0Vrc0JoRdx0Yq980FXSRGLJyBe2WNv6T302sVntmqLvmUTKT1EDxPweO20jUEFW91LWRCn-F1b5VycHIlMaOl0j9i86bg2wdsSNThYP8hnOnwDhS2TWL-rfgBKapE_SBIy/s72-c/tirinha354.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-8556932939799945573</guid><pubDate>Fri, 29 Aug 2014 01:15:00 +0000</pubDate><atom:updated>2014-09-10T07:16:09.861-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">canvas</category><category domain="http://www.blogger.com/atom/ns#">JAVA</category><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">método</category><category domain="http://www.blogger.com/atom/ns#">produtividade</category><category domain="http://www.blogger.com/atom/ns#">programação</category><title>O que aprendi com a programação hoje: dia 2 - animação em Javascript</title><description>Esse post faz parte de uma série: o que aprendi com a programação, e tudo &lt;a href=&quot;http://profdouglas.blogspot.com.br/2014/08/o-que-aprendi-com-programacao-hoje-dia-1.html&quot; target=&quot;_blank&quot;&gt;começou no dia 1&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Estou contribuindo em um projeto no qual estamos utilizando animações visuais para compor a mecânica de um jogo. Essas animações, produzem alguns efeitos que são exibidas durante a execução do jogo.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Em projetos que desenvolvemos usando a linguagem de programação Javascript, normalmente, o fazemos para aplicações voltadas para Web, ou seja, a interface visual vai rodar dentro do navegador de internet (browser). Possivelmente, você já deve ter visto algum jogo dentro do Facebook ou aplicativos que se integram na tela da rede social. A grande parte desses jogos e aplicativos que rodam pelo browser, são integrados lá e utilizam as tecnologias HTML 5 e CSS, além da linguagem Javascript, que permite integrar essas partes.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja1H-nB1epqAnEEkyGsRq5a9DH8aOby26d5hEWY_Tp6blrtKd1K64YI_0ib29FFqFpDSG9BUtdJKL7Oe6ac5QmDOxM-le9VmyyVzei6r3QU5RcUaH7TR0t8dAWAsZ3Jhn1ytWS9NtZVgyc/s1600/background.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja1H-nB1epqAnEEkyGsRq5a9DH8aOby26d5hEWY_Tp6blrtKd1K64YI_0ib29FFqFpDSG9BUtdJKL7Oe6ac5QmDOxM-le9VmyyVzei6r3QU5RcUaH7TR0t8dAWAsZ3Jhn1ytWS9NtZVgyc/s1600/background.png&quot; height=&quot;240&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div&gt;
Aprendi a criar uma animação usando HTML usando Canvas do Javascript e vou tentar explicar como funciona uma animação usando essa linguagem, assim como, tentarei listar algumas dicas do que foi feito para resolver alguns problemas encontrados e que estão relacionados com animação.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
A primeira coisa que você deve saber é que um Canvas é uma área de desenho. Neste espaço chamado Canvas, você poderá exibir um objeto qualquer, esse objeto será posicionado dentro de um sistema cartesiano (vide figura), e pode ter uma cor sólida ou baseado em uma imagem pronta. Dentro da área do Canvas o browser irá desenhar através de um processo de pintura, onde serão definidas as posições que os objetos devem ser exibidos em coordenadas x e y. &lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Para mais informações, acesse uma ótima referência sobre Canvas neste site: &lt;a href=&quot;http://diveintohtml5.com.br/canvas.html&quot;&gt;http://diveintohtml5.com.br/canvas.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;&lt;i&gt;Um exemplo de arquivo bola.html&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: html&quot;&gt;&lt;html&gt;
&lt;head&gt;
&lt;style&gt;
  canvas {
    background: #ffffff;
    cursor: pointer;
    margin-left: 10px;
    margin-top: 10px;
    -webkit-box-shadow: 4px 4px 8px rgba(0,0,0,0.5);
    -moz-box-shadow: 4px 4px 8px rgba(0,0,0,0.5);
    box-shadow: 4px 4px 8px rgba(0,0,0,0.5);
  }
&lt;/style&gt;
&lt;title&gt;Bola&lt;/title&gt;
&lt;/head&gt;

&lt;body class=&quot;gameScreen&quot;&gt;
 &lt;header&gt;
 &lt;h2&gt;
header&lt;/h2&gt;
&lt;/header&gt;

 &lt;canvas class=&quot;canvas&quot; height=&quot;500&quot; id=&quot;gameCanvasScreen&quot; width=&quot;500&quot;&gt;
        This browser is not supported
    &lt;/canvas&gt;

 &lt;footer&gt;
  &lt;h2&gt;
footer&lt;/h2&gt;
&lt;/footer&gt;


 &lt;script src=&quot;./bola.js&quot;&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;


&lt;/pre&gt;
&lt;br /&gt;
&lt;div&gt;
Se quisermos desenhar um objeto usando Canvas podemos fazer de diferentes formas, porém, percebi junto a minha equipe que uma forma intuitiva para nós foi adotar uma representação na estrutura do código Javascript, tal como usamos as classes na linguagem Java. Vejamos o exemplo:&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;Exemplo de aquivo javascript chamado bola.js&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt;var Animacao = {
 // variaveis globais
 CANVAS : null,
 CONTEXT : null,
 bola : null,

 // inicializa a Animacao
 init : function() {
  // variaveis de canvas
  Animacao.CANVAS = document.querySelector(&quot;.canvas&quot;);
  Animacao.CONTEXT = Animacao.CANVAS.getContext(&quot;2d&quot;);

  // registra eventos
  Animacao.addEventListeners();


  bola = new Bola(0,0);
  bola.init();

  setTimeout(Animacao.pintar,100);


 },

 // limpa a tela
 clearCanvas : function() {
  Animacao.CONTEXT.clearRect(0, 0, Animacao.CANVAS.width, Animacao.CANVAS.height);
 },

 // registra eventos
 addEventListeners : function() {
  Animacao.CANVAS.addEventListener(&quot;click&quot;, Animacao.clickAnimacaoHandler);
 },

 clickAnimacaoHandler : function(e) {

  console.log(&quot;clique da Animacao aqui&quot;);

  Animacao.pintar();

 },

 pintar : function() {

  // desenha a Animacao aqui
  console.log(&quot;animar aqui&quot;);

  if (bola) {

   Animacao.clearCanvas();

   bola.update();
   bola.draw();

  }

 },

};


function Sprite(image) {
 this.image = new Image();
 this.image.src = image + &quot;.jpg&quot;;

 this.draw = function(x, y) {
  Animacao.CONTEXT.clearRect(x, y, this.image.width, this.image.height);
  Animacao.CONTEXT.drawImage(this.image, x, y);
 };

 this.animate = function() {
  // TODO animate here
  console.log(&quot;animar o item durante seu deslocamento&quot;);
 };
}

function Bola(x, y) {
 this.x = x;
 this.y = y;
 this.clicked = false;
 this.sprite;

 this.init = function() {
  this.sprite = new Sprite(&quot;bola&quot;);
 };

 this.update = function() {

  this.y += (this.sprite.image.height/5);

 };

 this.draw = function() {
  if (this.clicked) {
    console.log(&quot;foi clicado&quot;);
    this.animate();
  }

  this.sprite.draw(this.x, this.y);
 };

 this.click = function() {
  this.clicked = true;
  this.draw();
 };

 this.animate = function() {
  this.type.sprite.animate();
 };

}


// o javascript vai carregar esse metodo a cada refresh no browser
window.onload = Animacao.init;

&lt;/pre&gt;
&lt;br /&gt;
&lt;div&gt;
Note que esse arquivo representa a estrutura do Javascript para representar o conceito da Bola, bem como, um conceito de Sprite (herança de Java ME), onde podemos criar esse objeto para representar a imagem desejada, com seu x e y, um método para desenhar na tela e outro para atualizar suas posições.&lt;br /&gt;
&lt;br /&gt;
Essa representação proporcionou reusar o código de forma legível para nossa equipe. Permitiu por exemplo, que qualquer função possa ser executada simplesmente invocando o nome da estrutura e sua função.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Como que animação de nossa bola funciona em nosso código Javascript?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Assumindo que animação ocorra a cada click sobre a bola, posso programar um evento que mude a posição do Sprite x e y, alterando seus valores e mandando o Canvas pintar a tela novamente. Quando o Canvas pintar a tela, as posições x e y da bola já foram alteradas para novas posições de acordo com uma direção desejada e portanto, vai ser mostrado após a nova pintura da janela, outra bola em um ponto da janela diferente da interior.&lt;br /&gt;
&lt;br /&gt;
Esse efeito produz uma percepção ao usuário que chamamos de animação. Porém, para esse efeito ser considerado uma animação, tem que parecer um deslocamento parecido com o que ocorre com uma bola real. Para que o efeito fique mais parecido com o mundo real é necessário diminuir o intervalo de deslocamente do x e y, além de aumentar a quantidade de pinturas deste objeto no Canvas. Existe uma relação conhecida chamada Frames/segundos. Essa relação pode ser considerada em seu algoritmo para tornar o efeito de pintura repetitivo e constante, dando a impressão que existe realmente uma bola se movendo. Isso sem considerar efeitos da física, tal como os jogos modernos exploram muito bem.&lt;br /&gt;
&lt;br /&gt;
Portanto, a cada click do mouse eu desejo que a bola se desloque de um ponto a outro. Alguns problemas podem ser notados nessa animação. Ela não está parecendo uma animação. :) Chamamos isso de animação com fluidez no seu efeito perceptível pelo usuário. Quanto mais próximo do mundo real, melhor. Mas sabemos que temos limitações óbvias, tais como:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;poder computacional para explorar cálculos matemáticos;&lt;/li&gt;
&lt;li&gt;experiência dos desenvolvedores que estão acostumados a fazerem aplicativos tradicionais e que, geralmente, não requerem fazer animações específicas;&lt;/li&gt;
&lt;li&gt;um objeto, quando desenhado e visto de uma perspectiva 2D tem diveras percepções de acordo com o seu desenho, mas para parecer uma animação fluida, haveria necessidade de desenha-lo em diversos ângulos (frame a frame), para cada movimento desejado. Imagine uma animação dos cabelos do ser humano. Quantas possibilidades de diferentes maneiras posso representar dependendo da direção do vento? Quanto mais próximo do real, mais difícil de representar;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;O que podemos fazer para tornar a animação um pouco melhor?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Estudar técnicas de animação 2D é um bom começo. Existem diversos framework para JavaScripts que prometem simplificar o uso de animações. Porém, decidimos tocar o projeto com a linguagem Javascript nativamente porque precisávamos aprender melhor essa linguagem e acreditamos que o esforço de fazer desta forma &amp;nbsp;compensaria porque absorveríamos maior entendimento. De fato isso se concretizou.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Então recomendo que quando haver necessidade de fazer algo usando a linguagem pura ou usar algo pronto, considere avaliar o seu caso em relação a &lt;b&gt;produtividade vs. aprendizado&lt;/b&gt;. Precisávamos aprender a linguagem porque acreditávamos que teríamos outras dificuldades, caso a base do conhecimento essencial não estivesse bem desenvolvida previamente. Usar a linguagem pura, nos permitiu desenvolver melhor nossas habilidades. Hoje porém, poderemos considerar utilizar frameworks de terceiros, de forma mais segura, sobre o que realmente precisamos para nosso problema atual.&lt;/blockquote&gt;
&lt;br /&gt;
Mas voltando ao foco da pergunta, podemos melhorar animação, e de fato melhoramos fazendo o deslocamento do x e y com intervalos menores e pinturas mais constantes do Canvas. Considerando que o desenho da imagem da bola possua 180 pixel de largura e altura, pode-se dividir em 5 partes, e para cada parte fazer um pintura.&lt;br /&gt;
&lt;br /&gt;
Então, no caso de desejar fazer a bola descer a cada click, pode:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt;var Animacao = {
 // variaveis globais
 CANVAS : null,
 CONTEXT : null,
 bola : null,
 emProcessoAnimacao : false,
 contadorAnimacao : 0,

 // inicializa a Animacao
 init : function() {
  // variaveis de canvas
  Animacao.CANVAS = document.querySelector(&quot;.canvas&quot;);
  Animacao.CONTEXT = Animacao.CANVAS.getContext(&quot;2d&quot;);

  // registra eventos
  Animacao.addEventListeners();


  bola = new Bola(0,0);
  bola.init();

  setTimeout(Animacao.pintar,100);


 },

 // limpa a tela
 clearCanvas : function() {
  Animacao.CONTEXT.clearRect(0, 0, Animacao.CANVAS.width, Animacao.CANVAS.height);
 },

 // registra eventos
 addEventListeners : function() {
  Animacao.CANVAS.addEventListener(&quot;click&quot;, Animacao.clickAnimacaoHandler);
 },

 clickAnimacaoHandler : function(e) {

  Animacao.emProcessoAnimacao = true;
  Animacao.pintar();
 },

 pintar : function() {

  // desenha a Animacao aqui
  Animacao.clearCanvas();

  bola.update();

  bola.draw();

  // chamar novamente o metodo (pelo menos 5 vezes)
  if (Animacao.emProcessoAnimacao) {

    Animacao.contadorAnimacao++;

    if (Animacao.contadorAnimacao &amp;gt;= 5) {
     Animacao.contadorAnimacao = 0;
     Animacao.emProcessoAnimacao = false;

    } else {

     // repintar a tela novamente
     setTimeout(Animacao.pintar,50);
    }


  }


 },

};


function Sprite(image) {
 this.image = new Image();
 this.image.src = image + &quot;.jpg&quot;;

 this.draw = function(x, y) {
  Animacao.CONTEXT.drawImage(this.image, x, y);
 };
}

function Bola(x, y) {
 this.x = x;
 this.y = y;
 this.clicked = false;
 this.sprite;

 this.init = function() {
  this.sprite = new Sprite(&quot;bola&quot;);
 };

 this.update = function() {

  this.y += (this.sprite.image.height/10);

 };

 this.draw = function() {
  this.sprite.draw(this.x, this.y);
 };

 this.click = function() {
  this.clicked = true;
  this.draw();
 };

 this.animate = function() {
  this.type.sprite.animate();
 };

}


// o javascript vai carregar esse metodo a cada refresh no browser
window.onload = Animacao.init;

&lt;/pre&gt;
&lt;br /&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;a href=&quot;https://www.dropbox.com/sh/dedwmtbuoxafi8u/AADoZ4j1FFroFl6-37x5EIwva?dl=0&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh22GSL-2a9sxWbmLGibNCN0CniECGF-iu4kt1P8Bq23pavOkZEYSAQ7mxLCSbJT3NjqMtIvUiT3dP0sHtK0WznpWBxq4o1J9kYZlQhS0rTR7Y-1KLq7oo_L94OAHTOgY2JMEAhWWsxkAuH/s1600/screenshot_desenho.png&quot; height=&quot;320&quot; width=&quot;275&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://www.dropbox.com/sh/dedwmtbuoxafi8u/AADoZ4j1FFroFl6-37x5EIwva?dl=0&quot; target=&quot;_blank&quot;&gt;animação fica mais fluída&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Note o uso da função &amp;nbsp;do Javascript: &lt;b&gt;setTimeout&lt;/b&gt;(&lt;funcao_desejada&gt;tempo_mili_segundos), essa função permite que possamos agendar um intervá-lo de tempo em mili segundos e passar como argumento &amp;nbsp;qual função desejamos chamar. Assim podemos chamar a função &lt;b&gt;pintar()&lt;/b&gt; constantemente para garantir as 5 pinturas desejadas.&lt;/funcao_desejada&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Se você atualizar o código e executar em seu browser, poderá perceber como a animação agora parece mais uma decida um pouco mais suave. Quanto mais suave, em teoria é melhor para a percepção do usuário.&lt;/blockquote&gt;
&lt;a href=&quot;https://www.dropbox.com/sh/dedwmtbuoxafi8u/AADoZ4j1FFroFl6-37x5EIwva?dl=0&quot; target=&quot;_blank&quot;&gt;Para baixar os arquivos clique aqui.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na próxima dica falarei como podemos setar as ferramentas envolvidas de desenvolvimento e como foi o nosso aprendizado da preparação do ambiente de programação Javascript e sua forma de execução no browser. Essa foi uma das melhores sensações que tive do atual estado de ferramentas Javascript, e fiquei extremamente surpreso o quanto foi &quot;fácil&quot; acompanhar a execução, inclusive usando a depuração em tempo real.&lt;/div&gt;
</description><link>http://profdouglas.blogspot.com/2014/08/o-que-aprendi-com-programacao-hoje-dia-2.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja1H-nB1epqAnEEkyGsRq5a9DH8aOby26d5hEWY_Tp6blrtKd1K64YI_0ib29FFqFpDSG9BUtdJKL7Oe6ac5QmDOxM-le9VmyyVzei6r3QU5RcUaH7TR0t8dAWAsZ3Jhn1ytWS9NtZVgyc/s72-c/background.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6914598597686640327.post-2017169393174730819</guid><pubDate>Wed, 27 Aug 2014 18:15:00 +0000</pubDate><atom:updated>2014-09-10T07:15:32.888-03:00</atom:updated><title>O que aprendi com a programação hoje: dia 1 - #javascript</title><description>Estou trabalhando no desenvolvimento de uma nova habilidade pessoal, uma competência que a muito tempo estou desejando, um hábito que ainda não tenho na minha vida, e que, vez por outra, tento colocar em prática. Porém, quando a energia ou a minha disposição me abondonava, acabava por desistir de persistir essa prática. Trata-se de uma competência que sempre desejei melhorar, mas que tenho exercitado pouco: o hábito de escrever.&lt;br /&gt;
&lt;br /&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: right; margin-left: 1em; text-align: right;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRYcJRaEP53Quov5mNR0B98PtxkiTPcnvAZL1MRK_-bnliarBRv5Cvmlk_xlYlgK4Hcc1P3IFITlfcXnnLxksx0Mq28OPdB6LUU36yhWb1SOHM-Z1y0YjFl_yXq9k6jnrTZ7jPd_joSF8x/s1600/2378867408_4cc90791d6_z.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRYcJRaEP53Quov5mNR0B98PtxkiTPcnvAZL1MRK_-bnliarBRv5Cvmlk_xlYlgK4Hcc1P3IFITlfcXnnLxksx0Mq28OPdB6LUU36yhWb1SOHM-Z1y0YjFl_yXq9k6jnrTZ7jPd_joSF8x/s1600/2378867408_4cc90791d6_z.jpg&quot; height=&quot;240&quot; title=&quot;código de javascript&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;bye &lt;a href=&quot;https://c1.staticflickr.com/3/2326/2378867408_4cc90791d6_z.jpg?zz=1&quot; target=&quot;_blank&quot;&gt;fonte&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Sendo assim decidi tentar um novo método para colocar em prática nos próximos 30 dias que se seguirão. Vou registrar o progresso das tentativas diárias, e para exercitar essa competência da escrita precisarei escrever alguma coisa, sobre algum tema ou assunto de minha preferência, no qual me permitirá exercitar a escrita, e se tudo ocorrer bem, poderá auxiliar no desenvolvimento do hábito esperado. Não tenho ideia se isso vai contribuir, mas acredito que sim. Então, convido a você a me ajudar acompanhando o progresso diário ou vez por outra.&lt;br /&gt;
&lt;br /&gt;
Decidi abordar sobre o assunto que tenho experiência e familiaridade: a programação. :)  &lt;br /&gt;
&lt;br /&gt;
Dizem que as perguntas movem o homem... a pergunta que vou me propor a refletir é:&lt;br /&gt;
&lt;br /&gt;
- &lt;b&gt;O que aprendi com a programação hoje?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Começarei assim: o que aprendi com a programação hoje? dia 1&lt;br /&gt;
&lt;br /&gt;
Em um projeto que estou ajudando a desenvolver, tenho me deparado com a necessidade de usar a linguagem &lt;a href=&quot;http://www.wikiwand.com/pt/Javascript&quot; target=&quot;_blank&quot;&gt;&lt;i&gt;&lt;b&gt;Javascript&lt;/b&gt;&lt;/i&gt;&lt;/a&gt;, e dado meu conhecimento e percepção que tinha dessa linguagem, as primeiras impressões não foram muito boas. Mas isso rapidamente foi mudando a medida que fui conhecendo melhor a linguagem em questão. Percebi que eu havia criado um certo preconceito da linguagem Javascript, e isso me impedia de me informar melhor sobre a evolução desta tecnologia.&lt;br /&gt;
&lt;br /&gt;
Nada que uma demanda nova do mercado não possa resolver. Nos obrigamos a correr atrás do prejuizo, fazendo-o ir buscar o conhecimento necesário da linguagem. Percebi que precisava reaprender desde o básico se quisesse melhor compreender os detalhes da linguagem.&lt;br /&gt;
&lt;br /&gt;
Encontrei um lugar bem legal que permite colocarmos na prática a linguagem Javascript, assim como estudar seus detalhes conceituais. Achei o curso do &lt;a href=&quot;http://www.codecademy.com/&quot; target=&quot;_blank&quot;&gt;Codecademy&lt;/a&gt; de Javascript. E foi ali que comecei a rever meus conhecimentos prévios e confrontá-los com os novos que estavam sendo vistos.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Aprendi e ainda estou aprendendo com o curso de Javascript do &lt;a href=&quot;http://www.codecademy.com/&quot; target=&quot;_blank&quot;&gt;CodeCademy&lt;/a&gt;, que não importa a linguagem que você está precisando aprender, mas que tudo pode ser encarado de forma divertida se estamos abertos a novos conhecimentos. O fato de fazer etapa por etapa no ambiente do codecademy me permite lembrar que na minha profissão: desenvolvedor de sistemas e professor, tenho que manter a mente aberta para aprender novas coisas, o tempo todo.&lt;/blockquote&gt;
&lt;br /&gt;
Outro ponto que me fez refletir... &lt;b&gt;creio que não devemos achar que já sabemos tudo sobre determinada linguagem e por isso tomar a  decisão de me fechar para novos conhecimentos sobre tal tecnologia&lt;/b&gt;. No contexto que eu havia aprendido Javascript eu não tive a devida necessidade de usar para os problemas de outra época, assim não foi despertado muito interesse. Só que ao necessitar deste conhecimento, tive que correr atrás para aprender o suficiente para iniciar meu projeto.&lt;br /&gt;
&lt;br /&gt;
Existem muitas formas de aprender programação: aprendi com o &lt;a href=&quot;http://www.codecademy.com/&quot; target=&quot;_blank&quot;&gt;codecademy&lt;/a&gt;, no curso de Javascript que a linguagem é extremamente poderosa e simples para coisas que podemos fazer dentro de um navegador de internet (Browser). Mas isso  vou deixar para falar amanhã e adiante. </description><link>http://profdouglas.blogspot.com/2014/08/o-que-aprendi-com-programacao-hoje-dia-1.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRYcJRaEP53Quov5mNR0B98PtxkiTPcnvAZL1MRK_-bnliarBRv5Cvmlk_xlYlgK4Hcc1P3IFITlfcXnnLxksx0Mq28OPdB6LUU36yhWb1SOHM-Z1y0YjFl_yXq9k6jnrTZ7jPd_joSF8x/s72-c/2378867408_4cc90791d6_z.jpg" height="72" width="72"/><thr:total>4</thr:total></item></channel></rss>