<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-35552515</atom:id><lastBuildDate>Tue, 15 Nov 2011 01:46:12 +0000</lastBuildDate><category>linux</category><category>Mobile</category><category>TV</category><category>Desenvolvimento</category><category>GEEK</category><category>java</category><category>SOCIAL</category><category>Comics</category><category>Zend</category><category>trojan</category><category>Ajax</category><category>GADGET</category><category>jogos</category><category>Anime</category><category>PHP</category><category>Flash</category><category>Games</category><category>Firefox</category><category>Arduino</category><category>git</category><category>Bugs</category><category>eletrônica</category><category>Tools</category><category>fraude</category><category>bancos</category><category>Forms</category><category>Seriado</category><category>Video</category><category>humor</category><title>Life Data</title><description /><link>http://renato-aquino.blogspot.com/</link><managingEditor>noreply@blogger.com (Renato)</managingEditor><generator>Blogger</generator><openSearch:totalResults>75</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/LifeData" /><feedburner:info uri="lifedata" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-4063268177992931349</guid><pubDate>Tue, 15 Nov 2011 01:26:00 +0000</pubDate><atom:updated>2011-11-14T23:46:12.699-02:00</atom:updated><title>CFTV com Zoneminder e Linux</title><description>Resolvi a algum tempo instalar um sistema de vigilância para minha casa. &lt;br /&gt;
Por acaso acabei encontrando no &lt;a href="http://www.dealextreme.com/"&gt;DealExtreme&lt;/a&gt; uma placa de captura para câmeras de vigilância que, pelos comentários, era facilmente configuravel no Linux.&lt;br /&gt;
Tomei então a iniciativa de pesquisar um pouco e montar meu próprio sistema de monitoramento e gravação utilizando o &lt;a href="http://www.zoneminder.com/"&gt;Zoneminder&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Uma das primeiras dúvidas foi qual sistema utilizar, qual *nix flawor, qual hardware, quanto de espaço para armazenamento, qual a necessidade real de processador, etc.&lt;br /&gt;
Muitas dessas perguntas ainda não possuo uma resposta ou regra básica para determinar, mas neste texto vou descrever os passos que tomei para deixar o sistema funcional.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;HARDWARE:&lt;/span&gt;&lt;br /&gt;
Como motor do sistema, após ver diversos comentários do tipo "utilize seu velho pc", resolvi adotar uma motherboard de "baixo consumo".&lt;br /&gt;
Por não ser algo comum foi um pouco problemático escolher, mas acabei encontrando uma VIA PC1 da &lt;a href="http://www.phitronics.com.br/"&gt;Phitronics&lt;/a&gt; na loja da&lt;a href="http://www.jneinfo.com.br/"&gt; JNE Informática&lt;/a&gt; da Av. Paulista.&lt;br /&gt;
A configuração é modesta, um processador VIA C7-M de 1.6Ghz com o básico encontrado onboard atualmente, USB 2.0, som, ethernet e adaptador VGA.&lt;br /&gt;
O modelo que encontrei foi o &lt;a href="http://www.phitronics.com.br/pc3_1.php"&gt;VIA PC3000E+&lt;/a&gt;.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-oZrKjLJ32U0/TsHBFsKw7XI/AAAAAAAACyo/XTpdUiEffvs/s1600/via_cpu_367_489.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-oZrKjLJ32U0/TsHBFsKw7XI/AAAAAAAACyo/XTpdUiEffvs/s320/via_cpu_367_489.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Adicionei à motherboard 2GB de memória DDR2 e dois HDs, sendo um IDE de 40GB para o sistema e um SATA de 1.5TB para armazenamento das gravações.&lt;br /&gt;
É necessário que o equipamento possua bastante memória já que o Zoneminder faz uso de memória compartilhada entre seus processos para tratamento e detecção de movimento.&lt;br /&gt;
Já o armazenamento grande é obvio, pretendo manter as gravações por um período extenso e isso requer espaço.&lt;br /&gt;
&lt;br /&gt;
A placa de captura que acabei encomendando da China não é uma Ferrari, mas tem um preço baixo e para meu sistema pareceu o bastante.&lt;br /&gt;
&lt;a href="http://www.dealextreme.com/p/4-channel-dvr-video-capture-pci-card-for-25-30-fps-security-cameras-15758"&gt;4-Channel DVR Video Capture PCI Card for 25/30 FPS Security Cameras&lt;/a&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-Oqz24Ba3eaw/TsHBZFURpZI/AAAAAAAACyw/ccbfsF9AwJA/s1600/sku_15758_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-Oqz24Ba3eaw/TsHBZFURpZI/AAAAAAAACyw/ccbfsF9AwJA/s200/sku_15758_1.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
As câmeras, apenas duas até o momento, requisitei da loja &lt;a href="http://www.ribershop.com.br/"&gt;Ribershop &lt;/a&gt;que encontrei no MercadoLivre, loja essa que se mostrou bastante rica em equipamentos para segurança.&lt;br /&gt;
Optei por duas câmeras &lt;a href="http://en.wikipedia.org/wiki/Charge-coupled_device"&gt;CCD &lt;/a&gt;no padrão &lt;a href="http://en.wikipedia.org/wiki/NTSC"&gt;NTSC&lt;/a&gt; que é o mesmo operado pela placa de captura.&lt;br /&gt;
&lt;br /&gt;
Tudo montado, vamos ao software.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;SOFTWARE:&lt;/span&gt;&lt;br /&gt;
Enfrentei diversas dores de cabeça e perdi um tempo consideravel testando algumas opções de sistema operacional até chegar ao Debian como o mais indicado para meu projeto.&lt;br /&gt;
Dentre as tentativas, desisti do Ubuntu por ser extremamente integrado com o sistema gráfico e não pretendo utilizar um monitor ligado ao sistema, ficando muito complicado efetuar uma "limpeza" do sistema base instalado e o que mais pretendo é ter uma formula rápida para montar o mesmo.&lt;br /&gt;
&lt;br /&gt;
Testei também o FreeBSD 8.2 e mesmo sabendo que o suporte do driver do sistema para a placa de captura poderia não ser eficiente o bastante, sequer consegui testar o mesmo pois a instalação do Zoneminder a partir do ports foi falha e também precisava de diversas configurações para deixar o mesmo funcional.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://3.bp.blogspot.com/-c8niuDvhs0g/TsHCZe0z-TI/AAAAAAAACy4/cS5CVtpTP0Y/s1600/debianlogo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-c8niuDvhs0g/TsHCZe0z-TI/AAAAAAAACy4/cS5CVtpTP0Y/s1600/debianlogo.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Ao chegar na minha terceira tentativa, o Debian 6, pela facilidade de instalar o ambiente acabei parando com os testes de escolha e decidi partir para produção.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Configurações:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Após ter o sistema básico instalado, pode-se instalar o Zoneminder com apenas um comando:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;apt-get install zoneminder&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
O mesmo vai instalar todo o ecosistema de softwares necessários para a execução do ZM, a base de dados inicial no MySQL, os scripts de inicialização do sistema, Apache, PHP5 e as bibliotecas e programas necessários para manipulação de imagens/vídeo.&lt;br /&gt;
&lt;br /&gt;
A única ação necessária para acessar o console do ZM foi informar ao Apache dos arquivos do mesmo:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;ln -s /etc/zm/apache.conf /etc/apache2/sites-available/zm&lt;br /&gt;a2ensite zm&lt;br /&gt;apache2ctl restart&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Após isso você pode acessar o console na url http://ipdoservidor&lt;ip_da_maquina&gt;/zm&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Problemas:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Até aqui, tudo muito fácil, a parte complexa que vou resumir foi encontrar as configurações corretas para o ZM funcionar com o hardware descrito.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;UDEV&lt;/b&gt;&lt;br /&gt;O primeiro detalhe é a permissão de acesso ao dispositivo da placa de captura.&lt;br /&gt;Após a instalação, sem qualquer configuração o Linux já havia detectado minha placa de captura e criado o device /dev/video0.&lt;br /&gt;No entanto, as permissões do mesmo não deixavam o ZM acessar o dispositivo e mesmo mudando com chmod após a reinicialização as permissões padrão eram retornadas.&lt;br /&gt;Para resolver isso foi necessário criar uma regra para o udev que determine quais permissões devem ser dadas ao dispositivo.&lt;br /&gt;&lt;br /&gt;Criei então o arquivo /etc/udev/rules.d/70-persistent-bttv.rules com o seguinte conteúdo:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;KERNEL=="video*", GROUP="video", MODE="0666", OPTIONS="last_rule"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Após o reboot, as permissões estavam corretas.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;BTTV&lt;/b&gt;&lt;br /&gt;Embora o kernel Linux reconheça o chipset de captura automaticamente, esta não fica 100% funcional sem informarmos qual "placa" o sistema deve utilizar.&lt;br /&gt;Para isso foi necessário informar ao driver bttv qual o modelo da mesma com o seguinte código:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;echo "options bttv card=77" &amp;gt;&amp;gt; /etc/modprobe.d/bttv.conf&lt;/code&gt;&lt;/ip_da_maquina&gt;&lt;br /&gt;
&lt;ip_da_maquina&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;Feito isso, na próxima carga do driver (reboot ou rmmode/modprobe) deverá ser encontrado nas mensagens do dmesg algo do tipo:&lt;/ip_da_maquina&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;bttv0: using: GrandTec Multi Capture Card (Bt878) [card=77,insmod option]&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
E sua placa está pronta para utilização.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;TWEAKS:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Neste ponto, o ZM já está instalado e funcional, e você pode brincar na interface do console adicionando monitores, item que não pretendo discutir no momento.&lt;br /&gt;
Apenas para nota de alguns outros detalhes interessantes e possívelmente necessários, vou deixar mais algumas notas.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;SHMMAX&lt;/b&gt;&lt;br /&gt;
Como descrito anteriormente, o ZM utiliza espaço de memória compartilhada para processar as imagens que captura da placa.&lt;br /&gt;
A questão é que nem sempre o valor padrão do sistema é o bastante. Para aumentar esse valor, criamos uma regra de sysctl:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;echo "kernel.shmmax = 134217728" &amp;gt;&amp;gt; /etc/sysctl.d/60-kernel-shm.conf&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;CAMBAZOLA&lt;/b&gt;&lt;br /&gt;
No console do ZM é possível acessar as imagens capturadas no monitor de câmeras (clique no nome do monitor). O detalhe é que o mesmo exibe por padrão uma imagem estática que é recarregada de tempos em tempos utilizando javascript.&lt;br /&gt;
Para visualizar um fluxo "contínuo" de imagens, podemos utilizar o applet Cambazola que faz esta carga de forma transparente.&lt;br /&gt;
Precisamos apenas efetuar o download do mesmo, copiar o arquivo cambazola.jar na pasta raiz do ZM e informar que o mesmo deve utiliza-lo.&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;wget http://www.charliemouse.com/code/cambozola/cambozola-latest.tar.gz&lt;br /&gt;tar -zxvf cambazola-latest.tar.gz&lt;br /&gt;cp cambazola-&lt;versao&gt;/dist/cambazola.jar /usr/share/zoneminder&lt;/versao&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Para configurar o Zoneminder, acesse o link opções do console e no painel Images utilizar as seguintes opções:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;CAN_STREAM: auto&lt;br /&gt;STREAM_METHOD: jpeg&lt;br /&gt;OPT_CAMBOZOLA: sim (check)&lt;br /&gt;PATH_CAMBOZOLA: cambazola.jar&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;ARMAZENAMENTO&lt;/b&gt;&lt;br /&gt;
Embora esta dica não seja diretamente ligada ao Zoneminder, a mesma me fez perder um tempinho para descobrir.&lt;br /&gt;
Como possuo um dois HDs, pretendo utilizar o maior apenas para armazenamento das gravações.&lt;br /&gt;
O procedimento no Debian é relativamente simples:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;fdisk -l&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Lista quais HDs estão plugados na placa mãe e suas patições.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;cfdisk /dev/sd&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Para editar as partições do seu segundo disco.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;mkfs.ext3 /dev/sd&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Para formatar o mesmo após editar as partições.&lt;br /&gt;
&lt;br /&gt;
Após isso pode-se montar o disco aonde desejar e criar um link da pasta /usr/share/zoneminder/events para a pasta montada.&lt;br /&gt;
Meu problema ocorreu com o fato que durante o boot era atribuído um nome de device para o HD secundário e após a inicilização o mesmo era alterado, ou seja, &lt;br /&gt;
após incluir uma entrada no fstab para a montagem automática do mesmo, na inicialização do sistema o kernel montava o hd secundário no lugar do primário&lt;br /&gt;
e acabava efetuando um checkforced.&lt;br /&gt;
&lt;br /&gt;
Para resolver isso precisamos utilizar os UUIDS dos HDs.&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;blkid&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
O comando blkid lista os UUIDS dos HDs e com o mesmo é possível criar um fstab que não depende da nomenclatura do device no /dev&lt;br /&gt;
&lt;br /&gt;
Ficamos com uma entrada no fstab do tipo:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;UUID=a5a06f7d-91d4-406f-8000-748b3ee444f2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /home/zm&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ext3&amp;nbsp;&amp;nbsp; defaults,noatime,nodiratime,errors=remount-ro&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Note que utilizei também as opções &lt;b&gt;noatime,nodiratime&lt;/b&gt;, as mesmas são um pequeno ajuste para reduzir o tempo de acesso ao disco já que não me importo, neste caso, com o registro de quando foi o último acesso aos arquivos/diretórios.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;CRONTAB&lt;/b&gt;&lt;br /&gt;
Finalizando, embora tenha um espaço consideravel de armazenamento, o mesmo não é infinito.&lt;br /&gt;
Resolvi então limitar a 10 dias de gravação apenas.&lt;br /&gt;
Não pesquisei muito se existe uma forma de fazer isso a partir do próprio zoneminder mas, para início, uma simples linha no crontab resolveu meu problema:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;0 0 * * * find /home/zm -name "*.jpg" -mtime +10 -exec rm -f {} \;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Isto vai apagar apenas as imagens que o zoneminder cria na pasta de eventos que tenham mais que 10 dias, mas isso não apaga a referência que o ZM faz aos mesmos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Conclusão&lt;/span&gt; &lt;br /&gt;
Espero que, com um pouco mais de uso do Zoneminder, possa escrever mais detalhes sobre ajustes e melhorias neste setup, mas com esses passos é possível reproduzir o mesmo sistema que tenho como funcional no equipamento descrito.&lt;br /&gt;
Boa sorte a quem tentar o mesmo :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-4063268177992931349?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/PoI_-7UWAO8/cftv-com-zoneminder-e-linux.html</link><author>noreply@blogger.com (Renato)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-oZrKjLJ32U0/TsHBFsKw7XI/AAAAAAAACyo/XTpdUiEffvs/s72-c/via_cpu_367_489.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2011/11/cftv-com-zoneminder-e-linux.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-8354308844757623910</guid><pubDate>Thu, 31 Mar 2011 20:25:00 +0000</pubDate><atom:updated>2011-03-31T17:41:03.853-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">git</category><category domain="http://www.blogger.com/atom/ns#">Desenvolvimento</category><title>Diretórios vazios com o Git</title><description>Diversas vezes eu precisei manter um diretório vazio na árvore do projeto mas como o Git é um gerenciador de conteúdo, um diretório vazio não pode existir no repo.&lt;br /&gt;&lt;br /&gt;Uma solução simples é criar um arquivo .gitignore dentro de cada diretório que você queira manter e depois adicionar todo o conteúdo da pasta, &lt;span style="font-weight: bold;"&gt;com excessão dos arquivos .gitignore,&lt;/span&gt; ao .gitignore padrão.&lt;br /&gt;&lt;br /&gt;Exemplo:&lt;br /&gt;Digamos que você quer manter a pasta &lt;code&gt;public/uploads/images&lt;/code&gt; vazia no repo.&lt;br /&gt;Crie um arquivo .gitignore no caminho &lt;code&gt;public/uploads/images/.gitignore&lt;/code&gt;&lt;br /&gt;Edite o arquivo .gitignore padrão (na pasta raiz do projeto) e adicione as seguinte linhas:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public/uploads/images/*&lt;br /&gt;!.gitignore&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A ordem das regras é importante.&lt;/span&gt;&lt;br /&gt;Efetue um commit destas alterações adicionando os arquivos .gitignore e pronto.&lt;br /&gt;&lt;br /&gt;*Nota:&lt;br /&gt;Caso já existam arquivos no diretório que tenham sido comitados anteriormente, exclua os mesmos com o comando:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;git rm --cached /caminho/do/arquivo&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Happy Coding!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-8354308844757623910?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/jKIsEbNKE1o/diretorios-vazios-com-o-git.html</link><author>noreply@blogger.com (Renato)</author><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2011/03/diretorios-vazios-com-o-git.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-7462156107025893657</guid><pubDate>Sun, 13 Feb 2011 16:12:00 +0000</pubDate><atom:updated>2011-02-13T14:25:22.786-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">eletrônica</category><category domain="http://www.blogger.com/atom/ns#">Arduino</category><title>Arduino - Teste 1</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-4glAiMJw4ns/TVgFgnzpIhI/AAAAAAAACus/PA9TtPMKVc0/s1600/IMG_0807.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 206px;" src="http://2.bp.blogspot.com/-4glAiMJw4ns/TVgFgnzpIhI/AAAAAAAACus/PA9TtPMKVc0/s320/IMG_0807.jpg" alt="" id="BLOGGER_PHOTO_ID_5573210596870529554" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Seguindo a listinha de simples projetos para ir me familiarizando com o Arduino, o primeiro projetinho é bem simples, um botão, um led e dois resistores.&lt;br /&gt;&lt;br /&gt;A idéia é utilizar o Arduino para ler o estado do botão e dependendo do mesmo ligar ou desligar o led. Dei um pequena incrementada para fazer o led piscar enquanto o botão estiver precionado.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-NgdXExb3Uxo/TVgESUHNO-I/AAAAAAAACuk/FZsdRo4mTKM/s1600/Screen%2Bshot%2B2011-02-13%2Bat%2B14.11.45.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 298px; height: 320px;" src="http://1.bp.blogspot.com/-NgdXExb3Uxo/TVgESUHNO-I/AAAAAAAACuk/FZsdRo4mTKM/s320/Screen%2Bshot%2B2011-02-13%2Bat%2B14.11.45.png" alt="" id="BLOGGER_PHOTO_ID_5573209251554081762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Incrivelmente, demorei mais para tirar as fotos e fazer este post do que para montar o esquema eletrônico, o código e colocar o mesmo para rodar no Arduino.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-7462156107025893657?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/oTBblszJ05Y/arduino-teste-1.html</link><author>noreply@blogger.com (Renato)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-4glAiMJw4ns/TVgFgnzpIhI/AAAAAAAACus/PA9TtPMKVc0/s72-c/IMG_0807.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2011/02/arduino-teste-1.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-3926600178052038564</guid><pubDate>Sun, 13 Feb 2011 15:10:00 +0000</pubDate><atom:updated>2011-02-13T13:40:00.853-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">eletrônica</category><category domain="http://www.blogger.com/atom/ns#">Arduino</category><title>Arduino</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-usNCKClCP3A/TVf6SXqkUXI/AAAAAAAACuc/m-RnDM3uPU8/s1600/IMG_0805.JPG"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Eletrônica sempre me chamou a atenção.&lt;br /&gt;É um pouco trabalhoso dependendo do que se vai fazer, mas como no desenvolvimento de software, com um pouco de emprenho consegue-se construir algo interessante.&lt;br /&gt;&lt;br /&gt;Em 1994 eu estudava eletro-eletrônica, mas acredito que desde 1996 eu não estudava ou construia qualquer coisa utilizando componentes eletrônicos e ferro de solda.&lt;br /&gt;&lt;br /&gt;Mais ou menos por acaso, li alguns artigos na web sobre um produto chamado &lt;a href="http://www.arduino.cc/"&gt;Arduino&lt;/a&gt;.&lt;br /&gt;O Arduino é um projeto de eletrônica que visa facilitar o desenvolvimento de projetos de eletrônica digital e o estudo da mesma.&lt;br /&gt;&lt;br /&gt;Existem diversas vantagens em utilizar uma placa como o Arduino para estudar, e as possibilidades são inúmeras, dependendo apenas da imaginação de quem constrói.&lt;br /&gt;Tanto que um dos projetos mais interessantes que já vi feito com o mesmo é uma &lt;a href="http://blog.makerbot.com/"&gt;impressora 3D&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A lista de projetos que se pode encontrar é grande, com uma variedade espantosa, como pode ser visto na lista de videos do Vimeo que se encontra na url &lt;a href="http://vimeo.com/groups/arduinoprojects/videos"&gt;http://vimeo.com/groups/arduinoprojects/videos&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Um dos grandes detalhes é o fato de ser um projeto Open Source, ou seja, o projeto da placa do Arduino e diversos outros, tais como a impressora 3d, possuem seus esquemas disponíveis para download. É o mundo Open Source, tão popularizado por projetos como o Linux, no mundo da eletrônica.&lt;br /&gt;&lt;br /&gt;Conclusão, comprei um kit de iniciante na loja brasileira &lt;a href="http://www.robocore.net/"&gt;Robocore&lt;/a&gt; e pretendo retomar meus estudos de eletrônica com o mesmo.... vamos ver no que vai dar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-usNCKClCP3A/TVf6SXqkUXI/AAAAAAAACuc/m-RnDM3uPU8/s1600/IMG_0805.JPG"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/-usNCKClCP3A/TVf6SXqkUXI/AAAAAAAACuc/m-RnDM3uPU8/s320/IMG_0805.JPG" alt="" id="BLOGGER_PHOTO_ID_5573198257391423858" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-3926600178052038564?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/Zt5o5rPyfCw/arduino.html</link><author>noreply@blogger.com (Renato)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-usNCKClCP3A/TVf6SXqkUXI/AAAAAAAACuc/m-RnDM3uPU8/s72-c/IMG_0805.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2011/02/arduino.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-3903417585987783938</guid><pubDate>Sat, 18 Dec 2010 01:11:00 +0000</pubDate><atom:updated>2010-12-17T23:17:38.624-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">Tools</category><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">Zend</category><category domain="http://www.blogger.com/atom/ns#">Desenvolvimento</category><title>Zend_Filter_Hashpath</title><description>No passado, tive alguns problemas com o armazenamento de muitos arquivos de imagens em apenas um diretório.&lt;br /&gt;&lt;br /&gt;Quando o volume ficava muito grande, não era sequer possível listar o conteúdo pelo console.&lt;br /&gt;&lt;br /&gt;Depois desse episódio, passei a gravar os arquivos em subpastas, mas quase sempre acabava reescrevendo o código que fazia isso.&lt;br /&gt;&lt;br /&gt;Para solucionar esse problema criei um filtro que denominei &lt;a href="https://github.com/renatoaquino/Zend_Filter_Hashpath"&gt;Zend_Filter_Hashpath&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ele foi baseado na lógica do filtro Zend_Filter_File_Rename e em parte do código do Zend_Cache_Backend_File.&lt;br /&gt;&lt;br /&gt;Bom, mais info no repo e no código fonte:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/renatoaquino/Zend_Filter_Hashpath"&gt;https://github.com/renatoaquino/Zend_Filter_Hashpath&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-3903417585987783938?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/IAGm3CrHz0g/zendfilterhashpath.html</link><author>noreply@blogger.com (Renato)</author><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2010/12/zendfilterhashpath.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-4808598442045125261</guid><pubDate>Wed, 01 Sep 2010 12:51:00 +0000</pubDate><atom:updated>2010-09-01T09:56:17.789-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">Desenvolvimento</category><title>Humor de Programador</title><description>Quem disse que programadores não tem senso de humor?&lt;br /&gt;O comentário abaixo foi retirado de uma &lt;a href="http://stackoverflow.com/questions/184618/what-is-the-best-comment-in-source-code-you-have-ever-encountered/482129#482129"&gt;resposta&lt;/a&gt; do stackoverflow:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;&lt;span class="com"&gt;// &lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="com"&gt;// Dear maintainer:&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="com"&gt;// &lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="com"&gt;// Once you are done trying to 'optimize' this routine,&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="com"&gt;// and have realized what a terrible mistake that was,&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="com"&gt;// please increment the following counter as a warning&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="com"&gt;// to the next guy:&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="com"&gt;// &lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="com"&gt;// total_hours_wasted_here = 16&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="com"&gt;//&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="pln"&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;Mais no &lt;a href="http://stackoverflow.com/questions/184618/what-is-the-best-comment-in-source-code-you-have-ever-encountered"&gt;stackoverflow&lt;/a&gt;.&lt;a href="http://stackoverflow.com/questions/184618/what-is-the-best-comment-in-source-code-you-have-ever-encountered"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-4808598442045125261?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/k_MIWoJiwjw/humor-de-programador.html</link><author>noreply@blogger.com (Renato)</author><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2010/09/humor-de-programador.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-8359372988426230806</guid><pubDate>Tue, 13 Oct 2009 14:15:00 +0000</pubDate><atom:updated>2009-10-13T11:26:32.669-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">SOCIAL</category><title>TED x SP</title><description>A um tempinho eu &lt;a href="http://renato-aquino.blogspot.com/2007/11/ted.html"&gt;escrevo&lt;/a&gt; ou adiciono links de videos que assisto do &lt;a href="http://www.ted.com/"&gt;TED&lt;/a&gt; que acho interessantes.&lt;br /&gt;&lt;br /&gt;Desta vez estou escrevendo a respeito para avisar que será realizada uma das convenções do em &lt;a href="http://www.tedxsaopaulo.com.br"&gt;São Paulo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Os palestrantes, como se espera do TED, fazem parte das mais diversas áreas.&lt;br /&gt;Entre eles temos Regina Casé atriz e apresentadora, Ronaldo Lemos diretor de Técnologia e Sociedade na escola de direito da FGV, &lt;a href="http://www.tedxsaopaulo.com.br/palestrantes/"&gt;entre outros&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Para participar está sendo feita uma triagem &lt;a href="http://www.tedxsaopaulo.com.br/inscricao/"&gt;questionando&lt;/a&gt; sobre o que o "Brasil pode oferecer ao mundo" e "O que o inscrito tem a oferecer ao Brasil", entre outras.&lt;br /&gt;&lt;br /&gt;Você pode também acompanhar via Twitter em &lt;a href="http://twitter.com/tedxsp"&gt;http://twitter.com/tedxsp&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Espero que seja tão interessante quanto os demais vídeos que já assisti deste projeto.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-8359372988426230806?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/LlArfKm5sQ4/ted-x-sp.html</link><author>noreply@blogger.com (Renato)</author><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2009/10/ted-x-sp.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-9097715772308513875</guid><pubDate>Wed, 10 Jun 2009 16:55:00 +0000</pubDate><atom:updated>2009-06-10T14:13:38.174-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tools</category><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">git</category><category domain="http://www.blogger.com/atom/ns#">Desenvolvimento</category><title>A parábola do Git</title><description>Resolvi fazer uma tradução livre do texto &lt;a href="http://tom.preston-werner.com/2009/05/19/the-git-parable.html"&gt;The Git Parable&lt;/a&gt; do Tom Preston-Werner.&lt;br /&gt;Boa leitura....&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;A parábola do Git&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Git é um sistema simples mas extremamente poderoso.&lt;br /&gt;A maioria das pessoas tentam ensinar Git pela demonstração de alguns comandos chegando a um "tadaaaaa.", acredito que este método seja ineficiente. Esta abordagem vai ensiná-lo a usar Git para realizar tarefas simples, mas os comandos irão sempre parecer encantamentos mágicos.&lt;br /&gt;Fazer qualquer coisa além do trivial será aterrorizador. Enquanto não compreender os conceitos nos quais o Git é feito você se sentirá perdido.&lt;br /&gt;&lt;br /&gt;A seguinte parábola vai levá-lo através da criação de um sistema similar ao Git a partir de sua base. Entender os conceitos apresentados aqui é a melhor preparação para alcançar o poder total do Git.&lt;br /&gt;Os conceitos em si são bastante simples, mas criam uma imensa gama de funcionalidades. Leia esta parábola do começo ao fim e deverá ter poucos problemas para tornar-se um mestre nos vários comandos do Git, liberando o maravilhoso poder que o mesmo disponibiliza.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;A parábola&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Imagine que você tem um computador que não tem nada além de um editor de textos e alguns comandos de sistema de arquivos.&lt;br /&gt;Agora, imagine que você decidiu escrever um grande programa neste sistema. Como você é um desenvolvedor responsável, decidiu que precisa inventar alguma forma de manter o registro das versões de seu programa de forma que possa recuperar códigos que tenham sido alterados ou excluídos.&lt;br /&gt;O que segue é uma história sobre como você pode arquitetar tal sistema de controle de versão (VCS) e a razão por traz das escolhas da arquitetura.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Fotocópias ( Snapshots )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Alfredo é um amigo seu que trabalha no supermercado como fotógrafo em uma boutique tipo "Momentos Especiais".&lt;br /&gt;Fica o dia inteiro tirando fotos de garotinhos com poses esquisitas com um fundo de selva ou oceano.&lt;br /&gt;Durante um de seus freqüentes almoços no stande de pretzels, Alfredo lhe conta uma história sobre uma mulher de nome Hazel que traz sua filha&lt;br /&gt;para tirar um retrato todo ano no mesmo dia. "Ela traz todas as fotos dos anos anteriores junto" lhe conta o Alfredo.&lt;br /&gt;"Ela gosta de recordar como sua filha era em cada fase diferente, como se aquelas fotocópias pudessem realmente fazê-la mover o tempo até o instante daquelas memórias."&lt;br /&gt;&lt;br /&gt;Repentinamente, a colocação inocente do Alfredo age como um catalisador para você enxergar um solução ideal para seu dilema de controle de versão.&lt;br /&gt;Fotocópias ou snapshots, como pontos de salvamento em um vide-o game, são realmente o que lhe importa quando precisa interagir com um sistema de controle de versão.&lt;br /&gt;&lt;br /&gt;E se você pudesse tirar fotocópias do seu código a qualquer momento e ressuscitar esse código quando quizese?&lt;br /&gt;Alfredo percebe o sentimento de realização espalhado por todo seu rosto e sabe que você está a ponto de deixá-lo sem dizer uma palavra e vai implementar qualquer idéia genial que ele acabou de lhe causar. Você não o desaponta.&lt;br /&gt;&lt;br /&gt;Você começa seu projeto em um diretório chamado working. Conforme você programa, tenta implementar uma característica por vez.&lt;br /&gt;Quando completa uma parte auto-contida da característica, certifica-se que todos os arquivos foram salvos e faz então uma cópia do diretório de trabalho, dando a ele o nome snapshot-0. Depois de efetuar a cópia, garante que ela nunca será alterada.&lt;br /&gt;&lt;br /&gt;Após a próxima parte do trabalho, você faz outra cópia, mas desta vez o novo diretório é denominado snapshot-1, e assim por diante.&lt;br /&gt;&lt;br /&gt;Para recordar quais mudanças você fez em cada snapshot, você adiciona um arquivo especial chamado mensagem a cada diretório de snapshot que contém&lt;br /&gt;um resumo do trabalho efetuado e a data de realização. Verificando o conteúdo de cada arquivo mensagem fica fácil de encontrar uma mudança específica feita no passado, caso você tenha que ressuscitar algum código antigo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Galhos ( Branches )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Após algum tempo no projeto, uma versão candidata à publicação começa a surgir. Madrugadas no teclado finalmente geraram o snapshot-99, a forma&lt;br /&gt;nascente do que será a Versão de Publicação 1.0. Então esta cópia é empacotada e distribuída às massas sedentas que aguardam.&lt;br /&gt;Tocado pela excelente resposta ao seu software, você se esforça, determinado a fazer com que a próxima versão seja um sucesso ainda maior.&lt;br /&gt;&lt;br /&gt;Seu VCS até então tem sido um companheiro a prova de falhas.&lt;br /&gt;Versões antigas de seu código estão lá e quando você precisa delas podem ser encontradas facilmente. Mas, não muito após sua publicação, relatórios&lt;br /&gt;de erro começam a chegar. Ninguém é perfeito, você afirma a si mesmo, e o snapshot-99 está pronto para ser recuperado, orgulhoso por ser trazido&lt;br /&gt;de volta para serem aplicadas as correções dos problemas.&lt;br /&gt;&lt;br /&gt;Desde a publicação, você criou outros 10 snapshots. Este novo trabalho não deve ser incluído na versão correção de erros 1.0.1 que você vai criar.&lt;br /&gt;Para resolver isso, você copia o snapshot-99 para working, deixando seu diretório de trabalho exatamente no ponto onde a versão 1.0 foi publicada.&lt;br /&gt;Algumas linhas de código são tratadas e o problema está corrigido.&lt;br /&gt;&lt;br /&gt;É neste momento que um problema torna-se aparente. o VCS trata muito bem com desenvolvimento linear, mas pela primeira vez, você precisa criar&lt;br /&gt;um novo snapshot que não é descendente direto do último. Se você criar o snapshot-110 ( lembre-se que você já criou 10 cópias desde a publicação),&lt;br /&gt;vai interromper o fluxo linear e não terá como determinar o ancestral da cópia. Claramente você precisa de algo mais poderoso que este sistema linear.&lt;br /&gt;&lt;br /&gt;Estudos demonstram que mesmo pequenas exposições à natureza podem ajudar a recarregar o potencial criativo da mente.&lt;br /&gt;Você esteve atrás da luz polarizada artificialmente de seu monitor por dias. Uma caminhada através das árvores sob o ar de outono vão lhe fazer bem&lt;br /&gt;e com alguma sorte, ajudá-lo a encontrar uma solução ideal para seu problema.&lt;br /&gt;&lt;br /&gt;Os grandes carvalhos que margeiam a trilha sempre lhe agradaram. Eles parecem repousar rígidos e orgulhosos do perfeito céu azul.&lt;br /&gt;Metade das folhas avermelhadas caíram de seus galhos, deixando um intrincado padrão de galhos como rastro.&lt;br /&gt;Fixando em um dos milhares de tipos de galhos você pacientemente tenta seguí-lo de volta até o solitário tronco.&lt;br /&gt;Esta estrutura organicamente produzida permite esta grande complexidade, mas as regras para encontrar o caminho de volta para o tronco são tão&lt;br /&gt;simples e perfeitas para manter o caminho de múltiplas linhas de desenvolvimento!&lt;br /&gt;Vem a tona que é verdadeiro o que dizem a respeito da natureza e criatividade.&lt;br /&gt;&lt;br /&gt;Observando seu histórico de desenvolvimento como uma árvore, resolver o problema de ancestralidade torna-se trivial.&lt;br /&gt;Tudo que você precisa é incluir o nome da snapshot pai no arquivo de mensagem que você escreve para cada snapshot.&lt;br /&gt;Adicionando apenas um único ponteiro para o antecessor possibilitará, fácil e precisamente, traçar o histórico de um snapshot, todo o caminho&lt;br /&gt;de volta até sua raiz.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Nomes de Galhos ( Branch Names )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Seu histórico de código é agora uma árvore. Ao invés de ter apenas um único último snapshot, você tem duas: uma para cada galho ou 'branch'.&lt;br /&gt;Com um sistema linear, seu sistema de numeração seqüencial permite facilmente identificar o último snapshot. Agora esta habilidade foi perdida.&lt;br /&gt;&lt;br /&gt;Criar novos branchs de desenvolvimento tornou-se tão simples que você vai tirar vantagem disso o tempo todo.&lt;br /&gt;Você criará branchs para fixar as antigas publicações, para experimentos que podem não serem concluídos; de fato torna-se possível criar um novo&lt;br /&gt;branch para cada nova característica iniciada!&lt;br /&gt;&lt;br /&gt;Mas como tudo bom na vida, existe um preço a ser pago. Cada vez que você cria um snapshot, você precisa lembrar que ele se torna o último no&lt;br /&gt;seu próprio branch. Sem esta informação, alternar para um novo branch seria um trabalho extremamente penoso.&lt;br /&gt;&lt;br /&gt;Toda vez que cria um novo branch você provavelmente da uma nome para ele em sua cabeça. Você provavelmente diz: "Este será o branch de manutenção da Versão 1.0".&lt;br /&gt;Talvez prefira referir ao formal branch de desenvolvimento linear como o branch "mestre" ou "master".&lt;br /&gt;&lt;br /&gt;Pense nisso um pouco mais profundamente. Da perspectiva de uma árvore, o que significa dar nome a um galho?&lt;br /&gt;Nomear cada snapshot que aparecer no histórico de um branch resolveria seu problema, mas iria requirir o armazenamento de uma potencialmente grande&lt;br /&gt;quantia de dados. Adicionalmente, isso ainda não ajudaria a eficientemente encontrar o último snapshot de um branch.&lt;br /&gt;&lt;br /&gt;A única informação necessária para identificar um branch é a localização do último snapshot daquele branch.&lt;br /&gt;Se precisar saber a lista de snapshots que são parte de um branch pode facilmente traçar pelo parentesco.&lt;br /&gt;&lt;br /&gt;Guardar o nome do branch é trivial. Em um arquivo chamado branchs, armazenado fora de qualquer snapshot específico, você simplesmente&lt;br /&gt;lista os pares nome/snapshot que representaram os branchs. Para alternar para um branch nomeado precisa apenas procurar pelo snapshot&lt;br /&gt;correspondente neste arquivo de referencia.&lt;br /&gt;&lt;br /&gt;Como você está armazenando apenas o último snapshot de cada branch, criar um novo snapshot contêm um passo adicional.&lt;br /&gt;Se seu novo snapshot estiver sendo criado como parte de um branch, o arquivo de branchs precisa ser atualizado para que o nome do mesmo fique&lt;br /&gt;associado com o último snapshot. Um pequeno preço a pagar pelo benefício.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Etiquetas ( Tags )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Após utilizar branchs por um tempo, você percebe que eles podem servir para dois propósitos. Primeiro, ele podem atuar com ponteiros de snapshots&lt;br /&gt;para que você possa manter o rastro dos branchs. Segundo, podem apontar para um snapshot específica e nunca mudar.&lt;br /&gt;O primeiro caso permite manter o desenvolvimento em execução, coisas como "Manutenção de Publicação". O segundo caso é útil para marcar pontos de&lt;br /&gt;interesse, tais como "Versão 1.0" ou "Versão 1.1".&lt;br /&gt;&lt;br /&gt;Misturar ambos os usos em apenas um arquivo parece bagunçado. Ambos os tipos são ponteiros para snapshots mas um muda e outro não.&lt;br /&gt;Para clarificar e manter a solução elegante, você decide criar outro arquivo chamado etiquetas (tags) para manter ponteiros do segundo tipo.&lt;br /&gt;&lt;br /&gt;Manter estes ponteiros, dois parentes comuns, em arquivos separados ira ajudá-lo a não tratar acidentalmente um branch como tag e vice-versa.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Distribuído ( Distributed )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Trabalhar por si mesmo acaba tornando-se bastante solitário. Não seria legal se pude-se convidar um amigo para trabalhar em seu projeto com você?&lt;br /&gt;Bem, você está com sorte. Sua amiga Zoe tem um sistema de computador como o seu e quer ajudar no projeto. Como você criou um ótimo sistema de&lt;br /&gt;controle de versão, acaba contando a ela sobre o mesmo e envia uma cópia de todos seus snapshots, branchs e tags para que ela possa  aproveitar&lt;br /&gt;dos mesmos benefícios do histórico de versões.&lt;br /&gt;&lt;br /&gt;É ótimo ter Zoe no time mas ela tem o hábito de fazer longas viagens para lugares distantes e sem acesso à internet.&lt;br /&gt;Assim que ela pegou o código fonte, saiu em um vôo para a Patagônia e você não ouviu falar dela por uma semana.&lt;br /&gt;Neste meio tempo, ambos programaram uma tempestade. Quando ela finalmente voltou, você descobriu uma falha critica no seu VCS.&lt;br /&gt;Como ambos estavam utilizando o mesmo sistema de numeração, cada um possui diretórios chamados 'snapshot-114', 'snapshot-115' e assim por diante,&lt;br /&gt;mas com diferentes conteúdos.&lt;br /&gt;&lt;br /&gt;Para piorar as coisas, você nem sabe quem produziu as alterações daquelas novas fotocópias. Juntos, concebem então um plano para tratar destes problemas.&lt;br /&gt;Primeiro, as mensagens dos snapshots irão obrigatoriamente conter o nome do autor e seu e-mail. Segundo, snapshots não serão mais nomeadas por&lt;br /&gt;simples números. No lugar disto, vocês utilizarão o conteúdo do arquivo de mensagem para produzir uma cifra ou hash. Este hash será garantidamente única&lt;br /&gt;para o snapshot já que duas mensagens nunca terão a mesma data, mensagem, antecessor e autor.&lt;br /&gt;Para fazer as coisas correrem suavemente, ambos concordam em utilizar o algoritmo de hash SHA1 que pega o conteúdo de um arquivo e produz uma&lt;br /&gt;palavra de 40 caracteres hexadecimais. Ambos atualizam seus históricos com a nova técnica no lugar dos colisivos diretórios 'snapshot-114' e agora&lt;br /&gt;possuem diretórios distintos nomeados ‘8ba3441b6b89cad23387ee875f2ae55069291f4b’ e ‘db9ecb5b5a6294a8733503ab57577db96ff2249e’.&lt;br /&gt;&lt;br /&gt;Com a atualização do esquema de nomenclatura, torna-se trivial recuperar todas as cópias do computador de Zoe e colocá-las no seu repositório.&lt;br /&gt;Como cada cópia especifica sua antecessora, quando possuem mensagens idênticas ( e também cópias idênticas ) possuirão os mesmos nomes não importa&lt;br /&gt;onde são criados, o histórico da base de código pode continuar a ser mantido como uma árvore. A diferença é que a árvore é construída por snapshots&lt;br /&gt;criadas por Zoe e você.&lt;br /&gt;&lt;br /&gt;Este ponto é importante o bastante para garantir repetição. Uma cópia é identificada pelo SHA1 que a identifica unicamente ( e seu antecessor ).&lt;br /&gt;Estes snapshots podem ser criadas e movidas entre computadores sem perder sua identidade ou onde pertencem no histórico da árvore do projeto.&lt;br /&gt;Ainda mais, cópias podem ser compartilhadas ou mantidas privadas de acordo com sua vontade. Se você possuir alguns snapshots experimentais&lt;br /&gt;que deseja manter para si mesmo, pode fazê-lo facilmente. Apenas não as torne disponíveis para Zoe!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Desconectado ( Offline )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O hábito de viajar de Zoe a faz passar incontáveis horas em aviões e barcos. A maior parte dos lugares que visita não possui acesso à internet disponível.&lt;br /&gt;No fim do dia, ela passou mais tempo desconectada que conectada.&lt;br /&gt;&lt;br /&gt;Não é surpresa, no entanto, que Zoe adora seu VCS. As operações do dia a dia que ela precisa fazer podem ser efetuadas localmente. O único momento&lt;br /&gt;que ela precisa de uma conexão de rede é quando está pronta para compartilhar seus snapshots com você.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Junções ( Merges )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Antes de Zoe sair para sua viagem, você pediu-a para trabalhar em um branch chamado 'math' e para implementar uma função que gera números primos.&lt;br /&gt;Neste meio tempo, você esteve também esteve desenvolvendo algo no branch 'math', só que esteve trabalhando na função que gera números mágicos;&lt;br /&gt;Agora Zoe retornou e você está encarando a tarefa de unir estes dois diferentes branchs de desenvolvimento em uma único snapshot.&lt;br /&gt;Como ambos trabalharam em tarefas distintas, a junção é simples. Enquanto construía a mensagem do snapshot para a junção, você percebe que esta&lt;br /&gt;snapshot é especial. No lugar de ter apenas um antecessor, esta junção, ou merge, possui dois! O primeiro é a sua última snapshot no branch 'math'&lt;br /&gt;e o segundo é o branch 'math' de Zoe. O snapshot de junção contêm todas as mudanças além daquelas necessárias para unir os dois antecessores em uma&lt;br /&gt;única base de código;&lt;br /&gt;&lt;br /&gt;Completado o merge, Zoe pega todos os snapshots que você possui e ela não, o que inclui seu desenvolvimento no branch 'math' e sua snapshot de merge.&lt;br /&gt;Uma vez que ela fez isso, ambos os históricos casam perfeitamente!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Reescrevendo o Histórico ( Rewriting History )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como muitos desenvolvedores de software, você tem a compulsão de manter seu código limpo e muito bem organizado. Isso leva ao desejo de manter seu&lt;br /&gt;histórico de código com esmero. Noite passada você chegou após tomar alguns goles de Guinness em um bar e começou a programar, produzindo um monte&lt;br /&gt;de snapshots no caminho. Hoje de manhã, uma revisão da produção da noite passada fez você se assustar um pouco. No geral, o código está bom, mas&lt;br /&gt;você teve uma série de enganos que foram corrigidos nos snapshots posteriores.&lt;br /&gt;&lt;br /&gt;Vamos dizer que a branch na qual você realizou o desenvolvimento bêbado é chamada 'drunk' e você fez três snapshots após ter chegado do bar.&lt;br /&gt;Se o nome 'drunk' aponta para o último snapshot neste branch, então você pode utilizar uma notação útil para referenciar o antecessor deste snapshot.&lt;br /&gt;A notação 'drunk^' significa o pai do snapshot apontada pelo branch 'drunk'. Similarmente 'drunk^^' significa o avô do snapshot 'drunk'.&lt;br /&gt;Assim os snapshots em ordem cronológica são 'drunk^^', 'drunk^' e 'drunk'.&lt;br /&gt;&lt;br /&gt;Você realmente gostaria que estes três snapshots fossem dois snapshots limpos. Uma que muda uma função existente, e uma que adiciona um novo arquivo.&lt;br /&gt;Para realizar esta revisão do histórico você copia 'drunk' para working e exclui o arquivo que é novo na série. Agora working representa as&lt;br /&gt;modificações corretas na função existente. Você pode criar um novo snapshot de working e escrever a mensagem apropriada para as mudanças.&lt;br /&gt;Como antecessor você especifica o SHA1 do snapshot 'drunk^^^', essencialmente criando um novo branch do mesmo snapshot da noite passada.&lt;br /&gt;Agora pode copiar 'drunk' para working e executar um novo snapshot com a adição daquele novo arquivo. Como antecessor você especifica aquele&lt;br /&gt;snapshot que acabamos de criar antes deste.&lt;br /&gt;&lt;br /&gt;Como último passo, você muda o branch 'drunk' e aponta para o último snapshot que acabou de fazer.&lt;br /&gt;&lt;br /&gt;O histórico do branch 'drunk' agora representa uma versão melhor daquilo que fez na noite passada. Os outros snapshots que você substituiu não&lt;br /&gt;são mais necessários e podem ser excluídos ou deixados para a posteridade. Nenhum nome da branch está apontando para eles portanto será difícil&lt;br /&gt;de encontrá-los depois, mas se você não os excluir estarão lá.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Colocando no palco ( Staging Area )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mesmo tentando manter suas modificações relacionadas a uma única característica ou pedaço lógico, algumas vezes você precisa começar a trabalhar&lt;br /&gt;em algo totalmente não relacionado. No meio do caminho percebe que seu diretório de trabalho contêm algo que deveria ser separado em dois&lt;br /&gt;snapshots discretos.&lt;br /&gt;Para ajudá-lo com essa situação chata, o conceito área do palco é útil. Esta área atua como um intermediário entre seu trabalho e o snapshot&lt;br /&gt;final. Cada vez que você termina um snapshot, você também copia aquele snapshot para o diretório do palco.&lt;br /&gt;Agora, toda vez que terminar uma edição de um novo arquivo, criar um novo arquivo, ou remover um arquivo, você decide quando esta mudança deve&lt;br /&gt;ser parte de seu próximo snapshot. Caso deseje, você replica a mudança dentro do palco. Senão, pode deixá-la e aplicar em um snapshot futuro.&lt;br /&gt;De agora em diante, snapshot são criados diretamente do diretório do palco.&lt;br /&gt;&lt;br /&gt;Esta separação entre programar e preparar o palco torna fácil especificar o que é e o que não é incluído no próximo snapshot.&lt;br /&gt;Você não precisa mais se preocupar muito sobre causar uma mudança acidental não relacionada no seu diretório de trabalho.&lt;br /&gt;&lt;br /&gt;No entanto, você precisa ser um pouco cuidadoso. Considere um arquivo de nome LEIAME. Você edita este arquivo e então replica o mesmo no palco.&lt;br /&gt;Você continua com o que tem que fazer, editando outros arquivos. Depois de um tempinho, você faz outra alteração no LEIAME. Agora você tem duas&lt;br /&gt;alterações neste arquivo, mas apenas uma está no palco! Se criar um snapshot agora, sua segunda alteração estará ausente.&lt;br /&gt;&lt;br /&gt;A lição nisso: cada nova edição precisa ser adicionada ao palco se é para ser parte do próximo snapshot.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Diferenças ( Diffs )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Com um diretório de trabalho, um palco e um monte de snapshots armazenados, começa a ficar confuso notar quais diferenças existem entre eles. Uma mensagem de snapshot apenas fornece um resumo do que mudou, não exatamente quais linhas foram mudadas entre dois arquivos.&lt;br /&gt;&lt;br /&gt;Utilizando um algoritmo de diferenciação, você pode implementar um pequeno programa que mostra as diferenças em duas bases de código.&lt;br /&gt;Conforme for desenvolvendo e copiando coisas do seu diretório de trabalho para o palco, tudo que vai realmente querer é uma maneira fácil de visualizar as diferenças entre os dois, assim pode determinar o que mais precisa ser colocado no palco. É também importante notar como o palco está diferente do último snapshot, uma vez que estas mudanças são o que irá se tornar parte do próximo snapshot que produzir.&lt;br /&gt;&lt;br /&gt;Existem muitas outras diferenças que você pode querer ver. Entre um snapshot e seu antecessor iria mostrar um conjunto de mudanças que foram introduzidas pelo snapshot. A diferenciação entre dois branchs poderia ser um auxílio para garantir que seu desenvolvimento não vagou muito distante da linha principal.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Eliminando Duplicação ( Eliminating Duplication )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Depois de algumas viagens para a Namibia, Istanbul e Galapagos, Zoe começa a reclamar que seu disco rígido está cheio com milhares de arquivos com&lt;br /&gt;cópias praticamente iguais do software. Você também tem sentido que todas aquelas duplicações são desperdícios.&lt;br /&gt;Depois de pensar um pouco, você chega a uma solução bastante inteligente.&lt;br /&gt;&lt;br /&gt;Você recorda que aquele hash SHA1 produz uma palavra curta que é única para o conteúdo de um arquivo.  Iniciando com o primeiríssimo snapshot no&lt;br /&gt;histórico do projeto, você começa o processo de conversão. Primeiro, você cria um diretório chamado objetos fora do histórico de código. Depois, encontra o mais profundo diretório aninhando em um snapshot. Adicionalmente, você abre um arquivo temporário para escrita.&lt;br /&gt;Para cada arquivo neste diretório você executa três passos.&lt;br /&gt;&lt;br /&gt;Passo 1: Calcular o SHA1 de seu conteúdo.&lt;br /&gt;&lt;br /&gt;Passo 2: Adicionar uma entrada no arquivo temporário que contêm a palavra blob ( grande objeto binário ), o SHA1 do Passo 1 e o nome do arquivo.&lt;br /&gt;&lt;br /&gt;Passo 3: Copia o arquivo para o diretório de objetos e renomeia-o para o SHA1 do Passo 1.&lt;br /&gt;&lt;br /&gt;Uma vez concluído todos os arquivos, calcule o SHA1 do arquivo temporário e use-o para nomeá-lo, também o colocando no diretório de objetos.&lt;br /&gt;&lt;br /&gt;Se em algum momento o diretório de objetos possuir um arquivo com o dado nome, então você já armazenou o conteúdo daquele arquivo e não existe&lt;br /&gt;necessidade de fazê-lo novamente.&lt;br /&gt;&lt;br /&gt;Agora, suba um diretório e comece novamente. Mas desta vez, quando você chegar ao diretório que acabou de processar, inclua a palavra 'tree', o SHA1&lt;br /&gt;do arquivo temporário da última vez, e o nome do diretório no novo arquivo temporário. Nesse esquema, você pode fazer uma árvore de objetos&lt;br /&gt;arquivo e diretórios que contêm os SHA1s e nomes dos arquivos e objetos de diretório que eles contêm.&lt;br /&gt;&lt;br /&gt;Quando aplicar o processo em cada diretório e arquivo no snapshot, você terá um único "arquivo objeto diretório raiz" e seu correspondente SHA1.&lt;br /&gt;Como nada contém o diretório raiz, você precisa gravar o SHA1 da árvore raiz em algum outro lugar. Um local ideal para armazenar é no arquivo de&lt;br /&gt;mensagem do snapshot. Assim, a unicidade do SHA1 da mensagem também depende de todo o conteúdo do snapshot, e você pode garantir com absoluta&lt;br /&gt;certeza que duas mensagens de snapshots com SHA1s idênticas contêm os mesmos arquivos!&lt;br /&gt;&lt;br /&gt;É também conveniente criar um objeto da mensagem do snapshot da mesma maneira que fez para blobs e árvores. Como você está mantendo uma lista de branchs e nomes de tags que apontam para o SHA1 da mensagem você não precisa se preocupar com perder o rastro de quais snapshots são importantes para você.&lt;br /&gt;&lt;br /&gt;Com todas estas informações armazenadas no diretório de objetos, você pode seguramente excluir o diretório de snapshots que usou como fonte desta operação. Se desejar reconstituir o snapshot no futuro é simples como seguir o SHA1 da branch armazenada no arquivo de mensagem e extrair cada árvore e blob no seu diretório e arquivo correspondente.&lt;br /&gt;&lt;br /&gt;Para um simples snapshot, este processo de transformação não lhe provê muito. Você basicamente converteu um sistema de arquivos em outro e criou um monte de trabalho a ser feito. Os benefícios reais deste sistema aparecem com o reuso de árvores e blobs entre os snapshots.&lt;br /&gt;Imagine dois snapshots seqüenciais nos quais apenas um arquivo no diretório raiz foi alterado. Se ambos os snapshots contêm 10 diretórios e 100 arquivos, o processo de transformação criará 10 árvores e 100 blobs do primeiro snapshot porem apenas 1 novo blob e 1 nova árvore do segundo snapshot!&lt;br /&gt;&lt;br /&gt;Por converter todo o diretório de snapshots do sistema antigo para os arquivos objeto do novo, você drasticamente reduz o número de arquivos que são armazenados no disco. Agora, no lugar de talvez armazenar 50 cópias de arquivos idênticos de um arquivo que raramente muda, você mantém apenas um.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Comprimindo Blobs ( Compressing Blobs )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Eliminando duplicações de blobs e árvores reduz significativamente o total de armazenamento do histórico do projeto, mas não é a única coisa que você pode fazer para salvar espaço. Código fonte é apenas texto e pode ser eficientemente compactado utilizando um algoritmo como LZW ou DEFLATE.&lt;br /&gt;Se você compactar cada blob antes de computar seu SHA1 e salvá-lo no disco pode reduzir o total de armazenamento do histórico para outra quantia bastante admirável.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;O verdadeiro Git ( The True Git )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O VCS que você construiu é agora quase uma cópia do Git. A principal diferença é que o Git lhe fornece belas ferramentas de linha de comando para tratar tais coisas como criar snapshots e trocar para antigos ( o Git usa o termo "commit" no lugar de "snapshot"), traçar histórico, manter branchs atualizados, replicar mudanças de outras pessoas, unir e analisar diferenças de branchs, a centenas de outras tarefas comuns (e outras nem tão comuns).&lt;br /&gt;&lt;br /&gt;Conforme você continuar a aprender o Git, mantenha está parábola em mente. Git é realmente simples nos bastidores, e é sua simplicidade que o faz tão flexível e poderoso. Uma última coisa antes de correr e começar a aprender os comandos do Git: lembre-se que é quase impossível perder um trabalho que foi comitado. Até mesmo quando excluir um branch, tudo que ocorre é que o ponteiro para aquele commit será removido.&lt;br /&gt;&lt;br /&gt;Todos os snapshots continuarão no diretório de objetos, você apenas precisa escavar o SHA1 do commit. Nestes casos, procure com o "git reflog.&lt;br /&gt;Ele contêm o histórico do que cada branch apontou para e em tempos de crise, vai salvar o dia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-9097715772308513875?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/F0fEXE6cdoU/parabola-do-git.html</link><author>noreply@blogger.com (Renato)</author><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2009/06/parabola-do-git.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-967589861983207288</guid><pubDate>Tue, 26 May 2009 16:44:00 +0000</pubDate><atom:updated>2009-05-26T13:50:08.521-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tools</category><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">git</category><category domain="http://www.blogger.com/atom/ns#">Desenvolvimento</category><title>Git - entendendo a lógica</title><description>Muito bem, &lt;a href="http://git.or.cz/"&gt;git&lt;/a&gt; é uma ferramenta fantástica, mas as vezes ficava curioso com o como as coisas funcionavam internamente.&lt;br /&gt;Procurando na net, encontrei a &lt;a href="http://tom.preston-werner.com/2009/05/19/the-git-parable.html"&gt;The Git Parable&lt;/a&gt;, uma historinha sobre o mecanismo interno e como chegou ao que é. Elucidativo demais.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Git is a simple, but extremely powerful system. Most people try to teach Git by demonstrating a few dozen commands and then yelling “tadaaaaa.” I believe this method is flawed. Such a treatment may leave you with the ability to use Git to perform simple tasks, but the Git commands will still feel like magical incantations. Doing anything out of the ordinary will be terrifying. Until you understand the concepts upon which Git is built, you’ll feel like a stranger in a foreign land.&lt;/blockquote&gt;&lt;br /&gt;Para ler com paciência:&lt;br /&gt;&lt;a href="http://tom.preston-werner.com/2009/05/19/the-git-parable.html"&gt;http://tom.preston-werner.com/2009/05/19/the-git-parable.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-967589861983207288?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/lOVm7TWXfdI/git-entendendo-logica.html</link><author>noreply@blogger.com (Renato)</author><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2009/05/git-entendendo-logica.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-305589995061998300</guid><pubDate>Mon, 13 Apr 2009 12:23:00 +0000</pubDate><atom:updated>2009-04-13T09:30:15.965-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tools</category><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">trojan</category><category domain="http://www.blogger.com/atom/ns#">SOCIAL</category><title>Conficker</title><description>O Conficker é um &lt;a href="http://en.wikipedia.org/wiki/Computer_worm"&gt;Worm&lt;/a&gt; para Windows que está rodando na rede desde outubro de 2008 e tem se tornado a praga da internet.&lt;br /&gt;&lt;br /&gt;Se seu computador tem dado muitas falhas de conexão sem motivo aparente, pode ser que você esteja sendo hospedeiro do mesmo.&lt;br /&gt;&lt;br /&gt;Maneira rápida de descobrir?&lt;br /&gt;Acesse &lt;a href="http://www.confickerworkinggroup.org/infection_test/cfeyechart.html"&gt;http://www.confickerworkinggroup.org/infection_test/cfeyechart.html &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;É só observar quantas imagens aparecem na parte superior e comparar com a descrição que vem abaixo.&lt;br /&gt;&lt;br /&gt;Descobriu que está infectado?&lt;br /&gt;Aqui tem links para atualizações da Microsoft:&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Conficker#Removal"&gt;http://en.wikipedia.org/wiki/Conficker#Removal&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Boa sorte!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-305589995061998300?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/RGHopz09ZpY/conficker.html</link><author>noreply@blogger.com (Renato)</author><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2009/04/conficker.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-8976427385546305119</guid><pubDate>Mon, 06 Apr 2009 20:36:00 +0000</pubDate><atom:updated>2009-04-06T17:39:23.322-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tools</category><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">Desenvolvimento</category><category domain="http://www.blogger.com/atom/ns#">SOCIAL</category><category domain="http://www.blogger.com/atom/ns#">Firefox</category><title>mooUrl Ubiquity Command</title><description>Brincando com a API do &lt;a href="http://labs.mozilla.com/2008/08/introducing-ubiquity/"&gt;Ubiquity&lt;/a&gt;, acabei fazendo este comando para utilizar o &lt;a href="http://moourl.com"&gt;moourl&lt;/a&gt; de forma similar ao tinyurl.&lt;br /&gt;&lt;br /&gt;Vamos então ao código:&lt;br /&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: rgb(96, 160, 176); font-style: italic;"&gt;/*&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(96, 160, 176); font-style: italic;"&gt; * mooUrl command for Firefox Ubiquity extension.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(96, 160, 176); font-style: italic;"&gt; * date: 03/04/2009&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(96, 160, 176); font-style: italic;"&gt; * author: Renato Aquino &amp;lt;renato.aquino@gmail.com&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(96, 160, 176); font-style: italic;"&gt; * add with &amp;lt;link rel="commands" href="mooUrl.js"/&amp;gt; to your page&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(96, 160, 176); font-style: italic;"&gt; */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;C&lt;/span&gt;mdUtils.&lt;span style="color: rgb(102, 102, 102);"&gt;C&lt;/span&gt;reateCommand({&lt;br /&gt; name&lt;span style="color: rgb(102, 102, 102);"&gt;:&lt;/span&gt; &lt;span style="color: rgb(64, 112, 160);"&gt;"moourl"&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;,&lt;/span&gt;&lt;br /&gt;  takes&lt;span style="color: rgb(102, 102, 102);"&gt;:&lt;/span&gt; {&lt;span style="color: rgb(64, 112, 160);"&gt;"url to shorten"&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;:&lt;/span&gt; noun_type_url}&lt;span style="color: rgb(102, 102, 102);"&gt;,&lt;/span&gt;&lt;br /&gt; icon&lt;span style="color: rgb(102, 102, 102);"&gt;:&lt;/span&gt; &lt;span style="color: rgb(64, 112, 160);"&gt;"http://moourl.com/favicon.ico"&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;,&lt;/span&gt;&lt;br /&gt; description&lt;span style="color: rgb(102, 102, 102);"&gt;:&lt;/span&gt; &lt;span style="color: rgb(64, 112, 160);"&gt;"Replaces the selected URL with a &amp;lt;a href=\"http://moourl.com\"&amp;gt;MooUrl&amp;lt;/a&amp;gt;"&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;,&lt;/span&gt;&lt;br /&gt; author&lt;span style="color: rgb(102, 102, 102);"&gt;:&lt;/span&gt; {name&lt;span style="color: rgb(102, 102, 102);"&gt;:&lt;/span&gt; &lt;span style="color: rgb(64, 112, 160);"&gt;"Renato Aquino"&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;,&lt;/span&gt; email&lt;span style="color: rgb(102, 102, 102);"&gt;:&lt;/span&gt; &lt;span style="color: rgb(64, 112, 160);"&gt;"renato.aquino@gmail.com"&lt;/span&gt;}&lt;span style="color: rgb(102, 102, 102);"&gt;,&lt;/span&gt;&lt;br /&gt; license&lt;span style="color: rgb(102, 102, 102);"&gt;:&lt;/span&gt; &lt;span style="color: rgb(64, 112, 160);"&gt;"GPL"&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;,&lt;/span&gt;&lt;br /&gt; baseUrl&lt;span style="color: rgb(102, 102, 102);"&gt;:&lt;/span&gt; &lt;span style="color: rgb(64, 112, 160);"&gt;"http://moourl.com/create/?source="&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;,&lt;/span&gt;&lt;br /&gt; preview&lt;span style="color: rgb(102, 102, 102);"&gt;:&lt;/span&gt; &lt;span style="color: rgb(0, 112, 32); font-weight: bold;"&gt;function&lt;/span&gt;( pblock&lt;span style="color: rgb(102, 102, 102);"&gt;,&lt;/span&gt; urlToShorten ){&lt;br /&gt;  pblock.innerHTML &lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(64, 112, 160);"&gt;"Replaces the selected URL with "&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;,&lt;/span&gt;&lt;br /&gt;  jQuery.get( &lt;span style="color: rgb(0, 112, 32); font-weight: bold;"&gt;this&lt;/span&gt;.baseUrl &lt;span style="color: rgb(102, 102, 102);"&gt;+&lt;/span&gt; urlToShorten.text&lt;span style="color: rgb(102, 102, 102);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 112, 32); font-weight: bold;"&gt;function&lt;/span&gt;( moo ) {&lt;br /&gt;   &lt;span style="color: rgb(0, 112, 32); font-weight: bold;"&gt;if&lt;/span&gt;(moo &lt;span style="color: rgb(102, 102, 102);"&gt;!=&lt;/span&gt; &lt;span style="color: rgb(64, 112, 160);"&gt;"Error"&lt;/span&gt;)&lt;br /&gt;    pblock.innerHTML &lt;span style="color: rgb(102, 102, 102);"&gt;+=&lt;/span&gt; jQuery(&lt;span style="color: rgb(64, 112, 160);"&gt;"#milked_url"&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;,&lt;/span&gt;moo).text();&lt;br /&gt;  });&lt;br /&gt; }&lt;span style="color: rgb(102, 102, 102);"&gt;,&lt;/span&gt;&lt;br /&gt; execute&lt;span style="color: rgb(102, 102, 102);"&gt;:&lt;/span&gt; &lt;span style="color: rgb(0, 112, 32); font-weight: bold;"&gt;function&lt;/span&gt;( urlToShorten ) {&lt;br /&gt;  &lt;span style="color: rgb(96, 160, 176); font-style: italic;"&gt;//escaping urlToShorten will not create the right moourl&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(96, 160, 176); font-style: italic;"&gt;&lt;/span&gt;  jQuery.get( &lt;span style="color: rgb(0, 112, 32); font-weight: bold;"&gt;this&lt;/span&gt;.baseUrl &lt;span style="color: rgb(102, 102, 102);"&gt;+&lt;/span&gt; urlToShorten.text&lt;span style="color: rgb(102, 102, 102);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 112, 32); font-weight: bold;"&gt;function&lt;/span&gt;( moo ) {&lt;br /&gt;   &lt;span style="color: rgb(0, 112, 32); font-weight: bold;"&gt;if&lt;/span&gt;(moo &lt;span style="color: rgb(102, 102, 102);"&gt;!=&lt;/span&gt; &lt;span style="color: rgb(64, 112, 160);"&gt;"Error"&lt;/span&gt;)&lt;br /&gt;    &lt;span style="color: rgb(102, 102, 102);"&gt;C&lt;/span&gt;mdUtils.setSelection( jQuery(&lt;span style="color: rgb(64, 112, 160);"&gt;"#milked_url"&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;,&lt;/span&gt;moo).text() );&lt;br /&gt;  });&lt;br /&gt; }&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-8976427385546305119?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/Ie3qXTMdxxQ/moourl-ubiquity-command.html</link><author>noreply@blogger.com (Renato)</author><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2009/04/moourl-ubiquity-command.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-8261912730997598213</guid><pubDate>Mon, 06 Apr 2009 20:06:00 +0000</pubDate><atom:updated>2009-04-06T17:09:58.266-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">SOCIAL</category><title>Linux counter</title><description>Já havia me esquecido que o &lt;a href="http://counter.li.org/cgi-bin/runscript/display-person.cgi?user=77059"&gt;Linux Counter&lt;/a&gt; continua funcional!!!&lt;br /&gt;Quem mais tem?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://counter.li.org/cgi-bin/runscript/display-person.cgi?user=77059"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 190px; height: 110px;" src="http://1.bp.blogspot.com/_nn5bg5yjTJM/SdphUCxAIJI/AAAAAAAACUA/QSa1oOjVo6o/s320/77059.png" alt="" id="BLOGGER_PHOTO_ID_5321672906659340434" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-8261912730997598213?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/z8tYE_T7YLc/linux-counter.html</link><author>noreply@blogger.com (Renato)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_nn5bg5yjTJM/SdphUCxAIJI/AAAAAAAACUA/QSa1oOjVo6o/s72-c/77059.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2009/04/linux-counter.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-5642896228409399292</guid><pubDate>Mon, 02 Mar 2009 20:01:00 +0000</pubDate><atom:updated>2009-03-02T17:26:19.102-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">Zend</category><category domain="http://www.blogger.com/atom/ns#">Desenvolvimento</category><title>Zend Framework</title><description>Como trabalho bastante com PHP, já havia postado &lt;a href="http://renato-aquino.blogspot.com/2008/07/framework-codeigniter-para-php.html"&gt;anteriormente&lt;/a&gt; minha opinião sobre o framework &lt;a href="http://codeigniter.com/"&gt;Codeigniter&lt;/a&gt; e &lt;a href="http://www.symfony-project.org/"&gt;Symfony&lt;/a&gt;, agora é a vez do &lt;a href="http://framework.zend.com/"&gt;Zend Framework&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Tal qual o esperado de uma empresa como a Zend, este framework é bastante maduro e amplo. Um dos pontos distintos que notei é o acoplamento fraco entre as classes do mesmo, ou seja, uma parte não depende necessáriamente da outra para ser utilizada.&lt;br /&gt;Caso o programador opte por seguir a estrutura padrão e o modelo mvc do mesmo, as classes devem ser conectadas para realizar as tarefas que o mesmo deseja.&lt;br /&gt;&lt;br /&gt;Como destaque de classes totalmente independentes cito o &lt;a href="http://framework.zend.com/manual/en/zend.validate.html"&gt;Zend_Validate&lt;/a&gt; e o &lt;a href="http://framework.zend.com/manual/en/zend.form.html"&gt;Zend_Form&lt;/a&gt;. Você pode utilizar as classes do Zend_Form e do Zend_Validate em qualquer script PHP, mesmo que este não utilize mais nada do Framework.&lt;br /&gt;&lt;br /&gt;As desvantagens que encontrei começaram pela documentação. As &lt;a href="http://framework.zend.com/docs/api"&gt;APIs&lt;/a&gt; estão pouco descritas e o &lt;a href="http://framework.zend.com/manual/en/"&gt;guia de referência&lt;/a&gt; não cobre todo o pacote de classes.&lt;br /&gt;Quanto ao design do projeto, acredito que o único problema que encontrei foi o mesmo que sempre notei em Java, a &lt;a href="http://www.netpedia.com.br/MostraTermo.php?TermID=2949"&gt;granularidade&lt;/a&gt; das classes e a implementação impecável de padrões de projeto acabam tornando um pouco obscura a busca por como as coisas funcionam.&lt;br /&gt;&lt;br /&gt;O melhor exemplo de dificuldade está no &lt;a href="http://framework.zend.com/manual/en/zend.form.standardDecorators.html"&gt;Zend_Decorator&lt;/a&gt;, conjunto de classes que são muito utilizadas para desenhar formulários. Sua funcionalidade é tão genérica que se o programador não efetuar uma leitura cuidadosa do manual não conseguira utiliza-las.&lt;br /&gt;&lt;br /&gt;No geral, a performance do framework me pareceu muito boa e após um tempo de &lt;a href="http://framework.zend.com/docs/quickstart"&gt;setup inicial&lt;/a&gt; até é possível  tornar o desenvolvimento mais rápido, embora o framework me passe a impressão que sua função é mais padronizar que simplificar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-5642896228409399292?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/93yteBPdIsM/zend-framework.html</link><author>noreply@blogger.com (Renato)</author><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2009/03/zend-framework.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-2170543273408234283</guid><pubDate>Thu, 19 Feb 2009 02:36:00 +0000</pubDate><atom:updated>2009-02-18T23:52:05.540-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">Desenvolvimento</category><title>Linux e o mundo das versões</title><description>Neste tempo que estou desenvolvendo com C++ tenho trabalhado com diversas versões de software e, ultimamente, a palavra "versão" tem sido um problema para quase tudo.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Apenas para citar um exemplo, vou comentar sobre o &lt;a href="http://www.sqlite.org"&gt;sqlite&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Estou desenvolvendo um software para uma base &lt;a href="http://www.centos.org/"&gt;CentOS5&lt;/a&gt;, ou seja, estou limitado a atualizar algumas coisas que a base do sistema depende. Como o yum é dependente do sqlite, não posso atualizar a versão do mesmo da 3.3 para a atual &lt;a href="http://www.sqlite.org/download.html"&gt;3.6.11&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;O que eu perdi com isso já que ambas são da versão 3?&lt;/div&gt;&lt;div&gt;Suporte a &lt;a href="http://www.sqlite.org/c3ref/mutex_alloc.html"&gt;mutexes&lt;/a&gt;, &lt;a href="http://www.sqlite.org/c3ref/prepare.html"&gt;prepared statements&lt;/a&gt; melhorados e tempo de desenvolvimento.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Agora coloque na lista outras &lt;a href="http://en.wikipedia.org/wiki/Library_(computing)"&gt;bibliotecas &lt;/a&gt;como &lt;a href="http://www.vmime.org/"&gt;libvmime&lt;/a&gt;, &lt;a href="http://people.freebsd.org/~kientzle/libarchive/"&gt;libarchive&lt;/a&gt;, &lt;a href="http://www.samba.org"&gt;libsmbclient&lt;/a&gt;, &lt;a href="http://goog-ctemplate.sourceforge.net/"&gt;google-ctemplate&lt;/a&gt;, &lt;a href="http://code.google.com/p/googletest/"&gt;gtest&lt;/a&gt;, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ainda bem que para facilitar minha vida, tenho utilizado ferramentas como &lt;a href="http://www.gnu.org/software/autoconf/"&gt;autoconf&lt;/a&gt;, &lt;a href="http://www.gnu.org/software/automake/"&gt;automake &lt;/a&gt;e &lt;a href="http://www.gnu.org/software/libtool/"&gt;libtool&lt;/a&gt;... mas dessas eu falo depois. ;)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-2170543273408234283?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/NAqzsfzLGBc/linux-e-o-mundo-das-versoes.html</link><author>noreply@blogger.com (Renato)</author><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2009/02/linux-e-o-mundo-das-versoes.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-8842308556058357274</guid><pubDate>Fri, 19 Dec 2008 12:56:00 +0000</pubDate><atom:updated>2008-12-19T11:03:51.173-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">Desenvolvimento</category><title>Wrapper para SQLite em C++</title><description>Tenho codificado uma série de pequenas bibliotecas para um produto e como BD para as configurações estamos utilizando o &lt;a href="http://sqlite.org/"&gt;SQLite&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;O maior problema encontrado foi utilizar a &lt;a href="http://pt.wikipedia.org/wiki/API"&gt;API&lt;/a&gt; propria do &lt;a href="http://sqlite.org/c3ref/intro.html"&gt;SQLite&lt;/a&gt;, que embora até relativamente simples, mostrou-se complexa na hora de fazer uma simples consulta.&lt;br /&gt;&lt;br /&gt;Para facilitar as coisas estive pesquisando por classes wrappers e encontrei o &lt;a href="http://www.codeproject.com/KB/database/CppSQLite.aspx"&gt;CppSqlite&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;O site tem um exemplo bastante completo do uso.&lt;br /&gt;&lt;br /&gt;Assim que eu testar o mesmo com mais profundidade vou postar aqui minhas impressões a respeito.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-8842308556058357274?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/EiOv_Wrjow0/wrapper-para-sqlite-em-c.html</link><author>noreply@blogger.com (Renato)</author><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2008/12/wrapper-para-sqlite-em-c.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-9094561743424704172</guid><pubDate>Tue, 21 Oct 2008 13:45:00 +0000</pubDate><atom:updated>2008-10-21T11:50:17.041-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">SOCIAL</category><title>News</title><description>Report um pouco atrasado mas lá vai.&lt;br /&gt;&lt;br /&gt;Deixei meu cargo de "Analista de Suporte" na &lt;a href="http://www.jovempanfm.com.br"&gt;Rádio Panamericana S/A&lt;/a&gt; para ingressar na equipe de desenvolvimento da &lt;a href="http://www.bluepex.com.br"&gt;BluePex Security Solutions&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Essa mudança não foi apenas de empresa e cargo, mas inclui uma mudança de cidade também. Deixei a loucura de São Paulo para tentar a vida na cidade de &lt;a href="http://pt.wikipedia.org/wiki/Limeira"&gt;Limeira&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Acredito que terei uma série de desafios novos, com o tempo vou reportando.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-9094561743424704172?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/pOhXg2WKDlc/news.html</link><author>noreply@blogger.com (Renato)</author><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2008/10/news.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-7611773057112660535</guid><pubDate>Wed, 24 Sep 2008 19:09:00 +0000</pubDate><atom:updated>2008-09-24T16:14:32.345-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">Desenvolvimento</category><category domain="http://www.blogger.com/atom/ns#">SOCIAL</category><title>Projeto 10^100 do Google</title><description>Tudo bem, eu não tenho que anunciar porquê daqui a uma semana todo mundo vai estar falando disso, mas lá vai.&lt;br /&gt;&lt;br /&gt;Para comemorar 10 anos o Google está lançando o projeto 10^100 (10 para os 100?).&lt;br /&gt;Basicamente a idéia é pedir a sua idéia do que pode ser benéfico para ajudar os outros e com os esforços conjuntos de todos, após selecionar as melhores idéias, implementar o mesmo.&lt;br /&gt;&lt;br /&gt;O tema é amplo demais, e nem sei se consigo explicar direito a idéia.&lt;br /&gt;Para ler mais a respeito:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://googleblog.blogspot.com/2008/09/project-10100.html"&gt;http://googleblog.blogspot.com/2008/09/project-10100.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Site oficial do projeto:&lt;br /&gt;&lt;a href="http://www.project10tothe100.com"&gt;http://www.project10tothe100.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-7611773057112660535?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/3cgB5tZF0sk/projeto-10100-do-google.html</link><author>noreply@blogger.com (Renato)</author><thr:total>1</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2008/09/projeto-10100-do-google.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-3513636041776013330</guid><pubDate>Wed, 24 Sep 2008 14:02:00 +0000</pubDate><atom:updated>2008-09-24T11:22:17.565-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">Video</category><category domain="http://www.blogger.com/atom/ns#">Desenvolvimento</category><title>Curso de Metodologia de Programação</title><description>Andei perdendo um tempinho para baixar e colocar em execução no meu iPod os vídeos do curso de metodologia de programação publicados pela universidade de &lt;a href="http://www.stanford.edu/"&gt;Stanford&lt;/a&gt;, mas está valendo a pena.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O curso tem o foco em metologias e não em uma linguagem em sí, embora ensine Java para usar como ferramenta no desenrolar do mesmo.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Logo no primeiro vídeo o professor &lt;a href="http://robotics.stanford.edu/~sahami/"&gt;Mehran Sahami&lt;/a&gt; explica muito bem o nível de conhecimento necessário para assistir as aulas e resume-se a identificar se o computador está ligado.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Até onde assisti, o curso explica de forma bastante intuitiva vários conceitos de programação.&lt;/div&gt;&lt;div&gt;Cobre rápidamente diversos tópicos, incluíndo um pouquinho de história, programação Top-Down, conceitos de &lt;a href="http://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objeto"&gt;OO&lt;/a&gt;, etc. Tudo de forma muito simples, fazendo parecer algo trivial e causando vários insights.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quem deseja aprender Java ou melhorar seu conhecimento teórica sobre programação pode perder um tempinho que não vai se arrepender.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Infelizmente não encontrei legendas para os vídeos, senão poderia fazer minha mãe aprender Java. :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://see.stanford.edu/SEE/lecturelist.aspx?coll=824a47e1-135f-4508-a5aa-866adcae1111"&gt;CS106A - Programming Methodology&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://see.stanford.edu/SEE/lecturelist.aspx?coll=824a47e1-135f-4508-a5aa-866adcae1111"&gt;http://see.stanford.edu/SEE/lecturelist.aspx?coll=824a47e1-135f-4508-a5aa-866adcae1111&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-3513636041776013330?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/KsxcunWXLW0/curso-de-metodologia-de-programao.html</link><author>noreply@blogger.com (Renato)</author><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2008/09/curso-de-metodologia-de-programao.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-1607352332782229481</guid><pubDate>Wed, 30 Jul 2008 15:22:00 +0000</pubDate><atom:updated>2008-07-30T12:43:47.760-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">Tools</category><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">Desenvolvimento</category><title>Framework CodeIgniter para PHP</title><description>Depois de algum tempo usando o &lt;a href="http://www.symfony-project.org/"&gt;Symphony&lt;/a&gt;, cheguei a duas conclusões:&lt;br /&gt;&lt;br /&gt;1- é muito bem feito.&lt;br /&gt;2- é muito pesado.&lt;br /&gt;&lt;br /&gt;As aplicações que costumo desenvolver podem, depois de um tempo, chegar a uma complexidade razoável e tornar difícil organizar todo o código, dai a idéia de utilizar um framework. Mas, o framework deve ajudar e não atrapalhar seu desenvolvimento, e no critério velocidade o Symphony deixou um pouco a desejar para mim. O custo mínimo para desenvolver uma aplicação é alto demais e a carga de qualquer página parece que vai derrubar o servidor.&lt;br /&gt;&lt;br /&gt;Voltei então a pesquisar sobre &lt;a href="http://phpframeworks.com/"&gt;frameworks para PHP&lt;/a&gt; e depois de pular os clássicos &lt;a href="http://www.xisc.com/"&gt;Prado&lt;/a&gt; e &lt;a href="http://cakephp.org/"&gt;CakePHP&lt;/a&gt;, acabei encontrando o &lt;a href="http://www.codeigniter.com/"&gt;CodeIgniter&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A primeira vista o CodeIgniter parece um amontoado de código perdido, mas observando com mais cuidado é possível notar que o framework é simples e leve. Provavelmente um dos detalhes é ele não assumir nada por você, ou seja, se você precisa de conexão à banco de dados na sua aplicação, precisa adicionar na configuração que o framework deve carregar as bibliotecas de database.&lt;br /&gt;&lt;br /&gt;O CodeIgniter, como a maior parte do frameworks, trabalha com &lt;a href="http://pt.wikipedia.org/wiki/MVC"&gt;MVC&lt;/a&gt;, possui uma abstração de banco de dados chamada &lt;a href="http://codeigniter.com/wiki/ActiveRecord_Class/"&gt;ActiveRecord&lt;/a&gt;, sim é um plágio do &lt;a href="http://www.rubyonrails.org/"&gt;RubyOnRails&lt;/a&gt;, e suporte a templates &lt;a href="http://smarty.php.net/"&gt;Smarty&lt;/a&gt;. Essas features podem receber upgrades com os &lt;a href="http://www.ciforge.com/"&gt;plugins disponíveis&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;De cara, encontrei apenas um problema com o &lt;a href="http://www.codeigniter.com/"&gt;CI&lt;/a&gt;, sua configuração básica exige para conexão ao &lt;a href="http://pt.wikipedia.org/wiki/Mysql"&gt;MySQL&lt;/a&gt; que sua versão mínima seja a 4.1, o problema é porque o CI faz um setup na conexão acertando os &lt;a href="http://en.wikipedia.org/wiki/Charset"&gt;charsets&lt;/a&gt; e &lt;a href="http://en.wikipedia.org/wiki/Collation"&gt;collations&lt;/a&gt; do MySQL, opções que só existem a partir do 4.1. Sem muito esforço, &lt;a href="http://codeigniter.com/wiki/MySQL_4.0/"&gt;encontrei no próprio site do CI um post&lt;/a&gt; que explica como tratar esse tipo de problema.&lt;br /&gt;&lt;br /&gt;Vou continuar postando aqui as experiências que me ocorrerem com o CI, e provavelmente farei alguns &lt;a href="http://pt.wikipedia.org/wiki/Benchmark"&gt;benchmarks&lt;/a&gt; de algumas aplicações que pretendo portar para ele.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-1607352332782229481?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/EgTNfTGHIZY/framework-codeigniter-para-php.html</link><author>noreply@blogger.com (Renato)</author><thr:total>1</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2008/07/framework-codeigniter-para-php.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-8168342413382855365</guid><pubDate>Tue, 01 Jul 2008 18:41:00 +0000</pubDate><atom:updated>2008-07-01T16:35:23.151-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tools</category><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">Desenvolvimento</category><category domain="http://www.blogger.com/atom/ns#">Flash</category><title>Sites com recursos para Flash</title><description>Um &lt;a href="http://200.98.194.26/blogs/animaisecia/"&gt;amigo&lt;/a&gt; enviou um email com uma lista de sites, que ele foi conhecendo ao longo do tempo, sobre desenvolvimento de animações Flash.&lt;br /&gt;Bom, as descrições dele estão junto:&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://www.27bobs.com/"&gt;http://www.27bobs.com&lt;/a&gt;&lt;br /&gt;O cara desse site simplesmente não faz mais nada na vida além de flash  pq o que ele faz é insano, mais decorativo do que efetivo.&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://www.flashguru.co.uk/"&gt;http://www.flashguru.co.uk/&lt;/a&gt;&lt;br /&gt;Se é sobre flash, está aqui, muito mais atualizado do que o próprio site  da Adobe.&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://www.bestflashanimationsite.com/"&gt;http://www.bestflashanimationsite.com/&lt;/a&gt;&lt;br /&gt;Váááááááááários sources, muita coisa legal.&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://www.flashdeveloper.nl/"&gt;http://www.flashdeveloper.nl&lt;/a&gt;&lt;br /&gt;Site muito bom pra tutoriais e sources.&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://www.flashkit.com/"&gt;http://www.flashkit.com/&lt;/a&gt;&lt;br /&gt;O bom e velho flash kit, tem tudo.&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://www.flash-extensions.net/"&gt;http://www.flash-extensions.net&lt;/a&gt;&lt;br /&gt;Site de extensões pro flash, eu já comprei uma a um tempo atrás,ajuda  muito nossa vida, sempre o custo/benefício vale a pena.&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://www.flash-template-design.com/"&gt;http://www.flash-template-design.com&lt;/a&gt;&lt;br /&gt;Site de templates, tem alguns grátis e outros pagos vc consegue xupinhar.&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://www.flash-template-design.com/"&gt;http://www.flash-template-design.com&lt;/a&gt;&lt;br /&gt;Outro depósito de flashs, mesma coisa do de cima, só que mais pobrezinho.&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://www.dreamlinestudio.com/"&gt;http://www.dreamlinestudio.com&lt;/a&gt;&lt;br /&gt;Mais um site de templates, só que mais xique.&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://www.flashden.net/"&gt;http://www.flashden.net&lt;/a&gt;&lt;br /&gt;Notório site de designer especializado em flash, "só quem é" consegue  colocar as coisas nele.&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://www.flashmo.com/"&gt;http://www.flashmo.com&lt;/a&gt;&lt;br /&gt;Esse vc já conhece muito bem...&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://www.flzone.net/"&gt;http://www.flzone.net&lt;/a&gt;&lt;br /&gt;Esse site tem muita informação, já me tirou de vários buracos.&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://www.kirupa.com/"&gt;http://www.kirupa.com&lt;/a&gt;&lt;br /&gt;Site muito bom pra  gente, tem muuuuita coisa e merece que vc perca um tempo fuçando nele.&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://levitated.net/"&gt;http://levitated.net&lt;/a&gt;&lt;br /&gt;O cara desse site fez um pacto com o capeta, pq as coisas que ele faz  são insanas... só vendo...&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://www.muzakdeezign.com/"&gt;http://www.muzakdeezign.com/&lt;/a&gt;&lt;br /&gt;Tem uns flazinhos bem legais em Downloads.&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://www.phireworx.com/"&gt;http://www.phireworx.com/&lt;/a&gt;&lt;br /&gt;Site muito bom de extensões.&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://scriptplayground.com/"&gt;http://scriptplayground.com&lt;/a&gt;&lt;br /&gt;Ótimo site de tutoriais.&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://www.ffiles.com/"&gt;http://www.ffiles.com/&lt;/a&gt;&lt;br /&gt;Outro sensacional site de sources.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;E eu ainda adiciono a esta lista os seguintes endereços:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flashsandy.org/"&gt;http://www.flashsandy.org/&lt;/a&gt;&lt;br /&gt;Biblioteca para desenvolvimento 3D no Flash&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.papervision3d.org/"&gt;http://blog.papervision3d.org/&lt;/a&gt;&lt;br /&gt;Mais uma biblioteca 3D.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://away3d.com/"&gt;http://away3d.com/&lt;/a&gt;&lt;br /&gt;E outra biblioteca 3d.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://seraf.mediabox.fr/wow-engine/"&gt;http://seraf.mediabox.fr/wow-engine/&lt;/a&gt;&lt;br /&gt;Biblioteca de física em AS3, para dar efeitos nas suas animações!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eye4u.com/"&gt;http://www.eye4u.com&lt;/a&gt;&lt;br /&gt;Site da agência Eye4U, a animação é a mesma desde a primeira versão do Flash, mas ainda não vi ninguêm fazer nada tão simples e tão "na medida" com Flash. É um conjunto de animações e transições simples que utilizam muito bem todo o espaço de tela. Só vendo.&lt;br /&gt;&lt;a href="http://tech.nitoyon.com/blog/2008/01/as3query_alpha.html"&gt;&lt;br /&gt;http://tech.nitoyon.com/blog/2008/01/as3query_alpha.html&lt;/a&gt;&lt;br /&gt;Se você conhece Javascript e conhece jQuery, imagine usar o mesmo poder com ActionScript3.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bom, é isso, só aproveitar!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-8168342413382855365?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/tbyZEjtAQ74/sites-com-recursos-para-flash.html</link><author>noreply@blogger.com (Renato)</author><thr:total>1</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2008/07/sites-com-recursos-para-flash.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-8595035699871005138</guid><pubDate>Wed, 18 Jun 2008 15:45:00 +0000</pubDate><atom:updated>2008-06-18T12:53:04.068-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">Desenvolvimento</category><category domain="http://www.blogger.com/atom/ns#">Flash</category><title>Como disperdiçar seu tempo - Compilando AS3</title><description>Gastei um tempão tentando encontrar um erro nas classes que estava desenvolvendo para um projeto em Flash, mas sempre recebendo a mesma mensagem:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Error #1046: Type was not found or was not a compile-time constant&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Depois de verificar algumas duzias de vezes, resolvi procurar no Google por alguma luz.&lt;br /&gt;Pois bem, com o novo compilador  do AS3 é necessário declarar as classes como públicas ou então ele simplesmente as ignora.&lt;br /&gt;&lt;br /&gt;Ou seja, mudar de:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;class &lt;/span&gt;SuaClasse &lt;span style="color: rgb(102, 102, 204);"&gt;extends&lt;/span&gt; OutraClasse{}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;para:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: rgb(102, 102, 204);"&gt;public class&lt;/span&gt; SuaClasse &lt;span style="color: rgb(102, 102, 204);"&gt;extends&lt;/span&gt; OutraClasse{}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Claro que só consegui resolver isso porque &lt;a href="http://not-equal.blogspot.com/2006/08/how-waste-your-time-compiling-as3.html"&gt;outro sofrido fez um post no seu blog&lt;/a&gt; com esta solução.&lt;br /&gt;Agora, o compilador do Flash não podia dar um avizo não?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-8595035699871005138?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/ia2kyJ6uMck/como-disperdiar-seu-tempo-compilando.html</link><author>noreply@blogger.com (Renato)</author><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2008/06/como-disperdiar-seu-tempo-compilando.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-8320798921234676940</guid><pubDate>Tue, 27 May 2008 18:36:00 +0000</pubDate><atom:updated>2008-05-27T15:50:33.422-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">Desenvolvimento</category><category domain="http://www.blogger.com/atom/ns#">Firefox</category><title>Melhorias do Firefox 3</title><description>Estive lendo a lista de melhorias no Firefox 3 e achei muito legal alguns dos adendos.&lt;br /&gt;Acredito que devam existir muitos e muitos outros legais que já existam não só no Firefox mas em diversos browser como padrões DOm ou coisa do gênero, mas quando eu encontrar algum lugar que liste os mesmos eu crio uma postagem aqui no Blog.&lt;br /&gt;&lt;br /&gt;Bom, voltando ao Firefox, eu particularmente gostei das &lt;a href="http://developer.mozilla.org/en/docs/New_in_JavaScript_1.8"&gt;melhorias de JavaScript&lt;/a&gt; que agora está com suporte a versão 1.8, novas funcionalidades &lt;a href="http://developer.mozilla.org/en/docs/DOM_improvements_in_Firefox_3"&gt;DOM&lt;/a&gt; e no suporte de &lt;a href="http://developer.mozilla.org/en/docs/CSS_improvements_in_Firefox_3"&gt;CSS&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Tem muita coisa mesmo, pra quem desenvolve páginas, é sempre bom dar uma olhada.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://developer.mozilla.org/en/docs/Firefox_3_for_developers"&gt;http://developer.mozilla.org/en/docs/Firefox_3_for_developers&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-8320798921234676940?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/PSuk8dG_Xdo/melhorias-do-firefox-3.html</link><author>noreply@blogger.com (Renato)</author><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2008/05/melhorias-do-firefox-3.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-8650369623205730224</guid><pubDate>Tue, 27 May 2008 15:42:00 +0000</pubDate><atom:updated>2008-05-27T13:22:10.579-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">Desenvolvimento</category><category domain="http://www.blogger.com/atom/ns#">Flash</category><category domain="http://www.blogger.com/atom/ns#">Bugs</category><title>AS3 e bugs com Tween</title><description>Quando estava programando a animação Flash que &lt;a href="http://renato-aquino.blogspot.com/2008/05/animao-em-flash-com-as3.html"&gt;comentei anteriormente&lt;/a&gt;, encontrei um problema que acontecia quando disparava varias animações com a classe &lt;a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/fl/transitions/Tween.html"&gt;Tween&lt;/a&gt; do Flash.&lt;br /&gt;Por algum motivo, as animações deixavam de executar no meio, e todo o posicionamento dos itens ficava errado.&lt;br /&gt;&lt;br /&gt;Depois de buscar um pouco, encontrei num forúm da Adobe um comentário que dizia que o &lt;a href="http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29"&gt;Garbage Collector&lt;/a&gt; do Flash excluía as instâncias da classe &lt;a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/fl/transitions/Tween.html"&gt;Tween&lt;/a&gt; que não estivessem referênciadas em nenhum lugar.&lt;br /&gt;&lt;br /&gt;Um exemplo pode facilitar o entendimento.&lt;br /&gt;&lt;br /&gt;Temos um MovieClip chamado mc e desejamos animar sua posição horizontal (x) , deslocando o mesmo da posição atual para + 100 pixels. Criamos então uma instância da classe Tween e passamos os parâmetros para o construtor.&lt;br /&gt;&lt;blockquote&gt;new Tween(mc,'x',Regular.easeOut,x,x+100,0.6,true);&lt;/blockquote&gt;Logo após criada, esta instância já executaria a animação e terminado seu trabalho não existe mais nenhum motivo para manter uma referência da mesma. O problema ocorre durante a animação de x para x+100, se o processo de limpeza do coletor de lixo do Flash for disparado nesse período, nossa classe não está referênciada por ninguêm e portanto, elegível para ser descartada mesmo que esteja realizando alguma atividade.&lt;br /&gt;&lt;br /&gt;Para resolver o problema, utilizei parte de um código que encontrei ( quando encontrar o link coloco aqui ), &lt;a href="http://pastebin.com/f60cad7c4"&gt;criei uma classe&lt;/a&gt; Singleton com o mesmo e pronto, temos uma forma de referênciar as instâncias de Tween sem nos preocupar com limpeza de memória antes do término da animação.&lt;br /&gt;&lt;br /&gt;O uso da mesma é simples:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Salve o &lt;a href="http://pastebin.com/f60cad7c4"&gt;script&lt;/a&gt; para o mesmo diretório da sua animação com o nome AntiGC.as.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Adicione a chamada de importação no topo do seu script: "import AntiGC;"&lt;/li&gt;&lt;li&gt;Requisite a instância do AntiGC: "aGC:AntiGC = AntiGC.getInstance();"&lt;/li&gt;&lt;li&gt;Execute seu código de animação passando a instância para o AntiGC: &lt;blockquote&gt;&lt;/blockquote&gt;aGC.addElement(new Tween(mc,'x',Regular.easeOut,x,x+100,0.6,true));&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Até terminar a animação a instância de Tween será referênciada pelo AntiGC, evitando a exclusão da mesma da pilha de execução. Após isso a mesma é liberada para limpeza.&lt;br /&gt;&lt;br /&gt;Você só não pode deixar de referênciar o AntiGC pois isso faria o mesmo, com todas as instâncias de Tween registradas serem elegíveis para limpeza.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-8650369623205730224?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/ArOJ1Q58jIQ/as3-e-bugs-com-tween.html</link><author>noreply@blogger.com (Renato)</author><thr:total>3</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2008/05/as3-e-bugs-com-tween.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-2507713458781306462</guid><pubDate>Tue, 27 May 2008 14:53:00 +0000</pubDate><atom:updated>2008-12-09T03:19:22.686-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Video</category><category domain="http://www.blogger.com/atom/ns#">Tools</category><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">Mobile</category><title>Conversor de videos para iPod</title><description>Adquiri um &lt;a href="http://www.apple.com/ipodclassic/"&gt;iPod &lt;/a&gt;Video faz um tempinho com a intenção de passar o tempo nas horas do trajeto entre minha casa e o trabalho. Uma das coisas chatas que aconteceu logo no começo foi a dificuldade em converter os diversos formatos de vídeo para um formato que o &lt;a href="http://www.apple.com/itunes"&gt;iPod/iTunes&lt;/a&gt; pudessem aceitar.&lt;br /&gt;&lt;br /&gt;Passado algum tempo, encontrei a maravilhosa lista de softwares gratuitos da &lt;a href="http://www.koyotesoft.com/indexEn.html"&gt;Koyotesoft.&lt;/a&gt;&lt;br /&gt;Entre as ferramentas existe uma chamada Free iPod Video Converter que é pra mim uma das mais práticas.&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_nn5bg5yjTJM/SDwkgEWBqDI/AAAAAAAABO4/zgJVILWboO8/s320/big_ipodconverter.jpg" alt="" id="BLOGGER_PHOTO_ID_5205075402673989682" border="0" /&gt;&lt;br /&gt;Essa ferramenta consegue converter formatos FLV, divx, xvid, mpg, mp4, dvd, vob, avi, wmv, asf e acredito que mais alguns que você tenha instalado o plugin do &lt;a href="http://en.wikipedia.org/wiki/DirectShow"&gt;DirectShow&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A qualidade padrão de conversão não é das melhores e o programa sequer tenta ser o melhor compactador de vídeo, mas o importante é que a qualidade basta e o arquivo final é aceito pelo iPod. Se quizer arriscar, pode editar as opções de tamanho entre outras.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-2507713458781306462?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/_Ct9ZC375qw/conversor-de-videos-para-ipod.html</link><author>noreply@blogger.com (Renato)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_nn5bg5yjTJM/SDwkgEWBqDI/AAAAAAAABO4/zgJVILWboO8/s72-c/big_ipodconverter.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2008/05/conversor-de-videos-para-ipod.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35552515.post-7568079832295772752</guid><pubDate>Mon, 26 May 2008 21:59:00 +0000</pubDate><atom:updated>2008-12-09T03:19:22.805-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GEEK</category><category domain="http://www.blogger.com/atom/ns#">Desenvolvimento</category><category domain="http://www.blogger.com/atom/ns#">Flash</category><title>Animação em Flash com AS3</title><description>Estive trabalhando em uma animação flash para a &lt;a href="http://www.jovempanfm.com.br/"&gt;Jovem Pan FM&lt;/a&gt; que exibe uma lista das 5 primeiras músicas com as respectivas imagens e links para conteúdo do bloco &lt;a href="http://www.jovempanfm.com.br/napan/parada/hitparade.php"&gt;Hit Parade&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Para completar a dor de cabeça, eu que não entendo nada de flash, resolvi fazer em &lt;a href="http://en.wikipedia.org/wiki/AS3"&gt;Action Script 3&lt;/a&gt;.&lt;br /&gt;Basicamente a animação faz a carga de um arquivo XML que é passada por parâmetro na tag object e o mesmo possui uma imagem do artista e a lista de músicas, links para ouvir, letra, ringtone, video e compra na loja do grupo (&lt;a href="http://www.baixahits.com.br/"&gt;Baixahits&lt;/a&gt;).  Como nem todas as músicas possuem todos os links foi necessário um pouco de programação para determinar se deve-se exibir ou não os ícones do mesmo.&lt;br /&gt;Toda a movimentação do conteúdo foi feita por AS e acredito que 13 Kb foi um tamanho razoavel para o que a animação faz.&lt;br /&gt;&lt;br /&gt;Quem quizer ver o mesmo em funcionamento procure na &lt;a href="http://www.jovempanfm.com.br/"&gt;home page da jpfm&lt;/a&gt; pela animação com a cara da imagem abaixo .&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_nn5bg5yjTJM/SDs0IEWBqCI/AAAAAAAABOw/9_mLwBXca6Y/s320/fparadas.jpg" alt="" id="BLOGGER_PHOTO_ID_5204811107566463010" border="0" /&gt;&lt;br /&gt;Se interessar para alguem ver os fontes do mesmo é só entrar em contato.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35552515-7568079832295772752?l=renato-aquino.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/LifeData/~3/IR-XoBclPWc/animao-em-flash-com-as3.html</link><author>noreply@blogger.com (Renato)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_nn5bg5yjTJM/SDs0IEWBqCI/AAAAAAAABOw/9_mLwBXca6Y/s72-c/fparadas.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://renato-aquino.blogspot.com/2008/05/animao-em-flash-com-as3.html</feedburner:origLink></item></channel></rss>

