<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>hlegius</title>
	<atom:link href="http://programe.me/feed/" rel="self" type="application/rss+xml" />
	<link>http://programe.me</link>
	<description>programação, desenvolvimento, tecnologia e muito o que contar.</description>
	<lastBuildDate>Thu, 16 Feb 2012 11:41:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Vex EOF;</title>
		<link>http://programe.me/vex-eof/</link>
		<comments>http://programe.me/vex-eof/#comments</comments>
		<pubDate>Thu, 16 Feb 2012 11:41:26 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[vex]]></category>

		<guid isPermaLink="false">http://programe.me/?p=822</guid>
		<description><![CDATA[Há quase três anos atrás (2 anos e 11 meses) ingressei na Vex como php developer em meu primeiro emprego com carteira assinada. Trazia apenas a experiência e toda a artimanha que um freelancer conhece muito bem. Nas primeiras semanas, tratei de me envolver em alguns projetos para conhecer mais sobre como tudo funcionava, afinal, [...]]]></description>
			<content:encoded><![CDATA[<p>Há quase três anos atrás (2 anos e 11 meses) ingressei na Vex como <em>php developer</em> em meu primeiro emprego com carteira assinada. Trazia apenas a experiência e toda a artimanha que um freelancer conhece muito bem.</p>
<div id="attachment_834" class="wp-caption aligncenter" style="width: 235px"><a href="http://programe.me/wp-content/uploads/2012/02/IMG_03951.jpg"><img class="size-medium wp-image-834" title="IMG_0395" src="http://programe.me/wp-content/uploads/2012/02/IMG_03951-225x300.jpg" alt="" width="225" height="300" /></a><p class="wp-caption-text">Balão Vex</p></div>
<p>Nas primeiras semanas, tratei de me envolver em alguns projetos para conhecer mais sobre como tudo funcionava, afinal, entrei como um programador jovem e a gerência não sabia ao certo se teria maturidade suficiente com prazos e horários.</p>
<p>Meses após entrar para o time Vex, eu comecei a perceber alguns pontos onde poderíamos tentar melhorias significantes. Meu primeiro passo foi esboçar com BPMN um diagrama elucidando o processo instável de desenvolvimento web. À partir disto, assumi como meta pessoal melhorar como pudesse o processo. Comecei a incentivar a adoção e aplicar as melhorias que seguiram por quase 2 anos. Em meados de abril do ano passado, apresentei internamente para os fracos de memória (como eu) tudo o que tentamos, o que deu errado e o que deu certo. Sinceramente, só reparei na imensa evolução de todos durante a montagem daquela apresentação!</p>
<div class="wp-caption aligncenter" style="width: 522px"><img class=" " title="hlegius at Vex" src="http://a8.sphotos.ak.fbcdn.net/hphotos-ak-snc6/270503_252586328090236_100000166116477_1136610_1489999_n.jpg" alt="Meados de 2011" width="512" height="384" /><p class="wp-caption-text">Meados de 2011</p></div>
<p>Graças ao empenho da pequena equipe, saímos de um deploy manual, instável e sem product backlog por versão para um ambiente controlado, deploy automatizado; Git; Migrations; Resque (e meu <a href="http://github.com/hlegius/PHPResqueBundle">PHPResqueBundle</a>); product backlog; bug tracking e muitos testes automatizados divididos por unidade, integração e até funcionais com Behat.</p>
<div class="wp-caption aligncenter" style="width: 586px"><img class=" " title="hlegius at Vex" src="http://a4.sphotos.ak.fbcdn.net/hphotos-ak-snc6/196842_211638042185065_100000166116477_892240_4796491_n.jpg" alt="Meados de março/2011" width="576" height="432" /><p class="wp-caption-text">Meados de março/2011</p></div>
<p>Hoje, deixo o recém criado cargo, &#8220;Líder de engenharia web&#8221; do time da Vex e feliz por tudo que pude aprender; aplicar; e confesso, testar para ver no que daria. Saio para aventurar-me em projetos pessoais com PHP, Ruby, Rails, Node, DevOps tasks e tudo mais o que aparecer pela frente.</p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/vex-eof/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Conference Brasil 2011</title>
		<link>http://programe.me/php-conference-brasil-2011/</link>
		<comments>http://programe.me/php-conference-brasil-2011/#comments</comments>
		<pubDate>Sun, 13 Nov 2011 12:00:29 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Dia-a-dia]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[palestra]]></category>
		<category><![CDATA[phpconf]]></category>

		<guid isPermaLink="false">http://programe.me/?p=809</guid>
		<description><![CDATA[Quer concorrer a um convite Silver na faixa? Até 26/11! Diferentemente dos outros anos, em 2011 eu estarei na PHPConference como palestrante. Meu maior impasse era quanto ao tema, por fim, decidi submeter algo polêmico que foi aceito! Acredito conseguir abrir a mente de alguns possíveis espectadores com o tema: Definir classe não é programar [...]]]></description>
			<content:encoded><![CDATA[<pre><strong><a href="http://twitter.com/hlegius/status/139395194549313536">Quer concorrer a um convite Silver na faixa? </a>Até 26/11!</strong></pre>
<p>Diferentemente dos outros anos, em 2011 eu estarei na <a href="http://phpconference.com.br/schedule/day1">PHPConference como palestrante</a>. Meu maior impasse era quanto ao tema, por fim, decidi submeter algo polêmico que foi aceito! Acredito conseguir abrir a mente de alguns possíveis espectadores com o tema:</p>
<blockquote><p><a>Definir classe não é programar com orientação a objetos.</a></p></blockquote>
<p>Do que <strong>não</strong> falarei:</p>
<ul>
<li>Como definir uma classe com PHP;</li>
<li>Classe e Objeto no âmbito técnico do PHP;</li>
<li>Parâmetros, métodos e objetos;</li>
<li>Padrões de projeto (design patterns).</li>
</ul>
<p>Do que falarei:</p>
<ul>
<li>Design (projeto) orientado a objetos;</li>
<li>Princípios de orientação a objetos;</li>
<li>Como <strong>não</strong> definir uma classe (code smell);</li>
<li>Composição, agregação, value object e entidades;</li>
<li>Ubiquitous Language (ourindo do Domain-Driven Design)</li>
<li>Getters, setters burros;</li>
<li>Ciclo de vida de um objeto.</li>
</ul>
<p>O objetivo é abrir a mente dos presentes para uma orientação a objetos pura, legível e realmente manutenível. Minha palestra será na sexta-feira, 2 de dezembro às 11hs (<a href="http://phpconference.com.br/schedule/">de acordo com a grade atual</a>). <a href="http://www.phpconference.com.br/presentations/show/id/90">Interessou</a>? Aparece por lá! <img src='http://programe.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/php-conference-brasil-2011/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHP Resque Bundle</title>
		<link>http://programe.me/queue-com-php-resque-bundle/</link>
		<comments>http://programe.me/queue-com-php-resque-bundle/#comments</comments>
		<pubDate>Sun, 13 Nov 2011 11:37:08 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[symfony resque php]]></category>

		<guid isPermaLink="false">http://programe.me/?p=797</guid>
		<description><![CDATA[Rubistas já familiariza com o famoso Resque para gerenciamento de filas, sabe bem da utilidade deste software. Para os desavisados, explico: &#160; Você tem um sistema de upload e parser de imagens em seu sistema. Várias pessoas enviando imagens o tempo todo. Como fazer para não explodir sobrecarregar o servidor com múltiplos filhos e ainda [...]]]></description>
			<content:encoded><![CDATA[<p>Rubistas já familiariza com o famoso <a href="https://github.com/defunkt/resque">Resque</a> para gerenciamento de filas, sabe bem da utilidade deste software. Para os desavisados, explico:</p>
<p>&nbsp;</p>
<p><a href="http://programe.me/wp-content/uploads/2011/11/queue_line_2.jpg"><img class="aligncenter size-medium wp-image-803" title="Queue" src="http://programe.me/wp-content/uploads/2011/11/queue_line_2-300x225.jpg" alt="Queue" width="300" height="225" /></a></p>
<p>Você tem um sistema de upload e parser de imagens em seu sistema. Várias pessoas enviando imagens o tempo todo. Como fazer para não <del>explodir</del> sobrecarregar o servidor com múltiplos <em>filhos</em> e ainda não segurar toda essa gente na tela de upload do site ? Simples! Você pode criar uma fila de upload e parser! Toda requisição de upload é direcionada para um <strong><em>euqueue</em></strong> que receberá e colocará a requisição no final da fila. Do outro lado, há um (ou mais) <strong><em>Workers</em></strong> trabalhando para que os itens da fila sejam processados um a um por ordem de entrada na fila. Sem sobrecargas, sem esperas por atendimento, etc.</p>
<p>Quando precisei utilizar o Resque, busquei uma solução em PHP e felizmente, encontrei! <a href="https://github.com/chrisboulton/php-resque">PHP-Resque</a> é um port fiel ao original Resque (Ruby). Vi o projeto e como funcionava. Tudo perfeito, exceto pelo fato de não ser separado com namespaces e não ter suporte ao Symfony. Buscando mais, encontrei um plugin para o Symfony 1.x, mas nada referente ao Symfony 2.x, daí, resolvi eu criar um bundle do php-resque para o sf2.</p>
<p>Na <a href="https://github.com/hlegius/PHPResqueBundle">página do projeto</a>, explico como funciona o <a href="https://github.com/hlegius/PHPResqueBundle">PHP Resque Bundle</a> com todo detalhamento possível. Tenho mais alguns itens a implementar no projeto como criar namespaces para as filas, algo possível no Resque (Ruby) mas impossível ainda no PHP-Resque &#8211; <a href="https://github.com/chrisboulton/php-resque/issues/20">vide thread</a>. Trabalharei nisto em breve, pois precisarei deste recurso também =D</p>
<p>Como o PHP-Resque não possui interface gráfica (como o Resque), uma alternativa é baixar o Resque e utilizá-lo somente para este fim &#8211; ou então, forkear o php-resque e implementar isto por lá!</p>
<p>Dúvidas, sugestões ou contribuições podem ser feitas diretamente no Github dos projetos. Happy hacking! <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/queue-com-php-resque-bundle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Review: Zend Server 5</title>
		<link>http://programe.me/zend-server-review/</link>
		<comments>http://programe.me/zend-server-review/#comments</comments>
		<pubDate>Tue, 16 Aug 2011 17:48:32 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Review]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=771</guid>
		<description><![CDATA[No primeiro trimestre deste ano a Zend liberou licenças do Zend Server e Zend Studio para novos e antigos ZCEs (Zend Certified Engineers). Como sempre tive curiosidade de testar, mas não queria utilizar o limitadíssimo Zend Server Community Edition, fiz desta oportunidade a ocasião ideal para testá-lo e ver se realmente valeria a pena pagar [...]]]></description>
			<content:encoded><![CDATA[<p>No primeiro trimestre deste ano a <a href="http://zend.com" target="_blank">Zend</a> liberou licenças do <a href="http://zend.com/server" target="_blank">Zend Server</a> e<a href="http://zend.com/studio" target="_blank"> Zend Studio</a> para novos e antigos ZCEs (Zend Certified Engineers). Como sempre tive curiosidade de testar, mas não queria utilizar o limitadíssimo Zend Server Community Edition, fiz desta oportunidade a ocasião ideal para testá-lo e ver se realmente valeria a pena pagar o preço dele.</p>
<p>Com key em mãos, basta baixar um binário, típico installer.bin para Linux no <a href="http://www.zend.com/en/products/server/" target="_blank">site da Zend</a>.</p>
<p><strong>1. Instalação</strong></p>
<p>Ao rodar o binário, é solicitado a versão do PHP que deseja instalar. Na versão que testei, Zend Server 5, PHP 5.2 ou PHP 5.3. Neste passo é possível também definir qual <em>branch</em> você irá utilizar: <strong><em>Developer Edition</em></strong> ou <strong><em>Community Edition (CE)</em></strong>.</p>
<p>Para Linux, o binário funciona apenas com distros <em>Debian-like</em> ou<em> RedHat-like</em>. Para as demais, <del>o choro ainda é livre</del> nada ainda.</p>
<p>Instalação rápida e sem complicações. Após tudo instalado, você poderá controlar o daemon em <em>/etc/init.d/zend-server (start|stop|restart|&#8230;)</em></p>
<p><strong>2. Iniciando&#8230;</strong></p>
<p>Basta acessar: http://server.me:10081 e aguardar o redirect para tela de autenticação do Zend Server.</p>
<p><a href="http://programe.me/wp-content/uploads/2011/08/zs-login.png"><img class="aligncenter size-medium wp-image-783" title="Zend Server 5 - Auth Login page" src="http://programe.me/wp-content/uploads/2011/08/zs-login-300x235.png" alt="" width="300" height="235" /></a></p>
<p>Após logar, recebe-se o Dashboard que  contém um grande overview (óbvio) de tudo que ele poderá fazer por nós.</p>
<p><a href="http://programe.me/wp-content/uploads/2011/08/zs-dashboard.png"><img class="aligncenter size-medium wp-image-784" title="Zend Server 5 - Dashboard" src="http://programe.me/wp-content/uploads/2011/08/zs-dashboard-300x185.png" alt="" width="300" height="185" /></a></p>
<p>Os destaques são:</p>
<ul>
<li>Gerenciamento de eventos;</li>
<li>Configuração do <em><strong>php.ini</strong></em> ultra-simplificada;</li>
<li>Restart do container (Apache, PHP) na GUI;</li>
<li>Profiler e code backtrace de todas URLs do server;</li>
<li>Logs;</li>
<li>Fila de atividades;</li>
<li>Configuração de cache para conteúdos estáticos (html, css, javascript&#8230;);</li>
<li>Ativação/desativação de módulos facilmente, e;</li>
<li>Integração com Zend Studio para debugging em <em>ambiente de produção.</em></li>
</ul>
<p><strong>Gerenciamento de eventos</strong></p>
<p>Os eventos são completamente configuráveis e estão listados em <em><strong>Rule Management -&gt; Monitoring</strong></em> .<br />
As configurações incluem:</p>
<ul>
<li>Definir os alertas</li>
<li>Definir os critérios (por tempo de carregamento em milésimos de segundo; ou tamanho da página em Kb)</li>
<li>Setar ações (lançar email; salvar code backtrace; registrar apenas..)</li>
</ul>
<div id="attachment_785" class="wp-caption aligncenter" style="width: 310px"><a href="http://programe.me/wp-content/uploads/2011/08/zs-monitoring.png"><img class="size-medium wp-image-785" title="Zend Server 5 - Monitoring" src="http://programe.me/wp-content/uploads/2011/08/zs-monitoring-300x249.png" alt="" width="300" height="249" /></a><p class="wp-caption-text">Zend Server 5 - Monitoring</p></div>
<p>Para acompanhar cada evento, temos pelo dashboard (os últimos) ou diretamente na página dos eventos a listagem completa com data, etc.</p>
<div id="attachment_786" class="wp-caption aligncenter" style="width: 310px"><a href="http://programe.me/wp-content/uploads/2011/08/zs-monitoring-details.png"><img class="size-medium wp-image-786" title="Zend Server 5 - Monitoring details page" src="http://programe.me/wp-content/uploads/2011/08/zs-monitoring-details-300x112.png" alt="" width="300" height="112" /></a><p class="wp-caption-text">Zend Server 5 - Monitoring details page</p></div>
<p>Ao clicar em show code tracing uma nova janela é aberta exibindo o trace da aplicação com várias opções de filtragem (mais do que no próprio Zend Studio na aba Profile).</p>
<div id="attachment_787" class="wp-caption aligncenter" style="width: 310px"><a href="http://programe.me/wp-content/uploads/2011/08/zs-monitoring-popup.png"><img class="size-medium wp-image-787" title="Zend Server 5 - Code tracing popup" src="http://programe.me/wp-content/uploads/2011/08/zs-monitoring-popup-300x195.png" alt="" width="300" height="195" /></a><p class="wp-caption-text">Zend Server 5 - Code tracing popup</p></div>
<p><strong>Configuração do php.ini</strong></p>
<p>Todas as configurações do php.ini ficam em <em><strong>Server Setup -&gt; directives</strong></em>.</p>
<p>Basta editar o campo desejado, salvar e depois reiniciar o webserver para recarregar com as novas configurações. Tudo graficamente !</p>
<div id="attachment_788" class="wp-caption aligncenter" style="width: 310px"><a href="http://programe.me/wp-content/uploads/2011/08/zs-phpini.png"><img class="size-medium wp-image-788" title="Zend Server 5 - PHP.ini directives setup" src="http://programe.me/wp-content/uploads/2011/08/zs-phpini-300x209.png" alt="" width="300" height="209" /></a><p class="wp-caption-text">Zend Server 5 - PHP.ini directives setup</p></div>
<p><strong>Integração com Zend Studio para debug</strong></p>
<p>Aqui não há muito segredo. O Zend Server vem com o Zend Debugger configurado e pronto para uso. O mesmo debugger que também já está facilitado o acesso pelo Zend Studio. A única coisa pendente é liberar acesso remoto do Zend Studio na sua rede no seu Zend Server remoto e voilà.</p>
<p>As configurações de liberação de acesso estão em <em><strong>Server Setup -&gt; debugger</strong></em>. Basta adicionar o IP/range e salvar.</p>
<p><strong>Resumo</strong></p>
<p>Facilidades por todos lugares com o Zend Server 5. Como de praxe, a Zend enfia a faca nos preços, acredito eu que poderia ser mais acessível, assim, mais empresas &#8211; aqui incluem-se os freelas &#8211; teriam como pagar tranquilamente pela ferramenta, gerando mais receita à Zend.</p>
<p>O ponto alto da ferramenta é realmente o Code Trace e facilidade nas configurações e eventos do sistema em produção. Aliado ao Zend Studio, fica ainda melhor !</p>
<p><strong>Extra: Zend Server @ Amazon EC2</strong></p>
<p>A Zend disponibiliza uma <a href="http://www.zend.com/en/products/server/amazon/" target="_blank">ISO Linux já com o Zend Server totalmente configurado no serviço de cloud da Amazon Elastic Compute Cloud</a> na modalidade<em> &#8220;small&#8221;</em>. Essa instância <em>Small</em> da Amazon custaria no mínimo 60 dólares/mês rodando diariamente sem adicionais (disco, dns, etc). <em>*A Zend dá a licença gratuitamente quando utilizado na Amazon. </em></p>
<p>Deixei rodando em teste por dois dias e me custou 9 dolares. Cancelei e montei eu mesmo o Zend Server sob uma ISO Linux padrão na Amazon EC2, porém com uma instância &#8220;micro&#8221; que dada restrições, é gratuita. E mesmo que eu venha a pagar por mais disco ou núcleo de proc, será MUITO menos do que 60 dólares. Acredito que fique mais em conta do que uma VPS com 512MB de ram.</p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/zend-server-review/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Git, Git, Git&#8230;</title>
		<link>http://programe.me/git-git-git/</link>
		<comments>http://programe.me/git-git-git/#comments</comments>
		<pubDate>Fri, 08 Apr 2011 15:30:33 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=713</guid>
		<description><![CDATA[Uma buzz word bem pronunciada no meio de desenvolvimento de software atualmente, principalmente pelos Rubistas, o Git é um VCS descentralizado e tudo mais o que falam por aí. Ao invés desse marketing todo em cima do software, é melhor explicar aqui os motivos que fazem eu utilizá-lo atualmente. Git é descentralizado. Sim, isto é [...]]]></description>
			<content:encoded><![CDATA[<p>Uma buzz word bem pronunciada no meio de desenvolvimento de software atualmente, principalmente pelos Rubistas, o Git é um <a href="http://en.wikipedia.org/wiki/Revision_control" target="_blank">VCS</a> descentralizado e <a href="http://en.wikipedia.org/wiki/Git_(software)" target="_blank">tudo mais o que falam por aí</a>.</p>
<p>Ao invés desse marketing todo em cima do software, é melhor explicar aqui os motivos que fazem eu utilizá-lo atualmente.</p>
<p><strong>Git é descentralizado</strong>. Sim, isto é uma maravilha ! Sem delongas, permite que eu gerencie meus branches localmente, sem a necessidade <span style="text-decoration: line-through;">daquele role todo para</span> de criar um branch no servidor e depois fazer um checkout dele. Em miúdos, isso dá a agilidade necessária para eu parar o que estou fazendo atualmente para corrigir algum imprevisto, a.k.a, bug, em um branch separado voltando versões se necessário, fazer merge com meu branch principal e subir no servidor de homologação.</p>
<p><strong>Git comunica-se com vários repositórios remotos sem complicações.</strong></p>
<p>Eu, faço uns testes mirabolantes com meus códigos, logo, preciso comitar um mesmo código em servidores diferentes, inclusive em servidor SVN. Ora, isso é bem simples com os &#8220;remotes&#8221; do Git.</p>
<pre>$ git remote add &lt;remote_name&gt; &lt;url_address&gt;
$ git remote show</pre>
<p>Para mostrar as informações de um remote específico:</p>
<pre>$ git remote show &lt;nome_do_remote&gt;</pre>
<p>No SVN, consigo facilmente receber e mandar commits para o servidor.</p>
<pre>$ git svn rebase  #para receber do servidor svn os commits que você ainda não possui
$ git svn dcommit #para enviar os commits locais ao servidor</pre>
<p>Ou caso queira você criar o merge manualmente das revisões:</p>
<pre>$ git svn fetch
$ git merge remotes/git-svn</pre>
<p>Isto supondo que você está no branch master, claro.</p>
<p><strong>Git tem um &#8220;ponteiro&#8221; com índices e mais&#8230;</strong></p>
<p>Esse é o nome que dou aos stashes do Git. Quebra um galho imenso e muitas vezes acabo utilizando um stash ao branch. O Stash, salva em um &#8220;vetor&#8221; as modificações que estão no seu &#8220;stage&#8221; &#8211; em miúdos: arquivos já trackeados pelo Git e arquivos novos no stage - para uma memória temporária.</p>
<p>Seu uso é simples:</p>
<pre>$ git stash                       #salva os arquivos modificados dentro do stage.
$ git stash list                  #lista os stashes existentes em memória (Sim, armazena mais de um)
$ git stash pop  &lt;stash name&gt;     #recupera os arquivos do stash e apaga o stash.
$ git stash drop                  #limpa o stash sem recuperar os arquivos
$ git stash branch &lt;name&gt; &lt;stash&gt; #cria um branch &lt;name&gt; com o &lt;stash&gt;</pre>
<p><strong>Git tem Ctrl + Z</strong></p>
<p>Claro, afinal este é o propósito de qualquer VCS. Mas no Git a coisa é mais fácil voltar em qualquer ponto após quaisquer ações, digamos, não desejadas.</p>
<pre>$ git reflog</pre>
<p>Para aplicá-lo, basta pegar o nome que o reflog lhe dirá</p>
<pre>$ git checkout <em>&lt;hash&gt;</em></pre>
<p>Pode-se usar também, o<em> git merge</em>, a depender do que quer fazer.</p>
<p>A solução para um problema que eu penei até encontrar uma resposta: como ignorar alterações em arquivos que já estão sob o controle de versão do Git ?</p>
<p>Quer um exemplo ? O <em>databases.yml ; config.yml</em>; &#8230; A solução era bem simples:</p>
<pre>$ git update-index --assume-unchanged &lt;file&gt; #adiciona o arquivo na lista de índices ignorados
$ git update-index --assume-changed &lt;file&gt;   #volta o arquivo para o índice de arquivos à comitar.</pre>
<p>Para fechar, para aqueles que não desejam criar um <em>workspace</em> ao iniciar um repositório Git, deve-se criar um repositório do tipo <em>bare.</em></p>
<pre>$ git init --bare &lt;diretorio&gt;</pre>
<p>Isto é útil para você criar o repositório em sua VPS para salvar ou/e compartilhar  seus códigos remotamente.</p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/git-git-git/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Documentar para a eternidade</title>
		<link>http://programe.me/documentar-para-a-eternidade/</link>
		<comments>http://programe.me/documentar-para-a-eternidade/#comments</comments>
		<pubDate>Mon, 04 Apr 2011 14:20:06 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Dia-a-dia]]></category>
		<category><![CDATA[equipes]]></category>
		<category><![CDATA[gestão]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=739</guid>
		<description><![CDATA[Quando trabalhava sozinho, salvar e propagar o conhecimento de domínio das aplicações era uma tarefa fácil. Eu criava; eu codificava; eu catalogava tais conhecimentos e eu os mantinham atualizados. Após começar a efetivamente trabalhar em equipe, encontrei uma dificuldade imensa em documentar para a eternidade o que eu codificava. Ao longo do tempo, tentei várias [...]]]></description>
			<content:encoded><![CDATA[<p>Quando trabalhava sozinho, salvar e propagar o conhecimento de domínio das aplicações era uma tarefa fácil. Eu criava; eu codificava; eu catalogava tais conhecimentos e eu os mantinham atualizados. Após começar a efetivamente trabalhar em equipe, encontrei uma dificuldade imensa em <em><strong>documentar</strong></em><strong><em> para a eternidade</em></strong> o que eu codificava. Ao longo do tempo, tentei várias coisas, uma com mais e outras com nenhum efeito positivo sobre o problema. Contarei aqui, um relato resumido deste processo.</p>
<p><strong>O problema</strong></p>
<p>Documentar para a eternidade.</p>
<p><strong>1. pseudossolução: texto e mais textos</strong></p>
<p>No ano de 2009, eu entrei  no time de web da <a href="http://vexcorp.com" target="_blank">Vex</a> e como tal fiz minha primeira tentativa a fim de resolver o problema da documentação do que eu fazia. Tentei <strong>documentos de especificação técnica</strong>.</p>
<p>Escrevia em um arquivo .odt tudo o que eu havia entendido sobre o projeto e com aquilo, começava as atividades de design e codificação. Era engraçado, pois essa atividade assemelha-se ao renomado processo cascata e increvelmente, era simples e parecia solucionar o problema. Não satisfeito em escrever o .odt eu o salvei no servidor de versão e ainda por cima mandei por email para toda equipe Web.</p>
<p>Após algum tempo, novos requisitos apareceram e eu até mudei o .odt, mas não enviei novamente à Web, pois, na primeira vez, percebi que ninguém leu o arquivo, afinal, não era do interesse deles aquele montante de informação escrita e até, confusa.</p>
<p>Mais modificações vieram e eu modifiquei direto o sistema sem passar pelo documento.</p>
<p><strong>Resultados:</strong> após algumas semanas, o documento já não servia para mais nada.</p>
<p><strong>2. pseudossolução: report email</strong></p>
<p>Como documentos extensos não deram resultados para a equipe &#8211; incluindo-me nisto &#8211; resolvi em outro projeto, enviar um pequeno email report relatando como estava o processo e o que estava adotando para seguir. Ficou parecendo um diário de bordo resumido do projeto, enviado apenas umas duas vezes. Não fui buscar resultados, mas alguma coisa me diz que ninguém leu ou lembra-se disto.</p>
<p><strong>Resultados</strong>: fail.</p>
<p><strong>3. pseudossolução: diagramas</strong></p>
<p>Durante os projetos comecei a pensar: porque não disponibilizar os esboços de diagramas de classe que faço de meus designs ? Assim, ajudaria os demais a visualizar por um nível macro o que relaciona com quem. Esta ideia ficou somente na ideia, pois eu me deparei com a situação: como disponibilizar isto e manter atualizado ?</p>
<p>E foi daí que venho minha quarta ideia&#8230;</p>
<p><strong>4. pseudossolução: wiki !</strong></p>
<p>Ferramenta utilizada na Vex antes de 2009 sem sucesso, o Wiki foi uma forma que eu vi para documentar os projetos. Cheguei a comentar com o <a href="http://twitter.com/esampaio" target="_blank">@esampaio</a> sobre isto, mas ele disse que na primeira tentativa (antes de 2009) somente dois ou três desenvolvedores preocupavam-se em atualizar a ferramenta e por fim, acabou morrendo por desatualização.</p>
<p><strong>Após idas e vindas</strong> do trabalho pra aula e para casa pensando sobre isto, percebi que o ponto de interseção entre todas as pseudossoluções era: <strong>fazer algo além do sistema funcionar.</strong></p>
<p>Eu como programador sei bem o quão relutante eu era para escrever documentos e realizar processos burocráticos de software. Incrivelmente, com estas ditas soluções eu acabaria adicionando (mais) um processo burocrátivo na minha vida, desfocando daquilo que realmente importa: <a href="http://agilemanifesto.org" target="_blank">software funcionando</a>. Percebi também que ao longo do tempo eu escrevia testes e aquilo sim agregava valor ao &#8220;software funcionando&#8221; e mais do que isto, me auxiliava à ver <em>codificadamente</em> as soluções de design tomadas no processo. Possibilitou que eu mudasse a funcionabilidade sem medo de side-effects pois os testes diziam exatamente o que era esperado daquele software.</p>
<p>É aí que entra a escrita de bons testes. Simples, coesos e desacoplados. Para atingir tal estágio não é fácil, requer muitas tentativas e erros (<span style="text-decoration: line-through;">eXtreme Go Horse</span>), mas que no final recompensam cada hora focada na melhoria da técnica de escrever testes.</p>
<p>Meu próximo passo é tentar as <em>retrospectivas</em>. Por isto, realizo hoje uma palestra interna na Vex com o título: Retrospectiva. Nela, apresento a timeline idêntica a este post &#8211; com muito mais detalhes, claro &#8211; com o objetivo de mostrar para o resto da equipe de TI o que a Web passou durante 2 anos. Pedi que levassem também, um &#8220;problema&#8221; que cada um vê em seu trabalho atualmente, visando assim encontrar soluções em grupo para tais problemas &#8211; que podem até serem recorrentes.</p>
<p>Até o momento não vi motivos para as retrospectivas não funcionarem, mas isto só poderei afirmar daqui algumas semanas.</p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/documentar-para-a-eternidade/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Traits em PHP &#8211; herança horizontal</title>
		<link>http://programe.me/traits-em-php-heranca-horizontal/</link>
		<comments>http://programe.me/traits-em-php-heranca-horizontal/#comments</comments>
		<pubDate>Sat, 02 Apr 2011 13:08:00 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[herença]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=740</guid>
		<description><![CDATA[Antevejo que no futuro, o PHP como uma linguagem iterativa e incremental que é, adicionará ao seu núcleo um recurso muito valioso na categoria orientação à objetos. Antevejo ele, os Traits. E mais, consigo prever que será algo assim: &#60;?php trait Hello { public function ola() { echo "Olá"; } } class Mundo { use [...]]]></description>
			<content:encoded><![CDATA[<p>Antevejo que no futuro, o PHP como uma linguagem iterativa e incremental que é, adicionará ao seu núcleo um recurso muito valioso na categoria orientação à objetos.</p>
<p>Antevejo ele, os <a href="http://en.wikipedia.org/wiki/Traits" target="_blank">Traits</a>. E mais, consigo prever que será algo assim:</p>
<pre>&lt;?php
trait Hello {
 public function ola() {
   echo "Olá";
 }
}

class Mundo {
 use Hello;

 public function world() {
   echo "{$this-&gt;ola()} trait !";
  }
}

$ola = new Mundo();
$ola-&gt;world();
// Olá trait !</pre>
<p>Ok, não sou bidu. Realmente os Traits estão na lista do possível-futuro PHP 5.4 e eu, baixei a build de 31/03/2011 para testar.</p>
<p><strong>Traits</strong></p>
<p>O PHP não suporta herença multipla &#8211; amém &#8211; e por este motivo, às vezes ficamos limitados em algumas decisões de projeto (design). O maior problema neste ponto é que toda herença até agora (PHP 5.3.x) é vertical, ou seja, se eu precisar de um nível de abstração diferente no meio do processo, ou precisarei adicionar a nova abstração e reescrever tudo abaixo dela, ou ainda, terei que duplicar o código pois não conseguirei satisfazer a herença.</p>
<p>É nesse ponto que os Traits aparecem. Diferentemente da herença (vertical), os Traits possibilitam-nos criar herenças horizontais.</p>
<p>Exemplo, dada a necessidade:  haverão Funcionários, Supervisores, Gestores e Diretores no sistema e estes possui em comum o fato de receber salário. <span style="text-decoration: line-through;">(capitalismo)</span>. Uma possibilidade seria:</p>
<pre>Pessoa &gt; Funcionario
Pessoa &gt; Supervisores
Pessoa &gt; Gestores
Pessoa &gt; Diretores</pre>
<p>Tudo perfeito. Porém, chega outra necessidade: Gestores e Diretores tem a capacidade de demitir. Gestores precisam gerenciar cronogramas, assim como os Supervisores fazem.</p>
<p><strong><em>Pessoa.demitir(pessoa)</em></strong> não faz sentido, pois afetiria todos.<br />
<em><strong>Gestor.demitir(pessoa)</strong></em> e <strong><em>Diretor.demitir(pessoa)</em></strong> atende, mas <a href="http://en.wikipedia.org/wiki/DRY" target="_blank">duplicaria o código</a>.</p>
<pre>Pessoa &gt; Supervisor &gt; Gestor
Pessoa &gt; Diretor</pre>
<p>Shi, apareceu outro nível hierarquico. Traits auxilia exatamente neste ponto ! Vejamos:</p>
<pre>Trait Cronograma
Trait Evil (que contém recursos para demitir uma pessoa)
Pessoa &gt; Funcionario
Pessoa &gt; Supervisor : Cronograma
Pessoa &gt; Gestor : Cronograma : Evil
Pessoa &gt;  Diretor : Evil</pre>
<p>Note que o<strong><em> Pessoa &gt; Supervisor : Cronograma</em></strong> &#8211; os dois pontos para indicar o Trait são de minha autoria &#8211; era o <em><strong>Pessoa &gt; Supervisor</strong></em> antigo. Isso porque as atribuições para gerenciar cronogramas foram passadas para o Trait.</p>
<p>Neste pequeno exemplo, o Trait nos auxiliou com um problema de domínio. Acredito que ele também aplique-se e muito bem para problemas onde temos domínios transversais, pois, nele ficariam as atividades do outro domínio pode o domínio principal teria acesso aos recursos sem quebrar a SRP.</p>
<p><strong>Traits em PHP</strong></p>
<p>Como disse no começo, o futuro-provável PHP 5.4 virá com o Trait. Por enquanto essa implementação funcionaria:</p>
<pre>&lt;?php
trait Cronograma {
 private static $ATRASADO = "sempre";

 public function cobrarDe(Pessoa $funcionario) {
   $funcionario-&gt;definirPressao(self::$ATRASADO);
   $this-&gt;youTube();
 }

 private function youTube() {

 }
}

class Funcionario extends Pessoa {
}

class Supervisor extends Pessoa {
 use Cronograma;
}

$colaborador = new Funcionario();
$controlador = new Supervisor();
$controlador-&gt;cobrarDe($colaborador);</pre>
<p>Os Traits possuem boas capacidades com métodos de instância e estáticos. Vamos explorar um pouco mais:</p>
<pre>&lt;?php
trait Hello {
 public function sayHello() {
   echo "Olá";
 }
}

trait World {
 public function sayWorld() {
   echo "Mundo";
 }
}

class View {
 use Hello, World;
}

$view = new View();
$view-&gt;sayHello();
$view-&gt;sayWorld();
// exibe: Olá Mundo</pre>
<p>Pegando informações da Classe</p>
<pre>&lt;?php
trait QuemSou {
 public function eu() {
   return get_class($this);
 }
}

class Foo {
 use QuemSou;
}

$foo = new Foo();
echo $foo-&gt;eu();
// exibe: Foo</pre>
<p>Usando Variáveis de instância da classe</p>
<pre>&lt;?php
trait World {
 public function help() {
   return "{$this-&gt;hello} world";
 }
}

class Hello {
 private $hello = "Hello";
 use World;
}

$hello = new Hello();
echo $hello-&gt;help();
// exibe: Hello world</pre>
<p>Modificadores de acesso dos traits na classe</p>
<pre>&lt;?php
trait Hello {
 public function ola() {
   echo "Olá mundo";
 }
}

class Modificadores {
 use Hello { ola as private };
}

$ola = new Modificadores();
$ola-&gt;ola();
// Fatal Error....</pre>
<p>Modificadores de acesso com alias para nome de método</p>
<pre>&lt;?php
trait Hello {
 private function ola() {
   echo "Olá mundo";
 }
}

class Modificadores {
 use Hello { ola as public aloha };
}

$ola = new Modificadores();
$ola-&gt;aloha();
// Olá mundo</pre>
<p>Há outros vários recursos como métodos abstratos nos Traits, precedência, métodos estáticos, late static bindings, métodos mágicos, alias para nome de método do Trait ao usá-lo na classe. Para Rubistas ou Scalistas (?) as possibilidades são as mesmas dos Mixins e Traits de Ruby e Scala respectivamente.</p>
<ul>
<li><a href="http://wiki.php.net/rfc/horizontalreuse" target="_blank">RFC do PHP Trait</a> <em>(offline por enquanto devido a problemas no servidor deles)</em></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/traits-em-php-heranca-horizontal/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Recuperando um commit no meio da linha de morte no Git</title>
		<link>http://programe.me/recuperando-um-commit-no-meio-da-linha-de-morte-no-git/</link>
		<comments>http://programe.me/recuperando-um-commit-no-meio-da-linha-de-morte-no-git/#comments</comments>
		<pubDate>Fri, 25 Feb 2011 14:23:13 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Dia-a-dia]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=732</guid>
		<description><![CDATA[Situação do dia-a-dia: Cenário: Uma timeline com os últimos 10 commits apenas locais contendo uns testes malucos seu. Destes 10, você precisa tirar um para um push no servidor remoto, porém ele está lá no meio, entre o quinto e sétimo commit. E agora ? Solução: git reset + git  diff + git apply Primeiro, [...]]]></description>
			<content:encoded><![CDATA[<p>Situação do dia-a-dia:</p>
<p><strong>Cenário:</strong></p>
<p>Uma timeline com os últimos 10 commits apenas locais contendo uns testes malucos seu. Destes 10, você precisa tirar um para um push no servidor remoto, porém ele está lá no meio, entre o quinto e sétimo commit. E agora ?</p>
<p><strong>Solução:</strong></p>
<p><em>git reset + git  diff + git apply</em></p>
<p>Primeiro, peguei o hash do commit que me interessa da lista. Com ele em mãos, fiz um reset para ele:</p>
<blockquote><p>$ git reset d3fb9</p></blockquote>
<p>Fiz um diff entre o commit HEAD (ele próprio) e o penúltimo commit da timeline gerando um .patch da diferença:</p>
<blockquote><p>$ git diff -u 691ac &gt; meu_commit_importante.patch</p></blockquote>
<p>Após ter meu patch a salvo, fiz o reset apontando para o último commit que tenho sincronizado com meu servidor remoto:</p>
<blockquote><p>$ git reset 12345</p></blockquote>
<p>Após, eu utilizei o git apply &#8211;check para verificar se meu patch não ocasionaria problemas e por fim o apliquei:</p>
<blockquote><p>$ git apply meu_commit_importante.patch</p></blockquote>
<p>Como eu não preciso logar no histórico que fiz isso (eram commits locais, lembra ?) não utilizei o git am conforme o pessoal costuma utilizar. Após isto, git commit -a -m &#8220;Modificação XPTO&#8221; e done.</p>
<p>Como me é interessante manter o que estou fazendo vivo, obviamente o coloquei em um branch separado após isto.</p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/recuperando-um-commit-no-meio-da-linha-de-morte-no-git/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ALM Conference Brasil</title>
		<link>http://programe.me/alm-conference-brasil/</link>
		<comments>http://programe.me/alm-conference-brasil/#comments</comments>
		<pubDate>Fri, 18 Feb 2011 10:03:23 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Dia-a-dia]]></category>
		<category><![CDATA[eventos]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=721</guid>
		<description><![CDATA[Quarta-feira passada, aconteceu aqui em São Paulo a primeira ALM Conference Brasil. Por ser a primeira, claro que não poderia faltar ele, o Ken Schwaber abrindo o dia do evento com sua excelente palestra sobre ALM e Scrum não são suficientes. Ele abordou rapidamente o que é ALM (Application Lifecycle Management); dedicou uma boa parte do [...]]]></description>
			<content:encoded><![CDATA[<p>Quarta-feira passada, aconteceu aqui em São Paulo a primeira ALM Conference Brasil. Por ser a primeira, claro que não poderia faltar ele, o <a href="http://en.wikipedia.org/wiki/Ken_Schwaber" target="_blank">Ken Schwaber</a> abrindo o dia do evento com sua excelente palestra sobre <em><strong>ALM e Scrum não são suficientes</strong></em>.</p>
<p>Ele abordou rapidamente o que é ALM (<a href="http://en.wikipedia.org/wiki/Application_lifecycle_management" target="_blank">Application Lifecycle Management</a>); dedicou uma boa parte do tempo explicando o que realmente é o framework Scrum e da junção de ambos no desenvolvimento de software. O interessante da palestra foi ele propor duas atividades de 5 minutos para que os participantes pensassem sobre a situação-problema por ele anunciada e após abriu para debate.</p>
<p>Após a palestra dele,<a href="http://twitter.com/#!/josepapo" target="_blank"> José Papo</a> assumiu o palco para abordar o tema <strong><em>ALM com governança e qualidade</em></strong>. Ele defendeu que é possível agradar <span style="text-decoration: line-through;">gregos e troianos</span> equipes que gostam da utilização do Scrum no ciclo de vida do software sem esquecer daquele gestor ou diretor que vive de planilhas e gráficos de Gantt daquela empresa que você sabe o nome.</p>
<p>Aliás, uma coisa &#8211; ao meu ver &#8211; quebrou o brilho do evento: o marketing invasivo da Microsoft. Ridículo, imaturo e desnecessário são as palavras que cabem para o que fora lá praticado.</p>
<p>O José papo por ser da área técnica do Visual Studio no Brasil, precisou ao longo de sua palestra, puxar sardinha pro lado da empresa <span style="text-decoration: line-through;">que paga parte de seu salário</span> de tal forma que ficou nítido que ele era forçado a fazer aquilo.</p>
<p>Utilizar gráficos para exibir uma <em>autoafirmativa</em> liderança no mercado de ferramentas para developers no meio da palestra &#8211; inclusive foi citado isso &#8211; foi feio; &#8220;Utilizem o &#8216;Bing&#8217; caso não saibam o que é tal coisa&#8221; &#8211; e não era uma brincadeira quando falava isto. Para não ser injusto, a única descontração que houve foi o diretor de produto Visual Studio citar: <em>&#8220;A Microsoft faz coisas boas, com exceção ao [Windows] Vista !&#8221;</em></p>
<p>Apesar do marketing <em>burro</em> da Microsoft, a palestra do Papo agregou muito e desmistificou outras tantas também.</p>
<p>Após o almoço, voltamos com um convite para uma espécie de &#8220;Mão na Massa&#8221; com a plataforma Team Foundation Server e Visual Studio. Não sei se todas as vagas foram preenchidas, o que posso afirmar é que a palestra que concorria com esse laboratório estava cheia.</p>
<div class="wp-caption aligncenter" style="width: 550px"><a href="http://twitpic.com/40gpco"><img class=" " title="ALM Conference Brasil" src="http://s3.amazonaws.com/twitpic/photos/large/242644056.jpg?AWSAccessKeyId=0ZRYP5X5F6FSMBCCSE82&amp;Expires=1298023692&amp;Signature=DUTUd9UbCb%2BPjJ8FbDIC3QF2Lok%3D" alt="" width="540" height="405" /></a><p class="wp-caption-text">Scrum na prática @ ALM Conference Brasil</p></div>
<p style="text-align: center;">
<p>O pessoal da <em>Programmer&#8217;s</em>, apresentou de forma bem didática como eles aplicam Scrum e melhor: a palestra foi instrumentada com Scrum elucidando ainda mais o que era por eles explicado. Destaque para o Kanban 3D com monitor touch screen que estava em exposição no stand deles.</p>
<p>O evento foi proveitoso, grátis e incrivelmente tranquilo. A divulgação deste evento ao meu ver foi fraca, haja vista que sobraram muitas vagas em um evento que eu aposto que seria bem baladado ainda mais por ser gratuito.</p>
<p>Espero que ano que vem ocorra o &#8220;II ALM conference Brasil&#8221;, mas por favor: eu topo pagar a entrada à ter que ouvir e ver um marketing tão &#8220;brutal&#8221; praticado por algumas empresas de software.</p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/alm-conference-brasil/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bug tracking</title>
		<link>http://programe.me/bug-tracking/</link>
		<comments>http://programe.me/bug-tracking/#comments</comments>
		<pubDate>Wed, 16 Feb 2011 13:09:32 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Softwares]]></category>
		<category><![CDATA[bugs]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=719</guid>
		<description><![CDATA[Eu nesse tempo como programador já utilizei um bocado de  bug tracking diferente. Desde o mais &#8220;quadrado&#8221;, porém, resolvido Bugzilla até outros mais cheio de imagens e gracejos. Pensando sobre o quanto nós testamos ferramentas  - de tracking inclusos &#8211; abri uma pesquisa para saber a sua experiência com tais ferramentas. Quem sabe do resultado [...]]]></description>
			<content:encoded><![CDATA[<p>Eu nesse tempo como programador já utilizei um bocado de  bug tracking diferente. Desde o mais &#8220;quadrado&#8221;, porém, resolvido <a href="http://www.bugzilla.org/" target="_blank">Bugzilla</a> até outros mais cheio de imagens e gracejos.</p>
<p>Pensando sobre o quanto nós testamos ferramentas  - de tracking inclusos &#8211; abri uma pesquisa para saber a sua experiência com tais ferramentas. Quem sabe do resultado final não sai algo legal ? <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>O link para a pesquisa: <a href="http://pesquisa.helio.arq.br" target="_blank">http://pesquisa.helio.arq.br</a></p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/bug-tracking/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

