<?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; python</title>
	<atom:link href="http://gustavodutra.com/tag/python/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>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>Dicas de como aumentar a produtividade usando autocmd no vim</title>
		<link>http://gustavodutra.com/post/153/dicas-de-como-aumentar-a-produtividade-usando-autocmd-no-vim/</link>
		<comments>http://gustavodutra.com/post/153/dicas-de-como-aumentar-a-produtividade-usando-autocmd-no-vim/#comments</comments>
		<pubDate>Sun, 12 Apr 2009 02:06:11 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Vim]]></category>
		<category><![CDATA[abreviaturas]]></category>
		<category><![CDATA[aumentar produtivade]]></category>
		<category><![CDATA[autocmd]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[gvimrc]]></category>
		<category><![CDATA[gzip]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[porque]]></category>
		<category><![CDATA[produtividade]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[reuso]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[vimrc]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=153</guid>
		<description><![CDATA[Quantas vezes você faz um arquivo que é exatamente igual à um outro arquivo por dia? Quantas vezes você abre um arquivo só para copiar um trecho de código que é utilizado em vários arquivos? Quantas vezes você se vê fazendo a mesma coisa que fez em outro lugar?
E aquela palavra que você sempre escreve [...]]]></description>
			<content:encoded><![CDATA[<p>Quantas vezes você faz um arquivo que é exatamente igual à um outro arquivo por dia? Quantas vezes você abre um arquivo só para copiar um trecho de código que é utilizado em vários arquivos? Quantas vezes você se vê fazendo a mesma coisa que fez em outro lugar?</p>
<p>E aquela palavra que você sempre escreve errada? Aquela função que você sempre esquece o nome?</p>
<p>Conheça algumas dicas para aumentar a produtividade e diminuir o trabalho dessas coisas rotineiras.</p>
<p><span id="more-153"></span></p>
<h2>Lista de Abreviaturas</h2>
<p>Sabe aquelas palavras que a gente insiste em escrever errado? Principalmente quem trabalha com e-mails, códigos e comentários em outras línguas tem dificuldades com certas palavras. Por exemplo,</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">vc -&gt; você
q -&gt; que
pq -&gt; porque
nao -&gt; não</pre></div></div>

<p>Agora a pergunta que não quer calar: Porque não usarmos algo para evitar esse tipo de coisa? Às vezes nem notamos os erros, mas eles estão lá. Mantenha uma lista de abreviaturas no Vim. Cuide dela, adicione novas abreviaturas assim que vierem à sua cabeça. A sintaxe é simples, basta adicionar no seu .vimrc:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">&quot;&quot; abbr ERRADO CORRETO, por exemplo:
abbr pq porque
abbr vc você</pre></div></div>

<p>O Vim ainda possibilita que você crie sintaxes diferentes para arquivos diferentes. Então, seus arquivos <strong>.txt</strong> podem ter abreviaturas diferentes das de <strong>.py</strong>. Ou seja, se o nome daquela função python é muito <strong>longa</strong> ou você insiste em escrevê-la errada, ela merece uma abreviatura, no formato descrito acima (abbr ERRADO CORRETO).</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">$ mkdir -p ~/.vim/abreviaturas/
$ vim ~/.vim/abreviaturas/txt.vim</pre></div></div>

<p>Adicione ao txt.vim as abreviaturas utilizadas para arquivos texto. Mesmo que poucas, coloque algumas. Um pouco de disciplina fará com que sua produtividade aumente. Tenha certeza.</p>
<p>Ao seu .vimrc, basta acrescentar:</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #668080;">autocmd</span> BufNewFile,BufRead <span style="color: #000000;">*</span> source <span style="color: #000000;">$</span>HOME<span style="color: #000000;">/.</span>vim<span style="color: #000000;">/</span>abreviaturas<span style="color: #000000;">/</span>para_qualquer_linguagem<span style="color: #000000;">.</span>vim
<span style="color: #668080;">autocmd</span> BufNewFile,BufRead <span style="color: #000000;">*.</span>txt source <span style="color: #000000;">$</span>HOME<span style="color: #000000;">/.</span>vim<span style="color: #000000;">/</span>abreviaturas<span style="color: #000000;">/</span>txt<span style="color: #000000;">.</span>vim
<span style="color: #668080;">autocmd</span> BufNewFile,BufRead <span style="color: #000000;">*.</span>py source <span style="color: #000000;">$</span>HOME<span style="color: #000000;">/.</span>vim<span style="color: #000000;">/</span>abreviaturas<span style="color: #000000;">/</span>python<span style="color: #000000;">.</span>vim</pre></div></div>

<p>O <em>autocmd</em> funciona mais ou menos igual a uma <em>trigger</em>. É um sistema de eventos, basicamente. Ou seja, ao abrir um arquivo novo (BufNewFile) ou um arquivo já existente (BufRead), se o nome do arquivo casar com a expressão (no caso, *, *.txt ou *.py) irá executar o código a seguir.</p>
<p>Vou falar mais sobre o autocmd em outro post, tem muitoooo pano pra manga, hehehe.</p>
<h2>Templates de Arquivos</h2>
<p>Quando se fala em programação é meio que como na arte. Não só porque programar é uma arte, mas porque nada se cria, tudo se copia. Tudo bem que, hoje em dia, com técnicas de encapsulamento, oop, etc, fica mais difícil. Mas sempre há coisas em comum entre os arquivos. Vamos começar com algo simples.</p>
<p>Template básico para javascript, onde será utilizado jquery.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">onready</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #006600; font-style: italic;">// code here</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Simples, mas não é um saco ter que escrever isso sempre que abre um arquivo novo? Tome isso como regra: Faça uma, porém apenas uma vez. Não seria mais fácil abrir o arquivo e tcha-ram! Lá está o código que, em 90% dos casos, você irá utilizar?</p>
<p>Esse foi pequeninho, mas imagine um arquivo html. A trabalheira que é copiar todo o caçalho. E se você segue um padrão, pode usar inclusive o css junto. Observe:</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
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt; !DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;pt&quot; lang=&quot;pt-br&quot; dir=&quot;ltr&quot;&gt;
	&lt;head&gt;
		&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
		&lt;meta http-equiv=&quot;Content-Style-Type&quot; content=&quot;text/css&quot; /&gt;
		&lt;meta name=&quot;keywords&quot; content=&quot;aqui,vai,as,keywords&quot; /&gt;
		&lt;link rel=&quot;stylesheet&quot; href=&quot;/style.css&quot; /&gt;
		&lt;link rel=&quot;shortcut icon&quot; href=&quot;/favicon.ico&quot; /&gt;
        &lt;/head&gt;
        &lt;body&gt;
        &lt;div id=&quot;wrapper&quot;&gt;
                &lt;div id=&quot;head&quot;&gt;&lt;/div&gt;
                &lt;div id=&quot;content&quot;&gt;&lt;/div&gt;
                &lt;div id=&quot;footer&quot;&gt;&lt;/div&gt;
        &lt;/div&gt;
&lt;/body&gt;&lt;/html&gt;</pre></td></tr></table></div>

<p>E o css:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="css" style="font-family:monospace;">html <span style="color: #00AA00;">*</span> <span style="color: #00AA00;">&#123;</span>
<span style="color: #00AA00;">&#125;</span>
body <span style="color: #00AA00;">&#123;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#wrapper</span> <span style="color: #00AA00;">&#123;</span>
<span style="color: #00AA00;">&#125;</span>
        <span style="color: #cc00cc;">#wrapper</span> <span style="color: #cc00cc;">#head</span> <span style="color: #00AA00;">&#123;</span>
        <span style="color: #00AA00;">&#125;</span>
        <span style="color: #cc00cc;">#wrapper</span> <span style="color: #cc00cc;">#content</span> <span style="color: #00AA00;">&#123;</span>
        <span style="color: #00AA00;">&#125;</span>
        <span style="color: #cc00cc;">#wrapper</span> <span style="color: #cc00cc;">#footer</span> <span style="color: #00AA00;">&#123;</span>
        <span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p>Imagine um designers, aqueles que fazem o psd e depois passam pra xhtml, tendo que copiar isso vezes e vezes para todos os arquivos que ele faz. Faça apenas uma vez e siga o padrão!</p>
<p>Usuários de django, ao criar um model, precisam escrever sempre os imports ? Se são utilizados sempre, porque não criar um template?</p>
<p>Agora você me pergunta, como carregar o template automagicamente no Vim ? Fácil! Utilizando nosso autocmd =). Do mesmo modo que fizemos com as abreviaturas, vamos criar os diretórios:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">$ mkdir -p ~/.vim/templates/</pre></div></div>

<p>Criei lá os arquivos com os templates que você acha útil.</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #668080;">autocmd</span> BufNewFile <span style="color: #000000;">*.</span>html 0r <span style="color: #000000;">~/.</span>vim<span style="color: #000000;">/</span>templates<span style="color: #000000;">/</span>html<span style="color: #000000;">.</span>tpl
<span style="color: #668080;">autocmd</span> BufNewFile style<span style="color: #000000;">.</span>css 0r <span style="color: #000000;">~/.</span>vim<span style="color: #000000;">/</span>templates<span style="color: #000000;">/</span>cssstyle<span style="color: #000000;">.</span>tpl
<span style="color: #668080;">autocmd</span> BufNewFile jquery<span style="color: #000000;">.*.</span>js 0r <span style="color: #000000;">~/.</span>vim<span style="color: #000000;">/</span>templates<span style="color: #000000;">/</span>jqueryjs<span style="color: #000000;">.</span>tpl</pre></div></div>

<p>Agora, abra seu Vim e sinta a magia:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">vim index.html style.css jquery.initscript.js</pre></div></div>

<h2>Executando comandos externos</h2>
<h3>g(un)zip</h3>
<p>O manual do Vim tem um exemplo bem interessante, para abrir arquivos <strong>gzipados</strong>, editá-los, como se nada tivesse acontecido e salvá-lo no formato <strong>gzip</strong> de novo. Apesar de que aqui, não precisou acrescentar os códigos abaixo, ele já fez automático. Basta adicionar o .vimrc</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;">augroup gzip
  <span style="color: #668080;">autocmd</span><span style="color: #000000;">!</span>
  <span style="color: #668080;">autocmd</span> BufReadPre,FileReadPre	<span style="color: #000000;">*.</span>gz set bin
  <span style="color: #668080;">autocmd</span> BufReadPost,FileReadPost	<span style="color: #000000;">*.</span>gz <span style="color: #C5A22D;">'[,'</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">!</span>gunzip
  <span style="color: #668080;">autocmd</span> BufReadPost,FileReadPost	<span style="color: #000000;">*.</span>gz set nobin
  <span style="color: #668080;">autocmd</span> BufReadPost,FileReadPost	<span style="color: #000000;">*.</span>gz <span style="color: #804040;">execute</span> <span style="color: #C5A22D;">&quot;:doautocmd BufReadPost &quot;</span> <span style="color: #000000;">.</span> <span style="color: #25BB4D;">expand</span><span style="color: #000000;">&#40;</span><span style="color: #C5A22D;">&quot;%:r&quot;</span><span style="color: #000000;">&#41;</span>
  <span style="color: #668080;">autocmd</span> BufWritePost,FileWritePost	<span style="color: #000000;">*.</span>gz <span style="color: #000000;">!</span>mv <span style="color: #000000;">&lt;</span>afile<span style="color: #000000;">&gt;</span> <span style="color: #000000;">&lt;/</span>afile<span style="color: #000000;">&gt;&lt;</span>afile<span style="color: #000000;">&gt;:</span>r
  <span style="color: #668080;">autocmd</span> BufWritePost,FileWritePost	<span style="color: #000000;">*.</span>gz <span style="color: #000000;">!</span>gzip <span style="color: #000000;">&lt;/</span>afile<span style="color: #000000;">&gt;&lt;</span>afile<span style="color: #000000;">&gt;:</span>r
&nbsp;
  <span style="color: #668080;">autocmd</span> FileAppendPre		<span style="color: #000000;">*.</span>gz <span style="color: #000000;">!</span>gunzip <span style="color: #000000;">&lt;/</span>afile<span style="color: #000000;">&gt;&lt;</span>afile<span style="color: #000000;">&gt;</span>
  <span style="color: #668080;">autocmd</span> FileAppendPre		<span style="color: #000000;">*.</span>gz <span style="color: #000000;">!</span>mv <span style="color: #000000;">&lt;/</span>afile<span style="color: #000000;">&gt;&lt;</span>afile<span style="color: #000000;">&gt;:</span>r <span style="color: #000000;">&lt;/</span>afile<span style="color: #000000;">&gt;&lt;</span>afile<span style="color: #000000;">&gt;</span>
  <span style="color: #668080;">autocmd</span> FileAppendPost		<span style="color: #000000;">*.</span>gz <span style="color: #000000;">!</span>mv <span style="color: #000000;">&lt;/</span>afile<span style="color: #000000;">&gt;&lt;</span>afile<span style="color: #000000;">&gt;</span> <span style="color: #000000;">&lt;/</span>afile<span style="color: #000000;">&gt;&lt;</span>afile<span style="color: #000000;">&gt;:</span>r
  <span style="color: #668080;">autocmd</span> FileAppendPost		<span style="color: #000000;">*.</span>gz <span style="color: #000000;">!</span>gzip <span style="color: #000000;">&lt;/</span>afile<span style="color: #000000;">&gt;&lt;</span>afile<span style="color: #000000;">&gt;:</span>r
augroup END
<span style="color: #000000;">&lt;/</span>afile<span style="color: #000000;">&gt;</span></pre></div></div>

<h3>Verificação por erro</h3>
<p>Já deve ter acontecido com você: você salva o arquivo e quando vai testar, faltou um ponto e vírgula, ou escrever o nome de uma função errada, ou algo similar&#8230; um erro bobo, mas que não deixou seu código ser executado e exige reparo.</p>
<p>Para ajudar contra esse trabalho desnecessário (teste + correção + teste), que pode se repetir inúmeras vezes, você pode usar o autocmd para alertá-lo, utilizando ferramentas externas. Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #668080;">autocmd</span> BufWritePost <span style="color: #000000;">*.</span>pl <span style="color: #000000;">!</span>perl <span style="color: #000000;">-</span>c <span style="color: #000000;">%</span>
<span style="color: #668080;">autocmd</span> BufWritePost <span style="color: #000000;">*.</span>php <span style="color: #000000;">!</span>php <span style="color: #000000;">-</span>l <span style="color: #000000;">%</span>
<span style="color: #668080;">autocmd</span> BufWritePost <span style="color: #000000;">*.</span>java <span style="color: #000000;">!</span>javac <span style="color: #000000;">-</span>Xlint <span style="color: #000000;">%</span></pre></div></div>

<h2>Use a criativdade</h2>
<p>Utilize sua criatividade e seja mais produtivo na SUA rotina. Deixe as coisas serem automatizadas. Para mais eventos do autocmd, :help autocmd. Tem uma lista bem extensa. Leia a documentação e seja feliz =). Crítias, sugestões e CASES são bem vindos nos comentários =)</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/153/dicas-de-como-aumentar-a-produtividade-usando-autocmd-no-vim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como fazer tudo com GVim &#8211; Parte 2</title>
		<link>http://gustavodutra.com/post/137/como-fazer-tudo-com-gvim-parte-2/</link>
		<comments>http://gustavodutra.com/post/137/como-fazer-tudo-com-gvim-parte-2/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 03:29:49 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Vim]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[gist]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[texmate]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[vim.org]]></category>
		<category><![CDATA[wiki]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=137</guid>
		<description><![CDATA[Hey! Dando continuidade à série: &#8216;Como Fazer Tudo com o GVim&#8217;, nesse segundo post, vou mostrar algumas coisas que podem não fazer muito sentido, mas fazem, definitivamente acerca do que o vim é capaz (e ótimo que o seja) de fazer.
Como o vim tem suporte à programação em python e ruby, ou seja, você pode [...]]]></description>
			<content:encoded><![CDATA[<p>Hey! Dando continuidade à série: &#8216;Como Fazer Tudo com o GVim&#8217;, nesse segundo post, vou mostrar algumas coisas que podem não fazer muito sentido, mas fazem, definitivamente acerca do que o vim é capaz (e ótimo que o seja) de fazer.</p>
<p>Como o vim tem suporte à programação em python e ruby, ou seja, você pode programar em python ou ruby para fazer plugins e afins para o vim, pode-se, evidentemente, utilizar biliotecas nativas das linguages, ou até mesmo API&#8217;s próprias.</p>
<p><span id="more-137"></span></p>
<h2>Não é frescura!</h2>
<p>Editor de texto é aquele programa onde você consegue escrever tudo que você quer realmente escrever. Diversas vezes vamos escrever, mas o pensamento consegue ser mais rápido, e, por uma questão de segundos, some. O editor de texto está aí para isto. Ele tem que facilitar o fluxo entre o cérebro e o computador. Nisso, o vim é muito bom. Responder emails, escrever posts de blogs, tudo que envolve texto.</p>
<p>Defendo isso. Imagine aquela palavra que você escreve errado o tempo todo. Sempre se confunde. O vim possibilita correção pelo aspell, abreviações e correções ortográficas. E uma série de outras coisas que um dia eu posto aqui no blog.</p>
<p>Segue uma série de plugins para facilitar nossas vidas:</p>
<h2>1. Postando no Twitter</h2>
<p>O plugin posta e lê <em>timelines</em> do Twitter. Maiores explicações em: <a rel="nofollow" href="http://www.vim.org/scripts/script.php?script_id=2204">http://www.vim.org/scripts/script.php?script_id=2204</a></p>
<h2>2. Gerenciando Blogs</h2>
<p>O Blogit é um plugin que permite que se submeta, remova, edite, liste, enfim, administre seu blog inteiro utilizando XML-RPC. Para conferir: <a rel="nofollow" href="http://www.vim.org/scripts/script.php?script_id=2030"> http://www.vim.org/scripts/script.php?script_id=2030 </a>.</p>
<h2>3. Gerenciando Gists</h2>
<p>Para quem utliza o serviço do <a rel="nofollow" href="http://github.com">github</a> Gist, este plugin facilita bastante o trabalho: permite que vocẽ envie arquivos inteiros ou apenas trechos deles. Permite também editar e listar Gists já existentes. Experimente usá-lo. <a rel="nofollow" href="http://www.vim.org/scripts/script.php?script_id=2423">baixando aqui</a>.</p>
<h2>4. Copiando o TexMate</h2>
<p>Esse plugin possibilita coisas do tipo: for&lt;TAB&gt; se transforme em:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">	<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> size<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: #666666; font-style: italic;">// code here</span>
	<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>O próprio script permite que você altere a variável $i por outro nome e automagicamente ele dá um refact nas outras 2 ocorrências da variável, ao mesmo tempo já coloca em evidência o size, onde, depois de você ter digitado o valor e pressionado tab novamente, ele dá o foco para o comentário. Muito interessante, muito prático, um grande facilitador. Ah! Para criar arquivos específicos para cada linguagem é muito simples, só vendo os exemplos já o suficiente. O plugin se chama <strong>SnipMate</strong></p>
<h2>5. Lendo documentação do Python</h2>
<p>Quem nunca ficou em dúvida em algum parâmetro de alguma API do python que atire a primeira pedra. Tanta coisa para decorar, saber, pensar, às vezes faz com que esqueçamos a ordem de parâmetros para um método ou função e etc. O plugin <a rel="nofollow" href="http://www.vim.org/scripts/script.php?script_id=910">pydoc</a> ajuda bastante nesse sentido, apesar de ser acessível e fácil. Basta apenas utilizar :pydoc re.compile, por exemplo.</p>
<h2>6. Wiki no Vim</h2>
<p>Há pouco tempo eu ouvi falar de <em>Knowledge Base</em>, que até então, eu chamava de wiki. Eu sempre achei um saco configurar banco de dados e por um wiki local pra rodar só pra organizar meus pensamentos, posts, etc. Mas, achei a solução dos meus problemas: <a rel="nofollow" href="http://www.vim.org/scripts/script.php?script_id=1018">PotWiki</a>. Vendo a própria página do vim.org, já dá pra perceber como é fácil de mexer.</p>
<h2>Vim no Firefox</h2>
<p>Sabe quando temos que escrever alguma coisa nas &lt;textarea&gt;&#8217;s e nos perdemos porque o espaço é pequeno, ou não da pra organizar as idéias? Pois é. Para tentar corrigir isso, existe o <a rel="nofollow" href="https://addons.mozilla.org/en-US/firefox/addon/4125">It&#8217;s All Text</a>. Ele permite que seja configurado um editor. Ao salvar o arquivo, ele joga o conteúdo pra textarea. Inclusive, tem alguns outros parâmetros que podem ser configurados.</p>
<h2>Finalização</h2>
<p>Espero que vocês gostem de pelo menos um destes plugins! Sugestões de outros, críticas e receitas de tortas de chocolate: comente!</pre>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/137/como-fazer-tudo-com-gvim-parte-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Como fazer um mini servidor HTTP em Python</title>
		<link>http://gustavodutra.com/post/141/como-fazer-um-mini-servidor-http-em-python/</link>
		<comments>http://gustavodutra.com/post/141/como-fazer-um-mini-servidor-http-em-python/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 00:06:58 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tchelinux]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=141</guid>
		<description><![CDATA[Olá! Estava lendo minhas mail lists matinais, mais especificadamente a mail list do TcheLinux (evento que, aliás, irá ocorrer em Gravataí sábado que vem, dia 28/03), quando me deparo com um post de Leonardo Menezes Vaz falando de um mini servidor http em python. Achei muito interessante e resolvi postar aqui.

Ingredientes

Lazanha
Python instalado
3 minutos de lazer


Modo [...]]]></description>
			<content:encoded><![CDATA[<p>Olá! Estava lendo minhas mail lists matinais, mais especificadamente a mail list do TcheLinux (evento que, aliás, irá ocorrer em Gravataí sábado que vem, dia 28/03), quando me deparo com um post de Leonardo Menezes Vaz falando de um mini servidor http em python. Achei muito interessante e resolvi postar aqui.</p>
<p><span id="more-141"></span></p>
<h2>Ingredientes</h2>
<ul>
<li>Lazanha</li>
<li>Python instalado</li>
<li>3 minutos de lazer</li>
</ul>
<ul>
<h2>Modo de preparo</h2>
<p>Pegue os 3 minutos de lazer e utlize para criar um diretório:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">$ mkdir ~/htmldocs
$ cd ~/htmldocs
$ echo &quot;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;Meus posts no blog&lt;/body&gt;&lt;/html&gt;&quot; &gt; index.html
$ python -m SimpleHTTPServer
$ firefox http://localhost:8000</pre></div></div>

<p>Pronto! Agora você pode gerenciar documentações, fazer preview de posts no seu blog, fazer testes de javascript/css sem precisar instalar o apache ou criar um VirtualHost!</p>
<p>Eu achei útil! E você?</ul>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/141/como-fazer-um-mini-servidor-http-em-python/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Como usar Adapter Pattern com python</title>
		<link>http://gustavodutra.com/post/40/como-usar-adapter-pattern-com-python/</link>
		<comments>http://gustavodutra.com/post/40/como-usar-adapter-pattern-com-python/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 00:45:44 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[mssql]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[oo]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[oque]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[reuso]]></category>

		<guid isPermaLink="false">http://blog.gustavodutra.com/?p=40</guid>
		<description><![CDATA[Olá! Dando continuidade ao post anterior, sobre Decorator Pattern. Mostrarei neste post aqui um exemplo de como e porquê usar o Adapter Pattern. Qualquer dúvida, comente!

O que é Adapter Pattern?
Bom, imaginemos aqueles cartões de memória de máquina fotográfica. Existem de várias tamanhos, micro, pequenos, grandes, gigantes. Seria realmente uma merda se uma máquina fotográfica suportasse [...]]]></description>
			<content:encoded><![CDATA[<p>Olá! Dando continuidade ao post anterior, sobre Decorator Pattern. Mostrarei neste post aqui um exemplo de como e porquê usar o Adapter Pattern. Qualquer dúvida, comente!<br />
<span id="more-40"></span></p>
<h2>O que é Adapter Pattern?</h2>
<p>Bom, imaginemos aqueles cartões de memória de máquina fotográfica. Existem de várias tamanhos, micro, pequenos, grandes, gigantes. Seria realmente uma merda se uma máquina fotográfica suportasse somente 1 tamanho, por isso foi inventada aqueles&#8230; adivinhem&#8230; adaptadores que permitem que micros e pequenos caibam em grande, por exemplo. Todos tem a mesma finalidade, porém, têm tamanhos diferentes.Para isso serve o Adapter Pattern, para resolver justamente esse tipo de problema.</p>
<p>Quando se fala em abstração, geralmente se fala em Adapter Pattern, justamente por isso, porque ele te permite, com um mesmo objeto, fazer ações diferentes com uma finalidade em comum.</p>
<p>Para entendermos melhor, pensemos no caso de abstração de banco de dados. A sintaxe de cada um é <strong>diferente</strong>, porém têm as <strong>mesmas claúsulas</strong>. Alguns permitem transações, outros não. Pois esta é uma situação perfeita para o Adapter Pattern. Mas seria muito complexo explicar utilizando ela como exemplo, logo, fiz um exemplo em python que vai ajudar.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> ShapeAbstract<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> countCorner<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">corners</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__str__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">name</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> area<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>: abstract
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> SquareShape<span style="color: black;">&#40;</span>ShapeAbstract<span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, x, y=<span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">corners</span> = <span style="color: #ff4500;">4</span>
		<span style="color: #008000;">self</span>.<span style="color: black;">name</span> = <span style="color: #483d8b;">'Square'</span>
		<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>x <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
			<span style="color: #008000;">self</span>.<span style="color: black;">l</span> = x
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> area<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">l</span><span style="color: #66cc66;">*</span><span style="color: #008000;">self</span>.<span style="color: black;">l</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TriangleShape<span style="color: black;">&#40;</span>ShapeAbstract<span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, x, y<span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">corners</span> = <span style="color: #ff4500;">3</span>
		<span style="color: #008000;">self</span>.<span style="color: black;">name</span> = <span style="color: #483d8b;">'Triangle'</span>
		<span style="color: #008000;">self</span>.<span style="color: black;">x</span> = x
		<span style="color: #008000;">self</span>.<span style="color: black;">y</span> = y
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> area<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">x</span><span style="color: #66cc66;">*</span><span style="color: #008000;">self</span>.<span style="color: black;">y</span><span style="color: black;">&#41;</span>/<span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Bom, Tudo começa na nossa classe abstrata ShapeAbstract. Ela é a classe que vai servir de base para todos as formas que vamos calcular a área. Temos a classe <em>SquareShape</em> que representa um quadrado (jura? :/). O construtor da classe, __init__, recebe 2 valores: altura e a largura. Visto que é um quadrado, todos os lados são iguais, não é necessário passar a altura, ficamos somente com a largura. O que difere do triângulo, cujas medidas são base e altura. A nomenclatura não importa, no caso, vamos utilizar no máximo 2 medidas.</p>
<p>Nosso adapter é simplório, caso houvesse a necessidade de calcular a área de um trapésio, seria necessário mais um parâmetro, afinal, a fórmula é: ((base maior + base menor) / 2 * altura). Isso é facilmente implantado utilizando apenas mais um parâmetro no __init__, porque o que realmente queremos é fazer com que o método area() nos retorne a área.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> Shapes
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Shape<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> setAdapter<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, Adapter<span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">Adapter</span> = Adapter
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> countCorner<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">Adapter</span>.<span style="color: black;">countCorner</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> area<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">Adapter</span>.<span style="color: black;">area</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__str__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">Adapter</span>.<span style="color: #0000cd;">__str__</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> newShape<span style="color: black;">&#40;</span>ShapeAdapter<span style="color: black;">&#41;</span>:
		shape = Shape<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
		shape.<span style="color: black;">setAdapter</span><span style="color: black;">&#40;</span>ShapeAdapter<span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">return</span> shape
&nbsp;
	newShape = <span style="color: #008000;">staticmethod</span><span style="color: black;">&#40;</span>newShape<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
	shape = Shape.<span style="color: black;">newShape</span><span style="color: black;">&#40;</span>Shapes.<span style="color: black;">SquareShape</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> shape
	<span style="color: #ff7700;font-weight:bold;">print</span> shape.<span style="color: black;">countCorner</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> shape.<span style="color: black;">area</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;">#Imprime:</span>
        <span style="color: #808080; font-style: italic;">#Square</span>
        <span style="color: #808080; font-style: italic;">#4</span>
        <span style="color: #808080; font-style: italic;">#25</span>
&nbsp;
	shape = Shape.<span style="color: black;">newShape</span><span style="color: black;">&#40;</span>Shapes.<span style="color: black;">TriangleShape</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span>,<span style="color: #ff4500;">6</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> shape
	<span style="color: #ff7700;font-weight:bold;">print</span> shape.<span style="color: black;">countCorner</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> shape.<span style="color: black;">area</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;">#Imprime:</span>
        <span style="color: #808080; font-style: italic;">#Triangle</span>
        <span style="color: #808080; font-style: italic;">#3</span>
        <span style="color: #808080; font-style: italic;">#15</span></pre></div></div>

<p>Nesta &#8220;aplicação principal&#8221; vemos a real <strong>classe adaptativa</strong>: Shape. Ela recebe a instância da classe e executa os métodos dela. Parece bobo ter uma classe que executa o método de outra classe, mas é fundamental para o <strong>reuso</strong> e a famosa <strong>abstração</strong>.</p>
<p>Vejam que elas se comportam diferentes. Claro, são formas diferentes! Áreas diferentes! Número de cantos diferentes! E nomes direfentes!</p>
<p>Agora fica fácil ver esse exemplo abstraindo, por exemplo, um banco de dados? Pense que a classe Shape seja Database, TriangleShape seja MySQLDatabase e SquareShape seja MSSQLDatabase, o método area() seja o método setLimit().</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">shape = Database<span style="color: black;">&#40;</span>MySQLDatabase<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> shape.<span style="color: black;">setLimit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
<span style="color: #808080; font-style: italic;">#Imprimi: LIMIT 5</span>
shape = Database<span style="color: black;">&#40;</span>MSSQLDatabase<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> shape.<span style="color: black;">setLimit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
<span style="color: #808080; font-style: italic;">#Imprimi: TOP 5</span></pre></div></div>

<h2>Usando Adapter para 3rd part</h2>
<p>Uma das minhas sugestões de uso do Adapter Pattern é com integração de código de terceiros. Vamos supor que você tenha 3 bibliotecas que geram gráficos: X, Y e Z. A bilioteca X é muito boa, mas não tem gráficos em pizza, que na Y tem. Mas a Z, por sua vez, tem gráficos em pizza em 3d. Vamos analizar a situação:</p>
<ul>
<li>A responsabilidade é a mesma: gerar um gráfico.</li>
<li>Independente do tipo de gráfico (com barras, pizza, etc), todas elas vão receber os mesmos tipos de dados.</li>
<li>Cada biblioteca tem seus próprios métodos, com nomes diferentes, mas para as mesma finalidade</li>
</ul>
<p>Não parece um lugar perfeito para se utilizar o Adapter Pattern? Ora, vamos fazer um pequeno esboço:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">graph = GraphAdapter<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
graph.<span style="color: black;">setData</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">20</span>,<span style="color: #ff4500;">30</span>,<span style="color: #ff4500;">10</span><span style="color: black;">&#93;</span>,<span style="color: black;">&#91;</span><span style="color: #ff4500;">15</span>,<span style="color: #ff4500;">25</span>,<span style="color: #ff4500;">35</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
graph.<span style="color: black;">desenhaGrafico</span><span style="color: black;">&#40;</span>GRAFICOS.<span style="color: black;">BARRA</span><span style="color: black;">&#41;</span>
graph.<span style="color: black;">desenhaGrafico</span><span style="color: black;">&#40;</span>GRAFICOS.<span style="color: black;">PIZZA</span><span style="color: black;">&#41;</span>
graph.<span style="color: black;">desenhaGrafico</span><span style="color: black;">&#40;</span>GRAFICOS.<span style="color: black;">PIZZA3D</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Observem que não utilizei a instância de uma classe como adapter, utilizei constantes que vão determinar, na hora de desenhar o gráfico, o tipo dele. Se for BARRA, faz justamente como a biblioteca X exige, usando a API dela. O mesmo para PIZZA (Y) e PIZZA3D (Z). Pronto! Você, utilizando patterns, terá seu próprio modo de gerar gráficos, mesmo que com bibliotecas diferentes! Comentem e até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/40/como-usar-adapter-pattern-com-python/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
