<?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; Software Livre</title>
	<atom:link href="http://gustavodutra.com/categoria/software-livre/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>Acessando a freenode.org por SSL no Irssi</title>
		<link>http://gustavodutra.com/post/370/acessando-a-freenode-org-por-ssl-no-irssi/</link>
		<comments>http://gustavodutra.com/post/370/acessando-a-freenode-org-por-ssl-no-irssi/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 20:59:15 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[archlinux]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[irc]]></category>
		<category><![CDATA[irssi]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=370</guid>
		<description><![CDATA[Bom, recentemente a FreeNode.org adicionou suporte a conexões SSL. Não que eu faça questão, porém meu irssi perdia a conexão com o server. Fui para o google e decidi postar a dica de como resolvi o problema e habilitei a conexão SSL.

Primeiro, eu baixei um script que a própria FreeNode.org disponibiliza para o irssi, o [...]]]></description>
			<content:encoded><![CDATA[<p>Bom, recentemente a <a rel="nofollow" href="http://freenode.org">FreeNode.org</a> adicionou suporte a conexões SSL. Não que eu faça questão, porém meu <a rel="nofollow" href="http://irssi.org" rel="nofollow">irssi</a> perdia a conexão com o server. Fui para o google e decidi postar a dica de como resolvi o problema e habilitei a conexão SSL.</p>
<p><span id="more-370"></span></p>
<p>Primeiro, eu baixei um script que a própria <a rel="nofollow" href="http://freenode.org">FreeNode.org</a> disponibiliza para o irssi, o instalei e depois algumas dependências.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>.irssi<span style="color: #000000; font-weight: bold;">/</span>scripts<span style="color: #000000; font-weight: bold;">/</span>autorun <span style="color: #666666; font-style: italic;">#Se o diretório não existir, crie-o</span>
<span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>www.freenode.net<span style="color: #000000; font-weight: bold;">/</span>sasl<span style="color: #000000; font-weight: bold;">/</span>cap_sasl.pl</pre></div></div>

<p>Como maioria das dependências não estavam nos repositórios oficiais do <a rel="nofollow" href="http://archlinux.org">Arch Linux</a> nem do <a rel="nofollow" href="http://aur.archlinux.org">AUR</a>, eu tive que as instalar separadamente e ai já aproveitei pra fazer um script de instalação com todas as dependências. Esse script funciona em qualquer distro. São necessários os seguintes módulos: <strong>Math::BigInt, Math::BigInt::FastCalc, Math::BigInt::GMP, Math::BigInt::Pari, Crypt::DH e Crypt::OpenSSL::BigNum</strong>.</p>
<p>Abra um novo arquivo e cole as linhas abaixo, será nosso script de instalação.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #007800;">packages</span>=<span style="color: #7a0874; font-weight: bold;">&#40;</span>Math-BigInt-<span style="color: #000000;">1.89</span> Math-BigInt-FastCalc-<span style="color: #000000;">0.19</span> Math-BigInt-GMP-<span style="color: #000000;">1.24</span> Math-BigInt-Pari-<span style="color: #000000;">1.13</span> Crypt-DH-<span style="color: #000000;">0.06</span> Crypt-OpenSSL-Bignum-<span style="color: #000000;">0.04</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>cpan-comp
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>cpan-comp
<span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>www.cpan.org<span style="color: #000000; font-weight: bold;">/</span>authors<span style="color: #000000; font-weight: bold;">/</span>id<span style="color: #000000; font-weight: bold;">/</span>T<span style="color: #000000; font-weight: bold;">/</span>TE<span style="color: #000000; font-weight: bold;">/</span>TELS<span style="color: #000000; font-weight: bold;">/</span>math<span style="color: #000000; font-weight: bold;">/</span>Math-BigInt-1.89.tar.gz
<span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>www.cpan.org<span style="color: #000000; font-weight: bold;">/</span>authors<span style="color: #000000; font-weight: bold;">/</span>id<span style="color: #000000; font-weight: bold;">/</span>T<span style="color: #000000; font-weight: bold;">/</span>TE<span style="color: #000000; font-weight: bold;">/</span>TELS<span style="color: #000000; font-weight: bold;">/</span>math<span style="color: #000000; font-weight: bold;">/</span>Math-BigInt-FastCalc-0.19.tar.gz
<span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>www.cpan.org<span style="color: #000000; font-weight: bold;">/</span>authors<span style="color: #000000; font-weight: bold;">/</span>id<span style="color: #000000; font-weight: bold;">/</span>T<span style="color: #000000; font-weight: bold;">/</span>TE<span style="color: #000000; font-weight: bold;">/</span>TELS<span style="color: #000000; font-weight: bold;">/</span>math<span style="color: #000000; font-weight: bold;">/</span>Math-BigInt-GMP-1.24.tar.gz
<span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>www.cpan.org<span style="color: #000000; font-weight: bold;">/</span>authors<span style="color: #000000; font-weight: bold;">/</span>id<span style="color: #000000; font-weight: bold;">/</span>T<span style="color: #000000; font-weight: bold;">/</span>TE<span style="color: #000000; font-weight: bold;">/</span>TELS<span style="color: #000000; font-weight: bold;">/</span>math<span style="color: #000000; font-weight: bold;">/</span>Math-BigInt-Pari-1.13.tar.gz
<span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>www.cpan.org<span style="color: #000000; font-weight: bold;">/</span>authors<span style="color: #000000; font-weight: bold;">/</span>id<span style="color: #000000; font-weight: bold;">/</span>B<span style="color: #000000; font-weight: bold;">/</span>BT<span style="color: #000000; font-weight: bold;">/</span>BTROTT<span style="color: #000000; font-weight: bold;">/</span>Crypt-DH-0.06.tar.gz
<span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>www.cpan.org<span style="color: #000000; font-weight: bold;">/</span>authors<span style="color: #000000; font-weight: bold;">/</span>id<span style="color: #000000; font-weight: bold;">/</span>I<span style="color: #000000; font-weight: bold;">/</span>IR<span style="color: #000000; font-weight: bold;">/</span>IROBERTS<span style="color: #000000; font-weight: bold;">/</span>Crypt-OpenSSL-Bignum-0.04.tar.gz
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> pkg <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #007800;">$packages</span>; <span style="color: #000000; font-weight: bold;">do</span>
	<span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xzvf</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$pkg</span>.tar.gz&quot;</span> ;
	<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$pkg</span>&quot;</span> ;
	<span style="color: #c20cb9; font-weight: bold;">perl</span> Makefile.PL ;
	<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #7a0874; font-weight: bold;">test</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span> ;
	<span style="color: #7a0874; font-weight: bold;">cd</span> .. ;
<span style="color: #000000; font-weight: bold;">done</span>;</pre></div></div>

<p>OK, o <a rel="nofollow" href="http://garotosopa.wordpress.com/">garotosopa</a> tirou toda a graça do meu script, me alertando uma coisa da qual não sabia, para instalar um módulo do perl, basta digitar:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">cpan <span style="color: #660033;">-i</span> Math::BigInt Math::BigInt::FastCalc Math::BigInt::GMP Math::BigInt::Pari Crypt::DH Crypt::OpenSSL::Bignum</pre></div></div>

<p>Inicie o irssi e digite:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">/sasl set freenode Seu_nick Sua_Senha DH-BLOWFISH
/sasl save
/save
/quit</pre></div></div>

<p>Agora, é só ajeitar o config do irssi.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">vim</span> ~<span style="color: #000000; font-weight: bold;">/</span>.irssi<span style="color: #000000; font-weight: bold;">/</span>config</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">servers <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #009900;">&#123;</span>
		address <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;irc.freenode.org&quot;</span><span style="color: #339933;">;</span>
		chatnet <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;freenode&quot;</span><span style="color: #339933;">;</span>
		port <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;7000&quot;</span><span style="color: #339933;">;</span>
		use_ssl <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;yes&quot;</span><span style="color: #339933;">;</span>
		ssl_verify <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;yes&quot;</span><span style="color: #339933;">;</span>
		ssl_capath <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;/etc/ssl/certs&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Entre no irssi novamente e pronto! Só usar o /connect freenode !</p>
<p>E ai, gostou? </p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/370/acessando-a-freenode-org-por-ssl-no-irssi/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Solucionando problema com mmkeys.so no exaile do archlinux</title>
		<link>http://gustavodutra.com/post/327/solucionando-problema-com-mmkeys-so-no-exaile-do-archlinux/</link>
		<comments>http://gustavodutra.com/post/327/solucionando-problema-com-mmkeys-so-no-exaile-do-archlinux/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 00:23:52 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[arch linux]]></category>
		<category><![CDATA[archlinux]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[exaile]]></category>
		<category><![CDATA[hotkeys]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[mmkeys.so]]></category>
		<category><![CDATA[xev]]></category>
		<category><![CDATA[xkeys]]></category>
		<category><![CDATA[xmodmap]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=327</guid>
		<description><![CDATA[As hotkeys, ou teclas de atalho, sempre são úteis para quando você está escutando uma música e alguém lhe pergunta algo, ou precisa ir no banheiro ou precisa passar a música porque a atual é ruim. O exaile sempre foi meu player preferido. Simpatizo muito com ele. Para as teclas de atalho sempre utilizei o [...]]]></description>
			<content:encoded><![CDATA[<p>As <strong>hotkeys</strong>, ou teclas de atalho, sempre são úteis para quando você está escutando uma música e alguém lhe pergunta algo, ou precisa ir no banheiro ou precisa passar a música porque a atual é ruim. O <em>exaile</em> sempre foi meu player preferido. Simpatizo muito com ele. Para as teclas de atalho sempre utilizei o plugin <strong>Xkeys</strong>.</p>
<p>Depois de atualizado o pacote exaile do <strong>ArchLinux</strong>, o plugin <strong>XKeys</strong> parou de funcionar e não aceitava mais minhas teclas de atalho do teclado para manipular áudio, como forward, backward, stop, play, etc.</p>
<p>Esse problema era antigo, ele acusava que era necessário a lib <strong>mmkeys.so</strong> e que não estava presente. Nunca tinha tempo pra verificar o problema, até que eu decidi ir atrás.</p>
<p><span id="more-327"></span></p>
<h2>Configurando as teclas</h2>
<p>O objetivo do post é solucionar o problema, mas para não ficar descontextualizado, vou mostrar como mapear as teclas. É fácil e biodegradável, não polui o meio ambiente.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">xev <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> keycode</pre></div></div>

<p>Vão vir linhas confusas a cada tecla pressionada. O importante é o número junto o &#8220;<strong>keycode</strong>&#8220;. Pegue o número da respectiva tecla e escreva em ~/.<strong>Xmodmap</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">keycode NUMERO = XF86AudioLowerVolume
keycode NUMERO = XF86AudioMedia
keycode NUMERO = XF86AudioMute
keycode NUMERO = XF86AudioNext
keycode NUMERO = XF86AudioPlay
keycode NUMERO = XF86AudioPrev</pre></div></div>

<p>Substitua o NUMERO pelo número do keycode que você detectou com o xev, acho que está claro o que cada um representa, né? Abra o arquivo ~/.<strong>xinitrc</strong> e adicione</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">xmodmap</span> ~<span style="color: #000000; font-weight: bold;">/</span>.Xmodmap</pre></div></div>

<p>Se você tiver preguiça de reiniciar a interface gráfica, pode digitar o comando acima para fazer as teclas funcionarem. Ai é só habilitar no exaile!!!</p>
<h2>Ajustando o Exaile</h2>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">pacman <span style="color: #660033;">-Ql</span> exaile <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> mmkeys</pre></div></div>

<p>Identifiquei que a mmkeys.so realmente não constava nos arquivos de instalação do <em>exaile</em>. Como o <em>pacman</em> guarda um cache das versões dos programas que eu instalei e atualizei, fui verificando os arquivos de cada uma delas atrás dessa lib, pois um dia isso havia funcionado.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">pacman <span style="color: #660033;">-Qpl</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>cache<span style="color: #000000; font-weight: bold;">/</span>pacman<span style="color: #000000; font-weight: bold;">/</span>pkg<span style="color: #000000; font-weight: bold;">/</span>exaile-0.2.14-2.pkg.tar.gz <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> mmkeys</pre></div></div>

<p>Esta foi a última versão que tem a dita lib (exaile /usr/lib/exaile/<strong>mmkeys.so</strong>) &#8211; aparentemente o problema veio da versão 3 em diante -, então bastou eu jogá-la para /usr/lib/exaile.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>exaile-src
<span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xzvf</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>cache<span style="color: #000000; font-weight: bold;">/</span>pacman<span style="color: #000000; font-weight: bold;">/</span>pkg<span style="color: #000000; font-weight: bold;">/</span>exaile-0.2.14-2.pkg.tar.gz <span style="color: #660033;">-C</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>exaile-src
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>exaile-src<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>exaile<span style="color: #000000; font-weight: bold;">/</span>mmkeys.so <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>exaile<span style="color: #000000; font-weight: bold;">/</span>mmkeys.so
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-r</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>exaile-src</pre></div></div>

<p>Pronto! Não precisa nem reiniciar o exaile, apenas habilitar o plugin <strong>XKeys</strong> que ele irá reconhecer automaticamente as suas teclas de atalhos.</p>
<p>Não fui atrás para saber se é problema no empacotamento ou o quê, mas deve funcionar isto até sair uma outra solução.</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/327/solucionando-problema-com-mmkeys-so-no-exaile-do-archlinux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tchelinux 2009 &#8211; Porto Alegre</title>
		<link>http://gustavodutra.com/post/309/tchelinux-2009-porto-alegre/</link>
		<comments>http://gustavodutra.com/post/309/tchelinux-2009-porto-alegre/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 15:28:29 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[aumentar produtivade]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[palestra]]></category>
		<category><![CDATA[porque]]></category>
		<category><![CDATA[produtividade]]></category>
		<category><![CDATA[tchelinux]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=309</guid>
		<description><![CDATA[Para quem é do Sul, estarei em Porto Alegre no dia 14/11/2009 ministrando duas palestras no evento Tchelinux. A programação tem mais de 60 palestras sobre diversos temas e a entrada é apenas 2kg de alimentos não perecíveis. Aqueles que participarem recebem um atestado de 10h para usar como atividade complementar.
Para mais informações http://www.tchelinux.org/2009. As [...]]]></description>
			<content:encoded><![CDATA[<p>Para quem é do Sul, estarei em Porto Alegre no dia 14/11/2009 ministrando duas palestras no evento <a rel="nofollow" href="http://www.tchelinux.org">Tchelinux</a>. A programação tem mais de 60 palestras sobre diversos temas e a entrada é apenas 2kg de alimentos não perecíveis. Aqueles que participarem recebem um atestado de 10h para usar como atividade complementar.</p>
<p>Para mais informações <a rel="nofollow" href="http://www.tchelinux.org/2009">http://www.tchelinux.org/2009</a>. As palestras serão:</p>
<h3>VIM-de a mim, produtividade</h3>
<p>Uma palestra que mostra maneiras para um edição de texto efetiva e rápida usando o vim.</p>
<h3>jQuery &#8211; Introdução</h3>
<p>Apresenta o porquê do jQuery ser um excelente framework para desenvolvimento rápido com javascript.</p>
<p>Se alguém tiver assistido a alguma palestra, favor dar um feedback!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/309/tchelinux-2009-porto-alegre/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usando Screen e Vim para Pair Programming remoto</title>
		<link>http://gustavodutra.com/post/276/usando-screen-e-vim-para-pair-programming-remoto/</link>
		<comments>http://gustavodutra.com/post/276/usando-screen-e-vim-para-pair-programming-remoto/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 22:09:59 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[Vim]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[engenharia de software]]></category>
		<category><![CDATA[extreme programming]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[open-source]]></category>
		<category><![CDATA[pair programming]]></category>
		<category><![CDATA[screen]]></category>
		<category><![CDATA[skype]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=276</guid>
		<description><![CDATA[Bem, é notável o crescimento das metodologias ágeis de desenvolvimento de software. Uma das práticas que me agrada muito, é a programação em pares (pair programming). É bem perceptível, a um longo prazo, a diferença que faz essa prática. Navegando pela internet, como um marujo sem rumo, encontrei um post falando sobre Remote Pair Programming. [...]]]></description>
			<content:encoded><![CDATA[<p>Bem, é notável o crescimento das <strong>metodologias ágeis de desenvolvimento de software</strong>. Uma das práticas que me agrada muito, é a programação em pares (<em>pair programming</em>). É bem perceptível, a um longo prazo, a diferença que faz essa prática. Navegando pela internet, como um marujo sem rumo, encontrei um post falando sobre <em>Remote Pair Programming</em>. Parece meio estranho, porque o XP (<a rel="nofollow" href="http://www.extremeprogramming.org/">eXtreme Programming</a>) faz alusão a uma dupla programar em um único computador, com um único teclado e um único mouse.<br />
<span id="more-276"></span><br />
Então, vamos tentar simular este ambiente utilizando 4 ferramentas simples:</p>
<ul>
<li>screen</li>
<li>ssh</li>
<li>vim</li>
<li>skype</li>
</ul>
<p>Destas, só o <em>skype</em> não é <em>open-source</em>. Mas é interessante manter uma conversa verbal, pois conversas escritas podem desviar o foco da programação, que é bem mais rápida e precisa do que a escrita, que pode deixar brechas para má interpretações. A conversa verbal consegue interromper o programador ao mesmo tempo em que escreve, corrigindo-o ou questionando-o.</p>
<p>Conectados no skype, basta decidir em qual máquina será o desenvolvimento. Esta, por sua vez, terá que ter um servidor <strong>ssh</strong>. Ela será o <em>host</em> da programação. Será necessário, também, nesta máquina, ter instalado o <em>screen</em>, que é um programa que possibilita criar &#8217;sessões&#8217; no terminal.</p>
<h2>Host</h2>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">screen</span> <span style="color: #660033;">-S</span> PairProgramming</pre></div></div>

<p>Parece que nada mudou, mas você está numa sessão do <strong>screen</strong> chamada <em>PairProgramming</em>.</p>
<p>Precione CTRL+a e digite:</p>

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

<p>Pressione CTRL+a novamente e digite:</p>

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

<p>Tudo que você ver nesta sessão, será visto pelo outro usuário (<em>usuarioclient</em>) que se conectará nela.</p>
<p>Então, abra o <strong>vim</strong>, pois será necessário um edito de textos de verdade <img src='http://gustavodutra.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> , e se divirta:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">vim</span> <span style="color: #000000; font-weight: bold;">/</span>caminho<span style="color: #000000; font-weight: bold;">/</span>arquivo</pre></div></div>

<h2>Client</h2>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ssh</span> usuarioclient<span style="color: #000000; font-weight: bold;">@</span>host
<span style="color: #c20cb9; font-weight: bold;">screen</span> <span style="color: #660033;">-x</span> usuariohost<span style="color: #000000; font-weight: bold;">/</span>PairProgramming</pre></div></div>

<p>Pronto! Agora você está acessando a mesma seção! Tudo que o <em>usuáriohost</em> fizer, o <em>usuárioclient</em> enxergará e <strong>vice-versa</strong>.</p>
<p>Agora, basta descutir a tarefa via Skype e programar. As atualizações são em tempo real, ou seja, aparecem ao mesmo tempo que são escritos, digo&#8230; depende da conexão, mas não é um grande problema.</p>
<p>Caso seja necessário que o usuarioclient não possa modificar o código, apenas assitir e dar pitacos, o usuáriohost deve pressionar CTRL+A e digitar:</p>
<pre>:aclchg usuarioclient -w #</pre>
<p>Eu ainda vou programar assim, depois digo a experiência.</p>
<h2>Referências</h2>
<ul>
<li><a rel="nofollow" href="http://www.linux.com/archive/feature/56443">Linux.com</a></li>
<li><a rel="nofollow" href="http://haruska.com/2009/09/29/remote-pair-programming/">Jason Haruska</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/276/usando-screen-e-vim-para-pair-programming-remoto/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Usando Vim dentro do Eclipse</title>
		<link>http://gustavodutra.com/post/257/usando-vim-dentro-do-eclipse/</link>
		<comments>http://gustavodutra.com/post/257/usando-vim-dentro-do-eclipse/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 11:43:36 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[Vim]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[vimrc]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=257</guid>
		<description><![CDATA[Pois é, quem nunca mexeu com java que atire a primeira pedra. Trabalhar com java fora de um IDE é realmente muito ruim. Mas deveria eu criar uma IDE em modo texto para o Vim ou ver alguma solução para o meu problema no google? 
Eu já sabia da existência, mas nunca tinha visto um [...]]]></description>
			<content:encoded><![CDATA[<p>Pois é, quem nunca mexeu com java que atire a primeira pedra. Trabalhar com java fora de um IDE é realmente muito ruim. Mas deveria eu criar uma IDE em modo texto para o Vim ou ver alguma solução para o meu problema no <a rel="nofollow" href="http://google.com" target="_blank">google</a>? </p>
<p>Eu já sabia da existência, mas nunca tinha visto um motivo para fazê-lo. Trata-se do vim ou gvim dentro do Eclipse. Alguns motivos que me tentaram a usá-lo:</p>
<ul>
<li>Compilar é muito mais simples no eclipse.</li>
<li>Achar arquivos em pacotes é mais fácil com o Project Browser</li>
<li>Pode-se utilizar outros plugins do Eclipse, como o de modelagem pra Swing, AWT, etc</li>
<li>Integração com o SVN</li>
</ul>
<p><span id="more-257"></span></p>
<h2>Instalação</h2>
<p>A instalação está descrita no próprio site do <a rel="nofollow" href="http://vimplugin.org" target="_blank">Vimplugin</a>, e pode ser encontrada em <a rel="nofollow" href="http://vimplugin.org/installation" target="_blank">http://vimplugin.org/installation</a>.</p>
<p>Na configuração, ignore o campo de porta e senha, deixe como está. Apenas passe o caminho para o vim (geralmente <em>/usr/bin/vim</em> ou <em>/usr/bin/gvim</em>) e marque a opção &#8220;Embed vim to eclipse&#8221;. Pois se ela não estiver marcada, o vim é aberto externamente. Com o gvim, ao invés do vim, o eclipse coloca até os menus e toolbars, caso não estejam escondidos com o <strong>guioptions</strong>.</p>
<p>Pelo fato de se poder especificar argumentos opcionais para o vim, é possível fazer um .vimrc específico para utilização com o Eclipse. Muito útil.</p>
<h2>Utilização</h2>
<p>Para abrir um arquivo pelo vim: Botão direito sobre o arquivo > Open with > Vim.</p>
<p>Todas as funcionalidades estão presentes. Só não consegui fazer funcionar o <em>DELETE</em>, tem que ser no <em>backspace</em> ou <em>x</em>. Pode-se abrir vários arquivos em buffers e/ou abas, usar macros e substituições por expressões regulares, igual como quando independente.</p>
<h2>Conclusão</h2>
<p>Ainda prefiro o (g)vim sozinho, é mais leve e prático. Mas convenhamos, para java, talvez essa realmente seja a melhor opção. Alguém tem crítica sobre outros plugins?</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/257/usando-vim-dentro-do-eclipse/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Criando apresentações Power Point pelo Vim</title>
		<link>http://gustavodutra.com/post/229/criando-apresentacoes-power-point-pelo-vim/</link>
		<comments>http://gustavodutra.com/post/229/criando-apresentacoes-power-point-pelo-vim/#comments</comments>
		<pubDate>Sun, 26 Jul 2009 21:56:13 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[Vim]]></category>
		<category><![CDATA[aumentar produtivade]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[gvim]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[openoffice]]></category>
		<category><![CDATA[power point]]></category>
		<category><![CDATA[produtividade]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[vimrc]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=229</guid>
		<description><![CDATA[Essa semana eu precisei de uma apresentação Power Point. Abri o Impress, o editor de apresentações do OpenOffice. Comecei meu raciocínio sobre a apresentação. Quando me dei conta, estava colocando negrito e identando um parágrafo. Ao reler o parágrafo, havia 3 erros de gramática. Foi a gota d&#8217;água: Não consigo criar apresentações, pensei.
Quando eu vou [...]]]></description>
			<content:encoded><![CDATA[<p>Essa semana eu precisei de uma apresentação Power Point. Abri o Impress, o editor de apresentações do OpenOffice. Comecei meu raciocínio sobre a apresentação. Quando me dei conta, estava colocando negrito e identando um parágrafo. Ao reler o parágrafo, havia 3 erros de gramática. Foi a gota d&#8217;água: Não consigo criar apresentações, pensei.</p>
<p>Quando eu vou escrever em algum programa de qualquer suíte de escritório &#8211; openoffice, koffice, etc -, eu geralmente me preocupo mais com o negrito da palavra, com identação do parágrafo do que com o conteúdo em si. Isso é um pecado.</p>
<p>Meu primeiro instinto foi: vou escrever tudo no Vim, depois colo no Impress. Boa! Ok, mas e quanto às páginas?<br />
Vou ter que por página por página? Ainda sim eu teria mais trabalho. Eu teria que refazer as listas para que ficassem com as &#8220;bolinhas&#8221; à esquerda. E teria que modificar todos os títulos para negrito?</p>
<p><span id="more-229"></span></p>
<p>Fui pro google e achei um plugin que já conhecia no resultado: <a rel="nofollow" href="http://www.vimoutliner.org/">VimOutliner</a>. Ele dita uma sintaxe muito intuitiva para hierarquisar (existe esse verbo?) o conteúdo. Algo assim:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Título do documento
&nbsp;
Tópico Nível 1
	Tópico Nível 2
	: Parágrafo com alinhamento justify
	; Parágrafo fica do jeito que foi escrito
	- Item de lista
	+ Item de lista numérica</pre></div></div>

<p>O plugin vem com documentação e um shell script que instala automaticamente o plugin. O site tem toda documentação, é bem simples.</p>
<p>Em <a rel="nofollow" href="http://perens.com/FreeSoftware/Outline/">http://perens.com/FreeSoftware/Outline/</a> é possível encontrar vários scripts que convertem o documento para outros formatos. Um deles é o vo2odp.rb, um script em ruby para converter arquivos para o OpenOffice Presentation.</p>
<p>Pra fazê-lo rodar, eu sofri um pouquinho. Tive que instalar o ruby (obviamente) e o rubygems. Depois de instalado:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ gem install builder
$ gem install rubyzip</pre></div></div>

<p>Também alterei o script, segue o patch das modificações:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">29,30c29,30
&lt; require_gem 'builder'
&lt; require_gem 'rubyzip'
---
&gt; require 'builder'
&gt; require 'zip/zip'</pre></div></div>

<p>Copie o trecho acima em um arquivo, por exemplo: /tmp/patch_vo2odp, depois execute</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ patch /caminho/para/vo2odp.rb &lt; /tmp/patch_vo2odp</pre></div></div>

<p>Pronto, agora só escrever sua apresentação. Lembre-se que o plugin tem uma extenção própria, a .otl. Sempre que um arquivo for aberto com esta extenção, o Vim irá carregar o syntax highlight apropriado e algumas outras opções para melhor escrever sua apresentação.</p>
<p>Concluída a apresentação, você pode usar</p>
</pre>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ruby /caminho/para/vo2odp.rb apresentacao.otl apresentacao.odp</pre></div></div>

<p>Abra com o OpenOffice e salve como .ppt. Pronto! Você acabou de fazer sua apresentação no PowerPoint pelo Vim.</p>
<h3>Observações importantes</h3>
<ul>
<li>O script não quebra as páginas dos slides automaticamente. É separado por capítulos de nível 1. Então, não escreva coisas muito longas dentro de um nível. Lembre-se que é uma apresentação e não um documento de texto.</li>
<li>Quando aberto no OpenOffice, use o negrito, sublinhado, coloque imagens, etc. Crie seu layout e não pense nisso durante a criação do conteúdo. Escreva antes e formate depois</li>
</ul>
<p>E isso ai! Gostou? Não? Comente! Dê dicas e sugestões!</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/229/criando-apresentacoes-power-point-pelo-vim/feed/</wfw:commentRss>
		<slash:comments>0</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>Como baixar e converter vídeos do youtube no linux</title>
		<link>http://gustavodutra.com/post/58/como-baixar-e-converter-videos-do-youtube-no-linux/</link>
		<comments>http://gustavodutra.com/post/58/como-baixar-e-converter-videos-do-youtube-no-linux/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 18:17:15 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[slackware]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://blog.gustavodutra.com/?p=58</guid>
		<description><![CDATA[Aloha! Neste pequeno e simples tutorial (afinal de contas baixar e converter vídeos do youtube é bem mais simples do que você imagina!) vou mostrar a forma mais roots de como baixar vídeos do youtube e converter ela para o formato que quiser. Para isso, vou usar o Slackware 12.2 (testei também no ubuntu 8.04 [...]]]></description>
			<content:encoded><![CDATA[<p>Aloha! Neste pequeno e simples tutorial (afinal de contas baixar e converter vídeos do youtube é bem mais simples do que você imagina!) vou mostrar a forma mais <em>roots</em> de como baixar vídeos do youtube e converter ela para o formato que quiser. Para isso, vou usar o Slackware 12.2 (testei também no ubuntu 8.04 e funcionou legal).</p>
<p>Bom, vamos aos requisitos dos quais vamos precisar:</p>
<ul>
<li>Pacote ffmpeg instalado (geralmente vem com o mplayer, pode ser instalado por apt-get. Também há uma build no linuxpackages)</li>
<li>1 Browser de sua preferência.</li>
<li>1 xícara de café puro sem açúcar</li>
<li>Uma tesoura sem ponta</li>
<li>Cola em bastão</li>
<li>1 url de algum vídeo do youtube</li>
</ul>
<p><span id="more-58"></span></p>
<h2>Baixando o vídeo do youtube</h2>
<p>Modo de preparo:</p>
<ol>
<li>Abra o browser de sua preferência e acesse a url do vídeo do youtube. Eu vou utilizar: http://www.youtube.com/watch?v=dMR0VRb7g60 uma música dos &#8216;Os Nerds&#8217; que fala de um cara que pede &#8220;me dê op no #seu_coração&#8221;, uma paródia com &#8220;here comes you&#8217;re man&#8221;.</li>
<li>Após ter carregada a página, abra o código-fonte do mesmo. (Firefox: CTRL+U).</li>
<li>Localize no meio de tudo aquilo a string &#8220;t&#8221;, sim com aspas e tudo &#8220;t&#8221;. No meu caso ele está nessa linha:

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">var swfArgs = {&quot;q&quot;: &quot;os%20nerds%20kick%20de%20amor&quot;, &quot;vq&quot;: null, &quot;sourceid&quot;: &quot;ys&quot;, &quot;video_id&quot;: &quot;dMR0VRb7g60&quot;, &quot;l&quot;: 164, &quot;sk&quot;: &quot;C4c1AWqTMKCqlc-ps6iNq8hHDwAaAkYAU&quot;, &quot;fmt_map&quot;: &quot;&quot;, &quot;usef&quot;: 0, &quot;t&quot;: &quot;OEgsToPDskJ9NevmQow7fOToemrym1db&quot;, &quot;hl&quot;: &quot;en&quot;, &quot;plid&quot;: &quot;AARgxT891VByDIGsAAAAoAAAAAA&quot;};</pre></div></div>

<p>Viu ele? &#8220;t&#8221;: &#8220;OEgsToPDskJ9NevmQow7fOToemrym1db&#8221;</li>
<li>Copie(com a tesoura sem ponta) aquele token (OEgsToPDskJ9NevmQow7fOToemrym1db) da página do seu vídeo</li>
<li>Agora, na barra de endereços do browser, vamos trocar um pouco as coisas. o que era:<br />
http://www.youtube.com/watch?v=dMR0VRb7g60 vai se tornar: http://www.youtube.com/get_video?video_id=dMR0VRb7g60&#038;t=OEgsToPDskJ9NevmQow7fOToemrym1db (Observerem que trocamos: watch por get_video, v por video_id e adicionamos &#038;t=TOKEN), onde depois de &#038;t= colamos com cola bastão o aquele token que retiramos do código-fonte.</li>
<li>Dando um enter, ele vai pedir pra fazer o download. Esse download é justamente o flv.</li>
<li>Enquanto baixa o vídeo, você toma a 1 xícara de café puro sem açucar.</li>
</ol>
<h2>Convertendo o Vídeo</h2>
<p>Bom, nem todo player toca .flv, então talvez alguns queiram convertê-lo pra .mp3 ou pra .avi, .ogg ou .mpeg. Para isso, vamos utilizar o ffmpeg.</p>
<h3>Convertendo para mp3</h3>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">ffmpeg -author &quot;Os nerds&quot; -title &quot;Me dê op&quot; -i download/get_video.flv -ab 128 -ac 2 -acodec mp3 -vn -y ~/&quot;Musicas/Os nerds - Me dê op.mp3&quot;</pre></div></div>

<p>Voalá! os comandos -author e -title vão mexer na IDv3 da mp3. Assim, quando executar num player, vai aparecer bonitinho o autor e a música. -ab para especificar o bitrate, -i = arquivo de entrada, e -vn = desabilita a gravação de vídeo. -y = é para sobreescrever o arquivo de destino. Ah! e o -acodec para selecionar o codec do audio e -ac o número de canais.</p>
<p>UPDATE<br />
Usando o Arch Linux eu notei que o <strong>-acodec mp3</strong> não funcionava. Portanto, caso vocês não conseguirem com -acodec mp3, tentem: <strong>-acodec libmp3lame</strong></p>
<h3>Convertendo para avi</h3>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">ffmpeg -i download/get_video.flv -ab 56 -y ~/&quot;Clipes/Os nerds - Me dê op.avi&quot;</pre></div></div>

<p>Mais parâmetros, ajuda e outras coisas: http://swoolley.org/man.cgi/1/ffmpeg<br />
Agora você não precisa mais aqueles programinhas cheio de spyware ou ver 300 erros antes de conseguir baixar o vídeo pelo vixy.net!</p>
<p>Qualquer dúvida comente!</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/58/como-baixar-e-converter-videos-do-youtube-no-linux/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>
