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

<channel>
	<title>hlegius &#187; Featured Articles</title>
	<atom:link href="http://programe.me/category/featured-articles/feed/" rel="self" type="application/rss+xml" />
	<link>http://programe.me</link>
	<description>programação, desenvolvimento, tecnologia e muito o que contar.</description>
	<lastBuildDate>Wed, 23 Nov 2011 17:26:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>PHP Resque Bundle</title>
		<link>http://programe.me/queue-com-php-resque-bundle/</link>
		<comments>http://programe.me/queue-com-php-resque-bundle/#comments</comments>
		<pubDate>Sun, 13 Nov 2011 11:37:08 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[symfony resque php]]></category>

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

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

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

class Mundo {
 use Hello;

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

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

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

 private function youTube() {

 }
}

class Funcionario extends Pessoa {
}

class Supervisor extends Pessoa {
 use Cronograma;
}

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

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

class View {
 use Hello, World;
}

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

class Foo {
 use QuemSou;
}

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

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

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

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

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

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

$ola = new Modificadores();
$ola-&gt;aloha();
// Olá mundo</pre>
<p>Há outros vários recursos como métodos abstratos nos Traits, precedência, métodos estáticos, late static bindings, métodos mágicos, alias para nome de método do Trait ao usá-lo na classe. Para Rubistas ou Scalistas (?) as possibilidades são as mesmas dos Mixins e Traits de Ruby e Scala respectivamente.</p>
<ul>
<li><a href="http://wiki.php.net/rfc/horizontalreuse" target="_blank">RFC do PHP Trait</a> <em>(offline por enquanto devido a problemas no servidor deles)</em></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/traits-em-php-heranca-horizontal/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Você assinou seu código hoje ?</title>
		<link>http://programe.me/voce-assinou-seu-codigo-hoje/</link>
		<comments>http://programe.me/voce-assinou-seu-codigo-hoje/#comments</comments>
		<pubDate>Fri, 21 Jan 2011 10:42:37 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Dia-a-dia]]></category>
		<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[entrevista]]></category>
		<category><![CDATA[opinião]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=674</guid>
		<description><![CDATA[Quem utiliza-se ou já utilizou da annotation @author no cabeçalho de seus códigos levanta a mão ! o/ Desde que comecei a programar no ínicio do segundo semestre de 2004, eu utilizo desse tal de arroba-aútor. Já vi algumas variantes dela, por exemplo: Há ainda aqueles que detalham no cabeçalho sua pog contribuição: Sinceramente eu [...]]]></description>
			<content:encoded><![CDATA[<p>Quem utiliza-se ou já utilizou da <em>annotation</em> @author no cabeçalho de seus códigos levanta a mão ! o/</p>
<div id="attachment_675" class="wp-caption aligncenter" style="width: 448px"><a href="http://www.hlegius.pro.br/wp-content/uploads/2011/01/author.png"><img class="size-full wp-image-675" title="author" src="http://www.hlegius.pro.br/wp-content/uploads/2011/01/author.png" alt="Annotation @author" width="438" height="121" /></a><p class="wp-caption-text">Annotation @author</p></div>
<p>Desde que comecei a programar no ínicio do segundo semestre de 2004, eu utilizo desse tal de <em>arroba-aútor.</em> Já vi algumas variantes dela, por exemplo:</p>
<div id="attachment_676" class="wp-caption aligncenter" style="width: 443px"><a href="http://www.hlegius.pro.br/wp-content/uploads/2011/01/author-combo.png"><img class="size-full wp-image-676" title="Annotation @author pastel" src="http://www.hlegius.pro.br/wp-content/uploads/2011/01/author-combo.png" alt="Annotation @author pastel" width="433" height="173" /></a><p class="wp-caption-text">Annotation @author Augusta edition</p></div>
<p>Há ainda aqueles que detalham no cabeçalho sua <span style="text-decoration: line-through;">pog</span> contribuição:</p>
<div id="attachment_677" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.hlegius.pro.br/wp-content/uploads/2011/01/author-combo2.png"><img class="size-medium wp-image-677" title="Blablabla no annotation" src="http://www.hlegius.pro.br/wp-content/uploads/2011/01/author-combo2-300x77.png" alt="Blablabla no annotation" width="300" height="77" /></a><p class="wp-caption-text">Blablabla no annotation (clique para ampliar - ou não)</p></div>
<p>Sinceramente eu nunca fui pesquisar se há uma convenção na utilização deste annotation. O fato é que meu uso com isto é descomplicado:</p>
<ul>
<li>Insiro meu nome em novos arquivos;</li>
<li>Adiciono meu nome abaixo do último se eu fiz alguma adição ao arquivo, ou;</li>
<li>Não adiciono quando faço pequenas modificações sem acrescentar algo de valor ao então domínio/objetivo/proposta do arquivo.</li>
</ul>
<p>Mas mesmo assim, sempre coloco no formato <strong>Nome completo &lt;email@provedor&gt;</strong></p>
<p>Porém, não pela primeira vez vejo um developer defendendo o não uso deste annotation. A última vez foi numa discussão &#8211; no bom sentido &#8211; entre <a href="http://twitter.com/sergioprado" target="_blank">@sergioprado</a> e <a href="http://twitter.com/lfamorim" target="_blank">@lfamorim</a>. Com isto, fui perguntar a eles &#8211; e alguns outros mais &#8211; a opinião pessoal em relação ao tal annotation. Confira:</p>
<p><strong>Eduardo Guerra</strong> &#8211; <a href="http://twitter.com/emguerra" target="_blank">@emguerra</a></p>
<blockquote><p>﻿Obviamente se o uso de @author nas classes for uma prática da equipe irei segui-la sem problemas, mas se a escolha for minha opto por não colocar. Esse tipo de marcação no meu ponto de vista atrapalha a propriedade coletiva do código por determinar explicitamente os autores da classe. No caso de erros na classe, sempre haverão dedos apontando o autor como culpado, mesmo se não foi ele quem introduziu o problema.</p>
<p>Como toda documentação não-executável, pode deixar de ser atualizado com a evolução de um projeto e muitas vezes o autor original não é mais quem mais contribuiu para a classe no seu estado atual. Adicionalmente, sou a favor de manter o código o mais limpo possível e esse tipo de coisa acaba deixando o código de todas as classes mais verboso.</p></blockquote>
<p><strong>Cainan Costa -<a href="http://twitter.com/sryche" target="_blank"> @</a></strong>﻿<a href="http://twitter.com/sryche" target="_blank">﻿sryche</a><strong> </strong>via Jabber</p>
<blockquote><p>[20:03:08] cainan.costa: não faz sentido, porque o VCS já mostra =P<br />
[20:03:16] cainan.costa: quem é o maluco que fez a parada<br />
[20:03:25] cainan.costa: aí tu usa um git blame<br />
[20:03:33] cainan.costa: e já sabe quem encher de porrada</p></blockquote>
<p><a href="http://lfamorim.com" target="_blank"><strong>Lucas Fernando Amorim</strong></a> &#8211; <a href="http://twitter.com/lfamorim" target="_blank">@lfamorim</a></p>
<blockquote><p>Hoje em dia a tag @author é tão obsoleta quanto respeitar um limite de colunas para seu código, mas ainda assim acho elegante e talvez até relevante.</p>
<p>Fica muito mais fácil para aqueles programadores que não usam a IDE XPTO verem o criador de determinado arquivo, método ou função sem ter que recorrer a um programa. É repetitivo você pode alegar, mas eu posso retrucar que a tarefa pode ser automatizada.</p>
<p>Eu aprecio muita essa tag, pois a partir dela posso usando minha humilde IDE identificar o criador de determinados códigos, antecipando os vícios do autor e me adaptando para a leitura. Tudo isso sem abrir a shell e digitar N^C comandos.</p>
<p>N = Familiaridade com o programa X de controle de versão.<br />
C = Commits anteriores.</p></blockquote>
<p><strong><a href="http://www.chrisb.com.br/" target="_blank">Christian Benseler </a></strong>- <a href="http://twitter.com/chrisbenseler" target="_blank">@chrisbenseler﻿﻿﻿</a></p>
<blockquote><p>﻿﻿Tenho uma visão que o negócio é &#8220;mais embaixo&#8221;. Antes de tentar assinar um script como seu, o desenvolvedor tem que se preocupar com outros assuntos mais importantes: é um projeto pessoal ou colaborativo? Está prestando serviços a alguém, outra empresa? Qual a política do seu cliente? Qual a versão do script? E qual o tipo de licensa que será adotada?<br />
Só assinar o script não vai fazer a menor diferença se não tiver essas informações. E não vai fazer nenhuma diferença se a comunidade não parar de copiar o script feito por A, retirar os author notes do script e redistribuir o script sem dar esses créditos e/ou sem levar em conta o tipo de licensa adotado.</p></blockquote>
<p><strong><a href="http://chester.blog.br" target="_blank">Carlos Duarte do Nascimento</a></strong> &#8211; <a href="http://twitter.com/chesterbr" target="_blank">@chesterbr</a></p>
<blockquote><p>Antes de mais nada, você se refere a qual linguagem? Em Java, @author pode significar tanto uma anotação em si (e aí depende do contexto), tal como:</p>
<p>@author(&#8220;chester&#8221;)<br />
public foo(int bar) {<br />
&#8230;</p>
<p>quanto (o que eu imagino que você queira dizer) a anotação feita em um doclet, i.e.:</p>
<pre>/**
 * Um elemento coberto por JavaDoc.
 * @author chester
 */
public foo(int bar) {
...</pre>
<p>No segundo caso, eu gosto de @author devido à facilidade em lidar com a autoria coletiva: ela permite anotar classes inteiras ou métodos/atributos particulares; você pode colocar múltiplos autores, e<br />
o Eclipse pode ser facilmente configurado para adicioná-la automaticamente. No PHP, se me recordo, é possível usar algo<br />
equivalente (phpdoc) em cabeçalhos de código, mas não sei se é válido colocar em métodos/atributos, ou se é possível ter múltiplas declarações no mesmo escopo.</p>
<p>Em qualquer caso, vale notar que sistemas de controle de versão como svn e git são mais eficientes para descobrir quem efetivamente contribuiu com uma classe/método do que esse tipo de tag. Além disso, elas não são suficientes para notas de copyright (ou seja, teriam que ser replicadas apropriadamente para o correto licenciamento do código, independente da licença utlizada), o que limita de fato sua utilidade prática.</p></blockquote>
<p><a href="http://sergioprado.org" target="_blank"><strong>Sérgio Prado</strong></a> &#8211; <a href="http://twitter.com/sergioprado" target="_blank">@sergioprado</a></p>
<blockquote><p>﻿Há muito tempo atrás, as ferramentas disponíveis aos programadores eram escassas e limitadas.</p>
<p>&lt;oldschool&gt;Já programei em Assembly com um DOS rodando num x86 e monitor CGA de 80 colunas x 25 linhas &lt;/oldschool&gt;</p>
<p>Nesta época, ferramentas de controle de versão não eram tão comuns, nem monitores de 21 polegadas. Foi então que surgiram alguns paradigmas. Eram consideradas boas práticas de programação usar no máximo 80 colunas por linha de código (limitação causada pelos monitores da época), e incluir informações no cabeçalho do arquivo como @version, @author, @date, @changes etc.</p>
<p>O problema é que para muitas pessoas estes paradigmas perduram até hoje, por herança, por gosto (ou mazoquismo mesmo). Qualquer ferramenta decente de controle de versão pode te trazer, desde sua criação, todo o histórico de alteração de um arquivo. Além de ser mais seguro e confiável. Se eu usar no código-fonte &#8220;@author pica-pau&#8221;, grande parte das pessoas não irá perceber, porque ninguem lê o cabeçalho do arquivo. Também não existe garantia de que o nome documentado no código-fonte é realmente o do desenvolvedor. Já com uma ferramenta de controle de versão esta garantia existe.</p>
<p>Eu mesmo usava @author nos cabeçalhos uns tempos atrás, mas parei de usar depois que comecei a criticar alguns paradigmas que tinha. É tudo questão de delegar para ferramentas o que pode ser automatizado e buscar novas soluções para os mesmos problemas.</p></blockquote>
<p><strong><a href="http://fabiolnm.blogspot.com" target="_blank">Fábio Miranda</a></strong> &#8211; <a href="http://twitter.com/fabiolnm" target="_blank">@fabiolnm</a></p>
<blockquote><p>﻿Não uso por pura falta de hábito &#8211; nunca trabalhei em um projeto onde essa prática fosse adotada.<br />
Mas acho interessante, não só o autor, como o email / github tb.</p>
<p>Pode ocorrer de ser necessário dar manutenção em determinado código cuja compreensão não seja trivial, e a possibilidade de contactar o autor, mesmo que remota, deve ser considerada e viabilizada.<br />
Não vejo razão para ser contra.</p></blockquote>
<p>E pra finalizar, os comentários fundamentados de <a href="http://hannelita.wordpress.com" target="_blank">Hanneli Carolina Tavante</a> <a href="http://twitter.com/hannelita" target="_blank">@hannelita</a> &#8211; sobre o uso de @author e muito mais:</p>
<blockquote><p>Bom, vou dar minha opinião sobre comentários no código antes de qualquer coisa&#8230;. Também utilizarei algumas metáforas e exemplos reais.</p>
<p>Eu já trabalhei com códigos de sistemas legados &#8211; Mainframes e sistemas bem antigos &#8211; , envolvendo C e Assembly. Vou contar uma coisa &#8211; quando abríamos um código e víamos infinitas linhas de comentário, já sabíamos que vinha coisa ruim pela frente. Tudo bem para aquele tipo de código sempre achei necessário comentar &#8211; Há algumas subrotinas do inferno que precisam de explicação. E o cara que fez isso tem idade pra ser meu pai, já faleceu ou se aposentou. Portanto, códigos assim são &#8220;legíveis&#8221; graças aos comentários deixados para trás. Já peguei código em Assembly sem comentários. E fiquei quase 10 dias só pra entender por cima o que o programa fazia.</p>
<p>Mas atualmente estamos em uma época onde encontramos linguagens extremamente expressivas, como Ruby e Python. E pra ajudar ainda tem uns framewroks tipo Sinatra, incorporando DSLs. Ou seja, hoje é possível escrever códigos que HUMANOS são capazes de ler. (humanos comuns, quis dizer hehehe). Se você escreve códigos em Ruby que humanos não entendem, então sinto muito, meu amigo, vá ler o Clean Code ou aprender a programar de forma limpa. Aliás, práticas de TDD ou BDD, por exemplo, influenciam e praticamente geram um código limpo e legível dadas as etapas que sugerem na construção da aplicação. Por exemplo, o famoso &#8220;Vermelho, verde, refatorar&#8221; do TDD &#8211; O refatorar ocasiona um cógido extremamente mais compreensivo. Construído tal código sólido e bem estruturado, eu questiono &#8211; comentários para que? Eles perdem o sentido. Por exemplo, você se depara com a seguinte expressão em Ruby:</p>
<pre> unless valor == 0
  puts "Valor diferente de zero!"
 end</pre>
<p>Bem expressivo, certo? Pra que um comentário então? Uma das coisas que me irrita um pouco é encontrar códigos assim:</p>
<pre>public class Pessoa {
  private String nome; //define o nome da pessoa
  private int idade; // define idade da pessoa
}</pre>
<p>Ou pior, bem pior que isso:</p>
<pre>public class Pessoa {
  private String a; //define o nome da pessoa
}</pre>
<p>Ambos os casos eu considero inapropriados. O primeiro por gerer redundância &#8211; é ÓBVIO que o atributo &#8220;nome&#8221; faz menção ao nome da entidade pessoa! O segundo exemplo nos remete a alguém que não fez uso de bom senso de orientaćão a objetos para definir o nome do atributo. O comentário era necessário porque não houve refatoração e uso de um nom esclarecedor ao campo. De qualquer forma, isso é incorreto no meu ponto de vista.</p>
<p>Então quando usar comentários? Costumo usar comentários quando, por exemplo, utilizei algum recurso pouco conhecido da linguagem. Por exemplo, o uso de Fibers no Ruby &#8211; poucas pessoas sabem o que são Fibers; coloquei um comentário no meu código extremamente sucinto explicando o que era e onde achar mais informações. Ou se você utilizar alguma magia-negra no código, embebida por metaprogramação, por exemplo, acho que é bom deixar um comentário sucinto do que aquilo quis dizer. Esse tipo de comentário ajuda programadores juniors a adquirir experiência e ajuda até memso os seniors a captar a idéia geral de um método/bloco que possui lógica complexa.<br />
E há alguns casos que comentários podem ajudar a leitura do código fluir e ficar mais agradável. Pra Java, por exemplo, existe uma API &#8211; GAG =&gt; <a href="http://code.google.com/p/gag/" target="_blank">http://code.google.com/p/gag/</a> &#8211; Google Annotations Gallery, da qual já fui colaboradora. Essas anotações dão emoćão ao código; de vez em quando acho interessante utilziar algumas delas; tornam o coódigo mais expressivo. Novamente, acho que se deve usar sem abusos =)</p>
<p>Sobre o uso do <strong>@author</strong> &#8211; Aí já acho que é uma cosia meio pessoal. Eu não coloco. Saber que sou colaboradora/commiter do projeto já está bom pra mim. A ligaćão entre eu e o código fonte vai muito mais além que um @author. Claro, tem o lado bom de se colocar; todos que tiverem o fonte saberão o responsável por aquela ciração, e poderão parabenizá-lo, encontrá-lo no Twitter ou no Facebook e coisas do gênero. Ou poderão xingar sua mãe com vontade. Mas acredito que há outras formas de se descobrir e pedir ajuda sobre algum fonte que não são através do @author.</p>
<p>Bom, essa é minha visão geral da coisa! =D</p></blockquote>
<p>E aí, é contra ou a favor do @author ?</p>
<p><strong> </strong></p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/voce-assinou-seu-codigo-hoje/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Procura-se o Programador Sênior</title>
		<link>http://programe.me/procura-se-o-programador-senior/</link>
		<comments>http://programe.me/procura-se-o-programador-senior/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 15:19:29 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[developer]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=455</guid>
		<description><![CDATA[O que muito é visto nas ofertas de &#8220;vagas&#8221; para programadores são os rótulos Júnior, Pleno e Sênior. Mas, como saber em qual destes níveis você está ? E, é possível tachar pessoas com estes níveis ? Já conversei com pessoas que batem o martelo facilmente dizendo: - É por tempo.  Eu programo em brainfuck [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">O que muito é visto nas ofertas de &#8220;vagas&#8221; para programadores são os rótulos Júnior, Pleno e Sênior. Mas, como saber em qual destes níveis você está ? E, é possível tachar pessoas com estes níveis ?</p>
<p style="text-align: center;">
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://www.moma.org/collection/browse_results.php?object_id=79018"><img class=" " title="The Persistence of Memory" src="http://farm4.static.flickr.com/3023/3097529664_ffc705e57e.jpg" alt="The Persistence of Memory" width="500" height="333" /></a><p class="wp-caption-text">Salvador Dali, 1931 - The Persistence of Memory</p></div>
<p>Já conversei com pessoas que batem o martelo facilmente dizendo:</p>
<p style="padding-left: 30px;"><em>- É por tempo.  Eu programo em <a href="http://en.wikipedia.org/wiki/Brainfuck" target="_blank">brainfuck</a> há seis anos, logo sou sênior. </em></p>
<p>Será mesmo ?</p>
<p style="text-align: justify;">Em tempos modernos, fica ainda mais complexo fazer uma avaliação deste tipo para programadores, arquitetos ou engenheiros de software, pois, não é somente uma linguagem de programação que está em análise. É todo um contexto que abrange desde a escolha do ambiente de desenvolvimento até relacionamento com stakeholders e domínio em metodologias e paradigmas de desenvolvimento.</p>
<p style="text-align: justify;">Se temos a análise temporal como inválida, então o que espera-se de um dito sênior ?</p>
<p style="text-align: justify;">Para tal, conversei com três pessoas que estão diretamente envolvidas com estes aspectos.</p>
<p style="text-align: left;">&nbsp;</p>
<p style="padding-left: 30px; text-align: justify;">Creio que sim. Existem os profissionais seniores, porém muitas pessoas, e empresas, acabam confundindo o nível do profissional com o seu tempo de experiência.</p>
<p style="padding-left: 30px; text-align: justify;">Em minha visão, o tempo de experiência é importante, porém, não determinante para rotular um profissional, ou seja, é perfeitamente possível existirem seniores com 3 anos de experiência e juniores com 15 anos.</p>
<p style="padding-left: 30px; text-align: justify;">O profissional Júnior, é aquele que já desempenha as tarefas com certa autonômia, porém, necessita de um maior tempo de pesquisa e em alguns casos de orientação.</p>
<p style="padding-left: 30px; text-align: justify;">Por sua vez, o pleno já demora um tempo menor para realizar as mesmas tarefas além de não necessitar de orientações referente aquela tarefa. O que difere o pleno de um sênior é a visão holistica, ou seja, para ser um profissional sênior é preciso possuir habilidades complementares as necessárias para o desenvolvimento daquela tarefa, isso ajuda acima de tudo no desenho de uma melhor solução além de maior facilidade no tratamento de problemas.</p>
<p style="padding-left: 30px; text-align: justify;">Outro ponto que vale ser observado, é que muitas vezes o sênior é destacado para tarefas simples, que não exige um conhecimento avançado, como seguir um procedimento de criação de usuário. Esse fato, além de desmotivar o profissional, gasta recursos de forma imprudente, já que são os seniores que deveriam criar os procedimentos a serem seguidos, além de desenhar soluções para problemas e corrigir falhas críticas ou em serviços críticos.</p>
<p style="text-align: right;"><a href="http://twitter.com/bufoni" target="_blank">Vinícius Bufoni</a>, coordenador de engenharia web na <a href="http://www.vexcorp.com" target="_blank">Vex</a></p>
<p style="text-align: left;">&nbsp;</p>
<p style="text-align: left;">&nbsp;</p>
<p style="padding-left: 30px; text-align: justify;">Este é um assunto interessante. Na maioria dos lugares as pessoas usam &#8220;anos de experiência&#8221; como medida para classificar. Esta é, na minha experiência, uma das piores maneiras de se fazer este tipo de classificação. Uma pessoa que desenvolve em, digamos, JSP e Servlets Java por 10 anos não necessariamente tem 10 anos de experiência desenvolvendo software, ele tem experiência desenvolvendo JSP e Servlets! E mesmo assim, tempo gasto em uma tecnologia não está diretamente relacionado com proficiência nesta. Enfim, utilizar tempo para medir experiência é, normalmente, uma besteira.</p>
<p style="text-align: justify; padding-left: 30px;">A forma com que eu tenho lidado com esta relação entre níveis de desenvolvedores, atualmente, é usando algo chamado modelo Dreyfus de aquisição de conhecimento: <a href="http://en.wikipedia.org/wiki/Dreyfus_model_of_skill_acquisition" target="_self">http://en.wikipedia.org/wiki/Dreyfus_model_of_skill_acquisition</a> .</p>
<p style="text-align: justify; padding-left: 30px;">Normalmente eu tenho as áreas em que eu considero que meu time deve ser competente (este post: <a href="http://fragmental.tw/2009/11/24/i-wish-i-knew-that-before-getting-this-job-–-slides-and-long-notes/" target="_blank">http://fragmental.tw/2009/11/24/i-wish-i-knew-that-before-getting-this-job-–-slides-and-long-notes</a> da uma idéia sobre quais seriam estas áreas) e uso o Dreyfus para tentar entender onde cada um está nestas competências. Tem funcionado relativamente bem para mim mas ainda é, como sempre será, problemático e, por muitas vezes, injusto.</p>
<p style="padding-left: 30px; text-align: right;"><a href="http://fragmental.tw/" target="_blank">Phillip Calçado</a>, consultor na <a href="http://www.thoughtworks.com" target="_blank">ThoughtWorks</a></p>
<p style="text-align: left;">&nbsp;</p>
<p style="text-align: left;">&nbsp;</p>
<p style="padding-left: 30px; text-align: justify;">Do meu ponto de vista um profissional sênior é acima de tudo auto suficiente, é o tipo de profissional em que você não precisa passar o que deve ser feito, ele geralmente entende seu papel em uma equipe e como pode contribuir.</p>
<p style="padding-left: 30px; text-align: justify;">Um profissional Sênior consegue tomar decisões e assumir responsabilidades, ele não depende de alocações e precisa de muito pouca supervisão gerencial e técnica.</p>
<p style="text-align: justify; padding-left: 30px;">Geralmente um profissional Sênior também, está sempre atualizado e esta sempre ligado em tendências do mercado e em como adaptar estas novidades a sua realidade nos projetos em que esta envolvido.</p>
<p style="text-align: justify; padding-left: 30px;">&#8220;Tempo&#8221; de experiência na verdade não é tão importante, mas a diversidade e intensidade da experiência da pessoa é extremamente importante, se ele esteve envolvido uma grande diversidade de projetos e atuou em papeis dos mais diversos, um profissional sênior geralmente consegue se adaptar pois já trabalhou em diversos papéis e com diversos times.</p>
<p style="text-align: justify; padding-left: 30px;">No caso de grandes empresas de Internet, como o Yahoo!, é vital que o profissional sênior entenda de e tenha tido vivência com projetos de grande escala, e que entenda de Sistemas, arquiteturas e plataformas que funcionem com grandes volumes de acesso e demandam muita performance.</p>
<p style="text-align: justify; padding-left: 30px;">Não gosto muito destes rótulos, mas um profissional Pleno depende de um nível de supervisão/apoio maior. Um Pleno também tende a ser mais inseguro na tomada de decisões e definições mais complexas.</p>
<p style="text-align: justify; padding-left: 30px;">Mas a principal diferença é a experiência, bagagem de conhecimento. Em entrevistas sempre pergunto qual foi o maior desastre da carreira da pessoa, espero que ele me diga quais foram os erros e o que ele aprendeu com isso. Isso mostra maturidade em relação a tentativa/erro, onde não se deve temer cometer erros e que sempre devemos aprender com eles e continuar tentando. Isso é chave para ser inovador.</p>
<p style="text-align: right;"><a href="http://me.me/acarlos1000" target="_blank">Antônio Carlos Silveira</a>, diretor de Produto e Engenharia, <a href="http://yahoo.com.br" target="_blank">Yahoo! América Latina</a></p>
<p style="text-align: right;">
<p style="text-align: left;">Cada um tem seus métodos de análise, mas ficou evidente que contar os dias no calendário já não é mais tão convincente como parecia <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/procura-se-o-programador-senior/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ser programador</title>
		<link>http://programe.me/ser-programador/</link>
		<comments>http://programe.me/ser-programador/#comments</comments>
		<pubDate>Sun, 25 Apr 2010 18:19:15 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[projetos]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=564</guid>
		<description><![CDATA[Quando decidi, aliás, percebi, que eu tinha vontade de estudar programação, nunca passou pela minha cabeça o quão difícil era criar uma aplicação a nível profissional. Iniciei na segunda metade de 2004, instalando um daqueles all in one for Windows (PHP, Apache, MySQL) e em uma semana estava fazendo uns ifs e submetendo formulários via [...]]]></description>
			<content:encoded><![CDATA[<p>Quando decidi, aliás, percebi, que eu tinha vontade de estudar programação, nunca passou pela minha cabeça o quão difícil era criar uma aplicação a nível profissional.<br />
Iniciei na segunda metade de 2004, instalando um daqueles <em>all in one</em> <em>for Windows</em> (PHP, Apache, MySQL) e em uma semana estava fazendo uns <em>ifs</em> e submetendo formulários via HTTP POST.</p>
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://www.flickr.com/photos/harmony19490/363024712/"><img src="http://farm1.static.flickr.com/138/363024712_5783b2bee0.jpg" alt="" width="500" height="333" /></a><p class="wp-caption-text">&quot;Java printout por Ngọc Hà @ flickr&quot;</p></div>
<p>Naquela época era claro para mim que programação era algo relacionado à área de exatas, pois criar uma aplicação é algo lógico tendo envolvimento direto com matemática e tudo mais.<br />
Em coisa de um mês e pouco já conseguia fazer até uns &#8220;SQLs&#8221; e montava sites no estilo <em>macarrônico</em> de desenvolver. Aquilo para mim era fantástico! Tinha como objetivo aprender bem a linguagem para assim conseguir <a title="Zend Certified Engineer" href="http://www.zend.com/en/store/education/certification/authenticate.php/ClientCandidateID/ZEND010366/RegistrationID/231431226" target="_blank">minha certificação da Zend</a>, tornando-me assim um programador profissional.</p>
<p>Aconteceu porém, algo inesperado: comecei a &#8220;seguir&#8221; &#8211; não era no Twitter, até porque ele ainda era um protótipo de projeto na época &#8211; pessoas realmente profissionais em desenvolvimento de software e eu percebi assim que o buraco era mais embaixo e que eu ser excelente em uma linguagem era apenas um dos passos para tornar-me um programador profissional.</p>
<p>Abrindo um parênteses, eu li através do <a href="http://www.twitter.com/sergioprado" target="_blank">@sergioprado</a>, não lembro onde agora, uma frase interessante e que tem como tradução algo como:</p>
<pre>"O caminho para tornar-se mestre: siga o mestre; ande com o mestre;
torne-se o mestre."</pre>
<p>Após começar eu a seguir os mestres, pude perceber que programação vai muito além da leitura de um requisito funcional de software e fazer daquilo algo sistêmico. Hoje, arrisco-me a dizer que programação não é algo somente relacionado à exatas. Possuí também, questões éticas &#8211; humanas &#8211; e artísticas.</p>
<p><strong>A programação é relacionada a área de exatas</strong></p>
<p>Isso é bem claro aos envolvidos em desenvolvimento de software. Você lê um problema descritivo, vulgo especificação funcional, ou visual (UML, rabisco na <a href="http://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&amp;field-keywords=moleskine&amp;x=0&amp;y=0" target="_blank">Moleskine</a>, <em>whatever</em>) e faz daquilo algo sistêmico e que agregue valor ao negócio de seu cliente.</p>
<p>Como premissa você precisa aprender uma linguagem. Conhecer uma linguagem bem não é nada fácil. Você precisa empenhar-se para conhecer as intrínsecas e peculiaridades para aproveitar o melhor dela, tornando-se um especialista na linguagem. Eu valorizo mais um programador excelente em uma linguagem a um que já &#8220;trabalhou&#8221; com várias. Não é impossível uma pessoa ser excelente em mais de uma linguagem, mas isto, porém, demandaria muito tempo de dedicação para atingir tal nível.</p>
<p><strong>A programação é relacionada a ética</strong></p>
<p>Toda área tem suas condutas éticas e humanas, óbvio. Em programação, porém, vejo muitos ditos programadores ignorando isto. Quando você troca qualidade por falso ganho de tempo, você está sendo antiético. Quando não analisa corretamente as decisões que irá tomar em cima de algum problema, falta-lhe ética. Quando deixa de atentar seu cliente, o que inclui seu chefe, sobre a ausência de segurança, qualidade ou algum problema em cascata que venha a aparecer em decorrência de uma atitude, você está sendo antiético.</p>
<p>E isso acontece em demasia em nossa área! Seja por falta de interesse por parte do dito programador ou mesmo por medo de perder o emprego/projeto por &#8220;afronto&#8221; ao seu chefe ou cliente.</p>
<p>Para conhecer as técnicas, metodologias e artimanhas no desenvolvimento de software é necessário antes, ter uma boa noção de análise e projeto de software; arquitetura de aplicações; padrões e melhores práticas, para, após criticar uma atitude antiética de seu chefe/cliente, você ter total embasamento para propor a solução sem comprometer o projeto nem a aplicação. Isto será necessário também, para você ter um vocabulário comum para quando estiver numa roda de conversa entre os &#8220;mestres&#8221; da área.</p>
<p>Importante ressalvar que seu cliente ou chefe pode estar tomando uma atitude antiética, no ponto de vista de programação, inconscientemente. Afinal ele é especialista no negócio, o programador profissional é você! <img src='http://programe.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>A programação é também relacionada a artes</strong></p>
<p>Há uma enorme diferença entre criar algo que funcione e criar algo que além de funcionar, transparece o domínio (regra de negócio).</p>
<p>Eu posso saber ler e escrever em português, mas há uma diferença gritante entre um poeta português e eu. Ele, diferentemente de mim, sabe utilizar muito bem as palavras e com elas, faz transparecer sentimentos, idéias e pensamentos sobre determinado tema, trazendo um enredo ao assunto abordado, envolvendo-nos em sua história.</p>
<p>Posso saber desenhar, mas isso não me torna um artista que emociona as pessoas com minhas obras.</p>
<p>Como programadores profissionais é fundamental conseguirmos fazer o mesmo ! É de nossa responsabilidade criar um código simples, legível e que conte toda a história da aplicação através de seus pacotes, classes, métodos, parâmetros, atributos e variáveis. Qualquer coisa diferente disso, não pode ser aceito como código profissional.</p>
<p>Pouco importa se a linguagem X é tachada como mais poluída que a Y. Você como profissional, tem que quebrar essa barreira e torná-la tão legível quanto qualquer outra, afinal, você é especialista na linguagem, lembra ?</p>
<p>Além de criar, é nossa responsabilidade cuidar para que o código continue sempre otimizado por tantas quantas forem as mudanças que nele ocorrer. Criar algo legível recai diretamente sobre isto, pois, no futuro outro profissional em programação poderá continuar seu trabalho sem danificar ou abandonar as premissas cruciais para um bom código. <a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1272218331&amp;sr=8-1" target="_blank">Andrew Hunt</a> aborda o título: <em>&#8220;Don&#8217;t live with broken windows&#8221;</em>, onde resumidamente ele alerta para não descuidarmos da qualidade, pois, basta uma janela quebrada em uma casa para que ela transpareça o estado de abandono, fazendo assim, com que outras pessoas destruam mais janelas.</p>
<p>E como toda arte, não há uma receita para criar bons softwares. É necessário muito empenho, ler muitos códigos, revisar muitos paradigmas ao longo do tempo e claro, programar bastante. Não é possível tornar-se um programador profissional sem conhecimento teórico, tão pouco, sem vivência com erros e acertos.</p>
<p>Ao desenvolver a aplicação, não aceite nada menos do que seu melhor naquilo e atente-se para não cair na armadilha de criar softwares de forma sistematizada. Tenha autocrítica para fazer avaliações em seus próprios códigos e evitar assim, programar por coincidência.</p>
<p>Lembre-se de que será seu nome no <em><strong>@author.</strong></em> <img src='http://programe.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/ser-programador/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Eu uso estático porque é mais rápido.</title>
		<link>http://programe.me/eu-uso-estatico-porque-e-mais-rapido/</link>
		<comments>http://programe.me/eu-uso-estatico-porque-e-mais-rapido/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 14:04:04 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[OOP e Patterns]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[teoria]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=488</guid>
		<description><![CDATA[Ouvi e já pude ler isto não uma, nem duas, mas sim diversas vezes. Argumentação padrão de quem defende uma &#8220;Orientação à Objetos mais estática&#8221; &#8211; se é que podemos chamar isso de OO. Vejamos um exemplo nada científico que fiz: Criei os seguintes exemplos: &#60;?php class Estatico { public static function fazAlgumaCoisa() { $i [...]]]></description>
			<content:encoded><![CDATA[<p>Ouvi e já pude ler isto não uma, nem duas, mas sim diversas vezes. Argumentação padrão de quem defende uma &#8220;Orientação à Objetos mais estática&#8221; &#8211; se é que podemos chamar isso de OO.</p>
<p>Vejamos um exemplo nada científico que fiz:</p>
<p>Criei os seguintes exemplos:</p>
<p><code></p>
<pre>&lt;?php
class Estatico {

    public static function fazAlgumaCoisa() {
        $i = 0;
        while ($i &lt; 10000) {
           echo Estatico::outraCoisa();
           $i++;
        }
    }

    public static function outraCoisa() {
        return "Conteúdo";
    }
}

Estatico::fazAlgumaCoisa();</pre>
<p></code></p>
<p><code></p>
<pre>&lt;?php
class Instancia {

    public function fazAlgumaCoisa() {
        $i = 0;
        while ($i &lt; 10000) {
            echo $this-&gt;outraCoisa();
            $i++;
        }
    }

    public function outraCoisa() {
        return "Conteúdo";
    }
}
$objInstancia = new Instancia();
$objInstancia-&gt;fazAlgumaCoisa();</pre>
<p></code></p>
<p>Os resultados após rodar quatro vezes cada foram:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/02/estatico.png"><img class="aligncenter size-medium wp-image-491" title="Chamadas estáticas em PHP" src="http://www.hlegius.pro.br/wp-content/uploads/2010/02/estatico-300x68.png" alt="" width="300" height="68" /></a></p>
<p style="text-align: center;"><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/02/instancia.png"><img class="aligncenter" title="Chamada em instância em PHP" src="http://www.hlegius.pro.br/wp-content/uploads/2010/02/instancia-300x66.png" alt="" width="300" height="66" /></a></p>
<p>Ou seja: <strong>91.09 ms para o estático</strong> contra <strong>90.07 para a versão non-static</strong>. Obviamente foi apenas um teste sem qualquer relevância, pois rodei em minha máquina pessoal com várias outras aplicações rodando em background. É perceptível porém, que a diferença não é absurda que compense o uso de estático por este motivo.</p>
<p>Deixando a questão de &#8220;performance&#8221; de lado, partimos para questões arquitetônicas:</p>
<ul>
<li>Identidade</li>
<li>SoC &#8211; Separation of Concerns (Principio de Separação das Responsabilidades)</li>
<li>Encapsulamento</li>
<li>Estado</li>
<li>DRY &#8211; Don&#8217;t Repeat Yourself</li>
<li>Associações &#8211; sejam elas composições ou agregações</li>
</ul>
<p>Ao perder Identidade e Estado as possibilidades daquele método &#8211; ou da classe inteira, caso use estático em tudo &#8211; tem o leque de utilidade reduzido para:</p>
<ul>
<li>Service</li>
<li>Facade</li>
<li>Factory</li>
<li>Helpers &#8211; no âmbito de serem apenas funções que realizam determinada tarefa na aplicação sem qualquer valor ao Domínio</li>
</ul>
<p>Com isso, perdemos também o Princípio de Separação das Responsabilidades, ou seja, a classe perde o controle sobre a integridade dos dados que ela deveria controlar e proteger contra acesso ou alteração indevidos.</p>
<p>Listei o DRY também por um motivo simples: com métodos estáticos, perdemos a grande chance de usar as variáveis de instância da classe à favor da mesma. Exemplo:</p>
<p><code></p>
<pre>class UsuarioEstatico {

    public static function login($usuario, $senha) {
        // valida o usuário e zaz
        $autenticador = new Autenticador();
        $autenticador-&gt;autentica($usuario, $senha);
    }

    public static function logout($usuario) {
        // verifica se a sessao está aberta
        $autenticador = new Autenticador();
        $autenticador-&gt;fechaSessaoPara($usuario);
    }
}</pre>
<p></code></p>
<p><code></p>
<pre>class Usuario implements Autenticavel {
    private $autenticador;

    public function __construct($usuario, $senha) {
        // manipula os dados de entrada
        $this-&gt;autenticador = new Autenticador($this);
    }

    public function login() {
        return $this-&gt;autenticador-&gt;autentica();
    }

    public function logout() {
        return $this-&gt;autenticador-&gt;fechaSessao();
    }
}</pre>
<p></code></p>
<p>Repare no modelo estático: foi necessário instanciar o antenticador por duas vezes em pontos diferentes. Opa, repetiu ! Mesmo que o autenticador fosse estático, teriamos duplicação, pois teriamos que certificar que o usuário existe e tudo mais. Isso porque não comentei como ficaria o lado cliente dessa implementação estática. O cliente &#8211; seja Controller, WebService ou qualquer classe em outra camada no domínio &#8211; teria que conhecer muita coisa sobre implementação dessa classe para poder manipulá-la.</p>
<p>Como bônus, repare que perdemos neste caso também o Polimorfismo, uma vez que eu poderia ter esse Autenticador() como base de autenticação para qualquer tipo (Usuário, Funcionário, Gerência, Administradores&#8230;)</p>
<p>O uso de métodos ou funções &#8211; sim, há diferença &#8211; estáticas pode ser bem-vindo nos itens já enumerados. Alguns developers porém, ainda que nestes casos são contra o uso por achar a ideia estática demasiadamente anti-oo.</p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/eu-uso-estatico-porque-e-mais-rapido/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Configurando o Zend Debugger</title>
		<link>http://programe.me/configurando-o-zend-debugger/</link>
		<comments>http://programe.me/configurando-o-zend-debugger/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 10:00:31 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Softwares]]></category>
		<category><![CDATA[zend]]></category>
		<category><![CDATA[zend debugger zendstudio]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/configurando-o-zend-debugger/</guid>
		<description><![CDATA[Conforme prometido no Review do Zend Studio 7 , estarei tentando facilitar a configuração do Zend Debugger e também do Zend Studio na máquina. É um processo teoricamente simples e sem mistérios, porém, o que muito vejo são pessoas com dificuldades em utilizá-lo da maneira correta. Acho que falta as vulgas tips para reduzir tais [...]]]></description>
			<content:encoded><![CDATA[<p>Conforme prometido no <a href="http://www.hlegius.pro.br/zend-studio-7-review/" target="_blank">Review do Zend Studio 7</a> , estarei tentando facilitar a configuração do Zend Debugger e também do Zend Studio na máquina.</p>
<p>É um processo teoricamente simples e sem mistérios, porém, o que muito vejo são pessoas com dificuldades em utilizá-lo da maneira correta. Acho que falta as vulgas <em>tips</em> para reduzir tais incidentes.</p>
<p>Vou dividir a configuração básica em duas partes. São elas:</p>
<ol>
<li>Configurando o Zend Debugger no Windows</li>
<li>Configurando o Zend Debugger no Linux</li>
</ol>
<p>Após a configuração particular em cada ambiente, teremos:</p>
<ul>
<li>Configurações no Zend Studio (comum para ambos ambientes)</li>
<li>Configurações na Zend Toolbar</li>
<li>Exemplos de uso</li>
<li>Troubleshoot</li>
</ul>
<p>Note que após baixar o Zend Studio, você não precisará de mais nada pois o pacote de mais de 300MB trás consigo além do Zend Studio os itens:</p>
<ul>
<li>Manual do PHP</li>
<li>Manual do Zend Studio</li>
<li>Zend Debugger (vamos precisar)</li>
<li>Zend Toolbar for Mozilla Firefox, Internet Explorer e Google Chrome (vamos precisar)</li>
<li>PHP 5.2 e PHP 5.3</li>
<li>PHPUnit plugin</li>
<li>Ambiente JRE (Java Runtime Environment - para rodar o Zend Studio)</li>
<li>Todos plugins que o Zend Studio tem por default</li>
</ul>
<p><strong>Nota</strong>: desative quaisquer outros debuggers. Isto inclui o famoso Xdebug. Ao final explico como deixar ambos ativados &#8211; e falo o porque de ambos ativos antes que alguém me xingue =P</p>
<p><strong>1. Configurando o Zend Debugger no Windows</strong></p>
<p>Vou usar aqui a variável <strong>$ZEND_DIR</strong> para designar o caminho até a instalação do Zend Studio. No meu caso é: <em>C:\Program Files\Zend\</em></p>
<p><em> </em>Misteriosamente no Windows a biblioteca ZendDebugger.dll que acompanha o Zend Studio não funciona. Também não é para menos: a disponível no site tem 893kb, contra 132kb da que acompanha o Studio. No Linux isto não ocorre, tornando tudo mais estranho ainda. De qualquer modo, perguntei para eles o motivo.</p>
<p>Então, nosso primeiro passo é baixar o <a title="Download Zend Debugger" href="http://www.zend.com/en/products/studio/downloads" target="_blank">ZendDebugger do site</a> . Após baixar, descompacte o conteúdo em um diretório temporário e copie apenas a biblioteca ZendDebugger.dll para o diretório que você vai criar: $ZEND_DIR\debug. Deverá estar assim:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/windebugger1.PNG"><img class="aligncenter size-medium wp-image-427" title="Diretório após pegar o ZendDebugger" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/windebugger1-300x76.PNG" alt="Diretório após pegar o ZendDebugger" width="300" height="76" /></a></p>
<p>Procure seu arquivo php.ini &#8211; caso não saiba onde esteja um php -i ou rodar o phpinfo() no servidor pode ajudar <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Ao final dele você deve colocar:</p>
<pre>; The section name is optional, but it's always a good idea to add it,
; especially if you are not using a separate file
[Zend]

; This directive needs the full path to the Zend Debugger DLL.
zend_extension_ts="C:\Program Files\Zend\debug\ZendDebugger.dll"

; This directive allows Zend Debugger to start a debug session with:
; 127.0.0.1/32 - Zend Studio on the same computer
; 192.168.0.1/32 - Zend Studio on a computer with IP address 192.168.0.1
; 10.0.0.0/8 - Zend Studio on any computer with IP starting with 10.
zend_debugger.allow_hosts=127.0.0.1/32

; This directive allows Zend Debugger to expose itself
; upon request (this is used in some service functionality).
; The possible options are:
; never - do not expose (default)
; always - expose to whoever wants to know
; allowed_hosts - expose only if the request comes from an IP listed above
zend_debugger.expose_remotely=always</pre>
<p>Certifique-se do caminho correto em <em>zend_extension_ts</em> e em allow_hosts, caso queira adicionar mais IPs, apenas coloque uma virgula separando-os.</p>
<p>Agora procure por:</p>
<pre>; Implicit flush tells PHP to tell the output layer to flush itself
; automatically after every output block.  This is equivalent to calling the
; PHP function flush() after each and every call to print() or echo() and each
; and every HTML block.  Turning this option on has serious performance
; implications and is generally recommended for debugging purposes only.
implicit_flush = On</pre>
<p>Certifique-se que esteja On. Reinicie seu Apache, Lighttpd, IIS,&#8230;</p>
<p>Acessando seu phpinfo() novamente, você deverá ver a entrada do Zend Debugger:</p>
<p><img class="aligncenter size-full wp-image-428" title="PHPinfo - Zend Debugger" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/windebugger2.png" alt="PHPinfo - Zend Debugger" width="359" height="60" /></p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/windebugger3.PNG"><img class="aligncenter size-medium wp-image-429" title="Entrada no phpinfo" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/windebugger3-300x137.PNG" alt="Entrada no phpinfo" width="300" height="137" /></a></p>
<p>Com isto a instalação do Zend Debugger está concluída. Em caso de problemas, certifique-se do caminho até a DLL do ZendDebugger ou ainda tente desativar os debuggers que você possa ter instalado ou ainda <em>extensions</em> adicionais para cache, performance e etc.</p>
<p><strong>2. Configurando o Zend Debugger no Linux</strong></p>
<p>Diferentemente do Windows, a instalação no Linux não requer baixar o ZendDebugger do site, pois a versão que acompanha o Zend Studio funciona perfeitamente igual <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Assumindo $ZEND_DIR como diretório base do Zend Studio. No meu caso é: /usr/local/Zend/</p>
<p>Localize seu php.ini . Como eu instalo tudo separado, o meu encontra-se em /etc/php/php.ini. Você pode usar o comando # find / -name php.ini para localizá-lo ou ainda, rodar o phpinfo() que também serve.</p>
<p>Ao final do arquivo, coloque:</p>
<pre>[Zend]
zend_extension="$ZEND_DIR/ZendStudio-7.1.1/plugins/org.zend.php.debug.debugger.linux.x86_64_5.3.7.v20091116/resources/php5/ZendDebugger.so"
zend_debugger.allow_hosts=127.0.0.1
zend_debugger.expose_remotely=always
[Debugger]
zend_extension_manager.debug_server_ts="$ZEND_DIR/ZendStudio-7.1.1/plugins/org.zend.php.debug.debugger.linux.x86_64_5.3.7.v20091116/resources/php5/"
zend_debugger.expose_remotely=allowed_hosts</pre>
<p>O caminho não há quebra de linha <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Note a versão do meu Zend Studio. Isto pode acabar mudando a versão do plugin também.</p>
<pre> org.zend.php.debug.debugger.linux.x86_64_5.3.7.v20091116</pre>
<p>O seu pode ser bem diferente disto. até o .linux deverá ser semelhante. Depois disto, vem a arquitetura do sistema operacional (aqui é 64bits) a versão do Debugger e por fim a versão de atualização. Com um ls no diretório de plugins você acha a versão correta ao seu caso.</p>
<p>Procure ainda no php.ini por:</p>
<pre>; Implicit flush tells PHP to tell the output layer to flush itself
; automatically after every output block.  This is equivalent to calling the
; PHP function flush() after each and every call to print() or echo() and each
; and every HTML block.  Turning this option on has serious performance
; implications and is generally recommended for debugging purposes only.
implicit_flush = On</pre>
<p>Certifique-se de que esteja On. O comentário acima do comando já diz o porque temos que deixá-lo ativado =P<br />
Salve e reinicie o Apache ou Lighttpd.</p>
<p>Acesse seu phpinfo e você deverá encontrar as seguintes entradas:</p>
<p style="text-align: center;"><img class="aligncenter" title="PHPinfo - Zend Debugger" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/windebugger2.png" alt="PHPinfo - Zend Debugger" width="359" height="60" /></p>
<p style="text-align: center;"><img class="aligncenter" title="Entrada no phpinfo" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/windebugger3-300x137.PNG" alt="Entrada no phpinfo" width="300" height="137" /></p>
<p style="text-align: center;">
<p style="text-align: left;">Com isto sua configuração no Linux está concluída <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: left;">
<p><strong>3. Configurações no Zend Studio</strong></p>
<p>Assumindo que seu Zend Debugger está devidamente instalado, vamos as configurações no Zend Studio:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendstudioconf1.PNG"><img class="aligncenter size-medium wp-image-430" title="Debug conf no Zend Studio" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendstudioconf1-300x261.PNG" alt="Debug conf no Zend Studio" width="300" height="261" /></a>Certifique-se de possuir uma configuração semelhante.</p>
<p>Na linha PHP Debugger, clique em <em>Configure&#8230;</em><br />
Selecione o Zend Debugger na listagem e  clique em <em>Configure</em></p>
<p><em><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendstudioconf2.PNG"><img class="aligncenter size-medium wp-image-431" title="Zend Debugger" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendstudioconf2-300x277.PNG" alt="Zend Debugger" width="300" height="277" /></a> </em></p>
<p>Mantenha essa configuração. Muito provavelmente você não precisará editar nada. Atenção apenas para o Client Host/IP:</p>
<p>Retornando à primeira tela, agora na linha<strong> Server:</strong> clique em <em>PHP Servers&#8230;<br />
</em>Selecione <strong>Default PHP Web Server</strong> e clique em <em>Edit</em><em> </em></p>
<p><em><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendstudioconf3.PNG"><img class="aligncenter size-medium wp-image-432" title="Path Map configuration" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendstudioconf3-300x281.PNG" alt="Path Map configuration" width="300" height="281" /></a> </em></p>
<p>Muita atenção nesta parte: tudo que estiver listado ali será reconhecido pelo Zend Debugger como parte do projeto e portanto passível de debugar. O que não constar ali ele simplemente terá como &#8220;ok&#8221; e mesmo que você venha a colocar um breakpoint no código que não está contido no Path Mapping, ele irá ignorá-lo.</p>
<p>Por padrão, todo projeto que você cria no Zend Studio, ele automaticamente seta o próprio projeto na lista, e cada projeto tem o seu próprio Path Mapping. Por isso mesmo eu com 6 projetos setados na minha Workspace ele apenas está listando o projeto que está atualmente aberto. Caso eu abra e peça para ele debugar outro projeto, ele adiciona a lista esse meu outro projeto automaticamente.</p>
<p>Certo. Se ele adiciona automaticamente porque tenho que saber disto ?<br />
Simples ! Você pode estar usando bibliotecas de terceiros ou usando sua própria biblioteca e não tê-la incluida ali significa que o Zend Studio não irá debugá-la.</p>
<p>Para finalizar, copie o <a href="http://gpl.hlegius.pro.br/coding/dummy.phps" target="_blank">conteúdo que coloquei online</a> e salve-o como <strong>dummy.php</strong> na raiz de seu Servidor HTTP. Ele deverá estar acessível através do http://seuip/dummy.php e não é necessário colocar um em cada projeto, porém se você usa virtualhosts deverá ser um por virtualhost. Sem isto, o Debugger não funciona. A Zend disponibiliza este arquivo porém eu não me recordo se vem com o ZendDebugger ou se eu o peguei de outra fonte no site deles.</p>
<p>Neste ponto você já pode debugar um Script PHP ou uma URL que você forneça. Explicarei isto mais abaixo na parte <em>Exemplos de uso.</em></p>
<p><em> </em></p>
<p><strong>4. Configurando o Zend Toolbar<em> </em></strong></p>
<p>Durante a instalação ele configura a Zend Toolbar para o Internet Explorer. Para configurá-la no Firefox é simples:</p>
<p>Com o browser aberto acesse o caminho: $ZEND_DIR/ZendStudio-(sua_versao)/toolbars e clique em <em>ZendFirefoxToolbar-2.2.xpi.<br />
</em>Instale e reinicie o Mozilla Fx.<em><br />
</em></p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendtoolbar1.PNG"><img class="aligncenter size-medium wp-image-433" title="Instalando a Zend Toolbar" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendtoolbar1-300x124.PNG" alt="Instalando a Zend Toolbar" width="300" height="124" /></a></p>
<p>Após reiniciar o Firefox e com o Zend Studio aberto, vá na ZendToolbar em <strong><em>Extra Stuff -&gt; Settings</em></strong></p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendtoolbar2.PNG"><img class="aligncenter size-full wp-image-434" title="ZendToolbar configs" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendtoolbar2.PNG" alt="ZendToolbar configs" width="410" height="428" /></a></p>
<p>Certifique-se do caminho setado em <em>Zend Studio Executable </em>que geralmente vem errado <img src='http://programe.me/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  e o Zend Studio Broadcasting Port que deverá ser igual ao meu.<br />
Após isto, clique em Test e o resultado deverá ser:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendtoolbar3.PNG"><img class="aligncenter size-full wp-image-435" title="Zend Toolbar ok" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendtoolbar3.PNG" alt="Zend Toolbar ok" width="401" height="239" /></a></p>
<p>Com isto a configuração do Zend Studio, Zend Debugger e Zend Toolbar estão concluídas.</p>
<p><strong>5. Exemplos de uso</strong></p>
<p>Para exemplificar melhor, vamos criar um pequeno projeto no Zend Studio.<br />
<strong>New -&gt; PHP Project </strong></p>
<p>Coloque o nome Zend ou qualquer outro e finalize.</p>
<p>Ele terá três arquivos: São eles: <a href="http://gpl.hlegius.pro.br/coding/zendstudio-example/Foobar.phps" target="_blank">Foobar.php</a> <a href="http://gpl.hlegius.pro.br/coding/zendstudio-example/Finaliza.phps" target="_blank">Finaliza.php</a> e <a href="http://gpl.hlegius.pro.br/coding/zendstudio-example/index.phps" target="_blank">index.php</a> . Salve-os em seu projeto.</p>
<p>Acesse http://seuip/projeto/index.php com o Mozilla Firefox. Deverá aparecer na tela o conteúdo:</p>
<pre>Uma string qualquerFinalizando</pre>
<p>Agora, clique em Debug na Zend Toolbar. Talvez ele pergunte sobre abrir a perspectiva de Debugging. Marque para sempre tomar esta ação e dê ok.</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio.png"><img class="aligncenter size-medium wp-image-438" title="PHP Debug Perspective" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio-300x169.png" alt="PHP Debug Perspective" width="300" height="169" /></a></p>
<p>Note que ele está parado na primeira linha do arquivo:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio2.png"><img class="aligncenter size-full wp-image-439" title="ZendDebug" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio2.png" alt="ZendDebug" width="323" height="218" /></a></p>
<p>Suas opções são:</p>
<ul>
<li>F5: entra no método/classe que esteja dentro do seu Path Mapping. Caso não esteja, ele executa a ação normalmente e vai para a próxima instrução.</li>
<li>F6: executa a linha corrente e segue para a próxima instrução</li>
<li>F7: executa a linha corrente e sobe um nível (usando quando você aperta F5 sem querer :p)</li>
<li>F8: executa todo até encontrar um <em>breakpoint</em></li>
<li><em>Ctrl + F2: mata a sessão de debugging sem finalizar o script.</em></li>
</ul>
<p>Estas opções que listei, você encontrará na barra que está na aba Debug.</p>
<p style="text-align: center"><img class="aligncenter" title="Zend Toolbar" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio3.png" alt="Zend Toolbar" width="280" height="38" /></p>
<p style="text-align: left">Aperte F6 até ele ficar sobre a linha 6, $objFoo = new Foobar(); e então, aperte F5.<a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio4.png"><img class="aligncenter size-full wp-image-442" title="Zend Debug" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio4.png" alt="Zend Debug" width="479" height="175" /></a>Note que ele abriu a classe <em>Foobar</em> e parou sobre a primeira linha dentro do construtor da classe. Repare na aba <strong>Variables</strong> que até aquele ponto, a variável membro <em>baz</em> está nula.</p>
<p style="text-align: left"><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio5.png"><img class="aligncenter size-full wp-image-443" title="Zend Debug" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio5.png" alt="Zend Debug" width="432" height="144" /></a></p>
<p style="text-align: left">Pressionando novamente F5 ou F6, você será enviado para a linha que contém a chave que fecha o método construtor. Neste ponto, <em>baz</em> possui o valor <em>bar</em> que contém três caracteres.</p>
<p style="text-align: left">Apertando F6 ou F5 novamente, ele retornará a index.php sob a linha $objFoo-&gt;finaliza(). Caso decida pelo F5, ele entrará no método. Caso F6, ele executará a ação do método (e seus subníveis) e passará para a próxima instrução &#8211; que em nosso caso seria a próxima linha.</p>
<p style="text-align: left">Siga com F5 ou F6 até o término do script para acompanhar a evolução e modificação das variáveis.</p>
<p style="text-align: left"><strong>Breakpoints</strong></p>
<p style="text-align: left">Quem nunca usou um debug, talvez não conheça o que venha a ser um breakpoint. Ele na forma literal é um ponto de parada do debug <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: left">Vamos como exemplo, setar um na classe Foobar na linha 20. Para tal, você pode clicar duas vezes ao lado do número que identifica a linha ou então, com o cursor sobre a linha usar <em>Ctrl + Shift + B</em></p>
<p style="text-align: left"><em><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio6.png"><img class="aligncenter size-full wp-image-444" title="Zend Debug" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio6.png" alt="Zend Debug" width="312" height="124" /></a></em>Um ponto ficará ao lado da linha identificando que há um breakpoint ativo. Novamente clique em Debug na toolbar. Ao abrir o Debug na primeira linha, pressione F8. Ele deverá parar sob nosso breakpoint.</p>
<p style="text-align: left"><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio7.png"><img class="aligncenter size-full wp-image-445" title="Zend Debug" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio7.png" alt="Zend Debug" width="412" height="192" /></a><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio8.png"><img class="aligncenter size-full wp-image-446" title="Zend Debug" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio8.png" alt="Zend Debug" width="327" height="131" /></a><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio9.png"><img class="aligncenter size-full wp-image-447" title="Zend Debug" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio9.png" alt="Zend Debug" width="260" height="76" /></a></p>
<p style="text-align: left">Na aba Breakpoints você pode desativar ou remover os breakpoints setados sem necessitar abrir arquivo por arquivo para removê-los.<br />
É possível definir condição para que o Debugger pare sobre determinado breakpoint. Para definir a condicional, clique com o botão direito sobre o breakpoint e vá em <em>breakpoint properties</em>.
</p>
<p style="text-align: left">
<p style="text-align: left">Ao lado do botão Debug na Zend Toolbar, há o <em>Debug Menu</em> . Nele há quatro opções: <strong>Current Page; Next Page; All forms (POST) in this site; All pages in this site</strong>. Recomendo que crie formulários, teste em chamadas Ajax, iframes (argh!), redirecionamentos HTTP e tudo mais que use no seu dia-a-dia. O Debugger pega qualquer ação no browser <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: left">E como brinde por ter configurado o Zend Debugger, você tem o Profile da página atual. Bastando para tal clicar em Profile.</p>
<p style="text-align: left"><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio10.png"><img class="aligncenter size-medium wp-image-448" title="Zend Profiler" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio10-300x214.png" alt="Zend Profiler" width="300" height="214" /></a>Enjoy <img src='http://programe.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: left">
<p><strong>6. Troubleshoot</strong></p>
<p><strong>Habilitando o Xdebug junto com o Zend Debugger</strong></p>
<p>A utilidade disto é que o Xdebug fornece recursos como: highlight de variáveis var_dump() &#8211; que não vamos mais usá-la como debugger &#8211; controle contra loopings infinitos, o trace completo quando encontramos Warning ou Fatal Errors e alguns outros mimos que o Zend Debugger não trás &#8211; ou eu os desconheço <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Para habilitar ambos, abra seu php.ini. E mude a entrada do Xdebug de:</p>
<pre>;zend_extension=php_xdebug.dll</pre>
<p>para</p>
<pre>extension=php_xdebug.dll</pre>
<p>O mesmo vale para a versão Linux, mudando apenas para .so</p>
<p><strong>Ele não para sob os breakpoints que setei</strong></p>
<p>Verifique o Path Mapping se o mesmo contém seu projeto listado. Caso não, adicione manualmente o projeto ao Path Mapping e tente novamente.</p>
<p><strong>Uso biblioteca externa &#8211; Propel, Symfony, Zend.. e toda vez que chamo o debugger recebo a tela</strong>:<a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zenddebuggererror.jpg"><img class="aligncenter size-medium wp-image-449" title="Path Mapping with external libs" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zenddebuggererror-300x242.jpg" alt="Path Mapping with external libs" width="300" height="242" /></a>O problema é novamente o <strong>Path Mapping</strong>. Adicione o caminho da sua lib externa ao Path Mapping (veja como na sessão de configuração do Zend acima) e tente novamente.</p>
<p>Para finalizar&#8230;</p>
<p>Há um <a href="http://forums.zend.com/viewtopic.php?f=59&amp;t=962" target="_blank">excelente artigo em inglês</a> que explica como configurar o ZendDebugger no Linux e Windows e ainda explica o funcionamento do Debugger sobre a aplicação web. Vale a pena a leitura.</p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/configurando-o-zend-debugger/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ele, o Windows 7</title>
		<link>http://programe.me/ele-o-windows-7/</link>
		<comments>http://programe.me/ele-o-windows-7/#comments</comments>
		<pubDate>Sun, 01 Nov 2009 01:51:53 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Review]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=377</guid>
		<description><![CDATA[Creio que nunca comentei ou fiz review de Windows em toda minha pseudo-vida na Internet. Até por quê, nunca fui um dos melhores usuários da empresa de Redmond. Com o recente lançamento do Windows 7 e seus vários comentários positivos sobre o tal, resolvi arriscar. Até demais ! Comprei uma licença do Windows 7 Home [...]]]></description>
			<content:encoded><![CDATA[<p>Creio que nunca comentei ou fiz review de Windows em toda minha pseudo-vida na Internet. Até por quê, nunca fui um dos melhores usuários da empresa de Redmond.</p>
<p>Com o recente lançamento do Windows 7 e seus vários comentários positivos sobre o tal, resolvi arriscar. Até demais ! Comprei uma licença do Windows 7 Home Premium para, digamos, testar.</p>
<p><img src="http://farm3.static.flickr.com/2470/4039638557_cf198e48d7.jpg" alt="Windows 7 Home Premium" /></p>
<p>Esse teste custou-me R$ 399,00 com frete grátis pela Fnac.</p>
<p>Instalação super tranquila. A instalação <em>Microsoftana</em> de sempre desde a era Windows XP. Umas perguntinhas aqui e ali e voilà, instalado !</p>
<p>Nem vou comentar o que todos os blogs tem falado por aí. Leia-se: barra de tarefas baseada em ícones e agrupadas por tipo; efeitos do Aero; Kernel (monotílico), mas com um baita refactoring; Indexação de arquivos para pesquisa; Usuários e Grupos herdados dos Windows versão Servidor (Unix, alguém ?).</p>
<p>O ponto principal é: após usá-lo por quase uma semana, travei ele apenas uma vez usando loop infinito, diga-se de passagem e assumo dizer que nem foi totalmente culpa do Windows. Tudo bem que ele como carro-chefe, deveria impedir loop do tipo &#8220;ao infinito e além&#8221; mas enfim (..).</p>
<p>Eu <strong>nunca</strong> gostei do desempenho do Windows. Fato ! Não conseguia deixar a máquina ligada e trabalhar sem perder um baita desempenho depois de algumas horas manipulando arquivos e alternando entre aplicações. No Windows 7, porém, foi diferente. Excelente desempenho. Eu como usuário Linux desde 2004, assumo: está usável, estável e &#8220;leve&#8221;. Leve entre aspas, pois está consumindo 1GB de ram neste momento. Mas como o notebook possui 4GB, isto não é um problema.</p>
<h4>Segurança</h4>
<p>Ainda não tive a oportunidade de colocá-lo à prova de fogo, mas só do fato de haver usuários e grupos &#8211; sim, existem desde a era NT, mas está BEM evoluída no Windows 7 &#8211; já livra uma boa !<br />
Setei meu usuário diário como &#8220;usuário padrão&#8221; vulgo: limitado e criei uma conta &#8220;root&#8221; com senha e definida para Administrador e pronto. Tentei instalar programas, acessar áreas do Windows, remover aplicações ou até fazer um auto-update no Opera que ele exibe a caixa de aviso pedindo a senha do usuário &#8220;root&#8221; para poder continuar. Meu usuário não tem permissão de escrita no diretório C:\Windows, C:\Arquivos de Programas e etc. </p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2009/10/security.PNG"><img src="http://www.hlegius.pro.br/wp-content/uploads/2009/10/security-212x300.PNG" alt="Windows 7 - Permissions window" title="Windows 7 - Permissions window" width="212" height="300" class="aligncenter size-medium wp-image-389" /></a></p>
<p>Caso levado a risca, isso eliminaria o problema de vírus no núcleo do sistema e eliminaria boa parte das ameaças, uma vez que todos crackers querem colocar um msfoobar.exe dentro de \Windows\System32 =P</p>
<h4>Recursos</h4>
<p>Windows é Microsoft. Veio o Windows e algumas coisas básicas com o Paciência <img src='http://programe.me/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2009/10/backup.PNG"><img src="http://www.hlegius.pro.br/wp-content/uploads/2009/10/backup-300x201.PNG" alt="Windows 7 - backup system" title="Windows 7 - backup system" width="300" height="201" class="aligncenter size-medium wp-image-385" /></a></p>
<p>Um recurso <em>nice</em> que encontrei foi o sistema de backup melhor desenvolvido pela primeira vez !<br />
Ele detecta unidade de armazenamento removível e prepara todo um backup onde você pode definir os locais ou apenas aceitar os propostos pelo S.O. É possível agendar datas e fazer um backup recorrente.</p>
<p>O Paint foi melhorado. Uma aplicação largada ao vento desde o Windows 2000, foi finalmente melhorada com mais recursos úteis e vísiveis <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Em adicional, criaram uma aplicaçãozinha voltada à screenshot. Gostei !</p>
<h4>Sistema</h4>
<p>O Prefetch funciona maravilhosamente bem. Deixa em memória (e também faz preload) das libraries mais utilizadas, facilitando assim o carregamento da mesma. Para poder aproveitar isto <strong>sem deixar a máquina ligada eternamente</strong> basta ter memória de gente grande (com 2GB você já poderá perceber a diferença &#8211; boa &#8211; no desempenho)</p>
<p>O sistema de Update e notificações está mais espertinho. Nada de extraordinário, mas está melhor.</p>
<p>Quanto à drivers para o meu hardware, sem problema algum. Funcionou bem. O som não foi detectado pelo Windows 7, mas com o driver para Windows Vista funcionou perfeitamente. Windows 7 talvez seja o SP2 do Windows Vista =P</p>
<p>Ele faz Ghost do estado do sistema operacional para poder recuperar caso algo de errado. A Microsoft teme que o Windows deixe alguém na mão, logo, já deixa isso ativado por padrão. Eu removi <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Compatibilidade</strong>: com aplicações de meu uso, perfeito. Inclui: Office 2007; IDE de desenvolvimento em PHP (Zend Studio); Apache, PHP &#8211; que inclusive a Microsoft está tentando uma paz na guerra fria =X &#8211; PostgreSQL/MySQL, ferramenta de aúdio e vídeo, enfim.. não testei jogos, afinal, nem é minha praia esse tipo de coisa.</p>
<p>Como um usuário Linux há 5 anos, digo que o Windows 7 me surpreendeu muito. A empresa de Redmond finalmente criou algo de <em>macho pra carilha</em> ! <strike>É, não chega a tanto.</strike></p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/ele-o-windows-7/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Zend Certified Engineer</title>
		<link>http://programe.me/zend-certified-engineer/</link>
		<comments>http://programe.me/zend-certified-engineer/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 23:25:40 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=351</guid>
		<description><![CDATA[Depois de quase um ano enrolando para tentar a prova de certificação da Zend, eu tomei coragem e no sábado, 15 de agosto deste ano, eu finalmente fui fazer a prova no Centro de Testes autorizado da Vue, no Senac, em São Paulo. O check-in para a prova é um pouco tenso colocando ainda mais [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de quase um ano enrolando para tentar a prova de certificação da Zend, eu tomei coragem e no sábado, 15 de agosto deste ano, eu finalmente fui fazer a prova no Centro de Testes autorizado da Vue, no Senac, em São Paulo.</p>
<p>O check-in para a prova é um pouco tenso colocando ainda mais medo em quem vai fazer a prova. Documentos em inglês, assinar em três lugares diferentes, marcar hora de entrada, guardar itens no guarda-volumes e entrar liso, apenas com o crachá da instituição em uma baiazinha apertada de 1x1 metro quadrado onde mal cabe você e o computador.</p>
<p>Essa baia tem um além do PC - totalmente travado e rodando Windows 2000 - um fone para os ruídos externos não atrapalhar-te durante a prova. Bem acima há uma câmera filmando todas suas ações e a única coisa permitida é utilizar o teclado, mouse e uma folha de anotações com apagador e canetão para lousa.</p>
<p>Na minha prova, resumidamente caiu: <strong>PHP 4, 5, diferenças entre 4 e 5 e uma pergunta de PHP 3</strong>. Design patterns caiu umas quatro ou cinco questões. Admito que era necessário pensar, não era perguntinha boba como do tipo: <em>"o padrão que faz tal coisa é : ..., ..., ..."</em>. Era necessário analisar a melhor solução com as patterns lá descrimidas e fazer sua escolha. Gostei dessa parte <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Havia perguntas cabulosas onde era alterada várias vezes e de várias formas um objeto copiando, referênciando e tudo mais; para no fim ele requerer a saída de todas variáveis que aquele objeto teve durante o ciclo de vida.</p>
<p>Caiu coisas sobre segurança, PDO, SQLite, perguntas específicas de banco de dados - coisas como definir transação, prepared-statements, ... - comparação de tipos, coisas sobre arrays e refatoração de código. Neste último ele fornecia um código legado em PHP 4 e pedia a versão em PHP 5. Nada complexo, coisas simples, somente para testar se você conhece PHP4 <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>O tempo de prova é excelente. 90 minutos para 70 questões. Eu finalizei a prova restando pouco mais de 40 minutos. Super tranquilo. Fiz sem pressa, na calma, lendo e pensando nas soluções.</p>
<p>É totalmente permitido pular questões e depois voltar nelas, porém, não fiz isto. Fui na sequência. Direto !</p>
<p>Ao fim, ele mostra as questões que possívelmente não tenham sido respondidas e pergunta se você quer finalizar a prova. Clicando que sim, ele confirma novamente e informa que não há mais volta :O</p>
<p>Ao confirmar novamente, aparece uma barrinha de "loading...". Ela ficou por alguns segundos, que mais pareciam uma eternidade. Respirei fundo e olhei para a tela novamente. Vi em negrito e em h1: <strong>Congratulations ! You passed</strong> (..) [alguma coisa a mais que eu nao lembro]</p>
<p>Respiro de alívio e ao mesmo tempo ergui as mãos e falei meio que sem voz: <em>Eu consegui !</em></p>
<p>Saí da salinha mais do que depressa e ao chegar na recepção já havia um<a href="http://www.flickr.com/photos/hlegius/3823797858/" target="_blank"> "comprovante" da prova </a>informando que eu havia passado<em>, </em>com data, hora<em> </em>e meu código da prova.</p>
<p>Agora estou esperando chegar a certificação pelos correios e pelo que andei olhando no Flickr, junto virá um adesivo Zend Certified PHP 5 para eu colar <span style="text-decoration: line-through;">na testa </span>onde quiser.</p>
<p>A prova exige que você tenha vivência com a linguagem. Não adianta "decorar", comer livros ou fazer cursos de verão. Esqueçam. Precisa saber o que acontece quando as coisas dão certo e principalmente: o comportamento das coisas quando dão errado. Como por exemplo:</p>
<div class="igBar"><span id="lcode-2"><a href="#" onclick="javascript:showPlainTxt('code-2'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-2">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;?php </div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">$arrFake = <span style="color:#CC0000;">"aqui era para ser um array, mas não é. Qual é o resultado ?"</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">echo count<span style="color:#006600; font-weight:bold;">&#40;</span>$arrFake<span style="color:#006600; font-weight:bold;">&#41;</span>; ?&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Você pode - e deve - pesquisar por simulados online e realizar testes com a linguagem. A melhor coisa que você pode fazer é ler o manual do PHP. Melhor fonte para aprender bem o PHP. Há também o <a href="http://www.zend.com/store/education/certification/self-test.php">Zend Self-test</a> que você poderá tentar também.</p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/zend-certified-engineer/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

