<?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; Programação</title>
	<atom:link href="http://www.bitabit.eng.br/categorias/tecnologia/programacao-tecnologia/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bitabit.eng.br</link>
	<description>O Blog da Engenharia de Computação da POLI-USP</description>
	<lastBuildDate>Wed, 11 Jan 2012 16:12:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Apache Solr: how to search sorting accented fields</title>
		<link>http://www.bitabit.eng.br/2011/03/16/sunspot-solr-how-to-sort-accented-fields/</link>
		<comments>http://www.bitabit.eng.br/2011/03/16/sunspot-solr-how-to-sort-accented-fields/#comments</comments>
		<pubDate>Wed, 16 Mar 2011 20:28:18 +0000</pubDate>
		<dc:creator>Rafael Barbolo Lopes, Coop10</dc:creator>
				<category><![CDATA[Busca]]></category>
		<category><![CDATA[Coop10]]></category>
		<category><![CDATA[Cooperativo]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[ascii]]></category>
		<category><![CDATA[ASCIIFoldingFilterFactory]]></category>
		<category><![CDATA[HTMLStripCharFilterFactory]]></category>
		<category><![CDATA[KeywordTokenizer]]></category>
		<category><![CDATA[KeywordTokenizerFactory]]></category>
		<category><![CDATA[latin]]></category>
		<category><![CDATA[LowerCaseFilterFactory]]></category>
		<category><![CDATA[Normalizing]]></category>
		<category><![CDATA[queries]]></category>
		<category><![CDATA[schema]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[StandardFilterFactory]]></category>
		<category><![CDATA[StandardTokenizerFactory]]></category>
		<category><![CDATA[string field]]></category>
		<category><![CDATA[sunspot]]></category>
		<category><![CDATA[TextField]]></category>
		<category><![CDATA[token]]></category>
		<category><![CDATA[tokenizer]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=2054</guid>
		<description><![CDATA[We are using Apache Solr and Sunspot in a brazilian portuguese project and wanted it to work with accented chars. Normalizing latin chars (á, é, ç, &#8230;) to ASCII chars (a, e, c, &#8230;) in our search index and queries was pretty easy. We changed the text field definition to the following schema: 1 2 [...]]]></description>
			<content:encoded><![CDATA[<p>We are using <a href="http://lucene.apache.org/solr/">Apache Solr</a> and <a href="http://outoftime.github.com/sunspot/">Sunspot</a> in a brazilian portuguese project and wanted it to work with accented chars.</p>
<p><a href="http://www.bitabit.eng.br/wp-content/uploads/2011/03/apache_solr_logo.jpg"><img src="http://www.bitabit.eng.br/wp-content/uploads/2011/03/apache_solr_logo.jpg" alt="" title="Apache SOLR Logo" width="283" height="156" class="aligncenter size-full wp-image-2070" /></a></p>
<p>Normalizing latin chars (á, é, ç, &#8230;) to ASCII chars (a, e, c, &#8230;) in our search index and queries was pretty easy. We changed the text field definition to the following schema:</p>
<p><br/><br/></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fieldType</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;solr.TextField&quot;</span> <span style="color: #000066;">omitNorms</span>=<span style="color: #ff0000;">&quot;false&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;analyzer<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;charFilter</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;solr.HTMLStripCharFilterFactory&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span> <span style="color: #808080; font-style: italic;">&lt;!-- strip HTML --&gt;</span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;tokenizer</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;solr.StandardTokenizerFactory&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;solr.StandardFilterFactory&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;solr.LowerCaseFilterFactory&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;solr.ASCIIFoldingFilterFactory&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span> <span style="color: #808080; font-style: italic;">&lt;!-- convert accented chars to ASCII --&gt;</span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/analyzer<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/fieldType<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p><br/><br/></p>
<p>A more difficult problem was to sort accented string fields. By default, the class of the sunspot&#8217;s string field is <em>solr.StrField</em>. The string field is used for sorting, but was showing problems to sort accented inputs. For the inputs &#8220;árvore&#8221;, &#8220;bola&#8221;, &#8220;ano&#8221; it was showing the sorted result: &#8220;ano&#8221;, &#8220;bola&#8221;, &#8220;árvore&#8221; (the correct result would be &#8220;ano&#8221;, &#8220;árvore&#8221;, &#8220;bola&#8221;).</p>
<p>The problem with accented chars sorting is that non-ASCII chars are represented as HTML entites (for example, <em>&amp;aacute; </em>instead of<em> á</em>) and special chars as &#8220;&#038;&#8221; goes after alphanumeric chars in a sort.</p>
<p>To solve this, we changed the string field&#8217;s class to <em>solr.TextField</em> but making sure that its tokenizer would not create more than one token for each entry. The tokenizer we used was the <em>KeywordTokenizer</em>. The final schema for the string field was:</p>
<p><br/><br/></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="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fieldType</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;string&quot;</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;solr.TextField&quot;</span> <span style="color: #000066;">omitNorms</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;analyzer<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;tokenizer</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;solr.KeywordTokenizerFactory&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;solr.LowerCaseFilterFactory&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;solr.ASCIIFoldingFilterFactory&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/analyzer<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/fieldType<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p><br/><br/></p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=2054&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2011/03/16/sunspot-solr-how-to-sort-accented-fields/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Detecção e rastreamento de faces em vídeos – Como classificar faces?</title>
		<link>http://www.bitabit.eng.br/2011/03/07/como-classificar-faces/</link>
		<comments>http://www.bitabit.eng.br/2011/03/07/como-classificar-faces/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 12:00:20 +0000</pubDate>
		<dc:creator>Filipe M. S. de Campos, Coop10</dc:creator>
				<category><![CDATA[Algoritmos e Estruturas de Dados]]></category>
		<category><![CDATA[Computação]]></category>
		<category><![CDATA[Coop10]]></category>
		<category><![CDATA[Inteligência Artificial]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Visão Computacional]]></category>
		<category><![CDATA[Affine transformation]]></category>
		<category><![CDATA[boca]]></category>
		<category><![CDATA[classificação]]></category>
		<category><![CDATA[computer vision]]></category>
		<category><![CDATA[correlação]]></category>
		<category><![CDATA[detecção]]></category>
		<category><![CDATA[detection]]></category>
		<category><![CDATA[face]]></category>
		<category><![CDATA[iniciação científica]]></category>
		<category><![CDATA[inteligência artificial]]></category>
		<category><![CDATA[jones]]></category>
		<category><![CDATA[kmeans]]></category>
		<category><![CDATA[nariz]]></category>
		<category><![CDATA[olhos]]></category>
		<category><![CDATA[OpenCV]]></category>
		<category><![CDATA[transformação afim]]></category>
		<category><![CDATA[viola]]></category>
		<category><![CDATA[visão computacional]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=1916</guid>
		<description><![CDATA[Finalizando a nossa série de artigos, indicarei textos sobre a teoria responsável pela etapa de classificação das faces e também a aplicação dela no projeto de iniciação científica. . . Teoria envolvida Para a última etapa do projeto, foi necessário conhecer e organizar todas as faces pelos momentos em que elas aparecem nas tomadas do vídeo [...]]]></description>
			<content:encoded><![CDATA[<p>Finalizando a nossa série de artigos, indicarei textos sobre a teoria responsável pela etapa de classificação das faces e também a aplicação dela no projeto de iniciação científica.   <span style="color: #ffffff;">.</span></p>
<p><span style="color: #ffffff;">.</span></p>
<h2>Teoria envolvida</h2>
<p>Para a última etapa do projeto, foi necessário conhecer e organizar todas as faces pelos momentos em que elas aparecem nas tomadas do vídeo e a que pessoas elas correspondem. Para isso, foram utilizados alguns conceitos e teorias já apresentados nos artigos anteriores da série, mas também outros tópicos ainda não estudados. Para todos os assuntos, serão listadas fontes interessantes para estudo.</p>
<h4>Detecção de características faciais (olhos, nariz, boca):</h4>
<p>Técnica de Viola e Jones com as cascatas adequados para cada característica facial. Mais detalhes sobre essa técnica em <a title="Detecção de objetos - Vioja e Jones" href="http://www.bitabit.eng.br/2011/02/21/como-detectar-faces-em-videos" target="_blank">Detecção e rastreamento de faces em vídeos – Como detectar faces em vídeos?</a>.</p>
<h4>Transformação Afim:</h4>
<p><a title="Transformação afim - Wikipedia" href="http://en.wikipedia.org/wiki/Affine_transformation" target="_blank">Link da Wikipedia sobre transformação afim</a> <a title="Matriz de Transformação" href="http://en.wikipedia.org/wiki/Transformation_matrix" target="_blank">Link da Wikipedia sobre a matriz de transformação</a> <a title="Transformação afim no OpenCV" href="http://dasl.mem.drexel.edu/~noahKuntz/openCVTut5.html#Step%202" target="_blank">Como realizar transformação afim utilizando o OpenCV</a> <a title="Mosaico de imagens" href="http://amais.esoterica.pt/apsi/index.html" target="_blank">Link</a> interessante para um projeto da Universidade do Porto que trata de mosaico de imagens. Com a leitura, além de aprender sobre transformação afim e correlação, você entenderá outra possibilidade de uso desse tipo de transformação e também outras teorias envolvidas para a realização desse projeto.</p>
<h4>Correlação:</h4>
<p><em><a title="Fast Normalized Cross-Correlation" href="http://www.idiom.com/~zilla/Papers/nvisionInterface/nip.html" target="_blank">Fast Normalized Cross-Correlation</a></em> <a title="Correlação - OpenCV" href="http://dasl.mem.drexel.edu/~noahKuntz/openCVTut6.html#Step%202" target="_blank">Como realizar Template Matching utilizando o OpenCV</a> <a title="Template Matching" href="http://nashruddin.com/template-matching-in-opencv-with-example.html" target="_blank">Código exemplo sobre <em>Template Matching</em> utilizando OpenCV</a></p>
<h4>Kmeans:</h4>
<p><a title="Kmeans - Wikipedia" href="http://en.wikipedia.org/wiki/K-means_clustering" target="_blank">Link da Wikipedia sobre Kmeans</a> <a title="Kmeans" href="http://home.dei.polimi.it/matteucc/Clustering/tutorial_html/kmeans.html" target="_blank">Link explicando sobre Kmeans</a> <a title="Kmeans" href="http://people.revoledu.com/kardi/tutorial/kMean/NumericalExample.htm" target="_blank">Link para uma explicação curta e um exemplo</a> <a title="Slides Kmeans" href="http://www.autonlab.org/tutorials/kmeans.html" target="_blank">Slides explicativos sobre o Kmeans</a></p>
<p><span style="color: #ffffff;">.</span></p>
<h2>Aplicação no projeto</h2>
<p>A ideia central dessa etapa era preparar os dados para a criação da estrutura de indexação a ser utilizada pelo hipervídeo. Para isso, inicialmente, seriam identificadas as expressões faciais para a face de cada pessoa presente em uma tomada. O objetivo era guardar a face mais frontal possível e também os pontos necessários para a transformação afim que ocorre como passo seguinte. Com essa transformação afim e a aplicação da máscara, preparávamos as faces pela criação de um padrão para que elas pudessem ser comparadas através de um método simples como o de correlação. Com o valor da correlação entre as faces calculado, utilizava-se o Kmeans para criar grupos de faces semelhantes, o que corresponderiam a faces de uma mesma pessoa. Os parágrafos abaixo explicarão com mais detalhes essas etapas.  Primeiramente, foi adicionado ao sistema uma funcionalidade que permitia extrair de todo quadro do vídeo apenas a imagem de cada face existente. Com a imagem da face; olhos, nariz e boca eram identificados usando o algoritmo de Viola e Jones com um filtro de Haar em cascata adequado para cada caso. Para diminuir a quantidade de falsos positivos para essas características faciais, foram criadas regiões de interesse para cada uma delas e o método citado era aplicado apenas nessas regiões. A partir do retângulo correspondente aos olhos e ao nariz, eram extraídas as coordenadas do centro dessas características. Na figura 1 pode-se observar as características faciais detectadas.</p>
<div id="attachment_1948" class="wp-caption aligncenter" style="width: 340px"><a href="http://www.bitabit.eng.br/wp-content/uploads/2011/03/olhosNarizBoca.png"><img class="size-full wp-image-1948" title="Olhos, Nariz e Boca" src="http://www.bitabit.eng.br/wp-content/uploads/2011/03/olhosNarizBoca.png" alt="" width="330" height="200" /></a><p class="wp-caption-text">Figura 1 - Pode-se observar o centro encontrado para o nariz, olhos e boca.</p></div>
<p>Além de útil para a próxima etapa, uma face que contém dois olhos e um nariz, é uma face ”mais frontal” do que uma que não as contém, o que é muito mais interessante para o projeto. Assim, para cada quadro do vídeo, se a imagem da face não possuísse dois olhos e um nariz, tentava-se fazer uma troca pela imagem da face do próximo quadro, contanto que nessa fossem identificadas mais características faciais. Com esse procedimento, o sistema tenta obter a melhor face possível para cada pessoa em uma tomada.  O próximo passo foi, utilizando os centros encontrados anteriormente, realizar uma transformação afim da face encontrada para uma face padrão em tons de cinza. Essa tinha um tamanho pré definido (64 <em>pixels</em> de altura e 48 de largura) e também uma posição padrão para os olhos e o nariz (olho esquerdo: (34,26); olho direito: (15,26); nariz: (24,39) ) que foi definida a partir de medições em diversas faces e baseado em proporções faciais encontradas em [1]. Com esse procedimento, tentamos eliminar problemas de translação e rotação de uma face para outra antes da etapa de correlação. Na tentativa de eliminar problemas de iluminação, foi feita uma equalização do histograma. Depois da transformação afim, também era aplicada uma máscara à imagem. Essa máscara permite comparar somente a região dos olhos e do nariz, excluindo regiões inadequadas como a boca e os cantos da imagem já que essas regiões sofrem frequentes modificações inclusive para uma mesma pessoa, o que atrapalharia o processo de cálculo da correlação com o objetivo de encontrar faces de uma mesma pessoa. Na figura 2 observa-se o processo descrito acima para trâs casos.</p>
<div id="attachment_1949" class="wp-caption aligncenter" style="width: 307px"><a href="http://www.bitabit.eng.br/wp-content/uploads/2011/03/transofrmadaMascaraFinal.png"><img class="size-full wp-image-1949 " title="Transofrmada, Mascara e Final" src="http://www.bitabit.eng.br/wp-content/uploads/2011/03/transofrmadaMascaraFinal.png" alt="" width="297" height="385" /></a><p class="wp-caption-text">Figura 2: A figura apresenta, na coluna da esquerda, a face após a transformação afim e equalização do histograma. Ao centro a máscara aplicada à imagem e na coluna da direita o resultado para a aplicação da máscara.</p></div>
<p>Até esse ponto, os problemas principais estavam relacionados a encontrar os olhos e o nariz nas faces. Nem sempre conseguíamos faces frontais em uma tomada, pois, ou ela realmente não era frontal, ou o detetor falhava, tanto não encontrando a característica desejada quanto devolvendo um falso positivo. O ajuste para esse tipo de detecção se mostrou um trabalho minucioso e longo.  Em seguida, deu-se início à próxima etapa. Ela consistiu em calcular a correlação entre todas as imagens e com esses dados, montar uma matriz. Essa matriz era passada para o Kmeans, que separava as faces em grupos, sendo que cada um desses grupos possui faces de uma mesma pessoa que apareceu em diversas tomadas do vídeo.  Durante essa parte do projeto, também foi projetado o segundo passo para a retirada de falsos positivos. O processo de correlação já implementado também foi utilizado para calcular a correlação entre a face candidata encontrada no vídeo e uma face padrão ideal composta por uma média de faces humanas. Se o valor resultante for acima de um limiar de alto valor, o candidato é aceito como face, caso contrário, é descartado por se tratar de um falso positivo.</p>
<p><span style="color: #ffffff;">.</span></p>
<p><span style="color: #ffffff;"> </span> É isso aí pessoal, encerra-se aqui essa série de quatro artigos sobre detecção e rastreamento facial dentro do contexto da criação de um hipervídeo. Espero que tenham aproveitado.</p>
<p><span style="color: #ffffff;">.</span></p>
<h2>Referências</h2>
<p>[1] R. M. Bertollo, D. L. da Silva, L. Oliveira, R. D. Bergoli, and M. G. de Oliveira. Avaliacao da harmonia facial em relacao as proporcoes divinas de fibonacci. Revista Portuguesa de Estomatologia, Medicina Dentaria e Cirurgia Maxilofacial, 49(N4), 2008.  <span style="color: #ffffff;">.</span> <span style="color: #ffffff;">.</span></p>
<h3><span style="color: #ffffff;">.</span></h3>
<h3><span style="color: #ffffff;">.</span></h3>
<h3>Artigos da série:</h3>
<p>Anterior: <a title="Como rastrear faces em vídeos?" href="http://www.bitabit.eng.br/2011/02/28/como-rastrear-faces-em-videos/" target="_self">Como rastrear faces em vídeos?</a></p>
<h3><span style="color: #ffffff;">.</span></h3>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=1916&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2011/03/07/como-classificar-faces/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Inserção simplificada de PNGs em LaTeX usando Bundles to TextMate</title>
		<link>http://www.bitabit.eng.br/2010/11/02/insercao-de-png-em-latex-usando-bunddles-to-textmate/</link>
		<comments>http://www.bitabit.eng.br/2010/11/02/insercao-de-png-em-latex-usando-bunddles-to-textmate/#comments</comments>
		<pubDate>Tue, 02 Nov 2010 12:27:40 +0000</pubDate>
		<dc:creator>Eduardo Russo, Coop10</dc:creator>
				<category><![CDATA[Coop10]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[bundle]]></category>
		<category><![CDATA[imagem]]></category>
		<category><![CDATA[latex]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[mac os x]]></category>
		<category><![CDATA[png]]></category>
		<category><![CDATA[textmate]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=1388</guid>
		<description><![CDATA[O TextMate (Mac only…) tem uns comandos (Bundles) bem úteis pra Latex. Hoje descobri que basta arrastar uma imagem para um texto &#8220;.tex&#8221; que o TM automaticamente insere o contexto da imagem, bastando alterar os textos e apertar TAB pra ir pro próximo campo. Mas, o TCC do Anauê Costa, que usei como base, tinha [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bitabit.eng.br/wp-content/uploads/2010/11/TextMate.png"><img class="alignright size-full wp-image-1399" title="TextMate" src="http://www.bitabit.eng.br/wp-content/uploads/2010/11/TextMate.png" alt="" width="128" height="128" /></a>O <a href="http://macromates.com/" target="_blank">TextMate</a> (Mac only…) tem uns comandos (<a href="http://manual.macromates.com/en/bundles" target="_blank">Bundles</a>) bem úteis pra <a href="http://www.tug.org/mactex/" target="_blank">Latex</a>. Hoje descobri  que basta arrastar uma imagem para um texto &#8220;.tex&#8221; que o TM  automaticamente insere o contexto da imagem, bastando alterar os textos e  apertar TAB pra ir pro próximo campo.</p>
<p>Mas, o TCC do <a href="http://twitter.com/#!/anauecosta" target="_blank">Anauê Costa</a>, que usei como base, tinha um &#8220;\newcommand&#8221; que simplificava o processo de inserção de imagens (adicione isso nas definições do seu LaTeX):</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="latex" style="font-family:monospace;"><span style="color: #E02020; ">\</span><span style="color: #800000;">newcommand</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #800000; font-weight: normal;">\inputpng</span></span><span style="color: #E02020; ">}[</span><span style="color: #C08020; font-weight: normal;">4</span><span style="color: #E02020; ">]{</span><span style="color: #2C922C; font-style: italic;">%</span>
 <span style="color: #C00000; font-weight: normal;">\begin</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #0000D0; font-weight: normal;">figure</span></span><span style="color: #E02020; ">}[</span><span style="color: #C08020; font-weight: normal;">!htb</span><span style="color: #E02020; ">]</span>
 <span style="color: #E02020; ">\</span><span style="color: #800000;">centering</span>
 <span style="color: #E02020; ">\</span><span style="color: #800000;">includegraphics</span><span style="color: #E02020; ">[</span><span style="color: #C08020; font-weight: normal;">width=#4\<span style="color: #800000;">textwidth</span></span><span style="color: #E02020; ">]{</span><span style="color: #2020C0; font-weight: normal;">#1.png</span><span style="color: #E02020; ">}</span>
 <span style="color: #E02020; ">\</span><span style="color: #800000;">caption</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #800000; font-weight: normal;">\it</span> #3.</span><span style="color: #E02020; ">}</span>
 <span style="color: #E02020; ">\</span><span style="color: #800000;">label</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;">fig:#2</span><span style="color: #E02020; ">}</span>
 <span style="color: #C00000; font-weight: normal;">\end</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #0000D0; font-weight: normal;">figure</span></span><span style="color: #E02020; ">}</span>
 <span style="color: #E02020; ">}</span></pre></td></tr></table></div>

<p>então, em vez de:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="latex" style="font-family:monospace;"><span style="color: #E02020; ">\</span><span style="color: #800000;">includegraphics</span><span style="color: #E02020; ">[</span><span style="color: #C08020; font-weight: normal;">width=1.0\<span style="color: #800000;">textwidth</span></span><span style="color: #E02020; ">]{</span><span style="color: #2020C0; font-weight: normal;">figuras/p-30-1-multiplataforma-marketshare_gartner.png</span><span style="color: #E02020; ">}</span>
 <span style="color: #E02020; ">\</span><span style="color: #800000;">caption</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;">caption</span><span style="color: #E02020; ">}</span>
 <span style="color: #E02020; ">\</span><span style="color: #800000;">label</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;">fig:figuras_p-30-1-multiplataforma-marketshare_gartner</span><span style="color: #E02020; ">}</span>
 <span style="color: #C00000; font-weight: normal;">\end</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #0000D0; font-weight: normal;">figure</span></span><span style="color: #E02020; ">}</span></pre></td></tr></table></div>

<p>você fica com:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="latex" style="font-family:monospace;"><span style="color: #800000; font-weight: normal;">\inputpng</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;">figuras/p-30-1-multiplataforma-marketshare_gartner</span><span style="color: #E02020; ">}{</span><span style="color: #2020C0; font-weight: normal;">figuras_p-30-1-multiplataforma-marketshare_gartner</span><span style="color: #E02020; ">}{</span><span style="color: #2020C0; font-weight: normal;">caption</span><span style="color: #E02020; ">}{</span><span style="color: #2020C0; font-weight: normal;">1.0</span><span style="color: #E02020; ">}</span></pre></td></tr></table></div>

<p>Fiz então uma alteração no comando de inserção de imagem pra ele gerar o novo tipo quando arrastar uma imagem.</p>
<p>Para inseri-lo, no TM, aperte <strong>CMD+OPTION+CNTRL+B</strong>. Isso abrirá o editor de bundles.</p>
<p>Troque de &#8220;<em>show all</em>&#8221; para &#8220;<em>drag commands</em>&#8220;, vá até &#8220;LaTeX&#8221; e selecione o &#8220;<em>Include Image</em>&#8220;.</p>
<p>Tire a extensão &#8220;png&#8221; de lá, já que o comando novo só serve para PNG!</p>
<p>Agora clique no botão de + e adicione um &#8220;<em>New Drag Command</em>&#8221;</p>
<p>chame como quiser… adicione a extensão PNG e cole o código abaixo nele:</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
20
21
22
23
24
25
26
27
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#!/usr/bin/env ruby</span>
 <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'pathname'</span>
 <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;#{ENV['TM_BUNDLE_SUPPORT']}/lib/LaTeXUtils.rb&quot;</span>
 filename = ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;TM_DROPPED_FILEPATH&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
 relative_to = ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;TM_DIRECTORY&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
 startfile = ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'TM_LATEX_MASTER'</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">||</span> ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'TM_FILEPATH'</span><span style="color:#006600; font-weight:bold;">&#93;</span>
 master = <span style="color:#CC00FF; font-weight:bold;">Pathname</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>LaTeX.<span style="color:#9900CC;">master</span><span style="color:#006600; font-weight:bold;">&#40;</span>startfile<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
 <span style="color:#9966CC; font-weight:bold;">unless</span> master.<span style="color:#9900CC;">absolute</span>?
 master = master.<span style="color:#9900CC;">expand_path</span><span style="color:#006600; font-weight:bold;">&#40;</span>ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'TM_PROJECT_DIRECTORY'</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
 <span style="color:#9966CC; font-weight:bold;">end</span>
 path = <span style="color:#CC00FF; font-weight:bold;">Pathname</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">relative_path_from</span><span style="color:#006600; font-weight:bold;">&#40;</span>master.<span style="color:#9900CC;">dirname</span><span style="color:#006600; font-weight:bold;">&#41;</span>
 <span style="color:#9966CC; font-weight:bold;">case</span> ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'TM_MODIFIER_FLAGS'</span><span style="color:#006600; font-weight:bold;">&#93;</span>
 <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#006600; font-weight:bold;">/</span>OPTION<span style="color:#006600; font-weight:bold;">/</span>
 <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;<span style="color:#000099;">\\</span><span style="color:#000099;">\\</span>begin{center}&quot;</span>,
 <span style="color:#996600;">&quot; <span style="color:#000099;">\\</span><span style="color:#000099;">\\</span>includegraphics[height=<span style="color:#000099;">\$</span>{1:3in}]{#{path}}&quot;</span>,
 <span style="color:#996600;">&quot;<span style="color:#000099;">\\</span><span style="color:#000099;">\\</span>end{center}&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;<span style="color:#000099;">\n</span>&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
 <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#006600; font-weight:bold;">/</span>SHIFT<span style="color:#006600; font-weight:bold;">/</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;<span style="color:#000099;">\\</span><span style="color:#000099;">\\</span>begin{figure}[<span style="color:#000099;">\$</span>{1:htbp}]&quot;</span>,
 <span style="color:#996600;">&quot;    <span style="color:#000099;">\\</span><span style="color:#000099;">\\</span>centering&quot;</span>,
 <span style="color:#996600;">&quot;        <span style="color:#000099;">\\</span><span style="color:#000099;">\\</span>includegraphics[height=<span style="color:#000099;">\$</span>{2:3in}]{#{path}}&quot;</span>,
 <span style="color:#996600;">&quot;    <span style="color:#000099;">\\</span><span style="color:#000099;">\\</span>caption{<span style="color:#000099;">\$</span>{4:caption}}&quot;</span>,
 <span style="color:#996600;">&quot;    <span style="color:#000099;">\\</span><span style="color:#000099;">\\</span>label{fig:<span style="color:#000099;">\$</span>{5:#{path.to_s.gsub(/(<span style="color:#000099;">\.</span>[^.]*$)|(<span style="color:#000099;">\.</span><span style="color:#000099;">\.</span><span style="color:#000099;">\/</span>)/,&quot;</span><span style="color:#996600;">&quot;).gsub(/<span style="color:#000099;">\/</span>/,&quot;</span>_<span style="color:#996600;">&quot;)}}}&quot;</span>,
 <span style="color:#996600;">&quot;<span style="color:#000099;">\\</span><span style="color:#000099;">\\</span>end{figure}&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;<span style="color:#000099;">\n</span>&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
 <span style="color:#9966CC; font-weight:bold;">else</span>
 <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;<span style="color:#000099;">\\</span><span style="color:#000099;">\\</span>inputpng{#{path.to_s.gsub(&quot;</span>.<span style="color:#9900CC;">png</span><span style="color:#996600;">&quot;, &quot;</span><span style="color:#996600;">&quot;)}}{<span style="color:#000099;">\$</span>{1:#{path.to_s.gsub(/(<span style="color:#000099;">\.</span>[^.]*$)|(<span style="color:#000099;">\.</span><span style="color:#000099;">\.</span><span style="color:#000099;">\/</span>)/,&quot;</span><span style="color:#996600;">&quot;).gsub(/<span style="color:#000099;">\/</span>/,&quot;</span>_<span style="color:#996600;">&quot;)}}}{<span style="color:#000099;">\$</span>{2:caption}}{<span style="color:#000099;">\$</span>{3:1.0}<span style="color:#000099;">\}</span>&quot;</span>
 <span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Adicione também no &#8220;<em>Scope Selector</em>&#8221; o seguinte:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">text.tex.latex</pre></td></tr></table></div>

<p>Com isso, sempre que você arrastar um PNG pro .tex, ele já vai gerar o código <em>automagicamente</em>!</p>
<p>Segue a imagem de como ficou aqui.</p>
<p style="text-align: left;">
<div id="attachment_1389" class="wp-caption aligncenter" style="width: 606px"><a href="http://www.bitabit.eng.br/wp-content/uploads/2010/11/textmate-latex-image-bunddle.png"><img class="size-full wp-image-1389   " title="textmate-latex-image-bundle" src="http://www.bitabit.eng.br/wp-content/uploads/2010/11/textmate-latex-image-bunddle.png" alt="" width="596" height="392" /></a><p class="wp-caption-text">Novo Bundle do TextMate para inserção de imagem em Latex.</p></div>
<p>Para inserir &#8220;PNGs&#8221; da forma &#8220;original&#8221;, basta pressionar <strong>SHIFT</strong> quando arrastar a imagem.</p>
<p>Observação: Esse é um post transcrito de um e-mail, na pressa, no meio  da correria de escrever o TCC da Poli, então, não está bem formatado,  cheio de imagens ilustrativas ou coisas do tipo… sorry <img src='http://www.bitabit.eng.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=1388&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2010/11/02/insercao-de-png-em-latex-usando-bunddles-to-textmate/feed/</wfw:commentRss>
		<slash:comments>3</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. [...]]]></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>8</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 libxslt
<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;">id</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>9</slash:comments>
		</item>
		<item>
		<title>Instalando o OpenCV 1.1 no Ubuntu 8.10, 9.04 e 9.10</title>
		<link>http://www.bitabit.eng.br/2010/02/17/instalando-o-opencv-1-1-no-ubuntu-8-10-9-04-e-9-10/</link>
		<comments>http://www.bitabit.eng.br/2010/02/17/instalando-o-opencv-1-1-no-ubuntu-8-10-9-04-e-9-10/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 15:06:31 +0000</pubDate>
		<dc:creator>Filipe M. S. de Campos, Coop10</dc:creator>
				<category><![CDATA[Coop10]]></category>
		<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Outros]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Visão Computacional]]></category>
		<category><![CDATA[computer vision]]></category>
		<category><![CDATA[Ctypes OpenCV]]></category>
		<category><![CDATA[instalação]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[OpenCV]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[visão computacional]]></category>
		<category><![CDATA[wrapper]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=966</guid>
		<description><![CDATA[Logo do OpenCV Neste post irei dividir com você as experiências que já tive com a instalação da bibliteca OpenCV no Ubuntu. Vou relatar o processo de instalação do OpenCV 1.1 nas versões 8.10, 9.04 e 9.10 do Ubuntu. Apesar do OpenCV ser tipicamente utilizado com C ou C++, também é possível utilizá-lo com Python (ou Octave) graças [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_976" class="wp-caption alignright" style="width: 190px"><br />
<img class="size-medium wp-image-976 " title="OpenCV logo" src="http://www.bitabit.eng.br/wp-content/uploads/2010/02/opencv_logo-300x277.gif" alt="Logo do OpenCV" width="180" height="166" /><p class="wp-caption-text">Logo do OpenCV</p></div>
<p>Neste <em>post</em> irei dividir com você as experiências que já tive com a instalação da bibliteca <a title="OpenCV Wiki" href="http://opencv.willowgarage.com/wiki/" target="_blank">OpenCV</a> no Ubuntu. Vou relatar o processo de instalação do <a title="OpenCV11 - Download" href="http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/1.1pre1/opencv-1.1pre1.tar.gz/download" target="_blank">OpenCV 1.1</a> nas versões 8.10, 9.04 e 9.10 do Ubuntu.</p>
<p>Apesar do OpenCV ser tipicamente utilizado com C ou C++, também é possível utilizá-lo com Python (ou Octave) graças aos wrappers criados por <a title="Ctypes OpenCV" href="http://code.google.com/p/ctypes-opencv/" target="_blank">terceiros</a> ou ao que já acompanha a versão 1.1 da biblioteca.  Neste texto, focarei a instalação para o uso de Python com o wrapper <a title="Ctypes OpnCV" href="http://code.google.com/p/ctypes-opencv/" target="_blank">Ctypes OpenCV</a>.  Por que o Ctypes OpenCV? Pois o que acompanha a biblioteca me &#8220;deixou na mão&#8221; durante o desenvolvimento do último projeto.</p>
<p><span style="color: #ffffff;">.<br />
</span></p>
<h2><span style="color: #ffffff;"><strong><span style="color: #000000;">Passo zero:</span></strong></span></h2>
<p>(vale para todos as três versões do Ubuntu)</p>
<ul>
<li>O OpenCV, funciona com Python, apenas para as versões 2.5.x ou 2.6.x da linguagem. A versão 3.x ainda não tem suporte oficial. Logo, verifique se você possui ele instalado em seu computador, caso contrário, instale o Python 2.6.4.</li>
<li>Mais umas coisinhas a serem instaladas. Digite no terminal (Aplicativos -&gt; Acessórios -&gt; Terminal) o comando abaixo. Sim, são várias coisas. Algumas são realmente requisitos para a instalação, outras servem apenas para diminuirmos chances de problemas depois. Instale, não dói nada <img src='http://www.bitabit.eng.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<pre class="brush: plain; light: true; title: ; notranslate"> sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev
libavformat-dev libavfilter-dev libswscale-dev libtiff-dev libjasper libgstreamer0.10-dev
libxine-dev libunicap-dev libdc1394-22-dev swig ffmpeg mplayer vlc </pre>
<ul>
<li> Baixe o <a title="OpenCV - Download" href="http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/1.1pre1/opencv-1.1pre1.tar.gz/download" target="_blank">OpenCV 1.1</a>, o <a title="Ctypes OpenCV - Download" href="http://ctypes-opencv.googlecode.com/files/ctypes-opencv-0.8.0-src.7z" target="_blank">Ctypes-OpenCV</a> e os <a title="Ctypes OpenCV - Exemplos" href="http://ctypes-opencv.googlecode.com/files/ctypes-opencv-0.8.0-demo.7z" target="_self">exemplos de códigos</a> do Ctypes OpenCV, você vai querer testar e consultar depois.</li>
</ul>
<p><span style="color: #ffffff;">.</span></p>
<h2>Ubuntu 8.10:</h2>
<p>Nesta versão do Ubuntu, a instalação é bem simples e funciona bem. <img src='http://www.bitabit.eng.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   Basta seguir os passos abaixo:</p>
<ul>
<li>Após o passo zero, no início desse <em>post</em>, descomprima o OpenCV e, pelo terminal,  entre na pasta criada. Se ela estiver em seu desktop, será algo próximo a:</li>
</ul>
<pre class="brush: plain; light: true; title: ; notranslate"> cd Desktop/opencv-1.1.0 </pre>
<ul>
<li>Agora, digite:</li>
</ul>
<pre class="brush: plain; light: true; title: ; notranslate"> ./configure --disable-sse2 --with-python --with-swig --with-ffmpeg </pre>
<p>Obs.: Para processadores antigos, como o AMD de uns quase dez anos atrás que usei no laboratório, era necessários desativar instruções do tipo <a title="Instruções SSE2" href="http://en.wikipedia.org/wiki/SSE2" target="_blank">SSE2</a>, caso contrário, ao rodar algum programa que usasse o OpenCV você obteria a mensagem: Illegal instruction. Eu não expliquei isso antes de você escrever o comando pois obtive problemas com os wrappers de python caso não desativasse esse tipo de instrução no Ubuntu 9.04 e 9.10, imagino que na versão 8.10 isso também ocorra apesar de não ter testado. Então, se você irá usar o OpenCV com C ou C++, não existe necessidade do &#8211;disable-sse2, caso contrário, é melhor desativar esse tipo de instrução.</p>
<ul>
<li>Agora preste atenção ao pequeno relatório que apareceu em seu terminal. Verifique, principalmente, se o python e o ffmpeg estão com &#8220;<em>yes</em>&#8220;. Seu relatório deve se parecer bastante como o da figura abaixo:</li>
</ul>
<div id="attachment_977" class="wp-caption aligncenter" style="width: 450px"><img class="size-full wp-image-977  " title="Relatório do configure" src="http://www.bitabit.eng.br/wp-content/uploads/2010/02/saida-do-configure-OK.png" alt="Relatório do configure com as opções corretamente marcadas." width="440" height="389" /><p class="wp-caption-text">Figura 1 - Relatório do configure com as opções corretamente marcadas.</p></div>
<p>Caso o Python ou o ffmpeg não tenham aparecido com o &#8220;<em>yes</em>&#8220;, tente as soluções mostradas nas outras versões do Ubuntu que estão abaixo.</p>
<ul>
<li>Agora, digite:</li>
</ul>
<pre class="brush: plain; light: true; title: ; notranslate"> make </pre>
<ul>
<li>Depois que terminar, digite:</li>
</ul>
<pre class="brush: plain; light: true; title: ; notranslate"> sudo make install </pre>
<h3>Será que funcionou? Vamos testar.</h3>
<p>O OpenCV acompanha alguns programas exemplo, tanto em C quanto em Python, para você testar a instalação e aprender a usar a biblioteca.  Siga os passos abaixo.</p>
<ul>
<li>Se sua pasta do OpenCV estiver no desktop, digite:</li>
</ul>
<pre class="brush: plain; light: true; title: ; notranslate"> cd Desktop/opencv-1.1.0/samples/c </pre>
<ul>
<li>Agora compile os exemplos com:</li>
</ul>
<pre class="brush: plain; light: true; title: ; notranslate"> . build_all.sh </pre>
<ul>
<li>Agora rode um dos programas:</li>
</ul>
<pre class="brush: plain; light: true; title: ; notranslate"> ./delaunay </pre>
<p>Se surgiu uma nova janela e &#8220;coisas coloridas&#8221; estão aparecendo nela, a biblioteca foi instalada com sucesso.</p>
<h3>Instalando o Ctypes OpenCV</h3>
<p>Será bem simples. Descomprima o arquivo que você ja baixou no passo zero para o desktop e, pelo terminal, entre na pasta <em>src</em>. Após isso, digite:</p>
<pre class="brush: plain; light: true; title: ; notranslate"> sudo python setup.py install </pre>
<p>Depois de instalado, veja os exemplos que você também baixou do Ctypes OpenCV no passo zero. Dê duplo clique em algum deles, por exemplo o delaunay.py. Ou então rode via terminal com o comando</p>
<pre class="brush: plain; light: true; title: ; notranslate"> python delaunay.py </pre>
<p><span style="color: #ffffff;">.</span></p>
<h2>Ubuntu 9.04:</h2>
<p>Nessa versão do Ubuntu as coisas já não são mais tão simples. Apesar do processo de instalação ser o mesmo da versão 8.10, surgem alguns problemas no meio do caminho.</p>
<p><strong>Primeiro problema</strong>:  O Python não é reconhecido ao rodar o <em>configure</em>.</p>
<p>Se você rodar o <em>configure</em>, verá que no relatório que ele exibe aparece &#8220;<em>no</em>&#8221; para o Python. Se você verficar melhor a saída completa verá:</p>
<div id="attachment_1010" class="wp-caption aligncenter" style="width: 745px"><img class="size-full wp-image-1010" title="Problema com o Python" src="http://www.bitabit.eng.br/wp-content/uploads/2010/02/problema-com-o-python.png" alt="Figura 2 - Problema com o Python" width="735" height="260" /><p class="wp-caption-text">Figura 2 - Problema com o Python</p></div>
<p><strong>Resolução</strong>:  Provavelmente deve existir uma solução melhor, mas esta funcionou para mim. Baixei o <em>source</em> do <a title="Python 2.6.4 - Download" href="http://www.python.org/ftp/python/2.6.4/Python-2.6.4.tgz" target="_blank">Python 2.6.4</a>, compilei e reinstalei via terminal, da seguinte forma:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
./configure
make
sudo make install
</pre>
<p>Obs.: Se seu computador não possuir suporta a instruções SSE2, utilize para o primeiro comando: ./configure &#8211;diable-sse2</p>
<p><span style="color: #ffffff;">.</span></p>
<p><strong>Segundo problema</strong>:  O ffmpeg não é reconhecido ao rodar o <em>configure</em>. Resultado, não é possível manipular vídeos com a biblioteca.</p>
<p>Se você rodar o <em>configure</em>, verá que é exibido &#8220;<em>no</em>&#8220; para o ffmpeg no relatório. Se você verficar melhor a saída completa verá:</p>
<div id="attachment_1011" class="wp-caption aligncenter" style="width: 401px"><img class="size-full wp-image-1011" title="Problema com o ffmpeg" src="http://www.bitabit.eng.br/wp-content/uploads/2010/02/problema-com-o-ffmpeg.png" alt="Figura 3 - Problema com o ffmpeg" width="391" height="88" /><p class="wp-caption-text">Figura 3 - Problema com o ffmpeg</p></div>
<p><strong>Resolução</strong>: Basta seguir os passos abaixo em seu terminal:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
sudo mkdir /usr/include/ffmpeg
cd /usr/include/ffmpeg
sudo ln -s ../libavcodec/avcodec.h avcodec.h
sudo ln -s ../libavformat/avformat.h avformat.h
sudo ln -s ../libavformat/avio.h avio.h
sudo ln -s ../libavutil/avutil.h avutil.h
sudo ln -s ../libswscale/swscale.h swscale.h
</pre>
<p>Com os problemas resolvidos, e o passo zero realizado, siga o procedimento básico da instalação.</p>
<pre class="brush: plain; light: true; title: ; notranslate"> ./configure --disable-sse2 --with-python --with-swig --with-ffmpeg --enable-swscale --enable-shared </pre>
<p>Antes dos próximos comandos, não esqueça de verificar no relatório do <em>configure</em> se o python e o ffmpeg estão com &#8220;<em>yes</em>&#8220;. Seu relatório deve se parecer bastante como o da Figura 1 desse <em>post</em>.</p>
<pre class="brush: plain; light: true; title: ; notranslate">
make
sudo make install
</pre>
<p>Ao terminar, teste e instale o Ctypes OpenCV para programar com Python. Para isso, siga as instruções dos tópicos &#8220;<strong>Será que funcionou? Vamos testar.</strong>&#8221; e &#8220;<strong>Instalando o Ctypes Opencv</strong>&#8221; que estão na instalação para o Ubuntu 8.10, acima neste mesmo <em>post.</em></p>
<p><span style="color: #ffffff;">.</span></p>
<h2 style="font-size: 1.5em;">Ubuntu 9.10:</h2>
<p>Nessa versão, existe mais um problema além dos já existentes para o Ubuntu 9.04.</p>
<p><strong>Problema</strong>: Erro durante a compilação do código.</p>
<p><strong>Resolução</strong>: Entre na pasta que você descomprimiu o OpenCV1.1, vá em <em>cxcore</em>, <em>include</em> e abra o arquivo <em>cxmisc.h</em>. Na linha 133, troque o</p>
<pre class="brush: plain; light: true; title: ; notranslate">#elif</pre>
<p>por:</p>
<pre class="brush: plain; light: true; title: ; notranslate">#else</pre>
<p>Para completar a instalação, basta seguir o texto acima sobre a instalação no Ubuntu 9.04.</p>
<p><span style="color: #ffffff;">.</span></p>
<p><span style="color: #ffffff;">.</span></p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=966&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2010/02/17/instalando-o-opencv-1-1-no-ubuntu-8-10-9-04-e-9-10/feed/</wfw:commentRss>
		<slash:comments>5</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 [...]]]></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>5</slash:comments>
		</item>
		<item>
		<title>JavaScript para focar itens pelo tabindex</title>
		<link>http://www.bitabit.eng.br/2009/10/25/javascript-para-focar-itens-pelo-tabindex/</link>
		<comments>http://www.bitabit.eng.br/2009/10/25/javascript-para-focar-itens-pelo-tabindex/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 19:10:22 +0000</pubDate>
		<dc:creator>Eduardo Russo, Coop10</dc:creator>
				<category><![CDATA[Coop10]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[foco]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[tabindex]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=191</guid>
		<description><![CDATA[Sempre quis que páginas de formulários focassem no primeiro <strong>tabindex</strong> automaticamente... mas nunca achei algo na internet que fizesse isso de maneira fácil e intuitiva...

Após um pouco de pesquisa, consegui desenvolver um <strong>JavaScript</strong> bem símples que faz isso.]]></description>
			<content:encoded><![CDATA[<p>Sempre quis que páginas de formulários focassem no primeiro <strong>tabindex</strong> automaticamente&#8230; mas nunca achei algo na internet que fizesse isso de maneira fácil e intuitiva&#8230;</p>
<p>Após um pouco de pesquisa, consegui desenvolver um <strong>JavaScript</strong> bem símples que faz isso.</p>
<p>O primeiro passo, é setar a ordem desejada dos <strong>tabindex</strong>&#8230; é só colocar nos campos do formulário a ordem desejada, começando por 1&#8230; Isso faz com que o pressionar da tecla TAB siga a ordem desejada.</p>
<p>Após isso, basta usar esse <strong>JavaScript</strong>, passando o <strong>tabindex</strong> desejado como parâmetro&#8230; símples e fácil.</p>
<pre class="brush: jscript; title: ; notranslate">function focusPorTabIndex(index){
	//Varre todos os campos que foram setados com tabindex
	for(var i = 0; i &amp;amp;amp;amp;lt; document.mainOutputForm.elements.length; i++){
		//verifica se o tabindex setado é o desejado
		if (document.mainOutputForm.elements[i].tabIndex == index){
			//se for, seta o foco para ele
			document.mainOutputForm.elements[i].focus();
		}
	}
}</pre>
<p>OBS: <strong>mainOutputForm é o nome do seu formulário!</strong></p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=191&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2009/10/25/javascript-para-focar-itens-pelo-tabindex/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

