<?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>Herberth Amaral</title>
	<atom:link href="http://herberthamaral.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://herberthamaral.com</link>
	<description>Software development adventures</description>
	<lastBuildDate>Fri, 12 Mar 2010 00:08:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>O que fazer quando seu codigo JavaScript se torna um monstro</title>
		<link>http://herberthamaral.com/2010/03/o-que-fazer-quando-seu-codigo-javascript-se-torna-um-monstro/</link>
		<comments>http://herberthamaral.com/2010/03/o-que-fazer-quando-seu-codigo-javascript-se-torna-um-monstro/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 00:08:57 +0000</pubDate>
		<dc:creator>Herberth Amaral</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[dica]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://herberthamaral.com/?p=275</guid>
		<description><![CDATA[Quando eu não conhecia jQuery e seus plugins, JavaScript era um tédio pra mim. É fato que uma biblioteca de alto nível (não só o jQuery, mas o mootools e o prototype, por exemplo) facilitam e deixam o desenvolvimento em JavaScript rápido e divertido, pois você não terá que se preocupar (muito) com detalhes de [...]]]></description>
			<content:encoded><![CDATA[<p>Quando eu não conhecia jQuery e seus plugins, JavaScript era um tédio pra mim. É fato que uma biblioteca de alto nível (não só o jQuery, mas o mootools e o prototype, por exemplo) facilitam e deixam o desenvolvimento em JavaScript rápido e divertido, pois você não terá que se preocupar (muito) com detalhes de implementação de browsers.</p>
<p>Mas o que acontece quando, mesmo usando com alguma lib fodástica, seu código começa a ficar grande demais, complexo demais, fragmentado demais ou desorganizado demais? Isso é a minha definição de código monstro. Eis algumas dicas que podem te ajudar se você estiver passando por isso:</p>
<p><strong>1 - Evite o Callback Hell </strong></p>
<p>O jQuery mostra muitos exemplos usando funções anônimas como callback. De certo modo, isso é uma boa prática para situações simples, como o  tratamento do evento clique de um botão:</p>
<pre class="brush:javascript">$("#meuBotao").click(function(){
  alert('Fui clicado!');
});</pre>
<p>Mas nem sempre isso é legal: muitas vezes você quer reaproveitar essa função para outros callbacks, como por exemplo:</p>
<pre class="brush:javascript">$('#meuBotao').click(getClientes);
$('#meuInput').blur(getClientes);

getClientes = function()
{
   $.get('/clientes/get','',
   function(data){
      //trata os dados recebidos aqui
   },'json')
}</pre>
<p>Nesse caso, eu estou aproveitando minha função de callback getClientes para dois event listeners. Isso é bem legal, mas quando nosso código começa a crescer, nos esbarramos em outro problema: as funções globais.</p>
<p><strong>2 - Evite funções globais</strong></p>
<p>Isso quer dizer, ao invés disso:</p>
<pre class="brush:javascript">$('#meuBotao').click(getClientes);
$('#meuInput').blur(getClientes);

getClientes = function()
{
   $.get('/clientes/get','',
   function(data){
      //trata os dados recebidos aqui
   },'json');
};</pre>
<p>Faça algo assim:</p>
<pre class="brush:javascript">$('#meuBotao').click(getClientes);

$('#meuInput').blur(Clientes.getClientes);

var Clientes = {
    getClientes:function()
    {
       $.get('/clientes/get','',
       function(data){
          //trata os dados recebidos aqui
       },'json');
    }
};</pre>
<p>Isto é, coloque suas funções dentro de objetos. Assim você evita funções globais e evita fazer código "estruturado", passando a usar os recursos da orientação à objetos do JavaScript e deixando o mínimo de globals possível. Essa é a forma mais fácil que eu conheço de se evitar funções globais e organizar melhor seu código, mas há outras formas como o <a href="http://yuiblog.com/blog/2007/06/12/module-pattern/" target="_blank">Module Pattern</a>.</p>
<p><strong>3 - O "this" aponta para diferentes lugares em diferentes contextos. Saiba como lidar com isso.</strong></p>
<p>Você não está deixando mais todas as suas funções como globais, está encapsulando tudo dentro de objetos, reaproveitando código e feliz da vida quando percebe que o this não é mais this. Calma que eu explico.</p>
<p>Você já deve ter visto algo assim no jQuery:</p>
<pre class="brush:javascript">$('a').click(function(){
   $(this).html('fui clicado') ;
});</pre>
<p>Isso faz com que, quando um link é clicado, o mesmo fique com o texto "fui clicado". Deu pra notar que nesse caso, o this aponta para o elemento que disparou o evento. Mas olhe o seguinte exemplo:</p>
<pre class="brush:javascript">var Cliente =
{
    texto:'Fui clicado',
    init:function()
    {
        $('a').click(this.aClickHandler); //this aponta para o objeto Cliente
    },
    aClickHandler:function()
    {
        $(this).html(Cliente.texto); //this aponta para o elemento "a" que disparou o evento
    }
};</pre>
<p>Viu como "this" pode mudar de contexto? No exemplo acima, o problema de não ter o this apontando para o objeto Cliente foi facilmente contornado, mas você poderá precisar acessar o objeto pai de uma forma parecida com a this. Nesse caso, você pode passar um parâmetro para o evento usando o método bind() do jQuery, informando o contexto que ele foi chamado:</p>
<pre class="brush:javascript">var Cliente =
{
    texto:'Fui clicado',
    init:function()
    {
        $('a').bind('click',{'self':this},this.aClickHandler); //this aponta para o objeto Cliente
    },
    aClickHandler:function(event)
    {
        var self = event.data.self;
        $(this).html(self.texto); //o self aponta para Cliente e o this aponta para o elemento "a" que disparou o evento
    }
};</pre>
<p><strong>4 - Procure pelos patterns corretos.</strong></p>
<p>Quem disse que padrões de projeto criam um vocabulário em comum na equipe não poderia ter dito algo mais pertinente:  o uso de padrões faz com que o desenvolvedor foque nas funcionalidades da aplicação sem se preocupar com alguns detalhes de implementação.</p>
<p>O <a href="http://ajaxpatterns.org/" target="_blank">AjaxPatterns</a> contém uma coleção bem legal e bem documentadas de patterns para Ajax e JavaScript em geral. Mas não espere ter problemas pra consultar os patterns: quanto mais se conhece sobre padrões, mais fácil é pensar em soluções de problemas e planejamento em geral.</p>
<p><strong>5 - Deixe apenas um $(document).ready em todo o seu código</strong></p>
<p>Eu diria isso para todos os event listeners que você possa vir a colocar, mas o $(document).ready é o mais crítico na minha opinião. No JavaScript não há sobreposição de eventos: se você colocar dos event listeners para um mesmo evento, os dois serão executados. Isso pode dar problemas, pois você pode deixar o $(docuement).ready em dois arquivos diferentes e você pode desejar que um evento execute antes de outro.</p>
<p><strong>6 - Valide seu JavaScript</strong></p>
<p>Browsers interpretam JavaScript de forma diferente, então é sempre bom ter uma padronização de código para que não tenhamos problemas com sintaxe em diferentes browsers. Uma ferramenta de validação bem legal é o <a href="http://www.jslint.com/" target="_blank">jslint</a>.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fherberthamaral.com%2F2010%2F03%2Fo-que-fazer-quando-seu-codigo-javascript-se-torna-um-monstro%2F&amp;linkname=O%20que%20fazer%20quando%20seu%20codigo%20JavaScript%20se%20torna%20um%20monstro"><img src="http://herberthamaral.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://herberthamaral.com/2010/03/o-que-fazer-quando-seu-codigo-javascript-se-torna-um-monstro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criando Web crawlers em Python – Parte II</title>
		<link>http://herberthamaral.com/2010/03/criando-web-crawlers-em-python-parte-ii/</link>
		<comments>http://herberthamaral.com/2010/03/criando-web-crawlers-em-python-parte-ii/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 13:08:50 +0000</pubDate>
		<dc:creator>Herberth Amaral</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[crawler]]></category>
		<category><![CDATA[pyton]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://herberthamaral.com/?p=257</guid>
		<description><![CDATA[No post anterior, eu mostrei como recuperar informações básicas de uma página da Web usando urllib, urllib2 e BeautifulSoup. Neste post eu mostrarei como enviar dados via GET e POST.
Há um excelente guia sobre urllib2: o urllib2 - The Missing Manual que foi de grande valia nos meus estudos. Nele, pode-se encontrar as informações sobre [...]]]></description>
			<content:encoded><![CDATA[<p>No <a href="http://herberthamaral.com/2010/02/criando-web-crawlers-em-python-parte-i/" target="_blank">post anterior</a>, eu mostrei como recuperar informações básicas de uma página da Web usando urllib, urllib2 e <a href="http://www.crummy.com/software/BeautifulSoup/" target="_blank">BeautifulSoup</a>. Neste post eu mostrarei como enviar dados via GET e POST.</p>
<p>Há um excelente guia sobre urllib2: o <a href="http://www.voidspace.org.uk/python/articles/urllib2.shtml" target="_blank">urllib2 - The Missing Manual</a> que foi de grande valia nos meus estudos. Nele, pode-se encontrar as informações sobre envio de informações do tipo GET e POST para o servidor. Isso será útil, pois é assim que a busca do <a href="http://sf.net">SourceForge</a> (e da maioria dos outros portais) funcionam.</p>
<p>Vamos dar uma olhada na URL do na pesquisa por "Python" no SF:</p>
<pre>http://sourceforge.net/search/?type_of_search=soft&amp;words=python</pre>
<p>Bem, isso indica que temos que enviar duas variáveis para o SF.net: <em>type_of_search</em> (sempre igual à soft) e <em>words</em> (que é a nossa busca). Um exemplo de código que faria essa busca poderia ser esse:</p>
<pre class="brush:python">import urllib,urllib2

base_url = 'http://sourceforge.net'
busca = raw_input('Pesquisar por: ')

variaveis_get = urllib.urlencode({'type_of_search':'soft','words':busca})
req = urllib2.Request(base_url+'/search/',variaveis_get)
response = urllib2.urlopen(req).read()
print response</pre>
<p>Se der tudo certo, você  deveráver  o código fonte da página do SF que contém os resultados da pesquisa.</p>
<p>Feito isso, vamos analisar como a marcação do SF é organizada na busca:</p>
<p style="text-align: center;"><a href="http://herberthamaral.com/wp-content/uploads/2010/03/Screenshot-SourceForge.net-Software-Search-Mozilla-Firefox.png"><img class="aligncenter size-full wp-image-265" title="Resultados da busca no SF.net por Python" src="http://herberthamaral.com/wp-content/uploads/2010/03/Screenshot-SourceForge.net-Software-Search-Mozilla-Firefox.png" alt="" width="994" height="607" /></a></p>
<p style="text-align: left;">O <a href="http://getfirebug.com/">Firebug</a> nos ajuda a não perder tanto tempo assim analisando código. De acordo com o que pudemos obter, podemos dividir as informações que queremos dessa forma:</p>
<ul>
<li>O resultado da busca está dentro de uma tabela com o id="searchtable".</li>
<li>Um resultado da busca está sempre dentro de um td com classe description.</li>
<li>O nome do projeto está dentro de um link dentro de um h2 dentro desse td "description".</li>
<li>O link de download se encontra na próxima td da mesma linha da tabela.</li>
</ul>
<p><strong>Exibindo as informações dos projetos</strong></p>
<p>Agora nós temos como buscar nossa informação e como filtra-la. Como disse no<a href="http://herberthamaral.com/2010/02/criando-web-crawlers-em-python-parte-i/"> post anterior</a>, eu iria mostrar alguns usos mais avançados do BeautifulSoup, principalmente no que diz respeito à percorrer o documento. O próximo passo será mostrar as informações dos projetos que aparecem no resultado da nossa busca. Podemos fazer isso da seguinte forma:</p>
<pre class="brush:python">from BeautifulSoup import BeautifulSoup
import urllib,urllib2

base_url = 'http://sourceforge.net'
busca = raw_input('Pesquisar por: ')

variaveis_get = urllib.urlencode({'type_of_search':'soft','words':busca})
req = urllib2.Request(base_url+'/search/',variaveis_get)
response = urllib2.urlopen(req).read()

soup = BeautifulSoup(response)

tabela = soup.find('table',{'id':'searchtable'}) # procura pela tabela com id=searchtable
linhas_tabela = tabela.findAll('tr') #retorna uma lista com todas as linhas (&lt;tr&gt;) da tabela

i=0

for linha in linhas_tabela:
    i+=1
    coluna_descricao = linha.find('td') #encontra a primeira coluna (descricao) da linha
    nome_projeto = coluna_descricao.find('a').contents[0] #o atributo contents contem uma lista com o conteudo da tag
    descricao_projeto = coluna_descricao.contents[2].strip()
    print 'Projeto '+str(i)+': '+nome_projeto
    print descricao_projeto
    print '--------------------------------'</pre>
<p>Legal, não?  Isso é uma demonstração básica do poder que o BeautifulSoup tem para percorrer e extrair informações em (X)HTML. O mais interessante de tudo é que quase todos os métodos da classe BeutifulSoup.Tag retornam a própria referência, o que quer dizer que podemos fazer <em>chains</em> (cadeias) de comando como essas:</p>
<pre class="brush:python">nome_do_primeiro_projeto_da_pesquisa = soup.find('table',{'id':'searchtable'}).findAll('tr')[0].find('td').find('a').contents[0]</pre>
<p>Isso é realmente muito útil quando se quer economizar código. E o mais interessante de tudo: é bem legível (mas não necessariamente fácil de interpretar... quem ler seu código assim terá que ter uma boa noção do BeautifulSoup).</p>
<p><strong>Baixando os arquivos do projeto</strong></p>
<p>Essa parte é relativamente fácil. O SF é um serviço muito bom, até para o nosso pequeno experimento <img src='http://herberthamaral.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>A URL que o link "Download Now" aponta sofre 3 redirects até o arquivo final. Tudo isso serve para o SF determinar a sua localização e apontar o mirror mais próximo de você. Então a única coisa que precisamos fazer é passar esse link para o <strong>wget </strong>(um programa bem útil para download de arquivos na Web presente na maioria das distribuições Linux. Um clone para Windows pode ser encontrado <a href="http://gnuwin32.sourceforge.net/packages/wget.htm" target="_blank">aqui</a>) e ele irá baixar o projeto para nós. Simples, não?</p>
<p>Então vamos ao código:</p>
<pre class="brush:python">from BeautifulSoup import BeautifulSoup
import urllib,urllib2
from subprocess import call

base_url = 'http://sourceforge.net'
busca = raw_input('Pesquisar por: ')

variaveis_get = urllib.urlencode({'type_of_search':'soft','words':busca})
req = urllib2.Request(base_url+'/search/',variaveis_get)
response = urllib2.urlopen(req).read()

soup = BeautifulSoup(response)

tabela = soup.find('table',{'id':'searchtable'}) # procura pela tabela com id=searchtable
linhas_tabela = tabela.findAll('tr') #retorna uma lista com todas as linhas (
) da tabela

i=0
links_download = []

for linha in linhas_tabela:
    i+=1
    coluna_descricao = linha.find('td')
    nome_projeto = coluna_descricao.find('a').contents[0]
    link_download = linha.find('a',{'class':'downloadnow'})['href']
    links_download.append(link_download)
    descricao_projeto = coluna_descricao.contents[2].strip()
    print 'Projeto '+str(i)+': '+nome_projeto
    print descricao_projeto
    print '--------------------------------'

opcao = int(raw_input('Qual projeto gostaria de baixar? '))
opcao_url = base_url+links_download[opcao-1]
call(['wget',opcao_url]) #chama o wget com o link para download</pre>
<p>A única coisa que eu fiz de novo foi adicionar o link de download em uma lista e perguntar ao usuário qual projeto ele deseja baixar. Então, eu passei o link de download para o wget que fez o serviço de baixar o arquivo pra mim. Pronto! Nosso crawler de exemplo do SF.net está pronto <img src='http://herberthamaral.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>No proximo post eu mostrarei como guardar valores de sessão para percorrermos páginas protegidas por senha. See ya!</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fherberthamaral.com%2F2010%2F03%2Fcriando-web-crawlers-em-python-parte-ii%2F&amp;linkname=Criando%20Web%20crawlers%20em%20Python%20%E2%80%93%20Parte%20II"><img src="http://herberthamaral.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://herberthamaral.com/2010/03/criando-web-crawlers-em-python-parte-ii/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Minicurso de jQuery na Unimontes. Reserve ja a sua vaga!</title>
		<link>http://herberthamaral.com/2010/03/minicurso-de-jquery-na-unimontes-reserve-ja-a-sua-vaga/</link>
		<comments>http://herberthamaral.com/2010/03/minicurso-de-jquery-na-unimontes-reserve-ja-a-sua-vaga/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 11:11:43 +0000</pubDate>
		<dc:creator>Herberth Amaral</dc:creator>
				<category><![CDATA[Cursos]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[unimontes]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://herberthamaral.com/?p=258</guid>
		<description><![CDATA[Era pra eu ter postado isso aqui antes, mas ainda há tempo.
A comissão de formatura do 7º período de SI da Unimontes (a qual eu me incluo) está organizando um minicurso de 12 horas de jQuery. Serão duas turmas com 20 vagas: uma durante a semana (segundas e quartas-feira, de 19:30 às 21:30 - vagas [...]]]></description>
			<content:encoded><![CDATA[<p>Era pra eu ter postado isso aqui antes, mas ainda há tempo.</p>
<p>A comissão de formatura do 7º período de SI da <a href="http://www.unimontes.br">Unimontes</a> (a qual eu me incluo) está organizando um minicurso de 12 horas de <a href="http://jquery.com">jQuery</a>. Serão duas turmas com 20 vagas: uma durante a semana (segundas e quartas-feira, de 19:30 às 21:30 - <strong>vagas esgotadas</strong>) e durante o sábado (8:00 - 12:00 - aproximadamente 10 vagas restantes).</p>
<p>O conteúdo a ser abordado será esse:</p>
<div id="_mcePaste">1 - Introdução</div>
<div id="_mcePaste">1.1 - Introdução à HTML.</div>
<div id="_mcePaste">1.2 - Introdução à CSS.</div>
<div id="_mcePaste">1.3 - Introdução à JavaScript.</div>
<div id="_mcePaste">2 - Document Object Modelling (DOM)</div>
<div id="_mcePaste">2.1 - A árvore de elementos</div>
<div id="_mcePaste">2.2 - Selecionando elementos.</div>
<div id="_mcePaste">2.3 - Mudando conteúdo do documento.</div>
<div id="_mcePaste">2.4 - Mudando estilos da página.</div>
<div id="_mcePaste">3 - Automatizando acesso ao DOM com jQuery.</div>
<div id="_mcePaste">3.1 - Seletores - Selecionando elementos por ID, classe, tag, atributos, conteúdo e posição.</div>
<div id="_mcePaste">3.2 - Alterando conteúdo.</div>
<div id="_mcePaste">3.3 - Eventos.</div>
<div id="_mcePaste">4 - Efeitos.</div>
<div id="_mcePaste">4.1 - fadeIn/fadeOut.</div>
<div id="_mcePaste">4.2 - slideDown/slideUp.</div>
<div id="_mcePaste">4.3 - animate.</div>
<div id="_mcePaste">5 - AJAX</div>
<div id="_mcePaste">5.1 - Formatos de dados: XML e JSON.</div>
<div id="_mcePaste">5.2 - Requisitando dados do servidor.</div>
<div id="_mcePaste">5.3 - Eventos AJAX (ajaxComplete,ajaxStop,ajaxStart).</div>
<div id="_mcePaste">5.4 - Mudando o conteúdo da página dinamicamente.</div>
<div id="_mcePaste">6 - jQueryUI.</div>
<div id="_mcePaste">6.1 - Accordion.</div>
<div id="_mcePaste">6.2 - Dialog.</div>
<div id="_mcePaste">6.3 - Drag n' drop (arrastar/soltar).</div>
<div id="_mcePaste">6.4 - Efeitos especiais.</div>
<div id="_mcePaste">6.5 - Slide.</div>
<div id="_mcePaste">6.6 - Button.</div>
<div id="_mcePaste">6.7 - DatePicker.</div>
<div id="_mcePaste">7 - Plugins.</div>
<div id="_mcePaste">7.1 - Galeria de fotos.</div>
<div id="_mcePaste">7.2 - Validação de formulários.</div>
<div id="_mcePaste">7.3 - Tabelas.</div>
<div id="_mcePaste">7.4 - Autocomplete.</div>
<div id="_mcePaste">7.5 - Onde obter mais plugins.</div>
<div id="_mcePaste">8 - Firebug.</div>
<div id="_mcePaste">8.1 - Usando o console interativo.</div>
<div id="_mcePaste">8.2 - Debugando JavaScript.</div>
<div id="_mcePaste">8.3 - FireQuery.</div>
<div id="_mcePaste">8.4 - Consoles de outros browsers.</div>
<div style="margin-top:20px">Eu reconheço que o conteúdo é relativamente extenso para um curso de 12 horas, por isso eu gostaria de ressaltar que <strong>quem já souber (mesmo que seja pouco) HTML e CSS já estará na frente de muita gente.</strong></div>
<div>Como o minicurso é presencial e nessa primeira versão não terá aulas online (sim, perguntaram isso =), a inscrição só será feita na Coordenação do Curso de Sistemas de Informação no CCET (prédio 3 da Unimontes).</div>
<div>Corram, as vagas estão se esgotando! <img src='http://herberthamaral.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </div>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fherberthamaral.com%2F2010%2F03%2Fminicurso-de-jquery-na-unimontes-reserve-ja-a-sua-vaga%2F&amp;linkname=Minicurso%20de%20jQuery%20na%20Unimontes.%20Reserve%20ja%20a%20sua%20vaga%21"><img src="http://herberthamaral.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://herberthamaral.com/2010/03/minicurso-de-jquery-na-unimontes-reserve-ja-a-sua-vaga/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criando Web crawlers em Python &#8211; Parte I</title>
		<link>http://herberthamaral.com/2010/02/criando-web-crawlers-em-python-parte-i/</link>
		<comments>http://herberthamaral.com/2010/02/criando-web-crawlers-em-python-parte-i/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 22:58:17 +0000</pubDate>
		<dc:creator>Herberth Amaral</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[crawler]]></category>
		<category><![CDATA[pyton]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://herberthamaral.com/?p=242</guid>
		<description><![CDATA[Ir para: Criando Web Crawlers em Python - Parte II
Iniciemos com a definição de Web crawler:
Um Web crawler é um programa de computador que navega pela World Wide Web de maneira metódica e automatizada. [Wikipedia]
Os Web crawlers (ou simplesmente crawlers) têm um papel importante na nossa vida hoje. Como exemplos clássicos de Web crawlers, podemos [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Ir para: </strong><a href="http://herberthamaral.com/2010/03/criando-web-crawlers-em-python-parte-ii/" target="_blank"><strong>Criando Web Crawlers em Python - Parte II</strong></a></p>
<p>Iniciemos com a definição de Web crawler:</p>
<blockquote><p>Um Web crawler é um programa de computador que navega pela World Wide Web de maneira metódica e automatizada. [Wikipedia]</p></blockquote>
<p>Os Web crawlers (ou simplesmente crawlers) têm um papel importante na nossa vida hoje. Como exemplos clássicos de Web crawlers, podemos citar o Google Bot, o Yahoo! Slurp e o MsnBot. Sem esses crawlers, não teríamos a busca do Google, do Yahoo! ou do Bing.</p>
<p>O objetivo dessa série de tutoriais não é ensinar criar crawlers de alta disponibilidade, alta performance e distribuídos mas mostrar como eles podem ser construidos sem muito custo ou complexidade, de forma que atenda uma necessidade específica. Entenda necessidade específica como download de imagens de um conjunto de páginas, um sistema de download de arquivos de hosts como o Rapidshare ou MegaUpload (sim, é possível!) ou uma busca e categorização de informações distribuídas entre diversos sites (como editais de concursos em portais).</p>
<p><strong>Aspectos legais e ética de crawlers</strong>:</p>
<p>Antes de continuar lendo esta série, gostaria de informar que não é todo site que lhe dá permissão de acesso por meios de robores de busca. Procure sempre ler as políticas de uso e sempre respeite o robots.txt: se não é pra você crawlear determinada página, não o faça.</p>
<p><strong>O processo:</strong></p>
<div id="attachment_245" class="wp-caption aligncenter" style="width: 310px"><a href="http://herberthamaral.com/wp-content/uploads/2010/02/crawler.png"><img class="size-medium wp-image-245" title="Crawler" src="http://herberthamaral.com/wp-content/uploads/2010/02/crawler-300x290.png" alt="Esquema básico de funcionamento de um Web Crawler" width="300" height="290" /></a><p class="wp-caption-text">Esquema básico de funcionamento de um Web Crawler</p></div>
<p>Preste atenção aos componentes do crawler:</p>
<ol>
<li>Fila: pode conter uma ou mais URLs. Dependendo do tamanho da fila, a mesma pode estar no disco, ao invés de somente na memória.</li>
<li>Downloader: geralmente costuma-se colocar um downloader multithreaded. No nosso primero exemplo vamos fazer um downloader singlethreaded para evitar complexidade.</li>
<li>Parser: esse é o mais interessante. Ele vai extrair informações da página baixada pelo downloader segundo as especificações passadas pra ele. É pra ele que você irá dizer que quer extrair todas as imagens de uma determinada página.</li>
<li>Storage: pode ser qualquer tipo de armazenamento em qualquer tipo de mídia. Não iremos persistir os dados nessa primeira parte do tutorial.</li>
</ol>
<p>Nota-se que esse diagrama não representa um crawler de alta performance, pois ele mal diz sobre a arquitetura do mesmo, não diz sobre hardware, links de rede, paralelismo e tudo mais, mas serve com o intuito de explicar o básico do sistema.</p>
<p><strong>Maos à obra: fazendo um downloader com uma fila simples</strong></p>
<p>Para download de páginas e arquivos na Web, nós usaremos o urlib e a urlib2 do Python. Apesar das versões das libs, uma complementa a outra. Por exemplo, só se pode mudar os headers HTTP na urllib2 e o método urlencode só está disponível na urllib. Contudo, nós usaremos mais a urllib2. O código:</p>
<pre class="brush:python">import urllib2

url = "http://www.google.com"

request = urllib2.Request(url)
response = urllib2.urlopen(request)
document = response.read()
print document</pre>
<p>Execute esse código e se tudo der certo você verá o código fonte da página inicial do Google!</p>
<p>Bem, só ter o código fonte da página não é muito útil. Precisamos extrair informações dela. Uma forma de que podemos adotar é por Regex (expressão regular), mas usar regex dificultaria nosso trabalho e fugiríamos da idéia de deixar as coisas simples.</p>
<p>Um grande problema da Web hoje é que muitos desenvolvedores escrevem código (X)HTML mal formado e isso dificulta um pouco nossa vida. Felizmente isso não é um impedimento grave e podemos contorna-lo com o <strong>BeautifulSoup</strong>. O BeautifulSoup faz um excelente trabalho transformando o código de marcação (HTML, XML ou XHTML) em objetos que podem ser facilmente manipulados. De acordo com o esquema mostrado apresentado aqui, o BeautifulSoup faz parte do parser.</p>
<p>Façamos algo útil: vamos listar todos os links da página inicial do Google.</p>
<pre class="brush:python">import urllib2
from BeautifulSoup import BeautifulSoup

url = "http://www.google.com"

request = urllib2.Request(url)
response = urllib2.urlopen(request)
document = response.read()
soup = BeautifulSoup(document) #normaliza o documento para que o mesmo seja acessível via objetos

links = soup.findAll('a')  # retorna uma lista com todos os links do documento

for link in links:
    print link</pre>
<p>Fácil não?!</p>
<p>Se tudo correr bem, você deve ver uma saída igual a essa:</p>
<pre style="color: #bbb;">
<div id="_mcePaste">&lt;a href="http://images.google.com.br/imghp?hl=pt-BR&amp;amp;tab=wi"&gt;Imagens&lt;/a&gt;</div>
<div id="_mcePaste">&lt;a href="http://video.google.com.br/?hl=pt-BR&amp;amp;tab=wv"&gt;Vídeos&lt;/a&gt;</div>
<div id="_mcePaste">&lt;a href="http://maps.google.com.br/maps?hl=pt-BR&amp;amp;tab=wl"&gt;Mapas&lt;/a&gt;</div>
<div id="_mcePaste">&lt;a href="http://news.google.com.br/nwshp?hl=pt-BR&amp;amp;tab=wn"&gt;Notícias&lt;/a&gt;</div>
<div id="_mcePaste">&lt;a href="http://www.orkut.com/Home.aspx?hl=pt-BR&amp;amp;tab=w0"&gt;Orkut&lt;/a&gt;</div>
<div id="_mcePaste">&lt;a href="http://mail.google.com/mail/?hl=pt-BR&amp;amp;tab=wm"&gt;Gmail&lt;/a&gt;</div>
<div id="_mcePaste">&lt;a href="http://www.google.com.br/intl/pt-BR/options/" style="text-decoration:none"&gt;&lt;u&gt;mais&lt;/u&gt; &amp;raquo;&lt;/a&gt;</div>
<div id="_mcePaste">&lt;a href="/url?sa=p&amp;amp;pref=ig&amp;amp;pval=3&amp;amp;q=http://www.google.com.br/ig%3Fhl%3Dpt-BR%26source%3Diglk&amp;amp;usg=AFQjCNEufhwNAC9POZqcS5r7r07CUPbvAA"&gt;iGoogle&lt;/a&gt;</div>
<div id="_mcePaste">&lt;a href="/preferences?hl=pt-BR"&gt;Configurações da pesquisa&lt;/a&gt;</div>
<div id="_mcePaste">&lt;a href="https://www.google.com/accounts/Login?hl=pt-BR&amp;amp;continue=http://www.google.com.br/"&gt;Fazer login&lt;/a&gt;</div>
<div id="_mcePaste">&lt;a href="/search?q=Vancouver+2010&amp;amp;ct=olympics10-sskating-hp&amp;amp;oi=ddle"&gt;&lt;img src="/logos/olympics10-sskating-hp.png" width="523" height="170" border="0" alt="Vancouver 2010" title="Vancouver 2010" id="logo" onload="window.lol&amp;amp;&amp;amp;lol()" /&gt;&lt;/a&gt;</div>
<div id="_mcePaste">&lt;a href="/advanced_search?hl=pt-BR"&gt;Pesquisa avançada&lt;/a&gt;</div>
<div id="_mcePaste">&lt;a href="/language_tools?hl=pt-BR"&gt;Ferramentas de idiomas&lt;/a&gt;</div>
<div id="_mcePaste">&lt;a href="/intl/pt-BR/ads/"&gt;Soluções de publicidade&lt;/a&gt;</div>
<div id="_mcePaste">&lt;a href="/services/"&gt;Soluções empresariais&lt;/a&gt;</div>
<div id="_mcePaste">&lt;a href="/intl/pt-BR/about.html"&gt;Tudo sobre o Google&lt;/a&gt;</div>
<div id="_mcePaste">&lt;a href="http://www.google.com/ncr"&gt;Google.com in English&lt;/a&gt;</div>
<div id="_mcePaste">&lt;a href="/intl/pt-BR/privacy.html"&gt;Privacidade&lt;/a&gt;</div>

&lt;a href="http://images.google.com.br/imghp?hl=pt-BR&amp;amp;tab=wi"&gt;Imagens&lt;/a&gt;&lt;a href="http://video.google.com.br/?hl=pt-BR&amp;amp;tab=wv"&gt;Vídeos&lt;/a&gt;&lt;a href="http://maps.google.com.br/maps?hl=pt-BR&amp;amp;tab=wl"&gt;Mapas&lt;/a&gt;&lt;a href="http://news.google.com.br/nwshp?hl=pt-BR&amp;amp;tab=wn"&gt;Notícias&lt;/a&gt;&lt;a href="http://www.orkut.com/Home.aspx?hl=pt-BR&amp;amp;tab=w0"&gt;Orkut&lt;/a&gt;&lt;a href="http://mail.google.com/mail/?hl=pt-BR&amp;amp;tab=wm"&gt;Gmail&lt;/a&gt;&lt;a href="http://www.google.com.br/intl/pt-BR/options/" style="text-decoration:none"&gt;&lt;u&gt;mais&lt;/u&gt; &amp;raquo;&lt;/a&gt;&lt;a href="/url?sa=p&amp;amp;pref=ig&amp;amp;pval=3&amp;amp;q=http://www.google.com.br/ig%3Fhl%3Dpt-BR%26source%3Diglk&amp;amp;usg=AFQjCNEufhwNAC9POZqcS5r7r07CUPbvAA"&gt;iGoogle&lt;/a&gt;&lt;a href="/preferences?hl=pt-BR"&gt;Configurações da pesquisa&lt;/a&gt;&lt;a href="https://www.google.com/accounts/Login?hl=pt-BR&amp;amp;continue=http://www.google.com.br/"&gt;Fazer login&lt;/a&gt;&lt;a href="/search?q=Vancouver+2010&amp;amp;ct=olympics10-sskating-hp&amp;amp;oi=ddle"&gt;&lt;img src="/logos/olympics10-sskating-hp.png" width="523" height="170" border="0" alt="Vancouver 2010" title="Vancouver 2010" id="logo" onload="window.lol&amp;amp;&amp;amp;lol()" /&gt;&lt;/a&gt;&lt;a href="/advanced_search?hl=pt-BR"&gt;Pesquisa avançada&lt;/a&gt;&lt;a href="/language_tools?hl=pt-BR"&gt;Ferramentas de idiomas&lt;/a&gt;&lt;a href="/intl/pt-BR/ads/"&gt;Soluções de publicidade&lt;/a&gt;&lt;a href="/services/"&gt;Soluções empresariais&lt;/a&gt;&lt;a href="/intl/pt-BR/about.html"&gt;Tudo sobre o Google&lt;/a&gt;&lt;a href="http://www.google.com/ncr"&gt;Google.com in English&lt;/a&gt;&lt;a href="/intl/pt-BR/privacy.html"&gt;Privacidade&lt;/a&gt;</pre>
<p>Na verdade, a linha</p>
<pre class="brush:python">links = soup.findAll('a')</pre>
<p>não retorna uma lista de strings, mas uma lista de objetos que representam tags em HTML (classe BeautifulSoup.Tag). Logo, há outras propriedades e métodos que podemos explorar. Digamos que você só queira as URLs dos links e não está interessado no texto ou na marcação. O nosso código ficaria assim:</p>
<pre class="brush:python">import urllib2
from BeautifulSoup import BeautifulSoup

url = "http://www.google.com"

request = urllib2.Request(url)
response = urllib2.urlopen(request)
document = response.read()
soup = BeautifulSoup(document) #normaliza o documento para que o mesmo seja acessível via objetos

links = soup.findAll('a')  # retorna uma lista com todos os links do documento

for link in links:
    print link['href']</pre>
<p>Como saída, você pode obter algo do tipo:</p>
<pre style="color: #bbb;">http://images.google.com.br/imghp?hl=pt-BR&amp;tab=wi

http://video.google.com.br/?hl=pt-BR&amp;tab=wv

http://maps.google.com.br/maps?hl=pt-BR&amp;tab=wl

http://news.google.com.br/nwshp?hl=pt-BR&amp;tab=wn

http://www.orkut.com/Home.aspx?hl=pt-BR&amp;tab=w0

http://mail.google.com/mail/?hl=pt-BR&amp;tab=wm

http://www.google.com.br/intl/pt-BR/options/

/url?sa=p&amp;pref=ig&amp;pval=3&amp;q=http://www.google.com.br/ig%3Fhl%3Dpt-BR%26source%3Diglk&amp;usg=AFQjCNEufhwNAC9POZqcS5r7r07CUPbvAA
/preferences?hl=pt-BR

https://www.google.com/accounts/Login?hl=pt-BR&amp;continue=http://www.google.com.br/

/search?q=Vancouver+2010&amp;ct=olympics10-sskating-hp&amp;oi=ddle
/advanced_search?hl=pt-BR
/language_tools?hl=pt-BR
/intl/pt-BR/ads/
/services/
/intl/pt-BR/about.html

http://www.google.com/ncr

/intl/pt-BR/privacy.html</pre>
<p>Como você pode ver, o BeautifulSoup é quase uma mãe quando o assunto é extrair informações de HTML <img src='http://herberthamaral.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  .</p>
<p>No próximo tutorial, eu abordarei usos mais avançados do BeautifulSoup e mostrarei como usar os métodos GET e POST e também mostrarei uma pequena aplicação para procurar e baixar arquivos do SourceForge.net. Até o próximo!</p>
<p><strong>Ir para: </strong><a href="http://herberthamaral.com/2010/03/criando-web-crawlers-em-python-parte-ii/" target="_blank"><strong>Criando Web Crawlers em Python - Parte II</strong></a></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fherberthamaral.com%2F2010%2F02%2Fcriando-web-crawlers-em-python-parte-i%2F&amp;linkname=Criando%20Web%20crawlers%20em%20Python%20%26%238211%3B%20Parte%20I"><img src="http://herberthamaral.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://herberthamaral.com/2010/02/criando-web-crawlers-em-python-parte-i/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Criando screencasts no Linux</title>
		<link>http://herberthamaral.com/2010/02/criando-screencasts-no-linux/</link>
		<comments>http://herberthamaral.com/2010/02/criando-screencasts-no-linux/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 02:14:34 +0000</pubDate>
		<dc:creator>Herberth Amaral</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[dica]]></category>
		<category><![CDATA[screencast]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://herberthamaral.com/?p=233</guid>
		<description><![CDATA[Eu vi algumas pessoas reclamando sobre a dificuldade de criar screencasts usando Linux. É, eu também tive algumas dificuldades. Nenhuma das ferramentas que eu consegui encontrar com minhas buscas não resolviam meu problema:

Istanbul - Bonitinho, parece leve, grava legal, mas simplesmente dá um erro de IO (não entendi direito qual era o erro ) e [...]]]></description>
			<content:encoded><![CDATA[<p>Eu vi algumas pessoas <a href="http://linux-sucks.blogspot.com/2006/12/desktop-recording-crusade.html" target="_blank">reclamando</a> sobre a dificuldade de criar screencasts usando Linux. É, eu também tive algumas dificuldades. Nenhuma das ferramentas que eu consegui encontrar com minhas buscas não resolviam meu problema:</p>
<ol>
<li><a href="http://live.gnome.org/Istanbul" target="_blank"><strong>Istanbul</strong></a> - Bonitinho, parece leve, grava legal, mas simplesmente dá um erro de IO (não entendi direito qual era o erro ) e não salva.</li>
<li><strong><a href="http://xvidcap.sourceforge.net/" target="_self">xvidcap</a> </strong>- Levíssimo, completo, mas tem problema com o PulseAudio e não grava o áudio do microfone. Tentei inicializa-lo com o comando <em>padsp xvidcap</em>, mas também não resolveu: mesmo chiado no som.</li>
<li><strong><a href="http://recordmydesktop.sourceforge.net/about.php" target="_self">recordMyDesktop</a> </strong>- Grava áudio normal, mas as imagens tinham uma qualidade horrível. Parecia que ele atualizava uma parte da tela e esquecia da outra. Resultado: eu gravava um teste no VIM na linha de comando (preta) e quando eu passava pro GMail (verde) a tela ainda continuava preta...</li>
</ol>
<p>Não sei o por quê, mas nem todos os programas que vem no Linux vêm com as configurações mais comuns já de cara. O problema é que eu não percebi que o recordMyDesktop encaixaria perfeitamente pra mim se ele já viesse com uma opção já marcada desde o início:</p>
<p><a href="http://herberthamaral.com/wp-content/uploads/2010/02/Screenshot-1.png"><img class="aligncenter size-full wp-image-234" title="Screenshot-1" src="http://herberthamaral.com/wp-content/uploads/2010/02/Screenshot-1.png" alt="screenshot das configurações do recordMyDesktop" width="335" height="558" /></a>Estranho, não? Eu pensava que marcar "Full shots at every frame" resolveria meu problema, mas, inexplicavelmente, o "Encode On the Fly" resolveu. Apesar da tooltip dizer que essa opção consome mais poder de processamento, eu não notei tanto. A qualidade do vídeo ficou impecável e eu estou com os efeitos no máximo <img src='http://herberthamaral.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Se após gravado o screencast você desejar edita-lo ou converte-lo, há uma gama de softwares para Linux mesmo que fazem isso. Para conversão eu uso muito o <a href="http://www.ffmpeg.org/" target="_blank">ffmpeg</a> (não conheço nenhum outro melhor e mais completo) e me recomendaram o <a href="http://fixounet.free.fr/avidemux/" target="_blank">Avidemux</a> para edição de vídeo. A única coisa que eu sinto falta agora é algo que coloque os caracteres digitados na tela e que destaque o clique do mouse.</p>
<p>See ya!</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fherberthamaral.com%2F2010%2F02%2Fcriando-screencasts-no-linux%2F&amp;linkname=Criando%20screencasts%20no%20Linux"><img src="http://herberthamaral.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://herberthamaral.com/2010/02/criando-screencasts-no-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica rapida: conversao de bases em JavaScript</title>
		<link>http://herberthamaral.com/2010/02/dica-rapida-conversao-de-bases-em-javascript/</link>
		<comments>http://herberthamaral.com/2010/02/dica-rapida-conversao-de-bases-em-javascript/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 14:16:57 +0000</pubDate>
		<dc:creator>Herberth Amaral</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[dica]]></category>

		<guid isPermaLink="false">http://herberthamaral.com/?p=229</guid>
		<description><![CDATA[Essa é uma dica extremamente simples mas que poderia ter salvo um tempo em um dos nossos CodingDojo. Trata-se de conversão de bases em JavaScript.
(14).toString(2) // decimal para binário. Saída: 1110
(0xf3).toString(10) //hexadecimal (início 0x) para decimal. Saída: 243
(0324).toString(16) //octal (inicio 0) para hexadecimal. Saída: d4
(15276).toString(36) // decimal para base 36 (máximo possível). Saída: bsc
Legal, não? [...]]]></description>
			<content:encoded><![CDATA[<p>Essa é uma dica extremamente simples mas que poderia ter salvo um tempo em um dos nossos CodingDojo. Trata-se de conversão de bases em JavaScript.</p>
<pre class="brush:javascript">(14).toString(2) // decimal para binário. Saída: 1110
(0xf3).toString(10) //hexadecimal (início 0x) para decimal. Saída: 243
(0324).toString(16) //octal (inicio 0) para hexadecimal. Saída: d4
(15276).toString(36) // decimal para base 36 (máximo possível). Saída: bsc</pre>
<p>Legal, não? <img src='http://herberthamaral.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Créditos da dica: <a href="http://www.twitter.com/vinuz">Elvis</a>.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fherberthamaral.com%2F2010%2F02%2Fdica-rapida-conversao-de-bases-em-javascript%2F&amp;linkname=Dica%20rapida%3A%20conversao%20de%20bases%20em%20JavaScript"><img src="http://herberthamaral.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://herberthamaral.com/2010/02/dica-rapida-conversao-de-bases-em-javascript/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Flex For Kids foi 10!</title>
		<link>http://herberthamaral.com/2010/02/flex-for-kids-foi-10/</link>
		<comments>http://herberthamaral.com/2010/02/flex-for-kids-foi-10/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 01:46:23 +0000</pubDate>
		<dc:creator>Herberth Amaral</dc:creator>
				<category><![CDATA[Flex & Actionscript]]></category>
		<category><![CDATA[palestras]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[flex builder]]></category>
		<category><![CDATA[flex for kids]]></category>
		<category><![CDATA[infobits]]></category>
		<category><![CDATA[unimontes]]></category>

		<guid isPermaLink="false">http://herberthamaral.com/?p=203</guid>
		<description><![CDATA[Depois de um dia inteiro de correria, muita palestra e principalmente comida, estou aqui para contar um pouco do Flex For Kids para vocês.
Infelizmente, perdemos uma palestra que parecia ser bem legal: Desenvolvimento Multi-touch com AIR 2.0. Tivemos problemas com a conexão e iniciamos meio atrasados. Bem que a porta de saída poderia ser a [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de um dia inteiro de correria, muita palestra e principalmente comida, estou aqui para contar um pouco do Flex For Kids para vocês.</p>
<p>Infelizmente, perdemos uma palestra que parecia ser bem legal: <em>Desenvolvimento Multi-touch com AIR 2.0</em>. Tivemos problemas com a conexão e iniciamos meio atrasados. Bem que a porta de saída poderia ser a 80 mesmo... evitaria muitos problemas.</p>
<p>Conseguimos pegar a palestra do <a href="http://www.igormusardo.com.br/" target="_blank">Igor Musardo </a>(<em>Construa painéis administrativos em Flex integrados com ASP.NET MVC</em>) bem no início, quando ele começou a falar sobre ASP.NET MVC e Flex. Ele mostrou um pequeno sistema para gerenciamento de conteúdo usando o Flex 3 e o ASP.NET MVC como backend e usou o JSON como formato de comunicação. A maioria dos presentes não tinha familiaridade com .NET, mas serviu pra mostrar um pouco da tecnologia. Bem interessante a palestra, mas eu fiquei curioso com o fato dele não usar AMF para isso. Devido à alguns problemas técnicos com a transmissão, a palestra do Musardo acabou atrasando um pouco, mas nada grave.</p>
<p>A palestra a seguir foi a do <a href="http://www.mariojunior.com/" target="_blank">Mário Junior</a>: <em>Swiz Framework: MVC Simples e Poderoso para projetos Flex/AIR</em>. Como o Mario mesmo disse, o Swiz é extremamente simples e leve, no entanto a palestra dele serviu para mostrar como eu subutilizo os recursos que o Swiz oferece. Ele é muito mais poderoso que eu pensava. Valeu muito pra mim e pra galera da Infobits. Muito boa a palestra dele.</p>
<p>Como eu estava na organização e nós tínhamos que trazer o almoço para a Unimontes, eu acabei perdendo a palestra do <a href="http://www.flexdev.com.br/" target="_blank">Eberton Consolim</a>: <em>Flex e VOIP: Adicione essa tecnologia em suas aplicações. </em>Segundo a galera que assistiu, a palestra foi excelente, mas infelizmente terei que aguardar o acesso às gravações para ter certeza <img src='http://herberthamaral.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>A próxima palestra logo após o almoço foi a do <a href="http://www.areacriacoes.com.br/" target="_blank">Daniel Lopes</a>:<em> Desktop com HTML, Javascript e  Adobe AIR.</em> A palestra foi muito bem ministrada: muito conceito, muita idéia e pouca explicação de código e ele incrivelmente conseguiu fazer um hands-on sem muitas delongas. Incrível.  Excelente palestra.</p>
<p>A palestra da <a href="http://www.gabriela.trindade.nom.br/" target="_blank">Gabriela </a>teria sido mais interessante se eu entendesse um pouco mais de User eXperience. No entanto, foi bom ter uma palestra <em>no-code </em> no meio de tantas. Aliás, foi bom ter visto uma mulher no meio de tanto marmanjo <img src='http://herberthamaral.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Mesmo assim, foi proveitosa.</p>
<p>O<a href="http://www.firescrum.com/" target="_blank"> Eric Calvancanti</a> assumiu a missão de desmistificar o Cairngorm. E posso dizer que ele o fez com muito sucesso! Segundo o Vedovelli, até a avó dele entenderia o que o Eric quis passar. Foi a apresentação mais didática que tivemos, apesar do Cairngorm ser o framework mais complexo apresentado hoje.</p>
<p>A palestra do <a href="http://www.vedovelli.com.br" target="_blank">Vedovelli </a>foi uma das mais esperadas. Muito conhecido pelos seus screencasts e sua irreverência, o Ved, como costuma ser chamado, se tornou um dos ícones dos Flexers nacionais. Ele explicou como funciona a arquitetura de uma aplicação usando o framework Mate. O framework é interessante e comparável em muitos pontos com o Swiz. Muito boa apresentação.</p>
<p>O "vírus da bactéria" que o cachorro do <a href="http://www.igorcosta.org/ " target="_blank">Igor Costa</a> não consegue ver deixou a sua apresentação muito divertida, além de informativa! O Igor é uma das maiores referencias em Flex e Java no Brasil e sua palestra foi memorável. Eu não saco muita coisa de JEE, mas a palestra dele foi bem inteligível.</p>
<p>E por último e com a melhor palestra do dia, a do <a href="http://www.becklog.org/">Beck Novaes</a>. Ele deu uma geral sobre a plataforma Adobe de desenvolvimento de RIAs: Flash, Flex, Flash Builder e Flash Catalyst. A palestra foi incrível. Ele tem um mix de explicação extremamente fácil de entender com informação útil. Deveria ter sido a primeira palestra do dia, com toda certeza.</p>
<p>Nossa reunião na <a href="http://unimontes.br" target="_blank">Unimontes </a>teve uma audiência de 15 pessoas e contou com a organização e apoio da <a href="http://www.infobitsunimontes.com.br" target="_blank">Infobits</a> e da Gerência de Tecnologia da Informação da Unimontes. Queria agradecer a todos que vieram e prestigiaram o evento. Também gostaria de dar os parabéns a todos que tiraram o escorpião do bolso e doaram para o Cotolengo. Muito bacana! A seguir, as fotos do evento:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="600" height="400" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="flashvars" value="host=picasaweb.google.com&amp;hl=pt_BR&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fherberthamaral%2Falbumid%2F5435276939367326065%3Falt%3Drss%26kind%3Dphoto%26hl%3Dpt_BR" /><param name="src" value="http://picasaweb.google.com/s/c/bin/slideshow.swf" /><embed type="application/x-shockwave-flash" width="600" height="400" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" flashvars="host=picasaweb.google.com&amp;hl=pt_BR&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fherberthamaral%2Falbumid%2F5435276939367326065%3Falt%3Drss%26kind%3Dphoto%26hl%3Dpt_BR"></embed></object></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fherberthamaral.com%2F2010%2F02%2Fflex-for-kids-foi-10%2F&amp;linkname=Flex%20For%20Kids%20foi%2010%21"><img src="http://herberthamaral.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://herberthamaral.com/2010/02/flex-for-kids-foi-10/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Eu vou participar do Flex For Kids. E voce?</title>
		<link>http://herberthamaral.com/2010/02/eu-vou-participar-do-flex-for-kids-e-voce/</link>
		<comments>http://herberthamaral.com/2010/02/eu-vou-participar-do-flex-for-kids-e-voce/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 09:13:41 +0000</pubDate>
		<dc:creator>Herberth Amaral</dc:creator>
				<category><![CDATA[Flex & Actionscript]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[flex for kids]]></category>
		<category><![CDATA[palestras]]></category>

		<guid isPermaLink="false">http://herberthamaral.com/?p=199</guid>
		<description><![CDATA[Como eu bloguei em outro blog anteriormente, eu vou participar do Flex For Kids!
Basicamente, o evento é praticamente uma maratona de palestras: nove palestras de uma hora cada em exatamente nove horas de duração, de 8:00 às 17:00, e contará com palestrantes da comunidade Flexer Brasiliera.
Todo dinheiro arrecadado com as inscrições será destinado à Cotolengo, [...]]]></description>
			<content:encoded><![CDATA[<p>Como eu <a href="http://gwibbers.wordpress.com/2010/01/26/iremos-participar-do-flex-for-kids-venha-voce-tambem/" target="_blank">bloguei </a>em outro <a href="http://gwibbers.wordpress.com" target="_blank">blog </a>anteriormente, eu vou participar do <a href="http://www.flexforkids.com" target="_blank">Flex For Kids</a>!</p>
<p>Basicamente, o evento é praticamente uma maratona de palestras: nove palestras de uma hora cada em exatamente nove horas de duração, de 8:00 às 17:00, e contará com palestrantes da comunidade Flexer Brasiliera.</p>
<p>Todo dinheiro arrecadado com as inscrições será destinado à <a href="http://www.flexforkids.com/site/favored" target="_blank">Cotolengo</a>, uma instituição do Mato Grosso do Sul que acolhe pessoas com necessidades especiais.</p>
<p>Nós, da <a href="http://www.infobitsunimontes.com.br" target="_blank">Infobits</a>, conseguimos reservar o auditório do Centro de Ciências Exatas e Tecnológicas para acomodar os participantes do evento, estamos organizando algumas outras coisas (como o almoço, a alimentação no resto do dia e a inscrição no evento) e temos 8 pessoas já confirmadas (o número vai subir até amanhã).</p>
<p>Só lembrando: se você quer participar do Flex For Kids conosco, ainda tem tempo! Nos procure na Infobits<strong>*</strong>, mande email, sinal de fumaça ou comente esse post <img src='http://herberthamaral.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>*Sala 10A do Centro de Ciências Exatas e Tecnológicas. Perdido? Veja no <a href="http://maps.google.com/maps/ms?ie=UTF&amp;msa=0&amp;msid= 102720658435516673110.00047ec2b73f9f510f156" target="_blank">Google Maps</a>.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fherberthamaral.com%2F2010%2F02%2Feu-vou-participar-do-flex-for-kids-e-voce%2F&amp;linkname=Eu%20vou%20participar%20do%20Flex%20For%20Kids.%20E%20voce%3F"><img src="http://herberthamaral.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://herberthamaral.com/2010/02/eu-vou-participar-do-flex-for-kids-e-voce/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testes unitarios no Flex usando o FlexUnit 4</title>
		<link>http://herberthamaral.com/2010/01/testes-unitarios-no-flex-usando-o-flexunit-4/</link>
		<comments>http://herberthamaral.com/2010/01/testes-unitarios-no-flex-usando-o-flexunit-4/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 14:12:08 +0000</pubDate>
		<dc:creator>Herberth Amaral</dc:creator>
				<category><![CDATA[Flex & Actionscript]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[flex builder]]></category>
		<category><![CDATA[flexunit 4]]></category>
		<category><![CDATA[integração contíunua]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://herberthamaral.com/?p=179</guid>
		<description><![CDATA[O FlexUnit 4 é a mais nova versão (não tem a oficial, só a RC, por enquanto) e apresenta uma série de vantagens sobre o seu antecessor, o FlexUnit 0.9, como os metadados de teste ([Test], [After] e [Before], para citar as mais populares), Theories, DataPoints e Assumptions que são úteis para testar grandes quantidades [...]]]></description>
			<content:encoded><![CDATA[<p>O FlexUnit 4 é a mais nova versão (não tem a oficial, só a RC, por enquanto) e apresenta uma série de vantagens sobre o seu antecessor, o FlexUnit 0.9, como os metadados de teste ([Test], [After] e [Before], para citar as mais populares), Theories, DataPoints e Assumptions que são úteis para testar grandes quantidades (talvez até infinita) de dados e ver como a aplicação se comporta e a possibilidade de executar os testes com diferentes Runners.</p>
<p>Este tutorial tem como objetivo mostrar o básico de testes unitários no Flex, sem se aprofundar muito nos recursos avançados do framework de testes.  Eu pretendo ir postando mais tutoriais à medida que eu for me aprofundando na tecnologia.</p>
<p><strong>O setup</strong></p>
<p>Para usar o FlexUnit4, você precisa baixa-lo <a href="http://opensource.adobe.com/wiki/display/flexunit/Downloads" target="_blank">aqui</a>. Após isso, crie um projeto no Flex Builder e adicione todas as libs que vieram no pacote no seu diretório libs:<br />
<a href="http://herberthamaral.com/wp-content/uploads/2010/01/flex_new_project.png"><img class="aligncenter size-full wp-image-180" title="flex_new_project" src="http://herberthamaral.com/wp-content/uploads/2010/01/flex_new_project.png" alt="" width="680" height="591" /></a></p>
<div id="attachment_182" class="wp-caption aligncenter" style="width: 275px"><a href="http://herberthamaral.com/wp-content/uploads/2010/01/flex_navigator1.png"><img class="size-full wp-image-182" title="flex_navigator" src="http://herberthamaral.com/wp-content/uploads/2010/01/flex_navigator1.png" alt="" width="265" height="308" /></a><p class="wp-caption-text">Verifique se todas as libs estão lá</p></div>
<p>Como o bom e velho TDD manda, vamos primeiro escrever a classe de teste de exemplo antes de escrever nosso código de produção.</p>
<p><strong>A classe de teste</strong></p>
<p>Uma classe de testes é uma classe comum que usa a classe Assert para fazer asserções. No exemplo que irei mostrar, usarei dois tipos básicos de asserção, mas se você observar, o FlexUnit possui vários tipos diferentes de asserções:</p>
<pre class="brush:java">package tests
{
	import org.flexunit.Assert;
	import org.flexunit.runner.manipulation.filters.IncludeAllFilter;

	import production.BasicClass;

	public class BasicTests
	{
		public function BasicTests(){}
		private var basicClass:BasicClass;

		[Before]
		public function before():void
		{
			basicClass = new BasicClass();
		}

		[Test]
		public function Verifica_Se_As_Duas_Strings_Sao_Iguais():void
		{
			var str:String = "MinhaString";
			Assert.assertTrue(basicClass.areStringsEqual(str,"MinhaString"));
		}

		[Test]
		public function Verifica_Se_A_Soma_Retorna_Resultado_Correto():void
		{
			var soma:int = 10;
			Assert.assertEquals(soma,basicClass.somar(2,8));
		}

		[After]
		public function after():void
		{
			//codigo de after
		}

	}
}</pre>
<p><strong>A suíte de teste</strong></p>
<p>A suíte de testes inclui nosso caso de teste descrito acima e será útil para o Flex executar nossos testes. Sendo assim, nossa suíte de testes ficaria mais ou menos desse jeito:</p>
<pre class="brush:java">package tests
{
	[Suite]
	[RunWith("org.flexunit.runners.Suite")]
	public class MyTestSuite
	{
		public var baseTest:BasicTests;
		public function MyTestSuite(){}

	}
}</pre>
<p><strong>UITestRunner e o FlexUnitCore</strong></p>
<p>O UITestRunner é um componente do FlexUnit que mostra os testes numa interface gráfica. Ele ficará na nossa aplicação e mostrará os resultados dos testes.</p>
<p>O FlexUnitCore será o responsável por carregar as suítes de teste e por passar os dados de saída de testes para o UITestRunner. No nosso caso, nossa aplicação principal ficaria assim:</p>
<pre class="brush:xml">
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="run()" layout="absolute" xmlns:flexUnitUIRunner="http://www.adobe.com/2009/flexUnitUIRunner"&gt;
    &lt;mx:Script&gt;
    &lt;![CDATA[
       import tests.MyTestSuite;
       import org.flexunit.listeners.UIListener;
       import org.flexunit.runner.FlexUnitCore;

       public var core:FlexUnitCore;
       public function run():void
       {
           core = new FlexUnitCore();
           core.addListener(new UIListener(uiRunner));
           core.run(MyTestSuite);
      }
    ]]&gt;
   &lt;/mx:Script&gt;
   &lt;flexUnitUIRunner:TestRunnerBase id="uiRunner"  width="100%" height="100%"/&gt;
&lt;/mx:Application&gt;</pre>
<p><strong>O código de produção</strong></p>
<p>Ufa! Depois de escrever a classe de teste, a suíte de teste e o runner, podemos nos focar em fazer nosso código de produção <img src='http://herberthamaral.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  . Dêem uma olhada em como ficaria o dito:</p>
<pre class="brush:java">package production
{
	public class BasicClass
	{
		public function BasicClass(){}

		public function areStringsEqual(string1:String,string2:String):Boolean
		{
			return (string1==string2);
		}

		public function somar(valor1:int,valor2:int):int
		{
			return valor1+valor2;
		}

	}
}</pre>
<p><strong>E Voilà!</strong></p>
<p>Depois de tudo pronto, a cara da criança ficaria mais ou menos assim:</p>
<p><a href="http://herberthamaral.com/wp-content/uploads/2010/01/ui_runner.png"><img class="aligncenter size-medium wp-image-190" title="ui_runner" src="http://herberthamaral.com/wp-content/uploads/2010/01/ui_runner-300x177.png" alt="" width="300" height="177" /></a></p>
<p>Legal, não? E ainda dá pra fazer com que o FlexUnit4 exporte o resultado dos testes para um arquivo XML, permitindo que seus testes no Flex sejam importados pelo seu sistema de Integração Contínua, mas isso é assunto para outro post <img src='http://herberthamaral.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Você pode baixar o código fonte <a href="http://herberthamaral.com/wp-content/tutoriais/flexunit4/UsandoFlexUnit4.zip" target="_blank">aqui</a> e ver os exemplos rodando online <a href="http://herberthamaral.com/wp-content/tutoriais/flexunit4/" target="_blank">aqui</a>.</p>
<p>Good testing!</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fherberthamaral.com%2F2010%2F01%2Ftestes-unitarios-no-flex-usando-o-flexunit-4%2F&amp;linkname=Testes%20unitarios%20no%20Flex%20usando%20o%20FlexUnit%204"><img src="http://herberthamaral.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://herberthamaral.com/2010/01/testes-unitarios-no-flex-usando-o-flexunit-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DojoMoc #5 &#8211; O mais emocionante de todos</title>
		<link>http://herberthamaral.com/2010/01/dojomoc-5-o-mais-emocionante-de-todos/</link>
		<comments>http://herberthamaral.com/2010/01/dojomoc-5-o-mais-emocionante-de-todos/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 02:28:56 +0000</pubDate>
		<dc:creator>Herberth Amaral</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[coding dojo]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[dojomoc]]></category>

		<guid isPermaLink="false">http://herberthamaral.com/?p=174</guid>
		<description><![CDATA[Hoje nos reunimos na Unimontes para realização de mais um Coding Dojo. No total foram quatro pessoas:

Diego Caxito
Elvis (não, ele não morreu  
Diego Guimarães
eu

A linguagem escolhida foi o JavaScript (\o/) e usamos o QUnit como suíte de testes. Apesar de todo o esforço do setup inicial do nosso caso de teste, o pessoal gostou [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje nos reunimos na Unimontes para realização de mais um Coding Dojo. No total foram quatro pessoas:</p>
<ol>
<li>Diego Caxito</li>
<li>Elvis (não, ele não morreu <img src='http://herberthamaral.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>Diego Guimarães</li>
<li>eu</li>
</ol>
<p>A linguagem escolhida foi o JavaScript (\o/) e usamos o QUnit como suíte de testes. Apesar de todo o esforço do setup inicial do nosso caso de teste, o pessoal gostou bastante de fazer testes usando o QUnit.</p>
<p><strong>O problema</strong></p>
<p>Resolvemos escolher o problema na hora (inclusive, esse foi um dos motivos pelos quais nos atrasamos). O problema escolhido foi o <a href="http://codekata.pragprog.com/2007/01/code_kata_fifte.html" target="_blank">A Diversion</a>, um problema simples aparentemente, mas que nos deu um pouco de trabalho, principalmente na hora de explicar.</p>
<p>Os testes rodaram bem no Chrome 4 e no Internet Explorer 8. Como rodou no IE8, dá até pra considerar o código à prova de balas <img src='http://herberthamaral.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Os testes possuem uma versão online disponível <a href="http://herberthamaral.com/wp-content/dojo/5/" target="_blank">aqui</a>. Pra quem quiser baixar, o link é <a href="http://herberthamaral.com/wp-content/dojo/5/dojomoc_5.zip">esse</a>.</p>
<p><strong>A emoção</strong></p>
<p>Tivemos que quebrar o problema principal em 3 problemas de menor tamanho para conseguirmos resolver. A última parte consistia em fazer um conversor decimal-binário na mão! Eu até tentei sugerir pra que pegássemos um pronto na net e focássemos mais na resolução do problema, mas a galera quis ser matuta. E foi bom assim, pois deixou o problema muito mais divertido.</p>
<p>Além do mais, é a primeira vez que trabalhamos com uma linguagem dinâmica no DojoMoc. Espero que se torne preferência da galera trabalhar com linguagens dinâmicas, pois, na minha opinião, facilita o trabalho.</p>
<p>Uma coisa que deu mais emoção ainda foi ter feito tudo usando o Notepad++ sem o langs.xml estar funcionando direito. Foi a primeira vez que não usamos uma IDE <img src='http://herberthamaral.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>E pra completar: dos 5 Dojos que fizemos até hoje, nós só conseguimos resolver o problema em duas vezes. O de hoje foi uma dessas vezes. Parabéns pra galera!</p>
<p>Não vai dar pra postar a nossa retrospectiva aqui agora porque os post-its ficaram com o Diego Caxito, mas em breve estaremos disponibilizando mais informações sobre o nosso Dojo de hoje no <a href="http://dojomoc.wordpress.com" target="_blank">blog oficial</a>.</p>
<p>É isso aí pessoal, até a próxima!</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fherberthamaral.com%2F2010%2F01%2Fdojomoc-5-o-mais-emocionante-de-todos%2F&amp;linkname=DojoMoc%20%235%20%26%238211%3B%20O%20mais%20emocionante%20de%20todos"><img src="http://herberthamaral.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://herberthamaral.com/2010/01/dojomoc-5-o-mais-emocionante-de-todos/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
