<?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>Gustavo Dutra &#187; php</title>
	<atom:link href="http://gustavodutra.com/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://gustavodutra.com</link>
	<description>Um pouco de tudo, nada de pouco</description>
	<lastBuildDate>Thu, 29 Jul 2010 22:57:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Introdução a testes unitários com CakePHP e SimpleTest</title>
		<link>http://gustavodutra.com/post/377/introducao-a-testes-unitarios-com-cakephp-e-simpletest/</link>
		<comments>http://gustavodutra.com/post/377/introducao-a-testes-unitarios-com-cakephp-e-simpletest/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 16:22:50 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[Unit Test]]></category>
		<category><![CDATA[aumentar produtivade]]></category>
		<category><![CDATA[extreme programming]]></category>
		<category><![CDATA[fdd]]></category>
		<category><![CDATA[feature driven development]]></category>
		<category><![CDATA[fixtures]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[mock]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[open-source]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[produtividade]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[simpletest]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[teste de software]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=377</guid>
		<description><![CDATA[Há tempos eu venho lendo sobre XP (eXtreme Programming), Scrum e Feature Driven Development (FDD). São metodologias ágeis de desenvolvimento de software. O engraçado é que praticamente, ao meu ver, fazem a mesma coisa, porém de forma diferente. E todas elas frizam a importância dos testes unitários e, mais especificadamente, testes unitários antes do desenvolvimento, [...]]]></description>
			<content:encoded><![CDATA[<p>Há tempos eu venho lendo sobre XP (eXtreme Programming), Scrum e Feature Driven Development (FDD). São metodologias ágeis de desenvolvimento de software. O engraçado é que praticamente, ao meu ver, fazem a mesma coisa, porém de forma diferente. E todas elas frizam a importância dos testes unitários e, mais especificadamente, testes unitários antes do desenvolvimento, o chamado TDD (Test Driven Development). Como nunca havia trabalhado desta forma, ainda não tinha uma opinião sobre isso. Apenas comentários e depoimentos de que usa. Somado a isso, veio aquele senso de desafio, de inovação e curiosidade.</p>
<p>Faz alguns meses, e decidimos, eu e o <a rel="nofollow" href="http://ezabka.wordpress.com">Emanuel Zabka</a>, implantar o TDD no desenvolvimento na empresa em que trabalhamos. Academicamente é falado muito em <em>refactoring</em> e <em>mudanças de requisitos</em>, mas na prática, eu nunca havia notado a quantidade de modificações que um mesmo código/classe/arquivo é modificado num curto período de tempo e a longo prazo.</p>
<p>Os testes me ajudaram a enxergar, não só as dependências do sistema, como também, <strong>acoplamentos desnecessários</strong>; a qualidade dos códigos; do design do projeto; e, consequentemente, diminuiu muito os bugs mais corriqueiros, como validação de campos. Mesmo tendo várias coisas boas, há coisas ruins, como aumento do tempo de desenvolvimento &#8211; o que, apesar de nunca ter medido, diminui o retrabalho e tempo utilizado no futuro em correções de bugs -, aumento da complexidade da arquitetura &#8211; a fim de manter uma maior coesão com baixo acoplamento, entre outros menos relevantes.<br />
<span id="more-377"></span></p>
<h2>Unit Test</h2>
<blockquote><p>
The basic concept of unit testing is write more code which will test the main code we’ve written, by “throwing” sample data at it and examining what it gets back.
</p></blockquote>
<p>Harry Fuecks</p>
<p>Enfim, uma boa definição de testes unitários é esta supracitada. São escritos mais códigos para testar o código principal, utilizando dados de testes para analisar o comportamento e o retorno do código sendo testado. </p>
<h2>CakePHP</h2>
<ul>
<li>Framework de desenvolvimento rápido pra Web com PHP</li>
<li>Utiliza padrões MVC e ORM</li>
<li>Extensível para desenvolvimento, manutenção e deploying.</li>
<li>OpenSource / Comunidade muito ativa e amigável   </li>
<li>Orientada a Objetos</li>
<li><a rel="nofollow" href="http://www.cakephp.org/pages/features" target="_blank">Mais detalhes sobre o CakePHP</a></li>
</ul>
<h2>SimpleTest</h2>
<ul>
<li>Praticamente mesma coisa que JUnit, JMock e PHPUnit.</li>
<li>Guiado através de asserções</li>
<li>Possibilidade navegação em requisições HTTP para testar interface gerada (HTML)   </li>
<li>OpenSource</li>
<li>Orientada a Objetos</li>
<li><a rel="nofollow" href="http://www.simpletest.org/en/overview.html" target="_blank">Mais detalhes sobre o SimpleTest</a></li>
</ul>
<h2>CakePHP e SimpleTest</h2>
<ul>
<li>Startup (criação do arquivo, casos de testes básicos) dos testes unitários automaticamente</li>
<li>Customizações no template de Report (Web com template padrão)</li>
<li>Rápida execução de testes individualizados</li>
<li>Rápida execução de grupos de testes (execução de vários testes unitários sequencialmente)</li>
<li>Pode-se usar Mock para objetos internos do CakePHP ou da aplicação</li>
<li>Pode-se testar aplicação toda (APP + Plugins)</li>
<li>Pode-se testar somente a aplicação (APP)</li>
<li>Pode-se testar plugins separadamente</li>
<li>Pode-se testar em modo batch</li>
<li><a rel="nofollow" href="http://book.cakephp.org/view/354/Preparing-for-testing" target="_blank">Integração dos dois frameworks</a></li>
</ul>
<h2>Convenções e Padrões</h2>
<p>Para o SimpleTest não há padronização no nome dos arquivos, mas o CakePHP estabelece um a partir da convenção das classes utilizados por ele. Ex: respectivamente as classes de controller e model de um Post:</p>
<dl>
<dt><strong>PostController</strong></dt>
<dd>tests/cases/controllers/post_controller.test.php</dd>
<dt><strong>Post</strong></dt>
<dd>tests/cases/models/post.test.php</dd>
</dl>
<ul>
<li>O nome da classe contida no arquivo é derivado a partir do nome do mesmo.</li>
<li>Esta classe deve extender a classe CakeTestCase ou CakeWebTestCase</li>
<li>A assinatura dos métodos que contém asserções (métodos de teste) devem iniciar com “test”, como em testPostControllerAddPost().</li>
<li>Métodos que são executados como eventos:
<dl>
<dt><strong>start()</strong></dt>
<dd>Primeiro método chamado. Executado quando se iniciam os testes</dd>
<dt><strong>end()</strong></dt>
<dd>Último método chamado. Executado quando se concluí todos os casos testes</dd>
<dt><strong>startCase()</strong></dt>
<dd>Executado antes do caso de teste começar a ser testado (lembrando que um teste pode ser composto de um ou mais casos de teste)</dd>
<dt><strong>endCase()</strong></dt>
<dd>Executado depois que o caso de teste foi testado por completo</dd>
<dt><strong>before($method)</strong></dt>
<dd>Anuncia o início de um método de teste</dd>
<dt><strong>after($method)</strong></dt>
<dd>Anuncia o término de um método de teste</dd>
<dt><strong>startTest($method)</strong></dt>
<dd>Executado antes de um caso de teste iniciar</dd>
<dt><strong>endTest($method)</strong></dt>
<dd>Executado depois que um caso de teste termina</dd>
</dl>
</li>
</ul>
<p><a rel="nofollow" href="http://book.cakephp.org/view/362/Creating-tests" target="_blank">Mais detalhes sobre as convenções</a></p>
<h2>Fixtures</h2>
<p>Fixtures são uma forma de utilizar dados de teste. São matrizes de dados que correspondem à registros em um banco de dados.<br />
Cada Model possui uma Fixture, que irá não só ter os dados como a representação dos campos que compõe a tabela do banco, pois a partir destes dados o framework irá:</p>
<ol>
<li>Criar uma tabela prefixada (por padrão) de “test_suite_” no banco de dados para cada fixture necessário (ou seja, cada model utilizado).</li>
<li>Inserir os dados de teste na tabela de teste</li>
<li>Executar os testes em cima destes registros</li>
<li>Remover os dados da tabela de teste</li>
<li>Remover a tabela no banco de dados.</li>
</ol>
<p>Ou seja, assim é garantido que os dados serão sempre os mesmos e que não comprometerá a base de dados atual com sujeira, podendo-se executar<br />
estes testes a qualquer momento atrás de problemas. Testes que envolvem banco de dados com índices únicos, chaves primárias ou outras constraints<br />
estão livres de erros (erros não propositais) durante os testes.</p>
<p><a rel="nofollow" href="http://book.cakephp.org/view/358/Preparing-test-data" target="_blank">Veja mais sobre Fixtures</a></p>
<h2>Asserções</h2>
<ul>
<li>assertTrue($x)</li>
<li>assertFalse($x)</li>
<li>assertNull($x)</li>
<li>assertEqual($x, $y)</li>
<li>assertIsA($object, ‘ClassName’)</li>
<li>assertIdentical($x, $y)</li>
<li>assertPattern(’/REGEX/’, $x)</li>
<li>expectError();</li>
</ul>
<p>Se você se interessou, para mais detalhes sobre os testes unitários no CakePHP, recomendo a leitura deste post da <a rel="nofollow" href="http://debuggable.com">Debuggable</a>: <a rel="nofollow" href="http://debuggable.com/posts/unit-testing-in-cakephp-part-1---introduction-to-unit-testing:48102610-c5d0-4398-a010-76974834cda3" target="_blank"><cite>Unit Testing in CakePHP Part 1 &#8211; Introduction to Unit Testing</cite></a></p>
<p>Agradecimentos especiais a <a rel="nofollow" href="http://twitter.com/wmute">André Leitzke</a> e <a rel="nofollow" href="http://vivids.com.br">Viviane de Souza</a> por terem me ajudado com a caracterização e descrição do framework!</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/377/introducao-a-testes-unitarios-com-cakephp-e-simpletest/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Como consultar a documentação do PHP direto do Vim</title>
		<link>http://gustavodutra.com/post/365/como-consultar-a-documentacao-do-php-direto-do-vim/</link>
		<comments>http://gustavodutra.com/post/365/como-consultar-a-documentacao-do-php-direto-do-vim/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 20:51:54 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Vim]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[exemplo]]></category>
		<category><![CDATA[gvim]]></category>
		<category><![CDATA[man]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[vimrc]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=365</guid>
		<description><![CDATA[Olá! Descobri recentemente que é possível baixar a documentação do PHP no formato do man do UNIX. Isso é muito bom, já que assim, podemos consultar funções com parâmetros, variáveis e exemplos. Melhor, podemos fazer isso direto do Vim.
Eu já tinha lido sobre uma opção do Vim chamada keywordprg, mas nunca havia encontrado uma serventia. [...]]]></description>
			<content:encoded><![CDATA[<p>Olá! Descobri recentemente que é possível baixar a documentação do PHP no formato do man do <strong>UNIX</strong>. Isso é muito bom, já que assim, podemos consultar funções com parâmetros, variáveis e exemplos. Melhor, podemos fazer isso direto do Vim.</p>
<p>Eu já tinha lido sobre uma opção do Vim chamada <a rel="nofollow" href="http://vimdoc.sourceforge.net/htmldoc/options.html#%27keywordprg%27">keywordprg</a>, mas nunca havia encontrado uma serventia. Quando eu li no <a rel="nofollow" href="http://bjori.blogspot.com/2010/01/unix-manual-pages-for-php-functions.html">blog do bjori</a>, realmente me veio à mente como eu poderia utilizá-la.</p>
<p><span id="more-365"></span></p>
<p>Eu instalei a última versão do <strong>pear</strong> aqui, e executei os comandos que ele cita no blog:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">pear <span style="color: #c20cb9; font-weight: bold;">install</span> doc.php.net<span style="color: #000000; font-weight: bold;">/</span>pman</pre></div></div>

<p>Eu precisei aumentar a memória do <strong>php.ini</strong> (<em>memory_limit</em>), 32M não foi o suficiente.</p>
<p>O manual será instalado no diretório especificado em &#8220;<em>doc_dir</em>&#8221; da configuração da <strong>pear</strong> e o executável no &#8220;<em>bin_dir</em>&#8220;. Para verificar as configurações atuais:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">pear config-show <span style="color: #666666; font-style: italic;"># Mostra todas as configurações atuais</span>
pear config-get bin_dir <span style="color: #666666; font-style: italic;"># Mostra configuração atual da opção bin_dir</span>
pear config-get doc_dir <span style="color: #666666; font-style: italic;"># Mostra configuração atual da opção doc_dir</span>
<span style="color: #666666; font-style: italic;"># Para modificar:</span>
pear config-set bin_dir <span style="color: #000000; font-weight: bold;">/</span>outro<span style="color: #000000; font-weight: bold;">/</span>bin
pear config-set doc_dir <span style="color: #000000; font-weight: bold;">/</span>outro<span style="color: #000000; font-weight: bold;">/</span>docs</pre></div></div>

<p>Depois de instalado, você pode utilizar ele tanto no Vim quanto fora do Vim:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">pman array_merge</pre></div></div>

<p>Bom, se lembra que eu havia falado sobre o <em>keywordprg</em> ? Assim como o <em>makeprg</em> é o programa executado ao se executa :<em>make</em> no Vim e o <em>grepprg</em> o comando executado ao se executar :<em>[grep|vimgrep]</em>, o <em>keywordprg</em> é executado quando se preciona <strong>K</strong> (k maiúsculo) sobre alguma palavra chave &#8211; que no nosso caso será uma função php.</p>
<p>O artigo citado ali em cima, indica para colocarmos no <strong>.vimrc</strong>, mas eu acho mais interessante por no <strong>.ftplugin/php.vim</strong> (se o arquivo não existir, crie). Assim, só será carregado caso o tipo do arquivo for php, possibilitando utilizar outros programas para outras linguagens</p>

<div class="wp_syntax"><div class="code"><pre class="vimrc" style="font-family:monospace;">&quot; Programa executado quando pressionado K
set keywordprg=pman</pre></div></div>

<p>Agora faça o teste: abra um arquivo php, coloque o cursor sobre alguma função e pressione <em>K</em>. Para fechar o manual aberto, basta precionar <em>q</em>. Pode-se utilizar a busca com <em>/termo</em> e também navegar nos resultados com <em>n/N</em>. <em>j/k/UP/DOWN</em> movem o arquivo para cima e para baixo, normalmente, como se fosse um manpage.</p>
<p>Eai, este post ajudou em algo?</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/365/como-consultar-a-documentacao-do-php-direto-do-vim/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Lookahead, Lookbehind e Condicionais em Expressões Regulares</title>
		<link>http://gustavodutra.com/post/348/lookahead-lookbehind-e-condicionais-em-expressoes-regulares/</link>
		<comments>http://gustavodutra.com/post/348/lookahead-lookbehind-e-condicionais-em-expressoes-regulares/#comments</comments>
		<pubDate>Wed, 30 Dec 2009 22:28:29 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Regex]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[lookahead]]></category>
		<category><![CDATA[lookbehind]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[re]]></category>
		<category><![CDATA[regular expression]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=348</guid>
		<description><![CDATA[Depois de muito tempo sem postar, me lembrei de algo bem interessante! Vocês podem mandar mensagens na página de contato dando sugestões de temas sobre Vim, Expressões regulares ou outra coisa que vocês gostariam de ver no blog ;p.
Expressões Regulares
Expressão regular é uma ferramenta muito forte para o tratamento de texto. É muito utilizado para [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de muito tempo sem postar, me lembrei de algo bem interessante! Vocês podem mandar mensagens na página de contato dando sugestões de temas sobre <strong>Vim</strong>, <strong>Expressões regulares</strong> ou outra coisa que vocês gostariam de ver no blog ;p.</p>
<h2>Expressões Regulares</h2>
<p><strong>Expressão regular</strong> é uma ferramenta muito forte para o tratamento de texto. É muito utilizado para substituições ou para verificar integridade dos dados, pois, através da <strong>expressão regular</strong>, vulga <strong>regex</strong> ou <strong>re</strong>, pode-se casar padrões de texto. Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">/^[a-zA-Z0-9]+$/
Para somente caracteres alfanuméricos.
&nbsp;
/^(\d{3}\.){2}\d{3}-\d{2}$/
Validando formato de CPF.</pre></div></div>

<p>Esse tipo de regex é simples, valida praticamente só os caracteres que compõe uma dada string. Porém, as <em>Perl Compatible Regular Expressions</em> (Expressões Regulares Compatíveis com Perl), também conhecidas como <em>pcre</em>, permitem muito mais, inclusive utilizar condicionados (if&#8217;s), porém isso é para outro post! O que vamos falar agora é de <strong>Lookahead</strong> e <strong>Lookbehind</strong>.</p>
<p><span id="more-348"></span></p>
<h2>Lookahead</h2>
<p><strong>Lookahead</strong> é uma forma de casar strings que tenham ou não um determinado final. É utilizado (?⁼&#8230;) para o positivo, ou seja, que terminem com; e (?!&#8230;) para o negativo, ou seja, que não termina com.</p>
<p>Um exemplo simples, seria a busca, primeiramente, de Gustavo seguido por Dutra. Se existisse Gustavo ou Gustavo Outracoisa, ele não casaria. Ao contrário, o segundo exemplo somente casaria o Gustavo ou o Gustavo Outracoisa, porém não casaria o Gustavo Dutra:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">/Gustavo(?= Dutra)/
/Gustavo(?! Dutra)</pre></div></div>

<p>Vamos ver um exemplo mais funcional e complexo em <em>python</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">re</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #dc143c;">re</span>.<span style="color: black;">findall</span><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\s</span>?([^;]+);'</span>, <span style="color: #483d8b;">'Vim Editor; GVim Editor; Firefox Browser; Emacs Editor; Thunderbird Email;'</span><span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;"># output seria:</span>
<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Vim Editor'</span>, <span style="color: #483d8b;">'GVim Editor'</span>, <span style="color: #483d8b;">'Firefox Browser'</span>, <span style="color: #483d8b;">'Emacs Editor'</span>, <span style="color: #483d8b;">'Thunderbird Email'</span><span style="color: black;">&#93;</span></pre></div></div>

<p>Mas e se quisesse somente os editores da lista?</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">re</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #dc143c;">re</span>.<span style="color: black;">findall</span><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\s</span>?([^;]+ Editor);'</span>, <span style="color: #483d8b;">'Vim Editor; GVim Editor; Firefox Browser; Emacs Editor; Thunderbird Email;'</span><span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;"># output seria:</span>
<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Vim Editor'</span>, <span style="color: #483d8b;">'GVim Editor'</span>, <span style="color: #483d8b;">'Emacs Editor'</span><span style="color: black;">&#93;</span></pre></div></div>

<p>Mas e se eu quisesse todos MENOS os editores? É ai que entra o <strong>Lookahead</strong>, vamos pegar todos que não terminam com Editor.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">re</span>
<span style="color: #dc143c;">re</span>.<span style="color: black;">findall</span><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\s</span>?([^;]+ (?!Editor))'</span>, <span style="color: #483d8b;">'Vim Editor; GVim Editor; Firefox Browser; Emacs Editor; Thunderbird Email;'</span><span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;"># output seria:</span>
<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Firefox '</span>, <span style="color: #483d8b;">'Thunderbird '</span><span style="color: black;">&#93;</span></pre></div></div>

<p>Observem que o que casar com (?!Editor) não entra no resultado, para incluí-lo, seria necessário uma expressão regular um pouco mais complexa utilizando condicionais. Veremos isso depois!</p>
<h2>Lookbehind</h2>
<p><strong>Lookbehind</strong> faz o mesmo que o <strong>lookahead</strong>, porém, como o próprio nome diz, não procura depois, mas sim antes, da string dita. (?&lt;=&#8230;) para o positivo e (?&lt;!&#8230;) para o negativo.</p>
<p>Vamos pegar um RT de um tweet do <a rel="nofollow" href="http://twitter.com">twitter.com</a>. Como gosto de ser eclético, vou usar <em>perl</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;RT <span style="color: #000099; font-weight: bold;">\@</span>gustavotkg Testando ERs.&quot;</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">/(?&lt; =@)gustavotkg/</span>
<span style="color: #666666; font-style: italic;"># Output seria:</span>
<span style="color: #cc66cc;">1</span></pre></div></div>

<p>Essa expressão retorna 1 (ou seja, TRUE), caso exista algum gustavotkg precedido por uma @.</p>
<p>OBS: @ são escapadas porque representam variáveis do tipo array em perl.</p>
</pre>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Este é um RT <span style="color: #000099; font-weight: bold;">\@</span>gustavotkg Testando ERs.&quot;</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">/(?&lt; !RT )\@gustavotkg/</span>
<span style="color: #666666; font-style: italic;"># Output seria, vazio, pois o @gustavotkg é precedido por um RT</span>
&nbsp;
<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;RT <span style="color: #000099; font-weight: bold;">\@</span>gustavotkg2 também estou testando ERs.&quot;</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">/(?&lt;!^RT \@gustavotkg\b)(.+)$/</span>
<span style="color: #666666; font-style: italic;"># Output seria:</span>
RT <span style="color: #0000ff;">@gustavotkg2</span> també<span style="color: #000066;">m</span> estou testando ERs<span style="color: #339933;">.</span></pre></div></div>

<p>O <em>\b</em> significa borda de palavra (espaço, ponto final, exclamação, final de linha, etc). Como 2 não é uma borda de palavra, pois a expressão regular diz o seguinte: <em>"Case com tudo que não começar com RT @gustavotkg seguido de uma borda de palavra"</em>.</p>
<h2>Condicionais</h2>
<p>Como se pode notar nos casos acima, os operadores de lookahead e lookbehind não colocam o valor casado junto ao resultado final. Para isso temos que verificar condicionalmente e adicionar manualmente o valor. A sintaxe é esta: <strong>(?(condicao)(caso verdadeiro)|(caso falso)).</strong></p>
<p>Parece complicado, mas é bem simples, vamos começar com algo fácil utilizando php:</p>
</pre>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/(?(?&lt; =@)\w+|\w{2})/&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;@testando&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$r</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$r</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;"># Output seria:
</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span> string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">8</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;testando&quot;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/(?(?&lt; =@)\w+|\w{2})/&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;testando&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$r</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$r</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;"># Output seria:
</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span> string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">8</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;te&quot;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Notem o condicional: Se começar (<strong>lookbehind</strong>) com @, então quero que case toda a palavra que segue o @, caso contrário, quero apenas os dois primeiros caracteres. Fácil? Vamos complicar!</p>
<p>Lembra do exemplo mais acima do <strong>lookahead</strong>? Vou refrescar a memória:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">re</span>
<span style="color: #dc143c;">re</span>.<span style="color: black;">findall</span><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\s</span>?([^;]+ (?!Editor))'</span>, <span style="color: #483d8b;">'Vim Editor; GVim Editor; Firefox Browser; Emacs Editor; Thunderbird Email;'</span><span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;"># output seria:</span>
<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Firefox '</span>, <span style="color: #483d8b;">'Thunderbird '</span><span style="color: black;">&#93;</span></pre></div></div>

<p>Notem que ela não adicionar a categoria do Firefox nem do Thunderbird, pois o (?!) como supracitado, não é colocado junto no resultado final. Para adicioná-los, podemos usar o condicional.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">preg_match_all</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/(\w+ (?(?!Editor)\w+));/&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;Vim Editor; GVim Editor; Firefox Browser; Emacs Editor; Thunderbird Email;&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Output seria:</span>
<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
    string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;Firefox Browser;&quot;</span>
    <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
    string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">18</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;Thunderbird Email;&quot;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
    string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">15</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;Firefox Browser&quot;</span>
    <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
    string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">17</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;Thunderbird Email&quot;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ou seja, no segundo índice do array, que na verdade é o indice 1, consta o resultado pego. Veja que utilizamos o seguinte método: Se \w+ não for seguido de 'Editor' então pega o \w+, senão ignora pois não é para casar. Assim, se for Editor, ele nunca irá casar.</p>
<p><strong>Dúvidas? Sugestões? Deixe um comentário!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/348/lookahead-lookbehind-e-condicionais-em-expressoes-regulares/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>50 Cheat Sheets e Quick Refs para salvar sua pele</title>
		<link>http://gustavodutra.com/post/336/50-cheat-sheets-e-quick-refs-para-salvar-sua-pele/</link>
		<comments>http://gustavodutra.com/post/336/50-cheat-sheets-e-quick-refs-para-salvar-sua-pele/#comments</comments>
		<pubDate>Sun, 06 Dec 2009 17:46:11 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[awk]]></category>
		<category><![CDATA[bash script]]></category>
		<category><![CDATA[bazaar]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[cheat sheets]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[gvim]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[latex]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[regular expression]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=336</guid>
		<description><![CDATA[Estou disponibilizando algumas Cheat Sheets que estavam nos meus favoritos. Sempre são úteis em algum momento!!! Espero que aproveitem pelo menos 1 delas!
Controle de Versão

SVN Cheat Sheet
Git Cheat Sheet
Mercurial Cheat Sheet
Bazaar Cheat Sheet

Frameworks

Prototype Cheat Sheet
MooTools Cheat Sheet
jQuery Cheat Sheet
Ruby On Rails
Django Cheat Sheet
CodeIgniter Cheat Sheet
CakePHP Cheat Sheet
Mais de 12 Symfony Cheat Sheets

Programação

Bash Script Quick Refences
AWK [...]]]></description>
			<content:encoded><![CDATA[<p>Estou disponibilizando algumas Cheat Sheets que estavam nos meus favoritos. Sempre são úteis em algum momento!!! Espero que aproveitem pelo menos 1 delas!</p>
<h2>Controle de Versão</h2>
<ul>
<li><a rel="nofollow" href="http://www.cs.put.poznan.pl/csobaniec/Papers/svn-refcard.pdf">SVN Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://ktown.kde.org/%7Ezrusin/git/git-cheat-sheet-large.png">Git Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://edong.net/2008v1/docs/dongwoo-Hg-PDF.pdf">Mercurial Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://doc.bazaar-vcs.org/latest/en/_static/en/bzr-en-quick-reference.png">Bazaar Cheat Sheet</a></li>
</ul>
<h2>Frameworks</h2>
<ul>
<li><a rel="nofollow" href="http://thinkweb2.com/projects/prototype/downloads/Prototype%20Cheat%20Sheet%201.6.0.2">Prototype Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://mediavrog.net/blog/wp-content/uploads/2008/08/mootools-12-cheat-sheet-pf.pdf">MooTools Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://www.cheat-sheets.org/saved-copy/Jquery-Cheat-Sheet-1.2.pdf">jQuery Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://www.addedbytes.com/cheat-sheets/download/ruby-on-rails-cheat-sheet-v1.pdf">Ruby On Rails</a></li>
<li><a rel="nofollow" href="http://www.mercurytide.co.uk/media/whitepapers/django-cheat-sheet/django10-cheat-sheet.pdf">Django Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://codeigniter-1-7-1-quick-reference-cheatsheet.googlecode.com/files/CodeIgniter_Cheatsheet_DesignFellow_v2.zip">CodeIgniter Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://cakephp.org/files/Resources/CakePHP-1.2-Cheatsheet.pdf">CakePHP Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://trac.symfony-project.org/wiki/CheatSheets">Mais de 12 Symfony Cheat Sheets</a></li>
</ul>
<h2>Programação</h2>
<ul>
<li><a rel="nofollow" href="http://www.cheat-sheets.org/saved-copy/bash_ref.pdf">Bash Script Quick Refences</a></li>
<li><a rel="nofollow" href="http://www.cheat-sheets.org/image/saved.copy.gif">AWK Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://www.cheat-sheets.org/saved-copy/HTML5_Canvas_Cheat_Sheet.png">HTML5 Canvas Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://www.cheat-sheets.org/saved-copy/php_cheat_sheet.png">PHP Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://www.zenspider.com/Languages/Ruby/QuickRef.html">Ruby Quick Refence</a></li>
<li><a rel="nofollow" href="http://www.scottklarr.com/topic/106/perl-cheat-sheets/">9 Perl Cheat Sheets</a></li>
<li><a rel="nofollow" href="http://rgruet.free.fr/PQR24/PQR2.4.html">Python Quick Refence</a></li>
<li><a rel="nofollow" href="http://www.addedbytes.com/cheat-sheets/regular-expressions-cheat-sheet/">Regular Expression Cheat Sheet</a></li>
</ul>
<h2>Web Design</h2>
<ul>
<li><a rel="nofollow" href="http://www.reeddesign.co.uk/test/points-pixels.html">Font Size Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://www.blooberry.com/indexdot/css/propindex/all.htm">Propriedades CSS</a></li>
<li><a rel="nofollow" href="http://www.addedbytes.com/cheat-sheets/html-character-entities-cheat-sheet/">HTML Char Entities Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://www.scottklarr.com/topic/114/designers-color-chart-cheat-sheets/">6 Design Colors Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://www.seomoz.org/user_files/SEO_Web_Developer_Cheat_Sheet.pdf">SEO Web Developer Cheat Sheet</a></li>
</ul>
<h2>Bancos de Dados</h2>
<ul>
<li><a rel="nofollow" href="http://www.xml.dvint.com/docs/SchemaStructuresQR-2.pdf">XML Schema Structure Quick Refence</a></li>
<li><a rel="nofollow" href="http://www.cheat-sheets.org/saved-copy/MySQL_QuickRef.pdf">MySQL Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://www.alberton.info/downloads/postgresql-cheat-sheet.png">PostgreSQL Cheat Sheet</a></li>
</ul>
<h2>Ferramentas</h2>
<ul>
<li><a rel="nofollow" href="http://www.google.com/help/cheatsheet.html">Google Search Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://duvet-dayz.com/firebug-cheatsheet/">Firebug Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://www.cheat-sheets.org/saved-copy/dhffkc6q_97fsjrgmd7.gif">Vimperator Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://www.cheat-sheets.org/saved-copy/latexsheet-0.png">LaTeX Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://www.cheat-sheets.org/saved-copy/vim-cheatsheet.png">Vim Cheat Sheet</a></li>
<li><a rel="nofollow" href="http://www.cheat-sheets.org/saved-copy/vimqrc.html">Vim Quick Refence</a></li>
<li><a rel="nofollow" href="http://www.addedbytes.com/cheat-sheets/mod_rewrite-cheat-sheet/">mod_rewirte Cheat Sheet</a></li>
</ul>
<p>Alguma que eu tenha esquecido? Posta ae nos comentários!</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/336/50-cheat-sheets-e-quick-refs-para-salvar-sua-pele/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Várias Dicas Simples de Legibilidade de Códigos PHP</title>
		<link>http://gustavodutra.com/post/236/varias-dicas-simples-de-legibilidade-de-codigos-php/</link>
		<comments>http://gustavodutra.com/post/236/varias-dicas-simples-de-legibilidade-de-codigos-php/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 01:52:19 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[aumentar produtivade]]></category>
		<category><![CDATA[código limpo]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[ligibilidade]]></category>
		<category><![CDATA[manutenção]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[produtividade]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=236</guid>
		<description><![CDATA[Faz um tempo que venho observando códigos que considero estranhos. Apesar de entendê-los, são necessários um esforço e um tempinho disponível. Alguns ainda exigem uns debugs ou até mesmo perguntar ao autor qual foi a intenção daquele trecho.
Baseado nisso e no comentário que recebi recentemente e inspirado pelo post de um amigo, vou fazer uma [...]]]></description>
			<content:encoded><![CDATA[<p>Faz um tempo que venho observando códigos que considero <strong>estranhos</strong>. Apesar de entendê-los, são necessários um esforço e um tempinho disponível. Alguns ainda exigem uns debugs ou até mesmo perguntar ao autor qual foi a intenção daquele trecho.</p>
<p>Baseado nisso e no <a rel="nofollow" href="http://gustavodutra.com/post/222/schemaspy-ferramenta-para-modelagem-literaria/#comment-55">comentário que recebi recentemente</a> e inspirado pelo <a href="http://blog.flyonthe.net/geral/boas-praticas-de-desenvolvimento/">post de um amigo</a>, vou fazer uma lista de coisas que proponho. São coisas simples, mas que facilitam na manutenção.</p>
<p>Umas das coisas que aprendi com <a rel="nofollow" href="http://butunclebob.com/ArticleS">Uncle Bob (Robert C. Martin)</a>, no seu livro <a rel="nofollow" href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=sr_1_1?ie=UTF8&#038;s=books&#038;qid=1250297519&#038;sr=8-1"><em>Clean Code</em></a> foi: escrevemos o código apenas uma vez, porém o mesmo é lido várias vezes. Então, não custa usarmos 5min a mais documentando alguma coisa ou escrevendo variáveis legíveis, que nos pouparão tempo mais tarde!</p>
<p><span id="more-236"></span></p>
<h2>1. Clareza e objetivadade nos nomes das variáveis</h2>
<p>É incrível como as pessoas conseguem dar nomes criativos para variáveis. O alfabeto tem tantas letras que formam tantas palavras, por que insistem em usar apenas <strong>1 letra como nome de variável</strong>? Pior, <strong>Por que usar sempre as mesmas?</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$d</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$dias</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span></pre></div></div>

<p>A primeira variável simplesmente não diz nada. Olhando ela não se consegue ter noção nenhuma do que ela representa, o que é o 3? Do mesmo modo se aplica a segunda variável, sabemos que são 2 dias, mas 2 dias não nos diz nada também. Olhando assim, só sabemos a unidade de medida!</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$dia_vencimento</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$qtde_dias_para_pagamento</span>  <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span></pre></div></div>

<p>Há quem reclame do tamanho das variáveis. Mas hoje em dia, que editor não auto-completa para você? Se o seu não, por favor, considere trocar =).</p>
<p>O que se deve cuidar ao se nomear uma variável, é não por algum nome que venha a ter mais de uma possibilidade de significado. Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$valor_frete_desconto</span> <span style="color: #339933;">=</span> <span style="color:#800080;">11.3</span><span style="color: #339933;">;</span></pre></div></div>

<p>O valor acima citado, é referente ao desconto dado ao frete, ao valor do frete a ser descontado ou o valor do frete com o desconto? Eu não afirmo nenhuma hipótese à partir do nome dado. Se me perguntarem, eu diria que olharia o código para afirmar. Por tanto, seja <strong>CLARO E OBJETIVO</strong>.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$valor_frete</span> <span style="color: #339933;">=</span> <span style="color:#800080;">13.4</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$valor_desconto_frete</span> <span style="color: #339933;">=</span> <span style="color:#800080;">2.3</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$valor_frete_descontado</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$valor_frete</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$valor_desconto_frete</span><span style="color: #339933;">;</span></pre></div></div>

<p>Caso o desconto do frete seja aplicado com porcentagem:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$pct_desconto_frete</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$valor_frete</span> <span style="color: #339933;">=</span> <span style="color:#800080;">13.4</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$valor_desconto_frete</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$valor_frete</span> <span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$pct_desconto_frete</span> <span style="color: #339933;">/</span> <span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$valor_frete_descontado</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$valor_frete</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$valor_desconto_frete</span><span style="color: #339933;">;</span></pre></div></div>

<p>A melhor coisa em relação às variáveis é justamente o fato de omitir o valor atrás de um nome inteligível. Por tanto, sempre que possível, esconda os valores, a legibilidade aumenta muito!</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">    <span style="color: #000088;">$arr_usrs</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$users</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$users</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span>
            <span style="color: #000088;">$arr_usrs</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$users</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$arr_usrs</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Pergunto:</p>
<ul>
<li>$arr_usrs é uma lista gerada à partir de que dados?</li>
<li>O que é o índice 3 do array usado no if ?</li>
<li>O que diabos quer dizer == 4?</li>
<li>O que devo esperar que $arr_usrs contenha?</li>
</ul>
</pre>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;STATUS&quot;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ATIVO&quot;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$contatosAtivos</span> <span style="color: #339933;">=</span> <span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$contatos_do_usuario</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$contato</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$contatos_do_usuario</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$status_do_contato</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$contato</span><span style="color: #009900;">&#91;</span>STATUS<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$status_do_contato</span> <span style="color: #339933;">==</span> ATIVO<span style="color: #009900;">&#41;</span>
            <span style="color: #000088;">$contatosAtivos</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$contato</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$contatosAtivos</span><span style="color: #339933;">;</span></pre></div></div>

<p>Acho que não preciso explicar o código, não é?</p>
<p>Outra coisa interessante, CUIDADO com as variáveis de duplo sentido.</p>
</pre>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$total</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$usuariosDoBanco</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><em>$total</em> recebeu o total de usuários do Banco de Dados ? o total de usuários de um determinado banco (BB, Santander, etc) ?</p>
<p>Sugestão:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$total</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$usuarios_cadastrados</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>ou, para o outro caso</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$total</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$clientes_santander</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Eu sei que muitas vezes é difícil escrever códigos de forma bonita, mas o esforço vale a pena! Além de ser um diferencial profissional, trabalhar no meio da zona é prejudicial a você mesmo!</p>
<p>Lembrou de algo? Tens outras dicas? Comenta aê!</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/236/varias-dicas-simples-de-legibilidade-de-codigos-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SchemaSpy &#8211; Ferramenta para Modelagem Literária</title>
		<link>http://gustavodutra.com/post/222/schemaspy-ferramenta-para-modelagem-literaria/</link>
		<comments>http://gustavodutra.com/post/222/schemaspy-ferramenta-para-modelagem-literaria/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 03:29:20 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[aumentar produtivade]]></category>
		<category><![CDATA[desenvolvimento web]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[engenharia de software]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[produtividade]]></category>
		<category><![CDATA[sgbd]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=222</guid>
		<description><![CDATA[No post anterior Vimperator, comportamente do Vim no Firefox eu tinha mensionado que:
Parece radical, mas a produtividade aumenta, de certo modo. Não só na hora de programar e testar, sempre que edito arquivos no Vim, tento não usar o mouse. Claro que sempre vai ter alguma aplicação que vai te obrigar a usar o mouse, [...]]]></description>
			<content:encoded><![CDATA[<p>No post anterior <a href="http://gustavodutra.com/post/175/vimperator-comportamento-do-vim-no-firefox/">Vimperator, comportamente do Vim no Firefox</a> eu tinha mensionado que:</p>
<blockquote><p>Parece radical, mas a produtividade aumenta, de certo modo. Não só na hora de programar e testar, sempre que edito arquivos no Vim, tento não usar o mouse. Claro que sempre vai ter alguma aplicação que vai te obrigar a usar o mouse, mas se pudermos evitar, melhor!</p></blockquote>
<p>Eu continuo com esta idéia. <em>Coisinha bonita é para cliente final</em>. Desenvolvedores devem trabalhar com ferramentas que proporcionam o melhor uso do tempo possível, pois o bom profissional é aquele que esbanja do ócio, eis o fluxo:</p>
<ul>
<li>Concluir as atividades rapidamente com <strong>eficácia e eficiência</strong> está diretamente ligado ao <strong>ócio</strong>, pois se ele tivesse feito algo mal feito, estaria corrigindo os bugs e não vendo vídeos no <a rel="nofollow" href="http://youtube.com">youtube</a>.</li>
<li>Com tempo livre, o cérebro humano fica mais descansado e mais propício a receber <strong>insights/intuições</strong> para resolver problemas difíceis, que &#8211; e estes merecem &#8211; precisam de mais tempo e necessitam ser bem planejados.</li>
<li>Resolvendo problemas de forma <strong>criativa</strong> &#8211; talvez até inovadora -, faz com que se evite problemas futuros. Logo, se poupa tempo. Se poupando tempo, voltamos a cláusula anterior.</li>
</ul>
<p>Parece utópico, mas eu acredito nisso. Eu acho que é possível. Basta saber onde conseguir ganhar tempo em atividades, <u>automatizando</u> com scripts, programas e etc, o tempo é <em>consequência</em>.</p>
<p><span id="more-222"></span></p>
<p>Todo Desenvolvedor Web já foi ou ainda é DBA. É inevitável aprender a utilizar banco de dados sem modelar os dados. Geralmente, para isso, é utilizado alguma ferramente gráfica que auxilia na visão do modelo. Não vou citar, mas existem várias para isso.</p>
<p>Porém, há um detalhe que muitos não se atinaram ainda. Me dei conta disso assistindo uma palestra no <a rel="nofollow" href="http://fisl.com.br/10/www/">FISL10</a>, na palestra do Leandro Dutra (se for parente, é primo de muitos graus :S) chamada <a rel="nofollow" href="http://fisl.softwarelivre.org/10/papers/pub/programacao/582">O elefante ilustrado: modelagem literária e documentação automática em PostgreSQL e outros SGBDs livres</a>.</p>
<h2>SchemaSpy</h2>
<h3>O que é?</h3>
<p>É uma ferramente que varre um banco de dados e gera um documentação em HTML nevegável. Ela gera gráfico de chaves estrangeiras utilizando o <a rel="nofollow" href="http://www.graphviz.org/">GraphViz</a> (.dot), como se fosse uma dessas ferramentas que terminam com <em>Designer</em>. </p>
<p>Esses gráficos gerados, são visivelmente bonitos e dispostos. Ou seja, não é mais necessário sofrer arrastando caixinhas de modo com que fique bem arrumado. O programa tem um bom algoritmo para organizar. O que possibilita que o DBA, ou o desenvolvedor mesmo, use este tempo para repensar uma constraint, uma foreign key, etc.</p>
<p>O HTML gerado também tem abas que diferenciam os conteúdos: abas para relacionamentos, abas para tabelas auxiliares, abas para listagem de colunas/tabelas, etc. Mostra os campos, o tipo dos campos, os comentários, valores em comum e as CONSTRAINTS. Ou seja, uma solução completa para documentação de bancos de dados e modelos de ER. Vem junto o <a rel="nofollow" href="http://jquery.com">jQuery</a>, que da uns efeitos e <em>toggleia</em> algumas colunas das tabelas de exibição.</p>
<h3>Onde conseguir?</h3>
<p>O site oficial deles é <a rel="nofollow" href="http://schemaspy.sourceforge.net">http://schemaspy.sourceforge.net</a>. Pode ser baixado de lá. Apenas o driver jdbc para o banco de dados que for ser usado deve ser encontrado separadamente.</p>
<p>Quem usa <a rel="nofollow" href="http://archlinux.com">ArchLinux</a>, pode baixar os repositórios do AUR. Eu mesmo sou o mantenedor do pacote, então, qualquer dúvida ou problema, comente lá que tentarei responder/resolver o mais rápido possível. O link do repositório é <a rel="nofollow" href="http://aur.archlinux.org/packages.php?ID=28022">http://aur.archlinux.org/packages.php?ID=28022</a></p>
<h3>Como usar?</h3>
<p>Para usar é muito simples. Depois de baixar o .jar, apenas execute</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ java -jar /path/to/schemaSpy.jar --help</pre></div></div>

<p>Ou, se você instalou o do repositório do <a rel="nofollow" href="http://archlinux.com">ArchLinux</a>, basta usar:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ schemaspy --help</pre></div></div>

<p>Ele vai listar os parâmetros, é bem simples. Não vou me deter a isso. Qualquer dúvida comente no post abaixo.</p>
<p>Um exemplo de output pode ser encontrado na própria página do SchemaSpy: <a rel="nofollow" href="http://schemaspy.sourceforge.net/sample/">http://schemaspy.sourceforge.net/sample/</a></p>
<h3>Sugestoẽs</h3>
<p>Se existe algum defeito nele, com certeza é o template. O HTML gerado não é o mais bonito. Não obstante, me parece que o template não é customizável, para isso seria necessário hackear a classe que gera o template. Mas, quem sabe não é implementado algo nas próximas versões? Quem sabe VOCÊ não implementa?</p>
<p>Mas bem, falando em sugestões, aqui vai algumas:</p>
<ul>
<li>Integrar com a documentação do <a rel="nofollow" href="http://phpdocumentor.org">phpDocumentor</a>, <a rel="nofollow" href="http://java.sun.com/j2se/javadoc/">javaDoc</a> ou outro similar.</li>
<li>Versionar a documentação gerada para avaliação de crescimento da aplicação: poder comparar como era há certo tempo atrás e como está hoje.</li>
<li>Programar os SQL&#8217;s utilizando algum editor de texto, fazendo você ganhar desempenho e analisar mais facilmente para comentários, constraints, triggers, procedures e views, que são geralmente mais complexas de serem vistas em programas gráficos.</li>
</ul>
<p>Mais alguma sugestão? Críticas? Deixem nos posts abaixo!</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/222/schemaspy-ferramenta-para-modelagem-literaria/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Como usar mod_rewrite de verdade</title>
		<link>http://gustavodutra.com/post/120/como-usar-mod_rewrite-de-verdade/</link>
		<comments>http://gustavodutra.com/post/120/como-usar-mod_rewrite-de-verdade/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 13:38:31 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[clean url]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[exemplo]]></category>
		<category><![CDATA[flexibilidade]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=120</guid>
		<description><![CDATA[Rá! Hoje quero falar sobre mod_rewrite. Um módulo para o apache que permite reescrever URL&#8217;s. Ele é muito útil em vários sentidos: aumenta a o page rank em buscadores, torna URL&#8217;s limpas e inteligíveis, fazendo com que o usuário consiga lembrá-las muito mais rápida e facilmente.
Porém, como todos os outros artefatos que estão por aí, [...]]]></description>
			<content:encoded><![CDATA[<p>Rá! Hoje quero falar sobre mod_rewrite. Um módulo para o apache que permite reescrever URL&#8217;s. Ele é muito útil em vários sentidos: aumenta a o page rank em buscadores, torna URL&#8217;s limpas e inteligíveis, fazendo com que o usuário consiga lembrá-las muito mais rápida e facilmente.</p>
<p>Porém, como todos os outros artefatos que estão por aí, pode complicar ainda mais a vida de um programador, caso não seja usado adequadamente.</p>
<p><span id="more-120"></span></p>
<h2>Introdução</h2>
<p>Como visto no post anterior, onde está descrito algumas vantagens e desvantages de se usar o mod_rewrite, neste post vamos concluir o assunto. Assumindo que você esteja usando Apache com o mod_rewrite habilitado. Também é necessário o uso de arquivos .htaccess: Arquivos ocultos que contém diretivas interpretadas pelo Apache. Para que seu .htaccess funcione, deve se certificar de que a diretiva <em>AllowOverride All</em> esteja nos arquivos de configuração do apache. Ela deve ficar dentro de &lt;Directory /&gt;, mais ou menos assim:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">	AllowOverride All</pre></div></div>

<p>Basta adicionar ao seus arquivos de configuração do apache ou requisitar seu servidor que o faça.</p>
<h2>Conhecendo as diretivas</h2>
<p>Antes de mais nada, vamos entender o que o mod_rewrite faz e é capaz de fazer, conhecendo seus parâmetros de configurações.</p>
<h4>RewriteEngine on|off</h4>
<p>Habilita(on) ou desabilita(off) o uso do módulo mod_rewrite.</p>
<h4>RewriteOptions [inherit] [MaxRedirects=X]</h4>
<p>   Adiciona uma ou as duas opções.</p>
<h5>inherit</h5>
<p>            Herda os parâmetros dos diretórios pai.</p>
<h5>MaxRedirects=X</h5>
<p>            Ao invés de permitir o &#8216;loop infinito&#8217; de redirecionamento, limita para X vezes. Caso, X seja alcançado, é disparado erro 500 (Internal Error).</p>
<h4>RewriteLog /caminho/para/arquivo.log</h4>
<p>Escreve o log dos eventos ocorridos no arquivo especificado.</p>
<h4>RewriteLogLevel Level</h4>
<p>Level inicia em 0 (desabilitado) e vai até 9 (números superiores podem ser utilizados, mas terão o mesmo efeito: irão logar quase tudo! Use somente para debug, pois vai diminuir a performance do apache. Bom para testes/debug, não para produção.)</p>
<h4>RewriteBase /dir</h4>
<p>Especifica /dir como a base para a procura do arquivo pelo Apache. (Mais explicações adiante)</p>
<h4>RewriteCond </h4>
<p>Responsável pela condições (a.k.a. IF&#8217;s). Pode-se utilizar inúmeros testes antes de especificar uma regra, sendo que a mesma só será executada ao passar por todos os testes com sucesso. Exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># Se o host for 123.45.67.89
RewriteCond %{REMOTE_ADDR} ^123.45.67.89$ [OR]
# ou for 98.76.54.32
RewriteCond %{REMOTE_ADDR} ^98.76.54.32
# A regra será a seguinte...</pre></div></div>

<p>Podem ser usadas uma série de variáveis, entre elas:</p>
<ul>
<li>%{HTTP_USER_AGENT}</li>
<li>%{HTTP_REFERER}</li>
<li>%{REMOTE_ADDR}</li>
<li>%{SCRIPT_FILENAME}</li>
<li>%{QUERY_STRING}</li>
<li>%{HTTP_HOST}</li>
<li>mais informações <a rel="nofollow" href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond">aqui</a></li>
</ul>
<h4>RewriteRule </h4>
<p>É aqui que realmente acontece a reestruturação da URL. Aqui é onde é dito o que deve ser entrepretado como o quê. Se o Padrão casar, o apache interpreta como se fosse o Caminho.</p>
<p>Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">RewriteRule ^/(about|aboutme|sobre|sobremim|eu|minhavida)$ eu.html [L,NC]</pre></div></div>

<h3>Referências interessantes:</h3>
<ul>
<li><a rel="nofollow" href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html" alt="Documentação do Apache">Documentação do Apache</a></li>
<li><a rel="nofollow" href="http://www.addedbytes.com/cheat-sheets/download/mod_rewrite-cheat-sheet-v2.png" alt="ModRewrite CheatSheet">ModRewrite CheatSheet</a></li>
</ul>
<h2>Exemplos de uso</h2>
<p>Agora, com alguma noção sobre o mod_rewrite, vamos utilizá-los. Com alguns exemplos do que é possível. A idéia é que você descubra um jeito próprio e que funcione PARA VOCÊ. Esta é o tipo da coisa que não adianta fazer porque alguém disse que funciona, deve seguir os seus padrões e cobrir suas necessidades.</p>
<h3>Exemplo 1: Organizando seu site no .htaccess</h3>
<p>Convenhamos: uma notícia sobre um acidente não irá mudar. Depois de submetida para um site de notícias, dificilmente ela irá ser modificada. Ao menos que tenha passado desapercebido um erro de português ou uma estatística imprecisa, uma notícia não será modificada. Portando, é possível manter um cache da notícia em um arquivo .html, evitando consultas desnecessárias a bancos de dados ou outras fontes. Mas só porque ela está em cache, não significa que ela deva aparecer com o .html no fim ou .htm ou seja lá o que for.</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">RewriteEngine On
RewriteBase /
# Se não foi requerido um arquivo vazio (-s)
RewriteCond %{REQUEST_FILENAME} !-s [OR]
# Se não foi requerido um link simbólico (-l)
RewriteCond %{REQUEST_FILENAME} !-l [OR]
# ou um arquivo (-f)
RewriteCond %{REQUEST_FILENAME} !-f [OR]
# ou um diretório (-d)
RewriteCond %{REQUEST_FILENAME} !-d
# Aplique a seguinte regra:
# Se for notícia cacheada, chama o cache
RewriteRule ^ler/([A-Za-z0-9_-]+)$ /noticias/cache/$1.html [L]
# Se for para buscar por noticias
RewriteRule ^buscar/([A-Za-z0-9_-]+) /noticias/busca.php?termo=$1&amp;area=noticias [L]
# Feeds
RewriteRule ^feeds$ feeds.php?area=noticias
# Feeds para a categoria X
RewriteRule ^feeds/(.*)$ feeds.php?area=noticias&amp;categoria=$1</pre></div></div>

<p>e assim por diante. Podemos estabelecer regras, inclusive, para subdomínios.</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">RewriteCond %{HTTP_HOST} ^en\.example\.com$
RewriteRule ^(.*)$ /news/english/index.php?q=$1 [L]
&nbsp;
RewriteCond %{HTTP_HOST} ^br\.example\.com$
RewriteRule ^(.*)$ /news/brazilian/index.php?q=$1 [L]</pre></div></div>

<p>uma outra sugestão:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">RewriteCond %{HTTP_HOST} ^en\.example\.com$
RewriteRule ^(.*)$ /news/index.php?lang=en&amp;q=$1 [L]
&nbsp;
RewriteCond %{HTTP_HOST} ^br\.example\.com$
RewriteRule ^(.*)$ /news/index.php?lang=pt-br&amp;q=$1 [L]</pre></div></div>

<h3>Exemplo 2: Listas de traduções</h3>
<p>A questão de usar uma única variável que receberá o valor da url, funciona melhor para este segundo caso:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-s [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,NC]</pre></div></div>

<p>Imagine que seu cliente queira criar páginas novas, de &#8216;política de privacidade&#8217;, &#8217;sobre a empresa&#8217;, seja lá qual for o assunto da página. Ele vai querer acessá-la de forma rápida e acessível. Para tanto, <em>index.php?area=view_page&#038;page=4354</em> não parece agradar muita gente. Não seria interessante deixar que o próprio cliente crie seu padrão de URL? Talvez /politicas ou /empresa.</p>
<p>Existe uma forma interessante de se fazer isso: usando uma lista de expressões regulares e seus arquivos originais, os quais serão usados caso as expressões regulares casarem. Por exemplo, nos casos acima, apenas com o código abaixo no .htaccess, já poderíamos fazer algo:</p>
<p>A idéia é usar a <strong>REQUEST_URI</strong> (no php <strong>$_SERVER['REQUEST_URI']</strong>). Ela retornará, por exemplo, <em>/ler/minha_noticia_bombastica</em> que casará com <em>^/ler/([a-z0-9_-])$</em> e por consequência, irá chamar a <em>noticias.php</em>. Agora, como pegar o &#8216;minha_noticia_bombastica&#8217; ? Fácil! Basta apenas utilizarmos os grupos das expressões regulares de forma apropriada. Usando o exemplo do php, com <em>preg_match</em> podemos resolver isso!</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$urlPatterns</span> <span style="color: #339933;">=</span> <span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span>
	<span style="color: #0000ff;">'/^ler\/([a-z0-9_-]+)$/i'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'noticias.php'</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$urlPatterns</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$pattern</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$fileName</span><span style="color: #009900;">&#41;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pattern</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REQUEST_URI'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vars</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$_GET</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$vars</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">include</span> <span style="color: #000088;">$fileName</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Pronto! Alguns usuários podem ter notado, mas <em>$vars</em> irá ser uma sequência numérica dos grupos casados:</p>
<p>   <strong>0 => /ler/minha_noticia_bombastica, 1 => &#8216;minha_noticia_bombastica&#8217;</strong></p>
<p> Para resolver isso, podemos dar nomes aos grupos, o que seria extremamente normal para o programador (que utilizaria a variável $_GET normalmente) e bonito aos olhos do cliente. Para tanto, modificamos a nossa $urlPatterns:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">	<span style="color: #000088;">$urlPatterns</span> <span style="color: #339933;">=</span> <span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'/ler\/(?&lt;news -slug&gt;[a-z0-9_-]+)$/i'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'noticias.php'</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">;&lt;/</span>news<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Assim, poderemos acessar <em>$_GET['news-slug']</em>. Como fica mais difícil do usuário modificar nomes de variáveis vindos da URL, se torna uma solução segura. Podemos ter certeza de que <em>$_GET['news-slug']</em> <strong>não conterá aspas, caracateres hexadecimais ou qualquer outro tipo de código malicioso</strong>. Pois se tivesse, não passaria no teste da expressão regular. E também nos certificamos de que aquele arquivo (noticias.php) só esteja sendo acessado, caso nossa index.php o esteja incluindo. Porque o usuário não conseguirá acessar de fora.</p>
<p>Neste caso, nós estipulamos os valores na <em>$urlPatterns</em>, mas ainda se pode pegar esses <strong>valores do banco de dados</strong>, por exemplo. Uma lista de &#8216;tradução&#8217; para a url. Funciona muito bem, principalmente com páginas estáticas ou fixas. Ao invés do cidadão digitar <em>index.php?area=pages&#038;page_id=4232</em>, ele estará acessando <em>/sobre-a-empresa</em>. Para usuários provenientes de sites de busca, isto é muito importante. Lhe dá muito mais <strong>segurança</strong> e você garante o seu clique. Ele vai direto ao ponto.</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/120/como-usar-mod_rewrite-de-verdade/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>O que é? Como e Por quê usar? &#8211; Decorator Pattern</title>
		<link>http://gustavodutra.com/post/24/o-que-e-como-e-por-que-usar-decorator-pattern/</link>
		<comments>http://gustavodutra.com/post/24/o-que-e-como-e-por-que-usar-decorator-pattern/#comments</comments>
		<pubDate>Mon, 29 Dec 2008 01:46:18 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[decorator]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[exemplo]]></category>
		<category><![CDATA[flexibilidade]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[oo]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[oque]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[porque]]></category>
		<category><![CDATA[reuso]]></category>

		<guid isPermaLink="false">http://blog.gustavodutra.com/?p=24</guid>
		<description><![CDATA[Rá! Acá estou eu para explicar um pouco mais sobre o Decorator pattern, um deles que eu acho pouco usado, mas pode salvar vidas. Tem poder na mão. Alguns podem já ter noção do que seja, mas outros devem estar se perguntando: &#8216;WTF??&#8217;. Então vamos lá:
Decorator Pattern
É um pattern desenvolvido para modificar um determinado objeto [...]]]></description>
			<content:encoded><![CDATA[<p>Rá! Acá estou eu para explicar um pouco mais sobre o <strong>Decorator pattern</strong>, um deles que eu acho pouco usado, mas pode salvar vidas. Tem poder na mão. Alguns podem já ter noção do que seja, mas outros devem estar se perguntando: &#8216;WTF??&#8217;. Então vamos lá:<span id="more-24"></span></p>
<h2>Decorator Pattern</h2>
<p>É um pattern desenvolvido para modificar um determinado objeto (seja modificar alguma coisa já existente ou delegar uma nova responsabilidade) sem a necessidade de extendê-lo. O que é muito bom, assim, o reaproveitamento de código é maior ainda! Enfim, vou tentar dar uma explicada no pattern:</p>
<div id="attachment_25" class="wp-caption aligncenter" style="width: 573px"><img class="size-full wp-image-25" title="Diagrama de Classes" src="http://blog.gustavodutra.com/wp-content/uploads/2008/12/class-diagram.png" alt="Diagrama de Classes do Decorator Pattern" width="530" height="291" /><p class="wp-caption-text">Diagrama de Classes do Decorator Pattern</p></div>
<p>Abaixo segue o código usado:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Message <span style="color: #009900;">&#123;</span>
&nbsp;
	protected <span style="color: #000088;">$msg</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMsg</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getMsg<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">msg</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setMsg<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">msg</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$msg</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __toString<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Success_Message <span style="color: #000000; font-weight: bold;">extends</span> Message <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$msg</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DivClass_Decorator<span style="color: #009900;">&#40;</span>
			<span style="color: #000000; font-weight: bold;">new</span> Li_Decorator<span style="color: #009900;">&#40;</span>
				<span style="color: #000088;">$this</span>
			<span style="color: #009900;">&#41;</span>
			<span style="color: #339933;">,</span><span style="color: #0000ff;">'success-msg'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>String<span style="color: #009900;">&#41;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Error_Message <span style="color: #000000; font-weight: bold;">extends</span> Message <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$newmsg</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DivClass_Decorator<span style="color: #009900;">&#40;</span>
			<span style="color: #000000; font-weight: bold;">new</span> Li_Decorator<span style="color: #009900;">&#40;</span>
				<span style="color: #000088;">$this</span>
			<span style="color: #009900;">&#41;</span>
			<span style="color: #339933;">,</span><span style="color: #0000ff;">'error-msg'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>String<span style="color: #009900;">&#41;</span><span style="color: #000088;">$newmsg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">interface</span> Msg_Decorator_Interface <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">function</span> render<span style="color: #009900;">&#40;</span>Message <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
abstract <span style="color: #000000; font-weight: bold;">class</span> Msg_Decorator_Abstract <span style="color: #000000; font-weight: bold;">extends</span> Message <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span>Message <span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">render</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Li_Decorator <span style="color: #000000; font-weight: bold;">extends</span> Msg_Decorator_Abstract implements Msg_Decorator_Interface <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> render<span style="color: #009900;">&#40;</span>Message <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$msg</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$message</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMsg</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'&lt;ul&gt;&lt;li&gt;'</span><span style="color: #339933;">.</span> <span style="color: #000088;">$msg</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/li&gt;&lt;/ul&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Div_Decorator <span style="color: #000000; font-weight: bold;">extends</span> Msg_Decorator_Abstract implements Msg_Decorator_Interface <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> render<span style="color: #009900;">&#40;</span>Message <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMsg</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'&lt;div&gt;'</span><span style="color: #339933;">.</span> <span style="color: #000088;">$message</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/div&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> DivClass_Decorator <span style="color: #000000; font-weight: bold;">extends</span> Msg_Decorator_Abstract implements Msg_Decorator_Interface <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$class</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span>Message <span style="color: #000088;">$msg</span><span style="color: #339933;">,</span> <span style="color: #000088;">$class</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">class</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$class</span><span style="color: #339933;">;</span>
		parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> render<span style="color: #009900;">&#40;</span>Message <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMsg</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'&lt;div class=&quot;'</span><span style="color: #339933;">.</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">null</span> <span style="color: #339933;">===</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">class</span>?<span style="color: #0000ff;">'default-class'</span><span style="color: #339933;">:</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;&gt;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$message</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/div&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>OK! Com o código em mãos, vamos pensar um pouquinho. Tenho uma cacetada de classes, todas fazendo praticamente a mesma coisa. E agora? Calma, Juvenal. Vamos analizar:</p>
<ol>
<li>Temos a classe Mensagem. Sabemos que ele representa uma mensagem. Métodos básicos para manipularmos a mensagem e um <em>__toString()</em> que irá retornar o valor em string pra classe quando for feito o cast.</li>
<li>Classe Msg_Decorator_Abstract que extende da classe Mensagem. Todos os nossos decoradores, por assim dizer, irão ser filhos desta classe. O exemplo é tão simples que a classe abstrata nem tem métodos abstratos. Mas a idéia é que tenha, caso necessário.</li>
<li>Msg_Decorator_Interface, essa interface obriga os programadores que quiserem criar decorators a escrever o método render(). Que é chamado pela nossa classe Abstract no construtor.</li>
<li><em>Li_Decorator, Div_Decorator e DivClass_Decorator</em> são exemplos de decorators.</li>
</ol>
<p>Vamos ver o negócio funcionando? Vamos escrever o seguinte código:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">   	<span style="color: #b1b100;">print</span> <span style="color: #000000; font-weight: bold;">new</span> Div_Decorator<span style="color: #009900;">&#40;</span>
			<span style="color: #000000; font-weight: bold;">new</span> Li_Decorator<span style="color: #009900;">&#40;</span>
				<span style="color: #000000; font-weight: bold;">new</span> Message<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Mensagem de teste!&quot;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Irá imprimir</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="xhtml" style="font-family:monospace;">&lt;div&gt;
&lt;ul&gt;
	&lt;li&gt;Mensagem de teste!&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</pre></td></tr></table></div>

<p>Viram? Simples e prático! Claro que o exemplo é bem simples e talvez nem seja tão útil. Mas é só pensar um pouquinho mais que logo surgem exemplos onde se usar o Decorator.</p>
<p>Entender agora fica mais fácil. Apenas comece olhando do meio para a esquerda. Primeiro nós instanciamos a classe Message com o mensagem &#8220;Mensagem de teste!&#8221;. O método <em>getMsg()</em> retornará exatamente isso: &#8220;Mensagem de teste!&#8221;. Porém, no momento em que é instanciado o <em>Li_Decorator</em>, ele vai mudar a mensagem usando o método <em>render()</em>, que deve ser implementado na <em>Msg_Decorator_Interface</em> e chamado na <em>Msg_Decorator_Abstract</em> pelo construtor. E assim acontece com o <em>Div_Decorator</em>.</p>
<p>Notem que eu decidi mudar o valor da mensagem usando o <em>setMsg</em>. Eu já li em alguns lugares onde fica armazenada a instância da classe anterior e então o método <em>getMsg</em> seria chamado em forma de cascata, fazendo com que a mensagem original nunca fosse alterada de verdade, e no fim ela é, igual a um método recursivo, retornada decorada e maquiada.</p>
<h2>Reutilizando o código</h2>
<p>Bom, como eu havia dito no começo, o Observer Pattern nos possibilita o <strong>reuso</strong>. O exemplo são aquelas duas classes das quais eu não cheguei a falar: <strong>Error_Message e Success_Message</strong>.</p>
<p>Observem que são simples e, utilizando os Decorators já existentes, mostram uma mensagem personalizada de Erro e de Sucesso! Para utilizá-las, basta usar:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">print</span> <span style="color: #000000; font-weight: bold;">new</span> Error_Message<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Erro! Você fez algo errado!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">print</span> <span style="color: #000000; font-weight: bold;">new</span> Success_Message<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Sucesso! Parabéns!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>O que imprimirá:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="xhtml" style="font-family:monospace;">&lt;div class=&quot;error-msg&quot;&gt;
&lt;ul&gt;
	&lt;li&gt;Error!&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;success-msg&quot;&gt;
&lt;ul&gt;
	&lt;li&gt;Sucesso! Parabéns!&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</pre></td></tr></table></div>

<h3>Prós</h3>
<ul>
<li>Adiciona <strong>flexibilidade</strong> ao código.</li>
<li>Facilmente <strong>reutilizada</strong>.</li>
<li>Ótimo para sistemas que possibilitam o uso de <strong>plugins</strong>.</li>
</ul>
<h3>Contras</h3>
<ul>
<li>Gera um grande número de arquivos (se for pensar que cada arquivo é uma classe ou vice-versa).</li>
<li>Dependendo da quantidade de classes aloca muita memória.</li>
<li>Ruim para sistemas mais fechados e bitolados ou muito padronizados.</li>
</ul>
<p>Acho que é isto pessoal. O que acharam? Não é um bixo de sete cabeças, né?</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/24/o-que-e-como-e-por-que-usar-decorator-pattern/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Como usar o GVim para tudo &#8211; Parte 1</title>
		<link>http://gustavodutra.com/post/1/como-usar-o-gvim-para-fazer-tudo-parte-1/</link>
		<comments>http://gustavodutra.com/post/1/como-usar-o-gvim-para-fazer-tudo-parte-1/#comments</comments>
		<pubDate>Thu, 25 Dec 2008 15:32:37 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Vim]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[insert]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/blog/wordpress/?p=1</guid>
		<description><![CDATA[Olá!
Os poucos que já me conhecem, sabem que sou fã do GVim. Nem Vi nem Vim. Sempre escuto pessoas falando de outros editores, como o bluefish, notepad++, emacs. Mas, eu sou cabeça-dura, ranzinza mesmo. Então vou fazer um série de posts mostrando umas coisas divertidas de se fazer usando o GVim para facilitar a vida [...]]]></description>
			<content:encoded><![CDATA[<p>Olá!</p>
<p>Os poucos que já me conhecem, sabem que sou fã do GVim. Nem Vi nem Vim. Sempre escuto pessoas falando de outros editores, como o bluefish, notepad++, emacs. Mas, eu sou cabeça-dura, ranzinza mesmo. Então vou fazer um série de posts mostrando umas coisas divertidas de se fazer usando o GVim para facilitar a vida e acelerar o desenvolvimento. São coisas pequenas mas, que às vezes, consomem um bom tempo e enchem o saco.</p>
<p>Começando por criar uma SQL de INSERT numa tabela que tenha muitas colunas. No exemplo abaixo, vou usar o PHP e MySQL para fazer, porém, é só adaptar pra outras linguagens.</p>
<p><span id="more-1"></span>Bom, vamos começar do começo:</p>
<h2>Listando as colunas.</h2>
<p>Vamos imaginar uma tabela do banco de dados que tenha muitas colunas. Como exemplo, vou usar uma própria do wordpress, que é responsável pelo armazenamento dos posts. A idéia do post não é ensinar expressão regular, mas sim mostrar como utilizá-la no GVim e mostrar o seu real poder.</p>
<h3>Criando à partir do terminal:</h3>
<p>Bom, tudo começa no conhecido terminal. Digitamos:</p>
<p># mysql -uUSER -pSENHA DATABASE -e &#8220;describe TABLE;&#8221; #No meu caso usei a tabela de posts wordpress</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">+-----------------------+---------------------+------+-----+---------------------+----------------+
| Field                 | Type                | Null | Key | Default             | Extra          |
+-----------------------+---------------------+------+-----+---------------------+----------------+
| ID                    | bigint(20) unsigned | NO   | PRI | NULL                | auto_increment |
| post_author           | bigint(20)          | NO   |     | 0                   |                |
| post_date             | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_date_gmt         | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_content          | longtext            | NO   |     | NULL                |                |
| post_title            | text                | NO   |     | NULL                |                |
| post_category         | int(4)              | NO   |     | 0                   |                |
| post_excerpt          | text                | NO   |     | NULL                |                |
| post_status           | varchar(20)         | NO   |     | publish             |                |
| comment_status        | varchar(20)         | NO   |     | open                |                |
| ping_status           | varchar(20)         | NO   |     | open                |                |
| post_password         | varchar(20)         | NO   |     |                     |                |
| post_name             | varchar(200)        | NO   | MUL |                     |                |
| to_ping               | text                | NO   |     | NULL                |                |
| pinged                | text                | NO   |     | NULL                |                |
| post_modified         | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_modified_gmt     | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_content_filtered | text                | NO   |     | NULL                |                |
| post_parent           | bigint(20)          | NO   | MUL | 0                   |                |
| guid                  | varchar(255)        | NO   |     |                     |                |
| menu_order            | int(11)             | NO   |     | 0                   |                |
| post_type             | varchar(20)         | NO   | MUL | post                |                |
| post_mime_type        | varchar(100)        | NO   |     |                     |                |
| comment_count         | bigint(20)          | NO   |     | 0                   |                |
+-----------------------+---------------------+------+-----+---------------------+----------------+</pre></div></div>

<p>Deve aparecer algo parecido com isso para você. Bom, para facilitar, apagamos manualmente as 3 primeras linhas e a última. Ou, se quiser fazer pelo gvim digitando:</p>
<pre>:1,3g/^./d
:$g/^./d</pre>
<p>Bom, o comando g, vai fazer um busca e, logo após, executa um comando. No nosso caso as três primeiras linhas que contenham pelo menos 1 caracter e a última linha do arquivo.</p>
<h2>Jogando o lixo no lixo</h2>
<pre>:%s/^|\s*\([^ ]*\).*/\1/g</pre>
<p>Você obterá algo assim:</p>
<pre>ID
post_author
post_date
post_date_gmt
post_content
post_title
post_category
post_excerpt
post_status
comment_status
ping_status
post_password
post_name
to_ping
pinged
post_modified
post_modified_gmt
post_content_filtered
post_parent
guid
menu_order
post_type
post_mime_type
comment_count</pre>
<p>&#8220;It&#8217;s like magic!&#8221; Wow. Sim. Usamos o %s, que substitui no arquivo inteiro. Notem que é necessário escapar os parênteses para criar grupos em expressão regular. Isso é devido a utilidade do GVim. Em um editor cuja finalidade é facilitar a vida na programação, não teria sentido ao contrário. Afinal, procurar por um if ( ou um while () é muito comum. E ter que ficar escapando tudo, ia ser um saco! Bom, uma explicação melhor:</p>
<ul>
<li> %s -&gt; substitui em todo arquivo.</li>
<li>/^|\s*\([^ ]*\).*/ -&gt; Começa com | pode ter espaços (captura tudo que não for espaços) o resto da linha que não nos interessa.</li>
<li>\1/g -&gt; \1 Faz uma referência ao primeiro grupo capturado na expressão anterior, no caso (tudo que não for espaço). O g é para que pudesse casar mais de uma vez. Neste caso não é necessário (força do hábito).</li>
</ul>
<p>Notem que é necessário aquele .* do final, pois a expressão que casar, é a expressão substituída. E não somente o que estiver entre os grupos. Colocando o que queremos manter no grupo (no caso o nome da coluna) e substituimos a linha inteira pelo nome da coluna.</p>
<h2>Juntando numa única linha</h2>
<p>Bom, agora é simples! Para montarmos a SQL precisamos juntar elas em 1 linha só. Para isso, olhamos o número de linhas que tem no arquivo e, no modo normal, com o ponteiro na primeira coluna da primeira linha (pra ter certeza pode ser digitado gg), digitamos:</p>
<p>(NUMERO_DE_LINHAS)J &#8211; Por exemplo: O arquivo tem 24 linhas, então será digitado: 24J. Tendo elas em uma só linha, basta substituir os espaços por vírgula:</p>
<pre>%s/\s/, /g</pre>
<p>Colocar o digitado entre parênteses e depois digitar: yypp. Agora temos duas linhas iguais, assim:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">(ID, post_author, post_date, post_date_gmt, post_content, post_title, post_category, post_excerpt, post_status, comment_status, ping_status, post_password, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_content_filtered, post_parent, guid, menu_order, post_type, post_mime_type, comment_count)
(ID, post_author, post_date, post_date_gmt, post_content, post_title, post_category, post_excerpt, post_status, comment_status, ping_status, post_password, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_content_filtered, post_parent, guid, menu_order, post_type, post_mime_type, comment_count)
(ID, post_author, post_date, post_date_gmt, post_content, post_title, post_category, post_excerpt, post_status, comment_status, ping_status, post_password, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_content_filtered, post_parent, guid, menu_order, post_type, post_mime_type, comment_count)</pre></div></div>

<h2>Dando forma</h2>
<p>Bom, digitamos manualmente INSERT INTO e VALUES, no começo da primeira linha e ao final, respectivamente.</p>
<p>Na linha de baixo, vamos utilizar uma coisinha legal:</p>
<pre>:2s/\([^,]*\)[,]?/'%s', /g</pre>
<p>O que acaba na seguinte transformação linha 2:</p>
<pre>'%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s',</pre>
<p>Basta ajustar os detalhes, parênteses e vírgulas a mais! (Poderia ser feito um grupo na vírgula, pra se caso ela existir, colocar, e não por, caso contrário. Mas eu achei muita frescura) E agora o toque final:</p>
<pre>:3s/\([^,()]*\)[,]?/addslashes($_POST['\1']), /g</pre>
<p>O que retorna:</p>
<pre>addslashes($_POST['(ID']), addslashes($_POST['post_author']), addslashes($_POST['post_date']), addslashes($_POST['post_date_gmt']), addslashes($_POST['post_content']), addslashes($_POST['post_title']), addslashes($_POST['post_category']), addslashes($_POST['post_excerpt']), addslashes($_POST['post_status']), addslashes($_POST['comment_status']), addslashes($_POST['ping_status']), addslashes($_POST['post_password']), addslashes($_POST['post_name']), addslashes($_POST['to_ping']), addslashes($_POST['pinged']), addslashes($_POST['post_modified']), addslashes($_POST['post_modified_gmt']), addslashes($_POST['post_content_filtered']), addslashes($_POST['post_parent']), addslashes($_POST['guid']), addslashes($_POST['menu_order']), addslashes($_POST['post_type']), addslashes($_POST['post_mime_type']), addslashes($_POST['comment_count)']),</pre>
<p>E, para concluir tudo, colocamos dentro de um sprintf, tudo termina assim:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$insertSQL</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;INSERT INTO (ID, post_author, post_date, post_date_gmt, post_content, post_title, post_category, post_excerpt, post_status, comment_status, ping_status, post_password, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_content_filtered, post_parent, guid, menu_order, post_type, post_mime_type, comment_count) VALUES (
'<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>', '<span style="color: #009933; font-weight: bold;">%s</span>'
)&quot;</span><span style="color: #339933;">,</span><span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ID'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_author'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_date'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_date_gmt'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_content'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_title'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_category'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_excerpt'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_status'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'comment_status'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ping_status'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_password'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_name'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'to_ping'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'pinged'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_modified'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_modified_gmt'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_content_filtered'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_parent'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'guid'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'menu_order'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_type'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_mime_type'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'comment_count'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ah, vamos, não foi tão difícil nem demorado! Garanto que você perderia mais tempo tendo que fazer isso manualmente!</p>
<h2>Copiando do phpMyAdmin:</h2>
<p>Bom, para aqueles que trabalham com o phpMyAdmin, basta ir na tabela deseja e, da aba Estrutura, copiar a tabela para o GVim, vai ficar algo mais ou menos assim:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">ID  	bigint(20)  	 	UNSIGNED  	Não  	 	auto_increment  	  Navegador distingue valores   	  Alterar   	  Eliminar   	  Primária   	  Único   	  Índice   	 Texto completo
	post_author 	bigint(20) 			Não 	0 		Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	post_date 	datetime 			Não 	0000-00-00 00:00:00 		Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	post_date_gmt 	datetime 			Não 	0000-00-00 00:00:00 		Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	post_content 	longtext 	utf8_general_ci 		Não 			Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	post_title 	text 	utf8_general_ci 		Não 			Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	post_category 	int(4) 			Não 	0 		Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	post_excerpt 	text 	utf8_general_ci 		Não 			Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	post_status 	varchar(20) 	utf8_general_ci 		Não 	publish 		Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	comment_status 	varchar(20) 	utf8_general_ci 		Não 	open 		Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	ping_status 	varchar(20) 	utf8_general_ci 		Não 	open 		Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	post_password 	varchar(20) 	utf8_general_ci 		Não 			Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	post_name 	varchar(200) 	utf8_general_ci 		Não 			Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	to_ping 	text 	utf8_general_ci 		Não 			Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	pinged 	text 	utf8_general_ci 		Não 			Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	post_modified 	datetime 			Não 	0000-00-00 00:00:00 		Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	post_modified_gmt 	datetime 			Não 	0000-00-00 00:00:00 		Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	post_content_filtered 	text 	utf8_general_ci 		Não 			Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	post_parent 	bigint(20) 			Não 	0 		Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	guid 	varchar(255) 	utf8_general_ci 		Não 			Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	menu_order 	int(11) 			Não 	0 		Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	post_type 	varchar(20) 	utf8_general_ci 		Não 	post 		Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	post_mime_type 	varchar(100) 	utf8_general_ci 		Não 			Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo
	comment_count 	bigint(20) 			Não 	0 		Navegador distingue valores 	Alterar 	Eliminar 	Primária 	Único 	Índice 	Texto completo</pre></div></div>

<p>Vamos remover o que não nos é necessário e pegar somente a primeira coluna dessa tabela separada por tabs, digitando no GVim:</p>
<p>:%s/\s*\([^ \t]*\).*/\1/g</p>
<p>Bom, conseguimos o que queríamos. Uma coluna em cada linha. Agora é só concluir como descrito acima, onde os dados provém do terminal. o/</p>
<h3>Conclusão</h3>
<p>Idéias, sugestões, receitas de bolos e muito mais, vocês podem me mandar por e-mail ou comentar abaixo!<br />
E lembrem-se: mais dicas de coisas que podem ser feitas no GVim estão por vir!</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/1/como-usar-o-gvim-para-fazer-tudo-parte-1/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
