<?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://www.hlegius.pro.br/category/featured-articles/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.hlegius.pro.br</link>
	<description>programação, desenvolvimento, tecnologia e muito o que contar.</description>
	<lastBuildDate>Thu, 19 Aug 2010 11:28:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Procura-se o Programador Sênior</title>
		<link>http://www.hlegius.pro.br/procura-se-o-programador-senior/</link>
		<comments>http://www.hlegius.pro.br/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 há seis [...]]]></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://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.hlegius.pro.br/procura-se-o-programador-senior/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ser programador</title>
		<link>http://www.hlegius.pro.br/ser-programador/</link>
		<comments>http://www.hlegius.pro.br/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 HTTP [...]]]></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://www.hlegius.pro.br/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://www.hlegius.pro.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.hlegius.pro.br/ser-programador/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Eu uso estático porque é mais rápido.</title>
		<link>http://www.hlegius.pro.br/eu-uso-estatico-porque-e-mais-rapido/</link>
		<comments>http://www.hlegius.pro.br/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() {
   [...]]]></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://www.hlegius.pro.br/eu-uso-estatico-porque-e-mais-rapido/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Configurando o Zend Debugger</title>
		<link>http://www.hlegius.pro.br/configurando-o-zend-debugger/</link>
		<comments>http://www.hlegius.pro.br/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 incidentes.
