<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pythonologia, o blog da Triveos</title>
	<atom:link href="http://blog.triveos.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.triveos.com.br</link>
	<description>Python e Django — Cursos e Desenvolvimento Web</description>
	<lastBuildDate>Tue, 28 Jun 2011 22:08:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>PythonBrasil[7] — São Paulo — 29 de setembro</title>
		<link>http://blog.triveos.com.br/2011/06/28/pythonbrasil-7-sao-paulo-29-setembro/</link>
		<comments>http://blog.triveos.com.br/2011/06/28/pythonbrasil-7-sao-paulo-29-setembro/#comments</comments>
		<pubDate>Tue, 28 Jun 2011 22:03:00 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=900</guid>
		<description><![CDATA[Como não podia deixar de]]></description>
			<content:encoded><![CDATA[<p><a href="http://pythonbrasil.org.br/2011/"><img class="alignleft" title="Python Brasil 7" src="http://www.python.org.br/banners-pythonbrasil/pythonbrasil7-rectangle.gif" alt="Banner convidando você para a PythonBrasil[7]" width="180" height="150" /></a>Como não podia deixar de ser a Triveos vai participar da PythonBrasil[7] que vai acontecer esse ano, em São Paulo, entre os dias 29 de setembro e 1º de outubro.</p>
<p>Alguns <a href="http://pythonbrasil.org.br/2011/sobre-o-evento/noticias/palestrante-confirmado-jim-fulton">palestrantes</a> <a href="http://pythonbrasil.org.br/2011/sobre-o-evento/noticias/steve-holden-na-python-brasil-7">internacionais</a> já confirmaram presença e estamos em negociação com outros três palestrantes.</p>
<p>A chamada de trabalhos ainda não está aberta porque estão trabalhando em algumas modificações no sistema de submissão que vão permitir que as propostas sejam modificadas durante todo o período de submissão.</p>
<p>As propostas que forem submetidas também ficarão abertas para que todos os associados da <a href="http://associacao.python.org.br/">Associação Python Brasil</a> tenham mais tempo para ir avaliando os trabalhos. Será possível submeter links para videos e slides que ajudem a &#8220;promover&#8221; a proposta.</p>
<p>Assim que o período de submissão de trabalhos se encerrar as modificações serão barradas e os associados da Associação Python Brasil receberão instruções para avaliar quais trabalhos deverão ser apresentados no nosso evento.</p>
<p>Já é a sétima edição do encontro anual de programadores Python do Brasil. Todas as edições foram fantásticas. Esse ano vamos experimentar um novo modelo de evento. Um evento mais &#8220;profissionalizado&#8221;, com uma estrutura melhor e com o apoio de vários patrocinadores de peso.</p>
<p>Ou seja, temos tudo para fazer a PythonBrasil[7] ainda melhor esse ano.</p>
<p>Espero poder me encontrar com vocês por lá.</p>
<p><strong>Ajude a divulgar</strong></p>
<p><strong>A gente sabe que a melhor forma de divulgação que existe é o &#8216;boca-a-boca&#8217; e todo ano a gente conta com o apoio dos entusiastas de Python para nos ajudar na divulgação do evento.</strong></p>
<p>Para facilitar a vida de quem quer ajudar montamos a página &#8220;<a href="http://pythonbrasil.org.br/2011/divulgue/">Divulgue a PythonBrasil[7]</a>&#8221; onde vocês poderão encontrar as instruções e o material necessário para ajudar nessa tarefa.</p>
<p>Se você já foi à uma PythonBrasil, publique no seu blog histórias legais sobre o evento. Se ainda não foi, publique no seu blog o que você espera encontrar no evento. Depois é só enviar o link para a notícia no site do evento para aparecer como um &#8220;<a href="http://pythonbrasil.org.br/2011/divulgue/sites-amigos-da-pythonbrasil-7">Site Amigo</a>&#8220;.</p>
<p>Se você não tem um blog mas tem Twitter, Facebook, Orkut, etc&#8230; divulgue o evento entre seus amigos e seguidores (usando a hashtag #pythonbrasil7).</p>
<p>Se vai fazer uma apresentação sobre Python em algum evento <a href="http://pythonbrasil.org.br/2011/divulgue/slides-para-apresentacoes">convide</a> a sua audiência para participar do nosso encontro.</p>
<p>Quero ver o auditório lotado! :D</p>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://blog.triveos.com.br/2011/06/28/pythonbrasil-7-sao-paulo-29-setembro/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://blog.triveos.com.br/2011/06/28/pythonbrasil-7-sao-paulo-29-setembro/" data-text="PythonBrasil[7] — São Paulo — 29 de setembro"></a><a class="a2a_button_stumbleupon" href="http://www.addtoany.com/add_to/stumbleupon?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F06%2F28%2Fpythonbrasil-7-sao-paulo-29-setembro%2F&amp;linkname=PythonBrasil%5B7%5D%20%E2%80%94%20S%C3%A3o%20Paulo%20%E2%80%94%2029%20de%20setembro" title="StumbleUpon" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/stumbleupon.png" width="16" height="16" alt="StumbleUpon"/></a><a class="a2a_button_read_it_later" href="http://www.addtoany.com/add_to/read_it_later?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F06%2F28%2Fpythonbrasil-7-sao-paulo-29-setembro%2F&amp;linkname=PythonBrasil%5B7%5D%20%E2%80%94%20S%C3%A3o%20Paulo%20%E2%80%94%2029%20de%20setembro" title="Read It Later" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/read_it_later.png" width="16" height="16" alt="Read It Later"/></a><a class="a2a_button_email" href="http://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F06%2F28%2Fpythonbrasil-7-sao-paulo-29-setembro%2F&amp;linkname=PythonBrasil%5B7%5D%20%E2%80%94%20S%C3%A3o%20Paulo%20%E2%80%94%2029%20de%20setembro" title="Email" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/email.png" width="16" height="16" alt="Email"/></a><a class="a2a_button_evernote" href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F06%2F28%2Fpythonbrasil-7-sao-paulo-29-setembro%2F&amp;linkname=PythonBrasil%5B7%5D%20%E2%80%94%20S%C3%A3o%20Paulo%20%E2%80%94%2029%20de%20setembro" title="Evernote" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a><a class="a2a_button_instapaper" href="http://www.addtoany.com/add_to/instapaper?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F06%2F28%2Fpythonbrasil-7-sao-paulo-29-setembro%2F&amp;linkname=PythonBrasil%5B7%5D%20%E2%80%94%20S%C3%A3o%20Paulo%20%E2%80%94%2029%20de%20setembro" title="Instapaper" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/instapaper.png" width="16" height="16" alt="Instapaper"/></a><a class="a2a_button_dihitt" href="http://www.addtoany.com/add_to/dihitt?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F06%2F28%2Fpythonbrasil-7-sao-paulo-29-setembro%2F&amp;linkname=PythonBrasil%5B7%5D%20%E2%80%94%20S%C3%A3o%20Paulo%20%E2%80%94%2029%20de%20setembro" title="diHITT" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/dihitt.png" width="16" height="16" alt="diHITT"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F06%2F28%2Fpythonbrasil-7-sao-paulo-29-setembro%2F&amp;linkname=PythonBrasil%5B7%5D%20%E2%80%94%20S%C3%A3o%20Paulo%20%E2%80%94%2029%20de%20setembro" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F06%2F28%2Fpythonbrasil-7-sao-paulo-29-setembro%2F&amp;linkname=PythonBrasil%5B7%5D%20%E2%80%94%20S%C3%A3o%20Paulo%20%E2%80%94%2029%20de%20setembro" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F06%2F28%2Fpythonbrasil-7-sao-paulo-29-setembro%2F&amp;title=PythonBrasil%5B7%5D%20%E2%80%94%20S%C3%A3o%20Paulo%20%E2%80%94%2029%20de%20setembro" id="wpa2a_2">Compartilhar/Favoritos</a></p><blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2011, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2011/06/28/pythonbrasil-7-sao-paulo-29-setembro/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hoje é aniversário do Déo, o #dornelesday</title>
		<link>http://blog.triveos.com.br/2011/06/18/hoje-e-aniversario-do-deo-o-dornelesday/</link>
		<comments>http://blog.triveos.com.br/2011/06/18/hoje-e-aniversario-do-deo-o-dornelesday/#comments</comments>
		<pubDate>Sun, 19 Jun 2011 00:50:18 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=897</guid>
		<description><![CDATA[Hoje é o dia do]]></description>
			<content:encoded><![CDATA[<p>Hoje é o dia do aniversário do Dorneles Treméa. O Déo. Os amigos resolveram homenageá-lo criando a hashtag #dornelesday e postando homenagens na internet.</p>
<p>Confesso que passei o dia todo tentando bolar uma forma bem humorada de comemorar o aniversário dele, porque ele era super bem-humorado, mas não consegui.</p>
<p>A homenagem que eu tentei fazer pra ele no dia do aniversário dele era conseguir uma camisa do Internacional (o &#8220;Colorado&#8221;) e usá-la durante todo o dia, fotografar, e colocar aqui. Mas não consegui uma camisa que coubesse em mim :/</p>
<p>O Déo era torcedor do Colorado e eu sou corinthiano. Da comunidade Python eu, ele e o Érico eramos dos poucos que se interessavam por futebol.</p>
<p>Como não consegui fazer essa homenagem tentei algo mais &#8220;tradicional&#8221;. Escrever um post num blog tal como os outros amigos fizeram. Também não deu.</p>
<p>Todas as tentativas resultaram em textos tristes, porque é tristeza que sinto agora, e um texto triste não serveria pra homenagear o aniversário do Déo. Não existia tristeza ou mal-humor com o Déo.</p>
<p>Tentei, então, um post com histórias vividas com ele. Difícil terminar também&#8230; a visão começava a ficar &#8216;desfocada&#8217; pelas lágrimas e, assim, não dava pra continuar&#8230;</p>
<p>Também pensei em não falar nada na tentativa de enganar minha cabeça fazendo-a pensar que o Déo não tinha sofrido nenhum acidente e que comemoraria seu aniversário jogando Wii com sua família. Mais uma frustração. As homenagens dos outros amigos teimavam em me lembrar da verdade o tempo todo.</p>
<p>Vi que várias homenagens ao Déo falavam da sua capacidade técnica e de suas colaborações com código para vários projetos de software livre. Resolvi então tentar falar sobre outra característica importante dele: empreendedorismo.</p>
<p>Todos sabem que estou num momento &#8220;empreendedor&#8221; e que estou vivendo isso intensamente. E o Déo era uma referência pra mim nesse assunto. E ele também &#8220;propagava&#8221; essa mensagem sempre que podia.</p>
<p>Mas não daria pra homenageá-lo adequadamente falando só disso. Seria muito pouco.</p>
<p>Então vou desistir de participar do #dornelesday. Admito que é um problema muito difícil pra resolver. O tipo de problema cuja solução só o Déo poderia me ajudar a encontrar.</p>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://blog.triveos.com.br/2011/06/18/hoje-e-aniversario-do-deo-o-dornelesday/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://blog.triveos.com.br/2011/06/18/hoje-e-aniversario-do-deo-o-dornelesday/" data-text="Hoje é aniversário do Déo, o #dornelesday"></a><a class="a2a_button_stumbleupon" href="http://www.addtoany.com/add_to/stumbleupon?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F06%2F18%2Fhoje-e-aniversario-do-deo-o-dornelesday%2F&amp;linkname=Hoje%20%C3%A9%20anivers%C3%A1rio%20do%20D%C3%A9o%2C%20o%20%23dornelesday" title="StumbleUpon" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/stumbleupon.png" width="16" height="16" alt="StumbleUpon"/></a><a class="a2a_button_read_it_later" href="http://www.addtoany.com/add_to/read_it_later?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F06%2F18%2Fhoje-e-aniversario-do-deo-o-dornelesday%2F&amp;linkname=Hoje%20%C3%A9%20anivers%C3%A1rio%20do%20D%C3%A9o%2C%20o%20%23dornelesday" title="Read It Later" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/read_it_later.png" width="16" height="16" alt="Read It Later"/></a><a class="a2a_button_email" href="http://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F06%2F18%2Fhoje-e-aniversario-do-deo-o-dornelesday%2F&amp;linkname=Hoje%20%C3%A9%20anivers%C3%A1rio%20do%20D%C3%A9o%2C%20o%20%23dornelesday" title="Email" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/email.png" width="16" height="16" alt="Email"/></a><a class="a2a_button_evernote" href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F06%2F18%2Fhoje-e-aniversario-do-deo-o-dornelesday%2F&amp;linkname=Hoje%20%C3%A9%20anivers%C3%A1rio%20do%20D%C3%A9o%2C%20o%20%23dornelesday" title="Evernote" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a><a class="a2a_button_instapaper" href="http://www.addtoany.com/add_to/instapaper?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F06%2F18%2Fhoje-e-aniversario-do-deo-o-dornelesday%2F&amp;linkname=Hoje%20%C3%A9%20anivers%C3%A1rio%20do%20D%C3%A9o%2C%20o%20%23dornelesday" title="Instapaper" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/instapaper.png" width="16" height="16" alt="Instapaper"/></a><a class="a2a_button_dihitt" href="http://www.addtoany.com/add_to/dihitt?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F06%2F18%2Fhoje-e-aniversario-do-deo-o-dornelesday%2F&amp;linkname=Hoje%20%C3%A9%20anivers%C3%A1rio%20do%20D%C3%A9o%2C%20o%20%23dornelesday" title="diHITT" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/dihitt.png" width="16" height="16" alt="diHITT"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F06%2F18%2Fhoje-e-aniversario-do-deo-o-dornelesday%2F&amp;linkname=Hoje%20%C3%A9%20anivers%C3%A1rio%20do%20D%C3%A9o%2C%20o%20%23dornelesday" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F06%2F18%2Fhoje-e-aniversario-do-deo-o-dornelesday%2F&amp;linkname=Hoje%20%C3%A9%20anivers%C3%A1rio%20do%20D%C3%A9o%2C%20o%20%23dornelesday" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F06%2F18%2Fhoje-e-aniversario-do-deo-o-dornelesday%2F&amp;title=Hoje%20%C3%A9%20anivers%C3%A1rio%20do%20D%C3%A9o%2C%20o%20%23dornelesday" id="wpa2a_4">Compartilhar/Favoritos</a></p><blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2011, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2011/06/18/hoje-e-aniversario-do-deo-o-dornelesday/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Startup Meetup Curitiba: 1º de março. Inscreva-se!</title>
		<link>http://blog.triveos.com.br/2011/02/23/startup-meetup-curitiba-1%c2%ba-de-marco-inscreva-se/</link>
		<comments>http://blog.triveos.com.br/2011/02/23/startup-meetup-curitiba-1%c2%ba-de-marco-inscreva-se/#comments</comments>
		<pubDate>Wed, 23 Feb 2011 03:14:07 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=877</guid>
		<description><![CDATA[No dia 1º de março]]></description>
			<content:encoded><![CDATA[<p><a href="http://curitiba.startupmeetup.com.br"><img src="http://blog.triveos.com.br/wp-content/uploads/startupmeetup1.png" alt="Logotipo do Startup Meetup Curitiba" title="Startup Meetup Curitiba" width="250" height="150" class="alignleft size-full wp-image-880" /></a><br />
No dia 1º de março de 2011, na <a href="http://www.casadibel.com.br/">Casa di Bel</a> (Rua Dom Pedro II, 602 &#8211; Batel) acontecerá o 1º Startup Meetup de Curitiba e a Triveos é uma das responsáveis pela organização do encontro.</p>
<p>Vocês poderão encontrar mais informações no <a href="http://curitiba.startupmeetup.com.br/">site do encontro</a>.</p>
<p>Para participar é só se inscrever no formulário disponível em: <a href="http://bit.ly/1meetupPR">http://bit.ly/1meetupPR</a>. Não é necessário pagar inscrição e o único custo fica por conta dos R$10 de consumação da Casa di Bel.</p>
<a name="wptoc_0_0_0"></a><h3>O que é um Startup Meetup?</h3>
<p>Explicação curta e informal: Um Happy Hour para &#8216;<a href="http://exame.abril.com.br/pme/dicas-de-especialista/noticias/o-que-e-uma-startup">startupeiros</a>&#8216;.</p>
<p>Explicação mais formal: é um encontro informal de empreendedores de uma cidade para um bate-papo sobre seus planos, projetos e empreendimentos. Esses encontros tendem a acontecer com uma certa regularidade e visam fortalecer o ambiente de negócios e empreendedorismo na cidade onde ele acontece.</p>
<p>Os Meetups geralmente acontecem num bar para que as pessoas possam comer, beber e conversar mais à vontade.</p>
<a name="wptoc_0_0_1"></a><h3>Ajude a Divulgar</h3>
<p>O evento é organizado por empreendedores para empreendedores de forma voluntária e, por isso, precisamos da ajuda de todos na divulgação que pode se dar dos seguintes modo:</p>
<ul>
<li>Avise os seus amigos da imprensa;</li>
<li>Divulgue no seu blog;</li>
<li>Divulgue no seu Twitter (usando o link encurtado: http://bit.ly/1meetupPR);</li>
<li>Anuncie e divulgue no Facebook (“curta” a página do encontro);</li>
</ul>
<a name="wptoc_0_0_2"></a><h3>Como estamos?</h3>
<p>No momento em que eu escrevo esse post temos 27 inscritos no formulário. Se compararmos com o que os Startup Meetups de outras cidades é muito pouco, portanto, vamos agitar isso aí! :D</p>
<p>O evento tá logo aí: 1º de março de 2011! (terça-feira antes do carnaval).</p>
<a name="wptoc_0_0_3"></a><h3>Apoios</h3>
<p>A organização local está contanto com o apoio de diversas empresas que ajudam na organização desses encontros em todo o Brasil, entre elas: <a href="http://aceleradora.net/">Aceleradora</a>, <a href="http://www.sambatech.com.br">Samba Tech</a> e <a href="http://readwriteweb.com.br/">Read Write Web Brasil</a>.</p>
<a name="wptoc_0_0_4"></a><h3>Entre em contato</h3>
<p>Caso tenha alguma dúvida ou queira colaborar com a organização do evento de algum modo entre em contato <a   href="javascript:smae_decode('b3NhbnRhbmFAdHJpdmVvcy5jb20=');" >&#099;&#111;&#109;&#105;&#103;&#111;</a> ou com o <a   href="javascript:smae_decode('c2FtcGFpb0BncnVwb2Fpci5jb20uYnI=');" >&#068;&#105;&#101;&#103;&#111;</a>.</p>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://blog.triveos.com.br/2011/02/23/startup-meetup-curitiba-1%c2%ba-de-marco-inscreva-se/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://blog.triveos.com.br/2011/02/23/startup-meetup-curitiba-1%c2%ba-de-marco-inscreva-se/" data-text="Startup Meetup Curitiba: 1º de março. Inscreva-se!"></a><a class="a2a_button_stumbleupon" href="http://www.addtoany.com/add_to/stumbleupon?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F02%2F23%2Fstartup-meetup-curitiba-1%25c2%25ba-de-marco-inscreva-se%2F&amp;linkname=Startup%20Meetup%20Curitiba%3A%201%C2%BA%20de%20mar%C3%A7o.%20Inscreva-se%21" title="StumbleUpon" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/stumbleupon.png" width="16" height="16" alt="StumbleUpon"/></a><a class="a2a_button_read_it_later" href="http://www.addtoany.com/add_to/read_it_later?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F02%2F23%2Fstartup-meetup-curitiba-1%25c2%25ba-de-marco-inscreva-se%2F&amp;linkname=Startup%20Meetup%20Curitiba%3A%201%C2%BA%20de%20mar%C3%A7o.%20Inscreva-se%21" title="Read It Later" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/read_it_later.png" width="16" height="16" alt="Read It Later"/></a><a class="a2a_button_email" href="http://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F02%2F23%2Fstartup-meetup-curitiba-1%25c2%25ba-de-marco-inscreva-se%2F&amp;linkname=Startup%20Meetup%20Curitiba%3A%201%C2%BA%20de%20mar%C3%A7o.%20Inscreva-se%21" title="Email" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/email.png" width="16" height="16" alt="Email"/></a><a class="a2a_button_evernote" href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F02%2F23%2Fstartup-meetup-curitiba-1%25c2%25ba-de-marco-inscreva-se%2F&amp;linkname=Startup%20Meetup%20Curitiba%3A%201%C2%BA%20de%20mar%C3%A7o.%20Inscreva-se%21" title="Evernote" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a><a class="a2a_button_instapaper" href="http://www.addtoany.com/add_to/instapaper?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F02%2F23%2Fstartup-meetup-curitiba-1%25c2%25ba-de-marco-inscreva-se%2F&amp;linkname=Startup%20Meetup%20Curitiba%3A%201%C2%BA%20de%20mar%C3%A7o.%20Inscreva-se%21" title="Instapaper" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/instapaper.png" width="16" height="16" alt="Instapaper"/></a><a class="a2a_button_dihitt" href="http://www.addtoany.com/add_to/dihitt?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F02%2F23%2Fstartup-meetup-curitiba-1%25c2%25ba-de-marco-inscreva-se%2F&amp;linkname=Startup%20Meetup%20Curitiba%3A%201%C2%BA%20de%20mar%C3%A7o.%20Inscreva-se%21" title="diHITT" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/dihitt.png" width="16" height="16" alt="diHITT"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F02%2F23%2Fstartup-meetup-curitiba-1%25c2%25ba-de-marco-inscreva-se%2F&amp;linkname=Startup%20Meetup%20Curitiba%3A%201%C2%BA%20de%20mar%C3%A7o.%20Inscreva-se%21" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F02%2F23%2Fstartup-meetup-curitiba-1%25c2%25ba-de-marco-inscreva-se%2F&amp;linkname=Startup%20Meetup%20Curitiba%3A%201%C2%BA%20de%20mar%C3%A7o.%20Inscreva-se%21" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F02%2F23%2Fstartup-meetup-curitiba-1%25c2%25ba-de-marco-inscreva-se%2F&amp;title=Startup%20Meetup%20Curitiba%3A%201%C2%BA%20de%20mar%C3%A7o.%20Inscreva-se%21" id="wpa2a_6">Compartilhar/Favoritos</a></p><blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2011, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2011/02/23/startup-meetup-curitiba-1%c2%ba-de-marco-inscreva-se/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Notícia triste: nosso amigo Deo faleceu</title>
		<link>http://blog.triveos.com.br/2011/02/10/noticia-triste-nosso-amigo-deo-faleceu/</link>
		<comments>http://blog.triveos.com.br/2011/02/10/noticia-triste-nosso-amigo-deo-faleceu/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 13:58:07 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=853</guid>
		<description><![CDATA[Nunca imaginei que usaria esse]]></description>
			<content:encoded><![CDATA[<p>Nunca imaginei que usaria esse blog para dar esse tipo de notícia, afinal, pensamos que as pessoas boas que nos cercam estarão por aí para sempre.</p>
<p><a href="http://blog.triveos.com.br/wp-content/uploads/5161139464_1696e5a481.jpg"><img class="aligncenter size-medium wp-image-854" title="5161139464_1696e5a481" src="http://blog.triveos.com.br/wp-content/uploads/5161139464_1696e5a481-450x300.jpg" alt="" width="450" height="300" /></a></p>
<p>Hoje, infelizmente, algo ruim aconteceu com o Dornéles Treméa. O Deo era um grande amigo meu, amigo do meu sócio na Triveos (o Marcos Petry), participante ativo da comunidade Python (ele era o nosso presidente) , importante membro e desenvolvedor na comunidade Plone mundial, e o maior homem do mundo para sua esposa e suas duas garotinhas lindas.</p>
<p>Ele se foi num <a title="Nosso amigo Deo morre em um acidente de carro " href="http://zerohora.clicrbs.com.br/zerohora/jsp/default.jsp?uf=1&amp;local=1&amp;section=Geral&amp;newsID=a3204387.xml">acidente de carro</a>. Num daqueles dias que você jamais imaginaria perder um amigo.</p>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://blog.triveos.com.br/2011/02/10/noticia-triste-nosso-amigo-deo-faleceu/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://blog.triveos.com.br/2011/02/10/noticia-triste-nosso-amigo-deo-faleceu/" data-text="Notícia triste: nosso amigo Deo faleceu"></a><a class="a2a_button_stumbleupon" href="http://www.addtoany.com/add_to/stumbleupon?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F02%2F10%2Fnoticia-triste-nosso-amigo-deo-faleceu%2F&amp;linkname=Not%C3%ADcia%20triste%3A%20nosso%20amigo%20Deo%20faleceu" title="StumbleUpon" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/stumbleupon.png" width="16" height="16" alt="StumbleUpon"/></a><a class="a2a_button_read_it_later" href="http://www.addtoany.com/add_to/read_it_later?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F02%2F10%2Fnoticia-triste-nosso-amigo-deo-faleceu%2F&amp;linkname=Not%C3%ADcia%20triste%3A%20nosso%20amigo%20Deo%20faleceu" title="Read It Later" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/read_it_later.png" width="16" height="16" alt="Read It Later"/></a><a class="a2a_button_email" href="http://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F02%2F10%2Fnoticia-triste-nosso-amigo-deo-faleceu%2F&amp;linkname=Not%C3%ADcia%20triste%3A%20nosso%20amigo%20Deo%20faleceu" title="Email" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/email.png" width="16" height="16" alt="Email"/></a><a class="a2a_button_evernote" href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F02%2F10%2Fnoticia-triste-nosso-amigo-deo-faleceu%2F&amp;linkname=Not%C3%ADcia%20triste%3A%20nosso%20amigo%20Deo%20faleceu" title="Evernote" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a><a class="a2a_button_instapaper" href="http://www.addtoany.com/add_to/instapaper?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F02%2F10%2Fnoticia-triste-nosso-amigo-deo-faleceu%2F&amp;linkname=Not%C3%ADcia%20triste%3A%20nosso%20amigo%20Deo%20faleceu" title="Instapaper" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/instapaper.png" width="16" height="16" alt="Instapaper"/></a><a class="a2a_button_dihitt" href="http://www.addtoany.com/add_to/dihitt?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F02%2F10%2Fnoticia-triste-nosso-amigo-deo-faleceu%2F&amp;linkname=Not%C3%ADcia%20triste%3A%20nosso%20amigo%20Deo%20faleceu" title="diHITT" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/dihitt.png" width="16" height="16" alt="diHITT"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F02%2F10%2Fnoticia-triste-nosso-amigo-deo-faleceu%2F&amp;linkname=Not%C3%ADcia%20triste%3A%20nosso%20amigo%20Deo%20faleceu" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F02%2F10%2Fnoticia-triste-nosso-amigo-deo-faleceu%2F&amp;linkname=Not%C3%ADcia%20triste%3A%20nosso%20amigo%20Deo%20faleceu" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F02%2F10%2Fnoticia-triste-nosso-amigo-deo-faleceu%2F&amp;title=Not%C3%ADcia%20triste%3A%20nosso%20amigo%20Deo%20faleceu" id="wpa2a_8">Compartilhar/Favoritos</a></p><blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2011, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2011/02/10/noticia-triste-nosso-amigo-deo-faleceu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Meu ambiente de trabalho em 7 items</title>
		<link>http://blog.triveos.com.br/2011/01/24/meu-ambiente-de-trabalho-em-7-items/</link>
		<comments>http://blog.triveos.com.br/2011/01/24/meu-ambiente-de-trabalho-em-7-items/#comments</comments>
		<pubDate>Mon, 24 Jan 2011 19:03:12 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=850</guid>
		<description><![CDATA[Fui convocado pelo @franciscosouza para]]></description>
			<content:encoded><![CDATA[<p>Fui convocado pelo @franciscosouza para listar 7 ítens do meu ambiente de trabalho&#8230; então aqui vai&#8230;</p>
<a name="wptoc_0_0_0"></a><h2>1. Triveos Tecnologia</h2>
<p>A <a href="http://www.triveos.com.br/">Triveos</a> é a minha empresa e tenho, como sócio técnico, o pythonista Marcos Petry. Não chega a ser uma &#8220;equipe&#8221; mas já dá pra fazer um bom estrago ;D</p>
<p>Aqui na Triveos a gente não tem preconceito contra nenhuma tecnologia (nosso site e blog rodam em PHP e somos membros do Microsoft Bizspark).</p>
<p>Eu particularmente tenho algumas &#8220;birras&#8221; com alguns softwares que já me torturaram no passado: Trac, Nagios, Squirrelmail, Bazaar, etc.</p>
<a name="wptoc_0_0_1"></a><h2>2. Git, Github, Codebase</h2>
<p>Nós gostamos muito de usar DVCS e adoramos o <a href="http://github.com/">Github</a> para hospedar nossos (poucos :/) projetos open-source. Gostamos das ferramentas de apoio à criação de grupos de desenvolvedores que eles oferecem.</p>
<p>Usamos o Git por conta do Github. Mas usaríamos Mercurial se o Bitbucket fosse tão bom quanto.</p>
<p>No nosso dia-a-dia a gente lida com projetos de clientes e/ou de código fechado e para esses projetos nós achamos melhor procurar um local mais &#8220;tranquilo&#8221; pra hospedá-los. Sem o oba-oba, &#8220;excessos&#8221; do Github e com um suporte mais &#8220;rápido&#8221; à eventuais problemas.</p>
<p>Então contratamos um plano no <a href="http://www.codebasehq.com/t/ka08ti86qd5evnk5">Codebase</a>. Lá eles oferecem hospedagem de código com repositórios Git, Mercurial ou SVN. Também disponibilizam um sistema de Tickets/Milestones e Wikis para projetos.</p>
<a name="wptoc_0_0_2"></a><h2>3. Tecla, Webfaction e Linode</h2>
<p>Para hospedagem em produção preferimos usar o <a href="http://www.linode.com/?r=a2047c0b12991291d45d720c5fba6e78ded74612">Linode</a> (e eu indico a todos que querem um serviço simples e de qualidade).</p>
<p>Mas em alguns projetos (leia-se <a href="http://www.ludeos.com.br">Ludeos</a>) temos algumas exigências relacionadas a comprovação de gastos. Nesses casos usamos o Cloud da Tecla. Eles são melhores que a Locaweb mas ainda são infinitamente inferiores a qualquer hosting similar nos EUA. E nem estou falando de preço (o pior deles, IMHO, é o sistema de cobrança).</p>
<p>Os sites mais simples (e blogs) ficam numa conta compartilhada simples no <a href="http://www.webfaction.com?affiliate=osantana">Webfaction</a>. Para colocar um WordPress &#8220;no ar&#8221; com poucos cliques é uma baita ferramenta. Mas costumo notar certa lentidão no acesso às páginas de tempos em tempos.</p>
<a name="wptoc_0_0_3"></a><h2>4. Vim, Textmate e nada de IDEs</h2>
<p>Uso principalmente o Vim mas me viro bem com o Textmate também. Dependendo da minha &#8220;vibe&#8221; eu uso um ou outro.</p>
<p>Recentemente passei a usar o MacVim mas ainda não estou me dando muito bem com ele. Vou insistir mais um pouco pra ver se me acostumo.</p>
<p>Nossos funcionários usam Eclipse+PyDev&#8230; engraçado isso&#8230; :D</p>
<a name="wptoc_0_0_4"></a><h2>5. Python (&#8230; JS, Ruby, C, Shell Script, Java, PHP, &#8230;)</h2>
<p>Aqui na Triveos é assim: se a bola foi lançada a gente mata ela no peito e chuta pro gol! :D</p>
<p>É claro que a gente seria mais feliz usando só Python, mas não dá pra fazer isso sempre.</p>
<p>Para desenvolvimento web nós usamos Django mas já namoramos o Flask, o Repoze.BFG (Pyramid), e diversos outros frameworks web feitos em Python.</p>
<p>Já usamos jQuery (apesar de eu não gostar dessa biblioteca) e estou estudando YUI3 seriamente a algum tempo.</p>
<a name="wptoc_0_0_5"></a><h2>6. OS X e Ubuntu Linux</h2>
<p>OS X pra criar e Ubuntu pra produzir em massa. :D</p>
<p>Já usamos CentOS e Debian em ambientes de produção mas eu detesto lidar com software velho. Então adotamos uma alternativa mais &#8220;arriscada&#8221;? E usamos a última versão de Ubuntu disponível. Procuro sempre atualizar os ambientes de produção.</p>
<p>Instanciamos uma máquina com o Ubuntu mais novo &#8220;nas nuvens&#8221;, rodamos um comando de setup/deployment e pimba! servidor novo, com software atualizado e rodando&#8230;</p>
<p>&#8230;mas isso só é possível em projetos onde usamos &#8220;Continuous Deployment&#8221;&#8230; e ainda estamos aprendendo a fazer isso direito. Quando estivermos &#8220;fera&#8221; nisso pretendo escrever sobre o assunto aqui.</p>
<p>Mas se alguém quiser uma idéia do que planejo pode ver no artigo <a href="http://www.lorenzogil.com/blog/2010/10/29/python-deployment-tips/">Python deployment tips</a> do Lorenzo Gil.</p>
<a name="wptoc_0_0_6"></a><h2>7. Ambiente</h2>
<p>Uso o Terminal.app (mas tenho planos de experimentar o iTerm) com bash configurado para modo <code>vi</code> no <em>prompt</em>.</p>
<p>Uso:</p>
<ul>
<li><a href="http://www.python.org/">Python 2.7</a> (baixado do python.org)</li>
<li><a href="http://pypi.python.org/pypi/virtualenv">virtualenv</a></li>
<li><a href="https://github.com/osantana/personal">Algumas personalizações no shell</a></li>
<li>Alguns pacotes do <a href="http://www.rudix.org/">Rudix</a> (não instalo tudo por conta da versão do git dele)</li>
<li><a href="http://git-scm.com/">git</a> do site oficial</li>
<a name="wptoc_0_0_7"></a><h2>Passando a bola pra frente</h2>
<p>Agora é a vez dos colegas:</p>
</ul>
<ul>
<li>Marinho Brandão (@marinhobrandao)</li>
<li>Arthur Furlan (@arthurfurlan)</li>
<li>Marcos Petry (@petry)</li>
</ul>
<p>&#8230; descreverem seus ambientes :D</p>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://blog.triveos.com.br/2011/01/24/meu-ambiente-de-trabalho-em-7-items/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://blog.triveos.com.br/2011/01/24/meu-ambiente-de-trabalho-em-7-items/" data-text="Meu ambiente de trabalho em 7 items"></a><a class="a2a_button_stumbleupon" href="http://www.addtoany.com/add_to/stumbleupon?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F24%2Fmeu-ambiente-de-trabalho-em-7-items%2F&amp;linkname=Meu%20ambiente%20de%20trabalho%20em%207%20items" title="StumbleUpon" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/stumbleupon.png" width="16" height="16" alt="StumbleUpon"/></a><a class="a2a_button_read_it_later" href="http://www.addtoany.com/add_to/read_it_later?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F24%2Fmeu-ambiente-de-trabalho-em-7-items%2F&amp;linkname=Meu%20ambiente%20de%20trabalho%20em%207%20items" title="Read It Later" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/read_it_later.png" width="16" height="16" alt="Read It Later"/></a><a class="a2a_button_email" href="http://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F24%2Fmeu-ambiente-de-trabalho-em-7-items%2F&amp;linkname=Meu%20ambiente%20de%20trabalho%20em%207%20items" title="Email" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/email.png" width="16" height="16" alt="Email"/></a><a class="a2a_button_evernote" href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F24%2Fmeu-ambiente-de-trabalho-em-7-items%2F&amp;linkname=Meu%20ambiente%20de%20trabalho%20em%207%20items" title="Evernote" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a><a class="a2a_button_instapaper" href="http://www.addtoany.com/add_to/instapaper?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F24%2Fmeu-ambiente-de-trabalho-em-7-items%2F&amp;linkname=Meu%20ambiente%20de%20trabalho%20em%207%20items" title="Instapaper" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/instapaper.png" width="16" height="16" alt="Instapaper"/></a><a class="a2a_button_dihitt" href="http://www.addtoany.com/add_to/dihitt?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F24%2Fmeu-ambiente-de-trabalho-em-7-items%2F&amp;linkname=Meu%20ambiente%20de%20trabalho%20em%207%20items" title="diHITT" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/dihitt.png" width="16" height="16" alt="diHITT"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F24%2Fmeu-ambiente-de-trabalho-em-7-items%2F&amp;linkname=Meu%20ambiente%20de%20trabalho%20em%207%20items" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F24%2Fmeu-ambiente-de-trabalho-em-7-items%2F&amp;linkname=Meu%20ambiente%20de%20trabalho%20em%207%20items" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F24%2Fmeu-ambiente-de-trabalho-em-7-items%2F&amp;title=Meu%20ambiente%20de%20trabalho%20em%207%20items" id="wpa2a_10">Compartilhar/Favoritos</a></p><blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2011, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2011/01/24/meu-ambiente-de-trabalho-em-7-items/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A Web e o problema das senhas &#8220;clear text&#8221;</title>
		<link>http://blog.triveos.com.br/2011/01/22/a-web-e-o-problema-das-senhas-clear-text/</link>
		<comments>http://blog.triveos.com.br/2011/01/22/a-web-e-o-problema-das-senhas-clear-text/#comments</comments>
		<pubDate>Sat, 22 Jan 2011 20:36:17 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=839</guid>
		<description><![CDATA[Nos últimos dias o serviço]]></description>
			<content:encoded><![CDATA[<p>Nos últimos dias o serviço Trapster avisou que <a href="http://blogs.computerworld.com/17690/over_10_million_passwords_possibly_compromised_at_trapster">10 milhões de senhas dos seus usuários poderiam estar comprometidas</a>. No ano passado a rede de sites de notícia Gawker <a href="http://gawker.com/5712615/commenting-accounts-compromised-++-change-your-passwords">passou <del datetime="2011-01-23T13:35:31+00:00">pelo mesmo problema</del> por um problema parecido</a>.</p>
<p>E se formos voltar no tempo vamos descobrir que todo ano temos pelo menos 2 ocorrências similares em sites grandes. E isso vem acontecendo ano após ano desde que a Internet se tornou acessível entre &#8220;civis&#8221;.</p>
<p>Se todos os usuários usassem senhas diferentes para cada um dos serviços que usa na internet o estrago causado por esse tipo de situação seria bastante limitado. Mas não é isso o que acontece e, quando senhas &#8220;vazam&#8221; na internet o estrago pode ser gigantesco.</p>
<p><strong>Problema antigo. Solução conhecida.</strong></p>
<p>Em 1994 fui fazer estágio na Telesp no interior de São Paulo. Lá eu tive meu primeiro contato &#8220;sério&#8221; com um Unix. Era um SCO Unix que rodava num 386SX com 7 terminais seriais.</p>
<p>Enquanto eu estava aprendendo a usar o Unix eu vi que tinha um arquivo chamado <code>/etc/passwd</code> e, pelo nome, imaginei que lá eu encontraria as senhas de usuários do sistema.</p>
<p>Naquela época eu era &#8220;metido a hacker&#8221; e fiquei entusiasmado com a idéia de descobrir a senha de todo mundo que usava aquele servidor. Fiquei mais animado ainda quando vi que as permissões do arquivo permitiam que qualquer usuário examinasse seu conteúdo.</p>
<p>Quando abri o arquivo veio a decepção&#8230; no lugar onde deveriam ficar as senhas estava um &#8220;x&#8221;. Mas não me dei por vencido. Após estudar as <em>manpages</em> (que viam impressas em manuais imensos!) fiquei sabendo que as senhas não estavam lá. Elas estavam no arquivo <code>/etc/shadow</code>.</p>
<p>Com o ânimo renovado fui atrás desse arquivo. Mas dessa vez as coisas estavam um pouquinho mais difíceis&#8230; só o usuário <code>root</code> conseguiria ver esse arquivo.</p>
<p>Chegou a hora, então, de uma pitada de engenharia social&#8230; não vou contar como fiz porque foi muito fácil mas consegui a senha de <code>root</code> do sistema&#8230; hora de ver a senha dos outros usuários da Telesp e implantar uma mega-revolução na telefonia brasileira!&#8230; erm&#8230; menos&#8230;</p>
<p>Quando abri o arquivo tomei uma ducha de água fria definitiva. No lugar onde as senhas deveriam estar eu só um amontoado de caracteres que não se pareciam com senhas. Até poderiam ser as senhas dos usuários mas parecia muito improvável (e de fato não eram).</p>
<p>Descobri depois que o que estava armazenado ali era o resultado de uma espécie de &#8220;criptografia&#8221;. Ou seja, em 1992 os sistemas Unix já não armazenavam as senhas em texto puro. É bem provável que eles já não fizessem isso a muito mais tempo.</p>
<p>Estamos em 2011. Se depois de 19 anos eu armazenasse as senhas dos meus usuários em &#8220;texto puro&#8221; eu deveria ser chamado de irresponsável e incopetente. Se um invasor tivesse acesso à essas senhas eu deveria ser tratado como criminoso. No mínimo.</p>
<p><strong>A solução</strong></p>
<p>A única solução correta e infalível para armazenar senhas de forma segura é: não armazená-las.</p>
<p>Aí você deve estar perguntando: se eu não armazenar a senha do usuário como eu consigo verificar a senha dele durante sua autenticação?</p>
<p>Uma resposta &#8220;básica&#8221; seria: armazene o hash da senha.</p>
<p>Segundo o <a href="http://informatica.hsw.uol.com.br/certificado-digital8.htm">HowStuffWorks brasileiro</a>: </p>
<blockquote><p>&#8220;Hash é resultado da ação de algoritmos que fazem o mapeamento de uma seqüência de bits de tamanho arbitrário para uma seqüência de bits de tamanho fixo menor de forma que seja muito difícil encontrar duas mensagens produzindo o mesmo resultado hash (resistência à colisão ), e que o processo reverso também não seja realizável (dado um hash, não é possível recuperar a mensagem que o gerou).&#8221;
</p></blockquote>
<p>Existem vários algorítmos para cálculos de hash. Cada um deles possui um determinado tipo de aplicação. As funções de hash mais &#8220;famosas&#8221; são aquelas cuja aplicação está no campo da criptografia: MD2, MD4, MD5, SHA1, SHA256, &#8230;</p>
<p>Vou demonstrar o que acontece com o MD5:</p>
<pre>
$ echo "123mudar" | md5sum
642d8860fc6fe3126803ebdbe9974abd
$ echo "123mudar" | md5sum
642d8860fc6fe3126803ebdbe9974abd
$ echo "123mudor" | md5sum
fe294bbc902c287efb7acb20c8fdb67a
</pre>
<p>Note que sempre obtemos o mesmo resultado quando a senha é a mesma mas quando mudamos 1 único caracter o resultado do cálculo de hash muda completamente.</p>
<p>Tendo isso em mente podemos pensar em armazenar no nosso banco de dados apenas o hash da senha do usuário. Quando for preciso verificar a senha informada pelo usuário aplicamos a função de hash à ela e comparamos com aquela que está armazenada no banco de dados.</p>
<p>Perfeito não é? Problema resolvido, não? Não! Ainda falta uma pitada de &#8220;sal&#8221; nessa receita&#8230;</p>
<p><strong>Salt – mais uma dificuldade para o invasor</strong></p>
<p>Vamos supor que um invasor tenha acesso ao banco de dados da aplicação e ao hash das senhas&#8230;</p>
<p>Com esses hashes o usuário pode disparar um ataque baseado em dicionários ou até mesmo procurar pelos hashes no Google! Veja o que acontece com uma senha &#8220;fraca&#8221;:</p>
<pre>
$ echo "senha" | md5sum
6fd720fb42d209f576ca23d5e437a7bb
</pre>
<p>Agora procure por &#8220;<code>6fd720fb42d209f576ca23d5e437a7bb</code>&#8221; no Google e veja o resultado :D</p>
<p>Para resolvermos esse problema devemos usar um &#8220;salt&#8221; para gerar o hash da senha.</p>
<p>Salt é uma sequência aleatória de bits que são concatenados à senha do usuário antes de gerar o hash (quanto maior essa sequência mais difícil será o trabalho do invasor).</p>
<p>Por ser uma sequência aleatória precisamos armazená-la junto com o resultado do hash para ser possível verificar a senha depois. Vamos à um exemplo &#8220;pythonico&#8221;</p>
<pre>
$ python
>>> import random
>>> import hashlib
>>> senha = "senha"
>>> salt = ''.join(chr(random.randint(65, 122)) for x in range(5))
>>> salt # Esse é o Salt!
'vGBAA'
>>> salt_senha = salt + senha
>>> salt_senha # salt + senha
'vGBAAsenha'
>>> hash = hashlib.md5(salt_senha).hexdigest()
>>> hash # Esse é o hash do salt+senha
'3607507cfa3f31b0cf10e83af947df97'
>>> armazenar = salt + "$" + hash
>>> armazenar
'vGBAA$3607507cfa3f31b0cf10e83af947df97'
</pre>
<p>Tente procurar pelo hash &#8220;<code>3607507cfa3f31b0cf10e83af947df97</code>&#8221; no Google agora&#8230; ou submeter esse hash à um ataque de dicionário&#8230; Você verá que aumentamos um pouco a dificuldade para descobrir a senha do usuário.</p>
<p>Esse é o procedimento usado por grande parte dos frameworks web que implementam alguma forma de armazenamento de senha (ex. <code>django.contrib.auth</code>). Ele é bastante seguro e podemos considerar isso satisfatório. Mas as coisas estão mudando&#8230;</p>
<p><strong>A nuvem &#8220;do mal&#8221;</strong></p>
<p>Com o advento da &#8220;computação na nuvem&#8221; chegamos à situação onde podemos comprar &#8220;poder de processamento&#8221; tal como compramos energia elétrica.</p>
<p>Antigamente se a gente tivesse um salt+hash em mãos era quase impossível (ou economicamente inviável) conseguir poder de processamento suficiente para submetê-los à um ataque de força bruta.</p>
<p>Mas as coisas mudaram e com 1 cartão de crédito e uma quantidade &#8220;viável&#8221; de dinheiro é possível contratar dezenas de &#8220;nós&#8221; de processamento na Amazon ECS, por exemplo, e colocá-los para &#8220;atacar&#8221; o nosso salt+hash.</p>
<p>Esse tipo de prática provavelmente já está sendo usada por alguns invasores pelo mundo e aparentemente não existe uma solução definitiva para esse tipo de situação.</p>
<p>O que existe são medidas que você pode adotar para dificultar um pouco mais a vida dos vilões :D</p>
<p>Uma delas é substituir o algoritmo de hash (MD5/SHA1) por outro algorítmo mais apropriado para o nosso uso.</p>
<p>O problema em usar os algorítmos MD5 e SHA1 para calcular os hashes de nossas senhas é que eles são muito eficientes e rápidos. As principais aplicações desses algorítmos exigem que eles sejam rápidos (ex. assinatura digital de um arquivo gigantesco).</p>
<p>Como eles são muito rápidos é possível disparar um ataque de força bruta e testar muitos hashes em um curto espaço de tempo. Como as plataformas na &#8220;nuvem&#8221; cobram por tempo de uso podemos quebrar uma senha à um custo relativamente baixo (ou viável economicamente).</p>
<p>Se trocarmos esses algorítmos por um que seja muito mais lento obrigamos o invasor a gastar mais poder de processamento (e consequentemente mais dinheiro) para descobrir nossa senha.</p>
<p>Um dos métodos mais indicados, hoje, é o <a href="http://codahale.com/how-to-safely-store-a-password/">bcrypt</a> (blowfish). Existe implementações desse algorítmo para diversas linguagens:</p>
<ul>
<li><a href="http://pypi.python.org/pypi/py-bcrypt/">Python</a></li>
<li><a href="https://github.com/codahale/bcrypt-ruby">Ruby</a></li>
<li><a href="http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx">C#/.Net</a></li>
<li><a href="http://www.mindrot.org/projects/jBCrypt/">Java</a></li>
<li><a href="http://search.cpan.org/~zefram/Crypt-Eksblowfish-0.008/lib/Crypt/Eksblowfish/Bcrypt.pm">Perl</a></li>
<li><a href="https://github.com/skarab/erlang-bcrypt">Erlang</a></li>
<li><a href="http://www.openwall.com/crypt/">C</a></li>
<li><a href="http://www.openwall.com/phpass/">PHP</a></li>
</ul>
<p><strong>E como eu sei se um site armazena minhas senhas em texto puro?</strong></p>
<p>Não é possível saber com 100% de certeza se um site ou serviço armazena as suas senhas em &#8220;texto puro&#8221;, portanto, o melhor mesmo é criar o hábito de usar senhas diferentes em cada um dos serviços (só tente não anotá-las em papéis! :D).</p>
<p>Mas apesar de não ser possível ter certeza se o serviço em questão é desenvolvido por um irresponsável é possível buscar indícios dessa irresponsabilidade:</p>
<ul>
<li>Receber um e-mail de confirmação de cadastro onde sua senha está presente – Se ele está te mandando um e-mail com sua senha é grande a possibilidade dela ser armazenada da mesma forma.</li>
<li>Use a opção &#8220;esqueci minha senha&#8221; dos sites para testar – se você usar essa opção e o site te mandar um e-mail (ou mostrar na tela) a sua senha é porque eles tem a sua senha &#8220;original&#8221; armazenada em algum lugar. O correto é receber um link para *resetar* sua senha.</li>
</ul>
<p><strong>Implicações no &#8220;mercado&#8221;</strong></p>
<p>Nós que trabalhamos com web e somos entusiastas da idéia &#8220;da nuvem&#8221; devemos condenar a prática de armazenar dados sensíveis do usuário de forma tão irresponsável. Cada notícia que surge dando conta de vazamentos dessas informações prejudica todos os serviços. Para um leigo é a segurança &#8220;da internet&#8221; que é falha.</p>
<p>Se você é um empresário ou desenvolvedor sério e responsável deve cuidar da segurança dos dados dos seus usuários com todo o cuidado e, sempre que ver outra empresa trabalhando de outra maneira você tem a obrigação de condená-la pois ela também está, indiretamente, prejudicando o seu negócio.</p>
<p><strong>Atualização:</strong></p>
<p>O meu amigo Guilherme Manika postou um <a href="http://tech.gawker.com/5721670/gawker-password-management-qa">link</a> para um artigo onde a equipe do <a href="http://www.gawker.com/">Gawker</a> relata o problema ocorrido com as senhas de seus usuários.</p>
<p>Pelo que entendi eles armazenavam o hash das senhas usando a função <a href="http://en.wikipedia.org/wiki/Crypt_(Unix)">crypt(3)</a> e um <em>salt</em> com apenas 12 bits que, como disse, é muito pouco para os padrões de ataque atuais.</p>
<p>Então, em 2008, eles modificaram o sistema para usar o bcrypt() também. Mas, aí a &#8216;burrada&#8217; deles: eles continuaram gerando o hash com crypt(3) e armazenando no mesmo lugar que os hashes bcrypt() pra manter compatibilidade retroativa!</p>
<p>Segundo um <a href="http://seclists.org/nmap-dev/2010/q4/690">e-mail</a> que circulou numa lista de segurança,  748.081 usuários tinham as senhas armazenadas com crypt() e 195.178 tinham as senhas armazenadas com crypt() e bcrypt(). Total: 943.259 usuários afetados. Quase um milhão de pessoas.</p>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://blog.triveos.com.br/2011/01/22/a-web-e-o-problema-das-senhas-clear-text/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://blog.triveos.com.br/2011/01/22/a-web-e-o-problema-das-senhas-clear-text/" data-text="A Web e o problema das senhas &#8220;clear text&#8221;"></a><a class="a2a_button_stumbleupon" href="http://www.addtoany.com/add_to/stumbleupon?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F22%2Fa-web-e-o-problema-das-senhas-clear-text%2F&amp;linkname=A%20Web%20e%20o%20problema%20das%20senhas%20%E2%80%9Cclear%20text%E2%80%9D" title="StumbleUpon" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/stumbleupon.png" width="16" height="16" alt="StumbleUpon"/></a><a class="a2a_button_read_it_later" href="http://www.addtoany.com/add_to/read_it_later?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F22%2Fa-web-e-o-problema-das-senhas-clear-text%2F&amp;linkname=A%20Web%20e%20o%20problema%20das%20senhas%20%E2%80%9Cclear%20text%E2%80%9D" title="Read It Later" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/read_it_later.png" width="16" height="16" alt="Read It Later"/></a><a class="a2a_button_email" href="http://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F22%2Fa-web-e-o-problema-das-senhas-clear-text%2F&amp;linkname=A%20Web%20e%20o%20problema%20das%20senhas%20%E2%80%9Cclear%20text%E2%80%9D" title="Email" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/email.png" width="16" height="16" alt="Email"/></a><a class="a2a_button_evernote" href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F22%2Fa-web-e-o-problema-das-senhas-clear-text%2F&amp;linkname=A%20Web%20e%20o%20problema%20das%20senhas%20%E2%80%9Cclear%20text%E2%80%9D" title="Evernote" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a><a class="a2a_button_instapaper" href="http://www.addtoany.com/add_to/instapaper?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F22%2Fa-web-e-o-problema-das-senhas-clear-text%2F&amp;linkname=A%20Web%20e%20o%20problema%20das%20senhas%20%E2%80%9Cclear%20text%E2%80%9D" title="Instapaper" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/instapaper.png" width="16" height="16" alt="Instapaper"/></a><a class="a2a_button_dihitt" href="http://www.addtoany.com/add_to/dihitt?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F22%2Fa-web-e-o-problema-das-senhas-clear-text%2F&amp;linkname=A%20Web%20e%20o%20problema%20das%20senhas%20%E2%80%9Cclear%20text%E2%80%9D" title="diHITT" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/dihitt.png" width="16" height="16" alt="diHITT"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F22%2Fa-web-e-o-problema-das-senhas-clear-text%2F&amp;linkname=A%20Web%20e%20o%20problema%20das%20senhas%20%E2%80%9Cclear%20text%E2%80%9D" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F22%2Fa-web-e-o-problema-das-senhas-clear-text%2F&amp;linkname=A%20Web%20e%20o%20problema%20das%20senhas%20%E2%80%9Cclear%20text%E2%80%9D" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F22%2Fa-web-e-o-problema-das-senhas-clear-text%2F&amp;title=A%20Web%20e%20o%20problema%20das%20senhas%20%E2%80%9Cclear%20text%E2%80%9D" id="wpa2a_12">Compartilhar/Favoritos</a></p><blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2011, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2011/01/22/a-web-e-o-problema-das-senhas-clear-text/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Curso completo de Python e Django</title>
		<link>http://blog.triveos.com.br/2011/01/04/curso-completo-de-python-e-django/</link>
		<comments>http://blog.triveos.com.br/2011/01/04/curso-completo-de-python-e-django/#comments</comments>
		<pubDate>Tue, 04 Jan 2011 23:08:38 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=829</guid>
		<description><![CDATA[Esse post é pra avisar]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.triveos.com.br/wp-content/uploads/capa_ampliada97885752224781.jpg"><img src="http://blog.triveos.com.br/wp-content/uploads/capa_ampliada97885752224781-111x150.jpg" alt="Capa do livro Python e Django" title="Python e Django" width="111" height="150" class="alignleft size-thumbnail wp-image-835" style="padding:3px;border:1px solid black; margin:10px 20px;background:white;" /></a></p>
<p>Esse post é pra avisar à todos que tem interesse em aprender Python e Django que o curso  online de <a href="http://www.ludeos.com.br/s/triveos-cursos-online/python-e-django/">Desenvolvimento Web com Python e Django</a> está pronto e disponível para compra em nossa plataforma <a href="http://www.ludeos.com.br/">Ludeos</a>!</p>
<p>Esse curso é ideal para aqueles desenvolvedores Web que querem começar a usar Python e Django nos seus projetos e não tem um curso presencial à disposição.</p>
<p>Os videos são gravados no formato <em>screencast</em> e podem ser vistos quantas vezes for preciso. A compra é feita no nosso site de treinamentos online e o pagamento pode ser parcelado em até 12x no cartão de crédito (o pagamento é feito através do PagSeguro, ou seja, segurança total para sua compra).</p>
<div style="text-align:center;"><object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/E08DJnf4nyw&amp;ap=%2526fmt%3D18" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed wmode="opaque" src="http://www.youtube.com/v/E08DJnf4nyw&amp;ap=%2526fmt%3D18" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div>
<p>Com esse curso a Triveos, agora, tem o mais completo pacote de treinamentos de Python e Django do país. Composto de:</p>
<ul>
<li><a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso <em>in-company</em> de Python e Django</a> – voltado para empresas que querem qualificar os seus funcionários e deixá-los aptos a trabalhar com desenvolvimento de aplicações Web com Python e Django. O material didático é bastante completo: livro Python e Django, PDF com os 220 slides usados no treinamento, conteúdo adicional e prático sobre depuração e deployment Django, etc.</li>
<li><a href="http://www.ludeos.com.br/s/triveos-cursos-online/python-e-django/">Curso online em vídeo alta-definição</a> – Mais de 8hs de vídeo no formato em alta-definição (720p) cobrindo a maior parte do conteúdo do curso <em>in-company</em>. Além dos vídeos o aluno terá acesso aos slides completos usados em nosso curso in-company, ao código fonte dos exercícios desenvolvidos e suporte por e-mail para esclarecimento de dúvidas sobre o conteúdo do curso.</li>
<li><a href="http://www.pythonedjango.com.br/">Livro Python e Django</a> – O primeiro livro publicado em língua portuguesa sobre Django. Voltado para desenvolvedores Web que usam outras linguagens de programação para o trabalho e querem começar a usar Python e Django.</li>
</ul>
<div style="text-align:center;"><object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/cgULA_8CDyQ&amp;ap=%2526fmt%3D18" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed wmode="opaque" src="http://www.youtube.com/v/cgULA_8CDyQ&amp;ap=%2526fmt%3D18" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div>
<p>Caso tenham alguma dúvida sobre algum dos nossos cursos podem <a href="http://www.triveos.com.br/contato/">entrar em contato conosco</a>. Mas, para agilizar, seguem algumas informações interessantes/importantes:</p>
<ol>
<li>A Triveos oferece desconto de 20% nos cursos <em>in-company</em> agendados para o período de 1/janeiro a 30/abril.</li>
<li>Oferecemos 50% de desconto em nossos cursos online para associados da <a href="http://associacao.python.org.br/">Associação Python Brasil</a> que estão em dia com sua anuidade. É só se cadastrar no site da associação e entrar em contato <a href="http://www.triveos.com.br/contato/">conosco</a> solicitando o código de desconto pra ser usado no momento da compra.</li>
<li>O curso, até o momento, fica disponível por tempo indeterminado e pode ser assistido quantas vezes desejar. Pode ser que isso mude no futuro, até lá, aproveite :D</li>
<li>Conteúdo integrado: o conteúdo do livro, do curso em video e do curso in-company segue a mesma linha.</li>
<li>As pessoas que já adquiriram o curso durante o período de pré-venda ganharão um presente da Triveos. Aguardem o contato em breve (alguns clientes já receberam seus presentes).</li>
</ol>
<p>A plataforma Ludeos, onde os cursos ficam disponíveis, também é um produto da Triveos. Este produto ainda está na sua primeira versão e, por isso, ele ainda está longe do que consideramos ideal.</p>
<p>Estamos trabalhando numa nova versão do Ludeos onde teremos: certificados, suporte tira-dúvidas integrado na plataforma (usamos e-mail/gtalk hoje), download do conteúdo e suporte para que qualquer um possa criar e vender seus treinamentos. Teremos novidades dentro de alguns meses.</p>
<p>Apesar da plataforma não estar completa já é possível assistir os videos e ter acesso ao conteúdo normalmente, portanto, não se preocupem se a &#8220;cara&#8221; do site não lhe parecer muito boa porque em breve ela ficará melhor. :D</p>
<div id="attachment_836" class="wp-caption aligncenter" style="width: 335px"><a href="http://blog.triveos.com.br/wp-content/uploads/ludeos.png"><img src="http://blog.triveos.com.br/wp-content/uploads/ludeos-325x150.png" alt="Logotipo da nova versão do Ludeos" title="Ludeos 2.0" width="325" height="150" class="size-thumbnail wp-image-836" /></a><p class="wp-caption-text">Ludeos 2.0 (em breve)</p></div>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://blog.triveos.com.br/2011/01/04/curso-completo-de-python-e-django/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://blog.triveos.com.br/2011/01/04/curso-completo-de-python-e-django/" data-text="Curso completo de Python e Django"></a><a class="a2a_button_stumbleupon" href="http://www.addtoany.com/add_to/stumbleupon?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F04%2Fcurso-completo-de-python-e-django%2F&amp;linkname=Curso%20completo%20de%20Python%20e%20Django" title="StumbleUpon" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/stumbleupon.png" width="16" height="16" alt="StumbleUpon"/></a><a class="a2a_button_read_it_later" href="http://www.addtoany.com/add_to/read_it_later?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F04%2Fcurso-completo-de-python-e-django%2F&amp;linkname=Curso%20completo%20de%20Python%20e%20Django" title="Read It Later" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/read_it_later.png" width="16" height="16" alt="Read It Later"/></a><a class="a2a_button_email" href="http://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F04%2Fcurso-completo-de-python-e-django%2F&amp;linkname=Curso%20completo%20de%20Python%20e%20Django" title="Email" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/email.png" width="16" height="16" alt="Email"/></a><a class="a2a_button_evernote" href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F04%2Fcurso-completo-de-python-e-django%2F&amp;linkname=Curso%20completo%20de%20Python%20e%20Django" title="Evernote" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a><a class="a2a_button_instapaper" href="http://www.addtoany.com/add_to/instapaper?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F04%2Fcurso-completo-de-python-e-django%2F&amp;linkname=Curso%20completo%20de%20Python%20e%20Django" title="Instapaper" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/instapaper.png" width="16" height="16" alt="Instapaper"/></a><a class="a2a_button_dihitt" href="http://www.addtoany.com/add_to/dihitt?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F04%2Fcurso-completo-de-python-e-django%2F&amp;linkname=Curso%20completo%20de%20Python%20e%20Django" title="diHITT" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/dihitt.png" width="16" height="16" alt="diHITT"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F04%2Fcurso-completo-de-python-e-django%2F&amp;linkname=Curso%20completo%20de%20Python%20e%20Django" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F04%2Fcurso-completo-de-python-e-django%2F&amp;linkname=Curso%20completo%20de%20Python%20e%20Django" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.triveos.com.br%2F2011%2F01%2F04%2Fcurso-completo-de-python-e-django%2F&amp;title=Curso%20completo%20de%20Python%20e%20Django" id="wpa2a_14">Compartilhar/Favoritos</a></p><blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2011, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2011/01/04/curso-completo-de-python-e-django/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Chrome Extension for search Python Documentation</title>
		<link>http://blog.triveos.com.br/2010/12/27/chrome-extension-for-search-python-documentation/</link>
		<comments>http://blog.triveos.com.br/2010/12/27/chrome-extension-for-search-python-documentation/#comments</comments>
		<pubDate>Mon, 27 Dec 2010 17:57:44 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=794</guid>
		<description><![CDATA[Quick post about a small]]></description>
			<content:encoded><![CDATA[<p>Quick post about a small extension for Google Chrome that make easy to search Python Library documentation.</p>
<p>You can download/install accessing: <a href="http://j.mp/pychrome">http://j.mp/pychrome</a>.</p>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://blog.triveos.com.br/2010/12/27/chrome-extension-for-search-python-documentation/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://blog.triveos.com.br/2010/12/27/chrome-extension-for-search-python-documentation/" data-text="Chrome Extension for search Python Documentation"></a><a class="a2a_button_stumbleupon" href="http://www.addtoany.com/add_to/stumbleupon?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F27%2Fchrome-extension-for-search-python-documentation%2F&amp;linkname=Chrome%20Extension%20for%20search%20Python%20Documentation" title="StumbleUpon" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/stumbleupon.png" width="16" height="16" alt="StumbleUpon"/></a><a class="a2a_button_read_it_later" href="http://www.addtoany.com/add_to/read_it_later?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F27%2Fchrome-extension-for-search-python-documentation%2F&amp;linkname=Chrome%20Extension%20for%20search%20Python%20Documentation" title="Read It Later" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/read_it_later.png" width="16" height="16" alt="Read It Later"/></a><a class="a2a_button_email" href="http://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F27%2Fchrome-extension-for-search-python-documentation%2F&amp;linkname=Chrome%20Extension%20for%20search%20Python%20Documentation" title="Email" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/email.png" width="16" height="16" alt="Email"/></a><a class="a2a_button_evernote" href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F27%2Fchrome-extension-for-search-python-documentation%2F&amp;linkname=Chrome%20Extension%20for%20search%20Python%20Documentation" title="Evernote" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a><a class="a2a_button_instapaper" href="http://www.addtoany.com/add_to/instapaper?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F27%2Fchrome-extension-for-search-python-documentation%2F&amp;linkname=Chrome%20Extension%20for%20search%20Python%20Documentation" title="Instapaper" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/instapaper.png" width="16" height="16" alt="Instapaper"/></a><a class="a2a_button_dihitt" href="http://www.addtoany.com/add_to/dihitt?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F27%2Fchrome-extension-for-search-python-documentation%2F&amp;linkname=Chrome%20Extension%20for%20search%20Python%20Documentation" title="diHITT" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/dihitt.png" width="16" height="16" alt="diHITT"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F27%2Fchrome-extension-for-search-python-documentation%2F&amp;linkname=Chrome%20Extension%20for%20search%20Python%20Documentation" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F27%2Fchrome-extension-for-search-python-documentation%2F&amp;linkname=Chrome%20Extension%20for%20search%20Python%20Documentation" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F27%2Fchrome-extension-for-search-python-documentation%2F&amp;title=Chrome%20Extension%20for%20search%20Python%20Documentation" id="wpa2a_16">Compartilhar/Favoritos</a></p><blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2010, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2010/12/27/chrome-extension-for-search-python-documentation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introdução (incompleta) ao Unix/Shell parte 6 (final)</title>
		<link>http://blog.triveos.com.br/2010/12/16/introducao-incompleta-ao-unixshell-parte-6-ultima/</link>
		<comments>http://blog.triveos.com.br/2010/12/16/introducao-incompleta-ao-unixshell-parte-6-ultima/#comments</comments>
		<pubDate>Thu, 16 Dec 2010 16:00:06 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=817</guid>
		<description><![CDATA[Continuação do artigo &#8220;Introdução (incompleta)]]></description>
			<content:encoded><![CDATA[<p>Continuação do artigo &#8220;<a href="/2010/12/15/introducao-incompleta-ao-unixshell-parte-5/">Introdução (incompleta) ao Unix/Shell parte 5</a>&#8220;&#8230;</p>
<a name="wptoc_0_0_0"></a><h2>Capítulo 6. Expressões regulares</h2>
<p>Expressões regulares são uma maneira fácil de manipular texto de maneira concisa e rápida, e folgamos em dizer que elas são o recurso mais subutilizado de qualquer sistema que o suporte justamente porque a maioria das pessoas não se preocupa em aprendê-los. Expressões regulares têm um visual pouco convidativo, mas são simples de aprender e economizam muito tempo ao serem usadas. É possível economizar rotinas inteiras de <em>shell</em> <em>script</em> e loops complicados conhecendo apenas alguns poucos metacaracteres e construindo expressões regulares. Expressões regulares são suportadas por praticamente todos os programas Unix que suportam manipulação de texto, como <em>vi</em>, <tt>grep</tt> e <tt>sed</tt>. O próprio <em>shell</em> tem seus globs, que nada mais são que expressões regulares simplificadas. Linguagens de programação como awk, Perl e JavaScript trazem expressões regulares como parte da linguagem, outras linguagens como Python colocam a manipulação de expressões regulares na biblioteca padrão e ainda existem bibliotecas de manipulação de ERs para praticamente todas as linguagens de programação sérias, e também para algumas não sérias.</p>
<p>Isso dito, é necessário apenas um certo pensamento programático e conhecer os metacaracteres que fazem uma ER para poder usar esse recurso de forma eficiente. Um programador que não conhece ER pode, por exemplo, fazer um loop que busca várias variantes de uma palavra, ou ainda que analisa uma certa palavra caractere por caractere. O que ele está fazendo quando realiza esse tipo de operação é nada mais que reimplementando algo que já está implementado de forma menos genérica, mais lenta e mais trabalhosa.</p>
<p>A primeira parte do uso de expressões regulares é saber como encontrar texto. A partir disso, é possível realizar substituções simples, e com o uso de agrupamentos de partes da expressão, partir para substituições mais complicadas.</p>
<p>Vamos ver um exemplo simples: temos uma lista de pessoas, e no começo dessa lista queremos acrescentar o tratamento &#8220;Sr.&#8221;. Eis a lista:</p>
<pre>A. Antônio
J. da Silva
V. Corleone
M. Andrade
H. Lekter</pre>
<p>Sistematicamente, o que temos que fazer é acrescentar &#8220;Sr. &#8221; ao começo de cada linha (com um espaço após o &#8220;Sr.&#8221;) para ter a lista que desejamos. Nenhuma substituição simples faria isso, é necessário usar metacaracteres das expressões regulares.</p>
<p>O primeiro metacaractere a ser usado é o <tt>^</tt>, que significa &#8220;começo de linha- qualquer semelhança com o comando do <em>vi</em> para começo de linha não é coinscidência. Nossa expressão fica assim:</p>
<pre>s/^/Sr. /</pre>
<p>Para executar no <em>vi</em>, digite <tt>%</tt> e a expressão acima, lembrando que o <tt>%</tt> significa &#8220;em todo o arquivo&#8221;.</p>
<p>Isso quer dizer &#8220;substitua o começo da linha por &#8216;Sr. &#8216;ťť. O resultado é o desejado.</p>
<p>Outros exemplos típicos de ERs seriam &#8220;acrescente &#8216;Sra.&#8217; na frente de nomes que terminam com &#8216;a&#8217;&#8221;, &#8220;coloque determinada <em>string</em> no fim da linha&#8221;, &#8220;substituia a ordem nome-sobrenome por sobrenome-nome&#8221;, etc. Para fazer esse tipo de tarefa, basta ter pensamento programático e conhecer os metacaracteres apresentados abaixo.</p>
<a name="wptoc_0_1_0"></a><h3>6.1. Metacaracteres</h3>
<ul>
<li><tt>.</tt> O metacaractere <tt>.</tt> casa com qualquer um caracter, seja pontuação, alfanumérico, espaço, tab, etc.</li>
<li><tt>*</tt> Encontra zero ou mais vezes o caractere anterior. Por exemplo, <tt>ba*</tt> casa com b, ba, baa, baaa, baaaa.</li>
<li><tt>[]</tt> Um grupo de caracteres. Por exemplo, <tt>mal[au]</tt> casa com &#8220;mala&#8221;e &#8220;malu&#8221;. Também é possível especificar &#8220;ranges&#8221;, como <tt>[a-f]</tt>, que casa com qualquer letra entre a e f, e <tt>[a-fA-F]</tt>, que casa também com maiúsculas.</li>
<li><tt>^</tt> Começo de linha. Adicionalmente, dentro de colchetes, ganha um significado completamente diferente: negação. Assim, <tt>[^a-f]</tt> significa &#8220;qualquer caractere exceto as letras de a até f.</li>
<li><tt>$</tt> Fim de linha</li>
<li><tt>\</tt> Escape. Se quiser casar o texto com um cifrão literal, use <tt>$</tt> (caso contrário, você estará procurando um fim de linha.</li>
</ul>
<p>Esse é o básico de expressões regulares, e isso é suportado em programas como o <em>vi</em>, o sed, o awk, o grep, perl e muitos outros. Alguns programas fazem uso de expressões regulares extendidas, como o egrep e o <em>vi</em> e o perl, que contém alguns metacaracteres úteis mas não essenciais.</p>
<a name="wptoc_0_1_1"></a><h3>6.2. Exemplos</h3>
<p>AVISO: Como avisamos anteriormente, esta parte está incompleta!</p>
<a name="wptoc_0_1_2"></a><h3>6.3. sed e expressões regulares</h3>
<p>O sed é um editor de texto de linha de comando baseado em expressões regulares muito útil para automatizar tarefas. A maneira básica de usá-lo é assim:</p>
<pre>sed 'expressão-regular' arquivo</pre>
<p>A saída do comando é enviada para a saída padrão. Como expressões regulares têm muitos caracteres que conflitam com os metacaracteres do shell, nós incluímos a expressão regular, por conservadorismo, sempre entre aspas simples.</p>
<p>Ao contrário do vi, o sed assume que todas as expressões devem ser realizadas em todas as linhas por padrão, então não é necessário especificar o caractere <tt>%</tt> antes da expressão.</p>
<a name="wptoc_0_1_3"></a><h3>6.4. Grupos</h3>
<p>Uma operação muito comum é buscar algum texto desconhecido e depois realizar operações sobre esse texto. Vejamos o exemplo de uma lista de nomes:</p>
<pre>Silva, José
Asdrubal, Antônio
Reis, Márcia</pre>
<p>Como podemos usar uma expressão regular que inverte a ordem &#8220;Sobrenome, Nome&#8221;para &#8220;Nome Sobrenome&#8221;? Nós precisamos, em primeiro lugar, aprender a usar grupos.</p>
<p>Grupos são uma forma de preservar o texto casado para uso posterior em um comando de substituição. Por exemplo, nós precisamos criar uma ER que case com o sobrenome e coloque esse valor em um grupo e também case com o nome e coloque esse valor em outro grupo. Precisamos, em seguida, inverter a representação desses grupos para termos a ordem direta que precisamos.</p>
<p>A marcação desses grupos é feita colocando os trecos das ERs entre <tt>()</tt>. Porém, em uma ER, <tt>()</tt> têm seus próprios valores, então precisamos escapar os parênteses com uma barra invertida. Vejamos um exemplo de ER com marcação:</p>
<pre>s/\([a-z]*\)[1-3]*/\1/</pre>
<p>Essa ER marca a primeira parte da expressão (<tt>[a-z]*]</tt>) em um grupo, casa com um número de 1 a 3 nenhuma ou mais vezes e depois troca isso tudo pela primeira parte apenas do grupo (na prática, eliminando os números). Note que o primeiro grupo marcado vira<tt>\1</tt>, o segundo vira <tt>\2</tt>, etc.</p>
<p>Então como fazemos para inverter a ordem &#8220;Sobrenome, Nome&#8221;? Temos que casar o texto alfabética até a vírgula, sem incluir a vírgula, e botar em um grupo. Logo em seguida, devemos casar com qualquer texto alfabético e botar em um outro grupo. A ER fica assim:</p>
<pre>s/\([A-Za-z]*\), \([A-Za-z]*\)/\2 \1/</pre>
<a name="wptoc_0_1_4"></a><h3>6.5. Classes de caracteres POSIX</h3>
<p>Se você rodar a maioria dos exemplos acima com uma massa de dados maior, vai notar que as ERs falham quando encontram caracteres acentuadas. Isso acontece porque <tt>[a-z] [A-Z]</tt> casam apenas com caracteres não acentuados.</p>
<p>Para facilitar o gerenciamento de caracteres especiais, foram criadas classes de caracteres que contém uma série de caracteres de um tipo. Note, porém. que algumas características de caracteres são dependentes de fatores culturais. &#8220;á&#8221; é um caractere acentuado para um brasileiro, mas nem sequer existe para um inglês, então o funcionamento das classes de caracteres depende da configuração de localização do sistema operacional.</p>
<p>As classes de caracteres POSIX mais comuns são:</p>
<ul>
<li><tt>[:alnum:]</tt> – Caracteres alfanuméricos</li>
<li><tt>[:alpha:]</tt> – Letras</li>
<li><tt>[:upper:]</tt> – Letras maiúsculas</li>
<li><tt>[:lower:]</tt> – Letras minúsculas</li>
<li><tt>[:digit:]</tt> – Números decimais</li>
<li><tt>[:space:]</tt> – Caracteres de espaçamento</li>
<li><tt>[:punct:]</tt> – Pontuação</li>
</ul>
<p>O funcionamento de uma classe de caractere POSIX é o mesmo de um grupo como &#8220;a-z&#8221;. Logo, uma expressão regular que casa com uma letra maiúscula qualquer poderia ser:</p>
<pre>[[:upper:]]</pre>
<p>O classe POSIX foi incluída entre colchetes pelo mesmo motivo que uma sequência como &#8220;a-z&#8221;seria: os colchetes marcam um grupo. Note que a classe POSIX já inclui colchetes, mas isso não elimina a necessidade de usar colchetes para marcar as classes!</p>
<p>Note, porém, que o funcionamento de classes POSIX está sujeito às configurações de seu sistema operacional. Esse é um ponto que o administrador de sistemas deve ajudar você. Note que nem todo sistema Unix suporta as características de internacionalização do português, então o uso de classes POSIX deve ser feito com muito cuidado.</p>
<a name="wptoc_0_1_5"></a><h3>6.6. Palavras finais</h3>
<p>Expressões regulares são uma maneira muito prática de validar e manipular texto, mas por seu visual estranho acabam por ser pouco aprendidas e pouco usadas. Mas a &#8220;linguagem&#8221; expressões regulares é prática e e fácil de aprender, mesmo que aparente ser algo estranho. A manipulação de texto usando expressões regulares economiza tempo e linhas de código ineficientes, e quando bem usadas, facilitam a legibilidade do programa.</p>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://blog.triveos.com.br/2010/12/16/introducao-incompleta-ao-unixshell-parte-6-ultima/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://blog.triveos.com.br/2010/12/16/introducao-incompleta-ao-unixshell-parte-6-ultima/" data-text="Introdução (incompleta) ao Unix/Shell parte 6 (final)"></a><a class="a2a_button_stumbleupon" href="http://www.addtoany.com/add_to/stumbleupon?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F16%2Fintroducao-incompleta-ao-unixshell-parte-6-ultima%2F&amp;linkname=Introdu%C3%A7%C3%A3o%20%28incompleta%29%20ao%20Unix%2FShell%20parte%206%20%28final%29" title="StumbleUpon" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/stumbleupon.png" width="16" height="16" alt="StumbleUpon"/></a><a class="a2a_button_read_it_later" href="http://www.addtoany.com/add_to/read_it_later?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F16%2Fintroducao-incompleta-ao-unixshell-parte-6-ultima%2F&amp;linkname=Introdu%C3%A7%C3%A3o%20%28incompleta%29%20ao%20Unix%2FShell%20parte%206%20%28final%29" title="Read It Later" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/read_it_later.png" width="16" height="16" alt="Read It Later"/></a><a class="a2a_button_email" href="http://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F16%2Fintroducao-incompleta-ao-unixshell-parte-6-ultima%2F&amp;linkname=Introdu%C3%A7%C3%A3o%20%28incompleta%29%20ao%20Unix%2FShell%20parte%206%20%28final%29" title="Email" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/email.png" width="16" height="16" alt="Email"/></a><a class="a2a_button_evernote" href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F16%2Fintroducao-incompleta-ao-unixshell-parte-6-ultima%2F&amp;linkname=Introdu%C3%A7%C3%A3o%20%28incompleta%29%20ao%20Unix%2FShell%20parte%206%20%28final%29" title="Evernote" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a><a class="a2a_button_instapaper" href="http://www.addtoany.com/add_to/instapaper?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F16%2Fintroducao-incompleta-ao-unixshell-parte-6-ultima%2F&amp;linkname=Introdu%C3%A7%C3%A3o%20%28incompleta%29%20ao%20Unix%2FShell%20parte%206%20%28final%29" title="Instapaper" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/instapaper.png" width="16" height="16" alt="Instapaper"/></a><a class="a2a_button_dihitt" href="http://www.addtoany.com/add_to/dihitt?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F16%2Fintroducao-incompleta-ao-unixshell-parte-6-ultima%2F&amp;linkname=Introdu%C3%A7%C3%A3o%20%28incompleta%29%20ao%20Unix%2FShell%20parte%206%20%28final%29" title="diHITT" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/dihitt.png" width="16" height="16" alt="diHITT"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F16%2Fintroducao-incompleta-ao-unixshell-parte-6-ultima%2F&amp;linkname=Introdu%C3%A7%C3%A3o%20%28incompleta%29%20ao%20Unix%2FShell%20parte%206%20%28final%29" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F16%2Fintroducao-incompleta-ao-unixshell-parte-6-ultima%2F&amp;linkname=Introdu%C3%A7%C3%A3o%20%28incompleta%29%20ao%20Unix%2FShell%20parte%206%20%28final%29" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F16%2Fintroducao-incompleta-ao-unixshell-parte-6-ultima%2F&amp;title=Introdu%C3%A7%C3%A3o%20%28incompleta%29%20ao%20Unix%2FShell%20parte%206%20%28final%29" id="wpa2a_18">Compartilhar/Favoritos</a></p><blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2010, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2010/12/16/introducao-incompleta-ao-unixshell-parte-6-ultima/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introdução (incompleta) ao Unix/Shell parte 5</title>
		<link>http://blog.triveos.com.br/2010/12/15/introducao-incompleta-ao-unixshell-parte-5/</link>
		<comments>http://blog.triveos.com.br/2010/12/15/introducao-incompleta-ao-unixshell-parte-5/#comments</comments>
		<pubDate>Wed, 15 Dec 2010 16:00:23 +0000</pubDate>
		<dc:creator>Osvaldo Santana Neto</dc:creator>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://blog.triveos.com.br/?p=812</guid>
		<description><![CDATA[Continuação do artigo &#8220;Introdução (incompleta)]]></description>
			<content:encoded><![CDATA[<p>Continuação do artigo &#8220;<a href="/2010/12/14/introducao-incompleta-ao-unixshell-parte-4/">Introdução (incompleta) ao Unix/Shell parte 4</a>&#8220;&#8230;</p>
<a name="wptoc_0_0_0"></a><h2>Capítulo 5. Assuntos a considerar</h2>
<a name="wptoc_0_1_0"></a><h3>5.1. Segurança</h3>
<p>O desenvolvimento de <em>shell scripts</em> requer cuidados extremados com segurança. Em qualquer ambiente profissional, segurança é um assunto importante e que deve ser levado em conta. É comum ouvir argumentos como &#8220;não precisamos nos preocupar com isso, temos um <em>firewall</em>ťť ou coisa parecida, mas esses são os argumentos mais perigosos. Um <em>firewall</em> dá sempre uma falsa sensação de segurança. Um firewall não protege, por exemplo, a rede interna de uma empresa de seus próprios funcionários &#8211; a principal origem de ataques contra a estrutura de TI de qualquer empresa. Além disso, mesmo que ataques não ocorram, boa parte dos furos de segurança são <em>bugs</em> que podem causar interrupção de serviço. Manter uma disciplina de escrever <em>scripts</em> seguros, além de ser uma boa política de segurança, é uma boa disciplina que certamente evitará horas de manutenção desnecessária no futuro.</p>
<p>Vamos ver alguns dos problemas mais comuns de segurança com relação a <em>shell</em> scripts.</p>
<a name="wptoc_0_1_1"></a><h3>5.2. Permissões excessivamente permissivas</h3>
<p>Ao criar arquivos, verifique se eles realmente devem ser lidos por todo o sistema. Use o <tt>umask</tt> para setar restrições maiores. Não deixe informação visível a não ser que seja estritamente necessário.</p>
<p>Por outro lado, não tente proteger seu <em>script</em> sendo obscuro e pedante. Boa segurança é aquela que, mesmo exposta para o todo o mundo, ainda é robusta. Não baseie sua estratégia de segurança no desconhecimento da maneira como ela funciona. E mantenha o usuário em perspectiva. Manter arquivos sem permissões de leitura para o sistema todo é uma boa política, mas se isso for necessário para o funcionamento do ambiente de produção, não exite em relaxar a permissão (mas analise as alternativas, como criar grupos de pessoas que podem acessar tais <em>logs</em>).</p>
<a name="wptoc_0_1_2"></a><h3>5.3. <em>Race conditions</em></h3>
<p>Uma maneira muito comum de ataque é se aproveitar da criação de arquivos temporários. Com uma pequena manipulação do ambiente, é possível que um usuário não autorizado crie um link simbólico no lugar de algum arquivo temporário usado por um <em>script</em> (ou por qualquer programa). Como as ações praticadas em um link se refletem no arquivo para o qual ele aponta, é possível sobrescrever e mudar permissões de arquivos importantes do sistema.</p>
<p>A maneira mais simples de evitar isso é não usar um diretório temporário compartilhado como o <tt>/tmp</tt>. Crie um diretório apenas para o usuário, como <tt>$HOME/tmp</tt>. Sete as variáveis <tt>$TMP</tt> e <tt>$TMPDIR</tt> para esse diretório. Se for necessário usar um diretório compartilhado, use o <tt>mktemp</tt>, que cria nomes de arquivos não predizíveis de maneira segura. Evite construções que usam <tt>$$</tt>, já que a variável de ambiente <tt>$$</tt> (sinônimo do PID do shell) é facilmente predizível na maioria dos sistemas <em>UNIX</em>.</p>
<a name="wptoc_0_1_3"></a><h3>5.4. Dados importantes aparecendo como parâmetros</h3>
<p>Cuidado com o conteúdo de dados importantes. Em primeiro lugar, dados como senhas devem estar protegidos no sistema de arquivos por permissões apropriadas (o ideal seria não armazenar senhas em disco). Ao manipular senhas, lembre-se que elas ficam em memória e podem ser bisbilhotadas por outros programas. Nunca passe senhas por parâmetros &#8211; eles aparecem na listagem do <tt>ps</tt>. Use <em>pipes</em>.</p>
<a name="wptoc_0_1_4"></a><h3>5.5. Verifique o <tt>$PATH</tt> e o <tt>$IFS</tt></h3>
<p>As variáveis de ambiente <tt>$PATH</tt> e <tt>$IFS</tt> são muito importantes. Modificar seus conteúdos pode quebrar o funcionamento do <em>script</em> de muitas maneiras. Sete manualmente e sempre o valor dessas variáveis no topo do script. Uma pessoa que mude um PATH, por exemplo, pode fazer com que um dado importante (como uma senha, ou dados confidenciais) sejam enviados para os programas errados, possivelmente programas que essa pessoa mesmo manipula. Adicionalmente, nunca ponha o diretório atual (<tt>.</tt>) no PATH.</p>
<a name="wptoc_0_1_5"></a><h3>5.6. Evite <em>scripts</em> <tt>setuid</tt></h3>
<p>A melhor recomendação com relação a <em>scripts</em> setuid é &#8220;não use&#8221;. Há inúmeros problemas que podem ser usados para conseguir acesso ao usuário dono do script. Se necessário, use um <em>wrapper</em> compilado ou utilize o <tt>sudo</tt>. Cada sistema <em>UNIX</em> requer cuidado específico quanto à segurança de <em>shell</em> <em>scripts</em> setuid. Consulte o manual de seu sistema operacional caso precise utilizar esse recurso. Nem todo sistema <em>UNIX</em> suporta <em>shell</em> <em>scripts</em> setuid, então esse é o tipo de solução não portável.</p>
<a name="wptoc_0_1_6"></a><h3>5.7. Favoreça portabilidade</h3>
<p>A plataforma pode mudar de um dia para o outro. De maneira geral, escrever <em>scripts</em> já é uma solução portável, mas requer cuidados para não usar recursos específicos de uma determinada plataforma. Mesmo que a mudança de plataforma não pareça algo que possa acontecer, lembre-se que o problema do ano 2000 também parecia não ser algo que pudesse acontecer.</p>
<a name="wptoc_0_1_7"></a><h3>5.8. <em>scripts</em> frágeis</h3>
<p>Scripts frágeis podem, em cascata, quebrar o ambiente de produção. Verifique sempre o código de retorno dos comandos para ter certeza de que eles funcionaram como esperado. Ao fazer comparações usando <tt>[</tt>, sempre inclua as variáveis sendo comparadas entre aspas. Valide dados. Se não é necessário expandir uma variável dentro de uma string, use aspas simples ao invés de duplas. Espere que a entrada de seus programas seja algo extremamente variável (seja bastante permissivo com o que pode entrar) e gere uma saída rigidamente definida.</p>
<a name="wptoc_0_1_8"></a><h3>5.9. Escreva código reutilizável</h3>
<p>Sempre que possível, evite fazer código específico para um problema. Gastar um pouquinho de tempo a mais com código reutilizável pode salvar horas de esforço posterior. Além disso, centralizando as principais funções de seu <em>script</em> em torno de código reutilizado significa que há apenas um lugar para consertar ao invés de dezenas de lugares. É possível evoluir e tornar mais robusta uma função reutilizável e ter impactos positivos em todo o sistema.</p>
<p>Por exemplo, se você está escrevendo uma função que lida com logs, possivelmente vai precisar de fazer um processamento de datas. Essas funções de processamento de datas podem ser utilizadas por analisadores de um tipo de log diferente, ou ainda por programas que não são analisadores de log. Criar uma biblioteca de funções de datas e incluí-las nos demais <em>scripts</em> é bem mais inteligente que reescrever as funções diversas vezes.</p>
<a name="wptoc_0_1_9"></a><h3>5.10. KISS</h3>
<p><em>Keep It Simple, Stupid.</em> Não tente escrever aplicações inteiras com <em>shell</em> scripts. Escreva pequenos <em>scripts</em> que realizam operações específicas e que você pode garantir que funcionam bem (essa é uma forma bastante prática de reutilizar código!) e conecte esses utilitários.</p>
<p>Além disso, dentro de scripts, não use estratégias mirabolantes. Use expressões regulares com cuidado, favoreça legibilidade.</p>
<a name="wptoc_0_1_10"></a><h3>5.11. Comente seus scripts</h3>
<p>Escreva comentários. Diga para que servem as funções, mas não explique o óbvio. Comentários devem ser escritos para pessoas que conhecem a linguagem, então não é necessário explicar que <tt>FOO=bar</tt> seta a variável <tt>FOO</tt> com valor bar. Se o código é muito longo ou complicado, um comentário explicando o que ele faz (não <em>como</em> ele faz) é bem vindo.</p>
<a name="wptoc_0_1_11"></a><h3>5.12. Marque áreas que devem ser consertadas</h3>
<p>Algumas vezes, é necessário usar uma solução frágil para resolver rapidamente um problema. Porém, é necessário marcar essa solução para que depois possa ser revisada com mais calma. Ponha um comentário com o texto FIXME e uma explicação do que deve ser consertado. Alguns editores de texto destacam com cores diferentes o texto FIXME, e usar uma <em>string</em> padronizada torna fácil encontrar os pontos em que o <em>script</em> deve ser consertado.</p>
<a name="wptoc_0_1_12"></a><h3>5.13. Indente o código</h3>
<p>&#8220;Indentar&#8221; o código é fundamental para facilitar a compreensão. Separe os blocos de comandos e indente-os de acordo.</p>
<a name="wptoc_0_1_13"></a><h3>5.14. Use variáveis descritivas (mas não muito)</h3>
<p>Variáveis de ambiente devem ter um nome minimamente descritivo de sua função. Uma boa variável para conter um nome, por exemplo, é <tt>$nome</tt>. Não chame essa variável de <tt>$n</tt>, que seria uma maneira de tornar o programa mais críptico, mas também não chegue no extremo de chamar de <tt>$nomedapessoaretiradodatabelatal</tt>. Variáveis com nomes muito descritivos são normalmente muletas para um programa excessivamente complicado.</p>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://blog.triveos.com.br/2010/12/15/introducao-incompleta-ao-unixshell-parte-5/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://blog.triveos.com.br/2010/12/15/introducao-incompleta-ao-unixshell-parte-5/" data-text="Introdução (incompleta) ao Unix/Shell parte 5"></a><a class="a2a_button_stumbleupon" href="http://www.addtoany.com/add_to/stumbleupon?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F15%2Fintroducao-incompleta-ao-unixshell-parte-5%2F&amp;linkname=Introdu%C3%A7%C3%A3o%20%28incompleta%29%20ao%20Unix%2FShell%20parte%205" title="StumbleUpon" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/stumbleupon.png" width="16" height="16" alt="StumbleUpon"/></a><a class="a2a_button_read_it_later" href="http://www.addtoany.com/add_to/read_it_later?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F15%2Fintroducao-incompleta-ao-unixshell-parte-5%2F&amp;linkname=Introdu%C3%A7%C3%A3o%20%28incompleta%29%20ao%20Unix%2FShell%20parte%205" title="Read It Later" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/read_it_later.png" width="16" height="16" alt="Read It Later"/></a><a class="a2a_button_email" href="http://www.addtoany.com/add_to/email?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F15%2Fintroducao-incompleta-ao-unixshell-parte-5%2F&amp;linkname=Introdu%C3%A7%C3%A3o%20%28incompleta%29%20ao%20Unix%2FShell%20parte%205" title="Email" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/email.png" width="16" height="16" alt="Email"/></a><a class="a2a_button_evernote" href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F15%2Fintroducao-incompleta-ao-unixshell-parte-5%2F&amp;linkname=Introdu%C3%A7%C3%A3o%20%28incompleta%29%20ao%20Unix%2FShell%20parte%205" title="Evernote" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a><a class="a2a_button_instapaper" href="http://www.addtoany.com/add_to/instapaper?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F15%2Fintroducao-incompleta-ao-unixshell-parte-5%2F&amp;linkname=Introdu%C3%A7%C3%A3o%20%28incompleta%29%20ao%20Unix%2FShell%20parte%205" title="Instapaper" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/instapaper.png" width="16" height="16" alt="Instapaper"/></a><a class="a2a_button_dihitt" href="http://www.addtoany.com/add_to/dihitt?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F15%2Fintroducao-incompleta-ao-unixshell-parte-5%2F&amp;linkname=Introdu%C3%A7%C3%A3o%20%28incompleta%29%20ao%20Unix%2FShell%20parte%205" title="diHITT" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/dihitt.png" width="16" height="16" alt="diHITT"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F15%2Fintroducao-incompleta-ao-unixshell-parte-5%2F&amp;linkname=Introdu%C3%A7%C3%A3o%20%28incompleta%29%20ao%20Unix%2FShell%20parte%205" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F15%2Fintroducao-incompleta-ao-unixshell-parte-5%2F&amp;linkname=Introdu%C3%A7%C3%A3o%20%28incompleta%29%20ao%20Unix%2FShell%20parte%205" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.triveos.com.br/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.triveos.com.br%2F2010%2F12%2F15%2Fintroducao-incompleta-ao-unixshell-parte-5%2F&amp;title=Introdu%C3%A7%C3%A3o%20%28incompleta%29%20ao%20Unix%2FShell%20parte%205" id="wpa2a_20">Compartilhar/Favoritos</a></p><blockquote class="ad">
A <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos</a> é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse <em>know-how</em> no uso de Python e Django criamos o <a href="http://www.triveos.com.br/curso-de-python-e-django/">Curso de Desenvolvimento Web com Python e Django</a> nas modalidades <em>in-company</em> e <a href="http://www.ludeos.com.br/store/triveos-cursos-online/" title="Curso Online de Desenvolvimento Web com Python e Django">online</a>.
</blockquote>

<hr />

<p>Copyright © 2010, <a href="http://www.triveos.com.br" title="Cursos e Sistemas Web com Python e Django">Triveos Tecnologia Ltda.</a><br /><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/br/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/br/80x15.png" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.triveos.com.br/2010/12/15/introducao-incompleta-ao-unixshell-parte-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

