<?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>Henrique Bastos.NET</title>
	
	<link>http://henriquebastos.net</link>
	<description />
	<lastBuildDate>Sun, 02 Jun 2013 14:22:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/henriquebastos" /><feedburner:info uri="henriquebastos" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Balanço da PythonNordeste 2013</title>
		<link>http://feedproxy.google.com/~r/henriquebastos/~3/PiIY7YLV-60/</link>
		<comments>http://henriquebastos.net/2013/06/02/balanco-da-pythonnordeste-2013/#comments</comments>
		<pubDate>Sun, 02 Jun 2013 14:22:43 +0000</pubDate>
		<dc:creator>Henrique Bastos</dc:creator>
				<category><![CDATA[Português]]></category>
		<category><![CDATA[evento]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[pythonnordeste]]></category>

		<guid isPermaLink="false">http://henriquebastos.net/?p=1213</guid>
		<description><![CDATA[Eu participo de eventos principalmente para conhecer pessoas. Sei que um evento foi bom, quando volto para casa e preciso de alguns dias para assentar as ideias e refletir sobre as discussões e aprendizados. A PythonNordeste me exigiu uma semana! A galera O evento foi intenso e integrador, reunindo muita gente diferente, de diferentes regiões. [...]]]></description>
			<content:encoded><![CDATA[<p>Eu participo de eventos principalmente para conhecer pessoas. Sei que um evento foi bom, quando volto para casa e preciso de alguns dias para assentar as ideias e refletir sobre as discussões e aprendizados. A  <a href="http://pythonnordeste.org/" onclick="pageTracker._trackPageview('/outgoing/pythonnordeste.org/?referer=');">PythonNordeste</a> me exigiu uma semana!</p>
<p><span id="more-1213"></span></p>
<h3>A galera</h3>
<p>O evento foi intenso e integrador, reunindo muita gente diferente, de diferentes regiões.</p>
<p>Reencontrei pythonistas das antigas, conheci profissionais experientes em outras tecnologias, estudantes querendo descobrir o que fazer da vida, zootecnistas buscando soluções em software, empresários do mercado de TI,  sysadmins e especialistas em segurança que usam Python como arma secreta, professores universitários querendo engajar seus alunos, e pessoas que estavam ali só acompanhando alguém, mas acabaram se integrando facilmente nas conversas.</p>
<p><a href="https://www.facebook.com/photo.php?fbid=450836468338689&#038;set=pb.397090083713328.-2207520000.1370180210.&#038;type=3&#038;src=https%3A%2F%2Ffbcdn-sphotos-e-a.akamaihd.net%2Fhphotos-ak-frc1%2F581757_450836468338689_1225997794_n.jpg&#038;size=960%2C640" onclick="pageTracker._trackPageview('/outgoing/www.facebook.com/photo.php?fbid=450836468338689_038_set=pb.397090083713328.-2207520000.1370180210._038_type=3_038_src=https_3A_2F_2Ffbcdn-sphotos-e-a.akamaihd.net_2Fhphotos-ak-frc1_2F581757_450836468338689_1225997794_n.jpg_038_size=960_2C640&amp;referer=');"><img class="aligncenter" src="https://fbcdn-sphotos-e-a.akamaihd.net/hphotos-ak-frc1/581757_450836468338689_1225997794_n.jpg" alt="A galera" /></a></p>
<p>Além disso, tive o prazer de conhecer pessoalmente ex-alunos do <a href="http://welcometothedjango.com.br/" onclick="pageTracker._trackPageview('/outgoing/welcometothedjango.com.br/?referer=');">Welcome to the Django</a> e alunos que já estão inscritos para a <a href="http://welcometothedjango.com.br/inscreva-se/" onclick="pageTracker._trackPageview('/outgoing/welcometothedjango.com.br/inscreva-se/?referer=');">próxima turma de Julho</a>. Essa é sem dúvidas a melhor parte de dar aula.</p>
<p>Apesar do Nordeste no nome do evento, foi sensacional encontrar gente do país inteiro. Os amigos da Bahia vieram em massa, mas senti falta de figuras como o <a href="http://twitter.com/gutomaia" onclick="pageTracker._trackPageview('/outgoing/twitter.com/gutomaia?referer=');">Guto Maia</a> e o <a href="http://twitter.com/rafaelmbr" onclick="pageTracker._trackPageview('/outgoing/twitter.com/rafaelmbr?referer=');">Rafael Miranda</a>. A galera do Rio também veio em bando.</p>
<p>Os destaques foram os 3 mosqueteiros do Maranhão: <a href="http://twitter.com/raelmax" onclick="pageTracker._trackPageview('/outgoing/twitter.com/raelmax?referer=');">Rael Max</a>, <a href="http://twitter.com/hersonls" onclick="pageTracker._trackPageview('/outgoing/twitter.com/hersonls?referer=');">Herson Leite</a> e <a href="http://www.facebook.com/helton.alves.16" onclick="pageTracker._trackPageview('/outgoing/www.facebook.com/helton.alves.16?referer=');">Helton Alves</a>. Tem alguma coisa especial na água que o povo bebe por aquelas bandas. Não tem tempo ruim, é só alegria e diversão. Mal posso esperar para participar da inauguração do <em>PUG-MA Hackerclube</em> que eles já estão montando por lá ainda esse ano.</p>
<h3>Palestras</h3>
<p>O evento teve <a href="http://pythonnordeste.org/#programacao" onclick="pageTracker._trackPageview('/outgoing/pythonnordeste.org/_programacao?referer=');">muitas palestras interessantes</a> e vale a pena dar uma olhada nos slides. Em especial, teve o <a href="https://twitter.com/marcelorange" onclick="pageTracker._trackPageview('/outgoing/twitter.com/marcelorange?referer=');">Marcelo Melo</a> falando de <a href="http://www.slideshare.net/MarceloMelo2/raspberry-pi-o-hardware-para-python" onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/MarceloMelo2/raspberry-pi-o-hardware-para-python?referer=');">Raspberry Pi</a>, o <a href="https://twitter.com/rodsenra" onclick="pageTracker._trackPageview('/outgoing/twitter.com/rodsenra?referer=');">Rodrigo Senra</a> dando um show à parte sobre <a href="http://www.slideshare.net/rodsenra/depurador-onisciente" onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/rodsenra/depurador-onisciente?referer=');">depuradores</a>, o <a href="http://twitter.com/diegodukao" onclick="pageTracker._trackPageview('/outgoing/twitter.com/diegodukao?referer=');">Diego Dukão</a> <a href="http://www.slideshare.net/diegodukao/kivy-2013" onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/diegodukao/kivy-2013?referer=');">apresentando</a> o <a href="http://kivy.org/" onclick="pageTracker._trackPageview('/outgoing/kivy.org/?referer=');">Kivy</a>,  e o <a href="https://twitter.com/fmasanori" onclick="pageTracker._trackPageview('/outgoing/twitter.com/fmasanori?referer=');">Fernando Masanori</a> compartilhando sua experiência no ensino de programação para crianças e jovens.</p>
<p>Eu falei sobre <a href="https://speakerdeck.com/henriquebastos/ecossistema" onclick="pageTracker._trackPageview('/outgoing/speakerdeck.com/henriquebastos/ecossistema?referer=');">ecossistemas</a>, buscando evidenciar a importância de uma comunidade forte e compartilhando algumas dicas de como cada um poderia hackear as dificuldades do dia-a-dia para sair da zona de conforto e participar ativamente da construção do seu ecossistema local.</p>
<p>A diversão ficou completa com as palestras relâmpago. Esse é sempre um dos melhores momentos de qualquer conferência.</p>
<p>Os pontos altos foram <em>&#8220;Convertendo coleções em Python para XML&#8221;</em> que no final foi sabotada pelo teclado do Mac, <em>&#8220;Integrando Kivy com Voip&#8221;</em> onde a turma de Natal rascunhou uma interface interativa para central telefônica, e por último e mais engraçado os trolladores do Maranhão mostraram que <em>&#8220;Marco Feliciano não nos representa&#8221;</em>. Foi hilário!</p>
<h3>#Horaextras</h3>
<p>Como todo bom evento, a turma dormiu pouco, se dividindo entre palestras e bares. Fortaleza tem ambientes sensacionais para reunir os amigos. Fomos à vários lugares, incluindo a Praia do Futuro e o Boteco da Praia.</p>
<p><a href="http://www.flickr.com/photos/henriquebastos/8892033701/" onclick="pageTracker._trackPageview('/outgoing/www.flickr.com/photos/henriquebastos/8892033701/?referer=');"><img class="aligncenter" src="http://farm4.staticflickr.com/3723/8892033701_36e773d9a3.jpg" alt="Praia do Futuro" /></a></p>
<p>Porém, os dois lugares mais acessíveis e divertidos foram: o <a href="https://maps.google.com/maps?q=Ass%C3%ADs+O+Rei+da+Picanha+-+Rua+Ana+Bilhar,+1356+-+Varjota,+Fortaleza+-+CE,+Brazil&amp;hl=en&amp;ie=UTF8&amp;sll=-3.718394,-38.543395&amp;sspn=0.434416,0.727158&amp;oq=assis&amp;t=h&amp;hq=Ass%C3%ADs+O+Rei+da+Picanha+-&amp;hnear=R.+Ana+Bilhar,+1356+-+Varjota,+Fortaleza+-+Cear%C3%A1,+60160-110,+Brazil&amp;z=17" onclick="pageTracker._trackPageview('/outgoing/maps.google.com/maps?q=Ass_C3_ADs+O+Rei+da+Picanha+-+Rua+Ana+Bilhar_+1356+-+Varjota_+Fortaleza+-+CE_+Brazil_amp_hl=en_amp_ie=UTF8_amp_sll=-3.718394_-38.543395_amp_sspn=0.434416_0.727158_amp_oq=assis_amp_t=h_amp_hq=Ass_C3_ADs+O+Rei+da+Picanha+-_amp_hnear=R.+Ana+Bilhar_+1356+-+Varjota_+Fortaleza+-+Cear_C3_A1_+60160-110_+Brazil_amp_z=17&amp;referer=');">Bar Assis</a> e o <a href="https://maps.google.com/maps?q=At+Home+Hostel+%26+Pub+-+Rua+Canuto+de+Aguiar,+Fortaleza+-+Ceara,+Brazil&amp;hl=en&amp;ie=UTF8&amp;sll=-3.73165,-38.488228&amp;sspn=0.006788,0.011362&amp;oq=at+ho&amp;t=h&amp;hq=At+Home+Hostel+%26+Pub+-&amp;hnear=R.+Canuto+de+Aguiar+-+Meireles,+Fortaleza+-+Cear%C3%A1,+60160-120,+Brazil&amp;z=16" onclick="pageTracker._trackPageview('/outgoing/maps.google.com/maps?q=At+Home+Hostel+_26+Pub+-+Rua+Canuto+de+Aguiar_+Fortaleza+-+Ceara_+Brazil_amp_hl=en_amp_ie=UTF8_amp_sll=-3.73165_-38.488228_amp_sspn=0.006788_0.011362_amp_oq=at+ho_amp_t=h_amp_hq=At+Home+Hostel+_26+Pub+-_amp_hnear=R.+Canuto+de+Aguiar+-+Meireles_+Fortaleza+-+Cear_C3_A1_+60160-120_+Brazil_amp_z=16&amp;referer=');">At Home</a> que é uma república com um bar na garagem onde rola Rock&#8217;n Roll de qualidade a noite toda.</p>
<p><a href="http://www.flickr.com/photos/henriquebastos/8892656010/" onclick="pageTracker._trackPageview('/outgoing/www.flickr.com/photos/henriquebastos/8892656010/?referer=');"><img class="aligncenter" src="http://farm3.staticflickr.com/2882/8892656010_e234330440.jpg" alt="#Horaextra no Assis"></a></p>
<p>Se você vai organizar um evento em Fortaleza, nem pense duas vezes, reserve logo uma mesa grande no Assis e feche a noite no At Home.</p>
<h3>Conclusão</h3>
<p>A PythonNordeste já deixou saudades. Os organizadores mostraram na prática que fazer <em>um grande evento</em> vale mais do que fazer <em>um evento grande</em>.</p>
<p>Parabéns, rapaziada! Nos vemos logo mais na <a href="http://2013.pythonbrasil.org.br/" onclick="pageTracker._trackPageview('/outgoing/2013.pythonbrasil.org.br/?referer=');">PythonBrasil 2013 em Brasília</a> e na PythonNordeste 2014 em Recife.</p>
<p>[]&#8216;s, HB!</p>
<img src="http://feeds.feedburner.com/~r/henriquebastos/~4/PiIY7YLV-60" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://henriquebastos.net/2013/06/02/balanco-da-pythonnordeste-2013/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://henriquebastos.net/2013/06/02/balanco-da-pythonnordeste-2013/</feedburner:origLink></item>
		<item>
		<title>Começando um Podcast</title>
		<link>http://feedproxy.google.com/~r/henriquebastos/~3/3CcUbMJm6iw/</link>
		<comments>http://henriquebastos.net/2013/05/14/comecando-um-podcast/#comments</comments>
		<pubDate>Tue, 14 May 2013 19:36:38 +0000</pubDate>
		<dc:creator>Henrique Bastos</dc:creator>
				<category><![CDATA[Português]]></category>

		<guid isPermaLink="false">http://henriquebastos.net/?p=1208</guid>
		<description><![CDATA[As melhores discussões que me lembro, aconteceram em uma mesa de bar. O único inconveniente é que aquelas conversas fantásticas, ficavam restritas àquele espaço e tempo. Como levá-las adiante? Como incluir até quem não estava presente? Como permitir a colaboração daquele amigo próximo que mora em Cuiabá, em Brasília, em Belém ou até em Orlando? [...]]]></description>
			<content:encoded><![CDATA[<p>As melhores discussões que me lembro, aconteceram em uma mesa de bar. O único inconveniente é que aquelas conversas fantásticas, ficavam restritas àquele espaço e tempo.</p>
<p>Como levá-las adiante? Como incluir até quem não estava presente? Como permitir a colaboração daquele amigo próximo que mora em Cuiabá, em Brasília, em Belém ou até em Orlando?</p>
<p><span id="more-1208"></span></p>
<p>Já tentamos gravar as conversas para jogar na internet, mas o barulho do ambiente não permitiu e acabamos deixando isso de lado.</p>
<p>Recentemente levantei essa questão novamente durante um Pós-Dojo, com a ideia de gravar um podcast. O <a href="https://twitter.com/diegodukao" onclick="pageTracker._trackPageview('/outgoing/twitter.com/diegodukao?referer=');">Diego Dukão</a> que já toca o sensacional <a href="http://mobilidade.fm/" onclick="pageTracker._trackPageview('/outgoing/mobilidade.fm/?referer=');">Mobilidade.fm</a>, providenciou o empurrão que faltava.</p>
<h3>Qual o objetivo do podcast?</h3>
<p>O podcast em si não tem objetivo específico, além de discutir o que parece interessante. Em vez nós definirmos previamente as coisas, faz muito mais sentido deixar a galera interagir e ver o que acontece.</p>
<h3>Mas como funciona?</h3>
<p>A ideia até então é um bate-papo via Hangout ou Skype, despretensioso, preferencialmente regado à alguma cerveja.</p>
<h3>E quais assuntos serão abordados?</h3>
<p>Ideias não faltam, mas <strong>queremos saber a sua.</strong></p>
<p>Eu, pessoalmente, ando interessado em autonomia e no uso da tecnologia para viver mais simples.</p>
<p>Mas isso sou eu. <strong>E você? O que quer você quer discutir?</strong></p>
<p>Alguns assuntos emergiram no bar sem ordem específica:</p>
<ul>
<li>Money que é good e nóis num have: Mexendo com dinheiro sem burocracia.</li>
<li>Programe ou seja programado: Saber programar é o novo saber escrever.</li>
<li>A Morte da Profissão.</li>
<li>A filosofia por trás do Test Driven Development.</li>
<li>Empreendedorismo sem &#8220;empresarialismo&#8221;.</li>
<li>Agile sem frescura: eliminando gargalos em processos.</li>
<li>Blogueiro por necessidade: A importância de botar a cara na internet e compartilhar o que você tem à dizer.</li>
<li>Empreendendo na Internet: Emita a 1a nota fiscal sem nem escrever uma linha de código.</li>
<li>Negócios em Rede: O que são e como funcionam.</li>
<li>Escritório Ubíquo: Organizando o dia à dia para poder morar numa mochila.</li>
<li>Vender não é enganar: Discutindo o tabu da venda.</li>
<li>Filho, como funciona a internet? Como você explicaria para os seus pais?</li>
<li>A história do Design.</li>
<li>Gestalt e a compreensão do ser humano sobre si mesmo.</li>
<li>Serviços não escalam, mas amplificam.</li>
</ul>
<p>Para este primeiro experimento, o Dukão ficou animado de começarmos falando sobre grana. Sobre como podemos nos organizar para levar uma vida mais alinhada com o que desejamos, tendo mais tempo para nós mesmos.</p>
<p>Aceitamos sugestões até a hora da gravação, que acontecerá nesta quarta-feira às 23h.</p>
<p>Gostou da ideia? Tem alguma sugestão? Quer participar? Fale livremente aí nos comentários que a gente vai batendo bola.</p>
<p>[]&#8216;s, HB!</p>
<img src="http://feeds.feedburner.com/~r/henriquebastos/~4/3CcUbMJm6iw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://henriquebastos.net/2013/05/14/comecando-um-podcast/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		<feedburner:origLink>http://henriquebastos.net/2013/05/14/comecando-um-podcast/</feedburner:origLink></item>
		<item>
		<title>Ainda Somos Tão Jovens</title>
		<link>http://feedproxy.google.com/~r/henriquebastos/~3/64Jel7PiI-4/</link>
		<comments>http://henriquebastos.net/2013/05/12/ainda-somos-tao-jovens/#comments</comments>
		<pubDate>Sun, 12 May 2013 03:27:55 +0000</pubDate>
		<dc:creator>Henrique Bastos</dc:creator>
				<category><![CDATA[Português]]></category>

		<guid isPermaLink="false">http://henriquebastos.net/?p=1189</guid>
		<description><![CDATA[O filme &#8220;Somos Tão Jovens&#8221; retrata o processo do Renato virar Russo, com todos os seus dilemas e complexidades. Gostei tanto do filme que decidi escrever este artigo. Como entendedor de cinema, eu sou um ótimo jogador de purrinha. Então vou me limitar às reflexões que o filme me provocou. &#8220;Deve ser difícil viver na [...]]]></description>
			<content:encoded><![CDATA[<p>O filme &#8220;Somos Tão Jovens&#8221; retrata o processo do Renato virar Russo, com todos os seus dilemas e complexidades. Gostei tanto do filme que decidi escrever este artigo.</p>
<p>Como entendedor de cinema, eu sou um ótimo jogador de purrinha. Então vou me limitar às reflexões que o filme me provocou.</p>
<p><span id="more-1189"></span></p>
<h3>&#8220;Deve ser difícil viver na sua cabeça.&#8221;</h3>
<p>Essa é uma frase que costumo ouvir bastante em casa quando converso sobre minhas ideias e visões &#8220;incomuns&#8221;.</p>
<p>Então se você é dessas pessoas que tem a mente agitada, assistir ao filme vai lhe proporcionar uma certa paz, pois devia ser ainda mais difícil viver na cabeça do Renato Russo.</p>
<p>Brincadeiras à parte, as tensões de se lançar em busca da percepção do que se deseja ficam muito bem retratadas no filme. O ator consegue transmitir com muita sensibilidade as ondas de tédio, dúvidas e os impulsos que motivam ações incompreendidas, mas muito necessárias.</p>
<h3>Singularidade</h3>
<p>Como diria Sílvio Meira, <a href="http://www.youtube.com/watch?v=nMMGl9HAFXk" title="Esse vídeo é foda!" onclick="pageTracker._trackPageview('/outgoing/www.youtube.com/watch?v=nMMGl9HAFXk&amp;referer=');">o futuro vem do futuro</a>.</p>
<p>Quem diria que de um grupo de adolescentes que não tinham mais o que fazer surgiriam diversas bandas que trilhariam o caminho que hoje conhecemos?</p>
<p>Ninguém! O sucesso como instituído e vendido socialmente é improvável, por isso é tão importante construir sua própria definição de sucesso.</p>
<p>É muito interessante a trajetória caótica de sucessivos nascimentos, mortes e ressurreições de bandas.</p>
<p>Esse grau de liberdade é importante para que se continue fazendo, tentando, mesmo com o desconforto de não compreender antecipadamente o que se faz.</p>
<p>Em uma cena em especial, os integrantes do Legião Urbana estão discutindo: &#8220;e se não der certo?&#8221;; E o Renato afirma: &#8220;Eu não quero nem pensar em alternativa.&#8221;</p>
<p>Essa é a virada de chave. Uma <strong>decisão a despeito das circunstâncias</strong>.</p>
<h3>O Nativo e o Outsider</h3>
<p>O filme tem muitas cenas interessantes que retratam &#8220;maluquices&#8221; cotidianas.</p>
<p>Todos temos as nossas. Mas quando expostas ao social, a reação padrão é de estranheza seguida pelo julgamento: &#8220;Esse cara é maluco&#8221;.</p>
<p>Atitudes como perder um show para meditar sobre a morte do John Lennon porque a Yoko Ono pediu.</p>
<p>Julgar o que não se compreende está na raiz da intolerância. O <em>outsider</em>, que não compreende o comportamento e as motivações do <em>nativo</em>, julga, deixando de reconhecer o outro como <em>alguém</em>, e o reduzindo à alguma <em>coisa</em>.</p>
<p>O remédio para este comportamento é a &#8220;observação participativa&#8221;, um conceito antropológico que enfatiza: observar sem interagir não proporciona compreensão.</p>
<p>Julgar sem compreender nos leva a ignorar que é possível haver sentido, por mais que não se perceba lógica.</p>
<p>Em algum momento a gente esqueceu que <strong>sentido vem de sentir</strong> e não de racionalizar. O resultado desse esquecimento? Um monte de outsiders julgando nativos e divulgando seus veredictos vazios no Facebook, sem compreender que de alguma forma, todos somos nativos e outsiders em diferentes situações.</p>
<h3>Homofobia</h3>
<p>Como mencionado pelo <a href="http://www.cinemaemcena.com.br/plus/modulos/filme/ver.php?cdfilme=4633" onclick="pageTracker._trackPageview('/outgoing/www.cinemaemcena.com.br/plus/modulos/filme/ver.php?cdfilme=4633&amp;referer=');">Pablo Villaça</a>, o filme demonstra covardia ao abordar os dilemas sexuais do protagonista.</p>
<p>O filme já vinha tratando do tema sexualidade, até que Renato conhece Carlinhos e se segue uma cena bonita e muito humana, retratando duas pessoas se conhecendo e se reconhecendo.</p>
<p>Mas uma parte da platéia pareceu não estar vendo o mesmo filme que eu. Logo quando os personagens se conhecem, a platéia reage em coro com murmurinhos e risos.</p>
<p>Me senti extremamente constrangido, ofendido e em seguida, profundamente triste.</p>
<p>Acho que aprendi o que é homofobia. A homofobia velada. É uma coisa mínima, uma sutileza que passa despercebida, mas que ofende profundamente e não permite defesa.</p>
<p>Fiquei triste ao constatar que a homofobia e as demais fobias sociais, não se resumem a intolerância. Mais do que intolerância, há uma <strong>incapacidade de apreciação das diferenças</strong>. As pessoas estão incapazes de reconhecer o afeto, o amor, a humanidade na relação entre duas pessoas quaisquer.</p>
<h3>Quanto tempo são 30 anos?</h3>
<p>Pra mim, que tenho essa idade, é tudo. Mas parece que culturalmente 30 anos são 30 segundos.</p>
<p>A contemporaneidade das letras do Renato Russo é assustadora. Aquelas músicas poderiam ter sido escritas hoje pela manhã.</p>
<p>Saí do cinema com a sensação de que não se passaram 30 anos no Brasil. Ainda nos falta sensibilidade para nos reconhecermos uns nos outros. Essa falta de empatia, consequentemente, gera falta de engajamento para fazermos as mudanças por nós mesmos.</p>
<p>Ainda não conseguimos ler além do que está literalmente escrito, nem ver além do que está explícito na cena. Precisamos de óculos melhores para lermos as entrelinhas das questões, das notícias, das inúmeras distrações que nos empurram para a ignorância.</p>
<p>Não, isso não é uma reclamação. É um ato de conscientização. Um lembrete de que ainda tem chão pela frente. De que ainda não estamos onde queremos. Ao menos eu ainda não estou.</p>
<img src="http://feeds.feedburner.com/~r/henriquebastos/~4/64Jel7PiI-4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://henriquebastos.net/2013/05/12/ainda-somos-tao-jovens/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		<feedburner:origLink>http://henriquebastos.net/2013/05/12/ainda-somos-tao-jovens/</feedburner:origLink></item>
		<item>
		<title>Cuidados importantes ao configurar i18n no Django</title>
		<link>http://feedproxy.google.com/~r/henriquebastos/~3/tqO3yRwgMJY/</link>
		<comments>http://henriquebastos.net/2013/04/03/cuidados-importantes-ao-configurar-i18n-no-django/#comments</comments>
		<pubDate>Wed, 03 Apr 2013 21:10:20 +0000</pubDate>
		<dc:creator>Henrique Bastos</dc:creator>
				<category><![CDATA[Português]]></category>
		<category><![CDATA[dica]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[i18n]]></category>

		<guid isPermaLink="false">http://henriquebastos.net/?p=1174</guid>
		<description><![CDATA[A Babilônia caiu não foi por acaso. Internacionalização (aka i18n) é trabalhoso por natureza, e quando você esbarra em sutilezas de configuração pode ser irritante. Esta semana eu decidi finalmente adaptar o site do Small Acts Manifesto para outros idiomas, e no processo acabei caindo numa cilada de coincidências. Para que você não cometa o [...]]]></description>
			<content:encoded><![CDATA[<p>A Babilônia caiu não foi por acaso. Internacionalização (<em>aka <a href="https://en.wikipedia.org/wiki/Internationalization_and_localization" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Internationalization_and_localization?referer=');">i18n</a></em>) é  trabalhoso por natureza, e quando você esbarra em sutilezas de configuração pode ser irritante.</p>
<p>Esta semana eu decidi <em>finalmente</em> adaptar o site do <a href="http://smallactsmanifesto.org" onclick="pageTracker._trackPageview('/outgoing/smallactsmanifesto.org?referer=');">Small Acts Manifesto</a> para outros idiomas, e no processo acabei caindo numa cilada de coincidências.</p>
<p>Para que você não cometa o mesmo erro, criei uma receitinha de bolo para configurar o projeto. <span id="more-1174"></span></p>
<h4>Começe pelo settings.py:</h4>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">USE_I18N = <span style="color: #008000;">True</span>
LANGUAGES = <span style="color: black;">&#40;</span>
    <span style="color: black;">&#40;</span><span style="color: #483d8b;">'en'</span>, u<span style="color: #483d8b;">'English'</span><span style="color: black;">&#41;</span>,
    <span style="color: black;">&#40;</span><span style="color: #483d8b;">'pt-br'</span>, u<span style="color: #483d8b;">'Português'</span><span style="color: black;">&#41;</span>,
<span style="color: black;">&#41;</span>
LOCALE_PATHS = <span style="color: black;">&#40;</span>PROJECT_DIR.<span style="color: black;">child</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'locale'</span><span style="color: black;">&#41;</span>,<span style="color: black;">&#41;</span></pre></div></div>

<p>É simples, mas temos alguns pontos de atenção:</p>
<ul>
<li>O <a href="https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-LANGUAGES" onclick="pageTracker._trackPageview('/outgoing/docs.djangoproject.com/en/dev/ref/settings/_std_setting-LANGUAGES?referer=');">LANGUAGES</a> é uma tupla de tuplas. O primeiro elemento das tuplas é o <a href="https://docs.djangoproject.com/en/dev/topics/i18n/#definitions" onclick="pageTracker._trackPageview('/outgoing/docs.djangoproject.com/en/dev/topics/i18n/_definitions?referer=');">language code</a>. Para português brasileiro o valor é <code>pt-br</code>, <strong>tudo minúsculo separado por hífen</strong>.</li>
<li><a href="https://docs.djangoproject.com/en/dev/ref/settings/#locale-paths" onclick="pageTracker._trackPageview('/outgoing/docs.djangoproject.com/en/dev/ref/settings/_locale-paths?referer=');">LOCALE_PATHS</a> é escrito no plural e aceita vários diretórios, portanto é uma tupla contendo strings.</li>
<li>Se você não sabe o que é o <code>PROJECT_DIR</code>, <a href="http://www.youtube.com/watch?v=dNJXN70Nqt0&#038;feature=youtu.be&#038;t=41m20s" onclick="pageTracker._trackPageview('/outgoing/www.youtube.com/watch?v=dNJXN70Nqt0_038_feature=youtu.be_038_t=41m20s&amp;referer=');">veja nesta palestra</a>.</li>
</ul>
<h4>Crie os arquivos .po</h4>
<p>Cada idioma tem um &#8220;código fonte&#8221; da tradução.</p>
<p>O Django varre todo o código fonte e reúne as strings marcadas para tradução com o comando:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">python manage.py makemessages -l en -l pt_BR</pre></div></div>

<p>Atenção, o parâmetro deve ser <code>pt_BR</code>, com <strong>pt em minúsculo e BR em maiúsculo, separados por underscore</strong>. Esse formato é o <a href="https://docs.djangoproject.com/en/dev/topics/i18n/#definitions" onclick="pageTracker._trackPageview('/outgoing/docs.djangoproject.com/en/dev/topics/i18n/_definitions?referer=');">locale name</a> e este valor será usado para criar o <strong>diretório</strong> que conterá o arquivo <code>django.po</code>.</p>
<h4>Usando as traduções</h4>
<p>Depois de definir as traduções editando os arquivos .po, basta empacotar a tradução, compilando os .po em .mo para os idiomas disponíveis:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">python manage.py compilemessages</pre></div></div>

<p>Ao longo do projeto você vai usar várias vezes o <code>makemessages</code> e o <code>compilemessages</code>.</p>
<p>Se você for realizar traduções colaborativas, o  <a href="https://www.transifex.com/" onclick="pageTracker._trackPageview('/outgoing/www.transifex.com/?referer=');">Transifex</a> pode ajudar bastante e é grátis para projetos open source.</p>
<h4>Mas e a cilada?</h4>
<p>Quando eu implementei conteúdo em português tudo funcionava bem no ambiente de desenvolvimento, mas no ambiente de stage o site só exibia o idioma padrão que é o inglês. Clássico caso de <a href="http://www.keepcalm-o-matic.co.uk/p/keep-calm-it-works-on-my-machine/" onclick="pageTracker._trackPageview('/outgoing/www.keepcalm-o-matic.co.uk/p/keep-calm-it-works-on-my-machine/?referer=');">works on my machine</a>. Como pode?</p>
<p>O problema era que eu estava desenvolvendo no Mac e o site está hospedado em Linux.</p>
<p>Por desatenção, eu executei o <code>makemessages -l pt_br</code>, em minúsculo.</p>
<p>Na minha máquina tudo funcionava, porque o filesystem do Mac <a href="http://davidwinter.me/articles/2008/05/17/mac-os-xhfs-case-insensitive-why/" onclick="pageTracker._trackPageview('/outgoing/davidwinter.me/articles/2008/05/17/mac-os-xhfs-case-insensitive-why/?referer=');">não é case sensitive por padrão</a>, logo conseguia encontrar o diretório. Já no Linux, era como se não existisse dicionário disponível em português.</p>
<h4>Qual a moral da história?</h4>
<p>Use <a href="http://www.vagrantup.com/" onclick="pageTracker._trackPageview('/outgoing/www.vagrantup.com/?referer=');">vagrant</a> mesmo em um site ridiculamente pequeno, e compartilhe seus tropeços para que outros possam rir de você, com você. <img src='http://henriquebastos.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
<p>[]&#8216;s, HB!</p>
<img src="http://feeds.feedburner.com/~r/henriquebastos/~4/tqO3yRwgMJY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://henriquebastos.net/2013/04/03/cuidados-importantes-ao-configurar-i18n-no-django/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://henriquebastos.net/2013/04/03/cuidados-importantes-ao-configurar-i18n-no-django/</feedburner:origLink></item>
		<item>
		<title>A importância do movimento DIY</title>
		<link>http://feedproxy.google.com/~r/henriquebastos/~3/6Smm3VBoOa0/</link>
		<comments>http://henriquebastos.net/2013/03/31/a-importancia-do-movimento-diy/#comments</comments>
		<pubDate>Mon, 01 Apr 2013 02:27:54 +0000</pubDate>
		<dc:creator>Henrique Bastos</dc:creator>
				<category><![CDATA[Português]]></category>

		<guid isPermaLink="false">http://henriquebastos.net/?p=1169</guid>
		<description><![CDATA[Depois que retuitei a frase do Vini Braga: &#8220;As pessoas precisam entender de uma vez por todas, a busca da &#8220;invisibilidade da tecnologia&#8221; é um dos pilares do totalitarismo vigente.&#8221; O Luis Soeiro perguntou se eu poderia explicar melhor&#8230; Tecnologia é conhecimento aplicado. Basicamente, com a ciência conhecemos a natureza e com a engenharia criamos [...]]]></description>
			<content:encoded><![CDATA[<p>Depois que retuitei a frase do <a href="https://twitter.com/basaldizain" onclick="pageTracker._trackPageview('/outgoing/twitter.com/basaldizain?referer=');">Vini Braga</a>:</p>
<blockquote><p>&#8220;As pessoas precisam entender de uma vez por todas, a busca da &#8220;invisibilidade da tecnologia&#8221; é um dos pilares do totalitarismo vigente.&#8221;
</p></blockquote>
<p>O <a href="https://twitter.com/luissoeiro/" onclick="pageTracker._trackPageview('/outgoing/twitter.com/luissoeiro/?referer=');">Luis Soeiro</a> perguntou se eu poderia explicar melhor&#8230; <span id="more-1169"></span></p>
<p>Tecnologia é conhecimento aplicado. Basicamente, com a ciência conhecemos a natureza e com a engenharia criamos ferramentas a partir destes conhecimentos.</p>
<p>No início, uma nova tecnologia encanta, mas logo a gente se acostuma com ela e a incorpora na nossa rotina. Com o tempo, tecnologia vira mágica, no sentido de que todos apreciam, alguns sabem como ela funciona, poucos sabem como implementá-la e uma restrita minoria detém o <em>direito</em> de reproduzí-la.</p>
<p>Tecnologia existe para expandir a capacidade do ser humano. Mas se nossas capacidades são tão ampliadas com tecnologias, por qual razão temos cada vez menos tempo? Por que estamos cada vez correndo mais?</p>
<p>Porque não dominamos as tecnologias. Apenas as usamos para obtermos um resultado. E a cultura do &#8220;foco no resultado&#8221; dispensa o acesso a como as coisas funcionam, apesar de dependermos cada vez mais destas ferramentas.</p>
<p>Isso acontece em todos os âmbitos. Pegue a programação web, por exemplo. Quantos profissionais repousam na mais alta camada de abstração do framework de sua preferência? Quantos compreendem como e porque o framework funciona e quantos seriam capazes de implementar o seu?</p>
<p>Não estou sugerindo que cada programador <em>tenha</em> que implementar o seu próprio framework. Mas penso que <em>devam</em> ter esta capacidade.</p>
<p>Essa é a essência do movimento <em>Do It Yourself</em>. A busca pelo conhecimento tácito para realizar a mágica e não apenas permanecer como espectador ou como mágico teórico.</p>
<p>Sem essa busca, a mesma tecnologia que poderia libertar, acaba se tornando invisível, reduzindo o homem à escravo ignorante do seu aluguel. Afinal, se você depende, mas não possui, terá que pagar pelo acesso. Sempre!</p>
<p>[]&#8216;s, HB!</p>
<img src="http://feeds.feedburner.com/~r/henriquebastos/~4/6Smm3VBoOa0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://henriquebastos.net/2013/03/31/a-importancia-do-movimento-diy/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://henriquebastos.net/2013/03/31/a-importancia-do-movimento-diy/</feedburner:origLink></item>
		<item>
		<title>Agregações condicionais com Django Aggregate If</title>
		<link>http://feedproxy.google.com/~r/henriquebastos/~3/S4iId5rOJcM/</link>
		<comments>http://henriquebastos.net/2012/12/29/agregacoes-condicionais-com-django-aggregate-if/#comments</comments>
		<pubDate>Sat, 29 Dec 2012 23:29:57 +0000</pubDate>
		<dc:creator>Henrique Bastos</dc:creator>
				<category><![CDATA[Português]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://henriquebastos.net/?p=1162</guid>
		<description><![CDATA[O django-aggregate-if implementa agregações condicionais no Django. Agregações condicionais como SumIf e CountIf são famosos nas planilhas. Na sua aplicação web, elas podem ajudar a reduzir a quantidade de queries para obter informações como estatísticas, por exemplo. Imagine que você tem um modelo Offer, como este: class Offer&#40;models.Model&#41;: sponsor = models.ForeignKey&#40;User&#41; price = models.DecimalField&#40;max_digits=9, decimal_places=2&#41; [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://pypi.python.org/pypi/django-aggregate-if/" onclick="pageTracker._trackPageview('/outgoing/pypi.python.org/pypi/django-aggregate-if/?referer=');">django-aggregate-if</a> implementa agregações condicionais no Django.</p>
<p>Agregações condicionais como <a href="http://www.youtube.com/watch?v=Q4j3uSqet14" onclick="pageTracker._trackPageview('/outgoing/www.youtube.com/watch?v=Q4j3uSqet14&amp;referer=');">SumIf</a> e CountIf são famosos nas planilhas. Na sua aplicação web, elas podem ajudar a reduzir a quantidade de queries para obter informações como estatísticas, por exemplo.</p>
<p><span id="more-1162"></span></p>
<p>Imagine que você tem um modelo <em>Offer</em>, como este:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Offer<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:
    sponsor = models.<span style="color: black;">ForeignKey</span><span style="color: black;">&#40;</span>User<span style="color: black;">&#41;</span>
    price = models.<span style="color: black;">DecimalField</span><span style="color: black;">&#40;</span>max_digits=<span style="color: #ff4500;">9</span>, decimal_places=<span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
    status = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;">30</span><span style="color: black;">&#41;</span>
    expire_at = models.<span style="color: black;">DateField</span><span style="color: black;">&#40;</span>null=<span style="color: #008000;">True</span>, blank=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
    created_at = models.<span style="color: black;">DateTimeField</span><span style="color: black;">&#40;</span>auto_now_add=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
    updated_at = models.<span style="color: black;">DateTimeField</span><span style="color: black;">&#40;</span>auto_now=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
&nbsp;
    OPEN = <span style="color: #483d8b;">&quot;OPEN&quot;</span>
    REVOKED = <span style="color: #483d8b;">&quot;REVOKED&quot;</span>
    PAID = <span style="color: #483d8b;">&quot;PAID&quot;</span></pre></div></div>

<p>Digamos que você queira saber:</p>
<ol>
<li>Quantas ofertas existem no total;</li>
<li>Quantas ofertas estão OPEN, REVOKED ou PAID;</li>
<li>Quanto dinheiro foi oferecido no total;</li>
<li>Quanto dinheiro está em ofertas OPEN, REVOKED e PAID;</li>
</ol>
<p>Para obter estas informações você poderia adicionar SQL direto com o método <em>extra</em> do QuerySet, ou executar as queries:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">db</span>.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> Count, Sum
&nbsp;
Offer.<span style="color: black;">objects</span>.<span style="color: black;">count</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
Offer.<span style="color: black;">objects</span>.<span style="color: #008000;">filter</span><span style="color: black;">&#40;</span>status=Offer.<span style="color: black;">OPEN</span><span style="color: black;">&#41;</span>.<span style="color: black;">aggregate</span><span style="color: black;">&#40;</span>Count<span style="color: black;">&#40;</span><span style="color: #483d8b;">'pk'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
Offer.<span style="color: black;">objects</span>.<span style="color: #008000;">filter</span><span style="color: black;">&#40;</span>status=Offer.<span style="color: black;">REVOKED</span><span style="color: black;">&#41;</span>.<span style="color: black;">aggregate</span><span style="color: black;">&#40;</span>Count<span style="color: black;">&#40;</span><span style="color: #483d8b;">'pk'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
Offer.<span style="color: black;">objects</span>.<span style="color: #008000;">filter</span><span style="color: black;">&#40;</span>status=Offer.<span style="color: black;">PAID</span><span style="color: black;">&#41;</span>.<span style="color: black;">aggregate</span><span style="color: black;">&#40;</span>Count<span style="color: black;">&#40;</span><span style="color: #483d8b;">'pk'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
Offer.<span style="color: black;">objects</span>.<span style="color: black;">aggregate</span><span style="color: black;">&#40;</span>Sum<span style="color: black;">&#40;</span><span style="color: #483d8b;">'price'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
Offer.<span style="color: black;">objects</span>.<span style="color: #008000;">filter</span><span style="color: black;">&#40;</span>status=Offer.<span style="color: black;">OPEN</span><span style="color: black;">&#41;</span>.<span style="color: black;">aggregate</span><span style="color: black;">&#40;</span>Sum<span style="color: black;">&#40;</span><span style="color: #483d8b;">'price'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
Offer.<span style="color: black;">objects</span>.<span style="color: #008000;">filter</span><span style="color: black;">&#40;</span>status=Offer.<span style="color: black;">REVOKED</span><span style="color: black;">&#41;</span>.<span style="color: black;">aggregate</span><span style="color: black;">&#40;</span>Sum<span style="color: black;">&#40;</span><span style="color: #483d8b;">'price'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
Offer.<span style="color: black;">objects</span>.<span style="color: #008000;">filter</span><span style="color: black;">&#40;</span>status=Offer.<span style="color: black;">PAID</span><span style="color: black;">&#41;</span>.<span style="color: black;">aggregate</span><span style="color: black;">&#40;</span>Sum<span style="color: black;">&#40;</span><span style="color: #483d8b;">'price'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Neste caso, <strong>8 consultas</strong> ao banco foram necessárias para obter as informações desejadas.</p>
<p>Com as agregações condicionais do <a href="http://pypi.python.org/pypi/django-aggregate-if/" onclick="pageTracker._trackPageview('/outgoing/pypi.python.org/pypi/django-aggregate-if/?referer=');">django-aggregate-if</a> você pode obter tudo com apenas <strong>1 query</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">db</span>.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> Q
<span style="color: #ff7700;font-weight:bold;">from</span> aggregate_if <span style="color: #ff7700;font-weight:bold;">import</span> Count, Sum
&nbsp;
Offer.<span style="color: black;">objects</span>.<span style="color: black;">aggregate</span><span style="color: black;">&#40;</span>
    Count<span style="color: black;">&#40;</span><span style="color: #483d8b;">'pk'</span><span style="color: black;">&#41;</span>,
    Count<span style="color: black;">&#40;</span><span style="color: #483d8b;">'pk'</span>, only=Q<span style="color: black;">&#40;</span>status=Offer.<span style="color: black;">OPEN</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,
    Count<span style="color: black;">&#40;</span><span style="color: #483d8b;">'pk'</span>, only=Q<span style="color: black;">&#40;</span>status=Offer.<span style="color: black;">REVOKED</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,
    Count<span style="color: black;">&#40;</span><span style="color: #483d8b;">'pk'</span>, only=Q<span style="color: black;">&#40;</span>status=Offer.<span style="color: black;">PAID</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,
    Sum<span style="color: black;">&#40;</span><span style="color: #483d8b;">'price'</span><span style="color: black;">&#41;</span>,
    Sum<span style="color: black;">&#40;</span><span style="color: #483d8b;">'price'</span>, only=Q<span style="color: black;">&#40;</span>status=Offer.<span style="color: black;">OPEN</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,
    Sum<span style="color: black;">&#40;</span><span style="color: #483d8b;">'price'</span><span style="color: black;">&#41;</span>, only=Q<span style="color: black;">&#40;</span>status=Offer.<span style="color: black;">REVOKED</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,
    Sum<span style="color: black;">&#40;</span><span style="color: #483d8b;">'price'</span><span style="color: black;">&#41;</span>, Q<span style="color: black;">&#40;</span>status=Offer.<span style="color: black;">PAID</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,
<span style="color: black;">&#41;</span></pre></div></div>

<h3>Inspiração</h3>
<p>Existe um <a href="https://code.djangoproject.com/ticket/11305" onclick="pageTracker._trackPageview('/outgoing/code.djangoproject.com/ticket/11305?referer=');">ticket 11305</a> que (com sorte) adicionará essa capacidade ao ORM do Django 1.6.</p>
<p>No entanto, refatorando a <a href="http://www.freedomsponsors.org/core/stats/" onclick="pageTracker._trackPageview('/outgoing/www.freedomsponsors.org/core/stats/?referer=');">página de estatísticas</a> do <a href="http://www.freedomsponsors.org/" onclick="pageTracker._trackPageview('/outgoing/www.freedomsponsors.org/?referer=');">FreedomSponsors.org</a>, decidi implementar o <a href="http://pypi.python.org/pypi/django-aggregate-if/" onclick="pageTracker._trackPageview('/outgoing/pypi.python.org/pypi/django-aggregate-if/?referer=');">django-aggregate-if</a> para trazer esta funcionalidade para o Django 1.4.</p>
<p>A biblioteca utiliza a mesma API e testes propostos no <a href="https://code.djangoproject.com/ticket/11305" onclick="pageTracker._trackPageview('/outgoing/code.djangoproject.com/ticket/11305?referer=');">ticket 11305</a>, então quando a funcionalidade estiver disponível no Django, você poderá facilmente substituir o <a href="http://pypi.python.org/pypi/django-aggregate-if/" onclick="pageTracker._trackPageview('/outgoing/pypi.python.org/pypi/django-aggregate-if/?referer=');">django-aggregate-if</a>.</p>
<p>O <a href="https://github.com/henriquebastos/django-aggregate-if" onclick="pageTracker._trackPageview('/outgoing/github.com/henriquebastos/django-aggregate-if?referer=');">código</a> está no Github e toda contribuição é sempre bem-vinda. <img src='http://henriquebastos.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>[]&#8216;s, HB!</p>
<img src="http://feeds.feedburner.com/~r/henriquebastos/~4/S4iId5rOJcM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://henriquebastos.net/2012/12/29/agregacoes-condicionais-com-django-aggregate-if/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://henriquebastos.net/2012/12/29/agregacoes-condicionais-com-django-aggregate-if/</feedburner:origLink></item>
		<item>
		<title>Um IPython para múltiplos virtualenvs</title>
		<link>http://feedproxy.google.com/~r/henriquebastos/~3/5waK1Q4v1dE/</link>
		<comments>http://henriquebastos.net/2012/10/20/um-ipython-para-multiplos-virtualenvs/#comments</comments>
		<pubDate>Sat, 20 Oct 2012 21:47:04 +0000</pubDate>
		<dc:creator>Henrique Bastos</dc:creator>
				<category><![CDATA[Português]]></category>
		<category><![CDATA[ipython]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[virtualenv]]></category>

		<guid isPermaLink="false">http://henriquebastos.net/?p=1153</guid>
		<description><![CDATA[O IPython e o virtualenv são ferramentas imprescindíveis que utilizo literalmente em todos os projetos. O uso recorrente destes dois pacotes pode gerar o incômodo de ter que instalar o IPython em cada virtualenv, mas existem alternativas para contornar este inconveniente. A melhor delas é simplesmente instalar o IPython 0.13 no escopo do seu sistema. [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://ipython.org/" onclick="pageTracker._trackPageview('/outgoing/ipython.org/?referer=');">IPython</a> e o <a href="http://www.virtualenv.org/en/latest/" onclick="pageTracker._trackPageview('/outgoing/www.virtualenv.org/en/latest/?referer=');">virtualenv</a> são ferramentas imprescindíveis que utilizo literalmente em <strong>todos</strong> os projetos.</p>
<p>O uso recorrente destes dois pacotes pode gerar o incômodo de ter que instalar o IPython em cada virtualenv, mas existem alternativas para contornar este inconveniente.</p>
<p><span id="more-1153"></span></p>
<p>A melhor delas é simplesmente instalar o <a href="http://ipython.org/ipython-doc/rel-0.13/whatsnew/version0.13.html" onclick="pageTracker._trackPageview('/outgoing/ipython.org/ipython-doc/rel-0.13/whatsnew/version0.13.html?referer=');">IPython 0.13</a> no escopo do seu sistema. Esta versão lançada em junho de 2012 contém o <a href="https://github.com/ipython/ipython/pull/1388/" onclick="pageTracker._trackPageview('/outgoing/github.com/ipython/ipython/pull/1388/?referer=');">patch</a> para detectar  automaticamente o virtualenv ativado.</p>
<p>Esta solução funciona para 90% dos casos. Os 10% restantes incluem cenários onde a versão do Python do seu sistema é diferente do seu virtualenv, por exemplo. Para estes casos especiais, basta instalar o IPython no próprio virtualenv.</p>
<p>Dentre as outras alternativas que observei, duas me chamaram a atenção: <em>(1)</em> incluir o IPython como dependência do projeto no <code>requirements.txt</code> ou <em>(2)</em> criar um <code>requirements_dev.txt</code> para não forçar a instalação do IPython no deploy do projeto.</p>
<p>Ambas devem ser evitadas. A primeira ignora que o IPython é na verdade uma <em>preferência do desenvolvedor</em> e não uma dependência do projeto. Há quem prefira o <a href="http://bpython-interpreter.org/" onclick="pageTracker._trackPageview('/outgoing/bpython-interpreter.org/?referer=');">BPython</a> como meu amigo <a href="http://montegasppa.blogspot.com.br/" onclick="pageTracker._trackPageview('/outgoing/montegasppa.blogspot.com.br/?referer=');">Rodrigo Cacilhas</a>. A segunda introduz a complexidade de duas listas de dependências usadas em momentos distintos o que é uma receita para desatualização e confusão.</p>
<p>[]&#8216;s, HB!</p>
<img src="http://feeds.feedburner.com/~r/henriquebastos/~4/5waK1Q4v1dE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://henriquebastos.net/2012/10/20/um-ipython-para-multiplos-virtualenvs/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://henriquebastos.net/2012/10/20/um-ipython-para-multiplos-virtualenvs/</feedburner:origLink></item>
		<item>
		<title>Mantenha seu código em ordem com Flake8 e Coverage</title>
		<link>http://feedproxy.google.com/~r/henriquebastos/~3/E7LJ8tepcA4/</link>
		<comments>http://henriquebastos.net/2012/08/28/mantenha-seu-codigo-em-ordem-com-flake8-e-coverage/#comments</comments>
		<pubDate>Tue, 28 Aug 2012 04:30:28 +0000</pubDate>
		<dc:creator>Henrique Bastos</dc:creator>
				<category><![CDATA[Português]]></category>
		<category><![CDATA[boas práticas]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://henriquebastos.net/?p=1138</guid>
		<description><![CDATA[Programar é uma atividade criativa e dinâmica, como por exemplo, a pintura. No processo de expressar o código, a gente rascunha, faz, desfaz, refaz, experimenta diferentes formas e traços, até conseguir chegar ao resultado desejado. Concentrados em fazer funcionar, é comum que, apesar de satisfeitos com o resultado, terminemos com o &#34;ateliê&#34; um tanto bagunçado. [...]]]></description>
			<content:encoded><![CDATA[<p>Programar é uma atividade criativa e dinâmica, como por exemplo, a pintura. No processo de expressar o código, a gente rascunha, faz, desfaz, refaz, experimenta diferentes formas e traços, até conseguir chegar ao resultado desejado.</p>
<p>Concentrados em <a href="http://c2.com/cgi/wiki?MakeItWorkMakeItRightMakeItFast" title="Make it work, make it right, make it fast." onclick="pageTracker._trackPageview('/outgoing/c2.com/cgi/wiki?MakeItWorkMakeItRightMakeItFast&amp;referer=');">fazer funcionar</a>, é comum que, apesar de satisfeitos com o resultado, terminemos com o &quot;ateliê&quot; um tanto bagunçado.</p>
<p><span id="more-1138"></span></p>
<p>O problema é que ao contrário da pintura, onde obstáculos físicos nos sinalizam que precisamos arrumar a casa, na programação a bagunça pode muitas vezes passar despercebida por um tempo, correndo o risco de acumular perigosamente.</p>
<p>É aí que entram as ferramentas de analise de código para nos informar quando deixamos alguma bagunça passar.</p>
<p>Para projetos <a href="http://python.org" onclick="pageTracker._trackPageview('/outgoing/python.org?referer=');">Python</a>, duas ferramentas muito interessantes são o <a href="http://pypi.python.org/pypi/flake8/" onclick="pageTracker._trackPageview('/outgoing/pypi.python.org/pypi/flake8/?referer=');">Flake8</a> e o <a href="http://pypi.python.org/pypi/coverage/" onclick="pageTracker._trackPageview('/outgoing/pypi.python.org/pypi/coverage/?referer=');">Coverage.py</a></p>
<p>O <a href="http://pypi.python.org/pypi/coverage/" onclick="pageTracker._trackPageview('/outgoing/pypi.python.org/pypi/coverage/?referer=');">Coverage.py</a> detecta as linhas de código que não são executadas no seu programa. Ao utilizá-lo na execução da suite de testes do seu projeto, ele informa a <a href="https://en.wikipedia.org/wiki/Code_Coverage" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Code_Coverage?referer=');">cobertura de testes</a> do seu código. Se você está desenvolvendo um projeto <a href="http://djangoproject.com" onclick="pageTracker._trackPageview('/outgoing/djangoproject.com?referer=');">Django</a>, você vai querer usar o <a href="http://pypi.python.org/pypi/django-coverage/" onclick="pageTracker._trackPageview('/outgoing/pypi.python.org/pypi/django-coverage/?referer=');">django-coverage</a>.</p>
<p>Já o <a href="http://pypi.python.org/pypi/flake8/" onclick="pageTracker._trackPageview('/outgoing/pypi.python.org/pypi/flake8/?referer=');">Flake8</a> é um projeto que combina 3 ótimas ferramentas em um só pacote:</p>
<ul>
<li>
<p><a href="http://github.com/jcrocholl/pep8/" onclick="pageTracker._trackPageview('/outgoing/github.com/jcrocholl/pep8/?referer=');">Pep8</a> que verifica se o estilo do código respeita o padrão adotado pela comunidade descrito na <a href="http://www.python.org/dev/peps/pep-0008/" onclick="pageTracker._trackPageview('/outgoing/www.python.org/dev/peps/pep-0008/?referer=');">Python Enhancement Proposal 8</a>.</p>
</li>
<li>
<p><a href="http://divmod.org/trac/wiki/DivmodPyflakes" onclick="pageTracker._trackPageview('/outgoing/divmod.org/trac/wiki/DivmodPyflakes?referer=');">PyFlakes</a> que analisa estaticamente seu código detectando inúmeros anti-patterns e erros lógicos como módulos importados que não são utilizados, uso de variáveis não declaradas, entre muitas outras coisas.</p>
</li>
<li>
<p><a href="http://nedbatchelder.com/blog/200803/python_code_complexity_microtool.html" onclick="pageTracker._trackPageview('/outgoing/nedbatchelder.com/blog/200803/python_code_complexity_microtool.html?referer=');">Codepaths</a> que realiza a análise da complexidade ciclomática do código com base nas métricas de <a href="http://www.literateprogramming.com/mccabe.pdf" onclick="pageTracker._trackPageview('/outgoing/www.literateprogramming.com/mccabe.pdf?referer=');">McCabe</a>.</p>
</li>
</ul>
<p>Para usar estas ferramentas basta instalar os pacotes com o <a href="http://www.pip-installer.org/en/latest/" onclick="pageTracker._trackPageview('/outgoing/www.pip-installer.org/en/latest/?referer=');">pip</a> e os comandos estarão disponíveis para você.</p>
<p>Para automatizar a inspeção do seu código, você pode tanto configurar o seu <a href="http://git-scm.com/book/en/Customizing-Git-Git-Hooks#Installing-a-Hook" onclick="pageTracker._trackPageview('/outgoing/git-scm.com/book/en/Customizing-Git-Git-Hooks_Installing-a-Hook?referer=');">git-precommit-hook</a> quanto adicioná-los ao seu ciclo de <a href="https://en.wikipedia.org/wiki/Continuous_Integration" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Continuous_Integration?referer=');">integração contínua</a>. Isso vai lhe ajudar na disciplina de manter seu código organizado.</p>
<p>[]&#8216;s, HB!</p>
<img src="http://feeds.feedburner.com/~r/henriquebastos/~4/E7LJ8tepcA4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://henriquebastos.net/2012/08/28/mantenha-seu-codigo-em-ordem-com-flake8-e-coverage/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://henriquebastos.net/2012/08/28/mantenha-seu-codigo-em-ordem-com-flake8-e-coverage/</feedburner:origLink></item>
		<item>
		<title>Participe do 2º PythonRioDay</title>
		<link>http://feedproxy.google.com/~r/henriquebastos/~3/w64LGMF-2yk/</link>
		<comments>http://henriquebastos.net/2012/08/09/participe-do-2o-pythonrioday/#comments</comments>
		<pubDate>Thu, 09 Aug 2012 19:04:34 +0000</pubDate>
		<dc:creator>Henrique Bastos</dc:creator>
				<category><![CDATA[Português]]></category>
		<category><![CDATA[comunidade]]></category>
		<category><![CDATA[evento]]></category>
		<category><![CDATA[pythonrio]]></category>

		<guid isPermaLink="false">http://henriquebastos.net/?p=1129</guid>
		<description><![CDATA[A 2ª edição do PythonRioDay já tem data marcada! Seguindo o sucesso do primeiro encontro, a comunidade do Rio de Janeiro se reunirá a partir das 10h no dia 11 de agosto na espaço da Amaivos para um sábado inteiro de muito hack. A Amaivos é um espaço muito interessante com o conceito de OpenWork [...]]]></description>
			<content:encoded><![CDATA[<p>A 2ª edição do PythonRioDay já tem data marcada! Seguindo o sucesso do primeiro encontro, a <a href="http://twitter.com/pythonrio" onclick="pageTracker._trackPageview('/outgoing/twitter.com/pythonrio?referer=');">comunidade do Rio de Janeiro</a> se reunirá a partir das 10h no dia 11 de agosto na espaço da <a title="Grupo do Facebook sobre o Espaço de OpenWork" href="https://www.facebook.com/groups/245507892225793/" onclick="pageTracker._trackPageview('/outgoing/www.facebook.com/groups/245507892225793/?referer=');">Amaivos</a> para um sábado inteiro de muito hack.</p>
<p>A <a title="Grupo do Facebook sobre o Espaço de OpenWork" href="https://www.facebook.com/groups/245507892225793/" onclick="pageTracker._trackPageview('/outgoing/www.facebook.com/groups/245507892225793/?referer=');">Amaivos</a> é um espaço muito interessante com o conceito de OpenWork e está muito bem localizada na <a href="https://maps.google.com/maps?q=Pra%C3%A7a+Tiradentes,+73,+Centro,+Rio+de+Janeiro,+Brasil&amp;hl=en&amp;ie=UTF8&amp;sll=-22.919497,-43.073004&amp;sspn=0.214712,0.363579&amp;oq=Pra%C3%A7a+Tiradentes,+73,+centro+Rio&amp;t=w&amp;hnear=Pra%C3%A7a+Tiradentes,+73+-+Centro,+Rio+de+Janeiro,+20060-070,+Brazil&amp;z=17&amp;iwloc=A" onclick="pageTracker._trackPageview('/outgoing/maps.google.com/maps?q=Pra_C3_A7a+Tiradentes_+73_+Centro_+Rio+de+Janeiro_+Brasil_amp_hl=en_amp_ie=UTF8_amp_sll=-22.919497_-43.073004_amp_sspn=0.214712_0.363579_amp_oq=Pra_C3_A7a+Tiradentes_+73_+centro+Rio_amp_t=w_amp_hnear=Pra_C3_A7a+Tiradentes_+73+-+Centro_+Rio+de+Janeiro_+20060-070_+Brazil_amp_z=17_amp_iwloc=A&amp;referer=');">Praça Tiradentes 73 2º andar, no Centro do Rio de Janeiro</a>.</p>
<p>O encontro é uma <a href="https://pt.wikipedia.org/wiki/Desconfer%C3%AAncia" onclick="pageTracker._trackPageview('/outgoing/pt.wikipedia.org/wiki/Desconfer_C3_AAncia?referer=');">desconferência</a> que reúne programadores e entusiastas do mundo Python em um ambiente livre e descontraído próprio para o aprendizado e compartilhamento de experiências.</p>
<p>O evento é construído colaborativamente e para participar é simples! Basta preencher <a href="https://docs.google.com/a/bastos.net/spreadsheet/viewform?formkey=dGlKS2NZVmd6d2FyS3EwekhLV0dWMWc6MA#gid=0" onclick="pageTracker._trackPageview('/outgoing/docs.google.com/a/bastos.net/spreadsheet/viewform?formkey=dGlKS2NZVmd6d2FyS3EwekhLV0dWMWc6MA_gid=0&amp;referer=');">este formulário</a> informando:</p>
<ul>
<li>Seu nome e email</li>
<li>O que você deseja levar para o evento?</li>
<li>O que você deseja ouvir no evento?</li>
</ul>
<p>Você pode acompanhar quem vai e o que o pessoal quer fazer no encontro <a href="https://docs.google.com/a/bastos.net/spreadsheet/viewform?formkey=dGlKS2NZVmd6d2FyS3EwekhLV0dWMWc6MA#gid=0" onclick="pageTracker._trackPageview('/outgoing/docs.google.com/a/bastos.net/spreadsheet/viewform?formkey=dGlKS2NZVmd6d2FyS3EwekhLV0dWMWc6MA_gid=0&amp;referer=');">por aqui</a>. No dia, estas informações serão usadas para motivar as discussões e atividades entre os participantes.</p>
<p>Esta é uma oportunidade imperdível para quem programa em Python ou simplesmente gostaria de saber mais sobre o assunto. Todos são muito bem-vindos. Se você é super experiênte ou se você está apenas começando, se já sabe Python ou se nunca ouviu falar, esse é o lugar onde você deve estar no dia 11 de agosto.</p>
<p>Nos vemos por lá!</p>
<p>[]&#8216;s, HB!</p>
<img src="http://feeds.feedburner.com/~r/henriquebastos/~4/w64LGMF-2yk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://henriquebastos.net/2012/08/09/participe-do-2o-pythonrioday/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://henriquebastos.net/2012/08/09/participe-do-2o-pythonrioday/</feedburner:origLink></item>
		<item>
		<title>Comunidade não é fim, é meio.</title>
		<link>http://feedproxy.google.com/~r/henriquebastos/~3/b-6OhfPWU-A/</link>
		<comments>http://henriquebastos.net/2012/05/14/comunidade-nao-e-fim-e-meio/#comments</comments>
		<pubDate>Mon, 14 May 2012 16:58:06 +0000</pubDate>
		<dc:creator>Henrique Bastos</dc:creator>
				<category><![CDATA[Português]]></category>
		<category><![CDATA[colaboração]]></category>
		<category><![CDATA[comunidade]]></category>
		<category><![CDATA[rede social]]></category>

		<guid isPermaLink="false">http://henriquebastos.net/?p=1123</guid>
		<description><![CDATA[Mais um episódio envolvendo o Linus e um de seus projetos no Github aconteceu na última sexta-feira. Como era de se esperar um monte de gente participou criando uma thread no mínimo esquizofrênica. Muitos assuntos acabaram misturados, mas eu quero tratar de um especificamente: comunidade. As reações já eram muitas e de início li as [...]]]></description>
			<content:encoded><![CDATA[<p>Mais um <a href="https://github.com/torvalds/linux/pull/17" onclick="pageTracker._trackPageview('/outgoing/github.com/torvalds/linux/pull/17?referer=');">episódio</a> envolvendo o Linus e um de seus projetos no Github aconteceu na última sexta-feira. Como era de se esperar um monte de gente participou criando uma thread no mínimo esquizofrênica. Muitos assuntos acabaram misturados, mas eu quero tratar de um especificamente: comunidade.</p>
<p><span id="more-1123"></span></p>
<p>As reações já eram muitas e de início li as primeiras 5 mensagens da thread e me espantei com o fato de, apesar de toda a comoção, ninguém criticou o @jaseemabid. Mesmo após o Linus ter <a href="https://github.com/torvalds/linux/pull/17#issuecomment-5654674" onclick="pageTracker._trackPageview('/outgoing/github.com/torvalds/linux/pull/17_issuecomment-5654674?referer=');">respondido o autor do pull request</a>, ele sugeriu que <a href="https://github.com/torvalds/linux/pull/17#issuecomment-5659871" onclick="pageTracker._trackPageview('/outgoing/github.com/torvalds/linux/pull/17_issuecomment-5659871?referer=');">&#8220;deixasse passar essa&#8221;</a> por considerar um patch simples, <em>afinal o cara estava colaborando</em>. A afirmação paternalista foi desrespeitosa, apesar de provavelmente não ter sido maliciosa.</p>
<p>O Linus <a href="https://github.com/torvalds/linux/pull/17#issuecomment-5659970" onclick="pageTracker._trackPageview('/outgoing/github.com/torvalds/linux/pull/17_issuecomment-5659970?referer=');">respondeu</a>, e foi este o estopim para vários comentários que em essência são &#8220;pró-comunidade&#8221; e &#8220;contra o mau exemplo de liderança do Linus&#8221;.</p>
<p>Tenho a impressão que há uma tendência à inversão entre meio e fim quando o assunto é comunidade, contribuição e colaboração. Os discursos retratam a comunidade como o <em>fim</em> maior, enquanto comunidade é na verdade o <em>meio</em> mais rico para o florescimento de iniciativas livres e distribuídas. A comunidade é uma <a href="http://www.slideshare.net/augustodefranco/fluzz-ebook" onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/augustodefranco/fluzz-ebook?referer=');">rede social</a> e em si é ela só potencial. IMHO, a força que realmente vence a inércia é o <strong>fazer</strong> de cada um. Fazer por si mesmo. Não com um senso de individualismo ou egoísmo, mas fazer porque você deseja, gosta, acredita que deve. Não para um &#8220;bem maior&#8221; ou &#8220;bem comum&#8221;.</p>
<p>Essa confusão é natural e já aconteceu no <a href="http://horaextra.org" onclick="pageTracker._trackPageview('/outgoing/horaextra.org?referer=');">#Horaextra</a> do Rio, por exemplo. O encontro estava crescendo e sustentando o crescimento com a participação de cada vez mais gente interessante. Em certo momento surgiu uma preocupação com &#8220;não deixar aquilo morrer&#8221;, afinal estava tão bom! Por que não persistir e escalar? Com isso, iniciou-se uma discussão estranha que em essência, levava à uma institucionalização do #Horaextra. Discutimos muito e aprendemos que para o #Horaextra não morrer bastava que <strong>uma pessoa</strong> continuasse comparecendo. A continuidade só dependia do desejo individual de cada um. Felizmente concluímos que o #Horaextra é <strong>só um chopp</strong> e nada mais. Se morresse, seria porque as pessoas desejavam fazer outra coisa em vez de ir para aquele encontro e isso é ótimo.</p>
<p>Esse entendimento foi determinante para que outras iniciativas pudessem se <em>inspirar</em> naquele exemplo. No entanto, cada uma seguiria tocando seu barco independentemente, segundo os desejos individuais dos que empreendessem a nova iniciativa.</p>
<p>Um belo fruto disso foi o <a href="http://horaextrabh.org/" onclick="pageTracker._trackPageview('/outgoing/horaextrabh.org/?referer=');">#HoraextraBH</a>. É uma iniciativa fantástica com uma identidade toda própria, com a qual também me identifico muito. Tanto que já até cometi o equívoco de propor uma fusão entre as listas de discussões do <a href="http://groups.google.com/group/horaextra" onclick="pageTracker._trackPageview('/outgoing/groups.google.com/group/horaextra?referer=');">Rio</a> e de <a href="https://groups.google.com/group/horaextrabh" onclick="pageTracker._trackPageview('/outgoing/groups.google.com/group/horaextrabh?referer=');">BH</a>, o que não faz sentido algum. São duas iniciativas independentes e quem se identificar com ambas, basta se inscrever nas duas listas e interagir com a turma.</p>
<p>Mas para que eu falei tudo isso? Bom, uma coisa que admiro no Linus é que ele tem uma capacidade incrível de imaginar algo e transformar a sua realidade pautado em sua imaginação. Querer é o suficiente para ele se lançar em uma iniciativa, mesmo que não dê em nada. E o cara faz isso há mais de 20 anos.</p>
<p>O fato dele ter conduzido algumas iniciativas de forma pública e aberta ajudou todo um movimento a emergir entorno do Linux e tudo o mais. Mas é fundamental ter em mente que cada iniciativa emergiu por desejo de outros indivíduos que não ele. Isso é importante, pois ele não é e nem parece querer ser lider de ninguém. E isso choca as pessoas! Afinal, florestas inteiras são consumidas para propagandear estratégias <a href="https://pt.wikipedia.org/wiki/Coer%C3%A7%C3%A3o" onclick="pageTracker._trackPageview('/outgoing/pt.wikipedia.org/wiki/Coer_C3_A7_C3_A3o?referer=');">coercitivas</a> travestidas de &#8220;liderança&#8221; nas páginas da Você S.A. e similares.</p>
<p>Acho que isso é um ponto relevante que parece passar despercebido. A maioria das pessoas esperam dele o comportamento de um líder, rei, herói, pai, salvador. Mas o cara só segue seu desejo e pronto. Ele interage com um monte de gente? Sim, mas nos termos dele, e com aqueles cujos valores estão alinhados com os dele. Ouso dizer sinceramente, que ele parece tratar o Linux como <em>&#8220;só um chopp&#8221;</em>.</p>
<p>Qualquer um pode &#8220;tomar um chopp&#8221; com ele. As <a href="http://www.youtube.com/watch?v=LLBrBBImJt4" onclick="pageTracker._trackPageview('/outgoing/www.youtube.com/watch?v=LLBrBBImJt4&amp;referer=');">instruções</a> são vastas. Mas se ele já disse explícitamente que não aceita pull requests pelo Github, porque as pessoas insistem? É direito dele trabalhar como deseja e se o outro discorda, é direito do outro se negar a contribuir. Normal. Não gostou? Faz um fork do projeto e sustenta seu fork! Simples, mas exige uma alta capacidade agir pelo seu desejo.</p>
<p>No entanto, quando acontecem esses episódios, rapidamente surgem os discursos &#8220;paz e amor&#8221;. Discursos furados, até meio socialistas, de igualdade e esforço em prol de um bem comum materializado em código. Discursos falsos sobre comunidade, pois uma comunidade que não respeita a liberdade do <strong>indivíduo</strong> não é comunidade. É outra coisa, é massa, público, platéia, audiência. É um passo para a conversa de &#8220;bem comum&#8221;, &#8220;bem maior&#8221; e a história está repleta de péssimos exemplos que aconteceram por um bem maior.</p>
<p>[]&#8216;s, HB!</p>
<img src="http://feeds.feedburner.com/~r/henriquebastos/~4/b-6OhfPWU-A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://henriquebastos.net/2012/05/14/comunidade-nao-e-fim-e-meio/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://henriquebastos.net/2012/05/14/comunidade-nao-e-fim-e-meio/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 4.796 seconds. --><!-- Cached page generated by WP-Super-Cache on 2013-06-11 04:50:08 -->
