<?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>~rcmachado</title>
	<atom:link href="http://rm.blog.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://rm.blog.br</link>
	<description>web &#38; free software</description>
	<lastBuildDate>Wed, 13 Jan 2010 16:41:55 +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>jQuery trigger(): Invalid procedure call or argument</title>
		<link>http://rm.blog.br/2010/01/jquery-trigger-invalid-procedure-call-or-argument/</link>
		<comments>http://rm.blog.br/2010/01/jquery-trigger-invalid-procedure-call-or-argument/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 16:41:55 +0000</pubDate>
		<dc:creator>rcmachado</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://rm.blog.br/?p=166</guid>
		<description><![CDATA[Na versão 1.3.2 do jQuery o método .trigger() gera o seguinte erro no Internet Explorer 7 e 8 com custom events:
Message: Invalid procedure call or argument
Line: 19
Char: 15319
Code: 0
URI: http://server/js/jquery.js
No meu caso isso aconteceu porque o nome do evento possuía &#8216;:&#8217; (dois pontos) no nome. Ao remover e trocar por &#8216;_&#8217;, tudo funcionou normalmente. Na [...]]]></description>
			<content:encoded><![CDATA[<p>Na versão 1.3.2 do <a href="http://www.jquery.com/">jQuery</a> o método .trigger() gera o seguinte erro no Internet Explorer 7 e 8 com custom events:</p>
<div class="codesnip-container" >Message: Invalid procedure call or argument<br />
Line: 19<br />
Char: 15319<br />
Code: 0<br />
URI: http://server/js/jquery.js</div>
<p>No meu caso isso aconteceu porque o nome do evento possuía &#8216;:&#8217; (dois pontos) no nome. Ao remover e trocar por &#8216;_&#8217;, tudo funcionou normalmente. Na versão mais recente o problema foi corrigido.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=jQuery+trigger%28%29%3A+Invalid+procedure+call+or+argument+http://bit.ly/56vyaJ" title="Post to Twitter"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://rm.blog.br/2010/01/jquery-trigger-invalid-procedure-call-or-argument/&amp;t=jQuery+trigger%28%29%3A+Invalid+procedure+call+or+argument" title="Post to Facebook"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://rm.blog.br/2010/01/jquery-trigger-invalid-procedure-call-or-argument/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Virtualbox: corrigindo data/hora do guest</title>
		<link>http://rm.blog.br/2010/01/virtualbox-corrigindo-datahora-do-guest/</link>
		<comments>http://rm.blog.br/2010/01/virtualbox-corrigindo-datahora-do-guest/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 11:46:25 +0000</pubDate>
		<dc:creator>rcmachado</dc:creator>
				<category><![CDATA[Server-related]]></category>
		<category><![CDATA[boot]]></category>
		<category><![CDATA[timer]]></category>
		<category><![CDATA[virtualbox]]></category>

		<guid isPermaLink="false">http://rm.blog.br/?p=163</guid>
		<description><![CDATA[Se você enfrenta problemas com a data e hora no seu linux rodando como guest no Virtualbox 3.0.x, mais especificamente em algumas versões do kernel 2.6 (como a 2.6.18), adicione o parâmetro nolapic_timer no boot do seu guest.
Se você quiser testar no próximo boot, sem alterar as configurações permanentemente, faça o seguinte no boot do [...]]]></description>
			<content:encoded><![CDATA[<p>Se você enfrenta problemas com a data e hora no seu linux rodando como guest no Virtualbox 3.0.x, mais especificamente em algumas versões do kernel 2.6 (como a 2.6.18), adicione o parâmetro <em>nolapic_timer</em> no boot do seu guest.</p>
<p>Se você quiser testar no próximo boot, sem alterar as configurações permanentemente, faça o seguinte no boot do guest (assumindo que você está utilizando o Grub como gerenciador de boot):</p>
<ol>
<li>Pressione &#8216;e&#8217; para editar a linha selecionada</li>
<li>Selecione a linha que possui <em>root=&#8230;</em> e pressione &#8216;e&#8217;</li>
<li>Ao final da linha, adicione a opção <em>nolapic_timer</em></li>
<li>Pressione &#8216;Enter&#8217; para salvar a modificação</li>
<li>Pressione &#8216;b&#8217; para iniciar o sistema</li>
</ol>
<p>Se funcionar, você pode alterar as configurações permanentemente no arquivo <em>/boot/grub/menu.lst</em>. Procure a seção que se refere ao boot e altere a linha que possui <em>root=&#8230;</em> adicionando o parâmetro <em>nolapic_timer</em> no final.</p>
<p>Aparentemente o problema não acontece com a versão 2.6.22 do kernel.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Virtualbox%3A+corrigindo+data%2Fhora+do+guest+http://bit.ly/6iInlq" title="Post to Twitter"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://rm.blog.br/2010/01/virtualbox-corrigindo-datahora-do-guest/&amp;t=Virtualbox%3A+corrigindo+data%2Fhora+do+guest" title="Post to Facebook"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://rm.blog.br/2010/01/virtualbox-corrigindo-datahora-do-guest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Git: Revertendo um arquivo modificado</title>
		<link>http://rm.blog.br/2009/10/git-revertendo-um-arquivo-modificado/</link>
		<comments>http://rm.blog.br/2009/10/git-revertendo-um-arquivo-modificado/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 19:14:05 +0000</pubDate>
		<dc:creator>rcmachado</dc:creator>
				<category><![CDATA[Server-related]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[scm]]></category>

		<guid isPermaLink="false">http://rm.blog.br/?p=143</guid>
		<description><![CDATA[No SVN, para reverter um arquivo que foi modificado para a versão corrente do checkout, basta executar:

$ svn revert ARQUIVO

Uma desvantagem é que o comando não restaura diretórios apagados, já que não acessa o repositório.
Já no Git você pode utilizar o comando reset. Segundo o manual do git-reset, para descartar as modificações no arquivo basta [...]]]></description>
			<content:encoded><![CDATA[<p>No <a href="http://subversion.tigris.org/" title="Subversion">SVN</a>, para reverter um arquivo que foi modificado para a versão corrente do checkout, basta executar:</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">$ <span class="kw2">svn</span> revert ARQUIVO</div>
</div>
<p>Uma desvantagem é que o comando não restaura diretórios apagados, já que não acessa o repositório.</p>
<p>Já no <a href="http://git-scm.com/" title="Git">Git</a> você pode utilizar o comando <em>reset</em>. Segundo o <a href="http://www.kernel.org/pub/software/scm/git/docs/git-reset.html" title="git-reset man page">manual do git-reset</a>, para descartar as modificações no arquivo basta passar para a opção <em>&#8211;hard</em> o commit para o qual você quer reverter. Supondo que você tenha um checkout do <em>HEAD</em> e queira descartar <strong>todas</strong> as modificações que fez nos arquivos, basta executar:</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">$ git reset <span class="re5">&#8211;hard</span> HEAD</div>
</div>
<p><em>(Utilize dois traços para a opção hard)</em></p>
<p>Isso no entanto não vai descartar os arquivos que foram criados mas não foram adicionados ao branch. Para isso, utilize o comando <em>clean</em>:</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">$ git clean DIRETORIO</div>
</div>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Git%3A+Revertendo+um+arquivo+modificado+http://bit.ly/3kJAVP" title="Post to Twitter"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://rm.blog.br/2009/10/git-revertendo-um-arquivo-modificado/&amp;t=Git%3A+Revertendo+um+arquivo+modificado" title="Post to Facebook"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://rm.blog.br/2009/10/git-revertendo-um-arquivo-modificado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VIM syntax highlight para HTML 5</title>
		<link>http://rm.blog.br/2009/09/vim-syntax-highlight-para-html-5/</link>
		<comments>http://rm.blog.br/2009/09/vim-syntax-highlight-para-html-5/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 00:31:57 +0000</pubDate>
		<dc:creator>rcmachado</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://rodrigo.cmachado.org/blog/?p=118</guid>
		<description><![CDATA[Cada vez mais escutamos falar do HTML5. A atualização do HTML 4.01 traz diversos novos elementos que prometem deixar as páginas mais semânticas (header, article, section) e facilitar o desenvolvimento (video, canvas).
Para quem ainda não se informou sobre, uma busca no Google é um bom começo. Em seguida, você pode verificar como anda o progresso [...]]]></description>
			<content:encoded><![CDATA[<p>Cada vez mais escutamos falar do <a href="http://dev.w3.org/html5/spec/Overview.html" hreflang="en-us" title="HTML 5 Specification Overview">HTML5</a>. A atualização do <a href="http://www.w3.org/TR/html401/" hreflang="en-us" title="HTML 4.01 Specification">HTML 4.01</a> traz diversos novos elementos que prometem deixar as páginas mais semânticas (header, article, section) e facilitar o desenvolvimento (video, canvas).</p>
<p>Para quem ainda não se informou sobre, uma <a href="http://www.google.com/search?q=html+5">busca no Google</a> é um bom começo. Em seguida, você pode verificar como anda o progresso no Working Draft (ele ainda está em desenvolvimento, então algumas coisas podem mudar) ou pela <a href="http://dev.w3.org/html5/html4-differences/" hreflang="en-us" title="HTML 5 differences from HTML 4">lista de diferenças entre o HTML 4 e o HTML 5</a>.</p>
<p>O <a href="http://www.vim.org/about.php" hreflang="en-us" title="About Vim">Vim (Vi IMproved)</a> é um editor de textos para linha de comando estremamente poderoso, com syntax highlight para diversas linguagens de programação (e até arquivos de configuração) e extensível com o uso de plugins, o que o torna melhor do que muitas IDEs do mercado (segundo os usuários do vim <img src='http://rm.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ).</p>
<p>Quem edita seus arquivos HTML no Vim e já quer utilizar as novas tags e atributos do HTML 5 pode fazer o <a href="http://gist.github.com/256840">download do html.vim direto do gist.github</a>. Para instalá-lo, salve-o na pasta ~/.vim/after/syntax (ou a crie, se não existir) com o nome de html.vim.</p>
<p>Esse arquivo é uma modificação não-oficial do arquivo que acompanha o Ubuntu 9.04. Foram incluídos os novos elementos e atributos e retirados os que não devem ser utilizados pelos desenvovedores, <a href="http://dev.w3.org/html5/html4-differences/" hreflang="en-us" title="HTML 5 differences from HTML 4">de acordo com a página do W3C</a>.</p>
<p>Referências:</p>
<ul>
<li>HTML 5 Working Draft: <a href="http://dev.w3.org/html5/spec/Overview.html" hreflang="en-us">http://dev.w3.org/html5/spec/Overview.html</a></li>
<li>Diferenças entre HTML 4.01 e HTML 5: <a href="http://dev.w3.org/html5/html4-differences/" hreflang="en-us" title="HTML 5 differences from HTML 4">http://dev.w3.org/html5/html4-differences/</a></li>
<li>Site oficial do Vim: <a href="http://www.vim.org/" hreflang="en-us" title="Vi IMproved">http://www.vim.org/</a></li>
</ul>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=VIM+syntax+highlight+para+HTML+5+http://bit.ly/XSdVt" title="Post to Twitter"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://rm.blog.br/2009/09/vim-syntax-highlight-para-html-5/&amp;t=VIM+syntax+highlight+para+HTML+5" title="Post to Facebook"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://rm.blog.br/2009/09/vim-syntax-highlight-para-html-5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Removendo espaços em branco com o Vim</title>
		<link>http://rm.blog.br/2009/08/removendo-espacos-em-branco-com-o-vim/</link>
		<comments>http://rm.blog.br/2009/08/removendo-espacos-em-branco-com-o-vim/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 03:07:55 +0000</pubDate>
		<dc:creator>rcmachado</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://rm.blog.br/?p=125</guid>
		<description><![CDATA[Muitos editores e IDEs tem a opção de remover os espaços em branco no fim de cada linha ao salvar o arquivo. Com o Vim não é diferente: basta um comando.

:%s/\s\+$//g

Nessa expressão regular estamos dizendo para substituir (s/) todos os espaços e tabulações (\s\+) por vazio (//), aplicando em todo o buffer (g). Como não [...]]]></description>
			<content:encoded><![CDATA[<p>Muitos editores e IDEs tem a opção de remover os espaços em branco no fim de cada linha ao salvar o arquivo. Com o <a href="http://www.vim.org/" title="Vi IMproved">Vim</a> não é diferente: basta um comando.</p>
<div class="codesnip-container" >
<div class="vim codesnip" style="font-family:monospace;"><span class="sy0">:%</span>s<span class="sy0">/</span>\s\<span class="sy0">+$//</span>g</div>
</div>
<p>Nessa expressão regular estamos dizendo para substituir (s/) todos os espaços e tabulações (\s\+) por vazio (//), aplicando em todo o buffer (g). Como não é muito prático ficar digitando isso toda hora, vamos mapear para o comando &#8220;Trim&#8221;:</p>
<div class="codesnip-container" >
<div class="vim codesnip" style="font-family:monospace;"><span class="sy0">:</span><span class="kw2">command</span> Trim <span class="sy0">%</span>s<span class="sy0">/</span>\s\<span class="sy0">+$//</span>g</div>
</div>
<p>Para facilitar ainda mais, podemos mandar o Vim executar esse comando sempre antes de salvar o buffer (evento BufWriteCmd):</p>
<div class="codesnip-container" >
<div class="vim codesnip" style="font-family:monospace;"><span class="sy0">:</span><span class="kw2">autocmd</span> BufWriteCmd <span class="sy0">*</span> Trim</div>
</div>
<p>O &#8216;*&#8217; diz a quais arquivos essa regra deve ser aplicada. Para aplicar somente a arquivos PHP, basta escrever:</p>
<div class="codesnip-container" >
<div class="vim codesnip" style="font-family:monospace;"><span class="sy0">:</span><span class="kw2">autocmd</span> BufWriteCmd <span class="sy0">*.</span>php Trim</div>
</div>
<p>Coloque esses comandos no arquivo ~/.vimrc (retirnado o &#8216;:&#8217; no início da linha) e pronto. Simples, não?</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Removendo+espa%C3%A7os+em+branco+com+o+Vim+http://bit.ly/hDV6O" title="Post to Twitter"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://rm.blog.br/2009/08/removendo-espacos-em-branco-com-o-vim/&amp;t=Removendo+espa%C3%A7os+em+branco+com+o+Vim" title="Post to Facebook"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://rm.blog.br/2009/08/removendo-espacos-em-branco-com-o-vim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configurando mod_rewrite no VirtualHost do Apache</title>
		<link>http://rm.blog.br/2009/08/configurando-mod_rewrite-no-virtualhost-do-apache/</link>
		<comments>http://rm.blog.br/2009/08/configurando-mod_rewrite-no-virtualhost-do-apache/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 17:54:40 +0000</pubDate>
		<dc:creator>rcmachado</dc:creator>
				<category><![CDATA[Server-related]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[virtualhost]]></category>

		<guid isPermaLink="false">http://orgutus.wordpress.com/?p=102</guid>
		<description><![CDATA[Os frameworks MVC e diversos sistemas (como o próprio WordPress) utilizam URLs amigáveis &#8211; algo como http://example.org/configurando-sites.html ao invés de http://example.org/post.php?id=99. Isso requer que o servidor web seja configurado corretamente. No Apache isso pode ser conseguido com o auxílio do mod_rewrite, que permite mapear URLs utilizando expressões regulares para diferentes arquivos. A maioria provê o [...]]]></description>
			<content:encoded><![CDATA[<p>Os frameworks MVC e diversos sistemas (como o próprio <a title="WordPress" href="http://wordpress.org/">WordPress</a>) utilizam URLs amigáveis &#8211; algo como http://example.org/configurando-sites.html ao invés de http://example.org/post.php?id=99. Isso requer que o servidor web seja configurado corretamente. No <a title="Apache HTTP Server" href="http://httpd.apache.org/">Apache</a> isso pode ser conseguido com o auxílio do mod_rewrite, que permite mapear URLs utilizando expressões regulares para diferentes arquivos. A maioria provê o seguinte exemplo (ou uma variação dele):</p>
<div class="codesnip-container" >
<div class="apache codesnip" style="font-family:monospace;"><span class="kw1">RewriteEngine</span> <span class="kw2">On</span><br />
<span class="kw1">RewriteCond</span> %{REQUEST_FILENAME} !-d<br />
<span class="kw1">RewriteCond</span> %{REQUEST_FILENAME} !-f<br />
<span class="kw1">RewriteRule</span> (.*) index.php [QSA,L]</div>
</div>
<p>Esse código especifica que se o arquivo requisitado (%{REQUEST_FILENAME}) não for um diretório (!-d) e não for um arquivo (!-f), a regra seguinte deve ser aplicada (que no caso diz para passar a execução para o script index.php).</p>
<p>Podemos colocar esse código .htaccess, o que traz uma desvantagem: é preciso que o apache seja configurado para procurar arquivos .htaccess em cada diretório da aplicação, o que reduz o desempenho. O ideal seria colocá-lo diretamente na definição do VirtualHost. Para isso, precisamos fazer um pequeno ajuste. Onde está:</p>
<div class="codesnip-container" >
<div class="apache codesnip" style="font-family:monospace;"><span class="kw1">RewriteCond</span> %{REQUEST_FILENAME} !-d<br />
<span class="kw1">RewriteCond</span> %{REQUEST_FILENAME} !-f</div>
</div>
<p>Substitua por:</p>
<div class="codesnip-container" >
<div class="apache codesnip" style="font-family:monospace;"><span class="kw1">RewriteCond</span> %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d<br />
<span class="kw1">RewriteCond</span> %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f</div>
</div>
<p>Isso é necessário porque o apache &#8211; por algum motivo que desconheço &#8211; não mapeia a caminho completo para a variável REQUEST_FILENAME (embora a <a title="mod_rewrite - Apache HTTP Server" href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#RewriteCond">documentação</a> informe o contrário). Colocando o %{DOCUMENT_ROOT} antes, a condição se torna válida.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Configurando+mod_rewrite+no+VirtualHost+do+Apache+http://bit.ly/ljjRp" title="Post to Twitter"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://rm.blog.br/2009/08/configurando-mod_rewrite-no-virtualhost-do-apache/&amp;t=Configurando+mod_rewrite+no+VirtualHost+do+Apache" title="Post to Facebook"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://rm.blog.br/2009/08/configurando-mod_rewrite-no-virtualhost-do-apache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Customização de URLs em projetos MVC &#8211; Fazendo o caminho inverso</title>
		<link>http://rm.blog.br/2009/07/customizacao-de-urls-em-projetos-mvc-fazendo-o-caminho-inverso/</link>
		<comments>http://rm.blog.br/2009/07/customizacao-de-urls-em-projetos-mvc-fazendo-o-caminho-inverso/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 10:54:40 +0000</pubDate>
		<dc:creator>rcmachado</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[routing]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[url]]></category>

		<guid isPermaLink="false">http://orgutus.wordpress.com/?p=95</guid>
		<description><![CDATA[Todo framework MVC sério possui um mecanismo de customização de URLs (as vezes chamado de routing). Esse mecanismo permite que tenhamos URLs amigáveis &#8211; transformando /carros/ver/35 em /maserati-3200gt.html. Normalmente, isso é implementado utilizando expressões regulares que são mapeadas diretamente para a URL no formato controller/action/parâmetros, o que torna muito simples de ser implementado e configurado. [...]]]></description>
			<content:encoded><![CDATA[<p>Todo framework MVC sério possui um mecanismo de customização de URLs (as vezes chamado de <em>routing</em>). Esse mecanismo permite que tenhamos URLs amigáveis &#8211; transformando <em>/carros/ver/35</em> em <em>/maserati-3200gt.html</em>. Normalmente, isso é implementado utilizando expressões regulares que são mapeadas diretamente para a URL no formato <em>controller/action/parâmetros</em>, o que torna muito simples de ser implementado e configurado. Com as URLs do projeto configuradas, ao desenvolver as páginas temos de optar por colocar os links na forma <em>controller/action/parâmetros</em> (o que não é uma boa idéia, já que estaríamos ignorando a customização de URLs) ou na sua forma customizada (o que claramente é melhor).</p>
<p>Só existe um problema com essa abordagem: vamos imaginar que fosse necessário fazer um ajuste nas URLs no decorrer do desenvolvimento &#8211; ou até mesmo imediatamente antes de publicar o projeto. Por menor que seja o ajuste, teríamos de alterar todos os links do projeto (com sorte poderíamos utilizar um script em sed para convertê-las automaticamente, mas ainda sim seria preciso verificar depois se tudo está OK). Foi exatamente esse o problema que enfrentei em um dos projetos que trabalhei recentemente.</p>
<p><span id="more-95"></span>Resolver esse problema é mais simples do que parece, mas requer mudanças na forma como as URLs personalizadas são definidas. Na maioria dos frameworks, a configuração é feita dessa forma (ou alguma variação):</p>
<pre>&lt;?php
$routes = array(
    '^/([a-zA-Z0-9\-]+)\.html$' =&gt; '/carros/ver/$1'
);
?&gt;</pre>
<p>Essa abordagem facilita a visualização de quais URLs apontam para onde, mas não permite que façamos o inverso. Ou seja, não conseguiríamos descobrir qual é a URL personalizada para um determinado <em>controller/action</em>. Para isso, vamos tentar decompor melhor essa configuração:</p>
<pre>&lt;?php
$routes = array(
    '^/([a-zA-Z0-9\-]+)\.html$' =&gt; array(
        'controller' =&gt; 'carros',
        'action' =&gt; 'ver',
        'params' =&gt; array( '$1' )
    );
);
?&gt;</pre>
<p>Decompondo a URL de destino nas suas partes básicas (controller, action e parâmetros) podemos escrever um helper que percorre as configurações de URLs procurando pelo controller e action especificados:</p>
<pre>&lt;?php
function url_helper($c, $a, array $p) {
    global $routes;

    foreach ($routes as $rota =&gt; $info) {
        if ($info['controller'] == $c &amp;&amp; $info['action'] == $a) {
            // achamos a rota que queríamos
            // agora executamos o código para montar a URL - isso fica como exercício <img src='http://rm.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
            break;
        }
    }
}
?&gt;</pre>
<p>Podemos ainda expandir esse helper para escolher a URL customizada de acordo com o número de parâmetros envolvidos. A idéia desse post é somente mostrar o caminho para desenvolver essa solução e não fornecer uma implementação completa. Uma outra solução seria rodar um script que modificasse os links nos templates a cada vez que a configuração de rotas fosse modificada.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Customiza%C3%A7%C3%A3o+de+URLs+em+projetos+MVC+%E2%80%93+Fazendo+o+caminho+inverso+http://bit.ly/R9Aa" title="Post to Twitter"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://rm.blog.br/2009/07/customizacao-de-urls-em-projetos-mvc-fazendo-o-caminho-inverso/&amp;t=Customiza%C3%A7%C3%A3o+de+URLs+em+projetos+MVC+%E2%80%93+Fazendo+o+caminho+inverso" title="Post to Facebook"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://rm.blog.br/2009/07/customizacao-de-urls-em-projetos-mvc-fazendo-o-caminho-inverso/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gerar documentação do Django no Ubuntu</title>
		<link>http://rm.blog.br/2009/07/gerar-documentacao-do-django-no-ubuntu/</link>
		<comments>http://rm.blog.br/2009/07/gerar-documentacao-do-django-no-ubuntu/#comments</comments>
		<pubDate>Wed, 15 Jul 2009 03:19:49 +0000</pubDate>
		<dc:creator>rcmachado</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[erro]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://orgutus.wordpress.com/?p=87</guid>
		<description><![CDATA[Comecei a brincar com o Django, &#8220;o&#8221; framework Python quando se trata de web. E como nem sempre estou com conexão disponível, resolvi ter também uma cópia local da documentação, para que eu possa consultá-la sempre que for preciso.
Pois bem, na página sobre a documentação do Django, vejo que os arquivos que preciso estão no [...]]]></description>
			<content:encoded><![CDATA[<p>Comecei a brincar com o <a title="Django - The Web Framework for perfectionists with deadlines" href="http://www.djangoproject.com/" target="_blank">Django</a>, &#8220;o&#8221; framework Python quando se trata de web. E como nem sempre estou com conexão disponível, resolvi ter também uma cópia local da documentação, para que eu possa consultá-la sempre que for preciso.</p>
<p>Pois bem, na página <a title="Sobre a documentação do Django" href="http://docs.djangoproject.com/en/dev/internals/documentation/#internals-documentation" target="_blank">sobre a documentação do Django</a>, vejo que os arquivos que preciso estão no diretório docs dentro da pasta criada ao descompactar o .tar.gz do mesmo. Para criar a documentação no formato HTML, basta instalar as ferramentas certas e fazer um
<div class="codesnip-container" >make html</div>
<p> no diretório.</p>
<p><span id="more-87"></span></p>
<p>O Ubuntu já tem pacotes para as ferramentas que precisamos. Então basta um&#8230;</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;"><span class="kw2">sudo</span> <span class="kw2">apt-get</span> <span class="kw2">install</span> python-sphinx python-pygments python-setuptools python-docutils python-jinja python-jinja2</div>
</div>
<p>&#8230;para que possamos compilar a documentação.</p>
<p>Como nem tudo nessa vida é perfeito, <a title="Sphinx error: Could not import extension djangodocs, when running Sphinx &gt;= 0.6" href="http://code.djangoproject.com/ticket/10539" target="_blank">existe um bug</a> que impede que a documentação seja compilada utilizando o <a title="Sphinx Documentation Generator" href="http://sphinx.pocoo.org/" target="_blank">Sphinx</a> 0.6 (que é a versão do pacote
<div class="codesnip-container" >python-sphynx</div>
<p> do ubuntu). A boa botícia é que o problema já foi corrigido para a versão 1.1. Caso você esteja utilizando a combinação Sphinx 0.6 e Django 1.0.2 precisará de <a title="Patch para documentação do Django 1.0.2 e Sphinx 0.6" href="http://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg645050.html">um patch específico para a versão 1.0.2</a> <sup><a href="#in-article-footnote-1">[1]</a></sup>.</p>
<p>Primeiro, faça o download do arquivo de patch, disponível em <a title="Arquivo patch para documentação do Django 1.0.2 e Sphinx 0.6" href="http://files.getdropbox.com/u/1447299/patch-django-1.0.2.diff">http://files.getdropbox.com/u/1447299/patch-django-1.0.2.diff</a>. Salve-o na raiz do seu diretório de usuário com o nome
<div class="codesnip-container" >patch-djangodocs-1.0.2.diff</div>
<p>. Na pasta onde você extraiu o conteúdo do .tar.gz do Django, faça:</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;"><span class="kw2">patch</span> <span class="re5">-p1</span> <span class="sy0">&amp;</span>lt; ~<span class="sy0">/</span>patch-djangodocs-1.0.2.diff</div>
</div>
<p>Depois, basta seguir o procedimento normal, executando um make html no diretório docs/. A documentação será gerada no diretório
<div class="codesnip-container" >[django-source]/docs/_build/html</div>
<p>.</p>
<p><a name="in-article-footnote-1"></a><sup>[1]</sup> Retirado de <a href="http://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg645050.html">http://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg645050.html</a></p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Gerar+documenta%C3%A7%C3%A3o+do+Django+no+Ubuntu+http://bit.ly/ndpIF" title="Post to Twitter"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://rm.blog.br/2009/07/gerar-documentacao-do-django-no-ubuntu/&amp;t=Gerar+documenta%C3%A7%C3%A3o+do+Django+no+Ubuntu" title="Post to Facebook"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://rm.blog.br/2009/07/gerar-documentacao-do-django-no-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando o driver mysql para ruby</title>
		<link>http://rm.blog.br/2009/07/instalando-o-driver-mysql-para-ruby/</link>
		<comments>http://rm.blog.br/2009/07/instalando-o-driver-mysql-para-ruby/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 06:52:29 +0000</pubDate>
		<dc:creator>rcmachado</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Server-related]]></category>

		<guid isPermaLink="false">http://orgutus.wordpress.com/?p=83</guid>
		<description><![CDATA[No post anterior eu expliquei como instalar o Ruby On Rails no Ubuntu, sem utilizar os pacotes oficiais. Pois bem, ao tentar instalar o driver para MySQL do Ruby, me deparei com o seguinte problema:

$ sudo gem19 install mysql
Building native extensions.  This could take a while&#8230;
ERROR:  Error installing mysql:
ERROR: Failed to build gem native extension.

Mas [...]]]></description>
			<content:encoded><![CDATA[<p>No post anterior eu expliquei <a title="Instalando e configurando Ruby On Rails no Linux" href="http://orgutus.wordpress.com/2009/07/12/instalando-e-configurando-ruby-on-rails-no-linux/">como instalar o Ruby On Rails no Ubuntu</a>, sem utilizar os pacotes oficiais. Pois bem, ao tentar instalar o driver para MySQL do Ruby, me deparei com o seguinte problema:</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">$ <span class="kw2">sudo</span> gem19 <span class="kw2">install</span> mysql<br />
Building native extensions.  This could take a while&#8230;<br />
ERROR:  Error installing mysql:<br />
ERROR: Failed to build gem native extension.</div>
</div>
<p>Mas o que foi que aconteceu?<br />
<span id="more-83"></span><br />
Pesquisando um pouco não foi difícil descobrir o problema: a lib MySQL API para o Ruby ainda não é compatível com a versão 1.9. Voltando a pesquisar mais um pouco, encontrei <a title="RubyInstaller: Getting Started with Rails and MySQL" href="http://blog.mmediasys.com/2009/07/06/getting-started-with-rails-and-mysql/" target="_blank">esse post</a> com a solução. No meu caso, ficou assim:</p>
<p>[code lang=bash]<br />
$ sudo gem19 install mysql --source http://gems.rubyinstaller.org<br />
[/code]</p>
<p>É isso! Comentários abertos para dúvidas e sugestões <img src='http://rm.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Instalando+o+driver+mysql+para+ruby+http://bit.ly/14yYOF" title="Post to Twitter"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://rm.blog.br/2009/07/instalando-o-driver-mysql-para-ruby/&amp;t=Instalando+o+driver+mysql+para+ruby" title="Post to Facebook"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://rm.blog.br/2009/07/instalando-o-driver-mysql-para-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando e configurando Ruby On Rails no Linux</title>
		<link>http://rm.blog.br/2009/07/instalando-e-configurando-ruby-on-rails-no-linux/</link>
		<comments>http://rm.blog.br/2009/07/instalando-e-configurando-ruby-on-rails-no-linux/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 03:24:01 +0000</pubDate>
		<dc:creator>rcmachado</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rubyonrails]]></category>

		<guid isPermaLink="false">http://orgutus.wordpress.com/?p=75</guid>
		<description><![CDATA[Juntamente com a linguagem Ruby, o framework Rails tem ganhado grande destaque ultimamente, principalmente pela rapidez e facilidade que proporciona para desenvolver um site ou uma webapp. Mesmo com a popularidade da dupla Ruby + Rails, muita gente ainda repete a frase &#8220;Rails não escala&#8221; (normalmente desenvolvedores &#8220;velhos&#8221; &#8211; não por causa da idade, mas [...]]]></description>
			<content:encoded><![CDATA[<p>Juntamente com a linguagem <a title="Ruby" href="http://www.ruby-lang.org/pt/">Ruby</a>, o framework <a title="Ruby on Rails" href="http://www.rubyonrails.pro.br/">Rails</a> tem ganhado grande destaque ultimamente, principalmente pela rapidez e facilidade que proporciona para desenvolver um site ou uma webapp. Mesmo com a popularidade da dupla Ruby + Rails, muita gente ainda repete a frase &#8220;<a title="A (estúpida) controvérsia Twitter" href="http://akitaonrails.com/2008/5/2/a-est-pida-controv-rsia-twitter" target="_blank">Rails não escala</a>&#8221; (normalmente desenvolvedores &#8220;velhos&#8221; &#8211; não por causa da idade, mas por causa das ideias &#8211; também conhecidos como <a title="Quandos os dinos atacam" href="http://nerdson.com/blog/quandos-os-dinos-atacam/" target="_blank">dinossauros</a>). O foco desse post não é debater se Ruby on Rails escala ou não, e sim mostrar como em poucos minutos você pode configurar o seu ambiente Ruby + Rails.</p>
<p>Depois dos avisos, vamos ao que interessa.</p>
<p><span id="more-75"></span></p>
<p>O Ubuntu, como era de se esperar, já tem pacotes tanto para Ruby como para Rails. O único problema é que, ao menos <strong>nos meus testes</strong>, não funcionou direito. A instalação de gems (os &#8220;pacotes&#8221; do ruby, que utilizam um sistema similiar ao das distros Linux, como apt-get, yum, emerge, etc.) simplesmente não funcionava, retornando o erro &#8220;marshal data too short&#8221;. Como uma rápida pesquisa no Google não retornou nenhuma resposta satisfatória, e eu também queria a última versão, resolvi partir para a instalação do zero.</p>
<p>O primeiro passo, obviamente, é instalar o interpretador da linguagem Ruby. Não é do escopo desse post explicar como instalar o compilador e as ferramentas necessárias. Continuando, faça o download do código fonte em <a title="Download Ruby" href="http://www.ruby-lang.org/en/downloads/">http://www.ruby-lang.org/en/downloads/</a> (a página em português está com links desatualizados). Assumindo que você salvou o código fonte na pasta ~/rubydev e o release baixado foi o 1.9.1-p129, faça o procedimento padrão:</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;"><span class="kw3">cd</span> ~<span class="sy0">/</span>rubydev<br />
<span class="kw2">tar</span> xzf ruby-1.9.1-p129.tar.gz<br />
<span class="kw3">cd</span> ruby-1.9.1-p129<br />
.<span class="sy0">/</span>configure <span class="re5">&#8211;prefix</span>=<span class="sy0">/</span>usr<span class="sy0">/</span><span class="kw3">local</span> <span class="re5">&#8211;program-suffix</span>=19<br />
<span class="kw2">make</span><br />
<span class="kw2">make</span> <span class="kw3">test</span><br />
<span class="kw2">sudo</span> <span class="kw2">make</span> <span class="kw2">install</span><br />
<span class="kw2">sudo</span> <span class="kw2">ln</span> <span class="re5">-s</span> <span class="sy0">/</span>usr<span class="sy0">/</span>local<span class="sy0">/</span>bin<span class="sy0">/</span>ruby19 <span class="sy0">/</span>usr<span class="sy0">/</span>local<span class="sy0">/</span>bin<span class="sy0">/</span>ruby</div>
</div>
<p>Uma breve explicação:</p>
<ul>
<li>Na 4ª linha, configuramos os parâmetros da compilção. Nesse caso, queremos que os arquivos do ruby sejam instalados no diretório /usr/local (&#8211;prefix) e que os executáveis tenham o sufixo 19 (&#8211;program-sufix), o que premite múltiplas versões do ruby instaladas lado a lado.</li>
<li>Na 6ª linha rodamos os testes para verificar se a compilação ocorreu conforme planejado. Caso o teste aponte erros significa que aconteceu algum problema na compilação ou você está com o código-fonte de uma versão desatualizada. Faça um
<div class="codesnip-container" >make clean</div>
<p> e repita o procedimento a partir da 4ª linha. Se ainda sim não resolver, tente com outra versão (preferencialmente a mais recente).</li>
<li>Na 7ª linha instalamos os arquivos compilados no diretório /usr/local (lembra da opção &#8211;prefix?), por isso precisamos das permissões de root. Se o local de instalação fosse no seu diretório de usuário (o que só é recomendado caso você saiba o que está fazendo), não precisaríamos do sudo.</li>
<li>Na 8ª linha criamos um link simbólico de ruby19 para ruby, para facilitar nossa vida <img src='http://rm.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<p>Após todo o processo (que pode demorar um pouco, dependendo do processador) você já poderá utilizar o ruby, atráves do executável ruby19 (lembra da opção &#8211;program-sufix?).</p>
<p>Instalando RubyGems</p>
<p>Após instalar o ruby propriamente dito, chegou a hora de instalar o <a title="RubyGems" href="http://www.rubygems.org/">RubyGems</a>. O RubyGems é o gerenciador padrão para publicação e manutenção de libraries Ruby de terceiros &#8211; uma espécie de gerenciador de pacotes do Ruby. Mais uma vez, faça o procedimento padrão:</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;"><span class="kw3">cd</span> ~<span class="sy0">/</span>rubydev<br />
<span class="kw2">tar</span> xzf rubygems-1.3.4.tgz<br />
<span class="kw3">cd</span> rubygems-1.3.4<br />
<span class="kw2">sudo</span> ruby19 setub.rb <span class="re5">&#8211;prefix</span>=<span class="sy0">/</span>usr<span class="sy0">/</span><span class="kw3">local</span><br />
<span class="kw2">sudo</span> gem19 update <span class="re5">&#8211;system</span></div>
</div>
<p>Agora já temos o RubyGems instalado e com a lista de gems atualizada. Chegou a hora do Rails.</p>
<p>Instalando o framework Rails</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">gem19 <span class="kw2">install</span> rails</div>
</div>
<p>ou se você preferir instalar no diretório de sistema (o que é o meu caso):</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;"><span class="kw2">sudo</span> gem19 <span class="kw2">install</span> rails</div>
</div>
<p>Simples não? Já temos tudo o que precisamos para iniciar o desenvolvimento utilizando Ruby + Ruby On Rails &#8211; e tudo isso em alguns minutos <img src='http://rm.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Instalando+e+configurando+Ruby+On+Rails+no+Linux+http://bit.ly/13p579" title="Post to Twitter"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://rm.blog.br/2009/07/instalando-e-configurando-ruby-on-rails-no-linux/&amp;t=Instalando+e+configurando+Ruby+On+Rails+no+Linux" title="Post to Facebook"><img class="nothumb" src="http://rm.blog.br/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://rm.blog.br/2009/07/instalando-e-configurando-ruby-on-rails-no-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
