<?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>Código com Café &#187; George Marques</title>
	<atom:link href="http://www.codigocomcafe.com/author/admin/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.codigocomcafe.com</link>
	<description>Programação e assuntos relacionados. Com café.</description>
	<lastBuildDate>Sun, 11 Jul 2010 00:42:04 +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>Linguagem de programação para qualquer um</title>
		<link>http://www.codigocomcafe.com/2010/07/linguagem-de-programacao-para-qualquer-um/</link>
		<comments>http://www.codigocomcafe.com/2010/07/linguagem-de-programacao-para-qualquer-um/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 00:41:52 +0000</pubDate>
		<dc:creator>George Marques</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://www.codigocomcafe.com/?p=136</guid>
		<description><![CDATA[Se você não sabe nada de programação, mas sabe inglês, então você já pode programar em IRP.
IRP é uma abreviação para Internet Relay Programming. Não passa de uma divertida brincadeira entre programadores onde você posta linhas de código (na verdade, educadas frases com algum pedido) num canal do IRC. Alguém inspirado pode acatar seu pedido. [...]]]></description>
			<content:encoded><![CDATA[<p>Se você não sabe nada de programação, mas sabe inglês, então você já pode programar em IRP.<span id="more-136"></span></p>
<p>IRP é uma abreviação para <em>Internet Relay Programming</em>. Não passa de uma divertida brincadeira entre programadores onde você posta linhas de código (na verdade, educadas frases com algum pedido) num canal do IRC. Alguém inspirado pode acatar seu pedido. Ou não.</p>
<p>Uma iniciação sobre a linguagem (que é tudo o que você precisa saber sobre IRP) pode ser encontrado no seguinte link: <a href="http://esoteric.voxelperfect.net/wiki/IRP">IRP &#8211; Esolang</a>.</p>
<p>É uma linguagem <em>uber</em> fácil. Aprendi a usá-la em 5 segundos&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigocomcafe.com/2010/07/linguagem-de-programacao-para-qualquer-um/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial de programação gráfica para iniciantes</title>
		<link>http://www.codigocomcafe.com/2010/06/tutorial-de-programacao-grafica-para-iniciantes/</link>
		<comments>http://www.codigocomcafe.com/2010/06/tutorial-de-programacao-grafica-para-iniciantes/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 00:31:23 +0000</pubDate>
		<dc:creator>George Marques</dc:creator>
				<category><![CDATA[jogos]]></category>

		<guid isPermaLink="false">http://www.codigocomcafe.com/?p=133</guid>
		<description><![CDATA[Só para deixar a dica de um ótimo tutorial sobre programação de gráficos para iniciantes com enfoque no desenvolvimento de jogos. O tutorial é em inglês. Acho necessário aprender esse idioma se quer aprender sobre programação.
Segue o link:
www.iki.fi/sol &#8211; Tutorials &#8211; Graphics / Game Programming.
No texto ele comenta sobre um tutorial muito útil de manuseamento [...]]]></description>
			<content:encoded><![CDATA[<p>Só para deixar a dica de um ótimo tutorial sobre programação de gráficos para iniciantes com enfoque no desenvolvimento de jogos. O tutorial é em inglês. Acho necessário aprender esse idioma se quer aprender sobre programação.</p>
<p>Segue o link:</p>
<p><a href="http://sol.gfxile.net/gp/">www.iki.fi/sol &#8211; Tutorials &#8211; Graphics / Game Programming</a>.</p>
<p>No texto ele comenta sobre um tutorial muito útil de manuseamento de bits, vale a pena conferir também.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigocomcafe.com/2010/06/tutorial-de-programacao-grafica-para-iniciantes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como o Wordpress me desapontou</title>
		<link>http://www.codigocomcafe.com/2010/05/como-o-wordpress-me-desapontou/</link>
		<comments>http://www.codigocomcafe.com/2010/05/como-o-wordpress-me-desapontou/#comments</comments>
		<pubDate>Mon, 24 May 2010 21:17:07 +0000</pubDate>
		<dc:creator>George Marques</dc:creator>
				<category><![CDATA[CMS]]></category>
		<category><![CDATA[café]]></category>
		<category><![CDATA[hospedagem]]></category>

		<guid isPermaLink="false">http://www.codigocomcafe.com/?p=126</guid>
		<description><![CDATA[Descrição de alguns problemas do Wordpress e como isso fez a empresa de hospedagem suspender minha conta.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Fui acessar meu blog e descobri, espantado, que minha conta de hospedagem estava suspensa. E eu já estava até pensando que todo mundo fala mal de hospedagem, mas a <a href="http://financeiro.hostdime.com.br/aff.php?aff=1540" target="_blank">Hostdime</a> ainda não tinha me decepcionado (apesar deles terem me empurrado o tal plano de hospedagem). Nunca tive do que reclamar.</p>
<p style="text-align: justify;">Entrei no serviço de helpdesk e descobri que já havia um ticket aberto. Achei muito estranho e fui ver o que era. A administração da Hostdime me disse que alguma tarefa cron estava prejudicando o desempenho do servidor. Nunca criei nenhuma tarefa cron. Eles anexaram um screenshot que indicava o problema no arquivo &#8216;wp-cron.php&#8217;. Este arquivo faz parte do Wordpress. Então, a culpa não é da Hostdime afinal.</p>
<p style="text-align: justify;">Como havia adicionado alguns plugins recentemente, acreditei que algum deles estava causando problemas (especialmente um que faz backup automático). Fuçando no cPanel achei a lista de serviços rodando e também o consumo de CPU/RAM. O indicador de CPU estava no vermelho (embora ainda não entenda muito bem aqueles números). Desativei o plugin, mas não fez nenhuma diferença.</p>
<p style="text-align: justify;">Então desativei e exclui todos os plugins recém-adicionados, já que antes eu nunca tive problemas desse tipo. A carga de CPU abaixou e ficou no verde. Fiz isso hoje de manhã, antes de ir pro trabalho, já que não consegui dormir direito esta noite e acordei antes do despertador. A esta hora eles já tinham reativado minha conta.</p>
<p style="text-align: justify;">Quando estava voltando do trabalho, hoje à tarde, vi no celular um e-mail novo. A equipe da Hostdime informou que a utilização de CPU continuava alta. Exclui todos os plugins, deixei o WP rodando seco. Não me preocupei muito em apagar, pois ontem mesmo fiz backup de tudo (exportei o banco de dados do MySQL e baixei todos os arquivos pelo FTP). Ainda assim ele consumia muito da CPU. Daí eu lembrei que atualizei a versão do WP ontem. Só pode ser isso.</p>
<p style="text-align: justify;">Hora de googlear. Percebi que muita gente teve o mesmo problema que eu: a empresa de hospedagem reclamando do alto consumo de recursos. Muitos blogueiros, como eu, preferem servidores compartilhados, pois são mais baratos e são suficientes para o baixo tráfego. Mas este tipo de problema pode ocasionar a suspensão do site para não prejudicar os outros que estão hospedados.</p>
<p style="text-align: justify;">E teve gente que teve este problema justamente quando atualizou o WP para a última versão (2.9.2). Procurei alguma solução, mas não tive muito sucesso. Aparentemente, plugins de cache, como o famoso WP-Cache, amenizam a utilização de CPU pelo WP. Mas não é uma solução muito eficiente, pois enquanto ainda não tiver feito o cache, o problema continua. Não queria ter minha conta suspensa de vez.<br />
Tomei uma atitude drástica: apaguei os arquivos principais do WP, aqueles que ficam na raiz do site. Mas o consume de recursos só abaixou quando exclui o banco de dados e a conta associada. Por fim, apaguei todos os arquivos do servidor. A culpa era do Wordpress afinal.</p>
<p style="text-align: justify;">O problema do Wordpress é o seguinte: não existe nenhum meio prático dele agendar tarefas para execução (os famosos &#8216;cron jobs&#8217;). Então, a cada vez que uma página é aberta, ele executa a função &#8216;wp_cron()&#8217; que verifica se há tarefas pendentes (e as executa se houver). Além disso, cada plugin e algumas inclusões em sua página gera uma requisição nova para o banco de dados. Assim, para cada visitante em cada página ele faz dezenas de requisições MySQL e, de quebra, ainda executa uma ou outra tarefa pendente. Mesmo um baixo tráfego pode gerar um alto consumo de recursos. E não é de hoje que o WP é assim.</p>
<p style="text-align: justify;">O WP-Cache (ou o WP-Super Cache) cria cópias estáticas das páginas do blog (um html puro, sem funções de servidor). Isso evita as dezenas de requisições ao banco de dados. Isso também impede a execução das tarefas cron, o que pode ser um problema. Mas o cache não funciona com usuários logados. No caso de um blog, como o meu, só existe um usuário registrado: eu mesmo. Então, basta eu acessar o blog de vez em quando para que as tarefas sejam executadas. Como disse o <a title="Coding Horror: Behold WordPress, Destroyer of CPUs" href="http://www.codinghorror.com/blog/2008/04/behold-wordpress-destroyer-of-cpus.html" target="_blank">Jeff Atwood</a>, há mais de um ano, é &#8220;absolutamente irresponsável que a funcionalidade do WP-Cache não esteja já incluída no Wordpress&#8221;.</p>
<p style="text-align: justify;">Por enquanto, redirecionei o endereço para o Blogger, mas ainda não atualizei os posts, vou fazer isso com o tempo, já que não há nenhum método fácil de importar (ouvi dizer que há alguns scripts em python, mas são poucos posts, posso fazer isso na mão mesmo). Não pretendo continuar com o Blogger por que vejo muitos problemas de usabilidade, bem diferente do Wordpress. Falam também dos zilhões de plugins, mas como eles só pioram a situação, não faz tanta diferença.</p>
<p style="text-align: justify;">Vou instalar o PHP + MySQL aqui e testar o consumo de CPU do blog, através do backup que fiz. Se o cache resolver, volto pro Wordpress. Também testarei, juntamente, a solução de <a title="Pascal’s blog » Run Wordpress tasks from real cron job" href="http://blog.dreamdevil.com/index.php/2010/01/29/run-wordpress-tasks-from-real-cron-job/" target="_blank">tornar os &#8216;cron jobs&#8217; agendados de verdade</a>, ao invés de executar na chamada da página. Mas acho que vou procurar outro CMS. E agora já sei quais os defeitos que devo evitar.</p>
<p style="text-align: justify;">E assim o Wordpress me desapontou.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigocomcafe.com/2010/05/como-o-wordpress-me-desapontou/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>De volta, café e Tetris</title>
		<link>http://www.codigocomcafe.com/2010/05/de-volta-cafe-e-tetris/</link>
		<comments>http://www.codigocomcafe.com/2010/05/de-volta-cafe-e-tetris/#comments</comments>
		<pubDate>Thu, 20 May 2010 21:32:24 +0000</pubDate>
		<dc:creator>George Marques</dc:creator>
				<category><![CDATA[café]]></category>

		<guid isPermaLink="false">http://www.codigocomcafe.com/?p=120</guid>
		<description><![CDATA[Fiquei um tempo afastado da programação e voltei com um antigo interesse  em desenvolvimento de jogos. Sei que OpenGL e DirectX (para Windows) fazem sucesso, mas são bibliotecas muito difíceis de se trablhar quando se começa do zero. Queria algo mais prático e eficiente. Pesquisando, encontrei esta tal de SDL (Simple DirectMedia Layer) que [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Fiquei um tempo afastado da programação e voltei com um antigo interesse  em desenvolvimento de jogos. Sei que OpenGL e DirectX (para Windows) fazem sucesso, mas são bibliotecas muito difíceis de se trablhar quando se começa do zero. Queria algo mais prático e eficiente. Pesquisando, encontrei esta tal de <a title="Site oficial da SDL" href="http://www.libsdl.org/" target="_blank">SDL (Simple DirectMedia Layer)</a> que permite o acesso de  baixo nível a hardware como teclado, mouse, joystick e vídeo. Muito usada em jogos, além de outras aplicações (como reprodutores de vídeo). (comentarei mais sobre ela em outro post)</p>
<p><span id="more-120"></span></p>
<p style="text-align: justify;">É uma biblioteca realmente muito conhecida e utilizida, principalmente, por iniciantes. Além de ser muilti-plataforma, possui algumas bibliotecas extras para se trabalhar com fontes (renderização de texto) e imagens de outros formatos além do BMP (o único suportado nativamente). A engine gráfica é um pouco lenta e seria grande problema para aplicações que usem bastante do hardware, já que a SDL só tem suporte a aceleração por software, mas é possível integrá-la ao OpenGL e ter gráficos mais potentes.</p>
<p style="text-align: justify;">Briguei bastante com ela no começo, já que faz tempo que não programo nada, mas aprendi bastante com o <a title="Lazy Foo SDL Tutorial" href="http://lazyfoo.net/SDL_tutorials/index.php" target="_blank">tutorial do Lazy Foo</a>. E como ouvi dizer que fazer uma réplica de Tetris é um bom começo para programação de jogos (já que tem tudo: loop principal, contagem de pontos, checagem de vitória/derrota, etc.), tentei fazer uma utilizando o SDL. Foi difícil começar, mas cheguei a algo razoável. Vocês podem fazer o download da versão alpha aqui: <a title="Projeto Line Collapser" href="http://sourceforge.net/projects/linecollapser" target="_blank">http://sourceforge.net/projects/linecollapser</a>. Já está jogável, apesar de alguns bugs (o que pode tornar o jogo extremamente difícil em níveis mais altos). Considere que ainda está em fase de desenvolvimento, ainda é só um alpha. E não testei em outros computadores, espero que funcione.</p>
<p style="text-align: justify;">Posterei aqui algumas coisas que aprendi de SDL, então fiquem ligados. Talvez poste como fiz o jogo e algumas dificuldades que tive. E quando ele estiver funcionando legalzinho, tentarei implementar os gráficos com OpenGL. Vou postar aqui o que aprender dessa poderosa biblioteca. E depois, quem sabe, investir num jogo mais poderoso. Por enquanto é só. Até o próximo post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigocomcafe.com/2010/05/de-volta-cafe-e-tetris/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Café com Browser</title>
		<link>http://www.codigocomcafe.com/2009/09/cafe-com-browser/</link>
		<comments>http://www.codigocomcafe.com/2009/09/cafe-com-browser/#comments</comments>
		<pubDate>Sun, 13 Sep 2009 21:34:11 +0000</pubDate>
		<dc:creator>George Marques</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[café]]></category>

		<guid isPermaLink="false">http://www.codigocomcafe.com/?p=116</guid>
		<description><![CDATA[O evento já foi realizado três vezes pelo W3C Brasil e consiste em convidar os representantes dos navegadores web para comentar a respeito de seus produtos e como estes se adequam aos padrões.
Para quem perdeu pode baixar os vídeos em http://www.w3c.br/cafecombrowser, embora, infelizmente, o primeiro evento, com o navegador Opera, não filmado.
É interessante saber que, [...]]]></description>
			<content:encoded><![CDATA[<p>O evento já foi realizado três vezes pelo W3C Brasil e consiste em convidar os representantes dos navegadores web para comentar a respeito de seus produtos e como estes se adequam aos padrões.</p>
<p>Para quem perdeu pode baixar os vídeos em <a href="http://www.w3c.br/cafecombrowser">http://www.w3c.br/cafecombrowser</a>, embora, infelizmente, o primeiro evento, com o navegador Opera, não filmado.</p>
<p>É interessante saber que, por incrível que pareça, o IE 8 já suporta algumas tags do famigerado HTML5.</p>
<p>Estas e outras informações interessantes sobre os navegadores podem ser obtidas através dos vídeos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigocomcafe.com/2009/09/cafe-com-browser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How jQuery Works (tradução do tutorial para pt-BR)</title>
		<link>http://www.codigocomcafe.com/2009/08/how-jquery-works-traducao-do-tutorial-para-pt-br/</link>
		<comments>http://www.codigocomcafe.com/2009/08/how-jquery-works-traducao-do-tutorial-para-pt-br/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 11:00:19 +0000</pubDate>
		<dc:creator>George Marques</dc:creator>
				<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.codigocomcafe.com/?p=86</guid>
		<description><![CDATA[
Apenas uma tradução para português do Brasil do tutorial de jQuery presente em http://docs.jquery.com/How_jQuery_Works. Por ser praticamente um &#8220;getting started&#8221; oficial e não encontrei nenhuma versão deste texto em português, resolvi traduzi-lo eu mesmo. Se por acaso encontrar algum &#8220;eu&#8221; no texto, se refere ao autor original (John Resig.).

jQuery: O Básico
Este é um tutorial básico, [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align:justify;">
<p>Apenas uma tradução para português do Brasil do tutorial de jQuery presente em <a href="http://docs.jquery.com/How_jQuery_Works">http://docs.jquery.com/How_jQuery_Works</a>. Por ser praticamente um &#8220;getting started&#8221; oficial e não encontrei nenhuma versão deste texto em português, resolvi traduzi-lo eu mesmo. Se por acaso encontrar algum &#8220;eu&#8221; no texto, se refere ao autor original (<a title="http://ejohn.org/" href="http://ejohn.org/">John Resig.</a>).</p>
<p><span id="more-86"></span></p>
<h2><a name="Basico">jQuery: O Básico</a></h2>
<p>Este é um tutorial básico, desenvolvido para ajudá-lo a começar a usar o jQuery. Se você ainda não tem uma página de teste pronta, comece criando uma nova página HTML com o seguinte conteúdo:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;html&gt;
  &lt;head&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;jquery.js&quot;&gt;&lt;/script&gt;
&nbsp;
    &lt;script type=&quot;text/javascript&quot;&gt;
&nbsp;
    &lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;a href=&quot;http://www.codigocomcafe.com/&quot;&gt;Código com Café&lt;/a&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre></div></div>

<p>Altere o atributo <code>src</code> da <i>tag</i> <code>script</code> para que aponte para a sua cópia do jquery.js. Por exemplo, se jquery.js estiver no mesmo diretório que se arquivo HTML, você pode usar:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;script type=&quot;text/javascript&quot; src=&quot;jquery.js&quot;&gt;&lt;/script&gt;</pre></div></div>

<p><strong>Nota:</strong> Quando a página inteira é incluída através das funções include() ou require() do PHP, tenha certeza de colocar o script dentro da tag &lt;body&gt; e não dentro de &lt;head&gt;, porque chamando o arquivo de script do jQuery dentro da tag &lt;head&gt; por algum motivo não funciona.</p>
<p>Você pode baixar sua própria cópia do jQuery na página <a href="http://docs.jquery.com/Downloading_jQuery" title="Downloading jQuery">Downloading jQuery</a>.</p>
<h2><a name="Quando_Pronto">Lançando o código quando o documento estiver pronto</a></h2>
<p>A primeira coisa que a maioria dos programadores de JavaScript acaba fazendo é adicionar algum código ao programa, parecido com isto:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">window.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</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: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;bem-vindo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Dentro disso fica o código que você quer que rode exatamente quando a página for carregada. Problematicamente, contudo, o código JavaScript não roda até que todas as imagens forem baixadas (isto inclui os banners de propaganda). O motivo para usar <code>window.onload</code> em primeiro lugar é que o &#8216;document&#8217; do HTML ainda não está completamente carregado, quando você tenta rodar seu código pela primeira vez.</p>
<p>Para burlar ambos os problemas, jQuery tem uma instrução simples que checa o documento e espera até que ele esteja pronto para ser manipulado, conhecido como o <a href="http://docs.jquery.com/Events#ready.28_fn_.29">evento <em>ready</em></a></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;">ready</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;">// Seu codigo aqui (com ou sem cafe)</span>
 <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Dentro do evento <em>ready</em>, insira um manipulador do evento click para o link:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td 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;">ready</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: #009900;">&#40;</span><span style="color: #3366CC;">&quot;a&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
     <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Obrigado por visitar&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Salve seu arquivo HTML e recarregue a página de testes em seu navegador. Clicando no link na página deve aparecer uma caixa de mensagem no navegador, antes de deixar a página para ir até a página principal do Código com Café.</p>
<p>Para <em>click</em> e muitos outro <a href="http://docs.jquery.com/Events">eventos</a>, você pode previnir o comportamento principal &#8211; aqui o link até www.codigocomcafe.com &#8211; chamando <code>event.preventDefault()</code> no manipulador do evento:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td 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;">ready</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: #009900;">&#40;</span><span style="color: #3366CC;">&quot;a&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
     <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Como pode ver, o link não te leva mais para www.codigocomcafe.com&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     event.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h2><a name="Exemplo_Completo">Exemplo Completo</a></h2>
<p>O seguinte é um exemplo de como o arquivo HTML completo deve parecer se você usou o script em seu próprio aquivo. Note que ele aponta para o CDN do Google para carregar o arquivo do jQuery. Também, enquanto o script personalizado foi colocado dentro da tag &lt;head&gt;, em geral é preferível que se coloque em um arquivo separado e se referir a este arquivo no atributo src do elemento script.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"> &lt;!DOCTYPE html&gt;
 &lt;html lang=&quot;en&quot;&gt;
 &lt;head&gt;
   &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt;
   &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
   <span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>
     $<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</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: #009900;">&#40;</span><span style="color: #3366CC;">&quot;a&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
         <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Como pode ver, o link não te leva mais para www.codigocomcafe.com&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
         event.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span>
 &lt;/head&gt;
 &lt;body&gt;
   &lt;a href=&quot;http://www.codigcomcafe.com/&quot;&gt;Código com Café&lt;/a&gt;
 &lt;/body&gt;
 &lt;/html&gt;</pre></td></tr></table></div>

<h2><a name="Adicionando_CSS">Adicionando e Removendo uma Classe CSS</a></h2>
<p><strong>Importante:</strong> <em>Os exemplos em jQuery daqui pra frente precisarão ser colocados dentro do <a href="http://docs.jquery.com/Events#ready.28_fn_.29">evento <em>ready</em></a>, assim eles serão executados quando o documento estiver pronto para se trabalhar. Veja <a href="#Quando_Pronto">Lançando o código quando o documento estiver pronto</a> acima para detalhes.</em></p>
<p>Outra tarefa comum é adicionar (ou remover) uma classe CSS.</p>
<p>Primeiro, adicione uma alguma informação de estilo dentro de &lt;head&gt; do seu documento, como isto:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"> &lt;style type<span style="color: #00AA00;">=</span><span style="color: #ff0000;">&quot;text/css&quot;</span><span style="color: #00AA00;">&gt;</span>
    a<span style="color: #6666ff;">.teste</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">font-weight</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">bold</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
 &lt;/style<span style="color: #00AA00;">&gt;</span></pre></div></div>

<p>Em seguida, adicione a chamada <a href="http://docs.jquery.com/Attributes/addClass"><code>addClass</code></a> ao seu script:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;a&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;teste&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Todos os seus elementos <code>a</code> ficarão em negrito.</p>
<p>Para remover uma classe, use <code>removeClass</code></p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;a&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">removeClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;teste&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<ul>
<li>(CSS permite que múltiplas classes sejam adicionadas a um elemento)</li>
</ul>
<h2><a name="Efeitos_Especiais">Efeitos Especiais</a></h2>
<p>Em jQuery, são providos alguns <a href="http://docs.jquery.com/Effects">efeitos</a> úteis, para realmente fazer o sew website se sobressair. Para colocar isso em teste, altere o click que você adicionou previamente para isto:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;a&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   event.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;slow&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Agora, se você clicar em algum link, isto deve fazê-lo sumir vagarosamente.</p>
<h2><a name="Callback">FUNÇÕES E CALLBACK</a></h2>
<p><em>Callback</em> é uma função passada como argumento para outra função e é executada quando sua função-mãe for completada. A coisa especial sobre callback é que a função que aparece depois da &#8220;mãe&#8221; pode executar antes que o callback execute.</p>
<p>Outra coisa importante é saber como passar apropriadamente o callback. Isto é onde muitas vezes eu esqueci da sintaxe apropriada.</p>
<h2><a name="Callback_sem_Argumentos">Callback <em>sem</em> argumentos</a></h2>
<p>Para um callback sem argumentos, você passa como este:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'minhapagina.html'</span><span style="color: #339933;">,</span> meuCallBack<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><strong>Note</strong> que o segundo parâmetro aqui é simplesmente o nome da função (mas <em>não</em> como uma <code>string</code> e sem parênteses). Funções em JavaScript são &#8216;Cidadãos de primeira classe&#8217; e assim devem ser passadas como referências de variáveis e executadas num momento mais tarde.</p>
<h2><a name="Callback_com_Argumentos">Callback <em>com</em> argumentos</a></h2>
<p>&#8220;O que se faz quando tiver argumentos que deseja passar?&#8221;, você pode perguntar a si mesmo.</p>
<h3>Errado</h3>
<p>A Forma Errada (<strong>Não</strong> irá funcionar!)</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"> $.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'minhapagina.html'</span><span style="color: #339933;">,</span> meuCallBack<span style="color: #009900;">&#40;</span>param1<span style="color: #339933;">,</span> param2<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Não funciona porque isso chama</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">meuCallBack<span style="color: #009900;">&#40;</span>param1<span style="color: #339933;">,</span> param2<span style="color: #009900;">&#41;</span></pre></div></div>

<p>e então passa o valor retornado como segundo parâmetro para <a href="http://docs.jquery.com/Ajax">$.get()</a>.</p>
<h3>Certo</h3>
<p>O problema com o exemplo acima é que <code>meuCallBack(param1, param2)</code> é avaliado antes de ser passado como uma função. JavaScript e por extensão o jQuery espera um ponteiro em casos como esse. Por exemplo, a função setTime</p>
<p>Na utilização abaixo, uma função anônima é criada (apenas um bloco de instruções) e então registrada como a função callback. Note o uso de &#8216;function(){&#8216;. A função anônima faz exatamente uma coisa: chama meuCallBack, com os valores de param1 e param2 no escopo exterior.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'minhapagina.html'</span><span style="color: #339933;">,</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>
  meuCallBack<span style="color: #009900;">&#40;</span>param1<span style="color: #339933;">,</span> param2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>param1 e param2 são avaliados como um callback assim que $.get() terminar de obter a página.</p>
<h2><a name="Mais_Leituras">MAIS LEITURAS</a></h2>
<p>Encerrando por aqui a tradução, mantenho a indicação original para os <a href="http://docs.jquery.com/Tutorials">tutoriais</a> e para a <a href="http://docs.jquery.com/Main_Page">Documentação do jQuery</a>.</p>
<p>Comecei agora a estudar jQuery e pretendo postar as funções que achar interessantes (ou úteis). É um pouco difícil encontrar conteúdo em português, então por esse motivo pretendo postar algumas coisas aqui. E dizem que o <a href="http://www.livrojquery.com.br/">livro do Maujor</a> é muito bom.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.codigocomcafe.com/2009/08/how-jquery-works-traducao-do-tutorial-para-pt-br/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Padrões de Projeto</title>
		<link>http://www.codigocomcafe.com/2009/08/padroes-de-projeto/</link>
		<comments>http://www.codigocomcafe.com/2009/08/padroes-de-projeto/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 21:00:32 +0000</pubDate>
		<dc:creator>George Marques</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>

		<guid isPermaLink="false">http://www.codigocomcafe.com/?p=50</guid>
		<description><![CDATA[Quem desenvolve softwares orientados a objetos muito provavelmente utiliza padrões de projeto. Neste post vou dar uma pequena introdução a esse assunto tão extenso (e recorrente) na área de desenvolvimento de aplicações.
A definição inicial de &#8220;padrão de projeto&#8221; (design pattern em inglês) veio de Christopher Alexander, que afirmou que &#8220;cada padrão descreve um problema que [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Quem desenvolve softwares orientados a objetos muito provavelmente utiliza padrões de projeto. Neste post vou dar uma pequena introdução a esse assunto tão extenso (e recorrente) na área de desenvolvimento de aplicações.</p>
<p style="text-align: justify;"><span id="more-50"></span><a href="http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=311479&amp;sid=8918711751182353251697474&amp;k5=1C0E78DE"><img class="size-medium wp-image-51" style="float:right;" title="Padrões de Projeto" src="http://www.codigocomcafe.com/wp-content/uploads/2009/08/padroes-de-projeto-225x300.jpg" alt="Padrões de Projeto" width="225" height="300" /></a>A definição inicial de &#8220;padrão de projeto&#8221; (<em>design pattern</em> em inglês) veio de <a title="Wikipedia - Christopher Alexander" href="http://en.wikipedia.org/wiki/Christopher_Alexander" target="_blank">Christopher Alexander</a>, que afirmou que &#8220;cada padrão descreve um problema que ocorre muitas e muitas vezes em nosso ambiente, e então descreve o cerne da solução deste problema, de uma forma que você possa usar essa solução mais de um milhão de vezes, sem nunca fazer da mesma maneira duas vezes&#8221;<sup class='footnote' style='vertical-align:super;font-size:65%;'><a href='#fn-50-1' id='fnref-50-1'>[1]</a></sup>. Tudo bem que Alexander estivesse falando de padrões na construção civil, mas esta ideia serviu de base para a bem conhecida <em>&#8220;Gang of Four&#8221;</em>, composta por Erich Gamma, Richard Helm, Ralph Johnson &amp; John Vlissides, que criou o livro &#8220;<em>Design Patterns &#8211; elements of reusable object-oriented software&#8221;</em><sup class='footnote' style='vertical-align:super;font-size:65%;'><a href='#fn-50-2' id='fnref-50-2'>[2]</a></sup>. Esse livro é a principal referência deste post (na versão em português do livro) e é reconhecido como o início oficial dos padrões de projeto em desenvolvimento de software.</p>
<p style="text-align: justify;">Por que usar padrões de projeto? A resposta é simples: para facilitar o seu trabalho. Quando se cria um software orientado a objetos, em geral se espera que ele seja facilmente adaptável e reutilizável, para ajudar em pequenas alterações e correções futuras, além de evitar a repetição de código. Os padrões tornam isso possível e muito mais prático.</p>
<p style="text-align: justify;">É muito comum a utilização de funções semelhantes para problemas semelhantes dentro de um mesmo programa. Os padrões podem evitar que se reescreva trechos de código, facilitando (e muito) uma alteração futura. Além disso, uma solução para uma parte de um software pode já ter sido feita em outro software. É muito mais fácil reutilizar o código com poucas alterações se você usa os padrões de projeto.</p>
<p style="text-align: justify;">Provavelmente o principal motivo é: se já existe a solução para o seu problema, por que tentar criar outra? Seria como reinventar a roda.</p>
<p style="text-align: justify;">Aqui vai uma lista dos padrões tratados no livro:</p>
<h4 style="text-align: justify;"><em>Padrões de Criação:</em></h4>
<p style="text-align: justify;"><strong>Abstract Factory: </strong>Fornece uma interface para criação de famílias de objetos relacionados ou dependentes sem especificar suas classes concretas.<br />
<strong>Builder: </strong>Separa a construção de um objeto da sua representação, de modo que o mesmo processo de construção possa criar diferentes representações.<br />
<strong>Factory Method:</strong> Define uma interface para criar um objeto, mas deixa as subclasses decidirem qual classe a ser instanciada. O Factory Method permite a uma classe postergar (<em>defer</em>) a instanciação às subclasses.<br />
<strong>Prototype:</strong> Especifica os tipos de objetos a serem criados usando uma instância prototípica e criar novos objetos copiando este protótipo.<br />
<strong>Singleton:</strong> Garante que uma classe tenha somente uma instância e fornece um ponto global de acesso para ela.</p>
<h4 style="text-align: justify;"><em>Padrões Estruturais</em></h4>
<p style="text-align: justify;"><strong>Adapter:</strong> Converte a interface de uma classe em outra interface esperada pelos clientes. O Adapter permite que certas classes trabalhem em conjunto, pois de outra forma seria impossível por causa de suas interfaces incompatíveis.<br />
<strong>Bridge:</strong> Separa uma abstração da sua implementação, de modo que as duas possam variar independentemente.<br />
<strong>Composite:</strong> Compõe objetos em estrutura de árvore para representar hierarquias do tipo partes-todo. O Composite permite que os clientes tratem objetos individuais e composições de objetos de maneira uniforme.<br />
<strong>Decorator:</strong> Atribui responsabilidades adicionais a um objeto dinamicamente. Os decorators fornecem uma alternativa flexível a subclasses para extensão da funcionalidade.<br />
<strong>Façade:</strong> Fornece uma interface unificada para um conjunto de interfaces em um subsistema. O Façade define uma interface de nível mais alto que torna o subsistema mais fácil de usar.<br />
<strong>Flyweight: </strong>Usa compartilhamento para suportar grandes quantidades de objetos, de granularidade fina, de maneira eficiente.<br />
<strong>Proxy:</strong> Fornece um objeto representante (<em>surrogate</em>), ou um marcador de outro objeto, para controlar o acesso ao mesmo.</p>
<h4 style="text-align: justify;"><em>Padrões Comportamentais</em></h4>
<p style="text-align: justify;"><strong>Chain of Responsability:</strong> Evita o acoplamento do remetente de uma solicitação ao seu destinatário, dando a mais de um objeto a chance de tratar a solicitação. Encadeia os objetos receptores e passa a solicitação ao longo da cadeia até que um objeto a trate.<br />
<strong>Command:</strong> Encapsula uma solicitação como um objeto, desta forma permitindo que você parametrize clientes com diferentes solicitações, enfileire ou registre (<em>log</em>) solicitações e suporte operações que podem ser desfeitas.<br />
<strong>Interpreter:</strong> Dada uma linguagem, define uma representação para sua gramática juntamente com um interpretador que usa a representação para interpretar sentenças nesta linguagem.<br />
<strong>Iterator: </strong>Fornece uma maneira de acessar sequencialmente os elementos de um objeto agregado sem expor sua representação subjacente.<br />
<strong>Mediator: </strong>Define um objeto que encapsula como um conjunto de objetos interage. O Mediator promove o acoplamento faco ao evitar que os objetos se reforam explicitamente uns aos outros, permitindo que você varie suas interações independentemente.<br />
<strong>Memento:</strong> Sem violar a encapsulação, captura e externaliza um estado interno de um objeto, de modo que o mesmo possa posteriormente ser restaurado para este estado.<br />
<strong>Observer:</strong> Define uma dependência um-para-muitos entre objetos, de modo que, quando um objeto muda de estado, todos os seus dependentes sõ automaicamente notificados e atualizados.<br />
<strong>State:</strong> Permite que um objeto altere seu comportamento quando seu estado interno muda. O objeto parecerá ter mudado de classe.<br />
<strong>Strategy:</strong> Define uma família de algoritmos, encapsula cada um deles e os faz intercambiáveis. O Strategy pernite que o algoritmo varie independentemente dos clientes que o utilizam.<br />
<strong>Template Method:</strong> Define o esqueleto de um algoritmo em uma operação, postergando a definição de alguns passos para subclasses. O Template Method permite que as subclasses redefinam certos passos de um algoritmo sem mudar sua estrutura.<br />
<strong>Visitor:</strong> Representa uma operação a ser executada sobre os elementos da estrutura de um objeto. O Visitor permite que você defina uma nova operação sem mudar as classes dos elementos sobre os quais opera.</p>
<p style="text-align: justify;">Estes padrões independem de linguagem, embora alguns deles sejam mais facilmente implementados em certas linguagens.</p>
<p style="text-align: justify;">Esta foi só uma introdução bem simples ao assunto bem extenso de padrões de projeto. O livro contém esses padrões listados de forma bem explicada, com alguns exemplos de implementação e aplicações reais. Eu realmente recomendo. A internet é sempre uma fonte de bom (e mal) conteúdo, então sugiro pesquisar, pois existem padrões de projeto que não constam no livro. E é bem possível que eu acabe comentando mais profundamente um outro padrão no decorrer do tempo (e conforme eu mesmo os utilizar), então aguardem. Se quiserem saber mais sobre um padrão em específico, comente que eu pensarei no assunto. <img src='http://www.codigocomcafe.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: justify;font-size:75%;">Fontes:</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 1292px; width: 1px; height: 1px; text-align: justify;">&lt;a href=&#8221;http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=311479&amp;amp;sid=8918711751182353251697474&amp;amp;k5=1C0E78DE&#8221;&gt;&lt;img class=&#8221;size-medium wp-image-51&#8243; title=&#8221;Padrões de Projeto&#8221; src=&#8221;http://www.codigocomcafe.com/wp-content/uploads/2009/08/padroes-de-projeto-225&#215;300.jpg&#8221; alt=&#8221;Padrões de Projeto&#8221; width=&#8221;225&#8243; height=&#8221;300&#8243; style=&#8221;float:right;&#8221; /&gt;&lt;/a&gt;</div>
<div class='footnotes'>
<div class='footnotedivider'></div>
<ol style='font-size:65%'>
<li id='fn-50-1'>Christopher Alexander. A Pattern Language. Estados Unidos da América: Oxford University Press, 1977.. ISBN <a title="ISBN 0195019199" href="http://pt.wikipedia.org/wiki/Especial:Fontes_de_livros/0195019199">0195019199</a> <span class='footnotereverse'><a href='#fnref-50-1'>&#8617;</a></span></li>
<li id='fn-50-2'>Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. 1.ed. Estados Unidos da América: Addison-Wesley, 1995.. ISBN <a title="ISBN 0201633612" href="http://pt.wikipedia.org/wiki/Especial:Fontes_de_livros/0201633612">0201633612</a> <span class='footnotereverse'><a href='#fnref-50-2'>&#8617;</a></span></li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.codigocomcafe.com/2009/08/padroes-de-projeto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mudança</title>
		<link>http://www.codigocomcafe.com/2009/08/mudanca/</link>
		<comments>http://www.codigocomcafe.com/2009/08/mudanca/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 13:57:36 +0000</pubDate>
		<dc:creator>George Marques</dc:creator>
				<category><![CDATA[café]]></category>

		<guid isPermaLink="false">http://www.codigocomcafe.com/?p=46</guid>
		<description><![CDATA[O blog Código com Café agora etá em um novo endereço. Os leitores de feed não se preocupem, pois o FeedBurner dá conta de redirecionar automaticamente.
Demorei para postar por causa dessa transição. No meio dessa briga com servidor de hospedagem e outra com a instalação do WordPress, acebei gastando bastante tempo.
Até amanhã posto alguma coisa [...]]]></description>
			<content:encoded><![CDATA[<p>O blog Código com Café agora etá em um novo endereço. Os leitores de feed não se preocupem, pois o <a href="http://www.feedburner.com">FeedBurner</a> dá conta de redirecionar automaticamente.</p>
<p>Demorei para postar por causa dessa transição. No meio dessa briga com servidor de hospedagem e outra com a instalação do WordPress, acebei gastando bastante tempo.</p>
<p>Até amanhã posto alguma coisa nova.</p>
<p>Inté.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigocomcafe.com/2009/08/mudanca/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Validando datas com JavaScript e Expressões Regulares</title>
		<link>http://www.codigocomcafe.com/2009/08/validando-datas-com-javascript-e-regex/</link>
		<comments>http://www.codigocomcafe.com/2009/08/validando-datas-com-javascript-e-regex/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 16:37:00 +0000</pubDate>
		<dc:creator>George Marques</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[regex]]></category>

		<guid isPermaLink="false">http://www.codigocomcafe.com/index.php/2009/08/15/validando-datas-com-javascript-e-expressoes-regulares/</guid>
		<description><![CDATA[Expressões Regulares, conhecidas também como regex, são muito úteis na área de programação. Uma das utilidades das ERs é a validação de dados.
Estava estudando ERs e, para treinar, decidi fazer um sistema de validação de datas em JavaScript, algo bastante útil, embora já existam funções prontas que fazem isso, como no jQuery, talvez no futuro [...]]]></description>
			<content:encoded><![CDATA[<p>Expressões Regulares, conhecidas também como <span style="font-style: italic;">regex</span>, são muito úteis na área de programação. Uma das utilidades das ERs é a validação de dados.</p>
<p>Estava estudando ERs e, para treinar, decidi fazer um sistema de validação de datas em JavaScript, algo bastante útil, embora já existam funções prontas que fazem isso, como no jQuery, talvez no futuro eu cite algumas dessas funções.</p>
<p>Validar datas com ERs é útil porque elas são aceitas em várias linguagens diferentes, assim o seu script em PHP (ou outra linguagem de servidor) pode validar novamente os dados, por segurança, usando a mesma ER. Você não precisará se dar ao trabalho de escrever um novo código.</p>
<p><span id="more-5"></span></p>
<p>Existem duas maneiras de se definir uma ER em JavaScript:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> regex <span style="color: #339933;">=</span> <span style="color: #009966; font-style: italic;">/regex/</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">//ou</span>
<span style="color: #003366; font-weight: bold;">var</span> regex <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> RegExp <span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;regex&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Sempre tomando cuidado para escapar os caracteres corretamente.</p>
<h4 style="font-weight: bold;font-size:130%;">Validando Datas</h4>
<p>Vamos ao que interessa. Em primeiro lugar vamos definir uma ER genérica, depois vamos melhorando-a até chegar naquilo que queremos (preste atenção no escape do caractere &#8216;<code>/</code>&#8216;).</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> regex <span style="color: #339933;">=</span> <span style="color: #009966; font-style: italic;">/..\/..\/..../</span><span style="color: #339933;">;</span></pre></div></div>

<p>Isso reconhece  qualquer coisa, como &#8220;e3/34/e %[&#8220;, e isso não é o que queremos. Vamos limitar apenas a números (<code>\d</code>). Além disso, a data deve ser a única coisa no campo, então vamos dizer que é no começo da linha (<code>^</code>) e que também é no final da linha (<code>$</code>).</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> regex <span style="color: #339933;">=</span> <span style="color: #009966; font-style: italic;">/^\d\d\/\d\d\/\d\d\d\d$/</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ok. Mas isso aceitaria algo como &#8220;43/56/9999&#8243;, temos que limitar o dia até 31 e o mês até 12. E nenhum dos dois pode ser &#8220;00&#8243;. Então o dia deve ser 0 e um número entre 1 e 9, 1 ou 2 e um número ou 3 e 0 ou 1. Algo parecido para o mês. O ano deve ser entre 1900 e 2099. Vamos agrupar cada pedaço, para ficar mais fácil (ou não).</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> regex <span style="color: #339933;">=</span> <span style="color: #009966; font-style: italic;">/^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[0-2])\/((19|20)\d\d)$/</span><span style="color: #339933;">;</span></pre></div></div>

<p>Bom, o dia pode possuir apenas um dígito se estiver entre 1 e 9. O mesmo vale para o mês. O ano também pode ser no formato reduzido de apenas dois dígitos. Vamos deixar algumas coisas opcionais (<code>?</code>).</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> regex <span style="color: #339933;">=</span> <span style="color: #009966; font-style: italic;">/^(0?[1-9]|[12][0-9]|3[01])\/(0?[1-9]|1[0-2])\/((19|20)?\d\d)$/</span><span style="color: #339933;">;</span></pre></div></div>

<p>Está ficando bonito, não é? Agora vem o problema. Uma data do tipo &#8220;31/4/09&#8243; é válida, mas abril não tem dia 31. Teremos que dividir por mês, permitindo a quantidade de dias apropriada. Existem basicamente dois jeitos de se fazer isso. O primeiro é mantendo o intervalo de dias inteiro para cada tipo de mês (29, 30 ou 31 dias). Outro modo seria permitir 28 dias para todos os meses, 29 e 30 para todos menos fevereiro e 31 para os meses de 31 dias. Vou usar essa segunda maneira, porque deixa a ER menor e mais fácil de entender (às vezes uma maior é mais fácil de entender, nesse caso deixe ela maior). O agrupamento é importante, pois o operador OU (<code>|</code>) é o último da lista de precedência.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> regex <span style="color: #339933;">=</span> <span style="color: #339933;">/^</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">?</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">-</span><span style="color: #CC0000;">9</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">|</span><span style="color: #CC0000;">1</span>\d<span style="color: #339933;">|</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">-</span><span style="color: #CC0000;">8</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>\<span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">?</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">-</span><span style="color: #CC0000;">9</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">|</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">-</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">|</span>
 <span style="color: #006600; font-style: italic;">//28 para todos os meses</span>
<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">29</span><span style="color: #339933;">|</span><span style="color: #CC0000;">30</span><span style="color: #009900;">&#41;</span>\<span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">?</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">13456789</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">|</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">-</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">|</span>
 <span style="color: #006600; font-style: italic;">//29 e 30 para todos menos fevereiro</span>
<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">31</span>\<span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">?</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">13578</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">|</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#91;</span>02<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
 <span style="color: #006600; font-style: italic;">//31 para jan, mar, mai, jul, ago, out e dez</span>
\<span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">19</span><span style="color: #339933;">|</span><span style="color: #CC0000;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">?</span>\d\d<span style="color: #009900;">&#41;</span>$<span style="color: #339933;">/;</span></pre></div></div>

<p>Lembre-se que ERs em JavaScript não aceitam comentários e muito menos quebras de linha,eu só fiz isso para explicar as partes da ER. Se achar que precisará comentar, use o outro formato de definição, quebrando a <code>string</code> passada ao RegExp (nesse caso, lembre-se que a barra inversa &#8216;\&#8217; precisa ser escapada &#8216;\\&#8217;). Nossa ER está quase pronta. O único defeito é que ela não aceita o dia 29 de fevereiro, o que é válido nos anos bissextos. Não podemos deixá-la aceitar o dia 29/2 em todos os anos, então vamos deixar ela do jeito que está e apenas acrescentar uma condição.</p>
<p>Mas essa condição não é exatamente simples. Um ano é bissexto se for divisível por 4. Se termina com 00, o ano é bissexto se for divisível por 400. 2000 é ano bissexto, mas 1900 não é. Um número é divisível por quatro se o número formado pelos dois últimos dígitos for divisível por quatro. Isso só é possível de se fazer com ER porque a tabuada do 4 segue um padrão peculiar. Dos dois dígitos, se o primeiro for par (0 é par) então o segundo deve ser 0, 4 ou 8 e se o primeiro algarismo for ímpar o segundo deve ser 2 ou 6. Com ER, isso ficaria assim:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> regex <span style="color: #339933;">=</span> <span style="color: #009966; font-style: italic;">/\b\d*(([02468])[048])|([13579][26])\b/</span><span style="color: #339933;">;</span></pre></div></div>

<p>Essa é uma ER que casa com qualquer número múltiplo de 4 (de pelo menos dois dígitos). Vamos aplicar o mesmo conceito à nossa ER de validação, lembrando que 1900 é divisível por 4, mas não é bissexto e que 00 é equivalente ao ano 2000.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> regex <span style="color: #339933;">=</span> <span style="color: #339933;">/^</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">?</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">-</span><span style="color: #CC0000;">9</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">|</span><span style="color: #CC0000;">1</span>\d<span style="color: #339933;">|</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">-</span><span style="color: #CC0000;">8</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>\<span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">?</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">-</span><span style="color: #CC0000;">9</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">|</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">-</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">|</span>
 <span style="color: #006600; font-style: italic;">//28 para todos os meses</span>
<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">29</span><span style="color: #339933;">|</span><span style="color: #CC0000;">30</span><span style="color: #009900;">&#41;</span>\<span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">?</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">13456789</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">|</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">-</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">|</span>
 <span style="color: #006600; font-style: italic;">//29 e 30 para todos menos fevereiro</span>
<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">31</span>\<span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">?</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">13578</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">|</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#91;</span>02<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
 <span style="color: #006600; font-style: italic;">//31 para jan, mar, mai, jul, ago, out e dez</span>
\<span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">19</span><span style="color: #339933;">|</span><span style="color: #CC0000;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">?</span>\d\d<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>$<span style="color: #339933;">|</span>
<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">29</span>\<span style="color: #339933;">/</span><span style="color: #CC0000;">0</span><span style="color: #339933;">?</span><span style="color: #CC0000;">2</span>\<span style="color: #339933;">/</span><span style="color: #009900;">&#41;</span>
 <span style="color: #006600; font-style: italic;">//29 de fevereiro</span>
<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">19</span><span style="color: #339933;">|</span><span style="color: #CC0000;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">?</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">48</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">|</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">2468</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>048<span style="color: #009900;">&#93;</span><span style="color: #339933;">|</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">13579</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">26</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">|</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">?</span>00<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>$<span style="color: #339933;">/;</span></pre></div></div>

<p>E, finalmente, nossa ER está pronta. Só falta aplicá-la num código de validação:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> valida_data<span style="color: #009900;">&#40;</span>element<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 regex <span style="color: #339933;">=</span> <span style="color: #339933;">/^</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">?</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">-</span><span style="color: #CC0000;">9</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">|</span><span style="color: #CC0000;">1</span>\d<span style="color: #339933;">|</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">-</span><span style="color: #CC0000;">8</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>\<span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">?</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">-</span><span style="color: #CC0000;">9</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">|</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">-</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">|</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">29</span><span style="color: #339933;">|</span><span style="color: #CC0000;">30</span><span style="color: #009900;">&#41;</span>\<span style="color: #339933;">/</span>
        <span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">?</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">13456789</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">|</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">-</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">|</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">31</span>\<span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">?</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">13578</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">|</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#91;</span>02<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>\<span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">19</span><span style="color: #339933;">|</span><span style="color: #CC0000;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">?</span>\d\d<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>$<span style="color: #339933;">|</span>
        <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">29</span>\<span style="color: #339933;">/</span><span style="color: #CC0000;">0</span><span style="color: #339933;">?</span><span style="color: #CC0000;">2</span>\<span style="color: #339933;">/</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">19</span><span style="color: #339933;">|</span><span style="color: #CC0000;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">?</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">48</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">|</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">2468</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>048<span style="color: #009900;">&#93;</span><span style="color: #339933;">|</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">13579</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">26</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">|</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">?</span>00<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>$<span style="color: #339933;">/;</span>
&nbsp;
 resultado <span style="color: #339933;">=</span> regex.<span style="color: #660066;">exec</span><span style="color: #009900;">&#40;</span>element.<span style="color: #660066;">value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>resultado<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   fica_errado<span style="color: #009900;">&#40;</span>element<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
 <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
   fica_certo<span style="color: #009900;">&#40;</span>element<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #006600; font-style: italic;">//fim da função</span></pre></div></div>

<p>Sendo que <code>fica_certo()</code> e <code>fica_errado()</code> são funções que avisam o usuário de que a data está válida ou inválida, respectivamente. Essa função pode ser usada no evento <code>onkeyup</code> de um <code>input type=text</code>, por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;input onkeyup=&quot;valida_data(this);&quot; type=&quot;text&quot; /&gt;</pre></div></div>

<p>E pronto! Se quiser, <a href="http://exemplos.codigocomcafe.com/regex-js-date-validator.html">veja um exemplo aqui</a>. Como ERs podem ser aplicadas em várias linguagens de programação, você pode reaproveitá-la, provavelmente mudando apenas os escapes de caracteres. Fica aí a dica.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigocomcafe.com/2009/08/validando-datas-com-javascript-e-regex/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>URLs Amigáveis com o módulo Rewrite</title>
		<link>http://www.codigocomcafe.com/2009/08/urls-amigaveis-com-o-modulo-rewrite/</link>
		<comments>http://www.codigocomcafe.com/2009/08/urls-amigaveis-com-o-modulo-rewrite/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 16:37:00 +0000</pubDate>
		<dc:creator>George Marques</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[servidores]]></category>

		<guid isPermaLink="false">http://www.codigocomcafe.com/index.php/2009/08/11/urls-amigaveis-com-o-modulo-rewrite/</guid>
		<description><![CDATA[Hoje em dia o a utilização de SEO é muito importante. Ainda mais com essa nova briga de motores de busca. E uma das dicas para melhorar a visibilidade é usar URLs que descrevam a página, em vez de códigos sem sentido. E isso também ajuda os visitantes. Você pode até pensar: &#8220;Se eu fizer [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Hoje em dia o a utilização de <a href="http://en.wikipedia.org/wiki/Search_engine_optimization">SEO</a> é muito importante. Ainda mais com essa nova briga de motores de busca. E uma das dicas para melhorar a visibilidade é usar URLs que descrevam a página, em vez de códigos sem sentido. E isso também ajuda os visitantes. Você pode até pensar: &#8220;Se eu fizer isso, não posso mais usar os scripts de servidor&#8221;, mas isso está completamente errado. É aí que entra o módulo Rewrite do Apache.</p>
<p style="text-align: justify;">
O módulo Rewrite reescreve uma URL baseado nos parâmetros que você definir. Assim, um link do tipo <em>http://www.exemplo.com/noticia/1234</em> pode ser transformado em<em> http://www.exemplo.com/noticias.php?id=1234</em> permitindo o uso de <span style="font-style: italic;">scripts</span> personalizados.</p>
<p><span id="more-4"></span></p>
<p>Vamos ao lado prático da questão. Primeiro, temos que saber se o <code>mod_rewrite</code> está ativado no servidor. Para isso, basta dar uma olhada no phpinfo().</p>
<p><img class="size-full wp-image-35" title="phpinfo" src="http://www.codigocomcafe.com/wp-content/uploads/2009/08/phpinfo.png" alt="mod_rewrite se encontra na lista" width="619" height="317" /></p>
<p>Caso não consiga encontrar, outra alternativa é usar o seguinte script:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">in_array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;mod_rewrite&quot;</span><span style="color: #339933;">,</span><span style="color: #990000;">apache_get_modules</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Parabéns, o Módulo Rewrite está habilitado!&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Sinto muito, mas o Módulo Rewrite não foi habilitado :(&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Se o servidor é seu (e você está usando linux) pode usar o comando</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># a2enmod rewrite</span></pre></div></div>

<p>para habilitar o módulo.</p>
<p>Para criar uma regra de redirecionamento, você precisa alterar o arquivo .htaccess na raiz do seu site ou em qualquer pasta que deseje utilizar o recurso. Caso o tal arquivo não exista, você podera criá-lo. É possível que o servidor impeça a utilização desse arquivo, mas em geral ele é permitido. Enfim, adicione as seguintes linhas no arquivo .htaccess:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">RewriteEngine</span> <span style="color: #0000ff;">On</span>
<span style="color: #00007f;">RewriteCond</span> %{SCRIPT_FILENAME} !-f
<span style="color: #00007f;">RewriteCond</span> %{SCRIPT_FILENAME} !-d
<span style="color: #00007f;">RewriteRule</span> ^(.*)$ <span style="color: #00007f;">script</span>.php?redir=$<span style="color: #ff0000;">1</span></pre></div></div>

<p>A primeira linha habilita o módulo Rewrite no diretório em questão. A segunda evita que a regra se aplique a arquivos que existam fisicamente. A terceira é idêntica à segunda, mas diz respeito aos diretórios ao invés de arquivos. E a última é a regra propriamente dita, que redireciona qualquer texto após o diretório do .htaccess para script.php, enviando o texto na variável <code>redir</code>. Assim, uma URL <em>http://www.exemplo.com/noticia/1234</em> será enviado para <em>http://www.exemplo.com/script.php?redir=noticia/1234</em>. Lembrando que isso não é um &#8220;redirecionamento&#8221; e sim uma renomeação de URL, os navegadores e motores de busca abrem a página como se ela estivesse fisicamente em <em>http://www.exemplo.com/noticia/1234</em>.</p>
<p>Outro exemplo é o caso de alteração de domínio. Caso você mude do <em>www.exemplo.provedor.com</em> para <em>www.exemplo.com</em>, você poderia criar um <em>script</em> no <code>index.php</code> do tipo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;HTTP/1.1 301 Moved Permanently&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;location:http://www.exemplo.com&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Isso é válido, mas se alguem acessar a URL <em>http://www.exemplo.provedor.com/noticia/1234</em> simplesmente receberia um erro 404 de página não encontrada. Para evitar isso, usa-se o módulo Rewrite, usando a seguinte regra no .htaccess:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">RewriteEngine</span> <span style="color: #0000ff;">On</span>
<span style="color: #00007f;">RewriteRule</span> (.*) http://www.exemplo.com/$<span style="color: #ff0000;">1</span> [R=<span style="color: #ff0000;">301</span>,L]</pre></div></div>

<p>Essa regra envia, por exemplo, a URL <em>http://www.exemplo.provedor.com/noticia/1234</em> para <em>http://www.exemplo.com/noticia/1234</em>, ainda enviando o código 301 de redirecionamento permanente, informando aos navegadores, caches e mecanismos de busca, que este site mudou de endereço.</p>
<p>Mais informações sobre o módulo Rewrite pode ser encontrado na documentação do Apache em <a href="http://httpd.apache.org/docs/2.2/rewrite">http://httpd.apache.org/docs/2.2/rewrite</a>.</p>
<p><span style="font-size:75%;">Fontes:</p>
<ol style="font-size:65%;">
<li><a href="http://www.clubepc.org/urls-amigaveis-com-mod_rewrite-16-11-2007">Clube PC &#8211; Ativando o mod_rewrite</a>.</li>
<li><a href="http://www.gdhpress.com.br/servidores/leia/index.php?p=cap6-27">Servidores Linux, Guia Prático: mod_rewrite</a>.</li>
</ol>
<p></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigocomcafe.com/2009/08/urls-amigaveis-com-o-modulo-rewrite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Código com Café</title>
		<link>http://www.codigocomcafe.com/2009/08/codigo-com-cafe/</link>
		<comments>http://www.codigocomcafe.com/2009/08/codigo-com-cafe/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 03:00:00 +0000</pubDate>
		<dc:creator>George Marques</dc:creator>
				<category><![CDATA[café]]></category>

		<guid isPermaLink="false">http://www.codigocomcafe.com/index.php/2009/08/11/codigo-com-cafe/</guid>
		<description><![CDATA[
Código sempre combina com café, não é à toa que temos o Java. Então, escolhi este nome para o blog que criei para compartilhar meus conhecimentos na área de programação.
O conteúdo do blog dependerá principalemente da linguagem (ou linguagens) que eu estiver estudando atualmente.
Além de código de fato, novidades na área e outras curiosidades podem [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align: justify;">
<p>Código sempre combina com café, não é à toa que temos o Java. Então, escolhi este nome para o blog que criei para compartilhar meus conhecimentos na área de programação.</p>
<p>O conteúdo do blog dependerá principalemente da linguagem (ou linguagens) que eu estiver estudando atualmente.</p>
<p>Além de código de fato, novidades na área e outras curiosidades podem também estarem presentes.</p>
<p>Desejo um bom café para você, assine o feed e me diga o que  acho nos comentários.</p>
<p>Até mais!</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.codigocomcafe.com/2009/08/codigo-com-cafe/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