Vou [...]]]></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://www.hlegius.pro.br/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://www.hlegius.pro.br/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://www.hlegius.pro.br/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://www.hlegius.pro.br/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://www.hlegius.pro.br/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://www.hlegius.pro.br/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://www.hlegius.pro.br/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://www.hlegius.pro.br/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://www.hlegius.pro.br/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://www.hlegius.pro.br/configurando-o-zend-debugger/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ele, o Windows 7</title>
		<link>http://www.hlegius.pro.br/ele-o-windows-7/</link>
		<comments>http://www.hlegius.pro.br/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 Premium [...]]]></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://www.hlegius.pro.br/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://www.hlegius.pro.br/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://www.hlegius.pro.br/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://www.hlegius.pro.br/ele-o-windows-7/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Zend Certified Engineer</title>
		<link>http://www.hlegius.pro.br/zend-certified-engineer/</link>
		<comments>http://www.hlegius.pro.br/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 medo [...]]]></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://www.hlegius.pro.br/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://www.hlegius.pro.br/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://www.hlegius.pro.br/zend-certified-engineer/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Alternativa ao Cron Jobs em PHP</title>
		<link>http://www.hlegius.pro.br/alternativa-ao-cron-jobs-em-php/</link>
		<comments>http://www.hlegius.pro.br/alternativa-ao-cron-jobs-em-php/#comments</comments>
		<pubDate>Sat, 28 Mar 2009 01:25:25 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Desenvolvimento]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=326</guid>
		<description><![CDATA[Salve !
Sabe aquelas vezes em que você precisa realizar tarefas demoradas no browser do cliente e então você lembra do maravilhoso Cron Jobs ? Pois é, uma excelente ferramenta a nossa disposição. Entretanto, às vezes, certas empresas de hosting (Locaweb é uma) define um horário para funcionamento destas "tarefas agendadas". No caso da Locaweb é [...]]]></description>
			<content:encoded><![CDATA[<p>Salve !</p>
<p>Sabe aquelas vezes em que você precisa realizar tarefas demoradas no browser do cliente e então você lembra do maravilhoso Cron Jobs ? Pois é, uma excelente ferramenta a nossa disposição. Entretanto, às vezes, certas empresas de hosting (Locaweb é uma) define um horário para funcionamento destas "tarefas agendadas". No caso da Locaweb é das 2 às 3 da matina apenas.</p>
<p>Mas, mas e agora ? Como executar a tal sonhada tarefa "em background" quando não há o Cron Jobs como opção ?</p>
<h3>Um pouco de história</h3>
<p>Sabemos muito bem que o PHP é <em>server-side</em> e isso significa que o PHP roda no servidor e não no cliente como o Javascript, por exemplo. Entretanto, logo quando eu comecei a programar com PHP eu me perguntava o motivo pelo qual o script era interrompido ao clicar no botão Stop do browser ou então quando eu o fechava já que a ação era no cliente e não no servidor. Tempos depois descobri que nestes eventos, era enviada uma informação ao servidor PHP (via TCP, claro) que de o usuário "abortou" a conexão com ele e o PHP bem esperto que é, parava aquela tarefa.</p>
<h3>Entretanto...</h3>
<p>O PHP nos permite manipular esse comportamento, ou seja, posso dizer ao PHP que eu quero continuar executando o script mesmo se o cliente nos <em>deixar na voz</em> ! Como uma imagem vale mais do que mil palavras, deixo aos senhores um pequeno vídeo que fiz demonstrando o funcionamento:</p>
<p><object width="590" height="422"><param name="movie" value="http://www.youtube.com/v/kJT2rEK7mvo&#038;hl=pt-br&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/kJT2rEK7mvo&#038;hl=pt-br&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="590" height="422"></embed></object></p>
<p>Perceba que caso queira redirecionar o usuário para outra página e continuar trabalhando naquela tarefa, você precisa manipular o buffer e os headers da página da forma como coloquei no script, caso contrário, ele irá processar todo o conteúdo e depois sim, redirecionar. Isto por quê, como não estamos enviando nada diretamente ao browser, o Apache espera uma quantidade de dados enviados antes de processar quaisquer headers. Com as <a href="http://br.php.net/manual/en/ref.outcontrol.php" target="_blank">funções de buffer do PHP</a> nós podemos mudar também esse comportamento, forçando-lhe a obedecer o header (Location).</p>
<p>Deixo abaixo o código dos dois arquivos usados no vídeo:</p>
<div class="igBar"><span id="lcode-5"><a href="#" onclick="javascript:showPlainTxt('code-5'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-5">
<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;"><span style="color:#008000;">/**</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;"><span style="color:#008000;"> * Connection Handler</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> * @author Hélio Costa e Silva &lt;helio@hlegius.pro.br&gt;</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;"><span style="color:#008000;"> * @version 27/03/2009</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> *</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;"><span style="color:#008000;"> * @internal teste</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> */</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;">ob_start<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">ignore_user_abort<span style="color:#006600; font-weight:bold;">&#40;</span>true<span style="color:#006600; font-weight:bold;">&#41;</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;">$n = <span style="color:#800000;color:#800000;">1</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</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;">do <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; error_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">'Sequência '</span> . $n . <span style="color:#CC0000;">"<span style="color:#000099; font-weight:bold;">\n</span>"</span>, <span style="color:#800000;color:#800000;">3</span>, <span style="color:#CC0000;">'foobar.txt'</span><span style="color:#006600; font-weight:bold;">&#41;</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;">&nbsp; &nbsp; $n++;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; sleep<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#800000;color:#800000;">1</span><span style="color:#006600; font-weight:bold;">&#41;</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;">&nbsp; &nbsp; flush<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</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;">&nbsp; &nbsp; if <span style="color:#006600; font-weight:bold;">&#40;</span>$n&gt; <span style="color:#800000;color:#800000;">35</span><span style="color:#006600; font-weight:bold;">&#41;</span> break;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span> while <span style="color:#006600; font-weight:bold;">&#40;</span>true<span style="color:#006600; font-weight:bold;">&#41;</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;">?&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<div class="igBar"><span id="lcode-6"><a href="#" onclick="javascript:showPlainTxt('code-6'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-6">
<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;"><span style="color:#008000;">/**</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;"><span style="color:#008000;"> * Connection Handler</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> * @author Hélio Costa e Silva &lt;helio@hlegius.pro.br&gt;</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;"><span style="color:#008000;"> * @version 27/03/2009</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> *</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;"><span style="color:#008000;"> * @internal teste</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> */</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;">$n = <span style="color:#800000;color:#800000;">30</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</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;">do <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; if <span style="color:#006600; font-weight:bold;">&#40;</span>$n == <span style="color:#800000;color:#800000;">36</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</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;">&nbsp; &nbsp; &nbsp; &nbsp; header <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"Location: http://localhost/estudos/"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; ob_end_clean<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</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;">&nbsp; &nbsp; &nbsp; &nbsp; header <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"Connection: close"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; ignore_user_abort<span style="color:#006600; font-weight:bold;">&#40;</span>true<span style="color:#006600; font-weight:bold;">&#41;</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;">&nbsp; &nbsp; &nbsp; &nbsp; ob_start<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; header<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"Content-Length: 0"</span><span style="color:#006600; font-weight:bold;">&#41;</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;">&nbsp; &nbsp; &nbsp; &nbsp; ob_end_flush<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; flush<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</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;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#FF9933; font-style:italic;">// Se houver sessões em aberto, usar também:</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#FF9933; font-style:italic;">//session_write_close();</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;"><span style="color:#FF9933; font-style:italic;">// Sugestão feita pelo usuário em:</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#FF9933; font-style:italic;">// http://br.php.net/manual/en/features.connection-handling.php</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;">&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</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;">&nbsp; &nbsp; error_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">'Redirecionado '</span> . $n . <span style="color:#CC0000;">"<span style="color:#000099; font-weight:bold;">\n</span>"</span>, <span style="color:#800000;color:#800000;">3</span>, <span style="color:#CC0000;">'foobar.txt'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; $n++;</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;">&nbsp; &nbsp; sleep<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#800000;color:#800000;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</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;">&nbsp; &nbsp; if <span style="color:#006600; font-weight:bold;">&#40;</span>$n&gt; <span style="color:#800000;color:#800000;">65</span><span style="color:#006600; font-weight:bold;">&#41;</span> break;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span> while <span style="color:#006600; font-weight:bold;">&#40;</span>true<span style="color:#006600; font-weight:bold;">&#41;</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;">?&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>E também, o <a href="http://helio.hlegius.pro.br/hlegius-ignore_user_abort_php.ogv">vídeo original no formato OGV</a>.</p>
<p><strong>Mais informações:</strong></p>
<ul>
<li><a href="http://br.php.net/ignore_user_abort" target="_blank">http://br.php.net/ignore_user_abort</a></li>
<li><a href="http://br.php.net/manual/en/features.connection-handling.php" target="_blank">http://br.php.net/manual/en/features.connection-handling.php</a></li>
</ul>
<p><em>Nota</em>: o programa usado para gravar foi o <strong>qt-RecordMyDesktop</strong> para Linux.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hlegius.pro.br/alternativa-ao-cron-jobs-em-php/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Exceptions. Pois nem tudo é perfeito</title>
		<link>http://www.hlegius.pro.br/exceptions-pois-nem-tudo-e-perfeito/</link>
		<comments>http://www.hlegius.pro.br/exceptions-pois-nem-tudo-e-perfeito/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 14:44:10 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Segurança]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=313</guid>
		<description><![CDATA[Salve !
Pense numa rotina que desenvolveu. Qualquer uma ! Agora tente se recordar de quantas formas ela poderia ser quebrada pelo usuário, gerando assim algo inexperado na sua aplicação fazendo com que você retornasse um erro para o cliente.
E qual é a forma que você utiliza para retornar estes erros ? Veja, eu posso ajudar [...]]]></description>
			<content:encoded><![CDATA[<p>Salve !</p>
<p>Pense numa rotina que desenvolveu. Qualquer uma ! Agora tente se recordar de quantas formas ela poderia ser quebrada pelo usuário, gerando assim algo inexperado na sua aplicação fazendo com que você retornasse um erro para o cliente.</p>
<p>E qual é a forma que você utiliza para retornar estes erros ? Veja, eu posso ajudar a recordar você:</p>
<div class="igBar"><span id="lcode-11"><a href="#" onclick="javascript:showPlainTxt('code-11'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-11">
<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;">function foobar<span style="color:#006600; font-weight:bold;">&#40;</span>$nome<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</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;">&nbsp; &nbsp; &nbsp;if <span style="color:#006600; font-weight:bold;">&#40;</span>strlen<span style="color:#006600; font-weight:bold;">&#40;</span>$nome<span style="color:#006600; font-weight:bold;">&#41;</span> &lt;<span style="color:#800000;color:#800000;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -<span style="color:#800000;color:#800000;">1</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;">&nbsp; &nbsp; &nbsp;if <span style="color:#006600; font-weight:bold;">&#40;</span>strpos<span style="color:#006600; font-weight:bold;">&#40;</span>$nome,<span style="color:#CC0000;">"foo"</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -<span style="color:#800000;color:#800000;">2</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;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;echo $nome;</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;">&nbsp; &nbsp; &nbsp;return <span style="color:#800000;color:#800000;">0</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</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;">?&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Com isso lá na sua Action você fica fazendo malabarismo para encontrar o erro retornado e gerar a mensagem para o usuário. Não demorará muito para você criar sua tabela de erro:</p>
<ul>
<li>-1 para erros de entrada</li>
<li>-2 para erros de máscara</li>
<li>-3 para calcúlos errados</li>
<li>-4 para usuário não logado</li>
<li>-5 ....</li>
<li>-7634 ....</li>
</ul>
<p>Realmente, bem simples assim né ? Só consultar a tabela e mandar bala.</p>
<p>Eu realmente não entendo o motivo de muitos não utilizarem a<a href="http://br.php.net/exception" target="_blank"> classe nativa de exceções do PHP</a>. É simples, é funcional e<em> de grátis</em> você não precisa montar sua tabelinha de códigos de erro.</p>
<p>Veja o mesmo código reescrito utilizando a tal classe:</p>
<div class="igBar"><span id="lcode-12"><a href="#" onclick="javascript:showPlainTxt('code-12'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-12">
<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;">function foobar<span style="color:#006600; font-weight:bold;">&#40;</span>$nome<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</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;">&nbsp; &nbsp; &nbsp;if <span style="color:#006600; font-weight:bold;">&#40;</span>strlen<span style="color:#006600; font-weight:bold;">&#40;</span>$nome<span style="color:#006600; font-weight:bold;">&#41;</span> &lt;<span style="color:#800000;color:#800000;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw new Exception <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"O nome não é válido !"</span><span style="color:#006600; font-weight:bold;">&#41;</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;">&nbsp; &nbsp; &nbsp;if <span style="color:#006600; font-weight:bold;">&#40;</span>strpos<span style="color:#006600; font-weight:bold;">&#40;</span>$nome,<span style="color:#CC0000;">"foo"</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; throw new Exception<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"O nome precisa conter foo, cara !"</span><span style="color:#006600; font-weight:bold;">&#41;</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;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;echo $nome;</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;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">?&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Com isso na sua Action, simplesmente:</p>
<div class="igBar"><span id="lcode-13"><a href="#" onclick="javascript:showPlainTxt('code-13'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-13">
<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;">include <span style="color:#CC0000;">"function_foobar.php"</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;">try <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; foobar<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"ab"</span><span style="color:#006600; font-weight:bold;">&#41;</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;"><span style="color:#006600; font-weight:bold;">&#125;</span> catch <span style="color:#006600; font-weight:bold;">&#40;</span>Exception $e<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; $var_template_sem_merchan_pro_smarty-&gt;<span style="">assign</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">'retorno_de_erro'</span>,$e-&gt;<span style="">getMessage</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</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;"><span style="color:#006600; font-weight:bold;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Assim, você pode ter 1, 2, 3, <em>n</em> mensagens de erro em <em>n</em> camadas da aplicação sem a necessidade de se preocupar em tratar uma a uma também na Action. Fica ultra-transparente na Action além de economizar seus dedos refazendo coisas que já estavam prontas camadas a dentro.</p>
<p><strong>Nota</strong>: Não esqueça disso <strong>nunca</strong> : <span style="color: #ff0000;">jamais</span> lance como exception uma mensagem de erro do PHP. Isso é feio - porque vem em inglês -, você será xingado por 3 gerações futuras de programadores além de permitir que os usuários vejam detalhes sobre sua aplicação.</p>
<h5>Como detectar os erros sem lança-los ao usuário ?</h5>
<p>Bem simples. Persista-os - eita mania - em arquivos de log. Mas calma, antes de sair criando algo com fopen(), leia isto: o PHP também traz o cara que salva - persiste - erros ! Ah sim, o PHP é excelente eu sei. Voltando ao exemplo...</p>
<p>
<div class="igBar"><span id="lcode-14"><a href="#" onclick="javascript:showPlainTxt('code-14'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-14">
<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;">function foobar<span style="color:#006600; font-weight:bold;">&#40;</span>$nome<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</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;">&nbsp; &nbsp; &nbsp;if <span style="color:#006600; font-weight:bold;">&#40;</span>strlen<span style="color:#006600; font-weight:bold;">&#40;</span>$nome<span style="color:#006600; font-weight:bold;">&#41;</span> &lt;<span style="color:#800000;color:#800000;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;error_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"O cara forneceu "</span>. $nome . <span style="color:#CC0000;">" e isto é inválido <span style="color:#000099; font-weight:bold;">\n</span>"</span>, <span style="color:#800000;color:#800000;">3</span>, <span style="color:#CC0000;">"seu_arquivo_de_log.txt"</span><span style="color:#006600; font-weight:bold;">&#41;</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;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw new Exception <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"O nome não é válido !"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;<span style="color:#006600; font-weight:bold;">&#125;</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;">&nbsp; &nbsp; &nbsp;if <span style="color:#006600; font-weight:bold;">&#40;</span>strpos<span style="color:#006600; font-weight:bold;">&#40;</span>$nome,<span style="color:#CC0000;">"foo"</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; error_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"O cara forneceu "</span>. $nome . <span style="color:#CC0000;">" porém sem o foo !<span style="color:#000099; font-weight:bold;">\n</span>"</span>, <span style="color:#800000;color:#800000;">3</span>, <span style="color:#CC0000;">"seu_arquivo_de_log.txt"</span><span style="color:#006600; font-weight:bold;">&#41;</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;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#FF9933; font-style:italic;">// #notamental não há motivos para logar &quot;erros&quot; deste tipo. Estou apenas ilustrando seu funcionamento <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp;throw new Exception<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"O nome precisa conter foo, cara !"</span><span style="color:#006600; font-weight:bold;">&#41;</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;">&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; </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;">&nbsp; &nbsp; echo $nome;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</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;">?&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Sim, ele, o <a href="http://br.php.net/error_log" target="_blank">error_log()</a> salva o log para ti. E pior, digo, melhor: caso queira ele pode enviar a notificação no seu e-mail. Certo, em boa parte dos casos isto definitivamente não é uma boa ideia. Mas pode ser útil algum dia, penso.</p>
<p>Resumo do dia: use ao máximo as <a href="http://br.php.net/exception" target="_blank">Exceptions</a> e as <a href="http://br.php.net/manual/pt_BR/ref.errorfunc.php" target="_blank">funções para tratamento de erros do php</a> .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hlegius.pro.br/exceptions-pois-nem-tudo-e-perfeito/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>O manual, por favor !</title>
		<link>http://www.hlegius.pro.br/o-manual-por-favor/</link>
		<comments>http://www.hlegius.pro.br/o-manual-por-favor/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 00:44:14 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[OOP e Patterns]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/o-manual-por-favor/</guid>
		<description><![CDATA[É fato que ninguém nasce sabendo. Fato também que para evoluirmos é bem interessante ler, além de entender, saber separar as coisas e etc., mas a base é a leitura. A todo momento o pessoal fala isso nos fóruns: "leia isto, leia aquilo. Nossa, isso aqui é referência neste assunto".
Vamos centrar mais no "nosso" mundo: [...]]]></description>
			<content:encoded><![CDATA[<p>É fato que ninguém nasce sabendo. Fato também que para evoluirmos é bem interessante ler, além de entender, saber separar as coisas e etc., mas a base é a leitura. A todo momento o pessoal fala isso nos fóruns: "leia isto, leia aquilo. Nossa, isso aqui é referência <em>neste</em> assunto".<br />
Vamos centrar mais no "nosso" mundo: você não sabe PHP, mas está interessado em aprender. O que você vai em busca imediatamente ? Referências, manuais e "apostilas", certo ? Seu objetivo com isto é aprender/conhecer algo que ainda não conhece.<br />
Qual é o pré-requisito para tal ? Saber ler, óbvio ! Por mais expressivo que um <strong>str_replace("foo","bar", $string);</strong> possa parecer, você precisa realmente entender o que acontece ou deixa de acontecer naquela parte.</p>
<p>Você deve estar se perguntando: aonde você quer chegar ?<br />
Simples: se tudo isso que citei é muito óbvio para você, meus parabéns ! Você deve ser um profissional preocupado com a documentação !</p>
<p>Sim, da mesma forma que você precisou ler para entender como funciona a API de reflexão nativa do PHP, o seu colega de projeto precisará ler a documentação daquele Webservice que você fez para o projeto.<br />
Partindo da minha analogia, seu amigo precisa ter como pré-requisito: saber ler e conhecimentos em PHP para poder implementar x)</p>
<p>Pensamento óbvio o meu, claro, claro que sim ! Mas pensa aí rapidinho: quantos códigos nos últimos tempos você pegou totalmente sem documentação, isso sem falar em outros aspectos, como qualidade interna e <em>blablablá</em> [no bom sentido] que profissionais aptos a escrever <em>grandes softwares</em> fazem [Se essa última palavra não faz sentido para você, recomendo ler <a href="http://www.amazon.com/Head-First-Object-Oriented-Analysis-Design/dp/0596008678/ref=pd_bbs_sr_6?ie=UTF8&#038;s=books&#038;qid=1235432837&#038;sr=8-6">este livro</a> para entender o que é um <em>grande software</em>]</p>
<p>Aquela velha <em>estória</em> de que quem manja mesmo lê o código <em>e já era</em> caiu por terra. Para um formmail até que pode ser, mas aplicações modularizadas com um modelo bem definido e aplicado e uma chuva de classes trabalhando neste modelo precisa muito mais do que uma simples leitura de código. O mínimo necessário são os comentários do tipo <a href="http://en.wikipedia.org/wiki/PHPDoc#DocBlock"><strong>DocBlock</strong></a> além dos comentários inline e por fim e não menos importante Classes, atributos, comportamentos, variáveis locais e constantes com nomes reais do que fazem, recebem ou são.</p>
<div class="igBar"><span id="lcode-16"><a href="#" onclick="javascript:showPlainTxt('code-16'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-16">
<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;"><span style="color:#008000;">/**</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;"><span style="color:#008000;"> * Pretend this is a file</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> *</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;"><span style="color:#008000;"> * Page-level DocBlock is here because it is the first DocBlock</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> * in the file, and contains a @package tag</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;"><span style="color:#008000;"> * @package pagepackage</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> */</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;">&nbsp;define<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"almost"</span>,<span style="color:#CC0000;">"Now the Page-level DocBlock is for the page, and the&nbsp; Define has no docblock"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">?&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p>
Isto é um <strong>DocBlock</strong> <a href="http://en.wikipedia.org/wiki/PHPDoc#Page_Level_DocBlocks">retirado daqui</a> !</p>
<p>Para fechar, eu recomendo fortemente que você caso não conheça, dê uma boa olhada e claro, <a href="http://phpdoc.org/">passe lá</a> e pegue sua cópia gratuitamente dele, o <strong>PHPDoc</strong> em <a href="http://phpdoc.org/">PHPdoc.org</a>. Não vou me prolongar em explicar o que ele tem ou o que faz. O site está lá completinho.</p>
<p>Veja você mesmo <a href="http://manual.phpdoc.org/HTMLSmartyConverter/HandS/Smarty/Smarty.html">neste exemplo</a> online onde foi gerado o manual do Smarty Template. Ele por si só já diz tudo. Agora é com você <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.hlegius.pro.br/o-manual-por-favor/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Removendo .svn dos seus projetos no Linux</title>
		<link>http://www.hlegius.pro.br/removendo-svn-dos-seus-projetos-no-linux/</link>
		<comments>http://www.hlegius.pro.br/removendo-svn-dos-seus-projetos-no-linux/#comments</comments>
		<pubDate>Sun, 09 Nov 2008 23:24:37 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Softwares]]></category>
		<category><![CDATA[aplicativos]]></category>
		<category><![CDATA[shellscript]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/removendo-svn-dos-seus-projetos-no-linux/</guid>
		<description><![CDATA[Salve!
Depois de um longo período de sofrimento com os benditos .svn na hora da publicação ou empacotamento do projeto eu tomei coragem e criei um script em shell para que me auxiliasse a acabar com esse problema.
Sem muito papo, o script é ultra simples: basicamente copia seu projeto para um diretório e dessa cópia ele [...]]]></description>
			<content:encoded><![CDATA[<p>Salve!</p>
<p>Depois de um longo período de sofrimento com os benditos .svn na hora da publicação ou empacotamento do projeto eu tomei coragem e criei um script em shell para que me auxiliasse a acabar com esse problema.</p>
<p>Sem muito papo, o script é ultra simples: basicamente copia seu projeto para um diretório e dessa cópia ele remove todos .svn que ver pela frente. No final eu tenho o diretório do projeto intacto e a cópia limpinha sem .svn para eu mandar pro cliente, publicar na web e etc.</p>
<p>Fiz um sisteminha interativo com menu de ajuda e um texto explicando como funciona tudo legalzinho, pois, acho que não sou o único a sofrer com esse problema.</p>
<p>Para quem se interessou pelo script, disponibilizo o link para download do mesmo: <a href="http://gpl.hlegius.pro.br/linux/svnclean.sh">http://gpl.hlegius.pro.br/linux/svnclean.sh</a><br />
Baixe, dê permissão de execução e teste rodando o comando:</p>
<div class="igBar"><span id="lcode-20"><a href="#" onclick="javascript:showPlainTxt('code-20'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-20">
<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;">$ ./svnclean ./diretorio_do_projeto </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Se quiser um log, eu criei duas formas: log diretamente na saída do terminal, ou log em arquivo de texto.<br />
Para o log direto, só adicionar -v no final; para o log em arquivo, adicione -vv</p>
<div class="igBar"><span id="lcode-21"><a href="#" onclick="javascript:showPlainTxt('code-21'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-21">
<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;">$ ./svnclean ./diretorio_do_projeto -vv </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Para ajuda, digite:</p>
<div class="igBar"><span id="lcode-22"><a href="#" onclick="javascript:showPlainTxt('code-22'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-22">
<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;">$ ./svnclean </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Para aqueles que programam muito em Shell Script, realmente peço que não considere a qualidade e a quantidade de linhas, pois não uso muito o shell script =X</p>
<p>Fica aí a dica. Espero que ajude alguém <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.hlegius.pro.br/removendo-svn-dos-seus-projetos-no-linux/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
