<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Log4Dev</title>
	
	<link>http://log4dev.com</link>
	<description />
	<lastBuildDate>Tue, 31 Aug 2010 12:57:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/log4dev/xml" /><feedburner:info uri="log4dev/xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><image><link>http://log4dev.com.br</link><url>http://log4dev.com/wp-includes/images/logo_laranja.gif</url><title>Log4Dev - RSS</title></image><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Flog4dev%2Fxml" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Flog4dev%2Fxml" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Flog4dev%2Fxml" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/log4dev/xml" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Flog4dev%2Fxml" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Flog4dev%2Fxml" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Flog4dev%2Fxml" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><item>
		<title>Curso de HTML5 em São Paulo</title>
		<link>http://feedproxy.google.com/~r/log4dev/xml/~3/Mi_AzuyPgX4/</link>
		<comments>http://log4dev.com/2010/08/31/curso-de-html5-em-sao-paulo/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 12:57:02 +0000</pubDate>
		<dc:creator>Miguel Galves</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Formação]]></category>
		<category><![CDATA[Notícias]]></category>

		<guid isPermaLink="false">http://log4dev.com/?p=823</guid>
		<description><![CDATA[A W3C Brasil irá oferecer um curso de HTML 5 em São Paulo, entre os dias 21 e 23 de setembro. Segundo um email que eu recebi ontem, O programa do curso abrange as principais novidades da versão 5 da linguagem HTML até o momento e priorizará a apresentação dos novos elementos com o debate [...]]]></description>
			<content:encoded><![CDATA[<p>A <a href="http://www.w3c.br/">W3C Brasil</a> irá oferecer um curso de <strong>HTML 5</strong> em São Paulo, entre os dias 21 e 23 de setembro.</p>

<p><a href="http://www.w3c.br/cursos/html5/"><img class="aligncenter" title="Curso de HTML 5" src="http://www.w3c.br/cursos/html5/images/nome-evento.gif" alt="" width="486" height="185" /></a></p>

<p>Segundo um email que eu recebi ontem,
<blockquote>O programa do curso abrange as principais novidades da versão 5 da linguagem HTML até o momento e priorizará a apresentação dos novos elementos com o debate em classe da nova semântica. Alguns exercícios serão aplicados com o intuito de demonstrar as novas implementações. Nossa estrutura infelizmente não comporta a formação de diversas turmas do curso de HTML5 que nos permita atender o grande número de solicitações de interessados, inclusive para outras cidades. Por isso faremos uma seleção dos participantes segundo os critérios de compromissos:</p>

<ul>
<li>com a replicação do conteúdo do curso;</li>
<li>com a publicação livre das aplicações geradas;</li>
<li>com um projeto real de uso do HTML5;</li>
<li>e com a participação efetiva em uma comunidade dedicada à melhoria da linguagem.</li>
</ul>

<p>O propósito do W3C Brasil, mais do que treinar no uso da nova versão, é o de organizar uma rede de interlocutores, formadores e multiplicadores preparados para os debates em torno dos padrões web, gerando massa crítica na formulação das novas recomendações.</blockquote>
Para saber mais sobre o curso, acesse <a href="http://www.w3c.br/cursos/html5/">http://www.w3c.br/cursos/html5/</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=Mi_AzuyPgX4:Lr_LvvMexUw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=Mi_AzuyPgX4:Lr_LvvMexUw:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/log4dev/xml/~4/Mi_AzuyPgX4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://log4dev.com/2010/08/31/curso-de-html5-em-sao-paulo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://log4dev.com/2010/08/31/curso-de-html5-em-sao-paulo/</feedburner:origLink></item>
		<item>
		<title>Olimpiada International de Informatica</title>
		<link>http://feedproxy.google.com/~r/log4dev/xml/~3/NpZEzq6ZDrE/</link>
		<comments>http://log4dev.com/2010/08/26/olimpiada-international-de-informatica/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 12:00:15 +0000</pubDate>
		<dc:creator>Thiago Bartolomei</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Formação]]></category>
		<category><![CDATA[Notícias]]></category>

		<guid isPermaLink="false">http://log4dev.com/?p=791</guid>
		<description><![CDATA[A 22a Olimpíada Internacional de Informática (IOI) ocorreu semana passada aqui em Waterloo, Canadá. É uma competição de programação para alunos de (no máximo) colegial. A olimpíada acontece anualmente e nessa edição contou com equipes de 83 países, incluindo o Brasil. Apesar de cada país poder enviar uma equipe de até 4 competidores, a competição [...]]]></description>
			<content:encoded><![CDATA[<p>A <a href="http://www.ioi2010.org">22a Olimpíada Internacional de Informática</a> (IOI) ocorreu semana passada aqui em Waterloo, Canadá. É uma competição de programação para alunos de (no máximo) colegial. A olimpíada acontece anualmente e nessa edição contou com equipes de 83 países, incluindo o Brasil. Apesar de cada país poder enviar uma equipe de até 4 competidores, a competição é individual. Portanto, é bem diferente da competição da <a href="http://cm.baylor.edu/welcome.icpc">ACM ICPC</a>, para equipes de universitários.</p>

<p>Eu tive o prazer de servir de guia para a delegação brasileira, novamente liderada pelo <a href="http://www.ic.unicamp.br/~ranido/">Prof. Anido</a> da UNICAMP. Como o Canadá é um país de imigrantes, a organização tentou encontrar guias que falassem fluentemente a língua de cada país. Eles dizem que conseguiram, mas eu vi alguns guias que tiveram que se virar em inglês mesmo. Mas a idéia de ter um guia que conhece ambos os países é a de dar uma perspectiva mais compatível com os alunos sobre Waterloo e principalmente sobre o Canadá. Eu espero ter conseguido mostrar os lados positivos e negativos daqui, além de levá-los às compras, é claro. Ah, e o lado divertido da semana (pros guias pelo menos) foi &#8220;ter&#8221; que ir junto ao <a href="http://www.canadaswonderland.com">Canada&#8217;s Wonderland</a> e ao  <a href="http://www.maidofthemist.com">Maid of the Mist</a> em Niagara Falls.</p>

<p>Mas voltando à competição, que imagino ser a parte divertida pros alunos, a primeira coisa que tive que aprender foi como funciona a premiação. Existem medalhas de ouro, prata e bronze, sendo que metade dos +/- 300 competidores recebem alguma medalha (1/12 ouro, 1/6 prata e 1/4 bronze). A equipe brasileira recebeu 1 prata e 2 bronzes, o que é bastante bom dado o nível elevado da competição.</p>

<p>E esse é o ponto principal desse post. Eu fiquei impressionado com o nível de conhecimento de algoritmos dos competidores. A equipe brasileira é jovem e 3 dos 4 competidores ainda tem idade pra voltar algumas vezes pro IOI. Esses meninos de 15, 16 anos manjam algoritmos e estruturas de dados que eu só fui aprender no 2o. ano de faculdade. E eles <strong>dominam</strong> o assunto! O campeão desse ano foi um bielorusso de 15 anos. Ele compete desde os 11 e já ganhou 1 prata e 4 ouros, sendo 2 vezes como campeão. Os dois pais do garoto são programadores, obviamente.</p>

<p>Se você duvida da complexidade das tarefas, tente resolver você mesmo, já que elas <a href="http://www.ioi2010.org/CompetitionTask.shtml">estão online</a>. Cada dia de competição era uma prova com 4 tarefas pra serem resolvidas em 5 horas. Normalmente uma tarefa era bem fácil, só pra não desmotivar competidores menos treinados (tente fazer o Memory ou o Cluedo primeiro). Mas pra se ter uma idéia, a primeira submissão correta do Cluedo foi em menos de 3 minutos (eu nem consigo ler o enunciado nesse tempo!). Nesse ano algumas tarefas envolviam heurísticas (como Language) e algumas que pareciam triviais eram bem complicadinhas de resolver com pontos máximos (veja hotter/colder).</p>

<p>Parabéns ao time brasileiro e à <a href="http://www.fcc.org.br/">Fundação Carlos Chagas</a> que patrocina as <a href="http://olimpiada.ic.unicamp.br/">seletivas</a>, treinamentos e viagens! E toca preparar pra Tailândia ano que vem!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=NpZEzq6ZDrE:Fx9EsZ0h_zA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=NpZEzq6ZDrE:Fx9EsZ0h_zA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/log4dev/xml/~4/NpZEzq6ZDrE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://log4dev.com/2010/08/26/olimpiada-international-de-informatica/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://log4dev.com/2010/08/26/olimpiada-international-de-informatica/</feedburner:origLink></item>
		<item>
		<title>Filtros no Admin do Django</title>
		<link>http://feedproxy.google.com/~r/log4dev/xml/~3/SA4duEzIb5E/</link>
		<comments>http://log4dev.com/2010/08/25/filtros-no-admin-do-django/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 13:37:54 +0000</pubDate>
		<dc:creator>Miguel Galves</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>

		<guid isPermaLink="false">http://log4dev.com/?p=800</guid>
		<description><![CDATA[O Admin automático do Django é uma mão na roda. Já disse isso. Mas nada é perfeito! Algo que me incomodava bastante era o fato da barra de filtros que aparece do lado direito da tela de listagem ser uma lista de links. Funciona muito bem quando a lista é pequena (10, no máximo 20 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.djangoproject.com/"><img class="aligncenter" title="Django" src="http://media.djangoproject.com/img/site/hdr_logo.gif" alt="" width="117" height="41" /></a></p>

<p>O Admin automático do Django é uma mão na roda. Já disse isso. Mas nada é perfeito!</p>

<p>Algo que me incomodava bastante era o fato da barra de filtros que aparece do lado direito da tela de listagem ser uma lista de links. Funciona muito bem quando a lista é pequena (10, no máximo 20 elementos). Mas quando a lista é muito grande, ou então pode ter tamanho variável, a coisa fica fora de controle. Meu sonho era poder colocar uma caixa de seleção.</p>

<p>Esta semana, resolvi fuçar um pouco e entender como funciona. E não é que é fácil?</p>

<p>Resumindo: o responsável por renderizar o filtro é um arquivo chamado filter.html, que fica na pasta de templates do admin (django/contrib/admin/templates/admin). O jeito então é substituir o arquivo, e o jeito elegante de fazer esta substituição é criar uma pasta admin dentro da pasta de templates do seu projeto e criar o arquivo filter.html lá.</p>

<p>Para aqueles que tem preguiça de pesquisar como colocar uma caixa de seleção, eis o código que eu usei:
<pre>{% load i18n %}
&lt;h3&gt;{% blocktrans with title as filter<em>title %} By {{ filter</em>title }} {% endblocktrans %}&lt;/h3&gt;
&lt;ul&gt;
&lt;select onchange='window.location=this.value;'&gt;
{% for choice in choices %}
&lt;option value="{{ choice.query_string|iriencode }}" 
{% if choice.selected %}selected{% endif %}&gt;{{ choice.display }}
&lt;/option&gt;
{% endfor %}
&lt;/select&gt;
&lt;/ul&gt;
</pre>
O resultado final é esse:</p>

<div id="attachment_801" class="wp-caption aligncenter" style="width: 169px"><a href="http://log4dev.com/wp-content/uploads/2010/08/filtro.png"><img class="size-full wp-image-801" title="Filtro de listagem com Caixa de Seleção" src="http://log4dev.com/wp-content/uploads/2010/08/filtro.png" alt="" width="159" height="226" /></a><p class="wp-caption-text">Filtro de listagem com Caixa de Seleção</p></div>

<p>Pra quem quiser aprender um pouco mais sobre customizações do admin do django, a fonte boa é esta: <a href="http://docs.djangoproject.com/en/1.2/obsolete/admin-css/">http://docs.djangoproject.com/en/1.2/obsolete/admin-css/</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=SA4duEzIb5E:WbLuDKKHw4I:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=SA4duEzIb5E:WbLuDKKHw4I:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/log4dev/xml/~4/SA4duEzIb5E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://log4dev.com/2010/08/25/filtros-no-admin-do-django/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://log4dev.com/2010/08/25/filtros-no-admin-do-django/</feedburner:origLink></item>
		<item><title>Links for 2010-08-12 [del.icio.us]</title><link>http://feedproxy.google.com/~r/log4dev/xml/~3/-Hm6mGG11Nk/log4dev</link><pubDate>Fri, 13 Aug 2010 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/log4dev#2010-08-12</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.paulgraham.com/yahoo.html"&gt;What Happened to Yahoo&lt;/a&gt;&lt;br/&gt;
When I went to work for Yahoo after they bought our startup in 1998, it felt like the center of the world. It was supposed to be the next big thing. It was supposed to be what Google turned out to be.&lt;br /&gt;
&lt;br /&gt;
What went wrong? The problems that hosed Yahoo go back a long time, practically to the beginning of the company. They were already very visible when I got there in 1998. Yahoo had two problems Google didn&amp;#039;t: easy money, and ambivalence about being a technology company.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.time.com/time/magazine/article/0,9171,2010076-1,00.html"&gt;Times Magazine: Brazil's Start-Up Generation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/log4dev/xml/~4/-Hm6mGG11Nk" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/log4dev#2010-08-12</feedburner:origLink></item><item><title>Links for 2010-08-09 [del.icio.us]</title><link>http://feedproxy.google.com/~r/log4dev/xml/~3/F6AOsSOGBpY/log4dev</link><pubDate>Tue, 10 Aug 2010 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/log4dev#2010-08-09</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://jasonputorti.com/post/472866002/how-mint-com-acquired-1-5m-users"&gt;Jason Putorti - How Mint.com Acquired 1.5M+ Users&lt;/a&gt;&lt;br/&gt;
How did Mint acquire 1.5m+ users without a high viral coefficient, scalable SEO strategy, or paid customer acquisition channel?&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/log4dev/xml/~4/F6AOsSOGBpY" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/log4dev#2010-08-09</feedburner:origLink></item><item><title>Links for 2010-08-05 [del.icio.us]</title><link>http://feedproxy.google.com/~r/log4dev/xml/~3/9_GMWqthFg8/log4dev</link><pubDate>Fri, 06 Aug 2010 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/log4dev#2010-08-05</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.infoq.com/news/2010/08/linkedin-data-infrastructure"&gt;LinkedIn's Data Infrastructure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sna-projects.com/azkaban/"&gt;Azkaban&lt;/a&gt;&lt;br/&gt;
Azkaban is simple batch scheduler for constructing and running Hadoop jobs or other offline processes.&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/log4dev/xml/~4/9_GMWqthFg8" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/log4dev#2010-08-05</feedburner:origLink></item><item><title>Links for 2010-07-30 [del.icio.us]</title><link>http://feedproxy.google.com/~r/log4dev/xml/~3/T2Vc-wenR5w/log4dev</link><pubDate>Sat, 31 Jul 2010 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/log4dev#2010-07-30</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://10k.aneventapart.com/"&gt;10K Apart | Inspire the web with just 10K.&lt;/a&gt;&lt;br/&gt;
Inspire the web with just 10K.&lt;br /&gt;
&lt;br /&gt;
It’s time to get back to basics — back to optimizing every little byte like your life depends on it. Your challenge? Build a web app in less than 10 kilobytes.&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/log4dev/xml/~4/T2Vc-wenR5w" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/log4dev#2010-07-30</feedburner:origLink></item><item><title>Links for 2010-07-19 [del.icio.us]</title><link>http://feedproxy.google.com/~r/log4dev/xml/~3/KwkiDDTAYa0/log4dev</link><pubDate>Tue, 20 Jul 2010 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/log4dev#2010-07-19</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.openstack.org/"&gt;OpenStack Open Source Cloud Computing Software&lt;/a&gt;&lt;br/&gt;
The goal of OpenStack is to allow any organization to create and offer cloud computing capabilities using open source software running on standard hardware. OpenStack Compute is software for automatically creating and managing large groups of virtual private servers. OpenStack Storage is software for creating redundant, scalable object storage using clusters of commodity servers to store terabytes or even petabytes of data.&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/log4dev/xml/~4/KwkiDDTAYa0" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/log4dev#2010-07-19</feedburner:origLink></item><item>
		<title>OAuth na prática</title>
		<link>http://feedproxy.google.com/~r/log4dev/xml/~3/FBK5EDsOYEI/</link>
		<comments>http://log4dev.com/2010/06/28/oauth-entranhas-e-exemplos/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 06:00:05 +0000</pubDate>
		<dc:creator>Miguel Galves</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://log4dev.com/?p=770</guid>
		<description><![CDATA[O comentário geral em relação ao meu post sobre OAuth foi: &#8220;Legal, mas FALTAM EXEMPLOS!&#8221; Oks, oks, oks, ei-lo. Vou usar como caso de uso o envio de um status novo para o twitter (tweets para os íntimos) em Python. Para isso, vou usar a lib oauth2, disponível para download no GitHub em http://github.com/simplegeo/python-oauth2. Segundo [...]]]></description>
			<content:encoded><![CDATA[<p>O comentário geral em relação ao <a href="http://log4dev.com/2010/06/23/oauth/">meu post sobre OAuth</a> foi: <em>&#8220;Legal, mas FALTAM EXEMPLOS!&#8221;</em></p>

<p>Oks, oks, oks, ei-lo. Vou usar como caso de uso o envio de um status novo para o twitter (tweets para os íntimos) em <strong>Python</strong>. Para isso, vou usar a lib <strong>oauth2</strong>, disponível para download no <a href="http://github.com">GitHub</a> em <a href="http://github.com/simplegeo/python-oauth2">http://github.com/simplegeo/python-oauth2</a>. Segundo o wiki do <a href="http://wiki.oauth.net/OAuth-2">OAuth</a>:
<blockquote>&#8220;OAuth 2.0 is the next evolution of the OAuth protocol which was originally created in late 2006. OAuth 2.0 focuses on client developer simplicity while providing specific authorization flows for web applications, desktop applications, mobile phones, and living room devices.&#8221;</blockquote>
Para começar, criamos uma instância de token e consumer, usados para autenticar as requisições. Neste exemplo, eu uso o algoritmo SHA1 para gerar a assinatura da requisição:</p>

<p><code><span style="color: #0000ff;">import oauth2 as oauth
token = oauth2.Token(token, token<em>secret)
consumer = oauth2.Consumer(consumer</em>key, consumer<em>secret)
sign</em>method = oauth2.SignatureMethod<em>HMAC</em>SHA1()</span></code></p>

<p><span style="color: #0000ff;"><span style="color: #000000;">Feito isso, temos que criar a url de requisição. No caso de envio de um <strong>tweet</strong>,  a url é </span></span><strong>http://api.twitter.com/1/statuses/update.json</strong>, <span style="color: #0000ff;"><span style="color: #000000;">o método de envio é <strong>POST</strong>, com apenas um parâmetro, <strong>status</strong>, contendo o conteúdo da mensagem. O protocolo oauth requer alguns parâmetros extras, como mostrado abaixo:</span></span></p>

<p><span style="color: #0000ff;">
</span>
<code><span style="color: #0000ff;">url = "http://api.twitter.com/1/statuses/update.json"
params = {
'oauth<em>version': "1.0",
'oauth</em>nonce': oauth2.generate<em>nonce(),
'oauth</em>timestamp': int(time.time()),
'status': 'Enviando uma mensagem para o Tweeter'
}
request = oauth2.Request(method="POST", url=url, parameters=params)
request.sign<em>request(self.</em>signature<em>method, self.</em>Consumer, token)
</span></code></p>

<p>Com um objeto do tipo Request na mão, só me resta executar a <strong>requisição HTTP</strong> propriamente dita, usando a lib <a href="http://docs.python.org/library/urllib2.html"><strong>urllib2</strong></a>, nativa do Python:<span style="color: #0000ff;"> </span></p>

<p><span style="color: #0000ff;">
</span>
<code><span style="color: #0000ff;">import urllib2
opener =  urllib2.build<em>opener()
encoded</em>post<em>data = request.to</em>postdata()
response = opener.open(url, encoded<em>post</em>data)
opener.close()</span></code></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=FBK5EDsOYEI:dPoIAyBUuSQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=FBK5EDsOYEI:dPoIAyBUuSQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/log4dev/xml/~4/FBK5EDsOYEI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://log4dev.com/2010/06/28/oauth-entranhas-e-exemplos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://log4dev.com/2010/06/28/oauth-entranhas-e-exemplos/</feedburner:origLink></item>
		<item>
		<title>OAuth</title>
		<link>http://feedproxy.google.com/~r/log4dev/xml/~3/D1vSr0ZsgvE/</link>
		<comments>http://log4dev.com/2010/06/23/oauth/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 11:59:03 +0000</pubDate>
		<dc:creator>Miguel Galves</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://log4dev.com/?p=756</guid>
		<description><![CDATA[No dia 31 de Maio do ano do Senhor de 2010, por volta das 15h, o meu caro amigo Lullis me mandou uma singela mensagem no GTalk dizendo algo como &#8220;Você viu que o sistema de Basic Auth do Twitter para de funcionar hoje né? E que daqui pra frente só com OAuth né?&#8221;. A [...]]]></description>
			<content:encoded><![CDATA[<p>No dia 31 de Maio do ano do Senhor de 2010, por volta das 15h, o meu caro amigo Lullis me mandou uma singela mensagem no GTalk dizendo algo como &#8220;Você viu que o sistema de Basic Auth do <a href="http://twitter.com">Twitter</a> para de funcionar hoje né? E que daqui pra frente só com OAuth né?&#8221;. A frase, descontextualizada, pode parecer apenas mais uma curiosidade geek. O Twitter já vinha anunciando esta migração de modelo de autenticação há um certo tempo.</p>

<p>Mas no mundo de Miguel, isso caiu como uma bomba atômica.</p>

<p><a href="http://delamagente.files.wordpress.com/2009/08/network_security.jpg"><img class="aligncenter" src="http://delamagente.files.wordpress.com/2009/08/network_security.jpg" alt="" width="306" height="228" /></a></p>

<p>Resumindo: o mecanismo de autenticação usado pelo <a href="http://job4dev.com">Job4Dev</a> e pelo <a href="http://www.sigaseutime.com.br">SigaSeuTime</a> simplesmente deixaria de funcionar em algumas horas. No caso do SigaSeuTime, isto era uma catástrofe de proporções enormes, já que boa parte do nosso público vem do Twtter. Uma longa noite me aguardava&#8230;até que percebemos que Lullis havia falado besteira, e que na verdade o prazo máximo era 31 de junho. Ufa.</p>

<p>Tive então tempo de estudar um pouco o protocolo, e fazer uma implementação usando algumas libs. Por sorte a documentação do próprio <a href="http://apiwiki.twitter.com/">Wiki do Twitter</a> é bem interessante. Gostaria de compartilhar alguns pontos aqui.
<h2>Basic Auth</h2>
É o maior lixo já inventado para autenticação. Basicamente, você adiciona no header da sua requisição um campo cujo valor é o seu username e a sua senha simplesmente codificados em <a href="http://en.wikipedia.org/wiki/Base64">Base 64</a>. Resumindo, senha em claro. Mais básico e inseguro que isso, impossível.
<h2>OAuth &#8211; Idéia básica</h2>
A idéia do <a href="http://oauth.net/">OAuth</a> é permitir que o provedor de um serviço permita o acesso a certos recursos a usuários sem precisar dar a senha principal. No caso do Twitter, isto é bem útil, já que a grande maioria dos usuários interagem com o sistema usando aplicativos externos.</p>

<p>Com este protocolo, seria possível permitir que por exemplo o Job4Dev atualizasse a sua timeline, de forma segura e autenticada, sem que eu precisasse guardar a sua senha na minha base de dados. Conveniente!
<h2>OAuth &#8211; O protocolo</h2>
<a href="http://oauth.net"><img class="alignnone" src="http://oauth.net/images/oauth-logo.png" alt="Logo OAuth" width="200" height="60" /></a></p>

<p>Vou tentar tornar esta descrição a mais simples possível.</p>

<p>OAuth usa um mecanismo de pares de chaves públicas e privadas para gerar assinaturas, permitindo uma identificação inequivoca da origem de cada requisição. Simples demais?</p>

<p>Ok</p>

<p>Vamos supor que o usuário @mgalves queria que o Job4Dev publique vagas na sua timeline, usando um app que algum dia será criado. Este app possui duas chaves, geradas pelo @job4dev: um consumer key e um consumer secret (que como seu nome diz, deve ser guardada de forma secreta). O passo a passo seria mais ou menos o seguinte:
<ul>
    <li>O app gera uma requisição especial HTTP, usando as duas chaves citadas acima, para obter um token de request temporário.</li>
    <li>Com este token em mãos, o app gera uma requisição HTTP de autorização de acesso para o Twitter. Esta requisição passa como parâmetros o token, o consumer key e uma assinatura gerada a partir de um hash (SHA) de uma string composta pelo token, pelo consumer key e pelo consumer secret key. Portanto, é única, e apenas o app do Job4Dev é capaz de gerar (comprovando assim a procedência da chamada).</li>
    <li>O Twitter já sabe, a partir da assinatura, que quem está pedindo permissão de acesso é o Job4Dev. Falta saber qual usuário irá autorizar o acesso: para isso o site pede que eu, @mgalves, efetue o login e explicitamente autorize o acesso.</li>
    <li>Autorizado o acesso, o Twitter envia para o app um novo par de chaves que serão utilizados para assinar as demais requisições, e que mapeiam de forma única a permissão de acesso do app job4dev aos recursos da conta de @mgalves. Caso eu resolva REVOGAR o acesso, basta invalidar estas novas chaves.</li>
</ul>
Melhorou? Espero que sim.</p>

<p>Um ponto importante deve ser ressaltado quanto ao último passo. O retorno do novo par de chaves pode ser feito de duas formas: callback e PIN code. Callback é a forma padrão descrita no protocolo do OAuth, e simplemente consiste em definir um callback HTTP no app que está pedindo acesso, que será chamado pelo provedor (no caso o Twitter) ao final do processo passando as chaves por parâmero POST.</p>

<p>Mas isso apenas funciona se o app em questão for web, e puder responder a uma requisição HTTP. Caso isto não aconteça (como no Tweetdeck por exemplo), o Twitter exibe na tela um código numérico único chamado PIN CODE: o app deve receber este PIN code (copy &amp; paste) e gerar uma nova requisição passando o token, o pin code e a assinatura, cujo retorno é o par de chaves.
<h2>E o TweetDeck?</h2>
Depois de ter lido e entendido o tema, a seguinte dúvida me veio a cabeça: e o TweetDeck, como faz? E nenhum momento eu autorizei o acesso aos meus recursos, e ainda assim, as coisas funcionam. Será que no final de junho ele para de funcionar?</p>

<p>Fucei a documentação do Twitter e achei uma extensão ao protocolo chamada de XAuth, uma pequena variação que permite que as chaves de acesso sejam obtidas através de uma requisição especial contendo username e senha do usuário. Isso evita a necessidade do protocolo definido acima, e funciona bem em casos onde quem vai acessar os recursos é o dono da conta.</p>

<p>Mas segundo o Twitter, para que um app que queira usar este protocolo deve entrar em contato diretamente com eles, explicando a real necessidade.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=D1vSr0ZsgvE:tnf6BJfrMdw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=D1vSr0ZsgvE:tnf6BJfrMdw:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/log4dev/xml/~4/D1vSr0ZsgvE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://log4dev.com/2010/06/23/oauth/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://log4dev.com/2010/06/23/oauth/</feedburner:origLink></item>
		<item>
		<title>StartupMeetup</title>
		<link>http://feedproxy.google.com/~r/log4dev/xml/~3/3KY4BD2sMhA/</link>
		<comments>http://log4dev.com/2010/06/10/startupmeetup/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 02:17:37 +0000</pubDate>
		<dc:creator>Miguel Galves</dc:creator>
				<category><![CDATA[Negocios]]></category>

		<guid isPermaLink="false">http://log4dev.com/?p=752</guid>
		<description><![CDATA[Ontem aconteceu o primeiro StartupMeetup em São Paulo, no Bar Wallstreet. O evento, organizado pelo pessoal do ReadWriteWeb Brasil, pela Sambatech e pela Aceleradora, tinha como objetivo promover o encontro de empreendedores e investidores. Fui representando o Job4Dev e o SigaSeuTime (que aliás prestigiou o evento com todos os seus sócios presentes), com o intuito [...]]]></description>
			<content:encoded><![CDATA[<p>Ontem aconteceu o primeiro <a href="http://startupmeetup.com.br/">StartupMeetup</a> em São Paulo, no Bar Wallstreet. O evento, organizado pelo pessoal do <a href="http://readwriteweb.com.br/">ReadWriteWeb Brasil</a>, pela <a href="http://www.sambatech.com.br">Sambatech</a> e pela <a href="http://aceleradora.net">Aceleradora</a>, tinha como objetivo promover o encontro de empreendedores e investidores.</p>

<p>Fui representando o <a href="http://job4dev.com">Job4Dev</a> e o <a href="http://www.sigaseutime.com.br">SigaSeuTime</a> (que aliás prestigiou o evento com todos os seus sócios presentes), com o intuito de conhecer gente, projetos e possíveis oportunidades.</p>

<div class="wp-caption aligncenter" style="width: 386px"><img title="SigaSeuTime e Indike, trocando uma idéia" src="http://farm5.static.flickr.com/4034/4685442764_0d95ccf46b.jpg" alt="" width="376" height="281" /><p class="wp-caption-text">SigaSeuTime e Indike, trocando uma idéia</p></div>

<p>Bati bons papos com o Diego Gomes e o Edmar do RWW-BR, o Yuri Gitahi da Aceleradora, com o pessoal da Confrapar, com os sócios da Indike, do Canal do Crédito e outros.</p>

<p>Saí de la com algumas idéias novas.</p>

<p>E bastante animado com este cenário razoavelmente novo e bem ativo, de gente jovem querendo construir coisas novas.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=3KY4BD2sMhA:daneVXLxqRw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=3KY4BD2sMhA:daneVXLxqRw:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/log4dev/xml/~4/3KY4BD2sMhA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://log4dev.com/2010/06/10/startupmeetup/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://log4dev.com/2010/06/10/startupmeetup/</feedburner:origLink></item>
		<item>
		<title>Teste</title>
		<link>http://feedproxy.google.com/~r/log4dev/xml/~3/snTlvvR8lXA/</link>
		<comments>http://log4dev.com/2010/06/08/teste/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 08:05:53 +0000</pubDate>
		<dc:creator>Raphael Lullis</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://log4dev.com/?p=740</guid>
		<description><![CDATA[Estou testando o sistema de criacão de widgets html com informacão sobre empresas cadastradas no banco de dados do job4dev. Provavelmente, não vai funcionar em leitores de RSS como o Google Reader, já que é necessário o uso de Javascript. Mas quem estiver acessando o site diretamente vai poder ver um resumo com informacões sobre [...]]]></description>
			<content:encoded><![CDATA[<p>Estou testando o sistema de criacão de <em>widgets</em> html com informacão sobre empresas cadastradas no banco de dados do job4dev.</p>

<p>Provavelmente, não vai funcionar em leitores de RSS como o Google Reader, já que é necessário o uso de Javascript. Mas quem estiver acessando o site diretamente vai poder ver um resumo com informacões sobre o job4dev, logo abaixo.</p>

<p>Basta adicionar o código:</p>

<p><code>&lt;div class="j4d_widget"&gt;
&lt;script src="http://job4dev.com/company/scripts/job4dev/widget" type="text/javascript"&gt;&lt;/script&gt;
&lt;/div&gt;
</code></p>

<p>Para termos:
<div class="j4d_widget"><script src="http://job4dev.com/company/scripts/job4dev/widget" type="text/javascript"></script></div></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=snTlvvR8lXA:-kSqChWEsh8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=snTlvvR8lXA:-kSqChWEsh8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/log4dev/xml/~4/snTlvvR8lXA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://log4dev.com/2010/06/08/teste/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://log4dev.com/2010/06/08/teste/</feedburner:origLink></item>
		<item><title>Links for 2010-05-10 [del.icio.us]</title><link>http://feedproxy.google.com/~r/log4dev/xml/~3/AarTgghi6Oc/log4dev</link><pubDate>Tue, 11 May 2010 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/log4dev#2010-05-10</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.endpoint.com/2009/07/sdch-shared-dictionary-compression-over.html"&gt;SDCH: Shared Dictionary Compression over HTTP | End Point Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://net.tutsplus.com/tutorials/html-css-techniques/rethinking-forms-in-html5/"&gt;Rethinking Forms in HTML5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/log4dev/xml/~4/AarTgghi6Oc" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/log4dev#2010-05-10</feedburner:origLink></item><item>
		<title>HgInit</title>
		<link>http://feedproxy.google.com/~r/log4dev/xml/~3/fCsdToSPcRs/</link>
		<comments>http://log4dev.com/2010/04/20/hginit/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 15:02:50 +0000</pubDate>
		<dc:creator>Miguel Galves</dc:creator>
				<category><![CDATA[Ferramentas]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://log4dev.com/?p=736</guid>
		<description><![CDATA[Eu já twittei sobre isso, e já salvei no del.icio.us do Log4Dev. Mas dada a qualidade do material, acho que vale a pena comentar rapidamente aqui. O Joel Spolsky escreveu um excelente artigo/tutorial sobre o Mercurial, sistema de controle de versão distribuído (DCVS para os íntimos) que anda na moda ultimamente. O endereço é http://hginit.com. [...]]]></description>
			<content:encoded><![CDATA[<p>Eu já <a href="http://twitter.com/log4dev/status/9870112215">twittei</a> sobre isso, e já salvei no <a href="http://delicious.com/log4dev">del.icio.us do Log4Dev</a>. Mas dada a qualidade do material, acho que vale a pena comentar rapidamente aqui. O <strong>Joel Spolsky </strong>escreveu um excelente artigo/tutorial sobre o <a href="http://mercurial.selenic.com/">Mercurial</a>, sistema de controle de versão distribuído (DCVS para os íntimos) que anda na moda ultimamente.</p>

<p><a href="http://log4dev.com/wp-content/uploads/2010/04/hg.jpeg"><img class="aligncenter size-full wp-image-737" title="Hg Init" src="http://log4dev.com/wp-content/uploads/2010/04/hg.jpeg" alt="Hg Init" width="275" height="141" /></a></p>

<p>O endereço é <a title="HgInit" href="http://hginit.com">http://hginit.com</a>. O conteúdo serve tanto para aqueles que já se convenceram da utilidade e precisam entender o modus operandi (que foi o meu caso), como para os céticos que não deram muita bola e precisam ser convencidos.</p>

<p>E acreditem: o texto convenceu até <strong>The One Who Can&#8217;t Be Named</strong>.</p>

<p>Não é pouca porcaria não&#8230;.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=fCsdToSPcRs:Dcqagb3qhAo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=fCsdToSPcRs:Dcqagb3qhAo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/log4dev/xml/~4/fCsdToSPcRs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://log4dev.com/2010/04/20/hginit/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://log4dev.com/2010/04/20/hginit/</feedburner:origLink></item>
		<item><title>Links for 2010-04-07 [del.icio.us]</title><link>http://feedproxy.google.com/~r/log4dev/xml/~3/LHYx_qA5x_Q/log4dev</link><pubDate>Thu, 08 Apr 2010 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/log4dev#2010-04-07</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://frompythonimportpodcast.com/"&gt;Home - from python import podcast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://google-opensource.blogspot.com/2010/04/pypy-12-released.html"&gt;PyPy 1.2 Released&lt;/a&gt;&lt;br/&gt;
PyPy is a reimplementation of Python in Python, using advanced techniques to try to attain better performance than CPython. Many years of hard work have finally paid off. Our speed results often beat CPython, ranging from being slightly slower, to speedups of up to 2x on real application code, to speedups of up to 10x on small benchmarks. This post describes what we did on PyPy during the last year, leading up to those results.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ted.com/talks/blaise_aguera.html"&gt;Blaise Aguera y Arcas demos augmented-reality maps | Video on TED.com&lt;/a&gt;&lt;br/&gt;
Amazing&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/log4dev/xml/~4/LHYx_qA5x_Q" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/log4dev#2010-04-07</feedburner:origLink></item><item>
		<title>SigaSeuTime na mídia</title>
		<link>http://feedproxy.google.com/~r/log4dev/xml/~3/crNf8wembOA/</link>
		<comments>http://log4dev.com/2010/03/25/sigaseutime-na-midia/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 02:01:44 +0000</pubDate>
		<dc:creator>Miguel Galves</dc:creator>
				<category><![CDATA[Negocios]]></category>
		<category><![CDATA[Notícias]]></category>
		<category><![CDATA[Produto]]></category>

		<guid isPermaLink="false">http://log4dev.com/?p=734</guid>
		<description><![CDATA[Faço minhas as palavras de Lullis: ando calado porque ando ultra atolado de coisas, e sem tempo para o ócio criativo. Muitas coisas estão acontecendo tanto no SigaSeuTime e no Job4Dev, e a boa notícia é esses acontecimentos estão sendo acompanhados pelo reconhecimento. Hoje, o SigaSeuTime foi tema de uma matéria no site de Economia [...]]]></description>
			<content:encoded><![CDATA[<p>Faço minhas <a href="http://log4dev.com/2010/02/01/porque-ando-tao-calado/">as palavras de Lullis</a>: ando calado porque ando ultra atolado de coisas, e sem tempo para o ócio criativo. Muitas coisas estão acontecendo tanto no <strong>SigaSeuTime</strong> e no <strong>Job4Dev</strong>, e a boa notícia é esses acontecimentos estão sendo acompanhados pelo reconhecimento.</p>

<p>Hoje, o SigaSeuTime foi tema de uma matéria no site de <strong><a href="http://economia.estadao.com.br/">Economia &amp; Negócios do Estadão</a></strong>, intitulada <strong><a href="http://economia.estadao.com.br/noticias/not_10591.htm">&#8220;Redes sociais dão oportunidade de negócio ao pequeno empreendedor&#8221;</a></strong>. A matéria usa o projeto como case de como redes sociais como o Twitter servem de motor para novos empreendimentos e idéias.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=crNf8wembOA:HEcdUiqvm_s:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=crNf8wembOA:HEcdUiqvm_s:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/log4dev/xml/~4/crNf8wembOA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://log4dev.com/2010/03/25/sigaseutime-na-midia/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://log4dev.com/2010/03/25/sigaseutime-na-midia/</feedburner:origLink></item>
		<item>
		<title>langs, bashes e encodings da vida</title>
		<link>http://feedproxy.google.com/~r/log4dev/xml/~3/KbFrQTy-LpA/</link>
		<comments>http://log4dev.com/2010/02/24/langs-bashes-e-encodings-da-vida/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 13:04:08 +0000</pubDate>
		<dc:creator>Miguel Galves</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://log4dev.com/?p=732</guid>
		<description><![CDATA[Acho que posso dizer sem medo de errar que na lista de dores de cabeças que meus projetos pessoais e startups me trouxeram, a questão da codificação de strings está tranquilamente entre os TOP 3. E quando eu achei que tudo nesta área estava resolvido, eis que me apareceu um novo bug do nada que [...]]]></description>
			<content:encoded><![CDATA[<p>Acho que posso dizer sem medo de errar que na lista de dores de cabeças que meus projetos pessoais e startups me trouxeram, a questão da <strong>codificação de strings</strong> está tranquilamente entre os TOP 3. E quando eu achei que tudo nesta área estava resolvido, eis que me apareceu um novo bug do nada que me fez perder algumas horas de mal humor. Porque coisas que funcionam por meses e de repente param de funcionar sem motivo aparente em geral me tiram do sério.</p>

<p>O <a href="http://www.sigaseutime.com.br">SigaSeuTime</a> (cujo novo site acaba de estrear, se me permitem o autojabá) possui dois bots IM, <strong>GTalk</strong> e <strong>MSN</strong>, que fazem parte do conjunto de plataformas para distribuição de contéudo. Ambos os bots são escritos em <strong>Java</strong>, e a plataforma é escrita em Python. Para fazer a comunicação entre os subsistemas eu uso ou <strong>REST</strong> ou comunicação via <strong>UDP</strong>. No caso das notícias em tempo real, acabei optando por UDP para evitar pooling desnecessário. E isso funcionou perfeitamente nos últimos 6 meses: um agente se encarrega de puxar as notícias, processar, filtrar e gravar na base de dados. Outro agente lê as notícias novas e manda pros bots via UDP, para envio aos usuários online. .</p>

<p>Até que de repente, as mensagens começaram a aparecer tanto no MSN quanto no GTalk  com a <strong>acentuação</strong> totalmente errada. Típico resultado de strings codificadas de um jeito e interpretadas de outro (<a href="http://log4dev.com/2009/05/18/identificacao-de-charsets/">tinha que existir um jeito fácil e direto de se descobrir a codificação de uma string sem a necessidade de metadados</a>)! Olhando para o histórico do meu SVN vi que as últimas modificações em códigos relativos aos componentes envolvidos neste processo datavam de no mínimo 3 meses.</p>

<p>Ou seja, só podia ser culpa do meu servidor, ou do alinhamento planetário, ou então do Bush! Não não&#8230;a culpa, obviamente era minha. Sempre é, por mais que a gente lute contra isso.</p>

<p>A causa do problema estava em um script <strong>SHELL</strong> que eu criei recentemente cujo objetivo é de reiniciar os bots em caso de falha de comunicação com os servidores. Até então, o processo de reboot era manual, feito por mim mesmo via shell SSH, e a função deste script é de automatizar o processo, matando e executando novamente o bot.</p>

<p>Inofensivo certo? Nem tanto. O script é executado periódicamente pelo crontab do sistema operacional, e foi aí que o problema nasceu: as variáveis de ambiente do cronjob são diferentes das variáveis de ambiente do SHELL SSH, e em particular o segundo possui a variável <strong>LANG=en_us.UTF-8</strong>, que é justamente a codificação usada internamente pelo sistema. Vivendo e aprendendo: isto influi diretamente na JRE, e a falta da variável fez com que o sistema assumisse outra codificação (provavelmente <strong>ISO Latin 1</strong>). A solução foi exportar a variável no meu script.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=KbFrQTy-LpA:AJlCLSVM7Q0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/log4dev/xml?a=KbFrQTy-LpA:AJlCLSVM7Q0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/log4dev/xml?d=7Q72WNTAKBA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/log4dev/xml/~4/KbFrQTy-LpA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://log4dev.com/2010/02/24/langs-bashes-e-encodings-da-vida/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://log4dev.com/2010/02/24/langs-bashes-e-encodings-da-vida/</feedburner:origLink></item>
	</channel>
</rss>
