<?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: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/" version="2.0">

<channel>
	<title>Alberto Leal</title>
	
	<link>http://albertoleal.eti.br</link>
	<description>Desenvolvimento de Software e Tecnologia</description>
	<pubDate>Thu, 12 Aug 2010 13:06:12 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/albertoleal" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="albertoleal" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Happy Hour Ágil em Campinas</title>
		<link>http://albertoleal.eti.br/2010/08/happy-hour-agil-em-campinas/</link>
		<comments>http://albertoleal.eti.br/2010/08/happy-hour-agil-em-campinas/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 13:06:12 +0000</pubDate>
		<dc:creator>Alberto Leal</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://albertoleal.eti.br/?p=489</guid>
		<description><![CDATA[ 
Pessoal,
Está sendo organizado, através do twitter,  um Happy Hour Ágil que acontecerá em Campinas/SP.  Será no dia 19/08 às 19:30 no Giovannetti da Rua Padre Vieira, 1277 - Cambuí - Campinas, ao lado da Prefeitura.

Para acompanhar o que estamos falando sobre este Happy Hour lá no twitter, procure pela tag #HHA
Nos encontramos lá =D
]]></description>
			<content:encoded><![CDATA[<p style="TEXT-ALIGN: center"><a rel="attachment wp-att-494" href="http://albertoleal.eti.br/2010/08/happy-hour-agil-em-campinas/giovanetti/"></a><a rel="attachment wp-att-492" href="http://albertoleal.eti.br/2010/08/happy-hour-agil-em-campinas/hha1/"><img class="aligncenter size-full wp-image-492" title="hha1" src="http://albertoleal.eti.br/wp-content/uploads/2010/08/hha1.jpg" alt="hha1" width="205" height="212" /></a> </p>
<p>Pessoal,</p>
<p>Está sendo organizado, através do twitter,  um Happy Hour Ágil que acontecerá em Campinas/SP.  Será no dia 19/08 às 19:30 no Giovannetti da Rua Padre Vieira, 1277 - Cambuí - Campinas, ao lado da Prefeitura.</p>
<p style="text-align: center;"><img class="size-full wp-image-494 alignnone" title="giovanetti" src="http://albertoleal.eti.br/wp-content/uploads/2010/08/giovanetti.jpg" alt="giovanetti" width="695" height="386" /></p>
<p>Para acompanhar o que estamos falando sobre este Happy Hour lá no twitter, procure pela tag <strong>#HHA</strong></p>
<p>Nos encontramos lá =D</p>
]]></content:encoded>
			<wfw:commentRss>http://albertoleal.eti.br/2010/08/happy-hour-agil-em-campinas/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Problemas com o som no Ubuntu</title>
		<link>http://albertoleal.eti.br/2010/04/problemas-com-o-som-no-ubuntu/</link>
		<comments>http://albertoleal.eti.br/2010/04/problemas-com-o-som-no-ubuntu/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 00:21:11 +0000</pubDate>
		<dc:creator>Alberto Leal</dc:creator>
		
		<category><![CDATA[ubuntu]]></category>

		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://albertoleal.eti.br/?p=478</guid>
		<description><![CDATA[Hoje eu tive um problema pra lá de bizarro:
Eu estava trabalhando normalmente no Ubuntu, quando precisei reiniciar e abrir uma aplicação à partir do Windows. Quando eu voltei para o Ubuntu, o som parou de funcionar. Tudo estava instalado, o único problema era que o som não saia na caixa de som.
Eis a solução:
&#8220;2.1 If [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje eu tive um problema pra lá de bizarro:</p>
<p>Eu estava trabalhando normalmente no Ubuntu, quando precisei reiniciar e abrir uma aplicação à partir do Windows. Quando eu voltei para o Ubuntu, o som parou de funcionar. Tudo estava instalado, o único problema era que o som não saia na caixa de som.</p>
<p>Eis a solução:</p>
<p style="padding-left: 30px;">&#8220;2.1 If you are in Windows unplug the AC cable and plug it back after you logged into Ubuntu.</p>
<p style="padding-left: 30px;">
<p style="padding-left: 30px;">2.2 If you are already on Linux after a Windows session and you didn&#8217;t follow point 1.1estat, Unplug the AC cable, then SHUTDOWN , not restart the computer. Start it again manually and plug the cable back after you logged into Ubuntu &#8221;</p>
<p style="padding-left: 30px;"><a href="http://ubuntuforums.org/showthread.php?t=455147">http://ubuntuforums.org/showthread.php?t=455147</a></p>
<p>Achei legal compartilhar isso aqui antes que alguém se mate re-compilando os drivers do alsa e assim por diante =D</p>
]]></content:encoded>
			<wfw:commentRss>http://albertoleal.eti.br/2010/04/problemas-com-o-som-no-ubuntu/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Screencast: Como criar um branch vazio no Git</title>
		<link>http://albertoleal.eti.br/2010/03/screencast-como-criar-um-branch-vazio-no-git/</link>
		<comments>http://albertoleal.eti.br/2010/03/screencast-como-criar-um-branch-vazio-no-git/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 14:35:52 +0000</pubDate>
		<dc:creator>Alberto Leal</dc:creator>
		
		<category><![CDATA[Controle de versão]]></category>

		<category><![CDATA[Git]]></category>

		<category><![CDATA[Screencast]]></category>

		<category><![CDATA[branch vazio]]></category>

		<guid isPermaLink="false">http://albertoleal.eti.br/?p=457</guid>
		<description><![CDATA[Olá Pessoal,
Neste último final de semana eu gravei um screencast de como criar um branch vazio no Git.
Espero que vocês gostem:

Creating an empty branch on Git from Alberto Leal on Vimeo.
Abraços.
]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal,</p>
<p>Neste último final de semana eu gravei um screencast de como criar um branch vazio no Git.</p>
<p>Espero que vocês gostem:</p>
<p><object width="400" height="300" data="http://vimeo.com/moogaloop.swf?clip_id=10322667&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=10322667&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /></object></p>
<p><a href="http://vimeo.com/10322667">Creating an empty branch on Git</a> from <a href="http://vimeo.com/user517523">Alberto Leal</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>Abraços.</p>
]]></content:encoded>
			<wfw:commentRss>http://albertoleal.eti.br/2010/03/screencast-como-criar-um-branch-vazio-no-git/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Git: Localizando a origem de um bug através de busca binária entre os commits</title>
		<link>http://albertoleal.eti.br/2010/01/git-localizando-a-origem-de-um-bug-atraves-de-busca-binaria-entre-os-commits/</link>
		<comments>http://albertoleal.eti.br/2010/01/git-localizando-a-origem-de-um-bug-atraves-de-busca-binaria-entre-os-commits/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 21:56:42 +0000</pubDate>
		<dc:creator>Alberto Leal</dc:creator>
		
		<category><![CDATA[Controle de versão]]></category>

		<category><![CDATA[Git]]></category>

		<category><![CDATA[bisect]]></category>

		<category><![CDATA[git bisect]]></category>

		<guid isPermaLink="false">http://albertoleal.eti.br/?p=446</guid>
		<description><![CDATA[

No artigo de hoje, vamos abordar uma funcionalidade muito interessante do Git, a qual nos permite fazer uma busca binária no projeto procurando o commit exato onde o bug foi introduzido no projeto.
Cenário: Você não é o único desenvolvedor que trabalha no projeto. Enquanto você trabalha em um branch, outras pessoas trabalham em outros branches, [...]]]></description>
			<content:encoded><![CDATA[<div id="artigo">
<div id="strConteudo" class="strConteudo">
<p>No artigo de hoje, vamos abordar uma funcionalidade muito interessante do Git, a qual nos permite fazer uma busca binária no projeto procurando o <em>commit</em> exato onde o <em>bug</em> foi introduzido no projeto.</p>
<p><strong>Cenário:</strong> Você não é o único desenvolvedor que trabalha no projeto. Enquanto você trabalha em um <em>branch</em>, outras pessoas trabalham em outros branches, e no final todos fazem o <em>merge</em> no <em>branch</em> master. O <em>merge</em> é feito várias vezes por semana. Em um belo dia, uma funcionalidade que antes funcionava perfeitamente para de funcionar, mas ninguém sabe dizer quem foi o responsável por quebrar aquela parte da aplicação, e como não existia uma suíte de testes cobrindo tal funcionalidade, o <em>bug</em> foi commitado.</p>
<p><strong>Problema:</strong> Onde o erro foi commitado?<br />
<strong>Solução:</strong> Utilizar o comando <strong>git bisect</strong>.</p>
<p>O projeto possui os seguintes commits:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">commit 5c370fe0c059566a88e41699bfb7fea0abf4da0c
Author: Alberto Leal <span style="color: #000000; font-weight: bold;">&lt;</span>albertonb<span style="color: #000000; font-weight: bold;">@</span>gmail.com<span style="color: #000000; font-weight: bold;">&gt;</span>
Date:   Sat Dec 12 11:05:04 2009 <span style="color: #660033;">-0200</span>
&nbsp;
    CBR 98575 - Cert verification
&nbsp;
commit bd9e83fe1def11a38436d159b1ce721920fb9565
Author: Alberto Leal <span style="color: #000000; font-weight: bold;">&lt;</span>albertonb<span style="color: #000000; font-weight: bold;">@</span>gmail.com<span style="color: #000000; font-weight: bold;">&gt;</span>
Date:   Sat Dec 12 11:04:25 2009 <span style="color: #660033;">-0200</span>
&nbsp;
    CBR 26345 - Regression
&nbsp;
commit 61de4d21518855196426986ee0798c1e69f05ae0
Author: Alberto Leal <span style="color: #000000; font-weight: bold;">&lt;</span>albertonb<span style="color: #000000; font-weight: bold;">@</span>gmail.com<span style="color: #000000; font-weight: bold;">&gt;</span>
Date:   Sat Dec 12 11:03:37 2009 <span style="color: #660033;">-0200</span>
&nbsp;
    bug 123 fixed
&nbsp;
commit 32c8ce277a7db30aea67f7397a06596b1fc8bfdf
Author: Alberto Leal <span style="color: #000000; font-weight: bold;">&lt;</span>albertonb<span style="color: #000000; font-weight: bold;">@</span>gmail.com<span style="color: #000000; font-weight: bold;">&gt;</span>
Date:   Sat Dec 12 11:02:58 2009 <span style="color: #660033;">-0200</span>
&nbsp;
    sessionTimeout features added
&nbsp;
commit 1973d569ac052697c6e35e7e26b4e7b03ba09616
Author: Alberto Leal <span style="color: #000000; font-weight: bold;">&lt;</span>albertonb<span style="color: #000000; font-weight: bold;">@</span>gmail.com<span style="color: #000000; font-weight: bold;">&gt;</span>
Date:   Sat Dec 12 11:01:58 2009 <span style="color: #660033;">-0200</span>
&nbsp;
    slogan on the header
&nbsp;
commit 294d5cac2d9b400b7d244d71c6db5849f61fad6a
Author: Alberto Leal <span style="color: #000000; font-weight: bold;">&lt;</span>albertonb<span style="color: #000000; font-weight: bold;">@</span>gmail.com<span style="color: #000000; font-weight: bold;">&gt;</span>
Date:   Sat Dec 12 11:01:01 2009 <span style="color: #660033;">-0200</span>
&nbsp;
    initial commit</pre></div></div>

<p>**Para efeito de didática, já sabemos que o <em>bug</em> está no <em>commit</em>:<br />
bd9e83fe1def11a38436d159b1ce721920fb9565</p>
<p>Antes de iniciar a busca binária, deve-se saber pelo menos um <em>commit</em> onde não existia o <em>bug</em>. Neste caso, sabemos que até o segundo <em>commit</em> tudo funcionava perfeitamente. Mas, para ter certeza disso, execute o comando abaixo, rode a aplicação e teste:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git checkout 1973d569ac052697c6e35e7e26b4e7b03ba09616</pre></div></div>

<p>Observação: Estamos utilizando poucos <em>commits</em>, mas no &#8220;mundo real&#8221; os <em>commits</em> são muitos.</p>
<p>Após constatar que não existe o <em>bug</em> no segundo <em>commit</em>, volte para o último <em>commit</em> da mesma maneira:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">git checkout 5c370fe0c059566a88e41699bfb7fea0abf4da0c</pre></div></div>

<p>Agora chegou a vez de utilizar o comando <strong>git bisect</strong>. A idéia é marcar os <em>commits</em> como <em>bad</em>(ruim) e <em>good</em>(bom), e deixar que o Git faça uma busca binária entre os <em>commits</em>.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Alberto:repo Alberto$ git bisect start
Alberto:repo Alberto$ git bisect bad
Alberto:repo Alberto$ git bisect good 1973d569ac052697c6e35e7e26b4e7b03ba09616
Bisecting: 1 revisions left to <span style="color: #7a0874; font-weight: bold;">test</span> after this <span style="color: #7a0874; font-weight: bold;">&#40;</span>roughly <span style="color: #000000;">1</span> steps<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span>61de4d21518855196426986ee0798c1e69f05ae0<span style="color: #7a0874; font-weight: bold;">&#93;</span> bug <span style="color: #000000;">123</span> fixed</pre></div></div>

<p>Antes de mais nada, é necessário informar ao Git que vamos iniciar uma busca binária, para isso execute<strong> git bisect start</strong>. Repare que após iniciar o <em>bisect</em>, marcamos o último <em>commit</em> como <em>bad</em> e o segundo <em>commit</em> como <em>good</em>.</p>
<p>Em seguida o Git fez uma busca binária e encontrou o <em>commit</em> &#8220;bug 123 fixed&#8221;. Neste momento você deve executar a sua aplicação para ver se o <em>bug</em> está lá.</p>
<p>Não, o <em>bug</em> não está lá, portanto, marcamos o <em>commit</em> como <em>good</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Alberto:repo Alberto$ git bisect good
Bisecting: 0 revisions left to <span style="color: #7a0874; font-weight: bold;">test</span> after this <span style="color: #7a0874; font-weight: bold;">&#40;</span>roughly <span style="color: #000000;">0</span> steps<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span>bd9e83fe1def11a38436d159b1ce721920fb9565<span style="color: #7a0874; font-weight: bold;">&#93;</span> CBR <span style="color: #000000;">26345</span> - Regression</pre></div></div>

<p>Novamente, o Git faz uma busca binária e encontra mais um <em>commit</em> para ser analisado. Após rodar a aplicação, constata-se que o erro está no <em>commit</em> atual que o <em>bisect</em> encontrou &#8220;CBR 26345 - Regression&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Alberto:repo Alberto$ git bisect bad
bd9e83fe1def11a38436d159b1ce721920fb9565 is first bad commit
commit bd9e83fe1def11a38436d159b1ce721920fb9565
Author: Alberto Leal <span style="color: #000000; font-weight: bold;">&lt;</span>albertonb<span style="color: #000000; font-weight: bold;">@</span>gmail.com<span style="color: #000000; font-weight: bold;">&gt;</span>
Date:   Sat Dec 12 11:04:25 2009 <span style="color: #660033;">-0200</span>
&nbsp;
    CBR <span style="color: #000000;">26345</span> - Regression
&nbsp;
:<span style="color: #000000;">100644</span> <span style="color: #000000;">100644</span> 9309150acfad8f21cb460ee17663fcbeaf212aa0 172b5ae1734b7bd1e1ac46b5cade3e61cbfddff1 M	imasters.txt</pre></div></div>

<p>Pronto! Agora já sabemos em qual <em>commit</em> o <em>bug</em> foi introduzido. E, para finalizar, da mesma forma que informamos ao Git que desejávamos fazer uma busca binária, devemos informá-lo que já terminamos, executando o comando abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Alberto:repo Alberto$ git bisect reset
Previous HEAD position was bd9e83f... CBR <span style="color: #000000;">26345</span> - Regression
Switched to branch <span style="color: #ff0000;">'master'</span></pre></div></div>

<p>Muita gente acha que quando se está trabalhando sozinho em um projeto de software não é necessário utilizar um sistema de controle de versões. O que é um falácia. Utilizar um SCM é indispensável e indiferente à quantidade de desenvolvedores que está trabalhando no projeto.</p></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://albertoleal.eti.br/2010/01/git-localizando-a-origem-de-um-bug-atraves-de-busca-binaria-entre-os-commits/feed/</wfw:commentRss>
		</item>
		<item>
		<title>[Off] Minha Coluna no iMasters</title>
		<link>http://albertoleal.eti.br/2009/12/off-minha-coluna-no-imasters/</link>
		<comments>http://albertoleal.eti.br/2009/12/off-minha-coluna-no-imasters/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 12:55:44 +0000</pubDate>
		<dc:creator>Alberto Leal</dc:creator>
		
		<category><![CDATA[Off-Topic]]></category>

		<category><![CDATA[coluna]]></category>

		<category><![CDATA[desenvolvimento]]></category>

		<category><![CDATA[imasters]]></category>

		<guid isPermaLink="false">http://albertoleal.eti.br/?p=436</guid>
		<description><![CDATA[Caramba, quanto tempo que eu não posto nada =(
Mas hoje eu não vim aqui para publicar algo técnico. Dei uma passada rápida para dar um recado aos leitores do blog.
Aconteceu algo nesta semana que gostaria de compartilhar com vocês.
Leiam o email abaixo:
Ei Alberto, boa tarde.
Obrigada pelo retorno.
Sou editora do iMasters e cheguei até você através [...]]]></description>
			<content:encoded><![CDATA[<p>Caramba, quanto tempo que eu não posto nada =(</p>
<p>Mas hoje eu não vim aqui para publicar algo técnico. Dei uma passada rápida para dar um recado aos leitores do blog.</p>
<p>Aconteceu algo nesta semana que gostaria de compartilhar com vocês.</p>
<p>Leiam o email abaixo:</p>
<blockquote><p><em>Ei Alberto, boa tarde.</em></p>
<p><em>Obrigada pelo retorno.</em></p>
<p><em>Sou editora do iMasters e cheguei até você através de um de nossos desenvolvedores. Ele viu seu artigo [<a href="../2009/06/git-o-rebase-pode-te-assustar/" target="_blank">http://albertoleal.eti.br/2009/06/git-o-rebase-pode-te-assustar/</a>] e me repassou, com ótimos comentários.</em></p>
<p><em>Gostaria de saber se você tem interesse de publicar o artigo no iMasters. E não só ele, como outros também, sendo nosso articulista.</em></p>
<p><em>Se você topar, preciso apenas que faça cadastro no site, como usuário, e me envie uma foto (rosto) e um texto curto para o seu perfil. Com isso em mãos, farei o agendamento desse artigo e, então, você poderá publicar semanalmente - intervalo mínimo.</em></p>
<p><em>O que me diz?</em></p>
<p><em>Aguardo sua resposta.<br />
Atenciosamente,<br />
Rina Noronha<br />
Editora - Redação iMasters </em></p></blockquote>
<p>Fiquei muito contente com o convite feito pela Rina, editora do iMasters. Pois, meu primeiro contato com o iMasters foi há <strong>muitos </strong>anos atrás, logo no início da <span style="text-decoration: line-through;">carreira</span> <em>hobby</em>.  E, nunca imaginei que um dia eu pudesse vir a me tornar um colunista do site.</p>
<p style="text-align: center;"><a rel="attachment wp-att-440" href="http://albertoleal.eti.br/2009/12/off-minha-coluna-no-imasters/screen-shot-2009-12-08-at-083307/"><img class="aligncenter size-medium wp-image-440" title="iMasters" src="http://albertoleal.eti.br/wp-content/uploads/2009/12/screen-shot-2009-12-08-at-083307-300x220.png" alt="iMasters" width="300" height="220" /></a></p>
<p>Inicialmente, os artigos publicados por lá serão sobre Git.</p>
<p>Por que? Quando eu iniciei minha série de posts sobre este assunto, eu recebi um ótimo feedback através de emails e twitter, com isso, espero poder ajudar ainda mais pessoas, já que o público do iMasters é <strong>N</strong> vezes maior do que o meu humilde blog =)</p>
<p>Eu pretendo escrever artigos exclusivos para serem publicados no iMasters, mas isso somente acontecerá no próximo ano.</p>
<p>O primeiro artigo já foi publicado:  &#8220;<a href="http://imasters.uol.com.br/artigo/15213/desenvolvimento/git_o_rebase_pode_te_assustar/" target="_blank">Git: o rebase pode te assustar</a>&#8221;</p>
<p>Boa leitura!</p>
]]></content:encoded>
			<wfw:commentRss>http://albertoleal.eti.br/2009/12/off-minha-coluna-no-imasters/feed/</wfw:commentRss>
		</item>
		<item>
		<title>CakePHP: Construindo relatórios com ReportHelper</title>
		<link>http://albertoleal.eti.br/2009/08/cakephp-construindo-relatorios-com-reporthelper/</link>
		<comments>http://albertoleal.eti.br/2009/08/cakephp-construindo-relatorios-com-reporthelper/#comments</comments>
		<pubDate>Mon, 03 Aug 2009 13:41:37 +0000</pubDate>
		<dc:creator>Alberto Leal</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Screencast]]></category>

		<category><![CDATA[cakephp]]></category>

		<category><![CDATA[helper]]></category>

		<category><![CDATA[ReportHelper]]></category>

		<guid isPermaLink="false">http://albertoleal.eti.br/?p=426</guid>
		<description><![CDATA[Foi no final do ano passado, se não me engano, que desenvolvi um helper para ser utilizado em projetos PHP que utilizam um framework chamado CakePHP. Utilizei este framework em muitos projetos, tanto em projetos internos da minha empresa quanto para clientes.
Resolvi chamá-lo de &#8220;ReportHelper&#8220;. Como o próprio nome já diz, um helper para ajudar [...]]]></description>
			<content:encoded><![CDATA[<p>Foi no final do ano passado, se não me engano, que desenvolvi um <em>helper</em> para ser utilizado em projetos PHP que utilizam um framework chamado CakePHP. Utilizei este framework em muitos projetos, tanto em projetos internos da minha empresa quanto para clientes.</p>
<p>Resolvi chamá-lo de &#8220;<em>ReportHelper</em>&#8220;. Como o próprio nome já diz, um <em>helper</em> para ajudar na criação de relatórios =)</p>
<p>Desde a sua criação, outro desenvolvedor - Carlos Spineli - resolveu dar umas tapas no código para melhorá-lo. Resolvi compartilhar com a comunidade este <em>helper</em>. Ele já está disponível na minha páginal pessoal no Github, e você consegue acessá-lo <a href="http://github.com/albertoleal/Report-Helper/tree/master" target="_blank">aqui</a>. Lá você encontrará o código, bem como uma aplicação exemplo que eu criei no <em>screencast</em> que você pode conferir aí embaixo:</p>
<p style="text-align: center;"><object width="400" height="230" data="http://vimeo.com/moogaloop.swf?clip_id=5883604&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=5883604&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /></object></p>
<p><a href="http://vimeo.com/5883604">ReportHelper - CakePHP</a> from <a href="http://vimeo.com/user517523">Alberto</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>Mandem suas críticas e sugestões.</p>
<p>E, colaborem =)</p>
]]></content:encoded>
			<wfw:commentRss>http://albertoleal.eti.br/2009/08/cakephp-construindo-relatorios-com-reporthelper/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Git: Recuperando arquivo em commits antigos</title>
		<link>http://albertoleal.eti.br/2009/07/git-recuperando-arquivo-em-commits-antigos/</link>
		<comments>http://albertoleal.eti.br/2009/07/git-recuperando-arquivo-em-commits-antigos/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 12:51:15 +0000</pubDate>
		<dc:creator>Alberto Leal</dc:creator>
		
		<category><![CDATA[Git]]></category>

		<guid isPermaLink="false">http://albertoleal.eti.br/?p=422</guid>
		<description><![CDATA[Hoje vou dar uma dica rápida de como recuperar um arquivo em commits anteriores.
Cenário: Você está trabalhando em um arquivo e adicionou ele em alguns commit. Mas, depois de alguns minutos, você percebe que as mudanças que você está fazendo estão incorretas, e necessita recuperar a versão que você havia adicionado no commit anterior. Como [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje vou dar uma dica rápida de como recuperar um arquivo em commits anteriores.<br />
<strong>Cenário: </strong>Você está trabalhando em um arquivo e adicionou ele em alguns commit. Mas, depois de alguns minutos, você percebe que as mudanças que você está fazendo estão incorretas, e necessita recuperar a versão que você havia adicionado no commit anterior. Como fazer isso? Vamos ver:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">touch</span> abc.txt
$ <span style="color: #c20cb9; font-weight: bold;">vim</span> abc.txt
$ git add abc.txt
$ git commmit <span style="color: #660033;">-m</span> <span style="color: #ff0000;">'Abc file'</span>
$ <span style="color: #c20cb9; font-weight: bold;">vim</span> abc.txt
$ git add abc.txt
$ git commmit <span style="color: #660033;">-m</span> <span style="color: #ff0000;">'Some changes'</span>
$ <span style="color: #c20cb9; font-weight: bold;">cat</span> abc.txt
$ git checkout HEAD^1 <span style="color: #660033;">--</span> abc.txt</pre></td></tr></table></div>

<p>O comando é &#8216;git checkout HEAD^1 &#8212; abc.txt&#8217;,  onde o número 1 representa a quantidade de commits abaixo, a partir do HEAD, e abc.txt representa o nome do arquivo que você deseja recuperar.</p>
<p>Simples e bastante útil!</p>
]]></content:encoded>
			<wfw:commentRss>http://albertoleal.eti.br/2009/07/git-recuperando-arquivo-em-commits-antigos/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Design Pattern: Implementando o Decorator</title>
		<link>http://albertoleal.eti.br/2009/06/design-pattern-implementando-o-decorator/</link>
		<comments>http://albertoleal.eti.br/2009/06/design-pattern-implementando-o-decorator/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 11:00:25 +0000</pubDate>
		<dc:creator>Alberto Leal</dc:creator>
		
		<category><![CDATA[Engenharia de SW]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[Livros]]></category>

		<category><![CDATA[decorator]]></category>

		<category><![CDATA[design pattern]]></category>

		<guid isPermaLink="false">http://albertoleal.eti.br/?p=341</guid>
		<description><![CDATA[
Photo: http://static.howstuffworks.com/gif/teen-bedroom-decorating-ideas-2.jpg
O último livro que terminei de ler era sobre Design Pattern. Então, resolvi fazer alguns posts contendo algumas implementações. O padrão de projeto da vez é o Decorator.
&#8212;&#8212;&#8211;
O poder da composição
Têm quem ame, e têm quem odeie herança. Existem casos que não há como fugir da herança, mas, sempre que possível, prefira composição a [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="alignnone" src="http://static.howstuffworks.com/gif/teen-bedroom-decorating-ideas-2.jpg" alt="" width="400" height="316" /></p>
<p style="text-align: center;"><a href="http://static.howstuffworks.com/gif/teen-bedroom-decorating-ideas-2.jpg" target="_blank">Photo: http://static.howstuffworks.com/gif/teen-bedroom-decorating-ideas-2.jpg</a></p>
<p>O último livro que terminei de ler era sobre<em> Design Pattern.</em> Então, resolvi fazer alguns posts contendo algumas implementações. O padrão de projeto da vez é o <em>Decorator</em>.</p>
<p><strong>&#8212;&#8212;&#8211;</strong></p>
<p><strong>O poder da composição</strong></p>
<p>Têm quem ame, e têm quem odeie herança. Existem casos que não há como fugir da herança, mas, sempre que possível, prefira composição a herança. Quando utilizamos herança em uma parte da nossa aplicação, e alguns comportamentos são herdados, estes  são definidos estaticamente em tempo de compilação. Por outro lado, se você estender o comportamento de um objeto por meio de composição, você consegue fazer isso dinamicamente, ou seja, consegue compôr os objetos de forma dinâmica. Com isso, se torna fácil adicionar novas funcionalidades escrevendo um código novo ao invés de alterar o código existente. Isso é bacana, pois o comportamento anterior não é modificado, assim as chances de introdução de erros no código que já estava funcionando é menor. Se algo der errado, basta remover a nova classe que foi criada, por exemplo. Resumindo,<strong> mantenha as classes abertas para extensão e fechadas para alteração.</strong></p>
<p>O padrão de projeto <em>decorator</em> anexa novas responsabilidades em um objeto dinamicamente, utilizando  do poder da composição.</p>
<p>Vamos ver como isso funciona na prática. O exemplo que lhe será apresentado é a construção de uma pizza. No momento do pedido, o cliente poderá pedir ao Pizzaiolo que adicione  novos ingredientes na pizza, tais como: orégano e tomate. Exemplo simples e direto, apenas para ilustrar.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.eti.albertoleal.decorator</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> Pizza <span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> description <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Unknown Pizza&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setDescription<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> desc<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
description <span style="color: #339933;">=</span> desc<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getDescription<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #000000; font-weight: bold;">return</span> description<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000066; font-weight: bold;">double</span> cost<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.eti.albertoleal.decorator</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Cheese <span style="color: #000000; font-weight: bold;">extends</span> Pizza <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Cheese<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		setDescription<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Cheese Pizza&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">double</span> cost<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">19.90</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>As classes <em>decorator</em> devem ser espelhos das classes que elas vão decorar. Vamos utilizar da herança em nossos objetos do tipo <em>CondimentDecorator</em>. O motivo de se usar herança na classe <em>Decorator</em> é  pelo simples fato de se ter o mesmo tipo dos objetos que vão ser decorados. O uso de herança é justamente para atingir  essa correspondência de tipo.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.eti.albertoleal.decorator</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> CondimentDecorator <span style="color: #000000; font-weight: bold;">extends</span> Pizza <span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.eti.albertoleal.decorator</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Oregano <span style="color: #000000; font-weight: bold;">extends</span> CondimentDecorator <span style="color: #009900;">&#123;</span>
	Pizza pizza<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Oregano<span style="color: #009900;">&#40;</span>Pizza pz<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		pizza <span style="color: #339933;">=</span> pz<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getDescription<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> pizza.<span style="color: #006633;">getDescription</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;, Oregano&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">double</span> cost<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> .50 <span style="color: #339933;">+</span> pizza.<span style="color: #006633;">cost</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.eti.albertoleal.decorator</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Tomato <span style="color: #000000; font-weight: bold;">extends</span> CondimentDecorator <span style="color: #009900;">&#123;</span>
	Pizza pizza<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Tomato<span style="color: #009900;">&#40;</span>Pizza pz<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		pizza <span style="color: #339933;">=</span> pz<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getDescription<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> pizza.<span style="color: #006633;">getDescription</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;, Tomato &quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">double</span> cost<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> .10 <span style="color: #339933;">+</span> pizza.<span style="color: #006633;">cost</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Se você estava atento reparou que a cada condimento que é adicionado na pizza um valor correspondente ao condimento é somado ao valor da pizza. Essa é a idéia do <em>decorator. </em>Estou decorando um objeto pizza com diversos outros componentes. Um outro exemplo, bastante comum de se encontrar pela internet, são as janelas gráficas. O ato de decorar uma janela gráfica com diversos componentes de apresentação, tais como: barra de rolagem, campos de texto e por aí vai.</p>
<p>Chegou a hora de testarmos o nosso código, criar uma pizza e adicionar alguns condimentos a ela e constatar se a nossa &#8220;decoração&#8221; funciona:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.eti.albertoleal.decorator</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Pizzaiolo <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		Pizza pz <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Cheese<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		pz <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Tomato<span style="color: #009900;">&#40;</span>pz<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		pz <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Tomato<span style="color: #009900;">&#40;</span>pz<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		pz <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Oregano<span style="color: #009900;">&#40;</span>pz<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		pz <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Tomato<span style="color: #009900;">&#40;</span>pz<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		pz <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Oregano<span style="color: #009900;">&#40;</span>pz<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		pz <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Tomato<span style="color: #009900;">&#40;</span>pz<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>pz.<span style="color: #006633;">getDescription</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
&nbsp;
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Concluindo:</p>
<ul>
<li>A herança é uma maneira de estender comportamentos, mas não é a melhor maneira de obter flexibilidade;</li>
<li>Composição e delegação são boas maneiras de se adicionar funcionalidades em tempo de execução;</li>
<li>A utilização de um componente <em>decorator </em>é simplesmente decorar um objeto, e o objeto decorado <strong>não </strong>precisa conhecer os decoradores;</li>
<li>É muito importante que os objetos decoradores sejam espelhos do objeto que vão decorar, justamente para ter uma correspondência de tipo.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://albertoleal.eti.br/2009/06/design-pattern-implementando-o-decorator/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Git: Quem fez merda no meu código?</title>
		<link>http://albertoleal.eti.br/2009/06/git-quem-fez-merda-no-meu-codigo/</link>
		<comments>http://albertoleal.eti.br/2009/06/git-quem-fez-merda-no-meu-codigo/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 18:55:45 +0000</pubDate>
		<dc:creator>Alberto Leal</dc:creator>
		
		<category><![CDATA[Git]]></category>

		<guid isPermaLink="false">http://albertoleal.eti.br/?p=418</guid>
		<description><![CDATA[
Cenário: Você está em uma reunião participando de um code review, quando algum desenvolvedor vira e fala: &#8220;Quem comentou a linha 12? Eu fiz esse código e aquele fragmento era importante!&#8221;. Pergunta: O culpado aparece rápido? Pode ser que sim. Mas, caso não apareça  ninguém para assumir a culpa, utilize o comando &#8216;git blame&#8217; para [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="alignnone" src="http://www.kaneoya.com.br/wordpress/images/arrependimento.jpg" alt="" width="350" height="250" /></p>
<p><strong>Cenário:</strong> Você está em uma reunião participando de um <em>code review</em>, quando algum desenvolvedor vira e fala: &#8220;Quem comentou a linha 12? Eu fiz esse código e aquele fragmento era importante!&#8221;. Pergunta: O culpado aparece rápido? Pode ser que sim. Mas, caso não apareça  ninguém para assumir a culpa, utilize o comando &#8216;git blame&#8217; para descobrir quem fez cada modificação.</p>
<p><strong>Exemplo:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ git blame workspace<span style="color: #000000; font-weight: bold;">/</span>ProjectXPTO<span style="color: #000000; font-weight: bold;">/</span>WebContent<span style="color: #000000; font-weight: bold;">/</span>file.jsp <span style="color: #660033;">-L</span> 10,18
73e51f4f <span style="color: #7a0874; font-weight: bold;">&#40;</span>Desenvolvedor A 2009-03-10 09:07:53 <span style="color: #660033;">-0400</span> 10<span style="color: #7a0874; font-weight: bold;">&#41;</span>
73e51f4f <span style="color: #7a0874; font-weight: bold;">&#40;</span>Desenvolvedor A 2009-03-10 09:07:53 <span style="color: #660033;">-0400</span> 11<span style="color: #7a0874; font-weight: bold;">&#41;</span>  <span style="color: #000000; font-weight: bold;">&amp;</span>lt;script<span style="color: #000000; font-weight: bold;">&amp;</span>gt;
73e51f4f <span style="color: #7a0874; font-weight: bold;">&#40;</span>Desenvolvedor A 2009-03-10 09:07:53 <span style="color: #660033;">-0400</span> 12<span style="color: #7a0874; font-weight: bold;">&#41;</span>         <span style="color: #000000; font-weight: bold;">//</span> var windowName;
7ue8d049 <span style="color: #7a0874; font-weight: bold;">&#40;</span>Desenvolvedor B 2009-06-18 16:42:48 <span style="color: #660033;">-0400</span> 13<span style="color: #7a0874; font-weight: bold;">&#41;</span>
7ue8d049 <span style="color: #7a0874; font-weight: bold;">&#40;</span>Desenvolvedor B 2009-06-18 16:42:48 <span style="color: #660033;">-0400</span> 14<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">function</span> cleanUpVariable<span style="color: #7a0874; font-weight: bold;">&#40;</span>variable<span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>
7ue8d049 <span style="color: #7a0874; font-weight: bold;">&#40;</span>Desenvolvedor B 2009-06-18 16:42:48 <span style="color: #660033;">-0400</span> 15<span style="color: #7a0874; font-weight: bold;">&#41;</span>  var = j;
7ue8d049 <span style="color: #7a0874; font-weight: bold;">&#40;</span>Desenvolvedor B 2009-06-18 16:42:48 <span style="color: #660033;">-0400</span> <span style="color: #000000;">16</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>  j = variable.replace<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>^<span style="color: #000000;">0</span>-9A-Za-z<span style="color: #7a0874; font-weight: bold;">&#93;</span>+<span style="color: #000000; font-weight: bold;">/</span>g, <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
7ue8d049 <span style="color: #7a0874; font-weight: bold;">&#40;</span>Desenvolvedor B 2009-06-18 16:42:48 <span style="color: #660033;">-0400</span> 17<span style="color: #7a0874; font-weight: bold;">&#41;</span>  <span style="color: #7a0874; font-weight: bold;">return</span> j;
7ue8d049 <span style="color: #7a0874; font-weight: bold;">&#40;</span>Desenvolvedor B 2009-06-18 16:42:48 <span style="color: #660033;">-0400</span> <span style="color: #000000;">18</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div>

<p>Se você não passar o parâmetro -L serão exibidas todas as linhas do seu arquivo.  No caso acima deu para perceber que o responsável por comentar a variável &#8220;windowName&#8221; foi o &#8220;Desenvolvedor A&#8221;.</p>
<p>Agora você já sabe como descobrir quem faz cada besteira nos seus arquivos.</p>
]]></content:encoded>
			<wfw:commentRss>http://albertoleal.eti.br/2009/06/git-quem-fez-merda-no-meu-codigo/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Git requer estudo, sim</title>
		<link>http://albertoleal.eti.br/2009/06/git-requer-estudo-sim/</link>
		<comments>http://albertoleal.eti.br/2009/06/git-requer-estudo-sim/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 12:11:59 +0000</pubDate>
		<dc:creator>Alberto Leal</dc:creator>
		
		<category><![CDATA[Git]]></category>

		<category><![CDATA[Off-Topic]]></category>

		<guid isPermaLink="false">http://albertoleal.eti.br/?p=413</guid>
		<description><![CDATA[
Acredito que o título desse post diz muito por si só. Mas, vou tentar expandí-lo um pouco mais. Só para constar, fui impulsionado a escrever esse post devido a algumas mensagens que acompanhei pelo twitter.
&#8211;
Existem diversos controladores de versão no mercado, tais como: Harvest, CVS, SVN, Clear Quest e por aí vai. Porém, o Git [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="alignnone" src="http://blufiles.storage.live.com/y1p7Uh3YG-GxGS_HXzCEbFIRN4m_i926mgk4pKI0NsrPnggIs5D1mIkXO_9e92WEkS7tDYwGk178PHSOdlJfU2qIw" alt="" width="302" height="400" /></p>
<p style="text-align: left;">Acredito que o título desse post diz muito por si só. Mas, vou tentar expandí-lo um pouco mais. Só para constar, fui impulsionado a escrever esse post devido a algumas mensagens que acompanhei pelo twitter.</p>
<p style="text-align: left;">&#8211;</p>
<p>Existem diversos controladores de versão no mercado, tais como: Harvest, CVS, SVN, Clear Quest e por aí vai. Porém, o Git possui uma idéia, filosofia diferente destes que acabei de citar. Git é um SCM distribuído. Não vou entrar em detalhes sobre as diferenças agora, vamos deixar para uma outra ocasião.</p>
<p>A mensagem que quero passar é a seguinte:<br />
Git é difícil?  <strong>Não</strong>.<br />
Uso SVN/CVS na minha empresa há muitos anos, posso mudar tudo de uma vez para o GIT - já que Git não é difícil? <strong>Não aconselho.</strong></p>
<p>Usar um controlador de versão não envolve apenas adicionar arquivos e comitá-los. Existem diversas tarefas que, às vezes, temos que fazer, como por exemplo: <a href="http://albertoleal.eti.br/2009/05/git-quebrando-um-commit-e-cancelando-algumas-alteracoes/" target="_blank">Quebrando um commit e cancelando algumas alterações</a>. Pode ser que você já saiba fazê-lo no outro SCM que você vem utilizando, mas ainda não sabe fazê-lo no Git.</p>
<p>Se você, simplesmente, mudar de SCM de uma hora para a outra fatalmente terá problemas e terá que recorrer ao grande amigo Google. Alguns problemas triviais não lhe tomará muito tempo, por outro lado, outros não serão tão triviais quanto possam parecer e tomarão mais tempo do que você gostaria.</p>
<p>Minha sugestão é a seguinte, comece utilizando Git em um projeto antes de migrar todos os outros. Desse jeito você perceberá como o Git trabalha e como tirar o maior proveito dele. Além de se deparar com os mais diversos tipos de problemas.</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://albertoleal.eti.br/2009/06/git-requer-estudo-sim/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
