<?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>Felipe Ribeiro &#187; desenvolvimento de software</title>
	<atom:link href="http://blog.feliperibeiro.com/category/desenvolvimento-de-software/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.feliperibeiro.com</link>
	<description>My hacks, slides and random stuff</description>
	<lastBuildDate>Fri, 05 Mar 2010 19:04:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Entendendo a ideia por trás do HTML5 e a morte do XHTML2</title>
		<link>http://blog.feliperibeiro.com/2009/08/entendendo-a-ideia-por-tras-do-html5-e-a-morte-do-xhtml2.html</link>
		<comments>http://blog.feliperibeiro.com/2009/08/entendendo-a-ideia-por-tras-do-html5-e-a-morte-do-xhtml2.html#comments</comments>
		<pubDate>Sat, 01 Aug 2009 14:40:48 +0000</pubDate>
		<dc:creator>Felipe Ribeiro</dc:creator>
				<category><![CDATA[browsers]]></category>
		<category><![CDATA[desenvolvimento de software]]></category>
		<category><![CDATA[web 2.0]]></category>
		<category><![CDATA[webdesign]]></category>
		<category><![CDATA[comics]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[web2.0]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://blog.feliperibeiro.com/?p=246</guid>
		<description><![CDATA[Uma explicação simples dos conceitos utilizados pelo HTML, XHTML e os motivos para o abandono ao padrão XHTML2 e o total foco no HTML5: Fonte: http://www.smashingmagazine.com/2009/07/29/misunderstanding-markup-xhtml-2-comic-strip/]]></description>
			<content:encoded><![CDATA[<p>Uma explicação simples dos conceitos utilizados pelo HTML, XHTML e os motivos para o abandono ao padrão XHTML2 e o total foco no HTML5:</p>
<div align="center"><img class="aligncenter" src="http://feliperibeiro.com/imagens/comic-960px.jpg" alt="" /></div>
<p>Fonte: <a href="http://www.smashingmagazine.com/2009/07/29/misunderstanding-markup-xhtml-2-comic-strip&lt;/a&gt;/">http://www.smashingmagazine.com/2009/07/29/misunderstanding-markup-xhtml-2-comic-strip/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.feliperibeiro.com/2009/08/entendendo-a-ideia-por-tras-do-html5-e-a-morte-do-xhtml2.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Selling software is a hard job</title>
		<link>http://blog.feliperibeiro.com/2009/03/selling-software-is-a-hard-job.html</link>
		<comments>http://blog.feliperibeiro.com/2009/03/selling-software-is-a-hard-job.html#comments</comments>
		<pubDate>Sun, 15 Mar 2009 05:44:52 +0000</pubDate>
		<dc:creator>Felipe Ribeiro</dc:creator>
				<category><![CDATA[desenvolvimento de software]]></category>
		<category><![CDATA[funny]]></category>
		<category><![CDATA[geeky]]></category>
		<category><![CDATA[web 2.0]]></category>
		<category><![CDATA[comics]]></category>

		<guid isPermaLink="false">http://blog.feliperibeiro.com/?p=229</guid>
		<description><![CDATA[Mais uma excelente tirinha do Geek and Poke: Muitas outras estão disponíveis em: http://geekandpoke.typepad.com]]></description>
			<content:encoded><![CDATA[<p>Mais uma excelente tirinha do Geek and Poke:</p>
<div align='center'>
<img class="aligncenter size-full wp-image-231" title="6a00d8341d3df553ef011168ca571b970cjpg" src="http://blog.feliperibeiro.com/wp-content/uploads/2009/03/6a00d8341d3df553ef011168ca571b970cjpg.jpeg" alt="6a00d8341d3df553ef011168ca571b970cjpg" width="400" height="566" />
</div>
<p>Muitas outras estão disponíveis em: <a href="http://geekandpoke.typepad.com">http://geekandpoke.typepad.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.feliperibeiro.com/2009/03/selling-software-is-a-hard-job.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oportunidade &#8211; Programador de Interfaces</title>
		<link>http://blog.feliperibeiro.com/2008/10/oportunidade-programador-de-interfaces.html</link>
		<comments>http://blog.feliperibeiro.com/2008/10/oportunidade-programador-de-interfaces.html#comments</comments>
		<pubDate>Fri, 24 Oct 2008 19:15:27 +0000</pubDate>
		<dc:creator>Felipe Ribeiro</dc:creator>
				<category><![CDATA[desenvolvimento de software]]></category>
		<category><![CDATA[emprego]]></category>
		<category><![CDATA[oportunidade]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[vaga]]></category>

		<guid isPermaLink="false">http://blog.feliperibeiro.com/?p=144</guid>
		<description><![CDATA[A startup que trabalho (shoprizer.com) tem uma equipe formada por Jedis (onde eu sou o Mestre Yoda ), que trabalham com PHP Hardcore e está precisando agora de um NINJA, um programador de interfaces, para trabalho remoto. Os requisitos são: XHTML, CSS, Web standards Javascript/AJAX PHP básico/intermediário &#8211; só o necessário para a integração da [...]]]></description>
			<content:encoded><![CDATA[<p>A startup que trabalho (shoprizer.com) tem uma equipe formada por Jedis (onde eu sou o Mestre Yoda <img src='http://blog.feliperibeiro.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> ), que trabalham com PHP Hardcore e está precisando agora de um NINJA, um programador de interfaces, para trabalho remoto.  Os requisitos são:</p>
<ul>
<li>XHTML, CSS, Web standards</li>
<li>Javascript/AJAX</li>
<li>PHP básico/intermediário &#8211; só o necessário para a integração da lógica existente com a interface a ser feita.</li>
<li>Smarty</li>
<li>Disponibilidade de 20 horas semanais &#8211; flexíveis.</li>
<li>Inglês básico para leitura e escrita</li>
<li>Conhecimento de princípios de Usabilidade</li>
<li>Precisa ter o espírito de startup!</li>
</ul>
<p>Se você está interessado, mande seu CV com links do seu portfolio para van2br@yahoo.com, atenção à Vanessa.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.feliperibeiro.com/2008/10/oportunidade-programador-de-interfaces.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Review e slides do CONAPHP</title>
		<link>http://blog.feliperibeiro.com/2008/10/review-e-slides-do-conaphp.html</link>
		<comments>http://blog.feliperibeiro.com/2008/10/review-e-slides-do-conaphp.html#comments</comments>
		<pubDate>Wed, 22 Oct 2008 12:59:19 +0000</pubDate>
		<dc:creator>Felipe Ribeiro</dc:creator>
				<category><![CDATA[desenvolvimento de software]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[slides]]></category>
		<category><![CDATA[web 2.0]]></category>
		<category><![CDATA[web services]]></category>

		<guid isPermaLink="false">http://blog.feliperibeiro.com/?p=140</guid>
		<description><![CDATA[No último fim de semana (18 e 19 de outubro) houve em São Paulo o CONAPHP (www.conaphp.com.br), um evento feito pela comunidade PHP e que rolou dentro do CONISLI na FIAP. O evento em geral foi bom, com bom nível de palestras mas o público foi um pouco abaixo do que eu esperava. Para mim, [...]]]></description>
			<content:encoded><![CDATA[<p>No último fim de semana (18 e 19 de outubro) houve em São Paulo o CONAPHP (www.conaphp.com.br), um evento feito pela comunidade PHP e que rolou dentro do CONISLI na FIAP.</p>
<p>O evento em geral foi bom, com bom nível de palestras mas o público foi um pouco abaixo do que eu esperava.</p>
<p>Para mim, o ponto alto foi quando estava assistindo a palestra do <a href="http://eltonminetto.net">Elton Minetto</a> (slides <a href="http://www.eltonminetto.net/apresentacao-no-conaphp.htm">aqui</a>) e &#8220;reconheci&#8221; um slide sobre o compilador JIT e o cache do opcode do PHP, um slide que fazia parte da apresentação que fiz em Recife no Encontro Pernambucano de SL, e para confirmar vi lá meu <a href="http://blog.feliperibeiro.com/2008/04/slides-da-palestra-php-para-desenvolvimento-de-aplicacoes-de-grande-porte.html">link</a> nas referências, e isso me deixou bastante honrado por ter um material meu usado como referência por um ícone como o Elton.</p>
<p>A minha palestra foi a última e falei sobre PHP RESTful Web Services, por ser a última, o título não ser apelativo para o pessoal mais iniciante e eu ser um ilustre desconhecido da comunidade PHP de São Paulo, tive apenas metade da sala cheia, mas o feedback das pessoas que assitiram a palestra foi bastante positivo e fiquei muito satisfeito.</p>
<p>Os slides da palestra seguem abaixo, e o código apresentado está disponível <a href="http://feliperibeiro.com/downloads/REST.zip">aqui</a>.</p>
<div id="__ss_681936" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="PHP RESTful Web Services" href="http://www.slideshare.net/felipernb/php-restful-web-services-presentation?type=powerpoint">PHP RESTful Web Services</a><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=php-restful-ws-1224677129708039-8&amp;stripped_title=php-restful-web-services-presentation" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slideshare.net/swf/ssplayer2.swf?doc=php-restful-ws-1224677129708039-8&amp;stripped_title=php-restful-web-services-presentation" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View SlideShare <a style="text-decoration:underline;" title="View PHP RESTful Web Services on SlideShare" href="http://www.slideshare.net/felipernb/php-restful-web-services-presentation?type=powerpoint">presentation</a> or <a style="text-decoration:underline;" href="http://www.slideshare.net/upload?type=powerpoint">Upload</a> your own. (tags: <a style="text-decoration:underline;" href="http://slideshare.net/tag/php">php</a> <a style="text-decoration:underline;" href="http://slideshare.net/tag/rest">rest</a>)</div>
</div>
<p>Quem tiver interesse sobre o assunto, deixo algumas referências:</p>
<ul>
<li><a href="http://www.sematopia.com/?p=153">http://www.sematopia.com/?p=153</a></li>
<li><a href="http://www.lornajane.net/posts/2008/Using-curl-and-PHP-to-talk-to-a-REST-service">http://www.lornajane.net/posts/2008/Using-curl-and-PHP-to-talk-to-a-REST-service</a></li>
<li><a href="http://www.lornajane.net/posts/2008/PHP-Rest-Server-part-1-of-3">http://www.lornajane.net/posts/2008/PHP-Rest-Server-part-1-of-3</a></li>
<li><a href="http://www.lornajane.net/posts/2008/PHP-Rest-Server-part-2-of-3">http://www.lornajane.net/posts/2008/PHP-Rest-Server-part-2-of-3</a></li>
<li><a href="http://www.lornajane.net/posts/2008/PHP-Rest-Server-part-3">http://www.lornajane.net/posts/2008/PHP-Rest-Server-part-3</a></li>
<li><a href="http://rest.blueoxen.net/cgi-bin/wiki.pl?FrontPage">http://rest.blueoxen.net/cgi-bin/wiki.pl?FrontPage</a></li>
<li><a href="http://wiki.developer.mindtouch.com/REST/REST_for_the_Rest_of_Us">http://wiki.developer.mindtouch.com/REST/REST_for_the_Rest_of_Us</a></li>
<li><a href="http://www.xfront.com/REST-Web-Services.html">http://www.xfront.com/REST-Web-Services.html</a></li>
<li><a href="http://tomayko.com/writings/rest-to-my-wife">http://tomayko.com/writings/rest-to-my-wife</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.feliperibeiro.com/2008/10/review-e-slides-do-conaphp.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Algoritmo de &#8220;Você quis dizer&#8221;</title>
		<link>http://blog.feliperibeiro.com/2008/10/algoritmo-de-voce-quis-dizer.html</link>
		<comments>http://blog.feliperibeiro.com/2008/10/algoritmo-de-voce-quis-dizer.html#comments</comments>
		<pubDate>Wed, 08 Oct 2008 17:09:44 +0000</pubDate>
		<dc:creator>Felipe Ribeiro</dc:creator>
				<category><![CDATA[apache]]></category>
		<category><![CDATA[desenvolvimento de software]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web 2.0]]></category>
		<category><![CDATA[algoritmo]]></category>
		<category><![CDATA[busca]]></category>

		<guid isPermaLink="false">http://blog.feliperibeiro.com/?p=126</guid>
		<description><![CDATA[Recentemente precisei implementar um sistema de correção ortográfica à la Google. Pesquisei bastante sobre como fazer isso, e encontrei duas maneiras que explicarei agora, mas antes disso explicarei algo que é comum às duas: A criação do dicionário Para criar o dicionário, você precisa ter uma base de palavras, que idealmente é um arquivo txt. [...]]]></description>
			<content:encoded><![CDATA[<p>Recentemente precisei implementar um sistema de correção ortográfica à la Google.</p>
<p>Pesquisei bastante sobre como fazer isso, e encontrei duas maneiras que explicarei agora, mas antes disso explicarei algo que é comum às duas: <strong>A criação do dicionário</strong></p>
<p>Para criar o dicionário, você precisa ter uma base de palavras, que idealmente é um arquivo txt.</p>
<p>Você lê o arquivo e cria um array onde as palavras são as chaves e as frequências com que aparecem nos textos serão os valores.</p>
<pre name='code' class='php'>
&lt;?php
$text = file_get_contents('arquivo.txt');
preg_match_all("/[a-z]+/",strtolower($text),$matches);
$palavras = $matches[0];
$dicionario = array();
foreach($palavras as $palavra)
	$dicionario[$palavra] += 1;
sort($dicionario); /* Essa ordenação será útil para otimização de performance
                               no primeiro algoritmo */
file_put_contents('dicionario_serializado.dat',serialize($dicionario));
?&gt;
</pre>
<p>1 &#8211; Algoritmo de Levenshtein</p>
<p>PHP implementa nativamente o algoritmo de Levenshtein (<a href="http://php.net/levenshtein">http://php.net/levenshtein</a>), que calcula a distância de edição entre duas palavras, funcionando da seguinte forma:</p>
<ul>
<li>suponha que eu tenha duas palavras: água e mágua &#8211;  A distância de edição delas é de uma inserção de carácter</li>
<li>suponha que eu tenha as palavras: casa e caixa &#8211; A distância delas é de uma substituição (s por i) e uma inserção (x)</li>
<li>suponha que eu tenha as palavras: arrocho e arroto &#8211; A distância delas é de uma substituição e uma remoção.</li>
</ul>
<p>A função levenshtein também permite que você dê pesos diferenciados para inserção/remoção/substituição, sendo que o valor default é 1 para todas operações. Usando essa função, fica simples implementar um corretor, supondo que você tem um dicionário que já citei, você só precisa fazer:</p>
<pre name='code' class='php'>
&lt;?php
function voce_quis_dizer($palavra_procurada) {
	$dicionario = unserialize(file_get_contents(‘dicionario_serializado.dat’));
	$minima_distancia = -1;
	$palavra_procurada = strtolower($palavra_procurada);
	foreach($dicionario as $palavra_do_dicionario) {
		if($palavra_procurada == $palavra_do_dicionario) return $palavra;
		$distancia = levenshtein($palavra_procurada,$palavra_do_dicionario);
		if($distancia < $minima_distancia || $minima_distancia == -1) {
			$minima_distancia = $distancia;
			$sugestao = $palavra_do_dicionario;
		}
	}
return $sugestao;
}
?&gt;
</pre>
<p>Análise de desempenho:</p>
<p>Considerando que temos <strong>k</strong> palavras no dicionário, a palavra que desejamos procurar tem <strong>m</strong> letras e cada palavra do dicionário tem em média <strong>n</strong> letras, o algoritmo de Levenshtein tem ordem de complexidade <strong>O(m*n)</strong> onde para <strong>k</strong> comparações (no caso da palavra <strong>não</strong> existir no dicionário, já que se ela existir não teremos nenhuma comparação) teremos <strong>O(k*m*n)</strong> (<strong>k*m*n</strong> operações onde <strong>k</strong> é muito maior que <strong>m</strong> e <strong>n</strong>).</p>
<p>2 - Algoritmo de Peter Norvig</p>
<p>Toda explicação probabilística desse algorítmo está presente no site do Norvig, um cara renomado na área de inteligência artificial: <a href="http://norvig.com/spell-correct.html">http://norvig.com/spell-correct.html</a>. Mas basicamente esse algoritmo apesar de mais complicado é bem mais inteligente que o primeiro. O que ele faz é o seguinte: gera perturbações na sua palavra procurada e vê quais dessas perturbações é a mais relevante no dicionário. Evitando comparações desnecessárias, já que no primeiro algoritmo cada palavra que você colocar será comparada com todas as outras (por exemplo: se você digitar BOLA, e ela não existir no dicionário ela será comparada com palavras absurdas como: LIVRO, que obviamente não é o que você quis dizer).</p>
<p>Apesar do conceito do Norvig ser simples, o código é um pouquinho complicado. Então eu criei uma classe que implementa ele e disponibilizei sob Licença BSD no PHPClasses.org (<a href="http://www.phpclasses.org/browse/file/24605.html">http://www.phpclasses.org/browse/file/24605.html</a>) e tenho recebido elogios e feedback muito positivo de quem está usando.</p>
<p>Análise de desempenho:</p>
<p>Considerando <strong>26</strong> letras do alfabeto (depois da reforma da língua portuguesa, agora também temos 26 letras! <img src='http://blog.feliperibeiro.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ) e considerando que sua palavra tem <strong>m</strong> letras, teremos mais ou menos 26*m iterações para gerar as possíveis perturbações na palavra (inserções, remoções e substituições possíveis), e para garantir um segundo nível de perturbações teremos aproximadamente <strong>26*m</strong> para cada perturbação gerada, que dá um total de aproximadamente (26*m)*(26*m) = 676 m². Agora só precisamos consultar cada uma das perturbações para vermos qual a mais relevante no dicionário. Cada consulta no dicionário é <strong>O(1)</strong> então desprezaremos na análise de performance.</p>
<p>E podemos considerar esse algoritmo como sendo mais eficiente do que o primeiro pois o tempo de execução cresce de acordo com o quadrado do tamanho da palavra (que normalmente é bem menor do que o tamanho do dicionário). Enquanto o primeiro sofre interferência do tamanho do dicionário e do tamanho médio das palavras contidas lá, então esse é bem mais inteligente e eficiente.</p>
<p>Espero ter ajudado!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.feliperibeiro.com/2008/10/algoritmo-de-voce-quis-dizer.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Hug a developer!</title>
		<link>http://blog.feliperibeiro.com/2008/08/hug-a-developer.html</link>
		<comments>http://blog.feliperibeiro.com/2008/08/hug-a-developer.html#comments</comments>
		<pubDate>Thu, 28 Aug 2008 17:19:11 +0000</pubDate>
		<dc:creator>Felipe Ribeiro</dc:creator>
				<category><![CDATA[desenvolvimento de software]]></category>
		<category><![CDATA[funny]]></category>
		<category><![CDATA[geeky]]></category>

		<guid isPermaLink="false">http://blog.feliperibeiro.com/?p=108</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><embed src="http://blip.tv/play/gYwjwZJqjdEh" type="application/x-shockwave-flash" width="460" height="280" allowscriptaccess="always" allowfullscreen="true"></embed> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.feliperibeiro.com/2008/08/hug-a-developer.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Computação em nuvem – a nova tendência do mundo digital.</title>
		<link>http://blog.feliperibeiro.com/2008/05/computacao-em-nuvem-%e2%80%93-a-nova-tendencia-do-mundo-digital.html</link>
		<comments>http://blog.feliperibeiro.com/2008/05/computacao-em-nuvem-%e2%80%93-a-nova-tendencia-do-mundo-digital.html#comments</comments>
		<pubDate>Mon, 26 May 2008 14:31:41 +0000</pubDate>
		<dc:creator>Felipe Ribeiro</dc:creator>
				<category><![CDATA[desenvolvimento de software]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://blog.feliperibeiro.com/?p=93</guid>
		<description><![CDATA[O nome soa estranho, mas computação em nuvem é a tradução do termo “Cloud Computing” que vem rondando o vale do Silício há algum tempo e é um conceito que assusta gigantes do mundo do PC como a Microsoft e abre espaço para milhões de pequenas empresas na Web – as startups. A idéia da [...]]]></description>
			<content:encoded><![CDATA[<p>O nome soa estranho, mas computação em nuvem é a tradução do termo “Cloud Computing” que vem rondando o vale do Silício há algum tempo e é um conceito que assusta gigantes do mundo do PC como a Microsoft e abre espaço para milhões de pequenas empresas na Web – as <em><strong>startups.</strong></em></p>
<p>A idéia da computação em nuvem apresenta uma nova maneira de organização do mundo digital, que deixa de ser <strong>“PCcêntrico”</strong> e passa a ser <strong>“WEBcêntrico”</strong>, já que a tal nuvem é a própria Web, com os softwares deixando de ser produtos e se tornando serviços.</p>
<p>Dessa maneira, seus dados, documentos e ferramentas estariam hospedados em grandes servidores na Web e você acessaria tudo através do navegador, que seria uma espécie de cliente universal e assim você teria acesso aos seus arquivos a partir de qualquer computador no mundo e também exigiria menos dos PCs o que possibilitaria a produção de máquinas ainda mais baratas.</p>
<p>E o software como serviço abole de vez com as licenças e softwares de prateleira, pois você não precisa mais instalar nada, apenas paga-se uma taxa para usar um serviço online por um determinado tempo e no caso de serviços gratuitos, alguém está pagando para você: OS ANUNCIANTES.</p>
<p>Isso já vem acontecendo aos poucos com a oferta de serviços na Web de suítes de escritório e ferramentas de edição de imagem, entre outros e a tendência é que nas máquinas só estejam instalados softwares básicos.</p>
<p><strong>Mas por quê a Microsoft deve se preocupar?</strong></p>
<p><strong></strong>A política da Microsoft de vender software na caixinha fica obsoleta com essa novidade, e os usuários costumavam optar pelos MS Windows pelo enorme leque de opções de softwares compatível com ele. Porém se a idéia da computação em nuvem se concretizar, as aplicações se tornam independentes de plataforma e qualquer pessoa em qualquer sistema operacional que tenha um browser que implemente razoavelmente os padrões web W3C, como o excelente Mozilla Firefox, poderá ter acesso às tais aplicações, e essa é mais uma chance que o Linux tem de decolar.</p>
<p><strong>E o que ainda falta?</strong></p>
<p>Na minha humilde opinião ainda existe um <em>gap</em> que precisa ser considerado: o gargalo da rede. As aplicações Web estão conseguindo um nível de responsividade muito alto, mas para se equiparar aos potentes computadores modernos rodando aplicações stand-alone ainda há um caminho árduo a ser percorrido e não acho que seja algo que é feito da noite para o dia, mas sim algo gradual e relativamente lento, como realmente vem acontecendo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.feliperibeiro.com/2008/05/computacao-em-nuvem-%e2%80%93-a-nova-tendencia-do-mundo-digital.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cheat sheets</title>
		<link>http://blog.feliperibeiro.com/2008/02/cheat-sheets.html</link>
		<comments>http://blog.feliperibeiro.com/2008/02/cheat-sheets.html#comments</comments>
		<pubDate>Sat, 16 Feb 2008 21:54:00 +0000</pubDate>
		<dc:creator>Felipe Ribeiro</dc:creator>
				<category><![CDATA[apache]]></category>
		<category><![CDATA[desenvolvimento de software]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.feliperibeiro.com/blog/?p=79</guid>
		<description><![CDATA[&#8220;Quem cola não sai da escola&#8221;, é o ditado que a gente escuta no colégio, mas Cheat sheets e guias de bolso realmente são muito úteis quando você quer o nome daquela funçãozinha que faz exatamente o que você quer e você não lembra no momento, para consultas rápidas e não pra quem quer realmente [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Quem cola não sai da escola&#8221;, é o ditado que a gente escuta no colégio, mas Cheat sheets e guias de bolso realmente são muito úteis quando você quer o nome daquela funçãozinha que faz exatamente o que você quer e você não lembra no momento, para consultas rápidas e não pra quem quer realmente aprender algo.<br />
Achei algumas bem interessantes e vou compartilhar aqui até para facilitar de me lembrar depois (uma Cheat sheet de cheat sheets <img src='http://blog.feliperibeiro.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ):</p>
<ul>
<li><a href="http://ruby.cenophobie.com/RubyCheat.pdf">Ruby Cheat sheet</a></li>
<li><a href="http://www.scottklarr.com/topic/107/apache-cheat-sheets/">Apache Cheat sheets</a></li>
<li><a href="http://www.scottklarr.com/topic/102/mysql-cheat-sheets/">MySQL Cheat sheets</a></li>
<li><a href="http://www.scottklarr.com/topic/100/php-cheat-sheets/">PHP Cheat sheets</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.feliperibeiro.com/2008/02/cheat-sheets.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Browsershots.org &#8211; Teste seu site em vários browsers</title>
		<link>http://blog.feliperibeiro.com/2008/01/browsershotsorg-teste-seu-site-em-varios-browsers.html</link>
		<comments>http://blog.feliperibeiro.com/2008/01/browsershotsorg-teste-seu-site-em-varios-browsers.html#comments</comments>
		<pubDate>Fri, 01 Feb 2008 02:38:00 +0000</pubDate>
		<dc:creator>Felipe Ribeiro</dc:creator>
				<category><![CDATA[browsers]]></category>
		<category><![CDATA[desenvolvimento de software]]></category>
		<category><![CDATA[web 2.0]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://www.feliperibeiro.com/blog/?p=78</guid>
		<description><![CDATA[A dica do dia é: http://browsershots.org, um site onde você pode obter o screenshot do seu site nos mais diversos browsers em diferentes versões e SO&#8217;s. Realmente muito bacana! Update: E para pegar um shot da pagina completa, tem esse serviço web bem bacana]]></description>
			<content:encoded><![CDATA[<p>A dica do dia é: <a href="http://browsershots.org/">http://browsershots.org</a>, um site onde você pode obter o screenshot do seu site nos mais diversos browsers em diferentes versões e SO&#8217;s. Realmente muito bacana!</p>
<p>Update: E para pegar um shot da pagina completa, tem <a href="http://www.superscreenshot.com/">esse</a> serviço web bem bacana</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.feliperibeiro.com/2008/01/browsershotsorg-teste-seu-site-em-varios-browsers.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O Mantra das REGEX &#8211; As 8 Expressões Regulares que precisamos saber.</title>
		<link>http://blog.feliperibeiro.com/2008/01/o-mantra-das-regex-as-8-expressoes-regulares-que-precisamos-saber.html</link>
		<comments>http://blog.feliperibeiro.com/2008/01/o-mantra-das-regex-as-8-expressoes-regulares-que-precisamos-saber.html#comments</comments>
		<pubDate>Wed, 30 Jan 2008 03:15:00 +0000</pubDate>
		<dc:creator>Felipe Ribeiro</dc:creator>
				<category><![CDATA[apache]]></category>
		<category><![CDATA[desenvolvimento de software]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[regex]]></category>

		<guid isPermaLink="false">http://www.feliperibeiro.com/blog/?p=77</guid>
		<description><![CDATA[Você tem medo de REGEX!? Eu também! Nos últimos tempos tenho lidado bastante com REGEX editando regras do Apache mod_rewrite e com a classe que publiquei no PHPClasses, a SiteMapGenerator Tabajara, que se propõe a gerar um mapa do site em xml no padrão estabelecido pelo Google para melhorar a indexação. Mas depois de tirar [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://feliperibeiro.com/imagens/fts-regex-front.jpg" alt="Regex" align="left" border="1" hspace="4" vspace="1" />Você tem <strong>medo</strong> de REGEX!? Eu também!</p>
<p>Nos últimos tempos tenho lidado bastante com REGEX editando regras do Apache mod_rewrite e com a classe que publiquei no PHPClasses, a <a href="http://www.phpclasses.org/browse/package/4305.html">SiteMapGenerator</a> <s>Tabajara</s>, que se propõe a gerar um mapa do site em xml no padrão estabelecido pelo Google para melhorar a indexação.</p>
<p>Mas depois de tirar onda da galera do Perl no post anterior, vou exaltar a importância que expressões regulares têm nas nossas validações, e para isso vou citar as 8 expressões regulares que todo programador Web deveria saber (exemplos em PHP, mas são válidos para qualquer linguagem com suporte a PCRE).</p>
<h4>Validação de nomes de usuário</h4>
<p>4 a 28 caracteres alfanuméricos e underscores:</p>
<p><code><br />
$string = "userNaME4234432_";<br />
if (preg_match('/^[a-z\d_]{4,28}$/i', $string)) {<br />
echo "exemplo 1 ok.";<br />
}<br />
</code></p>
<h4>Validação de números de telefone</h4>
<p><strong>(##) ####-####</strong> ou <strong>##-####-####</strong><br />
<code><br />
$string = "(32) 5555-5555";<br />
if (preg_match('/^(\(?[0-9]{2}\)?|[-. ]?)[ ][0-9]{4}[-. ]?[0-9]{4}$/', $string)) {<br />
echo "exemplo 2 ok.";<br />
}</code></p>
<p><code></code><span class="Apple-style-span" style="font-family: Courier; font-size: 13px"><br />
</span></p>
<h4>Endereços de e-mail</h4>
<p><strong>foo@bar.foo</strong><br />
<code><br />
$string = "first.last@domain.co.uk";<br />
if (preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.]</code></p>
<p><code>[a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/',<br />
$string)) {<br />
echo "examplo 3 ok.";<br />
}<br />
</code></p>
<h4>CEPs</h4>
<p>#####-### ou ########</p>
<p><code>$string = "55324-432";<br />
if (preg_match('/^[0-9]{5,5}([- ]?[0-9]{4})?$/', $string)) {<br />
echo "exemplo 4 ok.";<br />
}</code></p>
<h4>Endereços IP</h4>
<p><strong>255.255.255.0</strong><br />
<code><br />
$string = "255.255.255.0";<br />
if (preg_match('^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:[.](?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$'</code></p>
<p><code>, $string)) {<br />
echo "exemplo 5 ok.";<br />
}</code></p>
<p><code><br />
</code></p>
<h4>Código de cores RGB em Hexadecimal</h4>
<p><strong>#FFFFFF, #FFF, FFF, FFFFFF</strong></p>
<p><code>$string = "#666666";<br />
if (preg_match('/^#(?:(?:[a-f\d]{3}){1,2})$/i', $string)) {<br />
echo "exemplo 6 ok.";<br />
}<br />
</code></p>
<h4>Comentários de múltiplas linhas</h4>
<p><strong>/* Lorem<br />
Ipsun<br />
dolor*/</strong><br />
<code><br />
$string = "/* commmmment */";<br />
if (preg_match('/^[(/*)+.+(*/)]$/', $string)) {<br />
echo "exemplo 7 ok.";<br />
}<br />
</code></p>
<h4>Datas</h4>
<p><strong>DD/MM/YYYY</strong> ou <strong>MM/DD/YYYY</strong><br />
<code><br />
$string = "30/01/2008";<br />
if (preg_match('/^\d{1,2}\/\d{1,2}\/\d{4}$/', $string)) {<br />
echo "exemplo 8 successful.";<br />
}<br />
</code><br />
Esses exemplos foram retirados do site Devolio[1] , porém algumas expressões eu alterei para ajustar aos padrões brasileiros de telefone e cep. Se por acaso fiz alguma besteira, peço que um <span class="Apple-style-span" style="font-weight: bold">REGEXPERT</span> comente e corrija! E no segundo link[2] um validador de expressões regulares.</p>
<p><a href="http://devolio.com/blog/archives/34-8-Practical-PHP-Regular-Expressions.html">[1] 8 Practical PHP Regular Expressions &#8211; Devolio</a><br />
<a href="http://www.devolio.com/regextester/">[2] Perl Compatible Regular Expression Tester</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.feliperibeiro.com/2008/01/o-mantra-das-regex-as-8-expressoes-regulares-que-precisamos-saber.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
