<?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>Bit a Bit &#187; Rafael Barbolo Lopes</title>
	<atom:link href="http://www.bitabit.eng.br/author/barbolo/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bitabit.eng.br</link>
	<description>O Blog dos estudantes de Engenharia de Computação da POLI-USP</description>
	<lastBuildDate>Tue, 31 Aug 2010 15:16:05 +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>Empresa de hospedagem diz que se o site está no Brasil ele está melhor posicionado no Google</title>
		<link>http://www.bitabit.eng.br/2010/08/24/empresa-de-hospedagem-diz-que-se-o-site-esta-no-brasil-ele-esta-melhor-posicionado-no-google/</link>
		<comments>http://www.bitabit.eng.br/2010/08/24/empresa-de-hospedagem-diz-que-se-o-site-esta-no-brasil-ele-esta-melhor-posicionado-no-google/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 18:04:03 +0000</pubDate>
		<dc:creator>Rafael Barbolo Lopes, Coop10</dc:creator>
				<category><![CDATA[Busca]]></category>
		<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[censura]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[hospedagem]]></category>
		<category><![CDATA[kinghost]]></category>
		<category><![CDATA[servicos]]></category>
		<category><![CDATA[servidor]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=1352</guid>
		<description><![CDATA[Este post é motivado por uma discussão que eu tive na Comunidade Magento Brasil. Até ontem eles abrigavam um artigo que incentivava os usuários a usarem a hospedagem do KingHost. Eu deixei meu comentário nessa discussão e o artigo foi removido.
Eu também deixei meu comentário no blog oficial do KingHost, porém eles não o aprovaram.
Eu [...]]]></description>
			<content:encoded><![CDATA[<p>Este post é motivado por uma discussão que eu tive na <a href="http://www.comunidademagento.com.br/">Comunidade Magento Brasil</a>. Até ontem eles abrigavam um artigo que incentivava os usuários a usarem a hospedagem do <a href="http://www.kinghost.com.br/">KingHost</a>. Eu deixei meu comentário nessa discussão e o artigo foi removido.</p>
<p>Eu também deixei meu <a href="http://blog.kinghost.com.br/2009/07/matt-cuts-comprova-localizacao-do-servidor-faz-diferenca-no-posicionamento-do-seu-site-no-google/">comentário no blog oficial do KingHost</a>, porém eles não o aprovaram.</p>
<p>Eu não quero dizer o que penso sobre essas instituições neste artigo (mesmo porque não conheço elas muito bem), mas gostaria de deixar meu comentário a respeito do assunto registrado aqui, no <a href="http://www.bitabit.eng.br/sobre_o_bit_a_bit/">Bit a Bit</a>, que é um blog aberto e sem censura.</p>
<p>Para vender seus serviços, o KingHost argumenta que a localização de um site influencia o posicionamento do seu site no ranking do Google quando a busca é feita no Brasil. Até aí sem problemas, de fato a geolocalização de um site influencia no resultado da busca. Se você buscar por &#8220;Barbolo&#8221; no <a href="http://www.google.com.br/search?hl=pt-BR&#038;q=barbolo">Google Brasil</a> e no <a href="http://www.google.com/search?hl=en&#038;q=barbolo">Google EUA</a> verá que os resultados divergem bastante.</p>
<p>O que eu não achei correto (moralmente e tecnicamente) foi a conclusão deles:</p>
<p><em><strong>Conclusão, de acordo com palavras do Engenheiro de Software do Google Matt Cuts: Hospedagem no Brasil faz diferença para o teu site ser bem rankeado no Google!</strong></em></p>
<p><br/></p>
<p>Meu comentário:</p>
<p><em><br />
O Google pode usar IPs dos servidores como um dos recursos para adivinhar o país de origem de um site. Além deste recurso, ele também pode usar o domínio, a língua do site, os países de origem dos sites que apontam para ele, entre outros. O IP é possivelmente um dos recursos mais insignificantes.</p>
<p>Além disso, o Google oferece em sua <a href="http://www.google.com/webmasters/">Central de Webmasters</a> a opção de você definir o país de origem do seu site. Ou seja, se você quiser hospedar seu site na Lua, mas o conteúdo dele for em português, ou se ele estiver inserido em contextos brasileiros ou se você se cadastrar na central de webmasters e configurar seu país de origem como Brasil, o local de hospedagem pouco importará no ranking brasileiro do Google.</p>
<p>Eu tenho cerca de 4 servidores contratados fora do país, cerca de 10 domínios gerenciados por mim. Nunca tive problema com o ranking do Google por causa disso.</p>
<p>Existem diversos motivos para se hospedar sites no exterior, com certeza o principal é o preço. Você consegue servidores muito melhores por preços muito menores fora do Brasil. O tempo de resposta desses servidores realmente será maior do que o de um servidor hospedado no Brasil (os pacotes trocados com seu computador vão passar por um caminho maior e por uma quantidade maior de roteadores, ou seja, vão demorar mais para chegar em seus destinos). Mas essa diferença é da ordem de milissegundos, o que significa que para a maioria dos sites será insignificante. Outros fatores como banda, processamento ou memória poderão fazer a real diferença no desempenho do seu site.</em></p>
<p><br/><br/></p>
<p>Também queria aproveitar este post para deixar uma sugestão minha para empresas que entram na Internet:</p>
<p><strong>Se sua empresa está na Internet, com blog, twitter e canais de comunicação, a pior coisa que existe é censurar usuários. Nós ficamos revoltados com isso e perdemos o respeito e consideração por seus serviços.</strong></p>
<p><br/></p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=1352&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2010/08/24/empresa-de-hospedagem-diz-que-se-o-site-esta-no-brasil-ele-esta-melhor-posicionado-no-google/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Explorando o software por trás do Facebook, a maior rede social do mundo</title>
		<link>http://www.bitabit.eng.br/2010/07/28/explorando-o-software-por-tras-do-facebook-a-maior-rede-social-do-mundo/</link>
		<comments>http://www.bitabit.eng.br/2010/07/28/explorando-o-software-por-tras-do-facebook-a-maior-rede-social-do-mundo/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 19:12:39 +0000</pubDate>
		<dc:creator>Rafael Barbolo Lopes, Coop10</dc:creator>
				<category><![CDATA[Busca]]></category>
		<category><![CDATA[Coop10]]></category>
		<category><![CDATA[Cooperativo]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[bigpipe]]></category>
		<category><![CDATA[busca]]></category>
		<category><![CDATA[caches]]></category>
		<category><![CDATA[cassandra]]></category>
		<category><![CDATA[escalabilidade]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[hadoop]]></category>
		<category><![CDATA[haystack]]></category>
		<category><![CDATA[hive]]></category>
		<category><![CDATA[labs]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[MapReduce]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[scribe]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[thrift]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[varnish]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=1263</guid>
		<description><![CDATA[Na escala em que o Facebook opera, muitas abordagens tradicionais para servir conteúdo web falham ou não são práticas. O desafio para os engenheiros do Facebook tem sido manter o site no ar com mais de meio bilhão de usuários ativos.
Este artigo analisa técnicas e softwares que o Facebook usa para funcionar nesse nível.


Facebook: desafio [...]]]></description>
			<content:encoded><![CDATA[<p>Na escala em que o <a href="http://www.facebook.com">Facebook</a> opera, muitas abordagens tradicionais para servir conteúdo web falham ou não são práticas. O desafio para os engenheiros do Facebook tem sido manter o site no ar com mais de <a href="http://blog.facebook.com/blog.php?post=409753352130" target="_blank"><strong>meio bilhão de usuários ativos</strong></a>.</p>
<p>Este artigo analisa técnicas e softwares que o Facebook usa para funcionar nesse nível.</p>
<p><a href="http://www.bitabit.eng.br/wp-content/uploads/2010/07/facebook_logo_bit_a_bit.jpg"><img class="alignright size-full  wp-image-1264" title="Logo do Facebook (Bit a Bit)" src="http://www.bitabit.eng.br/wp-content/uploads/2010/07/facebook_logo_bit_a_bit.jpg" alt="" width="205" height="68" /></a></p>
<p><br/></p>
<h2>Facebook: desafio de escalabilidade</h2>
<p>Antes de entrar em detalhes, aqui estão alguns <a href="http://michaelis.uol.com.br/moderno/portugues/index.php?lingua=portugues-portugues&#038;palavra=fact%F3ide&#038;CP=73594&#038;typeToSearchRadio=exactly&#038;pagRadio=50">factóides</a> para dar uma idéia do desafio de escalabilidade com o qual o Facebook tem que lidar:</p>
<ul>
<li>
<p>O Facebook serve mais de <a href="https://www.google.com/adplanner/planning/site_profile#siteDetails?identifier=www.facebook.com&amp;lp=true" target="_blank"><strong>550 bilhões de visualizações de páginas por mês</strong></a>;</p>
</li>
<li>
<p>Há mais fotos no Facebook do que em todos os outros sites de fotos juntos (<a href="http://www.watblog.com/2010/07/12/facebook-photos-leave-flickr-picasa-way-behind/" target="_blank">incluindo sites como o Flickr</a>);</p>
</li>
<li>
<p>Mais de <strong><a href="http://blog.facebook.com/blog.php?post=2406207130" target="_blank">3 bilhões de fotos</a></strong> são visualizadas por dia;</p>
</li>
<li>
<p>Mais de <a href="http://www.facebook.com/press/info.php?statistics" target="_blank"><strong>25 bilhões de tipos de conteúdo</strong></a> (atualizações de status, comentários, etc) são compartilhados todo mês;</p>
</li>
<li>
<p>O Facebook tem mais de <a href="http://www.datacenterknowledge.com/archives/2010/06/28/facebook-server-count-60000-or-more/" target="_blank"><strong>60 mil servidores</strong></a>.</p>
</li>
</ul>
<p><br/></p>
<h2>Softwares para escalar</h2>
<p>A infraestrutura de software que o Facebook usa pode ser vista como a de um site <a href="http://pt.wikipedia.org/wiki/LAMP" target="_blank">LAMP</a>, mas com melhorias e extensões de vários serviços. Por exemplo:</p>
<ul>
<li>
<p>O Facebook usa PHP, mas tem um compilador que permite que o sistema execute código nativo nos servidores web, aumentando significativamente seu desempenho;</p>
</li>
<li>
<p>O Facebook usa Linux, mas é um Linux otimizado para garantir alta vazão de rede;</p>
</li>
<li>
<p>O Facebook usa MySQL, mas principalmente para persistência de chaves-valores (<a href="http://pt.wikipedia.org/wiki/Hash" target="_blank">Hashes</a>), movendo lógicas de consultas e JOINS para a camada de aplicação dos servidores web em que otimizações são mais fáceis de implementar, usando por exemplo caches em memória;</p>
</li>
<li>
<p>Por fim, há sistemas customizados, como o <a href="http://www.facebook.com/note.php?note_id=76191543919" target="_blank">Haystack</a>, um objeto de armazenamento altamente escalável usado para servir a imensa quantidade de fotos do Facebook, e o <a href="http://github.com/facebook/scribe" target="_blank">Scribe</a>, um sistema de logging (registro de ações) que consegue operar na escala do Facebook (nada trivial).</p>
</li>
</ul>
<p>Vamos ao que interessa. Abaixo são apresentados os softwares (alguns) que o Facebook usa para fornecer a todos nós a maior rede social do mundo.</p>
<h3>Memcached<a href="http://www.bitabit.eng.br/wp-content/uploads/2010/07/memcached.png"><img class="alignright size-full wp-image-1302" title="Logo do Memcached" src="http://www.bitabit.eng.br/wp-content/uploads/2010/07/memcached.png" alt="" width="91" height="85" /></a></h3>
<p>O <a href="http://memcached.org/" target="_blank">Memcached</a> é no momento um dos softwares mais famosos na Internet. É um sistema de cache em memória distribuído que o Facebook (e vários outros sites) usam como uma camada de cache entre aplicação web e banco de dados (já que acesso a disco rígido é relativamente lento). Ao longo dos anos, o Facebook realizou diversas otimizações no Memcached e nos softwares que rodam em conjunto com ele.</p>
<p>O Facebook roda milhares de servidores Memcached com <a href="http://felipenasc.blogspot.com/2010/03/escalabilidade-de-aplicacoes-web-futuro.html" target="_blank">dezenas de tearabytes de dados em cache</a> a todo momento. É provavelmente a maior instalação de Memcached do mundo.</p>
<h3>HipHop for PHP<a href="http://www.bitabit.eng.br/wp-content/uploads/2010/07/hiphop.png"><img class="alignright size-full wp-image-1304" title="HipHop for PHP Logo" src="http://www.bitabit.eng.br/wp-content/uploads/2010/07/hiphop.png" alt="" width="86" height="113" /></a></h3>
<p>PHP é uma linguagem interpretada e por isso seu código quando executado é relativamente lento quando comparado com código que executa nativamente. O <a href="http://github.com/facebook/hiphop-php" target="_blank">HipHop</a> converte PHP em código C++ que pode ser então compilado e apresentar um desempenho melhor. Isso permite que o Facebook aproveite muito melhor seus servidores web já que dependem demais de PHP para servir conteúdo.</p>
<p>Uma pequena equipe de engenheiros no Facebook (inicialmente, apenas três) passou 18 meses <a href="http://developers.facebook.com/blog/post/358" target="_blank">desenvolvendo o HipHop</a>, que agora é usado em produção.</p>
<h3>Haystack</h3>
<p><a href="http://www.facebook.com/note.php?note_id=76191543919" target="_blank">Haystack</a> é o sistema de armazenamento e recuperação de fotos de alto desempenho do Facebook (a rigor, o Haystack é um armazenador de objetos, então ele não armazena apenas fotos). Existem mais de 20 bilhões de fotos no Facebook e cada uma é armazenada em quatro diferentes resoluções, resultando em mais 80 bilhões de fotos.</p>
<p>O desafio do Haystack não é apenas  armazenar bilhões de fotos, mas também executar tarefas com elas em que o desempenho é crítico, como por exemplo remoção, atualização ou acesso.</p>
<h3>BigPipe</h3>
<p>O <a href="http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919" target="_blank">BigPipe</a> é um sistema dinâmico para servir páginas web que o Facebook desenvolveu. Ele é capaz de dividir uma página em seções (chamadas &#8220;<em>pagelets</em>&#8220;) e servi-las em paralelo com desempenho ideal.</p>
<p>Por exemplo, a janela de chat é carregada separadamente, o feed de notícias é carregado separadamente, e assim por diante. Esses &#8220;<em>pagelets</em>&#8221; podem ser carregados em paralelo, que é de onde vem o ganho de desempenho, e os usuários recebem um site que funciona mesmo se uma parte dele for desativada ou estiver com defeitos.</p>
<h3>Cassandra<a href="http://www.bitabit.eng.br/wp-content/uploads/2010/07/cassandra.png"><img class="alignright size-full wp-image-1305" title="Logo do Cassandra NoSQL" src="http://www.bitabit.eng.br/wp-content/uploads/2010/07/cassandra.png" alt="" width="200" height="43" /></a></h3>
<p><a href="http://cassandra.apache.org/" target="_blank">Cassandra</a> é um sistema de armazenamento distribuído baseado no projeto do <a href="http://labs.google.com/papers/bigtable.html" target="_blank">BigTable</a>. Ele é um dos filhos de destaque do movimento <a href="http://escalabilidade.com/2010/03/08/introducao-ao-nosql-parte-i/" target="_blank">NoSQL</a> e se tornou open source (virou um projeto Apache). O Facebook o usa na  pesquisa Inbox.</p>
<p>Além do Facebook, uma série de outros sites também o usam, como o Twitter e o Digg. É um sistema capaz de armazenar uma quantidade imensa de dados sem comprometer o tempo de busca e acesso a eles.</p>
<h3>Scribe</h3>
<p><a href="http://github.com/facebook/scribe" target="_blank">Scribe</a> é um sistema de logging flexível e escalável que o Facebook usa para uma infinidade de propósitos internos. Ele foi criado para ser capaz de registrar todas as ações ocorridas no Facebook, e automaticamente lida com novas categorias de ações registradas conforme aparecem (o Facebook tem centenas).</p>
<h3>Hadoop e Hive<a href="http://www.bitabit.eng.br/wp-content/uploads/2010/07/hadoop.png"><img class="alignright size-full wp-image-1306" title="Logo do Hadoop" src="http://www.bitabit.eng.br/wp-content/uploads/2010/07/hadoop.png" alt="" width="200" height="48" /></a></h3>
<p>O <a href="http://hadoop.apache.org/" target="_blank">Hadoop</a> é uma implementação open source de <a href="http://labs.google.com/papers/mapreduce.html" target="_blank">MapReduce</a> que permite a execução de cálculos em uma quantidade massiva de dados. O Facebook o usa para análise de dados de sua rede. O <a href="http://hadoop.apache.org/hive/" target="_blank">Hive</a> é uma interface de acesso ao Hadoop através de consultas SQL, facilitando seu uso, e teve origem dentro do Facebook.</p>
<p>Tanto o Hadoop quanto o Hive são open source (projetos Apache) e são usados por uma série de grandes sites, como o Yahoo e o Twitter.</p>
<h3>Thrift</h3>
<p>O Facebook usa diferentes linguagens para os seus diferentes serviços. PHP é usada para front-end, Erlang é usada para Chat, Java e C++ são usados em diversas áreas. <a href="http://incubator.apache.org/thrift/" target="_blank">Thrift</a> é um framework cross-language desenvolvido internamente que junta todas as diferentes linguagens, permitindo que elas conversem entre si. Isso facilita enormemente o desenvolvimento cross-language no Facebook.</p>
<p>O Facebook tornou o Thrift open source e adicionou suporte a mais linguagens de programação.</p>
<h3>Varnish<a href="http://www.bitabit.eng.br/wp-content/uploads/2010/07/varnish.png"><img class="alignright size-full wp-image-1309" title="Logo do Varnish" src="http://www.bitabit.eng.br/wp-content/uploads/2010/07/varnish.png" alt="" width="200" height="54" /></a></h3>
<p>O <a href="http://varnish-cache.org/" target="_blank">Varnish</a> é um acelerador HTTP, que pode agir como um balanceador de carga e também realiza cache de conteúdo para servi-lo rapidamente.</p>
<p>O Facebook usa o Varnish para servir fotos, lidando com bilhões de requisições todos os dias. Como quase tudo que o Facebook usa, o Varnish também é open source.</p>
<p><br/></p>
<h2>Outras coisas que ajudam o Facebook a funcionar bem</h2>
<p>Foram mencionados os softwares que constituem o Facebook e o ajudam a escalar. Mas operar um sistema tão grande é uma tarefa complexa, por isso serão listadas outras coisas que ajudam o Facebook a funcionar sem problemas:</p>
<h3>Lançamento gradual de novas funcionalidades e execuções no escuro</h3>
<p>O Facebook tem um sistema chamado de &#8220;<em>Gatekeeper</em>&#8221; (porteiro) que permite que eles rodem diferentes versões do sistema para diferentes conjuntos de usuários. Ele permite que o Facebook lance novas funcionalidades gradualmente e que testes A/B sejam realizados com usuários.</p>
<p>O &#8220;<em>Gatekeeper</em>&#8221; também é responsável por realizar o que é chamado de &#8220;<em>dark launches</em>&#8221; (lançamentos no escuro), que é a ativação de elementos de uma nova funcionalidade antes de ela ir pro ar. É uma maneira de realizar testes de carga do sistema antes de uma funcionalidade ser oficialmente lançada. Normalmente os &#8220;<em>dark launches</em>&#8221; são realizados duas semanas antes do lançamento oficial da funcionalidade.</p>
<h3>Monitoramento do sistema em produção</h3>
<p>O Facebook cuidadosamente monitora seu sistema e o desempenho de cada função PHP executada em ambiente de produção. Com isso é possível projetar um perfil do sistema que está no ar com a ajuda de uma ferramenta chamada <a href="http://pecl.php.net/package/xhprof" target="_blank">XHProf</a> e identificar gargá-los ou áreas que estão operando incorretamente.</p>
<h3>Desativação gradual de recursos para aumento de desempenho</h3>
<p>Se o Facebook tiver algum problema de desempenho, existe um grande número de recursos não-críticos que podem ser desativados para aumentar o desempenho de funcionalidades vitais da rede social. Desta forma, em uma situação de emergência, o núcleo da rede social poderá continuar funcionando normalmente.</p>
<h3>Coisas que não foram mencionadas</h3>
<p>O hardware usado pelo Facebook não entrou em discussão neste artigo, mas é um aspecto importante de analisar quando se pensa em escalabilidade. Por exemplo, o Facebook usa a rede CDN para servir conteúdo estático e possui enormes <em>data centers</em> que hospedam milhares de servidores.</p>
<p>E além do que foi mencionado, existem diversos outros softwares envolvidos na operação do Facebook. Neste artigo foram destacadas as escolhas mais interessantes que o Facebook fez.</p>
<p><br/></p>
<h2>Facebook e projetos open source</h2>
<p>Antes de encerrar o artigo, é importante mencionar o quanto o Facebook, assim como outras grandes empresas de Internet, apoia projetos open source. O Facebook não apenas usa e contribui com software open source como Linux, Memcached, MySQL e Hadoop, como também desenvolve internamente diversas ferramentas que são disponibilizadas como projetos open source.</p>
<p>Uma lista com todos os projetos  open source em que o Facebook atua pode ser encontrada na página <a href="http://facebook.com/opensource" target="_blank"><em>Open Source &#8211; Desenvolvedores do Facebook</em></a>.</p>
<p><br/></p>
<h2>Mais desafios de escalabilidade por vir</h2>
<p>O Facebook cresce a passos incríveis. Sua base de usuários aumenta quase que exponencialmente e já superou <strong>500 milhões de usuários</strong>. Ele tem mantido uma taxa de cerca de <strong>100 milhões de novos usuários a cada 6 meses</strong>.</p>
<p>O rápido crescimento significa que o Facebook vai ter problemas e diversos desafios de desempenho para apresentar cada vez mais páginas, buscas, imagens, mensagens e todos os outros recursos com os quais os usuários interagem. Para um site como o Facebook, este sempre será um fato com o qual ele terá que viver, e seus engenheiros estarão sempre atentos e criando novas maneiras de fazer o sistema escalar.</p>
<p>Vamos acompanhar o que os engenheiros do Facebook estão desenvolvendo! Com certeza surgirão coisas interessantes, afinal de contas, eles estão escalando uma montanha que muitos de nós podemos apenas sonhar; um site com mais pessoas do que a maioria dos países. Quando isso acontece, é preciso ser criativo.</p>
<p><br/><br />
Este artigo é uma adaptação/atualização para o português do artigo em inglês <a href="http://royal.pingdom.com/2010/06/18/the-software-behind-facebook/" target="_blank"><em>Exploring the software behind Facebook, the world&#8217;s largest site</em></a>.<br />
<br/></p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=1263&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2010/07/28/explorando-o-software-por-tras-do-facebook-a-maior-rede-social-do-mundo/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Captura de páginas com Nokogiri</title>
		<link>http://www.bitabit.eng.br/2010/06/29/captura-de-paginas-com-nokogiri/</link>
		<comments>http://www.bitabit.eng.br/2010/06/29/captura-de-paginas-com-nokogiri/#comments</comments>
		<pubDate>Tue, 29 Jun 2010 03:00:51 +0000</pubDate>
		<dc:creator>Rafael Barbolo Lopes, Coop10</dc:creator>
				<category><![CDATA[Busca]]></category>
		<category><![CDATA[Coop10]]></category>
		<category><![CDATA[Cooperativo]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[biblioteca]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[firebug]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[libxml2]]></category>
		<category><![CDATA[mac os x]]></category>
		<category><![CDATA[nokogiri]]></category>
		<category><![CDATA[parse]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rubygems]]></category>
		<category><![CDATA[screen scraping]]></category>
		<category><![CDATA[sistemas operacionais]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=1217</guid>
		<description><![CDATA[Neste artigo, vou explicar de forma  prática como utilizar a biblioteca Nokogiri com a linguagem de programação Ruby para extrair informações de páginas na Internet.
O exemplo que vai guiar este artigo é a criação de um aplicativo que extrai o preço de um produto qualquer do site da Fast Shop. Ele será usado para [...]]]></description>
			<content:encoded><![CDATA[<p>Neste artigo, vou explicar de forma  prática como utilizar a biblioteca <a href="http://nokogiri.org/">Nokogiri</a> com a linguagem de programação <a href="http://www.ruby-lang.org/pt/">Ruby</a> para extrair informações de páginas na Internet.</p>
<p>O exemplo que vai guiar este artigo é a criação de um aplicativo que extrai o preço de um produto qualquer do site da Fast Shop. Ele será usado para encontrarmos o preço do <a href="http://www.fastshop.com.br/MACBOOK-WHITE-COM-INTEL-CORE-2-DUO--2GB--HD-250GB--TELA-133--PLACA-GRAFICA-NVIDIA-GEFORCE-320M-COM-256MB--SISTEMA-OPERACIONAL-MAC-OS-X-LEOPARD---APPLE---MC516BZA,product,AEMC516BZA,3.aspx">MacBook White</a>.</p>
<p><br/></p>
<h2>1. Instalando Ruby + RubyGems</h2>
<p>Se você usa <strong>Windows</strong>, baixe e instale a última versão estável do interpretador Ruby  <a href="http://www.ruby-lang.org/pt/downloads/">clicando aqui</a>.</p>
<p>Se você usa <strong>Mac OS X</strong>, <strong>Solaris</strong> ou uma distro <strong>linux</strong> popular, seu sistema já vem com Ruby instalado.</p>
<p>RubyGems é um gerenciador de pacotes (programas e bibliotecas) para Ruby. Para instalá-lo, baixe a última versão do aplicativo <a href="http://rubyforge.org/frs/?group_id=126" target="_blank">clicando aqui</a> e execute o comando abaixo no diretório com o arquivo descompactado:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">ruby setup.rb
gem update <span style="color: #660033;">--system</span></pre></div></div>

<p><br/></p>
<h2>2. Instalando Nokogiri</h2>
<p><strong>Mac OS X</strong></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> port <span style="color: #c20cb9; font-weight: bold;">install</span> libxml2 libxsl
<span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> nokogiri</pre></div></div>

<p><strong>Ubuntu/Debian</strong></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># pacotes de desenvolvimento ruby</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> ruby1.8-dev ruby1.8 ri1.8 rdoc1.8 irb1.8
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> libreadline-ruby1.8 libruby1.8 libopenssl-ruby
&nbsp;
<span style="color: #666666; font-style: italic;"># requisitos do nokogiri</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> libxslt-dev libxml2-dev
<span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> nokogiri
&nbsp;
<span style="color: #666666; font-style: italic;"># requisitos do nokogiri para Hardy (8.04) ou uma versão mais atual</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> libxslt1-dev libxml2-dev</pre></div></div>

<p><strong>Windows</strong></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">gem <span style="color: #c20cb9; font-weight: bold;">install</span> nokogiri</pre></div></div>

<p><br/></p>
<h2>3. Baixando a página do produto</h2>
<p>O trecho de código que baixa a página do <a href="http://www.fastshop.com.br/MACBOOK-WHITE-COM-INTEL-CORE-2-DUO--2GB--HD-250GB--TELA-133--PLACA-GRAFICA-NVIDIA-GEFORCE-320M-COM-256MB--SISTEMA-OPERACIONAL-MAC-OS-X-LEOPARD---APPLE---MC516BZA,product,AEMC516BZA,3.aspx">MacBook</a> se encontra abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># url do produto</span>
url = <span style="color:#996600;">'http://www.fastshop.com.br/MACBOOK-WHITE-COM-INTEL-CORE-2-DUO--2GB--HD-250GB--TELA-133--PLACA-GRAFICA-NVIDIA-GEFORCE-320M-COM-256MB--SISTEMA-OPERACIONAL-MAC-OS-X-LEOPARD---APPLE---MC516BZA,product,AEMC516BZA,3.aspx'</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># html da página</span>
html = <span style="color:#6666ff; font-weight:bold;">Net::HTTP</span>.<span style="color:#9900CC;">get</span> <span style="color:#CC00FF; font-weight:bold;">URI</span>.<span style="color:#9900CC;">parse</span><span style="color:#006600; font-weight:bold;">&#40;</span>url<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># html analisado pelo nokogiri</span>
doc = <span style="color:#6666ff; font-weight:bold;">Nokogiri::HTML</span><span style="color:#006600; font-weight:bold;">&#40;</span>html<span style="color:#006600; font-weight:bold;">&#41;</span></pre></td></tr></table></div>

<p><br/></p>
<h2>4. Extraindo o preço do produto</h2>
<p>Para extrair o preço do produto a partir do HTML baixado, vamos utilizar o plugin <a href="https://addons.mozilla.org/pt-BR/firefox/addon/1843/">Firebug</a> para analisar a estrutura do HTML. Ele permitirá que encontremos o <a href="http://www.w3.org/TR/xpath/">XPath</a> (XML Path Language) do elemento que contém o preço do produto.</p>
<p>Na captura de tela abaixo, podemos ver como isso é feito:</p>
<p><a href="http://www.bitabit.eng.br/wp-content/uploads/2010/06/fastshop-firebug.png"><img class="size-large wp-image-1245" title="Análise de produto na FastShop com Firebug" src="http://www.bitabit.eng.br/wp-content/uploads/2010/06/fastshop-firebug.png" alt="" width="768" height="480" /></a></p>
<p>Verificamos que a seguinte estrutura de nós de HTML guarda o preço do produto:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;</span>div <span style="color: #007800;"><span style="color: #c20cb9; font-weight: bold;">id</span></span>=<span style="color: #ff0000;">&quot;boxInfosPagamento&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>
   <span style="color: #000000; font-weight: bold;">&lt;</span>p <span style="color: #007800;">class</span>=<span style="color: #ff0000;">&quot;preco&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>
        <span style="color: #000000; font-weight: bold;">&lt;</span>span<span style="color: #000000; font-weight: bold;">&gt;</span>PRECO DO PRODUTO<span style="color: #000000; font-weight: bold;">&lt;/</span>span<span style="color: #000000; font-weight: bold;">&gt;</span>
   <span style="color: #000000; font-weight: bold;">&lt;/</span>p<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;/</span>div<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>Podemos traduzir essa estrutura para o seguinte XPath:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#996600;">&quot;//div[@id='boxInfosPagamento']/p[@class='preco']/span&quot;</span></pre></div></div>

<p><br/></p>
<h2>5. Aplicativo final</h2>
<p>O aplicativo final que imprime o preço do produto pode ser visto abaixo:</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
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># importando bibliotecas necessárias:</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;rubygems&quot;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;nokogiri&quot;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;net/http&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># url do produto</span>
url = <span style="color:#996600;">'http://www.fastshop.com.br/MACBOOK-WHITE-COM-INTEL-CORE-2-DUO--2GB--HD-250GB--TELA-133--PLACA-GRAFICA-NVIDIA-GEFORCE-320M-COM-256MB--SISTEMA-OPERACIONAL-MAC-OS-X-LEOPARD---APPLE---MC516BZA,product,AEMC516BZA,3.aspx'</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># html da página</span>
html = <span style="color:#6666ff; font-weight:bold;">Net::HTTP</span>.<span style="color:#9900CC;">get</span> <span style="color:#CC00FF; font-weight:bold;">URI</span>.<span style="color:#9900CC;">parse</span><span style="color:#006600; font-weight:bold;">&#40;</span>url<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># html analisado pelo nokogiri</span>
doc = <span style="color:#6666ff; font-weight:bold;">Nokogiri::HTML</span><span style="color:#006600; font-weight:bold;">&#40;</span>html<span style="color:#006600; font-weight:bold;">&#41;</span>
doc.<span style="color:#9900CC;">encoding</span> = <span style="color:#996600;">'utf-8'</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># preço do produto</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> doc.<span style="color:#9900CC;">xpath</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;//div[@id='boxInfosPagamento']/p[@class='preco']/span&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">inner_html</span></pre></td></tr></table></div>

<p>A captura de tela abaixo mostra a execução do aplicativo:</p>
<p><a href="http://www.bitabit.eng.br/wp-content/uploads/2010/06/execucao-fastshop.png"><img class="aligncenter size-full wp-image-1246" title="Execução do aplicativo que extrai preço da FastShop" src="http://www.bitabit.eng.br/wp-content/uploads/2010/06/execucao-fastshop.png" alt="" width="745" height="559" /></a></p>
<p><br/></p>
<h2>6. Conclusões</h2>
<p>Nokogiri é uma biblioteca muito robusta que suporta seleção de elementos com XPath ou seletor CSS3 de forma simples e eficiente. Sempre que precisar analisar XML ou HTML, considere usá-la em seu projeto.</p>
<p>Em artigos futuros vou falar mais sobre extração e análise de informações da Internet. Se tiver alguma dúvida ou sugestão de tema, deixe seu comentário!<br />
<br/><br/><br/></p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=1217&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2010/06/29/captura-de-paginas-com-nokogiri/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>10 Tecnologias Quentes para 2010</title>
		<link>http://www.bitabit.eng.br/2009/11/22/10-tecnologias-quentes-para-2010/</link>
		<comments>http://www.bitabit.eng.br/2009/11/22/10-tecnologias-quentes-para-2010/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 00:02:38 +0000</pubDate>
		<dc:creator>Rafael Barbolo Lopes, Coop10</dc:creator>
				<category><![CDATA[Avaliações]]></category>
		<category><![CDATA[Coop10]]></category>
		<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Destaques]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[123people]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[android market]]></category>
		<category><![CDATA[app engine]]></category>
		<category><![CDATA[app store]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[azure]]></category>
		<category><![CDATA[bing]]></category>
		<category><![CDATA[busca]]></category>
		<category><![CDATA[chrome os]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[Computação]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[e-book]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google apps]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[iphone killer]]></category>
		<category><![CDATA[itunes store]]></category>
		<category><![CDATA[kindle]]></category>
		<category><![CDATA[maemo]]></category>
		<category><![CDATA[meme]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[microsoft research]]></category>
		<category><![CDATA[nokia]]></category>
		<category><![CDATA[nook]]></category>
		<category><![CDATA[nuvem]]></category>
		<category><![CDATA[office online]]></category>
		<category><![CDATA[oipaggo]]></category>
		<category><![CDATA[ovi]]></category>
		<category><![CDATA[pagamento móvel]]></category>
		<category><![CDATA[photosynth]]></category>
		<category><![CDATA[salesforce]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[sistemas operacionais]]></category>
		<category><![CDATA[snow leopard]]></category>
		<category><![CDATA[sony reader]]></category>
		<category><![CDATA[swirl]]></category>
		<category><![CDATA[tecnologias]]></category>
		<category><![CDATA[tineye]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[wave]]></category>
		<category><![CDATA[web services]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[windows 7]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=794</guid>
		<description><![CDATA[Vou citar 10 tecnologias ou produtos que acredito que vão dar muito o que falar em 2010.
Muitas tecnologias já existem e estão crescendo muito, mas acredito que 2010 será o ano de consolidação delas.
Não concorda comigo? Tem algo a acrescentar? Deixe seu comentário.


1. Iphone Killer
O celular que vai matar o Iphone

Android
Nokia Maemo
Outro celular da Apple



2. [...]]]></description>
			<content:encoded><![CDATA[<p>Vou citar 10 tecnologias ou produtos que acredito que vão dar muito o que falar em 2010.</p>
<p>Muitas tecnologias já existem e estão crescendo muito, mas acredito que 2010 será o ano de consolidação delas.</p>
<p>Não concorda comigo? Tem algo a acrescentar? Deixe seu <a href="#comment">comentário</a>.</p>
<p><br/><br/><br />
<img src="http://www.bitabit.eng.br/wp-content/uploads/2009/11/android_logo1-150x150.gif" alt="Iphone Killer: Android" title="Iphone Killer: Android" width="150" height="150" class="alignleft size-thumbnail wp-image-836" /></p>
<h2>1. Iphone Killer</h2>
<p>O celular que vai matar o Iphone</p>
<ul>
<li><a href="http://www.android.com/">Android</a></li>
<li><a href="http://maemo.nokia.com/">Nokia Maemo</a></li>
<li><a href="http://www.apple.com/iphone/">Outro celular da Apple</a></li>
</ul>
<p><br/><br/><br/></p>
<p><img src="http://www.bitabit.eng.br/wp-content/uploads/2009/11/sf-logo-trans-new-copy-150x124.png" alt="SalesForce - Computação nas Nuvens - Sem Software" title="SalesForce - Computação nas Nuvens - Sem Software" width="150" height="124" class="alignleft size-thumbnail wp-image-834" /></p>
<h2>2. Computação na Nuvem (<i>Cloud Computing</i>)</h2>
<p>Infraestrutura para rodar software na Internet</p>
<ul>
<li><a href="http://www.salesforce.com/platform/">Plataforma Force.com</a></li>
<li><a href="http://appengine.google.com/">Google App Engine</a></li>
<li><a href="http://aws.amazon.com/">Amazon Web Services</a></li>
<li><a href="http://www.microsoft.com/windowsazure/">Windows Azure</a></li>
</ul>
<p><br/><br/><br/></p>
<p><img src="http://www.bitabit.eng.br/wp-content/uploads/2009/11/dropbox-150x150.png" alt="Dropbox" title="Dropbox" width="150" height="150" class="alignleft size-thumbnail wp-image-841" /></p>
<h2>3. Aplicativos na Nuvem (<i>Cloud Computing</i>)</h2>
<p>Softwares que rodam na Internet</p>
<ul>
<li><a href="http://www.dropbox.com/">Dropbox</a></li>
<li><a href="http://wave.google.com/">Google Wave</a></li>
<li><a href="http://www.google.com/apps/">Google Apps</a></li>
<li><a href="http://office.microsoft.com/office_live/">Microsoft Office Online</a></li>
<li><a href="http://www.salesforce.com/">SalesForce</a></li>
</ul>
<p><br/><br/><br/></p>
<p><img src="http://www.bitabit.eng.br/wp-content/uploads/2009/11/facebook4-150x150.png" alt="facebook" title="facebook" width="150" height="150" class="alignleft size-thumbnail wp-image-860" /></p>
<h2>4. Busca Social (<i>Busca de Perfis</i>)</h2>
<p>Encontre tudo sobre qualquer pessoa</p>
<ul>
<li><a href="http://www.facebook.com/find-friends/?ref=pf">Busca de Amigos (<i>Facebook</i>)</a></li>
<li><a href="http://www.123people.com/">123people</a></li>
<li><a href="http://www.google.com.br/profiles?q=rafael">Busca de Perfis (<i>Google</i>)</a></li>
</ul>
<p><br/><br/><br/></p>
<p><img src="http://www.bitabit.eng.br/wp-content/uploads/2009/11/windows7-150x150.png" alt="windows7" title="windows7" width="150" height="150" class="alignleft size-thumbnail wp-image-863" /></p>
<h2>5. Sistemas Operacionais Leves</h2>
<p>Quanto mais leve, mais rápido</p>
<ul>
<li><a href="http://www.microsoft.com/brasil/windows7/">Windows 7</a></li>
<li><a href="http://www.apple.com/br/macosx/">Snow Leopard</a></li>
<li><a href="http://www.ubuntu-br.org/">Ubuntu</a></li>
<li><a href="http://www.chromium.org/chromium-os">Chrome OS</a></li>
</ul>
<p><br/><br/><br/></p>
<p><img src="http://www.bitabit.eng.br/wp-content/uploads/2009/11/kindle-150x150.png" alt="E-Book Reader: Amazon Kindle" title="E-Book Reader: Amazon Kindle" width="150" height="150" class="alignleft size-thumbnail wp-image-867" /></p>
<h2>6. Leitor de Livros (<i>E-book Reader</i>)</h2>
<p>Mais de mil livros no bolso. E você pode fazer busca neles!</p>
<ul>
<li><a href="http://www.amazon.com/kindle/">Kindle (<i>Amazon</i>)</a></li>
<li><a href="http://www.barnesandnoble.com/nook/">nook (<i>Barnes &#038; Noble</i>)</a></li>
<li><a href="http://www.sonystyle.com/webapp/wcs/stores/servlet/CategoryDisplay?catalogId=10551&#038;storeId=10151&#038;langId=-1&#038;categoryId=8198552921644523779">Sony Reader</a></li>
</ul>
<p><br/><br/><br/></p>
<p><img src="http://www.bitabit.eng.br/wp-content/uploads/2009/11/twitter-150x150.png" alt="Busca em Tempo Real: twitter" title="Busca em Tempo Real: twitter" width="150" height="150" class="alignleft size-thumbnail wp-image-872" /></p>
<h2>7. Busca em Tempo Real</h2>
<p>Encontrar conteúdos em tempo real já é possível. Mas como ordená-los por relevância?</p>
<ul>
<li><a href="http://www.twitter.com/">Twitter</a></li>
<li><a href="http://meme.yahoo.com/">Meme (<i>Yahoo</i>)</a></li>
<li><a href="http://www.bing.com/">Bing</a></li>
<li><a href="http://www.google.com/">Google</a></li>
<li><a href="http://www.facebook.com/">Facebook</a></li>
</ul>
<p><br/><br/><br/></p>
<p><img src="http://www.bitabit.eng.br/wp-content/uploads/2009/11/oipago-150x150.png" alt="Pagamento Móvel: Oi Paggo" title="Pagamento Móvel: Oi Paggo" width="150" height="150" class="alignleft size-thumbnail wp-image-876" /></p>
<h2>8. Pagamento com Celular (<i>Mobile Payment</i>)</h2>
<p>Pague suas compras com um SMS</p>
<ul>
<li><a href="http://www.oipaggo.com.br/">Oi Paggo</a> (<i>Rio Grande do Sul</i>)</li>
</ul>
<p><br/><br/><br/><br/><br/></p>
<p><img src="http://www.bitabit.eng.br/wp-content/uploads/2009/11/photosynth-150x150.png" alt="Busca de Imagens: photosynth" title="Busca de Imagens: photosynth" width="150" height="150" class="alignleft size-thumbnail wp-image-879" /></p>
<h2>9. Busca de Imagens</h2>
<p>Encontrar imagens através de outras imagens? Rostos? Imagens para colorir?</p>
<ul>
<li><a href="http://www.photosynth.net/">Photosynth</a></li>
<li><a href="http://www.tineye.com/">TinEye</a></li>
<li><a href="http://image-swirl.googlelabs.com/">Image Swirl</a></li>
<li><a href="http://www.bing.com.br/images">Bing Imagens</a></li>
<li><a href="http://images.google.com.br/">Google Imagens</a></li>
</ul>
<p><br/><br/><br/></p>
<p><img src="http://www.bitabit.eng.br/wp-content/uploads/2009/11/iphone-app-store-150x150.png" alt="Loja de Aplicativos: Iphone App Store" title="Loja de Aplicativos: Iphone App Store" width="150" height="150" class="alignleft size-thumbnail wp-image-884" /></p>
<h2>10. Loja de Aplicativos (<i>Apps Store</i>)</h2>
<p>Milhares de aplicativos desenvolvidos por terceiros que melhoram o uso de um produto</p>
<ul>
<li><a href="http://www.apple.com/br/iphone/apps-for-iphone/">App Store (<i>Iphone</i>)</a></li>
<li><a href="http://store.ovi.com/">Ovi Store (<i>Nokia</i>)</a></li>
<li><a href="http://www.android.com/market/">Android Market</a></li>
<li><a href="http://apps.facebook.com/apps/directory.php">Diretório de Aplicativos (<i>Facebook</i>)</a></li>
<li><a href="http://www.apple.com/itunes/whats-on/#apps">Itunes Store</a></li>
</ul>
<p><br/><br/><br/></p>
<h2>Comente&#8230;</h2>
<p><br/><br/><br/></p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=794&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2009/11/22/10-tecnologias-quentes-para-2010/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>A Natureza de uma Linguagem de Programação</title>
		<link>http://www.bitabit.eng.br/2009/11/09/a-natureza-de-uma-linguagem-de-programacao/</link>
		<comments>http://www.bitabit.eng.br/2009/11/09/a-natureza-de-uma-linguagem-de-programacao/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 10:00:42 +0000</pubDate>
		<dc:creator>Rafael Barbolo Lopes, Coop10</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Coop10]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Compilador]]></category>
		<category><![CDATA[Earlang]]></category>
		<category><![CDATA[Interpretador]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[linguagem de programação]]></category>
		<category><![CDATA[linguagem dinâmica]]></category>
		<category><![CDATA[linguagem estática]]></category>
		<category><![CDATA[linguagem fortemente tipada]]></category>
		<category><![CDATA[linguagem fracamente tipada]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[Pascal]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=718</guid>
		<description><![CDATA[Uma linguagem de programação é uma linguagem que possui sintaxe (formato) e semântica (significado), e é usada para expressar uma sequência de ações computacionais que formam um programa.
Existem milhares de linguagens de programação e novas linguagens surgem frequentemente, trazendo novos paradigmas e estabelecendo novos padrões para programadores. Por isso, é importante conhecer as diferenças principais [...]]]></description>
			<content:encoded><![CDATA[<p>Uma linguagem de programação é uma linguagem que possui sintaxe (formato) e semântica (significado), e é usada para expressar uma sequência de ações computacionais que formam um programa.</p>
<p>Existem milhares de linguagens de programação e novas linguagens surgem frequentemente, trazendo novos paradigmas e estabelecendo novos padrões para programadores. Por isso, é importante conhecer as diferenças principais entre as linguagens e quando o uso de cada uma delas é mais adequado.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-732" title="Linguagens de Programação" src="http://www.bitabit.eng.br/wp-content/uploads/2009/11/Computer-Languages.png" alt="Linguagens de Programação" width="560" height="560" /></p>
<p>Para explorar as diferenças entre elas, serão discutidos os seguintes assuntos: o que são tipos de sistema estáticos ou dinâmicos, o que são linguagens fortemente ou fracamente tipadas e quais são os modos de execução de um programa (código executável compilado ou interpretação de código fonte).</p>
<h2><strong>Tipo estático ou dinâmico</strong></h2>
<p>As linguagens de programação podem ser classificadas de acordo com o tipo de sistema que elas usam. O tipo de sistema define como são os métodos e as variáveis da linguagem.</p>
<p>Em uma linguagem de <strong>tipo estático</strong>, o compilador deve conhecer o tipo de uma variável ou método antes da execução do programa (por isso, o tipo de uma variável normalmente é explicitamente declarado). Em uma linguagem de <strong>tipo dinâmico</strong>, o tipo de uma variável ou método é desconhecido até a execução do programa.</p>
<p>Exemplo prático de declaração de uma variável inteira com valor 10:</p>
<p>Java <em>(Tipo estático)</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">int</span> a <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ruby <em>(Tipo dinâmico)</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">a = <span style="color:#006666;">10</span></pre></div></div>

<p>Exemplos de linguagens de tipo estático: <strong>Java</strong>, <strong>Pascal</strong>, <strong>C</strong>, <strong>C#</strong> e <strong>C++</strong>.<br />
Exemplos de linguagens de tipo dinâmico: <strong>Python</strong>, <strong>Javascript</strong>, <strong>Perl</strong> e <strong>Ruby</strong>.</p>
<h2>Fortemente ou fracamente tipada</h2>
<blockquote><p>Um objeto é determinado pelo que ele pode fazer e não pelo seu tipo.</p>
<p><em>(tipo fraco)</em></p></blockquote>
<p>Um conceito que muita gente confunde com tipo dinâmico ou estático é se uma linguagem é fortemente ou fracamente tipada.</p>
<p>A definição de fortemente ou fracamente tipada tem relação com quão profundamente um sistema verifica as operações que podem ser feitas sobre uma estrutura de dados.</p>
<p>Em linguagens fortemente tipadas, as operações são aplicadas para estruturas de dados bem definidas e cada operação define os tipos de dados que deve receber. Em linguagens fracamente tipadas, as operações são aplicadas para qualquer estrutura de dados; porém, essas operações podem falhar em tempo de execução caso a estrutura não suporte a operação.</p>
<p>Em uma linguagem fortemente tipada o sistema tem garantias sobre o comportamento do programa. Em uma linguagem fracamente tipada, essa garantia não existe porque uma estrutura de dados pode receber novas funcionalidades em tempo de execução.</p>
<p>Exemplo de uma função que realiza a soma de dois números, um inteiro e um ponto flutuante, e devolve um resultado em ponto flutuante:</p>
<p>Java <em>(Fortemente tipada)</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">float</span> soma<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">float</span> a, <span style="color: #000066; font-weight: bold;">int</span> b<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">return</span> a <span style="color: #339933;">+</span> b<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ruby <em>(Fracamente tipada)</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> soma <span style="color:#006600; font-weight:bold;">&#40;</span>a, b<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#0000FF; font-weight:bold;">return</span> a <span style="color:#006600; font-weight:bold;">+</span> b
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Em Java, os tipos de dados que a operação soma suporta estão bem definidos (<strong>a</strong> é float e <strong>b</strong> é int) e o tipo de dado que a operação devolve também (<strong>resultado</strong> é float).</p>
<p>Em Ruby, a função soma pode receber quaisquer tipos de dados para <strong>a</strong> e <strong>b</strong>, e a operação será aplicada sobre esses tipos, devolvendo um resultado de tipo desconhecido:</p>
<ul>
<li>se <strong>a</strong> e <strong>b</strong> forem String, o resultado será uma String concatenada de <strong>a</strong> e <strong>b</strong>;</li>
<li>se <strong>a</strong> e <strong>b</strong> forem inteiros, o resultado será um inteiro que representa a soma <strong>a</strong>+<strong>b</strong>;</li>
<li>se <strong>a</strong> for um float e <strong>b</strong> um inteiro, o resultado será um float que representa a soma <strong>a</strong>+<strong>b</strong>.</li>
</ul>
<p>Vale a pena observar que em linguagens fracamente tipadas, a possibilidade de erros em tempo de execução é muito maior. Por isso, é muito recomendável o uso de testes para verificar erros antes de colocar um sistema em produção.</p>
<p>Exemplos de linguagens fortemente tipadas: <strong>Java</strong>, <strong>Pascal</strong>, <strong>C</strong> e <strong>C++</strong>.<br />
Exemplos de linguagens fracamente tipadas: <strong>Perl</strong> e <strong>Ruby</strong>.</p>
<h2>Linguagens compiladas ou de script</h2>
<p>Outro modo de classificar uma linguagem é se ela precisa de um passo de compilação antes de executar. Se ela precisa deste passo, ela é chamada de linguagem compilada. Senão, é chamada de linguagem de script.</p>
<p>Um <strong>compilador</strong> de uma linguagem compilada gera um código executável a partir do código fonte escrito pelo programador. O código executável não possui o conteúdo do código fonte, portanto programas de linguagens compiladas são melhores de distribuir quando o programador não quer que seu código seja público.</p>
<p>Uma linguagem de script normalmente não necessita de um passo específico de compilação para executar um programa. O código fonte escrito pelo programador pode ser executado diretamente por um <strong>intepretador</strong>. Esse interpretador lê trechos do código fonte em tempo de execução, converte em um formato que o computador consegue ler (compilação em tempo de execução) e realiza sua execução.</p>
<p>Linguagens de script costumam ter performance inferior a linguagens compiladas pois exigem mais passos para rodar um programa em tempo de execução. Porém, elas são muito mais produtivas, pois eliminam a necessidade de compilar o código fonte toda vez que uma alteração é feita.</p>
<p>Quem já mexeu no código fonte de uma aplicação web sabe como é muito melhor trabalhar com linguagem interpretada: você faz uma alteração no código, salva e pode verificá-la de imediato.</p>
<p>Quando usa uma linguagem compilada, como Java, você tem que compilar o código fonte (que pode levar um tempo considerável, dependendo do sistema), fazer o upload do código para o servidor web e só então verificar a alteração.</p>
<p>Exemplos de linguagens compiladas: <strong>Java</strong>, <strong>C</strong>, <strong>C++</strong> e <strong>C#</strong>.<br />
Exemplos de linguagens de script: <strong>PHP</strong>, <strong>Perl</strong>, <strong>Python</strong> e <strong>Ruby</strong>.</p>
<h2>Considerações finais</h2>
<p>Este artigo apresenta conceitos básicos sobre linguagens de programação que podem ser decisivos para a escolha de uma.</p>
<p>Para ambientes corporativos, em que uma das exigências principais é a estabilidade e performance do sistema, uma linguagem de tipo estático, fortemente tipada e compilada, como Java, é uma boa escolha.</p>
<p>Para uma aplicação que sofre muitas alterações e que exige alta performance (como por exemplo o Twitter), uma combinação de linguagens de script e compiladas é uma boa escolha. Por exemplo, combinar Ruby ou Python com C, ou usar uma linguagem que suporta tanto interpretação quanto compilação, como Scala.</p>
<p>Para cada situação existe um tipo de linguagem de programação mais adequada. O ideal é não ficar preso aos mesmos paradigmas e nunca achar que a linguagem de programação preferida é a melhor para resolver qualquer problema.</p>
<p>Deixo a dica de um amigo meu, <a href="http://twitter.com/emiyake">Edmar Miyake</a>, para ficar atualizado com os novos paradigmas de programação: estudar uma nova linguagem de programação por ano.</p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=718&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2009/11/09/a-natureza-de-uma-linguagem-de-programacao/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
