<?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/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Léo Hackin 0.2c</title>
	
	<link>http://leohackin.com.br/blog</link>
	<description>Eternamente beta, geralmente funcional</description>
	<lastBuildDate>Sun, 05 Jul 2009 21:00:55 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.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" href="http://feeds.feedburner.com/leohackin" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Iniciando com o SimpleTest</title>
		<link>http://leohackin.com.br/blog/2009/07/iniciando-com-o-simpletest/</link>
		<comments>http://leohackin.com.br/blog/2009/07/iniciando-com-o-simpletest/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 20:11:24 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[simpletest]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://leohackin.com.br/blog/?p=119</guid>
		<description><![CDATA[Salve people,Vamos iniciar hoje uma pequena jornada à terras que possivelmente muita gente só viu/leu em sites especializados e muito pouco comentadas em PHP: a terra do desenvolvimento orientado a testes, ou TDD.Se você não sabe ou nem faz idéia do que é TDD, dê uma procura no Google pois existem dezenas de sites muito [...]]]></description>
			<content:encoded><![CDATA[Salve people,<br /><br />Vamos iniciar hoje uma pequena jornada à terras que possivelmente muita gente só viu/leu em sites especializados e muito pouco comentadas em PHP: a terra do desenvolvimento orientado a testes, ou <strong>TDD</strong>.<br /><br />Se você não sabe ou nem faz idéia do que é TDD, dê uma procura no <strong>Google</strong> pois existem dezenas de sites muito bacanas destilando idéias e tudo mais sobre isso.<br /><br /><em>Em poucas palavras, </em><strong><em>TDD</em></strong><em> (Test Driven Development) é um técnica de desenvolvimento de software que nos diz que devemos escrever os testes antes de escrever o código da aplicação propriamente dito.</em><br /><br />Inicialmente isso parece meio louco: afinal, você sempre testa DEPOIS de escrever seus programas ou durante, enquanto debuga tudo, correto ? Mas com o passar do tempo, a verdadeira natureza e vantagem do TDD, quando aplicada corretamente, se faz presente.<br /><br />Você se torna capaz de antecipar a detecção e correção de várias falhas, reduzindo dramaticamente o tempo gasto com correções em cima de implementações muito complexas já praticamente no final do seu cronograma.<br /><br />Hoje em dia, existem várias frameworks que auxiliam nessa tarefa de escrever testes. O foco aqui é algo que poucos sites (principalmente em português) abordam de forma prática que é o uso da <strong><a href="http://www.simpletest.org" target="_blank">SimpleTest</a></strong>, uma framework para testes unitários que vem ganhando o espaço antes ocupado pelo <a href="http://www.phpunit.de/" target="_blank">PHPUnit</a>.<br /><br />No decorrer dos próximos posts sobre o SimpleTest, você poderá adquirir um pouco de conhecimento que poderá ser útil em seus futuros projetos. Então, vamos simbora.<br /><h2>Instalando o SimpleTest</h2>
A instalação do SimpleTest em si é muito fácil.
<ol><br />	<li>Baixe a versão mais atual do SimpleTest no site <a href="http://www.simpletest.org" target="_blank">http://www.simpletest.org</a> (a versão que usaremos nessa sequência de tutoriais é a 1.0.1). A framework é composta por uma pasta simples;</li>
	<li>Descompacte o arquivo dentro de sua aplicação. Para fins de organização, vamos criar uma pasta &#8220;tests&#8221; na raíz de nossa aplicação e descompactar o zip/tar do SimpleTest lá: ao descompactar você verá uma pasta chamada <em>simpletest</em> sendo criada.</li>
</ol>
Em tese, nossa aplicação pode ter qualquer estrutura de diretórios. O SimpleTest funciona tanto com functions como com classes. Vamos abordar o uso de classes, dado que o TDD é amplamente usado em sua maioria em soluções OO (Orientadas a Objeto) e acho que já passou da hora da comunidade PHP pensar OO. <img src='http://leohackin.com.br/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> <br /><br />Partindo desse pressuposto, vamos criar a pasta &#8220;<em><strong>classes</strong></em>&#8221; na raíz de nossa aplicação: lá iremos botar todas as nossas classes que serão usadas nos testes.<br /><br />Teremos então, uma estrutura de arquivos como abaixo:<br /><br /><img class="alignnone size-full wp-image-120" title="imagem5" src="http://leohackin.com.br/blog/wp-content/uploads/2009/07/imagem5.png" alt="imagem5" width="231" height="101" /><br /><br />A pasta <strong>app_tdd </strong>é a pasta onde está nossa aplicação: uma pasta criada dentro do meu htdocs (raíz do Apache).<br /><br />Se o seu servidor web estiver instalado com configurações padrão, provavelmente você poderá acessar usando: <em><a href="http://localhost/app_tdd" target="_blank">http://localhost/app_tdd</a></em><br /><h2><strong>Nosso problema: uma calculadora</strong></h2>
Com o SimpleTest &#8220;instalado&#8221; em nossa aplicação e nossa estrutura de diretórios resolvida, vamos escrever nosso primeiro caso de teste.<br /><br />O cenário de nossa aplicação é uma <strong>calculadora</strong>: nossa calculadora conseguirá efetuar apenas a operação de soma.<br /><br />Com uma análise rápida do problema, já nos vem à cabeça que:
<ul><br />	<li>Uma classe chamada &#8220;Calculadora&#8221; com um método chamado &#8220;soma&#8221;;</li>
	<li>Nosso método soma recebendo dois números</li>
	<li>Nosso método retornando o valor da soma entre os dois números</li>
</ul>
<strong>Nossa abordagem não TDD seria</strong>: vamos fazer a classe, implementar o método e depois testa-lo em uma página teste. Correto ? Num primeiro momento isso seria ótimo: afinal, o código e complexidade das classes inicialmente são lindos.<br /><br />Mas <strong>imagine agora sua aplicação crescendo e crescendo</strong>: classes extendendo e usando outras classes. Você extende a Calculadora, outra classe utiliza o método soma e você vai testando apenas &#8220;o que vem depois&#8221;.<br /><br />Num dado momento, <strong>você tem um resultado incorreto de soma</strong>: uma entrada incorreta de parâmetros, um deles ser uma letra e não um número, termos uma passagem de um objeto ao invés de um número propriamente dito &#8230; <strong>De quem é a culpa ?</strong> Da classe nova, que esqueceu de filtrar a entrada de parametros ? Do designer, que esqueceu de limitar a entrada dos valores no form para apenas números ? Do outro programador, que foi descuidado e não validou se os dados passados eram realmente números antes de chamar a soma ?<br /><br /><strong>Enfim, temos N cenários onde a detecção do erro pode ser muito custosa</strong>, seja pelo método para encontra-lo (que varia do debug minucioso ao &#8220;achismo&#8221;) e/ou pelo custo em termos de tempo para concerta-lo. Tudo isso pode gerar um custo/prejuízo que seria reduzido com a implementação do pensando TDD.<br /><h2>Pensando primeiro em testes</h2>
<strong>Mentalize</strong>: <em>&#8220;Quais as situações que podem quebrar meu método soma? Se acontecer, como devo tratar esse erro ?&#8221;</em><br /><br />Com base nesse pensamento, podemos deduzir:
<ul><br />	<li>Para somar, nossa calculadora terá que receber sempre <strong>dois números</strong>;</li>
	<li>A soma sempre ocorre entre dois números, nunca entre letras, objetos ou qualquer coisa que não seja exatamente um número;</li>
	<li>Se algo der erro, devo retornar falso;</li>
</ul>
<strong>Interessante!</strong> Não implementamos nenhuma linha de nossa solução e já sabemos:
<ul><br />	<li>Que vamos precisar de uma classe (Calculadora) com um método de soma;</li>
	<li>Sabemos que o método deverá receber dois parâmetros que deverão ser sempre números;</li>
	<li>Que se for passado qualquer coisa que não sejam dois números, eu devo retornar falso;</li>
</ul>
<strong>Bom, então vamos implementar a classe ?</strong> Não, pequeno gafanhoto: <strong>vamos implementar primeiro os testes</strong>, porque é com base neles que vamos ter certeza que nossa classe se comportará exatamente como pensamos que ela deve se comportar sob os mais diversos cenários.<br /><h2>Escrevendo nosso primeiro teste</h2>
Implementar um teste com SimpleTest é, como o nome já diz, &#8220;simples&#8221;.<br /><br />Vamos criar todos os nossos testes dentro da pasta <em><span style="text-decoration: underline;">tests</span></em>. Para cada classe que tivermos que testar, vamos criar um caso de teste (unit test case) que será representado em um arquivo php.<br /><br />Então, nosso primeiro caso de teste será o <strong>calculadora_test.php</strong>. O nome do arquivo não tem um padrão de nomenclatura, mas por convenção usa-se sempre<em> nomedaclasse<nome-da-classe></nome-da-classe></em><nome_da_classe><em>_test.php</em>.</nome_da_classe><br /><br /><strong>calculadora.php -> calculadora_test.php</strong><br /><br />A estrutura inicial do nosso arquivo calculadora_test.php será a seguinte:<br /><br /><pre class="devcodeblock" title="PHP"><table class="devcodetools"><tbody><tr><td>&nbsp;PHP&nbsp;|&nbsp;</td><td style="background-image:url('http://leohackin.com.br/blog/wp-content/plugins/devformatter/img/devformatter-copy.png');background-repeat:no-repeat;background-position:50% 50%;width:16px;height:16px;"/><embed id="ZeroClipboard8" src="http://leohackin.com.br/blog/wp-content/plugins/devformatter/_zclipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16px" height="16px" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=8&width=16&height=16" wmode="transparent" /></td><td>&nbsp;copy&nbsp;code&nbsp;|</td><td style="cursor:pointer" title="DevFormatter Plugin" onclick="devfmt_credits()">?</td><td width="99%">&nbsp;</td></tr></tbody></table><div class="devcodeoverflow"><table class="devcodearea" width="100%"><tr><td class="devcodelines" width="1%">1</td><td class="devcodelinesarea"><pre class="devcode devcodeline"><span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'simpletest/autorun.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">2</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline"><span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'../classes/calculadora.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr><tr><td class="devcodelines" width="1%">3</td><td class="devcodelinesarea"><pre class="devcode devcodeline">&nbsp;</pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">4</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline"><span style="color: #000000; font-weight: bold;">class</span> TestOfCalculadora <span style="color: #000000; font-weight: bold;">extends</span> UnitTestCase <span style="color: #009900;">&#123;</span></pre></td></tr><tr><td class="devcodelines" width="1%">5</td><td class="devcodelinesarea"><pre class="devcode devcodeline">    <span style="color: #666666; font-style: italic;">// os testes vão aqui ;)</span></pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">6</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline"><span style="color: #009900;">&#125;</span></pre></td></tr><tr><td class="devcodelines" width="1%">7</td><td class="devcodelinesarea"><pre class="devcode devcodeline"></pre></td></tr></table></div></pre>
<br /><strong>Pronto!</strong> Nosso caso de teste da classe Calculadora está feito. Para testa-lo, vamos apontar o browser para <a href="http://localhost/app_tdd/tests/calculadora_test.php" target="_blank">http://localhost/app_tdd/tests/calculadora_test.php</a>. O resultado será:<br /><br /><pre class="devcodeblock" title="PHP"><table class="devcodetools"><tbody><tr><td>&nbsp;PHP&nbsp;|&nbsp;</td><td style="background-image:url('http://leohackin.com.br/blog/wp-content/plugins/devformatter/img/devformatter-copy.png');background-repeat:no-repeat;background-position:50% 50%;width:16px;height:16px;"/><embed id="ZeroClipboard9" src="http://leohackin.com.br/blog/wp-content/plugins/devformatter/_zclipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16px" height="16px" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=9&width=16&height=16" wmode="transparent" /></td><td>&nbsp;copy&nbsp;code&nbsp;|</td><td style="cursor:pointer" title="DevFormatter Plugin" onclick="devfmt_credits()">?</td><td width="99%">&nbsp;</td></tr></tbody></table><div class="devcodeoverflow"><table class="devcodearea" width="100%"><tr><td class="devcodelines" width="1%">1</td><td class="devcodelinesarea"><pre class="devcode devcodeline">Warning<span style="color: #339933;">:</span> <span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">../</span>classes<span style="color: #339933;">/</span>calculadora<span style="color: #339933;">.</span>php<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#91;</span><span style="color: #000000; font-weight: bold;">function</span><span style="color: #339933;">.</span>require<span style="color: #339933;">-</span>once<span style="color: #009900;">&#93;</span><span style="color: #339933;">:</span> failed to open stream<span style="color: #339933;">:</span> No such <span style="color: #990000;">file</span> or directory in <span style="color: #339933;">/</span>Applications<span style="color: #339933;">/</span>MAMP<span style="color: #339933;">/</span>htdocs<span style="color: #339933;">/</span>app_tdd<span style="color: #339933;">/</span>tests<span style="color: #339933;">/</span>calculadora_test<span style="color: #339933;">.</span>php on line <span style="color: #cc66cc;">4</span></pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">2</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline">&nbsp;</pre></td></tr><tr><td class="devcodelines" width="1%">3</td><td class="devcodelinesarea"><pre class="devcode devcodeline">Fatal error<span style="color: #339933;">:</span> <span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#91;</span><span style="color: #000000; font-weight: bold;">function</span><span style="color: #339933;">.</span><span style="color: #b1b100;">require</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">:</span> Failed opening required <span style="color: #0000ff;">'../classes/calculadora.php'</span> <span style="color: #009900;">&#40;</span>include_path<span style="color: #339933;">=</span><span style="color: #0000ff;">'.:/Applications/MAMP/bin/php5/lib/php:/Users/leohackin/PEAR'</span><span style="color: #009900;">&#41;</span> in <span style="color: #339933;">/</span>Applications<span style="color: #339933;">/</span>MAMP<span style="color: #339933;">/</span>htdocs<span style="color: #339933;">/</span>app_tdd<span style="color: #339933;">/</span>tests<span style="color: #339933;">/</span>calculadora_test<span style="color: #339933;">.</span>php on line <span style="color: #cc66cc;">4</span></pre></td></tr></table></div></pre>
<br /><strong>Ops! </strong>Não criamos nossa classe ainda, por isso obtemos esse erro. Quando disse que escrevemos testes antes de implementar nossa lógica, estava falando sério. =)<br /><br />Vamos criar nossa classe Calculadora então.<br /><br /><pre class="devcodeblock" title="PHP"><table class="devcodetools"><tbody><tr><td>&nbsp;PHP&nbsp;|&nbsp;</td><td style="background-image:url('http://leohackin.com.br/blog/wp-content/plugins/devformatter/img/devformatter-copy.png');background-repeat:no-repeat;background-position:50% 50%;width:16px;height:16px;"/><embed id="ZeroClipboard10" src="http://leohackin.com.br/blog/wp-content/plugins/devformatter/_zclipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16px" height="16px" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=10&width=16&height=16" wmode="transparent" /></td><td>&nbsp;copy&nbsp;code&nbsp;|</td><td style="cursor:pointer" title="DevFormatter Plugin" onclick="devfmt_credits()">?</td><td width="99%">&nbsp;</td></tr></tbody></table><div class="devcodeoverflow"><table class="devcodearea" width="100%"><tr><td class="devcodelines" width="1%">1</td><td class="devcodelinesarea"><pre class="devcode devcodeline"><span style="color: #000000; font-weight: bold;">class</span> Calculadora <span style="color: #009900;">&#123;</span>	</pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">2</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline">  <span style="color: #000000; font-weight: bold;">function</span> soma<span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span><span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></pre></td></tr><tr><td class="devcodelines" width="1%">3</td><td class="devcodelinesarea"><pre class="devcode devcodeline">  <span style="color: #009900;">&#125;</span></pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">4</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline"> <span style="color: #009900;">&#125;</span></pre></td></tr><tr><td class="devcodelines" width="1%">5</td><td class="devcodelinesarea"><pre class="devcode devcodeline"></pre></td></tr></table></div></pre>
<br />Legal, agora vamos acessar nosso caso de teste denovo.<br /><br /><img class="alignnone size-full wp-image-146" title="imagem6" src="http://leohackin.com.br/blog/wp-content/uploads/2009/07/imagem6.png" alt="imagem6" width="458" height="240" /><br /><br /><strong>Uhu! Funfou!!!</strong><br /><br />Analisando o código:
<ul><br />	<li>fazemos o include de dois arquivos:
<ul><br />	<li>o arquivo autorun.php é o arquivo que faz a "mágica" acontecer: é ele quem roda os testes e exibe os resultados, portanto deverá sempre estar no seu caso de teste;</li>
</ul><ul><br />	<li>o outro arquivo é a classe que desejamos usar no teste, no caso calculadora.php</li>
</ul>
</li>
	<li>Criamos uma classe chamada <span style="text-decoration: underline;"><em>TestOfCalculadora</em></span> extendendo <em><span style="text-decoration: underline;">UnitTestCase</span></em>, que será a classe que o SimpleTest usará para fazer o teste. <strong>É obrigatório que a classe inicie com o nome "test" para que o SimpleTest execute automaticamente</strong> a mesma como um caso de teste. Existe uma forma de faze-lo sem iniciar o nome com "test", mas isso não vem ao caso agora.</li>
</ul>
<strong>Maneiro né ?</strong> Mas como puderam notar, <strong>nosso caso de teste não testa nada ainda</strong>. Hahahah<br /><br /><strong>Vamos adicionar agora um teste</strong>: o teste vai verificar se a soma está realmente "somando" dois números. Para isso, devemos adicionar um método à nossa classe de testes. Vamos chamar esse teste de "<em><span style="text-decoration: underline;">testSomaDoisNumerosInteiros</span></em>", onde vamos passar dois números inteiros esperando que a soma deles esteja correta.<br /><br />Usar nomes grandes assim no nome do método são uma boa prática, já que deixam os testes mais legíveis na hora de rodar o caso de teste.<br /><br /><pre class="devcodeblock" title="PHP"><table class="devcodetools"><tbody><tr><td>&nbsp;PHP&nbsp;|&nbsp;</td><td style="background-image:url('http://leohackin.com.br/blog/wp-content/plugins/devformatter/img/devformatter-copy.png');background-repeat:no-repeat;background-position:50% 50%;width:16px;height:16px;"/><embed id="ZeroClipboard11" src="http://leohackin.com.br/blog/wp-content/plugins/devformatter/_zclipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16px" height="16px" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=11&width=16&height=16" wmode="transparent" /></td><td>&nbsp;copy&nbsp;code&nbsp;|</td><td style="cursor:pointer" title="DevFormatter Plugin" onclick="devfmt_credits()">?</td><td width="99%">&nbsp;</td></tr></tbody></table><div class="devcodeoverflow"><table class="devcodearea" width="100%"><tr><td class="devcodelines" width="1%">01</td><td class="devcodelinesarea"><pre class="devcode devcodeline"><span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'simpletest/autorun.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">02</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline"><span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'../classes/calculadora.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr><tr><td class="devcodelines" width="1%">03</td><td class="devcodelinesarea"><pre class="devcode devcodeline">&nbsp;</pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">04</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline"><span style="color: #000000; font-weight: bold;">class</span> TestOfCalculadora <span style="color: #000000; font-weight: bold;">extends</span> UnitTestCase <span style="color: #009900;">&#123;</span> </pre></td></tr><tr><td class="devcodelines" width="1%">05</td><td class="devcodelinesarea"><pre class="devcode devcodeline">&nbsp;</pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">06</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline">    <span style="color: #000000; font-weight: bold;">function</span> testSomaDoisNumerosInteiros<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> </pre></td></tr><tr><td class="devcodelines" width="1%">07</td><td class="devcodelinesarea"><pre class="devcode devcodeline">        <span style="color: #000088;">$calculadora</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Calculadora<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> </pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">08</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline">        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assertEqual</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$calculadora</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">soma</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr><tr><td class="devcodelines" width="1%">09</td><td class="devcodelinesarea"><pre class="devcode devcodeline">    <span style="color: #009900;">&#125;</span></pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">10</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline">&nbsp;</pre></td></tr><tr><td class="devcodelines" width="1%">11</td><td class="devcodelinesarea"><pre class="devcode devcodeline"><span style="color: #009900;">&#125;</span></pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">12</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline"></pre></td></tr></table></div></pre>
<br />Como visto, temos nosso método <em><span style="text-decoration: underline;">testSomaDoisNumerosInteiros</span></em> que instancia nossa <span style="text-decoration: underline;">classe </span><em><span style="text-decoration: underline;">Calculadora</span></em> e depois executa um método chamado <em><span style="text-decoration: underline;">assertEqual</span></em>. Esse método é o responsável por testar nossa soma. Ele significa:<br /><br /><em>Verifique se a chamada </em><span style="text-decoration: underline;"><em>$calculadora->soma(1,1)</em></span><em> retornará um resultado </em><strong><em>igual à 2</em></strong><br /><br />Se a chamada retornar qualquer coisa diferente de dois, nosso teste irá falhar, indentificando que algo de podre está acontecendo em nosso método soma.<br /><br />Se rodarmos esse script teremos enfim:<br /><br /><img class="alignnone size-full wp-image-149" style="border: 1px solid black;" title="imagem1" src="http://leohackin.com.br/blog/wp-content/uploads/2009/07/imagem1.png" alt="imagem1" width="829" height="273" /><br /><br /><strong>Tivemos uma falha</strong>. Traduzindo a mensagem de forma prática:<br /><br /><em>O seu teste testSomeDoisNumerosInteiros, do caso de teste TestOfCalculadora, falhou porque NULL (que foi retornado pela chamada ao nosso método soma) não é igual a 2 (que seria nossa resposta esperada).</em><br /><br />A resposta para isso é que ainda nem implementamos nosso método soma. Mas vejamos que nesse ponto já sabemos exatamente como deve ser comportar nosso método para o funcionamento com dois números. <img src='http://leohackin.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <br /><br />Vamos implementar nossa classe então:<br /><br /><pre class="devcodeblock" title="PHP"><table class="devcodetools"><tbody><tr><td>&nbsp;PHP&nbsp;|&nbsp;</td><td style="background-image:url('http://leohackin.com.br/blog/wp-content/plugins/devformatter/img/devformatter-copy.png');background-repeat:no-repeat;background-position:50% 50%;width:16px;height:16px;"/><embed id="ZeroClipboard12" src="http://leohackin.com.br/blog/wp-content/plugins/devformatter/_zclipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16px" height="16px" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=12&width=16&height=16" wmode="transparent" /></td><td>&nbsp;copy&nbsp;code&nbsp;|</td><td style="cursor:pointer" title="DevFormatter Plugin" onclick="devfmt_credits()">?</td><td width="99%">&nbsp;</td></tr></tbody></table><div class="devcodeoverflow"><table class="devcodearea" width="100%"><tr><td class="devcodelines" width="1%">1</td><td class="devcodelinesarea"><pre class="devcode devcodeline"> <span style="color: #000000; font-weight: bold;">class</span> Calculadora <span style="color: #009900;">&#123;</span>	</pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">2</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline">    <span style="color: #000000; font-weight: bold;">function</span> soma<span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span><span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></pre></td></tr><tr><td class="devcodelines" width="1%">3</td><td class="devcodelinesarea"><pre class="devcode devcodeline">        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$b</span><span style="color: #339933;">;</span></pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">4</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline">    <span style="color: #009900;">&#125;</span></pre></td></tr><tr><td class="devcodelines" width="1%">5</td><td class="devcodelinesarea"><pre class="devcode devcodeline"> <span style="color: #009900;">&#125;</span></pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">6</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline"></pre></td></tr></table></div></pre>
<br />Com nosso método agora implementado, vamos executar nosso caso de teste denovo.<br /><br /><img class="alignnone size-full wp-image-150" title="imagem2" src="http://leohackin.com.br/blog/wp-content/uploads/2009/07/imagem2.png" alt="imagem2" width="497" height="245" /><br /><br /><strong>Agora sim!</strong> Temos um caso de teste funcional que testa uma classe implementada. Parabéns por chegar até aqui.<br /><br />Nesse ponto, já temos conhecimento suficiente para escrever vários casos de teste para nossas classes<strong>. Um caso de teste pode conter vários testes diferentes: cada teste é feito através de um método da classe do caso de teste.</strong><br /><br />Revisando aquelas possibilidades de cenário que poderiam "quebrar" nossa calculadora, já testamos se a soma está correta. Agora, podemos testar as possibilidades que podem gerar um erro na calculadora.<br /><br />Uma delas é se passarmos letras no lugar de números: haviamos combinado que nessa situação, devolveriamos falso para o resultado, correto ? Então, vamos escrever o teste: vamos chama-lo de "<em><span style="text-decoration: underline;">testSomaNaoNumeros</span></em>":<br /><br /><pre class="devcodeblock" title="PHP"><table class="devcodetools"><tbody><tr><td>&nbsp;PHP&nbsp;|&nbsp;</td><td style="background-image:url('http://leohackin.com.br/blog/wp-content/plugins/devformatter/img/devformatter-copy.png');background-repeat:no-repeat;background-position:50% 50%;width:16px;height:16px;"/><embed id="ZeroClipboard13" src="http://leohackin.com.br/blog/wp-content/plugins/devformatter/_zclipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16px" height="16px" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=13&width=16&height=16" wmode="transparent" /></td><td>&nbsp;copy&nbsp;code&nbsp;|</td><td style="cursor:pointer" title="DevFormatter Plugin" onclick="devfmt_credits()">?</td><td width="99%">&nbsp;</td></tr></tbody></table><div class="devcodeoverflow"><table class="devcodearea" width="100%"><tr><td class="devcodelines" width="1%">1</td><td class="devcodelinesarea"><pre class="devcode devcodeline"><span style="color: #000000; font-weight: bold;">function</span> testSomaNaoNumeros<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> </pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">2</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline">        <span style="color: #000088;">$calculadora</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Calculadora<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> </pre></td></tr><tr><td class="devcodelines" width="1%">3</td><td class="devcodelinesarea"><pre class="devcode devcodeline">        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assertEqual</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$calculadora</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">soma</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'A'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">4</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline"><span style="color: #009900;">&#125;</span></pre></td></tr></table></div></pre>
<br />Adicionamos essa função à nossa classe. Rodamos nosso teste novamente e ...<br /><br /><img class="alignnone size-full wp-image-151" title="imagem3" src="http://leohackin.com.br/blog/wp-content/uploads/2009/07/imagem3.png" alt="imagem3" width="860" height="284" /><br /><br /><strong>Previsivelmente</strong>, temos um erro pois nosso método soma ainda não verifica se os parâmetros recebidos são números válidos. Ai você irá pensar:<br /><br /><em><span style="text-decoration: underline;">Mas eu vou escrevendo os testes e vou implementando toda a minha lógica de negócio ao mesmo tempo ?</span></em><br /><br />A TDD tem uma característica bacana, que anda de mãos dados ao <strong><a href="http://www.agence.com.br/refactoring-engenharia-de-software.php" target="_blank">refactoring</a></strong>: a TDD nos diz que devemos SIM escrever os testes primeiro e fazer as classes "passarem no teste" usando o mínimo de código possível: se a lógica for complexa, retorne uma resposta "hardcode" para "enganar" o teste e depois faça o refactory do código.<br /><br />O refactory deve ser feito apenas depois de todos os testes serem feitos, pois nesse ponto você terá certeza de como o funcionamnento de sua classe atenderá a todos as respostas que são requisitadas nos testes como "corretos".<br /><br />Pensando nisso, vamos fazer nosso método soma "passar" no teste:<br /><br /><pre class="devcodeblock" title="PHP"><table class="devcodetools"><tbody><tr><td>&nbsp;PHP&nbsp;|&nbsp;</td><td style="background-image:url('http://leohackin.com.br/blog/wp-content/plugins/devformatter/img/devformatter-copy.png');background-repeat:no-repeat;background-position:50% 50%;width:16px;height:16px;"/><embed id="ZeroClipboard14" src="http://leohackin.com.br/blog/wp-content/plugins/devformatter/_zclipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16px" height="16px" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=14&width=16&height=16" wmode="transparent" /></td><td>&nbsp;copy&nbsp;code&nbsp;|</td><td style="cursor:pointer" title="DevFormatter Plugin" onclick="devfmt_credits()">?</td><td width="99%">&nbsp;</td></tr></tbody></table><div class="devcodeoverflow"><table class="devcodearea" width="100%"><tr><td class="devcodelines" width="1%">1</td><td class="devcodelinesarea"><pre class="devcode devcodeline"><span style="color: #000000; font-weight: bold;">class</span> Calculadora <span style="color: #009900;">&#123;</span>		</pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">2</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline">    <span style="color: #000000; font-weight: bold;">function</span> soma<span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span><span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></pre></td></tr><tr><td class="devcodelines" width="1%">3</td><td class="devcodelinesarea"><pre class="devcode devcodeline">        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">is_int</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">is_int</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span></pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">4</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline">            <span style="color: #b1b100;">return</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$b</span><span style="color: #339933;">;</span></pre></td></tr><tr><td class="devcodelines" width="1%">5</td><td class="devcodelinesarea"><pre class="devcode devcodeline">        <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span></pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">6</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline">            <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">false</span><span style="color: #339933;">;</span></pre></td></tr><tr><td class="devcodelines" width="1%">7</td><td class="devcodelinesarea"><pre class="devcode devcodeline">        <span style="color: #009900;">&#125;</span></pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">8</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline">    <span style="color: #009900;">&#125;</span>	</pre></td></tr><tr><td class="devcodelines" width="1%">9</td><td class="devcodelinesarea"><pre class="devcode devcodeline"><span style="color: #009900;">&#125;</span></pre></td></tr></table></div></pre>
<br />Agora, vamos rodar nosso teste.<br /><br /><img class="alignnone size-full wp-image-152" style="border: 1px solid black;" title="imagem4" src="http://leohackin.com.br/blog/wp-content/uploads/2009/07/imagem4.png" alt="imagem4" width="497" height="253" /><br /><br /><strong>Blz!</strong> Nosso teste passou, mas testamos apenas se os valores são inteiros e se forem, efetuamos a soma. Se não forem, a gente retorna false, como nosso teste pediu. Podemos depois refatorar isso: verificar se o valor é uma string com um número dentro e por ai vai.<br /><h2>Finalizando</h2>
Você pode estar se perguntando: <em>"Uai, mas podemos ter muito mais ocasiões que podem quebrar a soma! Podemos também extender algumas funcionalidades e exibir mensagens de erro".</em><br /><br />Tivemos uma amostra do que é o SimpleTest em seu cenário mais simples: apesar do tamanho do post, o conceito e a aplicação são bem simples como puderam ver.<br /><br />Além do assetEqual, a SimpleTest tem um <a href="http://www.simpletest.org/en/unit_test_documentation.html" target="_blank">set de ações enorme de validações</a>, além de recursos mais avançados, como suites, mocks e web tests que veremos em breve.<br /><br />Crie outras classes, pense nos testes, escreva seus casos de teste e vá executando: com a prática isso vai ficar tão automático que o ganho com a diminuição dos testes e bugs no final da aplicação vão ser notórios.<br /><br /><strong>Testes nos tornam programadores melhores. <span style="text-decoration: underline;">Pense nisso.</span></strong><br /><br />Algumas coisas para se pensar quando começar a abordar isso:
<ul><br />	<li> Não precisamos escrever TODOS os testes: é completamente normal se esquecermos algo ou houver alguma necessidade de mudança de negócio do cliente que nos fará escrever novos testes ou re-escrever os existentes. Tenha em mente que o TDD é para ajudar e não para ser mais uma fase carrancuda e intransponível no desenvolvimento;</li>
	<li>A análise para chegar aos casos de teste faz bem ao início do projeto: com essa abordagem, você pode fazer perguntas ao cliente (e ele a você) sobre algumas coisas que possívelmente só apareceriam no final do projeto gerando assim muito re-trabalho;</li>
</ul>
Bom, por enquanto é isso pessoal. No próximo post falaremos um pouco sobre agrupamentos de teste e partir para um exemplo mais complexo. <img src='http://leohackin.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <br /><br />Espero que tenham gostado do post.<br /><br />Simbora! <img src='http://leohackin.com.br/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> <p><map name='google_ad_map_119_124865e6ea244bb0'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/119?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_119_124865e6ea244bb0' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=119&amp;url= http%3A%2F%2Fleohackin.com.br%2Fblog%2F2009%2F07%2Finiciando-com-o-simpletest%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://leohackin.com.br/blog/2009/07/iniciando-com-o-simpletest/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>1º Curso Oficial de Scrum Master do ES</title>
		<link>http://leohackin.com.br/blog/2009/06/1%c2%ba-curso-oficial-de-scrum-master-do-es/</link>
		<comments>http://leohackin.com.br/blog/2009/06/1%c2%ba-curso-oficial-de-scrum-master-do-es/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 16:57:24 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[cursos]]></category>
		<category><![CDATA[giran]]></category>
		<category><![CDATA[curso]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://leohackin.com.br/blog/?p=115</guid>
		<description><![CDATA[Que rufem os tambores: é com imenso prazer que anuncio que a Giran está trazendo para o estado o 1º Curso Oficial de Scrum Master (CSM) para terras capixabas. Fruto da parceria entre a Giran e Caelum, nossa parceira em cursos Java, vai ser uma puta oportunidade para todos que quiserem ter esse belo upgrade no [...]]]></description>
			<content:encoded><![CDATA[Que rufem os tambores: é com imenso prazer que anuncio que a <a href="http://www.giran.com.br" target="_blank">Giran</a> está trazendo para o estado o <strong>1º Curso Oficial de Scrum Master (CSM)</strong> para terras capixabas. Fruto da parceria entre a Giran e <a href="http://www.caelum.com.br" target="_blank">Caelum</a>, nossa parceira em cursos Java, vai ser uma puta oportunidade para todos que quiserem ter esse belo upgrade no currículo.<br /><br />As inscrições já estão abertas e o <strong>curso será ministrado em setembro, dependendo do número de inscritos atingir a quantidade mínima</strong>. Ele será ministrado num lugar compatível com o número de inscritos e tem uma<strong> duração de 16 horas</strong>.<br /><br />O curso inédito <strong>será ministrado pelo instrutor Alexandre Magno</strong>, da <a href="http://www.adaptworks.com.br/" target="_blank">AdaptWorks</a>, <strong>único instrutor certificado pela <a href="http://www.scrumalliance.org/" target="_blank">Scrum Alliance</a> no Brasil</strong>. O curso é um sucesso no Brasil inteiro e altamente requisitado em vários estados, tanto pelo fato de ser um <strong>curso oficial</strong> quanto por ser a porta de abertura para quem deseja não apenas conhecer mas também se certificar nessa metodologia ágil.<br /><br /><strong>Sim!</strong> O participante ganha <strong>ao final do curso um certificado de Scrum Master</strong>, que é o início para ir se especializando na metodologia e ir tentando as certificações mais avançadas junto à Scrum Alliance.<br /><br />Para garantir sua vaga, envie um e-mail para contato@giran.com.br com seus dados de contato. Entraremos em contato para informar sobre o curso, preço, modos de pagamento e afins.<br /><br />Mais detalhes sobre o curso, em breve no blog da Giran (<a href="http://blog.giran.com.br" target="_blank">http://blog.giran.com.br</a>).<br /><br />Simbora.<p><map name='google_ad_map_115_124865e6ea244bb0'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/115?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_115_124865e6ea244bb0' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=115&amp;url= http%3A%2F%2Fleohackin.com.br%2Fblog%2F2009%2F06%2F1%25c2%25ba-curso-oficial-de-scrum-master-do-es%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://leohackin.com.br/blog/2009/06/1%c2%ba-curso-oficial-de-scrum-master-do-es/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dica de chave do model no CakePHP</title>
		<link>http://leohackin.com.br/blog/2009/06/dicas-de-chave-do-model-no-cakephp/</link>
		<comments>http://leohackin.com.br/blog/2009/06/dicas-de-chave-do-model-no-cakephp/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 00:14:21 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[dica]]></category>

		<guid isPermaLink="false">http://leohackin.com.br/blog/?p=108</guid>
		<description><![CDATA[Estava rascunhando algumas coisas e fazendo umas melhorias num sistema na Giran, quando lembrei de duas perguntas que haviam sido feitas no 1º Workshop PHP-ES sobre CakePHP.Aproveitando que lembrei delas mas não tinha a resposta na ponta da língua, ai vai uma dica sobre chaves primárias para ser feita no model de sua app. Isso [...]]]></description>
			<content:encoded><![CDATA[Estava rascunhando algumas coisas e fazendo umas melhorias num sistema na <a href="http://www.giran.com.br" target="_blank">Giran</a>, quando lembrei de duas perguntas que haviam sido feitas no 1º Workshop PHP-ES sobre <a href="http://cakephp.org" target="_blank">CakePHP</a>.<br /><br />Aproveitando que lembrei delas mas não tinha a resposta na ponta da língua, ai vai uma dica sobre chaves primárias para ser feita no model de sua app. Isso está explicito no Cookbook, mas não muito à mão para quem está começando ou nos bilhares de screencasts existentes. <img src='http://leohackin.com.br/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> <br /><br /><strong>Modificando a chave primária ID</strong><br /><br />Se você está portando uma base de dados que já exista e que não segue a nomenclatura padrão do CakePHP, onde a chave primária da tabela é sempre chamada por <strong>id</strong>, utilize o atributo <strong>primaryKey</strong> do seu model para usar outro campo.<br /><pre class="devcodeblock" title="PHP"><table class="devcodetools"><tbody><tr><td>&nbsp;PHP&nbsp;|&nbsp;</td><td style="background-image:url('http://leohackin.com.br/blog/wp-content/plugins/devformatter/img/devformatter-copy.png');background-repeat:no-repeat;background-position:50% 50%;width:16px;height:16px;"/><embed id="ZeroClipboard16" src="http://leohackin.com.br/blog/wp-content/plugins/devformatter/_zclipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16px" height="16px" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=16&width=16&height=16" wmode="transparent" /></td><td>&nbsp;copy&nbsp;code&nbsp;|</td><td style="cursor:pointer" title="DevFormatter Plugin" onclick="devfmt_credits()">?</td><td width="99%">&nbsp;</td></tr></tbody></table><div class="devcodeoverflow"><table class="devcodearea" width="100%"><tr><td class="devcodelines" width="1%">1</td><td class="devcodelinesarea"><pre class="devcode devcodeline"><span style="color: #000000; font-weight: bold;">class</span> Cliente <span style="color: #000000; font-weight: bold;">extends</span> AppModel <span style="color: #009900;">&#123;</span></pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">2</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline">&nbsp;</pre></td></tr><tr><td class="devcodelines" width="1%">3</td><td class="devcodelinesarea"><pre class="devcode devcodeline"><span style="color: #000000; font-weight: bold;">var</span> primaryKey <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;CdCliente&quot;</span><span style="color: #339933;">;</span></pre></td></tr><tr><td class="devcodelines devcodelinesodd" width="1%">4</td><td class="devcodelinesarea devcodelinesareaodd"><pre class="devcode devcodeline">&nbsp;</pre></td></tr><tr><td class="devcodelines" width="1%">5</td><td class="devcodelinesarea"><pre class="devcode devcodeline"><span style="color: #009900;">&#125;</span></pre></td></tr></table></div></pre><p><map name='google_ad_map_108_124865e6ea244bb0'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/108?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_108_124865e6ea244bb0' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=108&amp;url= http%3A%2F%2Fleohackin.com.br%2Fblog%2F2009%2F06%2Fdicas-de-chave-do-model-no-cakephp%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://leohackin.com.br/blog/2009/06/dicas-de-chave-do-model-no-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zonas de Convergência nos Games</title>
		<link>http://leohackin.com.br/blog/2009/06/zonas-de-convergencia-nos-games/</link>
		<comments>http://leohackin.com.br/blog/2009/06/zonas-de-convergencia-nos-games/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 15:05:13 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[Confabulações]]></category>
		<category><![CDATA[Sociedade]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[convergencia]]></category>
		<category><![CDATA[projectnatal]]></category>
		<category><![CDATA[ps3]]></category>
		<category><![CDATA[revolucao]]></category>
		<category><![CDATA[videogame]]></category>
		<category><![CDATA[wii]]></category>
		<category><![CDATA[xbox]]></category>

		<guid isPermaLink="false">http://leohackin.com.br/blog/?p=103</guid>
		<description><![CDATA[
Essa semana o mundo geek da tecnologia parou para conferir a E3 2009, a maior feira de entretenimento eletrônico do planeta. A feira é a oportunidade perfeita para as empresas lançarem produtos, tirarem onda e principalmente mostrarem o que está por vir.Claro que como nerd/geek tarado por video games (um dia ainda vou ganhar grana [...]]]></description>
			<content:encoded><![CDATA[<!--StartFragment-->
<p class="MsoNormal">Essa semana o mundo geek da tecnologia parou para conferir a <a href="http://www.e3expo.com/" target="_blank">E3 2009</a>, a maior feira de entretenimento eletrônico do planeta. A feira é a oportunidade perfeita para as empresas lançarem produtos, tirarem onda e principalmente mostrarem o que está por vir.</p><p class="MsoNormal"><span lang="EN-US">Claro que como nerd/geek tarado por video games (um dia ainda vou ganhar grana com isso) eu pirei com todos os jogos e tecnologias que estão por vir. Mas nada se compara a </span><span lang="EN-US"><strong>extremamente grata surpresa</strong></span><span lang="EN-US"> proposta pela (cof,cof) Micro$oft.</span></p><p class="MsoNormal"><span lang="EN-US">Sim, a Micro$oft: na época que todo mundo duvidava dela quando o Xbox chegou pra bater de frente com consoles como o PS2, eles botaram pra quebrar com o XBOX 360. O fato dele ter sido “destravado” primeiro foi um impulso e tanto aqui no Brasil, movido pela pirataria, pra todo mundo compra-lo: o PS3, quem diria, perdeu espaço pra ele e pro Nintendo Wii.</span></p><p class="MsoNormal"><span lang="EN-US">A Nintendo, depois de amargar uma “menopausa tecnológica”, emplacou o Nintendo Wii, com um detalhe ignorado num mundo por tempos regido mais pelo processamento do videogame do que suas formas de iteração: a forma de controle do jogo.</span></p><p class="MsoNormal"><span lang="EN-US">Sem um controle de duzentos botões como seus concorrentes, impeditivo e carrancudo para muitos &#8220;mortais&#8221;, o </span><span lang="EN-US"><strong>Nintendo Wii primou pela simplicidade em seu controle</strong></span><span lang="EN-US">, mas de uma forma inusitada: o</span><span lang="EN-US"><strong> controle com quase nenhum botão mas com uma forma de iteração por movimento que revolucionou o mundo do video game</strong></span><span lang="EN-US">.</span></p><p class="MsoNormal"><span lang="EN-US">Quem já teve uma experiência num Wii pode dizer que não existe nada igual. A liberdade é impressionante e a forma de iteração com os jogos um trunfo: foi a volta dos jogos simples pra família inteira jogar, sem se preocupar com aquela monstruosidade de botões. Hoje, até o papai e a mamãe podem jogar finalmente, como nos bons tempos do Atari.</span><span lang="EN-US"><strong> O video game enfim voltou a ser uma &#8220;diversão família&#8221; novamente</strong></span><span lang="EN-US">.</span></p><p class="MsoNormal"><span lang="EN-US">Isso era impressionante até a E3 2009, quando a M$ apresentou o </span><span lang="EN-US"><a href="http://www.xbox.com/en-US/live/projectnatal/" target="_blank">Project Natal</a></span><span lang="EN-US">: uma forma de iteração que não usará nem controles físicos, nem botões. </span><span lang="EN-US"><strong>O Project Natal vai permitir a iteração pura e simplesmente por captação de movimentos e voz! oO</strong></span></p>

<p class="MsoNormal"><object width="560" height="340" data="http://www.youtube.com/v/I9tmr8VDqN8&amp;hl=pt-br&amp;fs=1&amp;" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/I9tmr8VDqN8&amp;hl=pt-br&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /></object>
<p class="MsoNormal"><span lang="EN-US">Confesso que havia MUITO tempo que não ficava abismado com algo: desde os tempos do primeiro iPhone, do Ubiquity, do Google Earth e do próprio Wii, eu não sentia aquela sensação que dá vontade de falar </span><span lang="EN-US"><strong>“Puta queo pareo!”</strong></span><span lang="EN-US">.</span></p><p class="MsoNormal"><span lang="EN-US">O projeto se baseia em camêras, sensores e um microfone para que a pessoa possa iteragir com o game. Game ??? </span><span lang="EN-US"><strong>Agora cheguei ao ponto que queria chegar.</strong></span></p><p class="MsoNormal"><span lang="EN-US">Que os video games estão aos poucos se tornando portas viáveis para os mais diversos tipos de aplicação ja é notório: os jogos educativos foram o início dessa revolução, mas hoje com o advento das conexões de banda larga em praticamente todos os video games, as atualizações e customizações das característica dos games, como novos personagens, fases, músicas e afins, deram um poder INFINITO de extensão dos jogos.</span></p><p class="MsoNormal"><strong>E-learnin</strong>g aplicado à tantas áreas que não conseguiria enumerar aqui, <strong>RPGs com cunho educativo</strong>, <strong>MMORPGs sociais</strong> com &#8220;quests&#8221; do tipo &#8220;Estude isso, faça a prova para ganhar tal coisa&#8221;. É tanta coisa que passa na minha cabeça que eu poderia ficar aqui por dias digitando.</p><p class="MsoNormal">Com o Project Natal extrapolamos a simulação imperfeita das ações do jogo, baseado em botões e direcionais, para uma simulação muito mais perfeita. O chute na bola vai ser mecânico e corporal, diferente da combinação de botões+direcional ou mesmo situações fisicamente irreais.</p>

<p class="MsoNormal"><object width="560" height="340" data="http://www.youtube.com/v/mGBOv4wsddo&amp;hl=pt-br&amp;fs=1&amp;" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/mGBOv4wsddo&amp;hl=pt-br&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /></object>
<p class="MsoNormal">Agora imaginem só as seguintes situações:</p>

<ul><br />	<li>Você jogando um RPG ou jogo de tiro de primeira pessoa, onde você pode olhar para qualquer direção, trocar de arma movendo os braços, atirar mirando na pessoa que quiser &#8230;</li>
	<li>Um RPG onde você ao inves de clicar num NPC (aquela galera que você conversa para saber informações no jogo), dizer perto dele &#8220;Ei, posso falar com você?&#8221; e ele lhe responder prontamente. Mais que isso, um RPG inteligente que ao invés de lhe dar informações já pre-definidas, possa responder mais &#8220;humanamente&#8221; a uma pergunta qualquer, mesmo que sem sentido;</li>
	<li>Um jogo de xadrez onde vc move as peças do seu sofá;</li>
	<li>Jogos de aeróbica e exercícios físicos;</li>
	<li>Um Guitar Hero onde você toca Air Guitar e ainda por cima ele conta como nota o quanto você &#8220;agitou e quebrou tudo no palco&#8221;. Ohhh Yeah;</li>
	<li>Jogos infantis onde a criança vai iteragir com os personagens para aprender coisas falando com os personagens: o personagem pergunta &#8220;Ei Fulano, quando é dois mais dois?&#8221; &#8230; &#8220;Isso! Você acertou&#8221;. Esqueçam as cartilhas;</li>
</ul>
<strong>Será que estamos às portas de uma revolução não apenas dos video games e do entretenimento eletrônico, mas de uma revolução na forma da distribuição de conhecimento por uma mídia tão potencialmente multi-facetada como a dos video games ?</strong><br /><br />Eu estou pagando pra ver! <img src='http://leohackin.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <br /><br /><!--EndFragment--><p><map name='google_ad_map_103_124865e6ea244bb0'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/103?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_103_124865e6ea244bb0' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=103&amp;url= http%3A%2F%2Fleohackin.com.br%2Fblog%2F2009%2F06%2Fzonas-de-convergencia-nos-games%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://leohackin.com.br/blog/2009/06/zonas-de-convergencia-nos-games/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Back to Earth!</title>
		<link>http://leohackin.com.br/blog/2009/06/back-to-earth/</link>
		<comments>http://leohackin.com.br/blog/2009/06/back-to-earth/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 22:35:39 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[Pessoal]]></category>

		<guid isPermaLink="false">http://leohackin.com.br/blog/?p=98</guid>
		<description><![CDATA[Salve pessoal,Quanto tempo eu não voltava por aqui. As coisas andam corridas pra caramba: abertura e correria inicial da Giran, mudança pra um AP novo, organização do workshop PHP-ES, viagem ao Falando em Java 2009, abandono de alguns sonhos e adoção de outros. Justifico aqui a sumida master do blog e peço desculpas aos que [...]]]></description>
			<content:encoded><![CDATA[<img class="alignright size-full wp-image-100" title="minha_mesa" src="http://leohackin.com.br/blog/wp-content/uploads/2009/06/minha_mesa.jpg" alt="minha_mesa" width="280" height="210" />Salve pessoal,<br /><br />Quanto tempo eu não voltava por aqui. As coisas andam corridas pra caramba: abertura e correria inicial da Giran, mudança pra um AP novo, organização do workshop PHP-ES, viagem ao Falando em Java 2009, abandono de alguns sonhos e adoção de outros. Justifico aqui a sumida master do blog e peço desculpas aos que acompanham algo de útil por aqui.<br /><br />Mas foi tudo por uma ótima causa e eu acho que sobrevivi. E claro que estava com saudades de tudo por aqui. Estou com umas duas páginas de idéias de posts pra escrever e acho que essa próxima semana vai ser re-início de uma época que o blog era referência devido às idéias discutidas: mais que apenas técnico, o blog já foi e sempre será ideológico, seja isso um agregador ou não de idéias. =)<br /><br />Não posso deixar de agradecer especialmente ao grande Jeve, Ana, Coradin, GB, Felipete, Keilinha e minha família por toda luz, alegria e compreensão até aqui: essa nova fase da minha vida tem sido muito bacana e espero sempre poder compartilhar com vocês o que tiver de melhor. Vocês hoje são minha GRANDE família e vocês (espero) sabem disso.<br /><br />A Giran foi um sonho de longa data que felizmente nasceu com uma das pessoas que mais considero na vida: Jeve, você é o cara. (Carneirin, fica ciume não rapá).<br /><br />Meus alôs pro pessoal do CEJUG, pro Rafael Carneirin, Loiane, Léo França, Paulin Rodrigues, Léo &#8220;Nariz/Jesus&#8221; Zamprogno, Marcelo &#8220;Robs&#8221; Aquino, Cabralito (meu nego),  Almir M3nd3s, Reinaldo JuniorZ, Gersão, família Evictus, galera Metal e por ai vai.<br /><br />Vocês todos, meu muito obrigado pela existência: sem vocês, decididamente a vida teria bem menos motivos pra rir continuamente.<br /><br />Simbora!!!!!!<p><map name='google_ad_map_98_124865e6ea244bb0'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/98?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_98_124865e6ea244bb0' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=98&amp;url= http%3A%2F%2Fleohackin.com.br%2Fblog%2F2009%2F06%2Fback-to-earth%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://leohackin.com.br/blog/2009/06/back-to-earth/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Convite 1º Workshop PHP-ES</title>
		<link>http://leohackin.com.br/blog/2009/05/convite-1%c2%ba-workshop-php-es/</link>
		<comments>http://leohackin.com.br/blog/2009/05/convite-1%c2%ba-workshop-php-es/#comments</comments>
		<pubDate>Thu, 14 May 2009 14:28:35 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[espiritosanto]]></category>
		<category><![CDATA[phpes]]></category>

		<guid isPermaLink="false">http://leohackin.com.br/blog/?p=94</guid>
		<description><![CDATA[É com muita alegria que a comunidade PHP do Espírito Santo &#8211; PHP-ES &#8211; convida a toda a comunidade capixaba de desenvolvedores, gerentes de TI, estudantes, curiosos e a quem interessar para participar do 1º Workshop PHP-ES.O Workshop PHP-ES é um evento regional totalmente dedicado à divulgação e disseminação da linguagem de programação PHP no [...]]]></description>
			<content:encoded><![CDATA[É com muita alegria que a comunidade <a href="http://www.php-espiritosanto.com.br/" target="_blank">PHP do Espírito Santo &#8211; PHP-ES</a> &#8211; convida a toda a comunidade capixaba de desenvolvedores, gerentes de TI, estudantes, curiosos e a quem interessar para participar do <a href="http://www.php-espiritosanto.com.br/wp/eventos/workshop-php-es/" target="_blank">1º Workshop PHP-ES</a>.<br /><br />O Workshop PHP-ES é um evento regional totalmente dedicado à divulgação e disseminação da linguagem de programação <a href="http://www.php.net/" target="_blank">PHP</a> no ES. O evento acontece pela primeira vez, fruto da vontade dos usuários de grupo de PHP?ES em ter um evento exclusivo sobre PHP, afim de promover o interesse regional pela linguagem.<br /><br />O Workshop PHP-ES será realizado no dia 30/05/2009, sábado, no período de 13h até as 18h no Anfiteatro da <a href="http://www.uvv.br/" target="_blank">UVV &#8211; Centro Universitário de Vila Velha</a> &#8211; Campus Boa Vista.
<div><br /><br />As inscrições são <strong>GRATUITAS</strong> e <strong>OBRIGATÓRIAS,</strong> pois o número de vagas é limitado, e dão direito ao recebimento do certificado de participação e aos SORTEIOS de vários brindes. Convocamos todos os participantes a trazerem <strong>1kg de alimento não-perecível</strong> que será doado a uma instituição.</div><div>Segue a grade do evento:<br /><br />13:00h &#8211; 13:40h &#8211; Credenciamento<br />13:40h &#8211; 13:50h &#8211; Abertura<br />13:50h &#8211; 14:50h &#8211; Nadando em Dinheiro com AJAX e jQuery [Reinaldo de Souza "JuniorZ"]<br />15:00h &#8211; 16:00h &#8211; Desenvolvimento ágil com Smarty [Gerson Novais]<br />16:00h &#8211; 16:30h &#8211; Intervalo<br />16:30h &#8211; 17:30h &#8211; CakePHP [Leonardo "Hackin" Freire]<br />17:30h &#8211; Fechamento</div><div>Patrocínio: <a href="http://www.spiritlinux.com.br/" target="_blank">Spirit Linux Professional Linux Services</a> e <a href="http://www.giran.com.br/" target="_blank">Giran Soluções e Ensino</a><br />Apoio: <a href="http://www.uvv.br/cursos/info_curso.asp?id=5&amp;tpcurso=1" target="_blank">Cursos de Ciência da Computação</a> e <a href="http://www.uvv.br/cursos/info_curso.asp?id=14&amp;tpcurso=1" target="_blank">Sistemas de Informação</a> da UVV , <a href="http://www.gbcreative.com.br" target="_blank">GB Creative &#8211; Design, Publicidade e Propaganda</a></div><div></div><div><strong>Informações e inscrições podem ser feitas em: <a href="http://www.php-espiritosanto.com.br/" target="_blank">http://www.php-espiritosanto.com.br/</a></strong></div>
Equipe organizadora do Workshop PHP-ES<p><map name='google_ad_map_94_124865e6ea244bb0'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/94?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_94_124865e6ea244bb0' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=94&amp;url= http%3A%2F%2Fleohackin.com.br%2Fblog%2F2009%2F05%2Fconvite-1%25c2%25ba-workshop-php-es%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://leohackin.com.br/blog/2009/05/convite-1%c2%ba-workshop-php-es/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Falando em Java 2009: Hey, ho, LET’s GO !!!</title>
		<link>http://leohackin.com.br/blog/2009/05/falando-em-java-2009-hey-ho-lets-go/</link>
		<comments>http://leohackin.com.br/blog/2009/05/falando-em-java-2009-hey-ho-lets-go/#comments</comments>
		<pubDate>Fri, 08 May 2009 15:46:27 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Pessoal]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[falandoemjava]]></category>

		<guid isPermaLink="false">http://leohackin.com.br/blog/?p=91</guid>
		<description><![CDATA[Ohh yeah! Dia 22 desse mês, estou zarpando para o Falando em Java 2009 com meu amigo-sócio-brother-conselheiro-espiritual Paulo Jeveaux. É o primeiro evento de muitos que a Giran Soluções e Ensino vai proporcionar/patrocinar aos seus colaboradores.O evento, que chega à sua terceira edição, é organizado pela Caelum e esse ano vai acontecer no domingo, dia [...]]]></description>
			<content:encoded><![CDATA[<img class="alignright size-full wp-image-92" title="logo_fj2009" src="http://leohackin.com.br/blog/wp-content/uploads/2009/05/logo_fj2009.jpg" alt="logo_fj2009" width="249" height="127" />Ohh yeah! Dia 22 desse mês, estou zarpando para o <a title="Site oficial do Falando em Java" href="http://www.caelum.com.br/falando-em-java/" target="_blank">Falando em Java 2009</a> com meu amigo-sócio-brother-conselheiro-espiritual <a href="http://www.jeveaux.com/blog/2009/falando-em-java-2009-eu-vou/" target="_blank">Paulo Jeveaux</a>. É o primeiro evento de muitos que a <a title="Site da Giran Soluções e Ensino" href="http://www.giran.com.br" target="_blank">Giran Soluções e Ensino</a> vai proporcionar/patrocinar aos seus colaboradores.<br /><br />O evento, que chega à sua terceira edição, é organizado pela <a title="Site da Caelum" href="http://www.caelum.com.br/" target="_blank">Caelum</a> e esse ano vai acontecer no domingo, dia 24 de maio, no Espaço Hakka em Sampa. No site do evento estão todas as informações necessárias para quem vive em Sampa ou é de outros estados, como a gente e uma penca de nego que vai de tudo quanto é canto.<br /><br />Oportunidade única pra bater papo e fazer aquele networking com gente bacana, interada, twitters e um monte de gente que só conheço via MSN/Twitter.  Vamos antes pra &#8220;bater perna&#8221; um pouco pela grande São Paulo e fazer AQUELE happy hourzin em terras paulistanas.<br /><br /><strong>Simbora! <img src='http://leohackin.com.br/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </strong><p><map name='google_ad_map_91_124865e6ea244bb0'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/91?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_91_124865e6ea244bb0' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=91&amp;url= http%3A%2F%2Fleohackin.com.br%2Fblog%2F2009%2F05%2Ffalando-em-java-2009-hey-ho-lets-go%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://leohackin.com.br/blog/2009/05/falando-em-java-2009-hey-ho-lets-go/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>1º Workshop PHP-ES</title>
		<link>http://leohackin.com.br/blog/2009/04/1%c2%ba-workshop-php-es/</link>
		<comments>http://leohackin.com.br/blog/2009/04/1%c2%ba-workshop-php-es/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 00:49:37 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[Ahn?]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[evento]]></category>
		<category><![CDATA[phpes]]></category>

		<guid isPermaLink="false">http://leohackin.com.br/blog/?p=85</guid>
		<description><![CDATA[Salve pessoal,É com prazer que informo as primeiras informações sobre o 1º encontro do grupo de usuários PHP do Espírito Santo, vulgo 1º Workshop PHP-ES. Esse evento vem sendo idealizado a algum tempo pela galera do grupo e finalmente saiu do papel graças ao empenho de todos (em especial do amigo Almir M3nd3s), com N [...]]]></description>
			<content:encoded><![CDATA[<img class="alignright size-full wp-image-88" title="homepage" src="http://leohackin.com.br/blog/wp-content/uploads/2009/04/homepage.jpg" alt="homepage" width="205" height="136" />Salve pessoal,<br /><br />É com prazer que informo as primeiras informações sobre o 1º encontro do grupo de usuários PHP do Espírito Santo, vulgo <strong>1º Workshop PHP-ES</strong>. Esse evento vem sendo idealizado a algum tempo pela galera do grupo e finalmente saiu do papel graças ao empenho de todos (em especial do amigo Almir M3nd3s), com N threads no grupo de discussão e por ai vai.<br /><br /><span id="more-85"></span><br /><br />O evento será realizado no dia <strong>30 de maio, no Anfiteatro da UVV, a partir das 13:00</strong>. Isso vai cair num <strong>sábado</strong> e vai ser bem tranquilo. O <strong>ingresso será 1 Kg de alimento não perecível</strong>, que será doado para uma instituição de caridade que já está quase definida.<br /><br />A idéia inicial do evento é apresentar algumas palestras relacionadas ao PHP e tecnologias de entorno, como por exemplo o jQuery, que faz parte do desenvolvimento web e está fortemente relacionada ao nosso mundo PHP. <img src='http://leohackin.com.br/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> <br /><br />Com base nesse pensamento, vão haver três palestras bem legais. Para simplificar, segue a programação prevista:<br /><br />13:00h &#8211; 13:40h &#8211; Credenciamento<br />13:40h &#8211; 13:50h &#8211; Abertura<br />13:50h &#8211; 14:50h - <a href="http://www.php-espiritosanto.com.br/wp/eventos/workshop-php-es/#palestra1"><strong>Nadando em Dinheiro com <acronym title="Asynchronous JavaScript and XML">AJAX</acronym> e jQuery</strong></a> [<a href="http://www.php-espiritosanto.com.br/wp/eventos/workshop-php-es/#reinaldo"><em>Reinaldo de Souza "JuniorZ"</em></a>]<br />15:00h &#8211; 16:00h - <a href="http://www.php-espiritosanto.com.br/wp/eventos/workshop-php-es/#palestra2"><strong>Desenvolvimento ágil com Smarty</strong></a> [<a href="http://www.php-espiritosanto.com.br/wp/eventos/workshop-php-es/#gerson"><em>Gerson Novais</em></a>]<br />16:00h &#8211; 16:30h &#8211; Intervalo<br />16:30h &#8211; 17:30h - <a href="http://www.php-espiritosanto.com.br/wp/eventos/workshop-php-es/#palestra3"><strong>CakePHP</strong></a> [<a href="http://www.php-espiritosanto.com.br/wp/eventos/workshop-php-es/#leonardo"><em>Leonardo "Hackin" Freire</em></a>]<br />17:30h &#8211; Fechamento<br /><br />Durante o evento, serão sorteados alguns brindes e no ato da inscrição cada um receberá uma caneta e, muito possivelmente, um bloco de papel para rascunhar o que quiserem.<br /><br />Mais detalhes serão dados com o tempo, pois faltam fechar os patrocinadores e acertar algumas coisas. Para mais informações, cadastrem-se em nosso grupo (<a href="http://br.groups.yahoo.com/group/php-espiritosanto/">http://br.groups.yahoo.com/group/php-espiritosanto/</a>) ou no blog do grupo (<a href="http://www.php-espiritosanto.com.br/wp/workshop-php-es/" target="_blank">http://www.php-espiritosanto.com.br/wp/workshop-php-es/</a>).<br /><br /><strong>Contamos com a presença de todos.  =)</strong><p><map name='google_ad_map_85_124865e6ea244bb0'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/85?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_85_124865e6ea244bb0' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=85&amp;url= http%3A%2F%2Fleohackin.com.br%2Fblog%2F2009%2F04%2F1%25c2%25ba-workshop-php-es%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://leohackin.com.br/blog/2009/04/1%c2%ba-workshop-php-es/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drosera: o Firebug do Safari</title>
		<link>http://leohackin.com.br/blog/2009/04/drosera-o-firebug-do-safari/</link>
		<comments>http://leohackin.com.br/blog/2009/04/drosera-o-firebug-do-safari/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 04:00:54 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[firebug]]></category>
		<category><![CDATA[macos]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[webkit]]></category>

		<guid isPermaLink="false">http://leohackin.com.br/blog/?p=80</guid>
		<description><![CDATA[Hi People! Duzentos anos depois, eis mais um post: e agora vai ser no mínimo 1 por semana.  É fato que o Firefox derrubou barreiras e hoje é o maior e melhor navegador do planeta. Fato! Mas é fato também que ele nas últimas versões tem consumido um absurdo de memória RAM: a pergunta [...]]]></description>
			<content:encoded><![CDATA[<strong>Hi People!</strong> Duzentos anos depois, eis mais um post: e agora vai ser no mínimo 1 por semana. <img src='http://leohackin.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <br /><br />É fato que o <strong><em>Firefox</em></strong> derrubou barreiras e hoje é o maior e melhor navegador do planeta. <strong>Fato!</strong> Mas é fato também que ele nas últimas versões tem consumido um absurdo de memória RAM: a pergunta que fica é &#8220;<strong>PRA QUE TANTO?</strong>&#8220;.<br /><br />Revolta a parte, compartilhada com meu brother-sócio <a title="Bye Firefox" href="http://www.jeveaux.com/blog/2009/bye-firefox-welcome-safari/#more-469" target="_blank">Jeveaux</a>, a navegação com o Firefox ainda &#8220;era&#8221; uma necessidade devido ao <a href="http://getfirebug.com/" target="_blank">Firebug</a>, plugin pra la de providencial para debug dos scripts e elementos da página: total mão na roda para quem usa intensivamente Ajax, JS e demais tecnlogias correlatas.<br /><br />Frustrações e algumas googladas e a solução apareceu: <a href="http://webkit.org/blog/61/introducing-drosera/" target="_blank">Drosera</a>, um complemento da ferramenta Webkit.<span id="more-80"></span><img class="alignright size-full wp-image-81" title="drosera" src="http://leohackin.com.br/blog/wp-content/uploads/2009/04/drosera.png" alt="drosera" width="285" height="355" />O <em><strong>Drosera</strong></em> apresenta algumas ferramentas bacanas de debug de código, a exemplo do Firebug:
<ul><br />	<li>Debugger real time de todo JS contido na página, com opção de execução de código aleatório direto sobre o código da página e o uso de break points no código JS: um must!</li>
	<li>Profiler dos elementos da página: quando usado CSS ele mostra até mesmo as propriedades da DIV e tudo mais.</li>
	<li>Informações de todos os recursos inclusos na página (o próprio HTML, todas as folhas CSS, scripts JS) com gráficos de tempo de carregamento e tamanhos (em Kb) de todos os recursos da página (como imagens, scripts e por ai vai)</li>
</ul>
Em tese, diria o que Drosera é muito parecido com o Firebug: mesma proposta, ferramentas parecidas e zaz. Mas num segundo momento, o <strong>Drosera ficou bacana pois vai mais direto ao ponto que o Firebug</strong>.<br /><br />A instalação é bem simples e consiste em baixar e instalar o Webkit, configurar via linha de comando o Safari e se divertir. Os passos todos são muito bem explicados <a href="http://webkit.org/blog/61/introducing-drosera/" target="_blank">neste link</a> da <a href="http://webkit.org/" target="_blank">Webkit.org</a>.<br /><br />Então, para quem busca uma alternativa bacana ao Firefox para debugar suas páginas no Mac, enjoy! <img src='http://leohackin.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <br /><br />E vamo simbora! <img src='http://leohackin.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <p><map name='google_ad_map_80_124865e6ea244bb0'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/80?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_80_124865e6ea244bb0' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=80&amp;url= http%3A%2F%2Fleohackin.com.br%2Fblog%2F2009%2F04%2Fdrosera-o-firebug-do-safari%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://leohackin.com.br/blog/2009/04/drosera-o-firebug-do-safari/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Giran Soluções e Ensino</title>
		<link>http://leohackin.com.br/blog/2009/03/giran-solucoes-e-ensino/</link>
		<comments>http://leohackin.com.br/blog/2009/03/giran-solucoes-e-ensino/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 01:14:48 +0000</pubDate>
		<dc:creator>Léo Hackin</dc:creator>
				<category><![CDATA[Pessoal]]></category>
		<category><![CDATA[giran]]></category>

		<guid isPermaLink="false">http://leohackin.com.br/blog/?p=73</guid>
		<description><![CDATA[É com IMENSO PRAZER que anuncio a abertura da GIRAN SOLUÇÕES E ENSINO, fruto do sonho do grande irmão-brother-amigo-amante-conselheiro-espiritual Paulo Jeveaux com quem estou tendo a honra inenarrável de compartilhar. Juntamente com a Keilinha, anjo da guarda nosso e esposa do sortudo do Jeveaux, estamos agora caminhando essa nova trilha.A Giran nasceu principalmene do nosso [...]]]></description>
			<content:encoded><![CDATA[É com<strong> IMENSO PRAZER </strong>que anuncio a abertura da <a href="http://www.giran.com.br" target="_blank">GIRAN SOLUÇÕES E ENSINO</a>, fruto do sonho do grande irmão-brother-amigo-amante-conselheiro-espiritual <a href="http://www.jeveaux.com" target="_blank">Paulo Jeveaux</a> com quem estou tendo a honra inenarrável de compartilhar. Juntamente com a Keilinha, anjo da guarda nosso e esposa do sortudo do Jeveaux, estamos agora caminhando essa nova trilha.<br /><br /><span id="more-73"></span><br /><br />A Giran nasceu principalmene do nosso sonho de fazer uma empresa jovem, &#8220;up&#8221; e principalmente dentro que sempre achamos ser o correto e viável, social, mercadológico e humanamente bacana para uma empresa de tecnologia.<br /><br />É muito óbvio que as bordoadas da vida e do mercado serão fatos em nosso início de vida, mas estamos dispostos e conhecer &#8220;o outro lado da moeda&#8221; e esse sentimento é o que mais nos impulsiona a dar nosso melhor nisso tudo.<br /><br />Uma nova vida vem por ai, e meu (nosso) muito obrigado pela força e bons pensamentos que todos sempre tiveram por mim (por nós). Bola pra frente e vamos simbora.<br /><br />Abaixo, uma transcrição do post do Jeveaux sobre a Giran.<br /><br />&#8211;<br /><h1><strong><strong><em>Giran Soluções e Ensino</em></strong></strong></h1>
<strong><a href="http://www.giran.com.br/"><img class="alignleft size-full wp-image-547" title="giran_mini1" src="http://www.jeveaux.com/blog/wp-content/uploads/2009/03/giran_mini1.png" alt="giran_mini1" width="154" height="51" /></a><a href="http://www.giran.com.br/"><em>Giran</em></a></strong><em> é o nome da nossa empresa. Durante quase 2 meses nós procuramos um nome, inventamos códigos e nomes estranhos, nomes ao contrário, nomes em japonês, em chinês, enfim, tentamos de um todo, mas nenhum deles tinha o domínio livre. Apesar de se tratar do nosso lado profissional e de ser agora a nossa cara, nossa marca e identidade ‘na rua’, o nome é algo muito especial, e não poderia deixar de ser algo </em><em>nerd</em><em>, afinal somos </em><em>nerds</em><em>. Darei uma pista e quem descobrir a origem do nome ganhará o direito de disputar uma partida de xbox na nossa nova sede; </em><em>a dica: é um nome retirado de um rpg, mais especificamente de um mmorpg!</em><br /><br /><em>Conheça: </em><a href="http://www.giran.com.br/" target="_blank"><em>Giran Soluções e Ensino</em></a><br /><br /><em>Na </em><a href="http://www.giran.com.br/"><em>Giran</em></a><em> o nosso foco de trabalho serão contratos de </em><strong><em>consultoria e coaching</em></strong><em>em projetos java e rails, </em><strong><em>gerenciamento de projetos com Scrum</em></strong><em> e, também, </em><strong><em>ensino e treinamento</em></strong><em> especializados em java, php e rails. Quando o site estiver no ar muitas outras informações e detalhes sobre nossa área de atuação serão disponibilizadas.</em><br /><br /><em>A criação e lançamento da </em><a href="http://www.giran.com.br/"><em>Giran</em></a><em> ocorreu, antes de tudo, após uma longa conversa sobre valores, princípios, visão e expectativas para a empresa e sobre como faríamos para criar e manter uma empresa jovem e descontraída e ao mesmo tempo profissional e comprometida. Nós não poderíamos simplesmente abrir uma outra </em><em>‘old big company’</em><em> baseada em velhas e obsoletas idéias e trabalhar de forma caótica e improdutiva, na nossa empresa usaremos o que há de ponta para o desenvolvimento e gestão dos nossos projetos e treinamentos, estudaremos cada caso com o máximo de detalhes, cada cliente, cada projeto afim de aplicar o que for melhor para cada situação, exatamente igual fazemos em nosso dia-a-dia e em nossa evolução pessoal+profissional.</em><br /><br /><em>Na </em><a href="http://www.giran.com.br/"><em>Giran</em></a><em> todo o nosso trabalho será pautado e muito fortemente baseado nos valores e princípios de </em><a href="http://extremeprogramming.org/"><em>Extreme Programming</em></a><em>, especialmente em alguns que temos uma certa predileção:</em>
<ul><br />	<li><strong><em>Respeito</em></strong><em> - Pois este é a base para todos os outros valores e princípios, é o motivo pelo qual nascemos e pelo qual prosperaremos.</em></li>
	<li><strong><em>Coragem</em></strong><em> - Não seremos reativos à mudanças, não cortaremos a nossa criatividade e de nossos funcionários. Lidaremos com o risco de forma aberta, transparente e responsável; e erraremos o quanto for preciso para chegar o mais próximo possível da perfeição e continuar sempre no caminho da evolução e da melhoria contínua.</em></li>
	<li><strong><em>Simplicidade</em></strong><em> - Seremos pragmáticos, sempre! Não queremos fazer mais do que a concorrência, não queremos fazer o desnecessário, não queremos ser ‘</em><em>grande e flácido’</em><em>, nós queremos resolver o seu problema.</em></li>
	<li><strong><em>Comunicação</em></strong><em> - Somos emocionais, queremos olhar nos seus olhos, conversar e sentir as suas emoções, tom de voz, expressões faciais, gestos e postura, não vamos trocar uma visita por um e-mail ou telefonema.</em></li>
	<li><strong><em>Qualidade</em></strong><em> - Não pode haver desperdício. Não pode haver software ruim ou de má qualidade. Prezamos fortemente pelo código que escrevemos e sabemos que ele é o nosso produto, não se trata de nível de qualidade, o objetivo é a altíssima qualidade, e é isso que importa.</em></li>
</ul>
<em>Outro ponto de grande realização para nós com a abertura da </em><a href="http://www.giran.com.br/"><em>Giran</em></a><em> é poder participar e atuar de uma forma ainda mais forte e ativa no desenvolvimento de projetos open source e nos grupos e comunidades da nossa região. Poder agora, como empresa, dedicar tempo remunerado a estes projetos, incentivar e bancar a participação dos nossos funcionários, poder viabilizar eventos e outras atividades e muito mais. Hoje nós já participamos fortemente como membros e coordenadores no </em><a href="https://esjug.dev.java.net/"><em>ESJUG</em></a><em>, </em><a href="http://groups.google.com/group/agile-es"><em>Agile-ES</em></a><em>, </em><a href="http://www.php-espiritosanto.com.br/wp/"><em>PHP-ES</em></a><em>, </em><a href="http://linux-es.org.br/site/"><em>Linux-ES</em></a><em> e </em><a href="http://eesl.org/"><em>EESL</em></a><em> e estamos iniciando a participação no </em><a href="http://vitoria.pm.org/"><em>Vitória Perl Mongers</em></a><em>.</em><br /><br /><em>E é isso, agora é correr atrás e tentar aplicar tudo que eu disse para meus antigos chefes/gerentes e ver, na prática, se será bom ou ruim, fácil ou difícil, lucrativo ou não e por aí vai. Agora o sonho acabou, virou realidade!</em><p><map name='google_ad_map_73_124865e6ea244bb0'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/73?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_73_124865e6ea244bb0' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=73&amp;url= http%3A%2F%2Fleohackin.com.br%2Fblog%2F2009%2F03%2Fgiran-solucoes-e-ensino%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://leohackin.com.br/blog/2009/03/giran-solucoes-e-ensino/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
