<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xmlns="http://www.w3.org/2005/Atom">

	<title>Planeta PythonBrasil</title>
	<link rel="self" href="http://www.python.org.br/planet/atom.xml"/>
	<link href="http://www.python.org.br/planet/"/>
	<id>http://www.python.org.br/planet/atom.xml</id>
	<updated>2010-03-22T13:44:41+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry>
		<title type="html">Converting C code to Python</title>
		<link href="http://feedproxy.google.com/~r/PythonInScience/~3/Jq55F8NGQyI/converting-c-code-to-python.html"/>
		<id>tag:blogger.com,1999:blog-840127493134277990.post-3861924588211793226</id>
		<updated>2010-03-18T12:37:55+00:00</updated>
		<content type="html">This may sound like a weird thing to do, but actually, I have craved for something like that every time I have to read C code. Converting C code to Python, can not only help us understand code more easily, but also turn non perfomance-critical code easier to maintain. C can be easy enough to read if well-written and formatted (indented) adequately, however having to move back and forth between .h</content>
		<author>
			<name>Flavio Coelho</name>
			<email>noreply@blogger.com</email>
			<uri>http://pyinsci.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Python in Science</title>
			<subtitle type="html">Scientific adventures with Python.</subtitle>
			<link rel="self" href="http://pyinsci.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-840127493134277990</id>
			<updated>2010-03-22T11:44:21+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Javascript Testing and Browser Speed</title>
		<link href="http://blog.sidneidasilva.com/2010/03/17/javascript-testing-and-browser-speed/"/>
		<id>http://blog.sidneidasilva.com/?p=320</id>
		<updated>2010-03-18T02:30:20+00:00</updated>
		<content type="html">&lt;p&gt;Just a quick post to get me started at blogging again.&lt;/p&gt;
&lt;p&gt;Over the last year (wow, time flies by!) I&amp;#8217;ve been working at Canonical, as part of the Landscape team. This is a very diverse team with lots of different skills, and somehow I found myself naturally gravitating towards working more closely on frontend-related issues, of which I could highlight writing YUI3 widgets, speeding up page loading experience and creating a nice testing infrastructure. There&amp;#8217;s a ton of things I could write about that, and I really plan to. But today&amp;#8217;s entry will be pretty short.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-320&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;As part of a brain-break task I fixed some of our Javascript tests today so that they would run on Google Chrome. We haven&amp;#8217;t been targeting Chrome so far, but that might change soon, driven by Google Analytics stats of people using Landscape.&lt;/p&gt;
&lt;p&gt;But, the thing that really caught my attention was the difference in speed between Chrome and Firefox. &lt;/p&gt;
&lt;p&gt;For comparison:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Google Chrome 5.0.307.7 beta&lt;/b&gt;&lt;/p&gt;
&lt;pre&gt;
$ BROWSER=google-chrome ./bin/test -1vpc --layer=JsTestDriverLayer
Running tests at level 1
Running canonical.testing.javascript.JsTestDriverLayer tests:
Set up canonical.testing.javascript.JsTestDriverLayer in 1.020 seconds.
Running:

Ran 318 tests with 0 failures and 0 errors in 9.545 seconds.
Tearing down left over layers:
Tear down canonical.testing.javascript.JsTestDriverLayer in 0.366 seconds.
&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Firefox 3.6.3pre&lt;/b&gt;&lt;/p&gt;
&lt;pre&gt;
$ BROWSER=firefox ./bin/test -1vpc --layer=JsTestDriverLayer
Running tests at level 1
Running canonical.testing.javascript.JsTestDriverLayer tests:
  Set up canonical.testing.javascript.JsTestDriverLayer in 1.014 seconds.
  Running:

  Ran 318 tests with 0 failures and 0 errors in 15.032 seconds.
Tearing down left over layers:
  Tear down canonical.testing.javascript.JsTestDriverLayer in 0.349 seconds.
&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Firefox 3.7a3pre&lt;/b&gt;&lt;/p&gt;
&lt;pre&gt;
$ BROWSER=firefox-3.7 ./bin/test -1vpc --layer=JsTestDriverLayer
Running tests at level 1
Running canonical.testing.javascript.JsTestDriverLayer tests:
  Set up canonical.testing.javascript.JsTestDriverLayer in 0.804 seconds.
  Running:

  Ran 318 tests with 0 failures and 0 errors in 13.433 seconds.
Tearing down left over layers:
  Tear down canonical.testing.javascript.JsTestDriverLayer in 0.379 seconds.
&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Disclaimer&lt;/b&gt;: Both instances of Firefox were started with the &amp;#8220;-safe-mode&amp;#8221; flag, which disables all plugins and extensions. Also, as they say around here at Canonical: NOT A METRIC. But interesting still.&lt;/p&gt;
&lt;p&gt;If you look closely at this post you might find some hints about things we&amp;#8217;ve been working on and which I hope to write about, in addition to general tips and tricks about page speed optimization from experiences in both Landscape and Launchpad.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/omsg.wordpress.com/320/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/omsg.wordpress.com/320/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/omsg.wordpress.com/320/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/omsg.wordpress.com/320/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/omsg.wordpress.com/320/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/omsg.wordpress.com/320/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/omsg.wordpress.com/320/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/omsg.wordpress.com/320/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/omsg.wordpress.com/320/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/omsg.wordpress.com/320/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=blog.sidneidasilva.com&amp;blog=232351&amp;post=320&amp;subd=omsg&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>Sidnei da Silva</name>
			<uri>http://blog.sidneidasilva.com</uri>
		</author>
		<source>
			<title type="html">blog.sidneidasilva.com</title>
			<link rel="self" href="http://blog.sidneidasilva.com/feed/atom/"/>
			<id>http://blog.sidneidasilva.com/feed/atom/</id>
			<updated>2010-03-18T03:44:03+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Como Instalar MongoDB no Ubuntu (para iniciantes)</title>
		<link href="http://pycappuccino.blogspot.com/2010/03/como-instalar-mongodb-no-ubuntu-para.html"/>
		<id>tag:blogger.com,1999:blog-3425970146544581445.post-8864225165000597053</id>
		<updated>2010-03-17T22:41:37+00:00</updated>
		<content type="html">Nem acredito que quebrei a cabe&#231;a olhando &quot;how-to&quot; por a&#237;. N&#227;o &#233; preciso, tem um pacote apt-get. &#201; f&#225;cil.&lt;br /&gt;&lt;br /&gt;$ &amp;nbsp;sudo gedit&amp;nbsp;/etc/apt/sources.list&lt;br /&gt;&lt;br /&gt;Aberto o arquivo, acrescente a seguinte linha (para Ubuntu 9.10):&lt;br /&gt;deb http://downloads.mongodb.org/distros/ubuntu 9.10 10gen&lt;br /&gt;&lt;br /&gt;Se o seu Ubuntu &#233; de outra vers&#227;o substitua o &quot;9.10&quot; por &quot;9.4&quot; ou por &quot;10.4&quot;&lt;br /&gt;&lt;br /&gt;Agora:&lt;br /&gt;&lt;br /&gt;$ &amp;nbsp;sudo apt-get update&lt;br /&gt;$ &amp;nbsp;sudo apt-get install mongodb-stable&lt;br /&gt;&lt;br /&gt;Pronto!&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;INSTALANDO O PYMONGO&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Primeiro, instale o setuptools caso j&#225; n&#227;o tenha:&lt;br /&gt;&lt;br /&gt;$ sudo apt-get install python-setuptools&lt;br /&gt;&lt;br /&gt;Depois:&lt;br /&gt;&lt;br /&gt;$ &amp;nbsp;sudo easy_install pymongo&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ATUALIZA&#199;&#195;O&lt;/b&gt; (17/03/10): Alterado a forma de instalar pelo &quot;apt-get&quot;. Desde de 5 de mar&#231;o n&#227;o &#233; mais v&#225;lido o pacote por nome &quot;mongodb&quot;. &#201; preciso escolher entre &quot;mongodb-stable&quot;, &quot;mongodb-unstable&quot; e &quot;mongodb-snapshot&quot; -- respectivamente o pacote est&#225;vel, n&#227;o-est&#225;vel e o &#250;ltimo git efetivado ao tempo da constru&#231;&#227;o do pacote.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3425970146544581445-8864225165000597053?l=pycappuccino.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Eduardo Willians</name>
			<email>noreply@blogger.com</email>
			<uri>http://pycappuccino.blogspot.com/search/label/python</uri>
		</author>
		<source>
			<title type="html">PyCappuccino</title>
			<subtitle type="html">Python, Ubuntu &amp;amp; Cia da perspectiva de um jurista</subtitle>
			<link rel="self" href="http://pycappuccino.blogspot.com/feeds/posts/default/-/python"/>
			<id>tag:blogger.com,1999:blog-3425970146544581445</id>
			<updated>2010-03-22T11:44:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">O Linux tamb&#233;m fala</title>
		<link href="http://feedproxy.google.com/~r/Fechatag/~3/57bzVAAljbA/"/>
		<id>http://blog.elcio.com.br/o-linux-tambem-fala/</id>
		<updated>2010-03-17T16:54:18+00:00</updated>
		<content type="html">&lt;p&gt;H&#225; um tempo eu &lt;a href=&quot;http://blog.elcio.com.br/se-meu-fusca-falasse/&quot;&gt;ensinei aqui como fazer o Mac falar&lt;/a&gt;. O Linux tamb&#233;m faz. Instala a&#237;:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;prettyprint&quot;&gt;$ sudo apt-get install espeak&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Da&#237; &#233; s&#243; mandar:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;prettyprint&quot;&gt;$ espeak &quot;Luke, I am your father.&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;E fala portugu&#234;s tamb&#233;m:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;prettyprint&quot;&gt;$ espeak -v pt &quot;Luke, eu sou seu pai.&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Com -f arquivo.txt, ele l&#234; o texto de um arquivo. Com -w arquivo.wav, ele salva o &#225;udio num arquivo. E pode ser comandado via ssh.&lt;/p&gt;
&lt;p&gt;Consegue imaginar utilidades para isso?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/OqAzof3qcIK3ROJlMUHOiBc_zfQ/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/OqAzof3qcIK3ROJlMUHOiBc_zfQ/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/OqAzof3qcIK3ROJlMUHOiBc_zfQ/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/OqAzof3qcIK3ROJlMUHOiBc_zfQ/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/Fechatag?a=57bzVAAljbA:LUxQKG8UVjs:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Fechatag?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Fechatag?a=57bzVAAljbA:LUxQKG8UVjs:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Fechatag?i=57bzVAAljbA:LUxQKG8UVjs:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Elcio Luiz Ferreira</name>
			<uri>http://blog.elcio.com.br</uri>
		</author>
		<source>
			<title type="html">fechaTag</title>
			<subtitle type="html">XML, XHTML, CSS, Tableless, Desenvolvimento Web, Python, Linux</subtitle>
			<link rel="self" href="http://blog.elcio.com.br/tag/programacao/feed/"/>
			<id>http://blog.elcio.com.br/tag/programacao/feed/</id>
			<updated>2010-03-17T17:44:18+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Boas pr&#225;ticas para um desenvolvedor Django - Parte1 - Evite Hardcodes!</title>
		<link href="http://blog.mdpetry.net/2010/03/boas-praticas-para-um-desenvolvedor.html"/>
		<id>tag:blogger.com,1999:blog-1819324405537779447.post-4542490279901470821</id>
		<updated>2010-03-16T23:31:14+00:00</updated>
		<content type="html">H&#225; um tempo atr&#225;s vi um post em um blog que dava algumas dicas para desenvolvedores Django iniciantes, bom a&#237; vai a minha vers&#227;o, em portugu&#234;s, e com alguns coment&#225;rios que acho interessantes.&lt;br /&gt;&lt;br /&gt;Os posts est&#227;o ficando bem maiores do que eu imaginei, vou publica-los em partes, para iniciar s&#233;rie, a primeira parte:&lt;div&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;b&gt;Evite hardcodes&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Primeiramente, se voc&#234; n&#227;o sabe o que &#233; hardcode,&lt;a href=&quot;http://en.wikipedia.org/wiki/Hardcode&quot;&gt; clique aqui&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;b&gt;Hardcode no settings.py&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&#201; bem comum ver no c&#243;digo especialmente nas vari&#225;veis dos settings MEDIA_ROOT e TEMPLATE_DIRS utilizar o caminho absoluto de um diret&#243;rio do sistema.&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;br /&gt;TEMPLATE_DIRS = ( &quot;/home/html/project/templates&quot;,)&lt;br /&gt;MEDIA_ROOT = &quot;/home/html/project/appmedia/&quot;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Esse tipo de pr&#225;tica dificulta a manuten&#231;&#227;o do sistema, especialmente quando o projeto est&#225; sendo migrado de um servidor para outro, ou simplesmente passando o projeto da m&#225;quina de desenvolvimento para a produ&#231;&#227;o, sempre que uma mudan&#231;a dessas &#233; feita, &#233; necess&#225;rio alterar o conte&#250;do destas vari&#225;veis.&lt;br /&gt;&lt;br /&gt;O ideal &#233;, atrav&#233;s do m&#233;todo os.path.realpath, pegar o endere&#231;o absoluto do arquivo settings.py, e a partir deste valor, incluir os endere&#231;os necess&#225;rios, como &#233; visto abaixo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import os&lt;br /&gt;SITE_ROOT = os.path.realpath(os.path.dirname(__file__))&lt;br /&gt;MEDIA_ROOT = os.path.join(SITE_ROOT, 'appmedia')&lt;br /&gt;TEMPLATE_DIRS = ( os.path.join(SITE_ROOT, 'templates'),)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;b&gt;Hardcode em templates&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Nos templates, tamb&#233;m &#233; poss&#237;vel ver hardcodes nos caminhos de links, imagens, javascript e css.&lt;br /&gt;Embora seja muito tentador (pois &#233; mais r&#225;pido) utilizar este caminho, &#233; bem melhor voc&#234; utilizar a vari&#225;vel MEDIA_URL que foi declarada no settings.py, dentro do seu template. Como fazer isso? Adicione um &lt;a href=&quot;http://docs.djangoproject.com/en/dev/ref/templates/api/#id1&quot;&gt;context processor&lt;/a&gt;!&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;TEMPLATE_CONTEXT_PROCESSORS = ('django.core.context_processors.request',&lt;br /&gt;&quot;django.core.context_processors.auth&quot;,&lt;br /&gt;&quot;django.core.context_processors.debug&quot;,&lt;br /&gt;&quot;django.core.context_processors.i18n&quot;,&lt;br /&gt;&quot;django.core.context_processors.media&quot;&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Os Context processors, falando a grosso modo, adicionam itens dentro dos templates. Como visto acima, o Django possui uma s&#233;rie de processors, para as mais variadas funcionalidades (autentica&#231;&#227;o, debug, internacionaliza&#231;&#227;o, etc...)&lt;br /&gt;O context processor &lt;i&gt;django.core.context_processors.media&lt;/i&gt; adiciona uma vari&#225;vel nos templates chamada MEDIA_URL, ela possui o caminho especificado na constante MEDIA_URL do settings.py, dessa forma ao inv&#233;s de chamar um css assim:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;img src=&quot;/site/midia/imagens/logo.jpg&quot; /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;voc&#234; chama assim:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;img src=&quot;{{MEDIA_URL}}imagens/logo.jpg&quot; /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Fica mais bonito? Talvez n&#227;o, mas vai facilitar a sua manuten&#231;&#227;o! Isso vai :)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Hardcode em links&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Vamos direto a um exemplo mais pr&#225;tico:&lt;br /&gt;Digamos que voc&#234; tem uma aplica&#231;&#227;o que exibe os seus produtos:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;from django.conf.urls.defaults import *&lt;br /&gt;urlpatterns = patterns('produtos.views',&lt;br /&gt;   (r'^$', 'inicio',),&lt;br /&gt;   (r'^cadastro/$', 'cadastro'),&lt;br /&gt;   (r'^(?P\d+)/$', 'detalhe'),&lt;br /&gt;   (r'^(?P\d+)/comprar/$', 'comprar'),&lt;br /&gt;   (r'^carrinho/$', 'carrinho'),&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;At&#233; a vers&#227;o 1.0 do Django o modo de exibir estas urls &#233; colocando o endere&#231;o absoluto dela direto no template, algo como:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;a href=&quot;/produtos/&quot;&amp;gt;Lista&amp;lt;/a&amp;gt; - &amp;lt;a href=&quot;/produtos/cadastro&quot;&amp;gt;Novo&amp;lt;/a&amp;gt; - &amp;lt;a href=&quot;/carrinho/&quot;&amp;gt;Carrinho de compras&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;ul&amp;gt;{%for p in produtos%}&lt;br /&gt;&amp;lt;li&amp;gt;&amp;lt;a href=&quot;/produtos/{{p.id}}/&quot;&amp;gt;{{p.nome}}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;{%endfor%} &amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Mas, e se por algum motivo, a se&#231;&#227;o de produto n&#227;o estiver em /produtos/ e sim em um outro endere&#231;o qualquer? Teremos que alterar &quot;no bra&#231;o&quot; qualquer vest&#237;gio nos templates, caso contr&#225;rio, enviaremos um erro 404 para o usu&#225;rio!&lt;br /&gt;&lt;br /&gt;Ainda bem, que ap&#243;s a vers&#227;o 1.0 do Django possu&#237;mos urls nomeadas! dessa forma podemos construir nossas urls da seguinte maneira:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;from django.conf.urls.defaults import *&lt;br /&gt;urlpatterns = patterns('produtos.views',&lt;br /&gt;   url(r'^$', 'inicio', name='produto-home'),&lt;br /&gt;   url(r'^cadastro/$', 'cadastro', name='produto-novo'),&lt;br /&gt;   url(r'^(?P\d+)/$', 'detalhe', name='produto-exibe'),&lt;br /&gt;   url(r'^(?P\d+)/comprar/$', 'comprar', name='produto-compra'),&lt;br /&gt;   url(r'^carrinho/$', 'carrinho', name='produto-carrinho'),&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Reparem que n&#227;o possu&#237;mos mais uma tupla normal, e tamb&#233;m foi adicionado um atributo &lt;i&gt;&quot;name&quot;&lt;/i&gt; em cada url, cujo objetivo tem justamente nomear as urls, possu&#237;mos tamb&#233;m uma templatetag chamada &lt;i&gt;&quot;url&quot;&lt;/i&gt;, que serve para pegar dinamicamente a nossa url &lt;i&gt;{%url nome-da-nossa-url%}.&lt;/i&gt; Com este recurso, podemos construir nosso template da seguinte forma:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;a href=&quot;{%url produto-home %}&quot;&amp;gt;Lista&amp;lt;/a&amp;gt; - &amp;lt;a href=&quot;{%url produto-novo %}&quot;&amp;gt;Novo&amp;lt;/a&amp;gt; - &amp;lt;a href=&quot;{%url produto-carrinho%}&quot;&amp;gt;Carrinho de compras&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;{%for p in produtos%}&lt;br /&gt;&amp;lt;li&amp;gt;&amp;lt;a href=&quot;{%url produto-exibe p.id %}&quot;&amp;gt;{{p.nome}}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;{%endfor%} &amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Tamb&#233;m podemos enviar par&#226;metros para a templatetag url, que foi o que fizemos para a listagem dos produtos. Para mais recursos sobre url nomeadas, acesse a &lt;a href=&quot;http://docs.djangoproject.com/en/dev/topics/http/urls/#id2&quot;&gt;documenta&#231;&#227;o&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;B&#244;nus: O M&#233;todo get_absolute_url&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;No exemplo acima, vimos como listar objetos utilizando a tempaltetag url e passando o id do objeto por par&#226;metro, no entanto, esta n&#227;o &#233; uma das melhores pr&#225;ticas, o ideal seria voc&#234; acrecentar o m&#233;todo &lt;i&gt;get_absolute_url &lt;/i&gt;dentro da classe do seu model, como visto abaixo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Receita(models.Model):&lt;br /&gt;   data_publicacao = models.DateTimeField(auto_now_add=True)&lt;br /&gt;   nome = models.CharField(max_length=100)&lt;br /&gt;   categoria = models.ForeignKey(Categoria, null=True)&lt;br /&gt;   destaque = models.BooleanField(u&quot;Destaque?&quot;)&lt;br /&gt;   class Meta:&lt;br /&gt;       ordering = ['-data_publicacao']&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;        get_latest_by = 'data_publicacao'&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;    def __unicode__(self):&lt;br /&gt;       return self.nome&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;    def get_absolute_url(self):&lt;br /&gt;       return reverse('produto-exibe', args=[self.id])&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;O m&#233;todo get_absolute_url retorna a url absoluta do objeto atrav&#233;s da fun&#231;&#227;o reverse, que possui a mesma fun&#231;&#227;o da templatetag &quot;url&quot;. Assim podemo listar os objetos de forma um pouco mais elegante:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;{%for p in produtos%}&lt;br /&gt;&amp;lt;li&amp;gt;&amp;lt;a href=&quot;{{p.get_absolute_url}}/&quot;&amp;gt;{{p.nome}}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;{%endfor%}&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;N&#227;o &#233; regra termos o m&#233;todo get_absolute_url, voc&#234; pode criar qualquer outro m&#233;todo que fa&#231;a a mesma fun&#231;&#227;o, mas o m&#233;todo get_absolute_url, &#233; necess&#225;rio para exibirmos no admin, um link para o objeto, como visto abaixo:&lt;br /&gt;&lt;a href=&quot;http://2.bp.blogspot.com/_JnDy_ajfcwY/S5_HxWYX2FI/AAAAAAAACLI/rV7sMYqcrgM/s1600-h/aaaaaaaaaaaaaa.png&quot;&gt;&lt;img src=&quot;http://2.bp.blogspot.com/_JnDy_ajfcwY/S5_HxWYX2FI/AAAAAAAACLI/rV7sMYqcrgM/s200/aaaaaaaaaaaaaa.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5449293724776912978&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1819324405537779447-4542490279901470821?l=blog.mdpetry.net&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Marcos Daniel Petry</name>
			<email>marcospetry@gmail.com</email>
			<uri>http://blog.mdpetry.net/search/label/python</uri>
		</author>
		<source>
			<title type="html">Blog do Petry</title>
			<subtitle type="html">Python, Django, Software Livre, e outras coisas que eu achar importantes =)</subtitle>
			<link rel="self" href="http://blog.mdpetry.net/feeds/posts/default/-/python"/>
			<id>tag:blogger.com,1999:blog-1819324405537779447</id>
			<updated>2010-03-21T01:44:24+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Enlightenment meets BlueZ</title>
		<link href="http://feedproxy.google.com/~r/GustavoSverzutBarbieri/~3/ot9QqPfhGRo/"/>
		<id>http://blog.gustavobarbieri.com.br/?p=209</id>
		<updated>2010-03-12T23:27:42+00:00</updated>
		<content type="html">&lt;p&gt;In the past weeks &lt;a href=&quot;http://profusion.mobi&quot;&gt;ProFUSION&lt;/a&gt; coworker &lt;a href=&quot;http://padovan.org/blog/&quot;&gt;Gustavo Padovan&lt;/a&gt; was hacking on bluetooth support for &lt;a href=&quot;http://www.enlightenment.org&quot;&gt;Enlightenment&lt;/a&gt; ecosystem using the &lt;a href=&quot;http://www.bluez.org/&quot;&gt;BlueZ&lt;/a&gt; stack.&lt;/p&gt;
&lt;div&gt;
&lt;img src=&quot;http://blog.gustavobarbieri.com.br/wp-content/uploads/2010/03/ebluez-powered-discoverable.png&quot; alt=&quot;Enlightenment powered and discoverable Bluetooth adaptor.&quot; title=&quot;Enlightenment powered and discoverable Bluetooth adaptor.&quot; /&gt;
&lt;/div&gt;
&lt;p&gt;This module follows my previous &lt;a href=&quot;http://feeds.feedburner.com/2010/01/02/enlightenment-meets-connman/&quot;&gt;ConnMan&lt;/a&gt; module and is built upon the same base. Since BlueZ and ConnMan are both developed by almost the same developer group, the DBus APIs are very similar. The current module is quite simple, yet useful and allows pairing devices. The idea is to further extend it to be a full Bluetooth Agent, allowing different authentication and authorization methods, maybe go even further and send files using the OBEX protocol.&lt;/p&gt;
&lt;div&gt;
&lt;img src=&quot;http://blog.gustavobarbieri.com.br/wp-content/uploads/2010/03/ebluez-powered-hidden.png&quot; alt=&quot;Enlightenment powered but hidden Bluetooth adaptor.&quot; title=&quot;Enlightenment powered but hidden Bluetooth adaptor.&quot; /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;img src=&quot;http://blog.gustavobarbieri.com.br/wp-content/uploads/2010/03/ebluez-popup.png&quot; alt=&quot;Enlightenment popup menu with discovered devices.&quot; title=&quot;Enlightenment popup menu with discovered devices.&quot; /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;img src=&quot;http://blog.gustavobarbieri.com.br/wp-content/uploads/2010/03/ebluez-controls.png&quot; alt=&quot;Enlightenment bluetooth adapter controls.&quot; title=&quot;Enlightenment bluetooth adapter controls.&quot; /&gt;
&lt;/div&gt;
&lt;p&gt;The infrastructure is available as &lt;code&gt;ebluez&lt;/code&gt; inside &lt;code&gt;e_dbus&lt;/code&gt;, so it is easily accessible to all EFL applications. The infrastructure exposes just a handful methods that were required by the module, but it is easily extensible as most methods are similar and the helpers do most of work, just need to specify the method names and convert types.&lt;/p&gt;
&lt;p&gt;ProFUSION is also working on &lt;a href=&quot;http://ofono.org/&quot;&gt;oFono&lt;/a&gt; support. Stay tuned to see the module &lt;a href=&quot;http://jprvita.wordpress.com/&quot;&gt;Jo&#227;o Paulo&lt;/a&gt; is cooking, the &lt;code&gt;e_dbus&lt;/code&gt; code is already in SVN.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/GustavoSverzutBarbieri/~4/ot9QqPfhGRo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Gustavo Barbieri</name>
			<uri>http://blog.gustavobarbieri.com.br</uri>
		</author>
		<source>
			<title type="html">Gustavo Sverzut Barbieri</title>
			<subtitle type="html">a hacker analysis of life</subtitle>
			<link rel="self" href="http://blog.gustavobarbieri.com.br/feed/atom/"/>
			<id>http://blog.gustavobarbieri.com.br/feed/atom/</id>
			<updated>2010-03-12T23:44:21+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">(Orienta&#231;&#227;o a Objetos).cr&#237;tica_sobre( )</title>
		<link href="http://pycappuccino.blogspot.com/2010/03/orientacao-objetoscriticasobre.html"/>
		<id>tag:blogger.com,1999:blog-3425970146544581445.post-8759515552099502364</id>
		<updated>2010-03-11T13:48:48+00:00</updated>
		<content type="html">O que chamamos de objetos&amp;nbsp;&lt;u&gt;n&#227;o&lt;/u&gt; podem ser considerados objetos na concep&#231;&#227;o humana, mas apenas na concep&#231;&#227;o da pr&#243;pria disciplina de programa&#231;&#227;o.&lt;br /&gt;&lt;br /&gt;Ali&#225;s, lembro que tive certa dificuldade no princ&#237;pio de compreender o que era a tal iluminada OO porque se nos apresentavam uma explica&#231;&#227;o segundo a qual a OO se aproximava da concep&#231;&#227;o humana a respeito de objetos -- premissa que hoje considero parcialmente falsa.&lt;br /&gt;&lt;br /&gt;Digamos que eu tivesse ganhado um caderno, mas n&#227;o soubesse o que &#233;. Ent&#227;o pegaria aquele caderno, e analisando ele como objeto, diria &#224; pessoa que me presenteou:&amp;nbsp;&quot;legal, mas o que eu fa&#231;o com isso?&quot;&lt;br /&gt;&lt;br /&gt;Intuitivamente procuramos alguma coisa para fazer com um caderno, ou, procuramos saber para que ele serve. Todavia, assim concebendo &lt;u&gt;n&#227;o&lt;/u&gt;&amp;nbsp;se pode afirmar que os n&#250;meros&amp;nbsp;seriam objetos no sentido da OO, vez que eles &lt;u&gt;n&#227;o&lt;/u&gt; fazem nada, e sim quem o faria seria o engenheiro que usa de procedimentos matem&#225;ticos para com os n&#250;meros.&lt;br /&gt;&lt;br /&gt;Note a discrep&#226;ncia. A classe &#233; &quot;Matem&#225;tica&quot;, o procedimento &#233; &quot;soma&quot;, e os instrumentos: os n&#250;meros. Quando muito poder&#237;amos asseverar que os n&#250;meros s&#227;o o objeto da classe matem&#225;tica, o que &lt;u&gt;nunca&lt;/u&gt;&amp;nbsp;implicaria entender que invocar&#237;amos a fun&#231;&#227;o &quot;soma&quot; para um n&#250;mero, ao contr&#225;rio, o par&#226;metro n&#250;mero &#233; que &#233; passado para o procedimento &quot;soma&quot;, a l&#243;gica &#233; inversa &#224; da OO.&lt;br /&gt;&lt;br /&gt;O &#250;nico fato da OO que se assemelha ao pensamento humano &#233; a exist&#234;ncia de atributos ligados a um objeto. Nesse aspecto, um caderno pode ser verde, pequeno, etc.&lt;br /&gt;&lt;br /&gt;Sucede que atributos &lt;u&gt;n&#227;o&lt;/u&gt; podem ser fun&#231;&#245;es de um caderno, pois ningu&#233;m que toma o caderno nas m&#227;os requer dele que proceda &#224; sua fun&#231;&#227;o &quot;escrever&quot;, sen&#227;o usando o procedimento &quot;escrever&quot; passa-lhe um &quot;caderno&quot;.&lt;br /&gt;&lt;br /&gt;De modo que n&#227;o &#233; o paradigma OO que &#233; intuitivo, mas sim o procedural, raz&#227;o at&#233; pela qual um iniciante costuma ter mais facilidade em lidar com fun&#231;&#245;es que com classes e m&#233;todos.&lt;br /&gt;&lt;br /&gt;A grande id&#233;ia da OO &#233; atar a um objeto tudo o que se pode obter dele: desde seus atributos at&#233; os procedimentos aplic&#225;veis a ele. &#201; como se um objeto j&#225; soubesse o que ele tem, o que ele pode fazer e quais as suas fun&#231;&#245;es. Observe-se, contudo, que saber o que &#233;, o que tem e o que pode fazer &#233; muito mais a caracter&#237;stica de um ente consciente que a de um objeto.&lt;br /&gt;&lt;br /&gt;Com efeito, seria mais coerente descrever a OO como a orienta&#231;&#227;o a &quot;entes conscientes&quot;, j&#225; que est&#227;o cientes de seus atributos e de suas fun&#231;&#245;es.&lt;br /&gt;&lt;br /&gt;N&#227;o obstante, o paradigma OO representou um grande avan&#231;o na programa&#231;&#227;o, porque realizou que dentro de um universo bastante limitado de possibilidades &#233; mais f&#225;cil atrelar atributos e m&#233;todos a um ente consciente do que tentar atrelar objetos a centenas de rotinas inconscientes.&lt;br /&gt;&lt;br /&gt;Assim, nos parece mais desej&#225;vel que, p.ex., em Python a fun&#231;&#227;o &quot;max( )&quot; fosse um m&#233;todo, pois embora intuitivamente se use primeiro o procedimento max( ) e depois o objeto &quot;list&quot;, seria mais simples verificar que um objeto &quot;list&quot; det&#233;m a fun&#231;&#227;o &quot;max( )&quot;, mesmo que &quot;max( )&quot; fosse o mesmo nome para fun&#231;&#245;es semelhantes ligadas a &quot;str&quot; e a &quot;tuple&quot;.&lt;br /&gt;&lt;br /&gt;De outra lado, &lt;u&gt;n&#227;o&lt;/u&gt; nos parece razo&#225;vel exigir exclusivamente o uso do paradigma OO. Ele deve ser preponderante, no entanto haver&#225; ocasi&#245;es em que um conjunto de fun&#231;&#245;es ser&#225; mais funcional (por assim dizer), da&#237; uma ampla vantagem de Python que permite o multi-paradigma, mas isso j&#225; &#233; outra conversa.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3425970146544581445-8759515552099502364?l=pycappuccino.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Eduardo Willians</name>
			<email>noreply@blogger.com</email>
			<uri>http://pycappuccino.blogspot.com/search/label/python</uri>
		</author>
		<source>
			<title type="html">PyCappuccino</title>
			<subtitle type="html">Python, Ubuntu &amp;amp; Cia da perspectiva de um jurista</subtitle>
			<link rel="self" href="http://pycappuccino.blogspot.com/feeds/posts/default/-/python"/>
			<id>tag:blogger.com,1999:blog-3425970146544581445</id>
			<updated>2010-03-22T11:44:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Contabilizar espa&#231;o usado em FTP usando Python</title>
		<link href="http://www.eltonminetto.net/contabilizar-espaco-usado-em-ftp-usando-python.htm"/>
		<id>http://www.eltonminetto.net/?p=412</id>
		<updated>2010-03-10T14:34:05+00:00</updated>
		<content type="html">&lt;p&gt;Aqui na &lt;a href=&quot;http://www.drimio.com&quot; target=&quot;_blank&quot;&gt;empresa&lt;/a&gt; temos duas contas de FTP contratadas no nosso plano de hospedagem para usarmos como espa&#231;o de backup. As duas contas tem um espa&#231;o limitado e toda semana eu preciso monitorar quanto espa&#231;o estamos usando, para evitar erros no script de backup. Para facilitar esse controle eu criei um pequeno script Python para navegar em todas as pastas e me dizer quanto espa&#231;o estou usando. O script ficou assim:&lt;/p&gt;
&lt;div class=&quot;geshi no python&quot;&gt;
&lt;ol&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&lt;span class=&quot;kw1&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;kw3&quot;&gt;os&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&lt;span class=&quot;kw1&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;kw3&quot;&gt;ftplib&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;import&lt;/span&gt; FTP&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&lt;span class=&quot;kw1&quot;&gt;def&lt;/span&gt; pretty_filesize&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;bytes&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;:&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&amp;nbsp;&lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; bytes &lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;= &lt;span class=&quot;nu0&quot;&gt;1073741824&lt;/span&gt;:&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&amp;nbsp; &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;bytes / &lt;span class=&quot;nu0&quot;&gt;1024&lt;/span&gt; / &lt;span class=&quot;nu0&quot;&gt;1024&lt;/span&gt; / &lt;span class=&quot;nu0&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; + &lt;span class=&quot;st0&quot;&gt;' GB'&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&amp;nbsp;&lt;span class=&quot;kw1&quot;&gt;elif&lt;/span&gt; bytes &lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;= &lt;span class=&quot;nu0&quot;&gt;1048576&lt;/span&gt;:&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&amp;nbsp; &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;bytes / &lt;span class=&quot;nu0&quot;&gt;1024&lt;/span&gt; / &lt;span class=&quot;nu0&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; + &lt;span class=&quot;st0&quot;&gt;' MB'&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&amp;nbsp;&lt;span class=&quot;kw1&quot;&gt;elif&lt;/span&gt; bytes &lt;span class=&quot;sy0&quot;&gt;&amp;gt;&lt;/span&gt;= &lt;span class=&quot;nu0&quot;&gt;1024&lt;/span&gt;:&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&amp;nbsp; &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;bytes / &lt;span class=&quot;nu0&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; + &lt;span class=&quot;st0&quot;&gt;' KB'&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&amp;nbsp;&lt;span class=&quot;kw1&quot;&gt;elif&lt;/span&gt; bytes &lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1024&lt;/span&gt;:&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&amp;nbsp; &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;bytes&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; + &lt;span class=&quot;st0&quot;&gt;' bytes'&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;endereco_ftp = &lt;span class=&quot;st0&quot;&gt;'servidor'&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;usuario = &lt;span class=&quot;st0&quot;&gt;'usuario'&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;senha = &lt;span class=&quot;st0&quot;&gt;'senha'&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;conexao_ftp = FTP&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;endereco_ftp&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;conexao_ftp.&lt;span class=&quot;me1&quot;&gt;login&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;usuario,senha&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;diretorio_corrente = conexao_ftp.&lt;span class=&quot;kw3&quot;&gt;pwd&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;soma = &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&lt;span class=&quot;kw1&quot;&gt;for&lt;/span&gt; i &lt;span class=&quot;kw1&quot;&gt;in&lt;/span&gt; conexao_ftp.&lt;span class=&quot;me1&quot;&gt;nlst&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;:&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&amp;nbsp;conexao_ftp.&lt;span class=&quot;me1&quot;&gt;cwd&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;i&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&amp;nbsp;&lt;span class=&quot;kw1&quot;&gt;for&lt;/span&gt; j &lt;span class=&quot;kw1&quot;&gt;in&lt;/span&gt; conexao_ftp.&lt;span class=&quot;me1&quot;&gt;nlst&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;:&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&amp;nbsp; soma = soma + conexao_ftp.&lt;span class=&quot;me1&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;j&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&amp;nbsp;conexao_ftp.&lt;span class=&quot;me1&quot;&gt;cwd&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;'..'&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;
&lt;div class=&quot;de1&quot;&gt;&lt;span class=&quot;kw1&quot;&gt;print&lt;/span&gt; pretty_filesize&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;soma&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;Agora &#233; s&#243; colocar no crontab e receber diariamente o espa&#231;o utilizado.&lt;br /&gt;
Fontes:&lt;br /&gt;
&lt;a href=&quot;http://www.vivaolinux.com.br/script/navegador-ftp&quot; target=&quot;_blank&quot;&gt;http://www.vivaolinux.com.br/script/navegador-ftp&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://code.rivers.pro/python-function-to-convert-bytes-to-kbmbgb/&quot; target=&quot;_blank&quot;&gt;http://code.rivers.pro/python-function-to-convert-bytes-to-kbmbgb/&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Elton Lu&#237;s Minetto</name>
			<uri>http://www.eltonminetto.net</uri>
		</author>
		<source>
			<title type="html">elton lu&#237;s minetto &#187; python</title>
			<link rel="self" href="http://www.eltonminetto.net/category/python/feed"/>
			<id>http://www.eltonminetto.net/category/python/feed</id>
			<updated>2010-03-10T15:44:21+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Recovering a bootable EBS image</title>
		<link href="http://blog.labix.org/2010/03/09/recovering-a-bootable-ebs-image"/>
		<id>http://blog.labix.org/?p=250</id>
		<updated>2010-03-09T21:45:43+00:00</updated>
		<content type="html">&lt;p&gt;Scott Moser has &lt;a href=&quot;https://lists.ubuntu.com/archives/ubuntu-cloud/2010-March/000155.html&quot;&gt;just announced&lt;/a&gt; this week that the new Ubuntu images which boot out of an EBS-based root filesystem in EC2, and thus will persist across reboots, are available for testing.&lt;/p&gt;
&lt;p&gt;As usual with something that just left the oven and is explicitly labeled &lt;i&gt;for testing purposes&lt;/i&gt;, there was a minor bug in the first iteration of images which was even mentioned in the announcement itself.  The bug, if not worked around as specified in the announcement, will prevent the image from rebooting.&lt;/p&gt;
&lt;p&gt;Having an bootable EBS image which can&amp;#8217;t reboot is a quite interesting (and ironic) problem.  You have an image which persists, but suddenly you have no way to see what is inside the image anymore because you can&amp;#8217;t boot it.  Naturally, even if the said bug didn&amp;#8217;t exist in the first place, it&amp;#8217;s fairly easy to get into such a situation accidentally if you&amp;#8217;re fiddling with the image configuration.&lt;/p&gt;
&lt;p&gt;So, in this post we&amp;#8217;ll see how to recover from a situation where a bootable EBS image can&amp;#8217;t boot.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-250&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Getting started&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;To start this up, we&amp;#8217;ll boot one of the EBS images which Scott mentioned in his announcement: ami-8bec03e2.  As we see in the output of &lt;i&gt;ec2-describe-images&lt;/i&gt;, this is an EBS-based image for &lt;i&gt;i386&lt;/i&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
% ec2-describe-images ami-8bec03e2&lt;br /&gt;
IMAGE	ami-8bec03e2	099720109477/ebs/ubuntu-images-testing/ubuntu-lucid-daily-i386-server-20100305	099720109477	available	public		i386	machine	aki-3fdb3756			ebs&lt;br /&gt;
BLOCKDEVICEMAPPING	/dev/sda1		snap-f1efd098	15
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Let&amp;#8217;s run this image.  Remember to replace the value passed in the &lt;i&gt;-k&lt;/i&gt; command line option with your own key pair name.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
% ec2-run-instances -k gsg-keypair ami-8bec03e2&lt;br /&gt;
RESERVATION	r-9e4615f6	626886203892	default&lt;br /&gt;
INSTANCE	i-e3e33a88	ami-8bec03e2			pending	gsg-keypair	0		m1.small	2010-03-09T20:04:12+0000	us-east-1c	aki-3fdb3756			monitoring-disabled			ebs
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;There we go.  We got an instance allocated in the availability zone us-east-1c.  It&amp;#8217;s important to keep track of this information, since EBS volumes are zone-specific.&lt;/p&gt;
&lt;p&gt;As part of the above command, we must have been allocated an EBS volume automatically, and it should be attached to the instance we just started.  We can investigate it with the &lt;i&gt;ec2-describe-volumes&lt;/i&gt; command:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
% ec2-describe-volumes&lt;br /&gt;
VOLUME	vol-edca1684	15	snap-f1efd098	us-east-1c	in-use	2010-03-09T20:04:20+0000&lt;br /&gt;
ATTACHMENT	vol-edca1684	i-e3e33a88	/dev/sda1	attached	2010-03-09T20:04:24+0000
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Now, we&amp;#8217;ll get into the running instance and do some arbitrary modifications, just as a way to demonstrate that the data we don&amp;#8217;t want to lose actually survives the recovering operation. Note that the domain name is obtained with the &lt;i&gt;ec2-describe-instances&lt;/i&gt; command.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
% ssh -i ~/.ssh/id_dsa_gsg-keypair ubuntu@ec2-184-73-51-147.compute-1.amazonaws.com&lt;br /&gt;
(&amp;#8230;)&lt;/p&gt;
&lt;p&gt;ubuntu@domU-12-31-39-0E-A0-03:~$ echo &amp;#8220;Important data&amp;#8221; &gt; important-data&lt;br /&gt;
ubuntu@domU-12-31-39-0E-A0-03:~$ ls -l important-data&lt;br /&gt;
-rw-r&amp;#8211;r&amp;#8211; 1 ubuntu ubuntu 15 Mar  9 20:15 important-data&lt;/p&gt;
&lt;p&gt;ubuntu@domU-12-31-39-0E-A0-03:~$ sudo reboot&lt;br /&gt;
Broadcast message from ubuntu@domU-12-31-39-0E-A0-03&lt;br /&gt;
	(/dev/pts/0) at 20:18 &amp;#8230;&lt;br /&gt;
The system is going down for reboot NOW!
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Note that we didn&amp;#8217;t actually fix the problem reported by Scott, so our machine won&amp;#8217;t really reboot.  If we wait a while, we can even see that the problem is exactly what was reported in the announcement (note it really takes a bit for the output to be synced up):&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
% ec2-get-console-output i-e3e33a88 | tail -4&lt;br /&gt;
mount: special device ephemeral0 does not exist&lt;br /&gt;
mountall: mount /mnt [294] terminated with status 32&lt;br /&gt;
mountall: Filesystem could not be mounted: /mnt
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Alright, now what?  Machine is dead.. and can&amp;#8217;t reboot.  How do we get to our important data?&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Fixing the problem&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The first thing we do is to &lt;b&gt;stop&lt;/b&gt; the instance.  Do &lt;i&gt;not&lt;/i&gt; terminate it, or you&amp;#8217;ll lose the EBS volume!  After stopping it, we&amp;#8217;ll detach the EBS volume that was being used as the root filesystem, so that we can attach somewhere else.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
% ec2-stop-instances i-e3e33a88&lt;br /&gt;
INSTANCE	i-e3e33a88	running	stopping&lt;/p&gt;
&lt;p&gt;% ec2-detach-volume vol-edca1684&lt;br /&gt;
ATTACHMENT	vol-edca1684	i-e3e33a88	/dev/sda1	detaching	2010-03-09T20:04:22+0000
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Now, we need to attach this volume in an image which actually boots, so that we can fix it.  For this experiment, we&amp;#8217;ll pick one of the daily Lucid images, but we could use any other working image really.  Just remind that the image must be running in the same availability zone as our previous instance, since the EBS volume won&amp;#8217;t be accessible otherwise.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
% ec2-run-instances -k gsg-keypair -z us-east-1c ami-b5f619dc&lt;br /&gt;
RESERVATION	r-967427fe	626886203892	default&lt;br /&gt;
INSTANCE	i-fd08d196	ami-b5f619dc			pending	gsg-keypair	0		m1.small	2010-03-09T21:10:11+0000	us-east-1c	aki-3fdb3756			monitoring-disabled			instance-store		&lt;/p&gt;
&lt;p&gt;% ec2-attach-volume vol-edca1684 -i i-fd08d196 -d /dev/sdh1&lt;br /&gt;
ATTACHMENT	vol-edca1684	i-fd08d196	/dev/sdh1	attaching	2010-03-09T21:10:51+0000
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;With the instance running and the EBS root device attached with an alternative device name, we can then login to fix the original problem which prevented the image from booting correctly.  In our case, we&amp;#8217;ll simply do what Scott suggested in the announcement.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
% ssh -i ~/.ssh/id_dsa_gsg-keypair ubuntu@ec2-204-236-194-196.compute-1.amazonaws.com&lt;br /&gt;
(&amp;#8230;)&lt;br /&gt;
$ mkdir ebs-root&lt;br /&gt;
$ sudo mount /dev/sdh1 ebs-root&lt;br /&gt;
$ sudo sed -i &amp;#8217;s/^ephemeral0/#ephemeral0/&amp;#8217; ebs-root/etc/fstab&lt;br /&gt;
$ sudo umount ebs-root&lt;br /&gt;
$ logout&lt;br /&gt;
Connection to ec2-204-236-194-196.compute-1.amazonaws.com closed.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Done!  Our EBS volume is now correct, and it should boot alright.  We&amp;#8217;ll detach the volume from the temporary instance we created, and will reattach it back to the old bootable EBS instance which is stopped.  Note that we won&amp;#8217;t yet terminate the temporary instance, because we may need it in case something else is still wrong, and we are already paying to use it for the hour anyway.  We just have to remind ourselves to terminate it once we&amp;#8217;re fully done.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
% ec2-detach-volume vol-edca1684&lt;br /&gt;
ATTACHMENT	vol-edca1684	i-fd08d196	/dev/sdh1	detaching	2010-03-09T21:10:51+0000&lt;/p&gt;
&lt;p&gt;% ec2-attach-volume vol-edca1684 -i i-e3e33a88 -d /dev/sda1&lt;br /&gt;
ATTACHMENT	vol-edca1684	i-e3e33a88	/dev/sda1	attaching	2010-03-09T21:24:55+0000&lt;/p&gt;
&lt;p&gt;% ec2-describe-volumes vol-edca1684&lt;br /&gt;
VOLUME	vol-edca1684	15	snap-f1efd098	us-east-1c	in-use	2010-03-09T20:04:20+0000&lt;br /&gt;
ATTACHMENT	vol-edca1684	i-e3e33a88	/dev/sda1	attached	2010-03-09T21:24:55+0000
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Okay!  It should all be good now.  It&amp;#8217;s time to restart our instance, and see if it is working.  Note that since you stopped and started the instance, the public domain name most probably has changed, and thus we need to find it out again with &lt;i&gt;ec2-describe-instances&lt;/i&gt; once the instance is running.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
% ec2-start-instances i-e3e33a88&lt;br /&gt;
INSTANCE	i-e3e33a88	stopped	pending&lt;/p&gt;
&lt;p&gt;% ec2-describe-instances i-e3e33a88&lt;br /&gt;
RESERVATION	r-9e4615f6	626886203892	default&lt;br /&gt;
INSTANCE	i-e3e33a88	ami-8bec03e2	ec2-184-73-72-214.compute-1.amazonaws.com	domU-12-31-39-03-B8-21.compute-1.internal	running	gsg-keypair	0		m1.small	2010-03-09T21:28:43+0000	us-east-1c	aki-3fdb3756			monitoring-disabled	184.73.72.214	10.249.187.207			ebs&lt;br /&gt;
BLOCKDEVICE	/dev/sda1	vol-edca1684	2010-03-09T21:24:55.000Z	&lt;/p&gt;
&lt;p&gt;% ssh -i ~/.ssh/id_dsa_gsg-keypair ubuntu@ec2-184-73-72-214.compute-1.amazonaws.com&lt;br /&gt;
(&amp;#8230;)&lt;br /&gt;
$ cat important-data&lt;br /&gt;
Important data&lt;/p&gt;
&lt;p&gt;$ logout&lt;br /&gt;
Connection to ec2-184-73-72-214.compute-1.amazonaws.com closed.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;It worked, and our important data is still there!&lt;/p&gt;
&lt;p&gt;Don&amp;#8217;t forget to kill the temporary instance you&amp;#8217;ve used to fix it after you&amp;#8217;re comfortable with the result:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
% ec2-terminate-instances i-fd08d196&lt;br /&gt;
INSTANCE	i-fd08d196	running	shutting-down
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Concluding, in this post we have seen how to fix a bootable EBS machine which can&amp;#8217;t actually boot.  The technique consists of detaching the volume from the stopped instance, attaching it to a temporary instance, fixing the image, and then reattaching it back to the original image.  This back and forth of EBS volumes is quite useful in many circumstances, so keep it in your tool belt.&lt;/p&gt;</content>
		<author>
			<name>Gustavo Niemeyer</name>
			<uri>http://blog.labix.org</uri>
		</author>
		<source>
			<title type="html">Labix Blog</title>
			<subtitle type="html">by Gustavo Niemeyer</subtitle>
			<link rel="self" href="http://blog.labix.org/feed"/>
			<id>http://blog.labix.org/feed</id>
			<updated>2010-03-09T22:44:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Armadilha de Arco-&#205;ris e o futuro da computa&#231;&#227;o</title>
		<link href="http://techberto.wordpress.com/2010/03/07/armadilha-de-arco-iris-e-o-futuro-da-computacao/"/>
		<id>http://techberto.wordpress.com/?p=204</id>
		<updated>2010-03-08T02:27:20+00:00</updated>
		<content type="html">&lt;p&gt;Em 2007 dois pesquisadores brit&#226;nicos teorizaram um dispositivo que eles chamaram de &amp;nbsp;&amp;#8221;al&#231;ap&#227;o de&amp;nbsp;arco-&#237;ris&amp;#8221;, sendo um dispositivo composto por uma lente&lt;img class=&quot;alignright&quot; src=&quot;http://www.newscientist.com/data/images/ns/cms/dn18205/dn18205-2_300.jpg&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;229&quot; /&gt;que seria respons&#225;vel pela reflex&#227;o, dispers&#227;o e refra&#231;&#227;o de um feixe de luz para o interior do artefato que teria uma&amp;nbsp;&amp;nbsp;placa com v&#225;rias camadas de espelhos de metamateriais que poderia capturar o feixe de luz, n&#227;o permitindo sua dispers&#227;o:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://techberto.wordpress.com/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif&quot; alt=&quot;&quot; class=&quot;mceWPmore mceItemNoResize&quot; title=&quot;Mais...&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://spie.org/x25478.xml?ArticleID=x25478&quot; target=&quot;_blank&quot;&gt;Stopping light in metamaterials: the trapped rainbow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Na &#233;poca v&#225;rios grupos ao redor do mundo, acreditando na teoria trabalharam alucinadamente tentando criar um prot&#243;tipo funcional deste dispositivo e no final de 2009 um grupo de pesquisadores americanos conseguiu obter sucesso e com um aparato muito simples provaram o conceito da &amp;#8220;armadilha de arco-&#237;ris&amp;#8221;, demonstrando que os f&#237;sicos brit&#226;nicos estavam certos:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.newscientist.com/article/dn18205-rainbow-trapped-for-the-first-time.html&quot; target=&quot;_blank&quot;&gt;Rainbow trapped for the first time&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Quando comentei este feito com um colega pela primeira vez, logo que via a not&#237;cia na semana que ela foi publicada na &lt;a href=&quot;http://www.newscientist.com/article/dn18205-rainbow-trapped-for-the-first-time.html&quot; target=&quot;_blank&quot;&gt;New Scientist,&lt;/a&gt; ele fez aquele cl&#225;ssico coment&#225;rio: este pessoal n&#227;o tem nada mais importante para fazer?&lt;/p&gt;
&lt;p&gt;Bem, esta t&#233;cnica poder&#225; ser &#250;til para armazenar informa&#231;&#245;es de forma puramente &#243;tica, algo que ir&#225; revolucionar a computa&#231;&#227;o (e talvez a vida) no futuro, eliminando a necessidade de convers&#245;es de sinais &#243;ticos em eletr&#244;nicos, facilitando o processo de &amp;nbsp;manipula&#231;&#227;o de f&#243;tons&amp;nbsp;e proporcionando a cria&#231;&#227;o de &amp;nbsp;meios de armazenamento de informa&#231;&#245;es revolucion&#225;rio. E considerando que em 2009 tamb&#233;m surgiu o primeiro&amp;nbsp;&lt;a href=&quot;http://www.sciencemag.org/cgi/content/abstract/325/5945/1221&quot; target=&quot;_blank&quot;&gt;processador qu&#226;ntico fot&#244;nico aut&#234;ntico&lt;/a&gt; podemos elucubrar que parte do futuro da computa&#231;&#227;o est&#225; na fot&#244;nica e esta nova descoberta &#233; certamento um grande marco.&lt;/p&gt;
&lt;p&gt;Quer algo mais &#250;til do que isto? &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Ruminando e divagando sobre este assunto com um amigo este final de semana, ele lembrou do filme Minority Report e de um cart&#227;o &amp;nbsp;de armazenamento que parecia que as imagens estavam armazenadas de modo fot&#244;nico, visto que elas podiam ser parcialmente vistas sem mesmo estar no seu respectivo driver de leitura.&lt;/p&gt;
&lt;p&gt;Com a evolu&#231;&#227;o das pesquisas do grafeno, dos metamateriais e outros daqui a alguns anos sil&#237;cio ser&#225; coisa do passado, se bobear armazenamento magn&#233;tico tamb&#233;m e por consequencias do entrela&#231;amento qu&#226;ntico a velocidade da luz ir&#225; parecer velocidade tartarugal, imaginou como ser&#225; a computa&#231;&#227;o e o futuro das telecomunica&#231;&#245;es?&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter&quot; src=&quot;http://www.revistaogrito.com/page/wp-content/uploads/2009/08/computer-mediated-telepathy.jpg&quot; alt=&quot;&quot; width=&quot;520&quot; height=&quot;250&quot; /&gt;&lt;/p&gt;
&lt;p&gt;No final de 2008, escrevi um &lt;a href=&quot;http://techberto.wordpress.com/2008/12/04/prospeccoes/&quot; target=&quot;_blank&quot;&gt;post&lt;/a&gt; onde eu brincava que em 2050 &amp;#8220;telepatia sint&#233;tica&amp;#8221; seria coisa do passado, bom, o &lt;a href=&quot;http://www.wired.com/dangerroom/2008/08/army-funds-synt/&quot; target=&quot;_blank&quot;&gt;DARPA tem financiado pesquisas nesta &#225;rea&lt;/a&gt; e isto&amp;nbsp;&lt;img class=&quot;alignright&quot; src=&quot;http://www.thinkgeek.com/images/products/front/bf1b_star_wars_force_trainer_combo.jpg&quot; alt=&quot;&quot; width=&quot;220&quot; height=&quot;242&quot; /&gt;da tem a ver com ESP, visto que a tecnologia &#233; puramente baseada em neuroci&#234;ncia e telecomunica&#231;&#245;es, sendo-se que o artefato que possibilitar&#225; tal feito &#233; puramente um dispositivo de neuroengenharia, &#225;rea que tende a evoluir muito no futuro e aposto que v&#225;rios dos &amp;#8220;neuroengenheiros&amp;#8221; ser&#227;o nascer&#227;o a partir do fasc&#237;nio pelos brinquedos &lt;a href=&quot;http://mindflexgames.com/&quot; target=&quot;_blank&quot;&gt;Mindflex&lt;/a&gt; e o &lt;a href=&quot;http://www.thinkgeek.com/geek-kids/7-13-years/bf1b/&quot; target=&quot;_blank&quot;&gt;Star Wars Force Trainer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mas o qu&#234; a armadilha de arco-&#237;ris e a q-telepatia tem em comum? A resposta &#233;: computa&#231;&#227;o qu&#226;ntica. A neuroengenharia continuar&#225; presente, por&#233;m o processador qu&#226;ntico ser&#225; pe&#231;a fundamental.&lt;/p&gt;
&lt;p&gt;E breve, os&amp;nbsp;&lt;a href=&quot;http://malditoscyborgs.org/dam/english/articles/cyborgism/basement_neurohackers.html&quot; target=&quot;_blank&quot;&gt;neurohackers&lt;/a&gt; j&#225; n&#227;o ser&#227;o mais atores da fic&#231;&#227;o cyberpunk e sim do novo contexto neurotecnol&#243;gico do balaio de gato que ser&#225; o admir&#225;vel mundo novo da computa&#231;&#227;o, fico imaginando a segunda (ou ser&#225; terceira?) gera&#231;&#227;o que ser&#225; os &lt;span class=&quot;Apple-style-span&quot;&gt;q-neurohackers&lt;/span&gt;.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/techberto.wordpress.com/204/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/techberto.wordpress.com/204/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/techberto.wordpress.com/204/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/techberto.wordpress.com/204/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/techberto.wordpress.com/204/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/techberto.wordpress.com/204/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/techberto.wordpress.com/204/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/techberto.wordpress.com/204/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/techberto.wordpress.com/204/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/techberto.wordpress.com/204/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=techberto.wordpress.com&amp;blog=400569&amp;post=204&amp;subd=techberto&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>techberto</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">SciTech::Inno::Blog</title>
			<subtitle type="html">Ci&#234;ncia, tecnologia, programa&#231;&#227;o, m&#250;sica e insights geeks do meu herm&#233;tico box nervoso...</subtitle>
			<link rel="self" href="http://techberto.wordpress.com/feed/atom/"/>
			<id>http://techberto.wordpress.com/feed/atom/</id>
			<updated>2010-03-08T02:44:23+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Mais m&#225;gicas com calculadoras</title>
		<link href="http://www.ricbit.com/2010/03/mais-magicas-com-calculadoras.html"/>
		<id>tag:blogger.com,1999:blog-6306509703738480474.post-44272255538823634</id>
		<updated>2010-03-07T03:00:00+00:00</updated>
		<content type="html">Quando eu era crian&#231;a, a m&#225;gica que eu mais gostava era aquela onde o ilusionista serra a assistente ao meio. Acho que a gra&#231;a era tentar entender como ele fazia aquilo, levei um temp&#227;o para &lt;a href=&quot;http://en.wikipedia.org/wiki/Sawing_a_woman_in_half&quot;&gt;descobrir o truque&lt;/a&gt;. Usando uma calculadora tamb&#233;m temos um truque parecido, mas ao inv&#233;s de serrar uma assistente, vamos cortar um n&#250;mero em dois!&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://www.ricbit.com/uploaded_images/ricbit_magico2-763948.jpg&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.ricbit.com/uploaded_images/ricbit_magico2-763908.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Para come&#231;ar essa m&#225;gica, pe&#231;a para a crian&#231;a digitar o n&#250;mero m&#225;gico 142857 na calculadora:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://www.ricbit.com/uploaded_images/calc_06-710954.jpg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;70&quot; src=&quot;http://www.ricbit.com/uploaded_images/calc_06-710939.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Agora pe&#231;a para que ela multiplique esse n&#250;mero por dois:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://www.ricbit.com/uploaded_images/calc_05-742456.jpg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;72&quot; src=&quot;http://www.ricbit.com/uploaded_images/calc_05-742440.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Olha s&#243;! Voc&#234; cortou o n&#250;mero ao meio e juntou as partes ao contr&#225;rio, 14-2857 virou 2857-14!&lt;br /&gt;&lt;br /&gt;Agora pe&#231;a para ela digitar novamente o n&#250;mero m&#225;gico e multiplicar por tr&#234;s:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://www.ricbit.com/uploaded_images/calc_04-789818.jpg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;72&quot; src=&quot;http://www.ricbit.com/uploaded_images/calc_04-789803.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Ah&#225;! Novamente voc&#234; cortou o n&#250;mero ao meio, 1-42857 virou 42857-1.&lt;br /&gt;&lt;br /&gt;Voc&#234; pode continuar a m&#225;gica a partir daqui, esse truque funciona com todos os m&#250;ltiplos at&#233; 6:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;142857 * 1 = 142857&lt;/div&gt;&lt;div&gt;142857 * 2 = 285714&lt;/div&gt;&lt;div&gt;142857 * 3 = 428571&lt;/div&gt;&lt;div&gt;142857 * 4 = 571428&lt;/div&gt;&lt;div&gt;142857 * 5 = 714285&lt;/div&gt;&lt;div&gt;142857 * 6 = 857142&lt;/div&gt;&lt;br /&gt;Aparentemente, a parte d&#237;ficil desse truque &#233; memorizar o n&#250;mero m&#225;gico. Quando voc&#234; est&#225; cercado de crian&#231;as barulhentas, n&#227;o &#233; f&#225;cil lembrar 142857! Mas, felizmente, voc&#234; n&#227;o precisa decorar o n&#250;mero. &#201; s&#243; lembrar que ele &#233; a diz&#237;ma peri&#243;dica de 1/7, e voc&#234; pode usar a pr&#243;pria calculadora para calcular a d&#237;zima:&lt;br /&gt;&lt;br /&gt;1/7 = 0.142857142857142857...&lt;br /&gt;&lt;br /&gt;A pergunta natural &#233;: tem outras d&#237;zimas com essa propriedade, ou o 142857 &#233; especial? Espantosamente, existem sim outros n&#250;meros. Eles tem at&#233; nome: s&#227;o os &lt;b&gt;n&#250;meros c&#237;clicos&lt;/b&gt;. Para achar esses outros n&#250;meros, vale a pena entender porque o 1/7 funciona, e para isso &#233; s&#243; observar o comportamento da d&#237;zima no algoritmo de divis&#227;o longa:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://www.ricbit.com/uploaded_images/conta_lousa-780571.jpg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;193&quot; src=&quot;http://www.ricbit.com/uploaded_images/conta_lousa-780568.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Voc&#234; come&#231;a dividindo o n&#250;mero 1, e sempre que o resto &#233; menor que 7, coloca um zero atr&#225;s e continua. Note que, quando voc&#234; divide por 7, s&#243; tem sete restos poss&#237;veis: 0, 1, 2, 3, 4, 5 e 6. Se o resto for zero em algum momento, a divis&#227;o acaba e o resultado &#233; exato. Mas se em algum momento o resto repetir, ou seja, for igual a algum resto que j&#225; apareceu antes, ent&#227;o voc&#234; tem uma d&#237;zima.&lt;br /&gt;&lt;br /&gt;Os n&#250;meros c&#237;clicos s&#227;o formados por divis&#245;es de per&#237;odo m&#225;ximo. Como voc&#234; nunca pode ter um zero de resto, ent&#227;o no caso da d&#237;zima de 7, o maior per&#237;odo poss&#237;vel seria seis (felizmente &#233; o caso). Voc&#234; come&#231;a com o resto 1, e quando chega no 1 de novo come&#231;a a repetir, como no diagrama abaixo:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://www.ricbit.com/uploaded_images/conta_lousa3-793797.jpg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;194&quot; src=&quot;http://www.ricbit.com/uploaded_images/conta_lousa3-793794.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Veja como agora d&#225; pra entender porque os n&#250;meros c&#237;clicos funcionam:&amp;nbsp;142857 &#233; a d&#237;zima de 1/7. Se a gente multiplicar 1/7 por dois, teremos 2/7, e a d&#237;zima tem que ser o dobro tamb&#233;m. Mas se voc&#234; olhar no diagrama, multiplicar por dois &#233; a mesma coisa que come&#231;ar a percorrer o diagrama a partir do 2, ao inv&#233;s de come&#231;ar no 1. Mas n&#227;o importa de onde voc&#234; come&#231;a, a seq&#252;&#234;ncia ser&#225; sempre a mesma, e da&#237; o resultado vai ser uma rota&#231;&#227;o da d&#237;zima original!&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://www.ricbit.com/uploaded_images/conta_lousa2-744538.jpg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;194&quot; src=&quot;http://www.ricbit.com/uploaded_images/conta_lousa2-744535.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Sabendo que os n&#250;meros c&#237;clicos s&#227;o as d&#237;zimas de per&#237;odo m&#225;ximo, j&#225; d&#225; pra come&#231;ar a procurar propriedades desses n&#250;meros. Quais n&#250;meros, al&#233;m do 7, geram d&#237;zimas de per&#237;odo m&#225;ximo?&lt;br /&gt;&lt;br /&gt;A primeira coisa que a gente nota &#233; que esses n&#250;meros precisam ser primos. O racioc&#237;nio &#233; relativamente simples. Vamos chamar esse n&#250;mero que procuramos de k, e fazer a divis&#227;o longa de 1 por k. Os restos da divis&#227;o longa formam uma recorr&#234;ncia, onde o primeiro termo &#233; 1, e para os seguintes voc&#234; coloca um zero no final e acha o resto da divis&#227;o por k:&lt;br /&gt;&lt;br /&gt;R[0] = 1&lt;br /&gt;R[n] = 10*R[n-1] (mod k)&lt;br /&gt;&lt;br /&gt;Essa recorr&#234;ncia d&#225; pra resolver de cabe&#231;a:&lt;br /&gt;&lt;br /&gt;R[n] = 10&lt;sup&gt;n&lt;/sup&gt; (mod k)&lt;br /&gt;&lt;br /&gt;Para termos uma d&#237;zima de per&#237;odo m&#225;ximo, o resto precisa ser 1 novamente quando n=k-1, ou seja:&lt;br /&gt;&lt;br /&gt;R[k-1] = 10&lt;sup&gt;k-1&lt;/sup&gt; = 1 (mod k)&lt;br /&gt;&lt;br /&gt;Agora, do &lt;a href=&quot;http://en.wikipedia.org/wiki/Euler's_theorem&quot;&gt;teorema de Euler-Fermat&lt;/a&gt;, n&#243;s sabemos que:&lt;br /&gt;&lt;br /&gt;10&lt;sup&gt;&#966;(k)&lt;/sup&gt; = 1 (mod k)&lt;br /&gt;&lt;br /&gt;Onde &#966;(k) &#233; a &lt;a href=&quot;http://en.wikipedia.org/wiki/Euler's_totient_function&quot;&gt;fun&#231;&#227;o totiente&lt;/a&gt;. Ora, n&#243;s sabemos que, quando k &#233; composto, o totiente &#233; sempre menor que k-1, ent&#227;o k n&#227;o pode ser composto, e portanto &#233; primo.&lt;br /&gt;&lt;br /&gt;Certo, ent&#227;o k precisa ser primo, mas qualquer primo serve? Nope. Tem alguns primos que n&#227;o funcionam, como por exemplo onze. No caso do 11, &#233; verdade que 10&lt;sup&gt;10&lt;/sup&gt; deixa resto 1, mas logo 10&lt;sup&gt;2&lt;/sup&gt; j&#225; tem resto 1 tamb&#233;m, ent&#227;o a d&#237;zima &#233; muito mais curta que gostar&#237;amos.&lt;br /&gt;&lt;br /&gt;Na verdade, o segredo desses primos que funcionam &#233; que... hum... ningu&#233;m sabe qual o segredo. Esse &#233; um &lt;a href=&quot;http://mathworld.wolfram.com/FullReptendPrime.html&quot;&gt;problema em aberto&lt;/a&gt;. Na verdade, a coisa &#233; t&#227;o feia que ningu&#233;m sabe nem mesmo se esses primos s&#227;o finitos ou infinitos. O melhor que podemos fazer &#233; um script que ache os primeiros deles:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.ricbit.com/code/cyclic.py&quot;&gt;Script em python que acha os primeiros n&#250;meros c&#237;clicos&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Depois do sete, o primeiro primo que funciona &#233; o 17, e o n&#250;mero c&#237;clico associado &#233;&amp;nbsp;0588235294117647. Note que esse &#233; um caso onde o zero &#224; esquerda faz diferen&#231;a! Se a sua calculadora tiver um visor bem grande, d&#225; pra divertir uma crian&#231;a por um temp&#227;o com esse n&#250;mero :)&lt;div class=&quot;blogger-post-footer&quot;&gt;
&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/6306509703738480474-44272255538823634?l=www.ricbit.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Ricardo Bittencourt</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.ricbit.com/</uri>
		</author>
		<source>
			<title type="html">Brain Dump</title>
			<subtitle type="html">O que est&#225; passando pela cabe&#231;a do Ricbit no momento.</subtitle>
			<link rel="self" href="http://www.ricbit.com/rss.xml"/>
			<id>tag:blogger.com,1999:blog-6306509703738480474</id>
			<updated>2010-03-11T16:44:41+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Python &#233; capa da TIdigital de Mar&#231;o</title>
		<link href="http://kodumaro.blogspot.com/2010/03/python-e-capa-da-tidigital-de-marco.html"/>
		<id>tag:blogger.com,1999:blog-1387996720436450649.post-5583994010468749089</id>
		<updated>2010-03-05T18:23:00+00:00</updated>
		<content type="html">Gente,&lt;br /&gt;&lt;br /&gt;Segunda-feira todo mundo correndo pras bancas!&lt;br /&gt;&lt;img src=&quot;http://2.bp.blogspot.com/_rGfO7DAuOSE/S5FMbrCQXTI/AAAAAAAAAU0/qDMM34DzHyo/s320/capapython.jpg&quot; alt=&quot;TIdigital Mar&#231;o&quot; id=&quot;BLOGGER_PHOTO_ID_5445217462760004914&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Em mar&#231;o, &lt;a href=&quot;http://python.org/&quot;&gt;Python&lt;/a&gt; em foco na revista TIdigital.&lt;br /&gt;&lt;br /&gt;Fonte: &lt;a href=&quot;http://pythonrio.org/python-e-capa-da-ti-digital-de-marco&quot;&gt;PythOn Rio&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;[]&#8217;s&lt;br /&gt;Cacilh&#945;&#962;, La Batalema&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1387996720436450649-5583994010468749089?l=kodumaro.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Cacilh&#945;&#962;, La Batalema</name>
			<email>noreply@blogger.com</email>
			<uri>http://kodumaro.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Kodumaro</title>
			<subtitle type="html">As sombras da programa&#231;&#227;o</subtitle>
			<link rel="self" href="http://kodumaro.blogspot.com/feeds/posts/default?alt=rss"/>
			<id>tag:blogger.com,1999:blog-1387996720436450649</id>
			<updated>2010-03-19T02:44:31+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">MongoDB &#233; Magn&#237;fico!</title>
		<link href="http://pycappuccino.blogspot.com/2010/03/mongodb-e-magnifico.html"/>
		<id>tag:blogger.com,1999:blog-3425970146544581445.post-6905027871136175574</id>
		<updated>2010-03-05T13:56:31+00:00</updated>
		<content type="html">&lt;a href=&quot;http://3.bp.blogspot.com/_kJTYhCuiJy8/S5E92WVWczI/AAAAAAAADyI/Of1Ld5ay5xc/s1600-h/logo-mongoDB.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;82&quot; src=&quot;http://3.bp.blogspot.com/_kJTYhCuiJy8/S5E92WVWczI/AAAAAAAADyI/Of1Ld5ay5xc/s200/logo-mongoDB.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;Pretendia esperar esperar mais uns dias para postar com mais profundidade, mas estou t&#227;o deslumbrado com Mongo que vou postar com apenas dois dias de estudo.&lt;br /&gt;&lt;br /&gt;Veja-se s&#243; as possibilidades, em Mongo podemos:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Armazenar diversos objetos/tipos nativos de Python como: int, float, datetime.datetime, list, unicode.&lt;/li&gt;&lt;li&gt;Uma vez que ele &#233; &quot;orientado a documentos&quot;, ficamos livres de necessariamente criar schemas, mas eles podem ser criados.&lt;/li&gt;&lt;li&gt;Pode-se armazenar documentos sem termos que definir tamanho m&#225;ximo, de modo que facilmente &#233; poss&#237;vel criar registros que contenham arquivos inteiros.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;A abordagem &#233; t&#227;o diferente que nem &#233; necess&#225;rio criar uma &quot;tabela&quot;, basta denominar as chaves e depois determinar valores para elas.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Podemos acrescentar &quot;campos&quot; sem sofrer para definir novas regras.&lt;/li&gt;&lt;li&gt;O mais extraordin&#225;rio sobre as regras de consist&#234;ncia / relacionamento / estrutura&#231;&#227;o:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Como SQL, podemos criar &quot;refer&#234;ncias&quot;.&lt;/li&gt;&lt;li&gt;Como OO, podemos criar registros HERDADOS com simplicidade. Voc&#234; pode acreditar nisso????&lt;/li&gt;&lt;li&gt;Como OO &quot;Plus&quot;, podemos criar documentos EMBEDEDD com facilidade. Incr&#237;vel!&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Quando vi que era poss&#237;vel criar classes-documentos-filhos e tamb&#233;m classes-documentos-embededd com consist&#234;ncia e naturalidade fiquei impressionado. Isso vai facilitar nossas vidas. Basta olhar &lt;a href=&quot;http://hmarr.com/mongoengine/tutorial.html&quot;&gt;aqui&lt;/a&gt; para ver.&lt;br /&gt;&lt;br /&gt;Ali&#225;s, com tanto tempo no modelo SQL eu tive certa dificuldade no primeiro momento de imaginar outra modelagem de dados.&lt;br /&gt;&lt;br /&gt;A prop&#243;sito, estou usando um ORM para Mongo chamado &quot;mongoengine&quot; que roda em cima do pymongo.&lt;br /&gt;&lt;br /&gt;INSTALANDO MONGOENGINE&lt;br /&gt;&lt;br /&gt;$ sudo easy_intall mongoengine&lt;br /&gt;&lt;br /&gt;Grato ao La Batalema sobre os posts de MongoDB.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3425970146544581445-6905027871136175574?l=pycappuccino.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Eduardo Willians</name>
			<email>noreply@blogger.com</email>
			<uri>http://pycappuccino.blogspot.com/search/label/python</uri>
		</author>
		<source>
			<title type="html">PyCappuccino</title>
			<subtitle type="html">Python, Ubuntu &amp;amp; Cia da perspectiva de um jurista</subtitle>
			<link rel="self" href="http://pycappuccino.blogspot.com/feeds/posts/default/-/python"/>
			<id>tag:blogger.com,1999:blog-3425970146544581445</id>
			<updated>2010-03-22T11:44:07+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">M&#225;gicas com calculadoras</title>
		<link href="http://www.ricbit.com/2010/03/magicas-com-calculadoras.html"/>
		<id>tag:blogger.com,1999:blog-6306509703738480474.post-8285510843962864816</id>
		<updated>2010-03-03T01:27:00+00:00</updated>
		<content type="html">Tem um di&#225;logo que sempre acontece quando vou visitar algum amigo que tenha filho pequeno. Eu sou apresentado pelo amigo como &quot;o Ricbit, aquele amigo que &lt;i&gt;gosta de Matem&#225;tica&lt;/i&gt;&quot;. A&#237; a crian&#231;a, espantada, responde &quot;mas como assiiiiiim ele gosta de Matem&#225;tica?!&quot;. E o amigo responde &quot;ah, mas matem&#225;tica com o tio Ricbit &#233; divertida. Mostra pra ele, Ricbit!&quot;. E a&#237; eu, que nem cheguei direito, j&#225; estou com a batata quente na m&#227;o!&lt;br /&gt;&lt;br /&gt;Felizmente, eu j&#225; descobri alguns truques pra lidar com situa&#231;&#245;es assim. Se a crian&#231;a ainda est&#225; na fase de achar que matem&#225;tica &#233; aritm&#233;tica, ent&#227;o uma abordagem que funciona bem &#233; pedir uma calculadora emprestada,e falar que voc&#234; vai us&#225;-la pra fazer &lt;i&gt;m&#225;gicas&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://www.ricbit.com/uploaded_images/ricbit_magico-721213.jpg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;237&quot; src=&quot;http://www.ricbit.com/uploaded_images/ricbit_magico-721179.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Uma das m&#225;gicas cl&#225;ssicas funciona assim:&lt;br /&gt;&lt;br /&gt;1. Primeiro voc&#234; pede pra crian&#231;a digitar 13837, que &#233; um n&#250;mero &lt;i&gt;m&#225;gico&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://www.ricbit.com/uploaded_images/calc_01-717197.jpg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;70&quot; src=&quot;http://www.ricbit.com/uploaded_images/calc_01-717181.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;2. Depois, voc&#234; pergunta quantos anos tem o pai dela, e fala pra ela multiplicar aquele n&#250;mero m&#225;gico pela idade do pai. Digamos que o pai tem 42 anos, ent&#227;o o resultado ser&#225; 581154.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://www.ricbit.com/uploaded_images/calc_02-730240.jpg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;70&quot; src=&quot;http://www.ricbit.com/uploaded_images/calc_02-730223.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;3. Por fim, voc&#234; fala pra crian&#231;a multiplicar esse n&#250;mero que est&#225; no visor por outro n&#250;mero &lt;i&gt;m&#225;gico&lt;/i&gt;, 73.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://www.ricbit.com/uploaded_images/calc_03-746179.jpg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;70&quot; src=&quot;http://www.ricbit.com/uploaded_images/calc_03-746165.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Surpresa! O resultado &#233; 42424242, a idade do pai repetida at&#233; encher o visor da calculadora! Crian&#231;as adoram isso, eu imagino que o motivo &#233; uma varia&#231;&#227;o da &lt;a href=&quot;http://en.wikipedia.org/wiki/Clarke's_three_laws&quot;&gt;Lei de Clarke&lt;/a&gt;. A crian&#231;a n&#227;o entende porque isso aconteceu, e qualquer conta suficientemente incompreens&#237;vel &#233; indistingu&#237;vel de magia. (Pensando bem, isso funciona com estudantes de engenharia tamb&#233;m).&lt;br /&gt;&lt;br /&gt;O truque funciona com qualquer valor de idade, &#233; claro. O motivo &#233; simples: se voc&#234; multiplicar os dois n&#250;meros m&#225;gicos, 13837*73 resulta em 1010101. Qualquer n&#250;mero de dois d&#237;gitos fica replicado quatro vezes quando voc&#234; multiplica por 1010101. O ilusionismo do truque &#233; que o par de n&#250;meros m&#225;gicos obfusca esse valor.&lt;br /&gt;&lt;br /&gt;A pergunta natural nesse caso &#233;: d&#225; pra fazer a m&#225;gica com cinco repeti&#231;&#245;es? Seis? Quantas eu quiser?&lt;br /&gt;&lt;br /&gt;Isso s&#243; &#233; poss&#237;vel se o n&#250;mero 101...01 n&#227;o for primo. Sendo composto, voc&#234; sempre pode separar os fatores em dois n&#250;meros m&#225;gicos. Vamos fazer um teste r&#225;pido. Para duas repeti&#231;&#245;es n&#227;o d&#225;, 101 &#233; primo. Para tr&#234;s repeti&#231;&#245;es temos 259 e 39, para cinco temos 372731 e 271. Usando o &lt;a href=&quot;http://www.wolframalpha.com/&quot;&gt;Wolfram Alpha&lt;/a&gt;, d&#225; pra checar manualmente que acima de duas repeti&#231;&#245;es todos os n&#250;meros parecem compostos. Mas d&#225; pra provar isso?&lt;br /&gt;&lt;br /&gt;Eu achei que esse seria um problema complexo, mas acabou sendo mais f&#225;cil do que eu esperava! A prova pode ser feita s&#243; com matem&#225;tica elementar. Suponha que o n&#250;mero que queremos fatorar gera n repeti&#231;&#245;es, ent&#227;o ele pode ser escrito como a soma de uma progress&#227;o geom&#233;trica finita:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=\sum_{k%3D0}^{n-1}%20100^k%3D\frac{100^n-1}{100-1}%3D\frac{100^n-1}{99}&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Se voc&#234; notar que 100&lt;sup&gt;n&lt;/sup&gt; &#233; o mesmo que 10&lt;sup&gt;2n&lt;/sup&gt;, ent&#227;o d&#225; pra fatorar o numerador como diferen&#231;a de quadrados:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=\frac{100^n-1}{99}%3D\frac{10^{2n}-1}{99}%3D\frac{(10^n%2B1)(10^n-1)}{99}&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Agora &#233; s&#243; notar que, para n&amp;gt;2, os dois termos do numerador s&#227;o bem maiores que 99, ent&#227;o nenhum deles simplifica completamente. Da&#237;, o valor final sempre vai ter pelo menos dois fatores, o que completa a demonstra&#231;&#227;o.&lt;br /&gt;&lt;br /&gt;Ainda tem um monte de m&#225;gicas que podem ser feitas com calculadoras, mas essas ficam para posts futuros :)&lt;br /&gt;&lt;br /&gt;&lt;i&gt;(Obrigado ao Jacques Brancher e ao F&#225;bio Moreira pelas id&#233;ias.)&lt;/i&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;
&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/6306509703738480474-8285510843962864816?l=www.ricbit.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Ricardo Bittencourt</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.ricbit.com/</uri>
		</author>
		<source>
			<title type="html">Brain Dump</title>
			<subtitle type="html">O que est&#225; passando pela cabe&#231;a do Ricbit no momento.</subtitle>
			<link rel="self" href="http://www.ricbit.com/rss.xml"/>
			<id>tag:blogger.com,1999:blog-6306509703738480474</id>
			<updated>2010-03-11T16:44:41+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Ajude a escolher os palestrantes internacionais da Python Brasil [6]</title>
		<link href="http://marrcandre.blogspot.com/2010/03/ajude-escolher-os-palestrantes.html"/>
		<id>tag:blogger.com,1999:blog-4593771306625888277.post-6774196732466773334</id>
		<updated>2010-03-02T06:30:34+00:00</updated>
		<content type="html">Carregando...&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/4593771306625888277-6774196732466773334?l=marrcandre.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Marco Andr&#233; Lopes Mendes</name>
			<email>noreply@blogger.com</email>
			<uri>http://marrcandre.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">marrcandr&#233;</title>
			<link rel="self" href="http://marrcandre.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-4593771306625888277</id>
			<updated>2010-03-02T16:44:50+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">utf8_decode em Javascript</title>
		<link href="http://feedproxy.google.com/~r/Fechatag/~3/DEu9gDWK_PM/"/>
		<id>http://blog.elcio.com.br/utf8_decode-em-javascript/</id>
		<updated>2010-03-01T15:40:29+00:00</updated>
		<content type="html">&lt;p&gt;Navegando por a&#237;, acabei esbarrando no blog do meu amigo &lt;a href=&quot;http://marcos.blog.br/&quot;&gt;Marcos Rossow&lt;/a&gt; (nossa, quanto tempo!)&lt;/p&gt;
&lt;p&gt;E encontrei esse post: &lt;a href=&quot;http://marcos.blog.br/2009/11/javascript-utf-8-decode/&quot;&gt;JavaScript UTF-8 Decode&lt;/a&gt;, com um c&#243;digo tirado daqui: &lt;a href=&quot;http://phpjs.org/functions/utf8_decode:576&quot;&gt;JavaScript utf8_decode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tem duas coisas que me incomodam nessa abordagem. A primeira &#233; essa mania que muita gente tem, particularmente programadores PHP, de tratar UTF-8 como um &amp;#034;c&#243;digo alien&#237;gena&amp;#034; e ISO-8859-1 como normal e padr&#227;o. Al&#244;, ISO-8859-1 &#233; usado por parte do mundo. N&#227;o d&#225; para escrever hebraico, mandarim, japon&#234;s, &#225;rabe ou russo com isso. ISO-8859-1 &#233; uma das diversas tabelas de caracteres que existem mundo afora. E Unicode &#233; a &#250;nica maneira sensata de escrever um sistema que possa ser usado aqui e na China.&lt;/p&gt;
&lt;p&gt;A segunda coisa que me incomoda &#233; a quantidade de c&#243;digo. N&#227;o testei profundamente, mas tenho a impress&#227;o de que o c&#243;digo abaixo resolve o problema:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;prettyprint&quot;&gt;function utf8_decode(t){&lt;br /&gt;
  return decodeURIComponent(escape(t))&lt;br /&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/KU1tKwUfm_0eMAr8GWgBzILL8CE/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/KU1tKwUfm_0eMAr8GWgBzILL8CE/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/KU1tKwUfm_0eMAr8GWgBzILL8CE/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/KU1tKwUfm_0eMAr8GWgBzILL8CE/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/Fechatag?a=DEu9gDWK_PM:GivX3gvpyoE:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Fechatag?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Fechatag?a=DEu9gDWK_PM:GivX3gvpyoE:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Fechatag?i=DEu9gDWK_PM:GivX3gvpyoE:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Elcio Luiz Ferreira</name>
			<uri>http://blog.elcio.com.br</uri>
		</author>
		<source>
			<title type="html">fechaTag</title>
			<subtitle type="html">XML, XHTML, CSS, Tableless, Desenvolvimento Web, Python, Linux</subtitle>
			<link rel="self" href="http://blog.elcio.com.br/tag/programacao/feed/"/>
			<id>http://blog.elcio.com.br/tag/programacao/feed/</id>
			<updated>2010-03-17T17:44:18+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">MongoDB</title>
		<link href="http://kodumaro.blogspot.com/2010/02/mongodb.html"/>
		<id>tag:blogger.com,1999:blog-1387996720436450649.post-8349320847110518626</id>
		<updated>2010-02-27T17:44:00+00:00</updated>
		<content type="html">&lt;img src=&quot;http://4.bp.blogspot.com/_rGfO7DAuOSE/S4lVpD9rPyI/AAAAAAAAAUw/jCU1Qk1BbCU/s1600/mongodb.jpg&quot; alt=&quot;Logo&quot; /&gt; H&#225; atualmente na Computa&#231;&#227;o uma onda de ado&#231;&#227;o de &lt;a href=&quot;http://pt.wikipedia.org/wiki/NoSQL&quot;&gt;bancos de dados n&#227;o-relacionais, comumente chamados NoSQL&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;O foco principal dos bancos NoSQL atuais &#233; a &lt;a href=&quot;http://en.wikipedia.org/wiki/Document-oriented_database&quot;&gt;orienta&#231;&#227;o a documentos&lt;/a&gt;, uma varia&#231;&#227;o &lt;em&gt;hash&lt;/em&gt; da &lt;a href=&quot;http://pt.wikipedia.org/wiki/Banco_de_dados_orientado_a_objetos&quot;&gt;orienta&#231;&#227;o a objetos&lt;/a&gt; e alternativa aos &lt;a href=&quot;http://pt.wikipedia.org/wiki/Banco_de_dados_relacional&quot;&gt;RDBMSs&lt;/a&gt;, que dominaram a orienta&#231;&#227;o dos gerenciadores de banco de dados por d&#233;cadas.&lt;br /&gt;&lt;br /&gt;O principal banco NoSQL &#233; o &lt;a href=&quot;http://couchdb.apache.org/&quot;&gt;CouchDB&lt;/a&gt;, DBMS do Projeto Apache baseado em &lt;a href=&quot;http://ftp.sunet.se/pub/lang/erlang/&quot;&gt;Erlang&lt;/a&gt;, por&#233;m h&#225; uma alternativa bem mais simples e aparentemente t&#227;o poderosa quanto: &lt;a href=&quot;http://www.mongodb.org/&quot;&gt;MongoDB&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;MongoDB combina os melhores funcionalidades de orienta&#231;&#227;o a documentos, &lt;em&gt;hashes&lt;/em&gt; e RDBMSs. &#201; um banco de dados orientado a documentos, escal&#225;vel, livre de esquema, de alto desempenho e c&#243;digo aberto escrito em &lt;a href=&quot;http://www.cplusplus.com/&quot;&gt;C++&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Este artigo d&#225; continuidade ao &lt;a href=&quot;http://montegasppa.blogspot.com/2010/02/mongodb.html&quot;&gt;artigo nas Reflex&#245;es de Monte Gasppa e Giulia C.&lt;/a&gt; sobre a instala&#231;&#227;o do MongoDB. Aqui voc&#234; poder&#225; ver um pouquinho do uso de um banco de dados orientado a documentos.&lt;br /&gt;&lt;br /&gt;Este artigo &#233; baseado na &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Tutorial&quot;&gt;documenta&#231;&#227;o oficial&lt;/a&gt; e entende que voc&#234; instalou o MongoDB segundo descrito nas &lt;a href=&quot;http://montegasppa.blogspot.com/2010/02/mongodb.html&quot;&gt;Reflex&#245;es de Monte Gasppa e Giulia C.&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conex&#227;o na base de dados&lt;/h3&gt;&lt;br /&gt;Para conectar na base basta usar o comando &lt;code&gt;mongo&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;bash$&lt;/em&gt; &lt;strong&gt;mongo&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;MongoDB shell version: 1.2.2&lt;/em&gt;&lt;br /&gt;&lt;em&gt;url: test&lt;/em&gt;&lt;br /&gt;&lt;em&gt;connecting to: test&lt;/em&gt;&lt;br /&gt;&lt;em&gt;type &quot;help&quot; for help&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&amp;gt;&lt;/em&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Caso voc&#234; tenha configurado uma porta alternativa em &lt;code&gt;/srv/mongodb/etc/mongodb.conf&lt;/code&gt;, voc&#234; pode especificar isso na linha de comando do cliente:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;bash$&lt;/em&gt; &lt;strong&gt;mongo --port 27018&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Voc&#234; tamb&#233;m pode se conectar a um servidor remoto, caso ele esteja habilitado para conex&#227;o externa, usando a &lt;em&gt;flag&lt;/em&gt; &lt;code&gt;--host&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Para escolher qual base de dados usar, o comando &#233; &lt;code&gt;use&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;code&gt;use mydb&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Autoriza&#231;&#227;o&lt;/h3&gt;&lt;br /&gt;Voc&#234; pode se autorizar na linha de comando com as op&#231;&#245;es &lt;code&gt;-u&lt;/code&gt; (usu&#225;rio) e &lt;code&gt;-p&lt;/code&gt; (senha), ou j&#225; do &lt;em&gt;prompt&lt;/em&gt; do interpretador:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;use admin&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.auth('admin', 'ra35EG/dz');&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Comandos b&#225;sicos&lt;/h3&gt;&lt;br /&gt;A linguagem de intera&#231;&#227;o com MongoDB &#233; &lt;a href=&quot;http://pt.wikipedia.org/wiki/JavaScript&quot;&gt;Javascript&lt;/a&gt;, mas h&#225; alguns comandos &#250;teis no interpretador.&lt;br /&gt;&lt;br /&gt;Para listar comandos &#250;teis:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;help&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Listar recursos uteis da base atual:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.help();&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Listar recursos uteis de uma cole&#231;&#227;o (levemente equivalente a tabela de um banco relacional), no exemplo &lt;code&gt;foo&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.foo.help();&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Para listar as bases instaladas:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;show dbs&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Para listar as cole&#231;&#245;es da base atual:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;show collections&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Listar usu&#225;rios da base atual:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;show users&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Criar usu&#225;rio na base atual:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.addUser('admin', 'ra35EG/dz');&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Autenticar-se:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.auth('admin', 'ra35EG/dz');&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Listar o conte&#250;do de uma cole&#231;&#227;o:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.foo.find();&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Apagar uma cole&#231;&#227;o:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.foo.drop();&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Apagar a base de dados atual:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.dropDatabase();&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Armazenamento de dados&lt;/h3&gt;&lt;br /&gt;Repare que o MongoDB &#233; &lt;strong&gt;livre de esquema&lt;/strong&gt;, portanto uma cole&#231;&#227;o pode conter estruturas de dados radicalmente diferentes, sempre no formato &lt;a href=&quot;http://json.org/&quot;&gt;JSON&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Por exemplo, vamos inserir dois dados distintos na cole&#231;&#227;o &lt;code&gt;foo&lt;/code&gt; da base &lt;code&gt;mydb&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;use mydb&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;var j = { name: 'mongo' };&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;var t = { x: 3 };&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.foo.save(j);&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.foo.save(t);&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.foo.find();&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b8949d9cd50237b8573833b&quot;), &quot;name&quot; : &quot;mongo&quot; }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b8949dbcd50237b8573833c&quot;), &quot;x&quot; : 3 }&lt;/em&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Voc&#234; n&#227;o precisa predefinir a cole&#231;&#227;o, que &#233; criada automaticamente no salvamento da primeira estrutura. O campo &lt;code&gt;_id&lt;/code&gt; &#233; criado automaticamente e &#233; a &lt;strong&gt;chave prim&#225;ria&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Para apagar o objeto &lt;code&gt;j&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;j = db.foo.findOne({ name: 'mongo' });&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.foo.remove(j);&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Para apagar todos os objetos basta remover a cole&#231;&#227;o:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.foo.drop();&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Vamos usar um pouco mais de l&#243;gica:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;for (var i=0; i&amp;lt;100; ++i) db.foo.save({ x: i, y: i*i });&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Esse &lt;em&gt;loop&lt;/em&gt; cria cem registros, com &lt;code&gt;x&lt;/code&gt; variando de zero a noventa e nove e &lt;code&gt;y&lt;/code&gt; igual a seu quadrado:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.foo.find();&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b8573833e&quot;), &quot;x&quot; : 0, &quot;y&quot; : 0 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b8573833f&quot;), &quot;x&quot; : 1, &quot;y&quot; : 1 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738340&quot;), &quot;x&quot; : 2, &quot;y&quot; : 4 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738341&quot;), &quot;x&quot; : 3, &quot;y&quot; : 9 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738342&quot;), &quot;x&quot; : 4, &quot;y&quot; : 16 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738343&quot;), &quot;x&quot; : 5, &quot;y&quot; : 25 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738344&quot;), &quot;x&quot; : 6, &quot;y&quot; : 36 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738345&quot;), &quot;x&quot; : 7, &quot;y&quot; : 49 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738346&quot;), &quot;x&quot; : 8, &quot;y&quot; : 64 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738347&quot;), &quot;x&quot; : 9, &quot;y&quot; : 81 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738348&quot;), &quot;x&quot; : 10, &quot;y&quot; : 100 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738349&quot;), &quot;x&quot; : 11, &quot;y&quot; : 121 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b8573834a&quot;), &quot;x&quot; : 12, &quot;y&quot; : 144 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b8573834b&quot;), &quot;x&quot; : 13, &quot;y&quot; : 169 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b8573834c&quot;), &quot;x&quot; : 14, &quot;y&quot; : 196 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b8573834d&quot;), &quot;x&quot; : 15, &quot;y&quot; : 225 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b8573834e&quot;), &quot;x&quot; : 16, &quot;y&quot; : 256 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b8573834f&quot;), &quot;x&quot; : 17, &quot;y&quot; : 289 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738350&quot;), &quot;x&quot; : 18, &quot;y&quot; : 324 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738351&quot;), &quot;x&quot; : 19, &quot;y&quot; : 361 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;has more&lt;/em&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Consultas (&lt;em&gt;queries&lt;/em&gt;)&lt;/h3&gt;&lt;br /&gt;&#201; poss&#237;vel fazer consultas simples ou bem complexas assim como em modelos relacionais usando MongoDB.&lt;br /&gt;&lt;br /&gt;Vamos obter uma contagem de objetos:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.foo.find().count();&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;100&lt;/em&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;S&#243; os cinco primeiros objetos:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.foo.find().limit(5);&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b8573833e&quot;), &quot;x&quot; : 0, &quot;y&quot; : 0 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b8573833f&quot;), &quot;x&quot; : 1, &quot;y&quot; : 1 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738340&quot;), &quot;x&quot; : 2, &quot;y&quot; : 4 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738341&quot;), &quot;x&quot; : 3, &quot;y&quot; : 9 }&lt;/em&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Agora os cinco seguintes:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.foo.find().skip(5).limit(5);&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738343&quot;), &quot;x&quot; : 5, &quot;y&quot; : 25 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738344&quot;), &quot;x&quot; : 6, &quot;y&quot; : 36 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738345&quot;), &quot;x&quot; : 7, &quot;y&quot; : 49 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738346&quot;), &quot;x&quot; : 8, &quot;y&quot; : 64 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738347&quot;), &quot;x&quot; : 9, &quot;y&quot; : 81 }&lt;/em&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Para obter o elemento com valor de &lt;code&gt;x&lt;/code&gt; vinte e quatro:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;var e = db.foo.findOne({ x: 24 });&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;print(e.y);&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;576&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;print(tojson(e));&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738356&quot;), &quot;x&quot; : 24, &quot;y&quot; : 576 }&lt;/em&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Consultas avan&#231;adas&lt;/h3&gt;&lt;br /&gt;Vamos complicar um pouco&#8230;&lt;br /&gt;&lt;br /&gt;Para obter todos os registros com &lt;code&gt;x&lt;/code&gt; maior que cinquenta:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.foo.find('this.x &gt; 50');&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738371&quot;), &quot;x&quot; : 51, &quot;y&quot; : 2601 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738372&quot;), &quot;x&quot; : 52, &quot;y&quot; : 2704 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738373&quot;), &quot;x&quot; : 53, &quot;y&quot; : 2809 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738374&quot;), &quot;x&quot; : 54, &quot;y&quot; : 2916 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738375&quot;), &quot;x&quot; : 55, &quot;y&quot; : 3025 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738376&quot;), &quot;x&quot; : 56, &quot;y&quot; : 3136 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738377&quot;), &quot;x&quot; : 57, &quot;y&quot; : 3249 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738378&quot;), &quot;x&quot; : 58, &quot;y&quot; : 3364 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738379&quot;), &quot;x&quot; : 59, &quot;y&quot; : 3481 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b8573837a&quot;), &quot;x&quot; : 60, &quot;y&quot; : 3600 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b8573837b&quot;), &quot;x&quot; : 61, &quot;y&quot; : 3721 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b8573837c&quot;), &quot;x&quot; : 62, &quot;y&quot; : 3844 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b8573837d&quot;), &quot;x&quot; : 63, &quot;y&quot; : 3969 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b8573837e&quot;), &quot;x&quot; : 64, &quot;y&quot; : 4096 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b8573837f&quot;), &quot;x&quot; : 65, &quot;y&quot; : 4225 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738380&quot;), &quot;x&quot; : 66, &quot;y&quot; : 4356 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738381&quot;), &quot;x&quot; : 67, &quot;y&quot; : 4489 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738382&quot;), &quot;x&quot; : 68, &quot;y&quot; : 4624 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738383&quot;), &quot;x&quot; : 69, &quot;y&quot; : 4761 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;{ &quot;_id&quot; : ObjectId(&quot;4b894c05cd50237b85738384&quot;), &quot;x&quot; : 70, &quot;y&quot; : 4900 }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;has more&lt;/em&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Outra op&#231;&#227;o &#233; usar o &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Advanced+Queries&quot;&gt;operador condicional&lt;/a&gt; &lt;code&gt;$gt&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.foo.find({ x: { $gt: 50 } });&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Da mesma forma outros operadores. Por exemplo, todos os elementos com &lt;code&gt;x&lt;/code&gt; entre vinte e tr&#234;s e vinte e seis, inclusive:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.foo.find('23 &amp;lt;= this.x &amp;amp;&amp;amp; this.x &amp;lt;= 26');&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ou:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.foo.find({ x: { $gte: 23, $lte: 26 } });&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Os principais operadores s&#227;o:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;$lt&lt;/code&gt; &#8211; menor que&lt;/li&gt; &lt;li&gt;&lt;code&gt;$gt&lt;/code&gt; &#8211; maior que&lt;/li&gt; &lt;li&gt;&lt;code&gt;$lte&lt;/code&gt; &#8211; menor ou igual a&lt;/li&gt; &lt;li&gt;&lt;code&gt;$gte&lt;/code&gt; &#8211; maior ou igual a&lt;/li&gt; &lt;li&gt;&lt;code&gt;$ne&lt;/code&gt; &#8211; diferente de&lt;/li&gt; &lt;li&gt;&lt;code&gt;$in&lt;/code&gt; &#8211; est&#225; em (recebe uma lista)&lt;/li&gt; &lt;li&gt;&lt;code&gt;$nin&lt;/code&gt; &#8211; n&#227;o est&#225; em&lt;/li&gt; &lt;li&gt;&lt;code&gt;$mod&lt;/code&gt; &#8211; resto igual a (recebe uma lista onde o primeiro valor &#233; o divisor e o segundo o resto)&lt;/li&gt; &lt;li&gt;&lt;code&gt;$exists&lt;/code&gt; &#8211; cont&#233;m ou n&#227;o o atributo&lt;/li&gt; &lt;li&gt;&lt;code&gt;$not&lt;/code&gt; &#8211; nega&#231;&#227;o de uma condi&#231;&#227;o&lt;/li&gt;&lt;/ul&gt; &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Ordena&#231;&#227;o&lt;/h3&gt;&lt;br /&gt;A ordena&#231;&#227;o &#233; feita usando o m&#233;todo &lt;code&gt;sort&lt;/code&gt;. Por exemplo, para ordenar de modo descrescente pelo atributo &lt;code&gt;y&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.foo.find().sort({ y: -1 });&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Express&#245;es regulares&lt;/h3&gt;Quando h&#225; campos com valor &lt;em&gt;string&lt;/em&gt;, &#233; poss&#237;vel usar express&#245;es regulares:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.foo.find({ name: /^mon.o$/i });&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&#205;ndices&lt;/h3&gt;Quando voc&#234; faz muitas consultas baseadas em um determinado atributo, &#233; interessante criar um &#237;ndice para ele. Por exemplo, se quisermos criar um &#237;ndice para nosso atributo &lt;code&gt;x&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;&amp;gt;&lt;/em&gt; &lt;strong&gt;db.foo.ensureIndex({ x: 1 });&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Obs.&#185;: o atributo &lt;code&gt;_id&lt;/code&gt; possui &#237;ndice por padr&#227;o.&lt;br /&gt;&lt;br /&gt;Obs.&#178;: &#233; poss&#237;vel criar &#237;ndices compostos.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Agrega&#231;&#227;o&lt;/h3&gt;&lt;br /&gt;N&#227;o vou entrar nesse m&#233;rito, mas &#233; poss&#237;vel criar agrega&#231;&#245;es, como &lt;code&gt;GROUP_BY&lt;/code&gt; de SQL. Para tanto veja a &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Aggregation&quot;&gt;documenta&#231;&#227;o oficial&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;M&#243;dulos de conex&#227;o com linguagens de programa&#231;&#227;o&lt;/h3&gt;&lt;br /&gt;H&#225; m&#243;dulos para v&#225;rias linguagens, que podem ser encontrados na &lt;a href=&quot;http://api.mongodb.org/&quot;&gt;lista de APIs&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;O m&#243;dulo que pude e me fascinou foi para &lt;a href=&quot;http://api.mongodb.org/python&quot;&gt;Python&lt;/a&gt;. Sua instala&#231;&#227;o usando &lt;a href=&quot;http://peak.telecommunity.com/dist/ez_setup.py&quot;&gt;&lt;code&gt;easy_install&lt;/code&gt;&lt;/a&gt; foi muito simples:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;bash$&lt;/em&gt; &lt;strong&gt;sudo easy_install -U pymongo&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;E seu uso extremamente f&#225;cil devido &#224; similiaridade entre &lt;a href=&quot;http://diveintopython.org/getting_to_know_python/dictionaries.html&quot;&gt;dicion&#225;rios de Python&lt;/a&gt; e JSON. A &#250;nica reclama&#231;&#227;o que fa&#231;o &#233; o fato do m&#233;todo &lt;code&gt;db.auth()&lt;/code&gt; do MongoDB ter sido traduzido como &lt;code&gt;db.authenticate()&lt;/code&gt; em Python, o que me fez perder alguns segundos tentando entender por que n&#227;o funcionava.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;**&lt;/h3&gt;&lt;br /&gt;Espero que este artigo seja mais do que &#250;til e incite o uso dessa intrigante ferramenta.&lt;br /&gt;&lt;br /&gt;[]&#8217;s&lt;br /&gt;Cacilhas, La Batalema&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1387996720436450649-8349320847110518626?l=kodumaro.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Cacilh&#945;&#962;, La Batalema</name>
			<email>noreply@blogger.com</email>
			<uri>http://kodumaro.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Kodumaro</title>
			<subtitle type="html">As sombras da programa&#231;&#227;o</subtitle>
			<link rel="self" href="http://kodumaro.blogspot.com/feeds/posts/default?alt=rss"/>
			<id>tag:blogger.com,1999:blog-1387996720436450649</id>
			<updated>2010-03-19T02:44:31+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Not&#237;cias do Fronte de ZODB</title>
		<link href="http://pycappuccino.blogspot.com/2010/02/noticias-do-fronte-de-zodb.html"/>
		<id>tag:blogger.com,1999:blog-3425970146544581445.post-9219042490962629837</id>
		<updated>2010-02-26T15:17:30+00:00</updated>
		<content type="html">Alguns vislumbres de ZODB:&lt;br /&gt;&lt;br /&gt;.Me admira que ele receba t&#227;o pouca aten&#231;&#227;o&lt;br /&gt;.Me admira que, al&#233;m do Zeo, ele &lt;u&gt;n&#227;o&lt;/u&gt; venha empacotado com Zcatalog (indexador)&lt;br /&gt;.Me admira que ningu&#233;m fale dele&lt;br /&gt;.Me admira que ainda usemos Python com BDs relacionais&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3425970146544581445-9219042490962629837?l=pycappuccino.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Eduardo Willians</name>
			<email>noreply@blogger.com</email>
			<uri>http://pycappuccino.blogspot.com/search/label/python</uri>
		</author>
		<source>
			<title type="html">PyCappuccino</title>
			<subtitle type="html">Python, Ubuntu &amp;amp; Cia da perspectiva de um jurista</subtitle>
			<link rel="self" href="http://pycappuccino.blogspot.com/feeds/posts/default/-/python"/>
			<id>tag:blogger.com,1999:blog-3425970146544581445</id>
			<updated>2010-03-22T11:44:07+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Utopia</title>
		<link href="http://feedproxy.google.com/~r/PythonInScience/~3/naS1xF5km_w/utopia.html"/>
		<id>tag:blogger.com,1999:blog-840127493134277990.post-7540222353643744731</id>
		<updated>2010-02-26T11:16:43+00:00</updated>
		<content type="html">Interesting post, But hoping to invert those proportions, i.e., making the smarter guys the 80% is harder that having a society where everyone earns more money than they can spend... Pretty next to impossible...;-)in reference to: Coding Horror: The Two Types of Programmers (view on Google Sidewiki)</content>
		<author>
			<name>Flavio Coelho</name>
			<email>noreply@blogger.com</email>
			<uri>http://pyinsci.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Python in Science</title>
			<subtitle type="html">Scientific adventures with Python.</subtitle>
			<link rel="self" href="http://pyinsci.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-840127493134277990</id>
			<updated>2010-03-22T11:44:21+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Kodumaro no Twitter</title>
		<link href="http://kodumaro.blogspot.com/2010/02/kodumaro-agora-no-twitter-kodumaro.html"/>
		<id>tag:blogger.com,1999:blog-1387996720436450649.post-8948507057408789978</id>
		<updated>2010-02-25T17:38:00+00:00</updated>
		<content type="html">&lt;img src=&quot;http://3.bp.blogspot.com/_rGfO7DAuOSE/S4a0tjBLPbI/AAAAAAAAAUs/NqzC5P5s5c8/s200/kodumaro.jpg&quot; alt=&quot;Twitter&quot; /&gt; &lt;a href=&quot;http://kodumaro.blogspot.com/&quot;&gt;Kodumaro&lt;/a&gt; agora no &lt;a href=&quot;http://twitter.com/&quot;&gt;Twitter&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href=&quot;http://twitter.com/kodumaro&quot;&gt;@kodumaro&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;A conta ser&#225; usada para divulgar novos artigos e para troca de ideias com os leitores.&lt;br /&gt;&lt;br /&gt;[]&#8217;s&lt;br /&gt;Cacilhas, La Batalema&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1387996720436450649-8948507057408789978?l=kodumaro.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Cacilh&#945;&#962;, La Batalema</name>
			<email>noreply@blogger.com</email>
			<uri>http://kodumaro.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Kodumaro</title>
			<subtitle type="html">As sombras da programa&#231;&#227;o</subtitle>
			<link rel="self" href="http://kodumaro.blogspot.com/feeds/posts/default?alt=rss"/>
			<id>tag:blogger.com,1999:blog-1387996720436450649</id>
			<updated>2010-03-19T02:44:31+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">&amp;#8220;Pegadinha&amp;#8221;: Cuidado ao encadear m&#250;ltiplas chamadas de m&#233;todos</title>
		<link href="http://lauro.wordpress.com/2010/02/21/pegadinha-cuidado-ao-encadear-multipas-chamadas-de-metodos/"/>
		<id>http://lauro.wordpress.com/?p=237</id>
		<updated>2010-02-22T16:37:38+00:00</updated>
		<content type="html">&lt;br /&gt;&lt;p&gt;Num dos testes antigos do PySide, havia uma inocente linha de c&#243;digo com QFile().metaObject().methodCount(), que na nova vers&#227;o estava causando uma falha de segmenta&#231;&#227;o dentro da Qt. O que estava acontecendo era que o QMetaObject retornado pelo metaObject() estava sendo apagado pelo QFile() criado, invalidando a &#225;rea de mem&#243;ria que methodCount() tentava acessar. Agora por que diabos ele estava sendo deletado, j&#225; que eu chamava o m&#233;todo direto nele? A resposta est&#225; no modo como o CPython &#233; implementado, sendo uma m&#225;quina virtual de pilha.&lt;/p&gt;
&lt;p&gt;Usando o m&#243;dulo &lt;a title=&quot;Overview do dis, m&#243;dulo &quot;&gt;dis&lt;/a&gt; nessa linha, temos o seguinte resultado:&lt;/p&gt;
&lt;p&gt;0 LOAD_GLOBAL&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0 (QFile)&lt;br /&gt;
3 CALL_FUNCTION&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0&lt;br /&gt;
6 LOAD_ATTR&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1 (metaObject)&lt;br /&gt;
9 CALL_FUNCTION&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0&lt;br /&gt;
12 LOAD_ATTR&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2 (foo)&lt;br /&gt;
15 CALL_FUNCTION&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0&lt;br /&gt;
18 POP_TOP&lt;br /&gt;
19 LOAD_CONST&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0 (None)&lt;br /&gt;
22 RETURN_VALUE&lt;/p&gt;
&lt;p&gt;Dissecando instru&#231;&#227;o por instru&#231;&#227;o e seus efeitos na pilha, vamos assumir que esteja inicialmente vazia. Apenas as 4 primeiras instru&#231;&#227;o s&#227;o necess&#225;rias:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LOAD_GLOBAL (QFile) &amp;#8211; Topo da pilha &#233; a classe QFile&lt;/li&gt;
&lt;li&gt;CALL_FUNCTION &amp;#8211; Remove QFile do topo e coloca o resultado da chamada, no caso, a nova inst&#226;ncia de QFile, com refcount 1&lt;/li&gt;
&lt;li&gt;LOAD_ATTR(metaObject) &amp;#8211; Remove a inst&#226;ncia de QFile do topo (decrementa o refcount) e coloca o resultado de getattr(inst&#226;ncia, &amp;#8216;metaObject&amp;#8217;) no topo. Nesse caso, o resultado &#233; um &amp;#8220;bound method&amp;#8221; A chamada a getattr incrementa a refer&#234;ncia da inst&#226;ncia de QFile, logo ela n&#227;o morre.&lt;/li&gt;
&lt;li&gt;CALL_FUNCTION &amp;#8211; Remove o metodo metaObject do topo e coloca o resultado, no caso a inst&#226;ncia de QMetaObject retornada. Ao remover o m&#233;todo, a refer&#234;ncia &#224; inst&#226;ncia de QFile &#233; removida, chegando a 0. Ent&#227;o o destrutor do binding chama o destrutor de C++, que por sua vez deleta o objeto C++ do QMetaObject, invalidando o ponteiro usado pelo binding.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ou seja, devido essas instru&#231;&#245;es, n&#227;o se pode garantir que um objeto criado anonimamente numa chamada de metodo e usado imediatamente ir&#225; estar &amp;#8220;vivo&amp;#8221; em chamadas subsequentes.&lt;/p&gt;
&lt;p&gt;Vale notar que esse problema aparece em outras implementa&#231;&#245;es de Python baseadas no CPython, como o Stackless e o Unladen Swallow. Implementa&#231;&#245;es que usam outros tipos de m&#225;quina virtual como o Jython, IronPython e Pypy n&#227;o sofrem desse problema.&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/lauro.wordpress.com/237/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/lauro.wordpress.com/237/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/lauro.wordpress.com/237/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/lauro.wordpress.com/237/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/lauro.wordpress.com/237/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/lauro.wordpress.com/237/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/lauro.wordpress.com/237/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/lauro.wordpress.com/237/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/lauro.wordpress.com/237/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/lauro.wordpress.com/237/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=lauro.wordpress.com&amp;blog=222769&amp;post=237&amp;subd=lauro&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>lauro</name>
			<uri>http://lauro.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Lauro Moura</title>
			<subtitle type="html">Software Livre, Python, C, etc...</subtitle>
			<link rel="self" href="http://lauro.wordpress.com/feed/atom/"/>
			<id>http://lauro.wordpress.com/feed/atom/</id>
			<updated>2010-02-22T17:44:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">MongoDB e Python</title>
		<link href="http://christiano.me/2010/02/20/mongodb-e-python/"/>
		<id>http://christiano.me/?p=975</id>
		<updated>2010-02-20T19:13:27+00:00</updated>
		<content type="html">&lt;div id=&quot;HOTWordsTxt&quot; name=&quot;HOTWordsTxt&quot;&gt;&lt;p&gt;&lt;!-- noadsense --&gt;&lt;br /&gt;
Em novembro de 2009 publiquei minhas &lt;a title=&quot;Impress&#245;es sobre o CouchDB&quot; href=&quot;http://christiano.me/2009/11/26/impressoes-sobre-couchdb/&quot; target=&quot;_blank&quot;&gt;impress&#245;es sobre o CouchDB&lt;/a&gt;, j&#225; que estou desde ent&#227;o estudando banco de dados NoSQL para aplica&#231;&#245;es bem espec&#237;ficas. Permaneci por alguns meses estudando o CouchDB, que &#233; mantido pela Apache Foundation e realizei diversos testes. O banco de dados se demonstrou bem eficiente para o modelo de aplica&#231;&#227;o que estou trabalhando, no caso a performance foi bem superior ao MySQL, j&#225; que tenho um volume de informa&#231;&#245;es enorme e o fato de trabalhar com documentos &amp;#8212; para esta minha aplica&#231;&#227;o espec&#237;fica &amp;#8212; foi o que me chamou a aten&#231;&#227;o para um banco de dados estilo NoSQL.&lt;/p&gt;
&lt;p&gt;Resolvi dar uma espiadinha em outro banco de dados no mesmo estilo, o &lt;a href=&quot;http://mongodb.org&quot; target=&quot;_blank&quot;&gt;MongoDB&lt;/a&gt;. Instalei no meu ambiente e realizei os mesmos testes. No CouchDB demorei muito tempo para realizar algumas opera&#231;&#245;es simples, enquanto que no MongoDB, realizei &#160;os mesmos procedimentos de maneira mais r&#225;pida e sem me enroscar nas configura&#231;&#245;es e na manuten&#231;&#227;o do banco. Em termos de performance &amp;#8212; no caso da minha aplica&#231;&#227;o &amp;#8212; os dois bancos se mostraram praticamente iguais.&lt;/p&gt;
&lt;p&gt;Embora o CouchDB tamb&#233;m tenha bibliotecas para trabalhar em Python, a do MongoDB parece ser mais simples e direta. Pelo menos me identifiquei melhor com sua biblioteca e consegui adaptar minha aplica&#231;&#227;o rapidamente para trabalhar com o MongoDB, descartando o tempo que levei para o aprendizado e leitura das documenta&#231;&#245;es, demorei menos tempo para desenvolver um script totalmente funcional para MongoDB do que para CouchDB. Isso n&#227;o quer dizer que o CouchDB seja ruim e ainda n&#227;o tenho o volume de informa&#231;&#245;es necess&#225;rias para fazer um benchmark ou dar opini&#227;o sobre qual &#233; melhor.&lt;/p&gt;
&lt;p&gt;&#201; muito simples trabalhar em Python com o MongoDB, veja um exemplo:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;python&quot;&gt;
#!/usr/bin/python

from pymongo import Connection
import datetime

con = Connection('localhost', 27017)
db = con['teste01']

user = {&quot;nome&quot;:&quot;Fulano&quot;,
        &quot;sobrenome&quot;:&quot;de Tal&quot;,
        &quot;email&quot;:&quot;fulano@detal.net&quot;,
        &quot;data_inclusao&quot;: datetime.datetime.now()}

# Insere
users = db.users
users.insert(user)
&lt;/pre&gt;
&lt;p&gt;O c&#243;digo acima cria um banco no MongoDB (veja as &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Downloads&quot;&gt;instru&#231;&#245;es para instala&#231;&#227;o&lt;/a&gt; e veja tamb&#233;m a &lt;a href=&quot;http://api.mongodb.org/python/1.4%2B/index.html&quot;&gt;documenta&#231;&#227;o Python para MongoDB&lt;/a&gt;) e insere um registro no dict user para o banco de dados. Como o trabalho &#233; feito em um banco de dados n&#227;o relacional, n&#227;o h&#225; necessidades de definir o layout da tabela. O layout &#233; definido &#224; medida que os documentos s&#227;o definidos e &#233; flex&#237;vel, podendo ser alterada a qualquer momento. &lt;/p&gt;
&lt;p&gt;A pesquisa na base de dados pode ser feita com o seguinte c&#243;digo:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;python&quot;&gt;
#!/usr/bin/python

from pymongo import Connection

con = Connection('localhost', 27017)
db = con['teste01']

# Pesquisa um s&#243;
users = db.users
a = users.find_one({&quot;email&quot;:&quot;fulano@detal.net&quot;})
print a

# Pesquisa varios
for u in users.find():
    print u['nome'], u['email']
&lt;/pre&gt;
&lt;p&gt;Entre o CouchDB e o MongoDB eu me identifiquei mais com o segundo. Consegui fazer as tarefas de forma mais r&#225;pida e eficiente. Mas o primeiro tamb&#233;m &#233; um &#243;timo banco, merece ser estudado. Provavelmente continuarei meus estudos e desenvolvendo a pesquisa em cima do MongoDB, pois tem uma documenta&#231;&#227;o um pouco melhor e mais ferramentas para trabalhar na base de dados. &lt;/p&gt;
&lt;p&gt;O pr&#243;ximo passo &#233; integrar uma aplica&#231;&#227;o Django no MongoDB. Mas isso &#233; motivo para outro post! &lt;img src=&quot;http://christiano.me/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;/div&gt;&lt;div id=&quot;crp_related&quot;&gt;&lt;h3&gt;Leia tamb&#233;m:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://christiano.me/2009/11/26/impressoes-sobre-couchdb/&quot; rel=&quot;bookmark&quot; class=&quot;crp_title&quot;&gt;Impress&#245;es sobre CouchDB&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://christiano.me/2005/11/07/kirbybase/&quot; rel=&quot;bookmark&quot; class=&quot;crp_title&quot;&gt;KirbyBase&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://christiano.me/2008/06/04/distribuindo-tabelas-mysql-em-varios-servidores/&quot; rel=&quot;bookmark&quot; class=&quot;crp_title&quot;&gt;Distribuindo tabelas MySQL em v&#225;rios servidores&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://christiano.me/2007/10/26/mysql-ganha-melhorias-do-google/&quot; rel=&quot;bookmark&quot; class=&quot;crp_title&quot;&gt;MySQL ganha melhorias do Google&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://christiano.me/2007/12/26/utilizando-o-orm-storm/&quot; rel=&quot;bookmark&quot; class=&quot;crp_title&quot;&gt;Utilizando o ORM Storm&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Powered by &lt;a href=&quot;http://ajaydsouza.com/wordpress/plugins/contextual-related-posts/&quot;&gt;Contextual Related Posts&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</content>
		<author>
			<name>Christiano Anderson</name>
			<uri>http://christiano.me</uri>
		</author>
		<source>
			<title type="html">Christiano Anderson&#187; python</title>
			<subtitle type="html">Software Livre, Web 2.0, Programa&#231;&#227;o, Home Office e nerdisses em geral</subtitle>
			<link rel="self" href="http://christiano.me/category/python/feed/"/>
			<id>http://christiano.me/category/python/feed/</id>
			<updated>2010-03-22T02:44:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Estudando ZODB</title>
		<link href="http://pycappuccino.blogspot.com/2010/02/estudando-zodb.html"/>
		<id>tag:blogger.com,1999:blog-3425970146544581445.post-3953514361272654791</id>
		<updated>2010-02-19T18:42:49+00:00</updated>
		<content type="html">Resolvi estudar ZODB (sem Zope). O pr&#243;prio wiki de ZODB diz que ZODB trabalha independente de Zope, vamos ver.&lt;br /&gt;&lt;br /&gt;Nosso foco por enquanto &#233; Desktop (e &lt;u&gt;n&#227;o&lt;/u&gt; Web), mas nunca vi ningu&#233;m comentar algum projeto baseado em ZODB &lt;u&gt;sem&lt;/u&gt; Zope para Desktop. Ser&#225; que seria uma boa id&#233;ia?&lt;br /&gt;&lt;br /&gt;Do jeito que costumo ser meio radical, se der certo vou abandonar a minha ent&#227;o preciosa f&#243;rmula Storm-Postgres, mudando para pure-python-zodb.&lt;br /&gt;&lt;br /&gt;PS. Por enquanto s&#243; n&#227;o gostei do nome &quot;zodb&quot; porque nunca saberemos como realmente pronunciar isso, parece aquele nome transcendental &quot;GNU&quot; cuja a pron&#250;ncia, segunda as m&#225;s l&#237;nguas, s&#243; pode ser feita corretamente por Richard Stallman.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3425970146544581445-3953514361272654791?l=pycappuccino.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Eduardo Willians</name>
			<email>noreply@blogger.com</email>
			<uri>http://pycappuccino.blogspot.com/search/label/python</uri>
		</author>
		<source>
			<title type="html">PyCappuccino</title>
			<subtitle type="html">Python, Ubuntu &amp;amp; Cia da perspectiva de um jurista</subtitle>
			<link rel="self" href="http://pycappuccino.blogspot.com/feeds/posts/default/-/python"/>
			<id>tag:blogger.com,1999:blog-3425970146544581445</id>
			<updated>2010-03-22T11:44:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Hein?</title>
		<link href="http://feedproxy.google.com/~r/Fechatag/~3/AsU6r7Tsykg/"/>
		<id>http://blog.elcio.com.br/hein/</id>
		<updated>2010-02-10T20:03:21+00:00</updated>
		<content type="html">&lt;p&gt;Trecho de c&#243;digo legado (ASP) que pegamos aqui:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;prettyprint&quot;&gt;if len(request(&quot;price&quot;)) = 3 then&lt;br /&gt;
&amp;nbsp; &amp;nbsp; valorTotal = left(request(&quot;price&quot;),1)&lt;br /&gt;
elseif len(request(&quot;price&quot;)) = 4 then&lt;br /&gt;
&amp;nbsp; &amp;nbsp; valorTotal = left(request(&quot;price&quot;),2)&lt;br /&gt;
elseif len(request(&quot;price&quot;)) = 5 then&lt;br /&gt;
&amp;nbsp; &amp;nbsp; valorTotal = left(request(&quot;price&quot;),3)&lt;br /&gt;
end if&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;J&#234;nio.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/I0H5F3E65FSVMZq2ZNi6Cn0USNI/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/I0H5F3E65FSVMZq2ZNi6Cn0USNI/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/I0H5F3E65FSVMZq2ZNi6Cn0USNI/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/I0H5F3E65FSVMZq2ZNi6Cn0USNI/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/Fechatag?a=AsU6r7Tsykg:BghM-p2XyNU:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Fechatag?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Fechatag?a=AsU6r7Tsykg:BghM-p2XyNU:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Fechatag?i=AsU6r7Tsykg:BghM-p2XyNU:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Elcio Luiz Ferreira</name>
			<uri>http://blog.elcio.com.br</uri>
		</author>
		<source>
			<title type="html">fechaTag</title>
			<subtitle type="html">XML, XHTML, CSS, Tableless, Desenvolvimento Web, Python, Linux</subtitle>
			<link rel="self" href="http://blog.elcio.com.br/tag/programacao/feed/"/>
			<id>http://blog.elcio.com.br/tag/programacao/feed/</id>
			<updated>2010-03-17T17:44:18+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">O Tal Banco de Dados Relacional</title>
		<link href="http://pycappuccino.blogspot.com/2010/02/o-tal-banco-de-dados-relacional.html"/>
		<id>tag:blogger.com,1999:blog-3425970146544581445.post-6639678649952563726</id>
		<updated>2010-02-10T11:17:08+00:00</updated>
		<content type="html">Acreditem eu s&#243; entendi o que deveras era um BD relacional quando tentei montar um BD orientado a objetos.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/_kJTYhCuiJy8/S3KjvYmYiII/AAAAAAAADxU/VEvrj_pw6DE/s1600-h/pg.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;http://2.bp.blogspot.com/_kJTYhCuiJy8/S3KjvYmYiII/AAAAAAAADxU/VEvrj_pw6DE/s200/pg.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Em algumas horas livres rascunhei na mente o projeto de BD orientado a objetos. Um dia sentei e fiz a modelagem de dados come&#231;ando por Python, usando Storm. At&#233; a&#237; perfeito: a classe pai ia dando o rumo aos filhos que al&#233;m de necessariamente herdar os atributos do pai criavam outros filhos ou se relacionavam com outros filhos numa hierarquia angelical.&lt;br /&gt;&lt;br /&gt;Legal. Passei para o Postgres. Da&#237; o primeiro problema: as tabelas-filho estranhamente herdavam fisicamente as colunas da tabela-pai. Beleza, esqueci que tem esse detalhe. Mas n&#227;o muda muito as coisas. Em seguida as &quot;tabelas-filhas-netas&quot; (herdavam da tabela pai e filho) se relacionavam com a segunda gera&#231;&#227;o e tudo mais.&lt;br /&gt;&lt;br /&gt;Tudo sincronizado em python-storm. Vamos para os testes e... saltam resultados estranh&#237;ssimos.&lt;br /&gt;&lt;br /&gt;..:|:.. A chave prim&#225;ria da classe pai fora francamente violada sem que o Postgres reclamasse. Hmm... Teria feito alguma coisa errada? Reviso as restri&#231;&#245;es. Tudo certo. Como os Postgres havia aceitado aquilo?&lt;br /&gt;&lt;br /&gt;..:|:.. Dados inconsistentes, as restri&#231;&#245;es haviam sido sumariamente ignoradas.&lt;br /&gt;&lt;br /&gt;..:|:.. O pr&#243;prio BD obrigava os dados a serem inconsistentes. Se tentasse consertar manualmente os problemas das chaves prim&#225;rias e estrangeiras, o BD impunha novos dados inconsistentes. Que loucura era aquela?&lt;br /&gt;&lt;br /&gt;O que estaria errado ent&#227;o? Fui ao Google e finalmente encontrei a chave-prim&#225;ria da quest&#227;o: o Postgres &#233; relacional e tentar faz&#234;-lo orientado a objetos &#233; amplamente desencorajado.&lt;br /&gt;&lt;br /&gt;O ne&#501;ocio &#233; que o que eu considerava inconsistente &lt;u&gt;n&#227;o&lt;/u&gt; era assim t&#227;o inconsistente, apenas que havia uma meia l&#243;gica objeto-relacional que justificava aqueles dados.&lt;br /&gt;&lt;br /&gt;Final das contas: Usando um BD relacional seja apenas relacional, que funciona muito bem. A prop&#243;sito, a id&#233;ia de OO &#233; &#243;tima, mas &lt;u&gt;n&#227;o&lt;/u&gt; &#233; tudo.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3425970146544581445-6639678649952563726?l=pycappuccino.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Eduardo Willians</name>
			<email>noreply@blogger.com</email>
			<uri>http://pycappuccino.blogspot.com/search/label/python</uri>
		</author>
		<source>
			<title type="html">PyCappuccino</title>
			<subtitle type="html">Python, Ubuntu &amp;amp; Cia da perspectiva de um jurista</subtitle>
			<link rel="self" href="http://pycappuccino.blogspot.com/feeds/posts/default/-/python"/>
			<id>tag:blogger.com,1999:blog-3425970146544581445</id>
			<updated>2010-03-22T11:44:07+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Single-Person Pair Programming</title>
		<link href="http://www.ricbit.com/2010/02/single-person-pair-programming.html"/>
		<id>tag:blogger.com,1999:blog-6306509703738480474.post-1258845451433215472</id>
		<updated>2010-02-07T18:16:00+00:00</updated>
		<content type="html">Dia desses me perguntaram no &lt;a href=&quot;http://twitter.com/ricbit&quot;&gt;twitter&lt;/a&gt; o que eu achava de &lt;a href=&quot;http://en.wikipedia.org/wiki/Pair_programming&quot;&gt;Pair programming&lt;/a&gt;. N&#227;o apenas eu gosto, como sou entusiasta! Pair programming tem um monte de vantagens, sendo que a principal delas &#233; que o programa ser&#225; escrito com dois pares de olhos. E como nos lembra a &lt;strike&gt;Lei do Beholder&lt;/strike&gt;&amp;nbsp;Lei de Linus:&amp;nbsp;&lt;i&gt;dados olhos suficientes, todos os bugs s&#227;o f&#225;ceis&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://www.ricbit.com/uploaded_images/monstros-736960.jpg&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.ricbit.com/uploaded_images/monstros-736932.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Minha t&#233;cnica predileta de pair programming &#233; o &lt;i&gt;Ping-Pong Pair Programming&lt;/i&gt;, que eu aprendi com o &lt;a href=&quot;http://misko.hevery.com/&quot;&gt;Mi&#353;ko&lt;/a&gt;. A id&#233;ia &#233; mesclar as id&#233;ias do pair programming com o &lt;a href=&quot;http://en.wikipedia.org/wiki/Test-driven_development&quot;&gt;test-driven development&lt;/a&gt;. Voc&#234; come&#231;a colocando dois teclados no computador, a&#237; um parceiro escreve um teste, e o outro escreve o c&#243;digo que faz aquele teste passar. A vantagem desse m&#233;todo &#233; que funciona mesmo se um dos programadores for pregui&#231;oso, e, de fato, funciona at&#233; melhor assim!&lt;br /&gt;&lt;br /&gt;Por exemplo, vamos supor que Alice e Bob querem escrever um programa bem simples: uma fun&#231;&#227;o que incrementa um n&#250;mero. Digamos que a assinatura dessa fun&#231;&#227;o ser&#225; int increment(int value). Alice escreve um teste que valida essa fun&#231;&#227;o:&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;void teste1() {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;nbsp;&amp;nbsp;assertEquals(2, increment(1));&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Um teste bem razo&#225;vel. Se entrar um, tem que sair dois. Agora Bob vai escrever o c&#243;digo que faz esse teste passar:&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;int increment(int value) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;nbsp;&amp;nbsp;return 2;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;FAIL? O Bob &#233; um cara pregui&#231;oso, ent&#227;o ele escreveu um c&#243;digo que sempre retorna dois. Isso faz o teste passar, mas n&#227;o era isso que a Alice tinha em mente!&lt;br /&gt;&lt;br /&gt;Surpreendentemente, essa &#233; a vantagem do ping-pong. Suponha que esse teste fosse o &#250;nico teste que o c&#243;digo tinha. Agora digamos que algu&#233;m, anos depois, foi &lt;a href=&quot;http://en.wikipedia.org/wiki/Code_refactoring&quot;&gt;refatorar&lt;/a&gt; o c&#243;digo, mas fez uma bobagem no processo e agora a fun&#231;&#227;o que incrementa um n&#250;mero est&#225; retornando sempre 2. Nesse caso, o teste n&#227;o vai detectar o erro!&lt;br /&gt;&lt;br /&gt;A conclus&#227;o &#233; que o teste inicial n&#227;o era robusto o suficiente. Pra melhorar isso, Alice escreve um segundo teste:&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;void teste2() {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;nbsp;&amp;nbsp;assertEquals(3, increment(2));&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora o c&#243;digo original do Bob n&#227;o funciona, e ele precisa refatorar pra criar um c&#243;digo que passe os dois testes:&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;int increment(int value) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;nbsp;&amp;nbsp;if (value == 1)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 2;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;nbsp;&amp;nbsp;else&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 3;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;E agora, FAIL? N&#227;o h&#225; d&#250;vidas de que o conjunto com dois testes &#233; mais robusto que apenas o primeiro teste, mas esse processo n&#227;o parece pr&#225;tico. Afinal, os dois poderiam ficar no ping-pong at&#233; exaurir todos os valores do int, o que levaria um bocado de tempo.&lt;br /&gt;&lt;br /&gt;Mas isso n&#227;o acontece! Como sabemos, o Bob &#233; pregui&#231;oso. Na verdade, ele &#233; t&#227;o pregui&#231;oso, que atingiu o n&#237;vel supremo da pregui&#231;a: a meta-pregui&#231;a. O Bob sabe que se ele continuar nesse ping-pong, ele vai ficar trabalhando at&#233; depois das seis, e ele quer ir pra casa ver a novela. Se a Alice escrever testes o suficiente, ela vai acabar &lt;i&gt;for&#231;ando&lt;/i&gt; o Bob a escrever o c&#243;digo correto, porque &#233; o c&#243;digo mais simples que resolve o problema.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;void teste3() {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;nbsp;&amp;nbsp;assertEquals(4, increment(3));&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;int increment(int value) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;nbsp;&amp;nbsp;return value + 1;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora sim! O resultado final &#233; duplamente bom, n&#243;s temos um conjunto de testes robustos, e um c&#243;digo que &#233; o mais simples poss&#237;vel (o que &#233; sempre uma vantagem, esse c&#243;digo &#233; o mais f&#225;cil de entender, tem o menor custo de manuten&#231;&#227;o, etc.)&lt;br /&gt;&lt;br /&gt;Esse m&#233;todo me fascinou por dois motivos. Primeiro, ele &#233; uma aplica&#231;&#227;o da&amp;nbsp;&lt;a href=&quot;http://en.wikipedia.org/wiki/Occam's_razor&quot;&gt;Navalha de Occam&lt;/a&gt; em software: voc&#234; parte de uma s&#233;rie de observa&#231;&#245;es e deduz a teoria mais simples que modela o sistema. Segundo,&amp;nbsp;o m&#233;todo &#233; um indicativo de que &#233; poss&#237;vel fazer um conjunto de testes que &lt;i&gt;define&lt;/i&gt; a opera&#231;&#227;o em quest&#227;o.&lt;br /&gt;&lt;br /&gt;Juntando as duas observa&#231;&#245;es, a pergunta natural que faz &#233;: pra que eu preciso do Bob? Eu poderia construir uma m&#225;quina que, dado um conjunto de testes, encontre o programa mais simples que os satisfa&#231;am. Se a m&#225;quina conseguir jogar o ping-pong de maneira &#243;tima, ent&#227;o acabamos de inventar o Single-Person Pair Programming!&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://www.ricbit.com/uploaded_images/ping-pong-766413.jpg&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.ricbit.com/uploaded_images/ping-pong-766386.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Antes de tentar resolver esse problema, precisamos escolher alguma defini&#231;&#227;o para &quot;programa mais simples&quot;. Por exemplo, vamos escolher que o programa mais simples &#233; o menor programa que resolve o problema. Uma maneira de achar esse programa &#233; fazer um brute force: basta testar todos os programas poss&#237;veis!&lt;br /&gt;&lt;br /&gt;Isso &#233; f&#225;cil de visualizar em assembly. O conjunto de opcodes do processador &#233; limitado, ent&#227;o a quantidade de programas em assembly com um &#250;nico opcode &#233; finito. Eu testo todos eles pra ver se algum satisfaz os testes: se algum passar, ele &#233; a solu&#231;&#227;o, sen&#227;o, eu repito o procedimento com todos os programas de tamanho dois, e assim por diante. Esse algoritmo garantidamente acha o menor programa que satisfaz os testes.&lt;br /&gt;&lt;br /&gt;Um problema te&#243;rico com essa abordagem &#233; que ela est&#225; sujeita ao problema da parada de Turing. Eventualmente, algum desses programas que voc&#234; est&#225; testando pode entrar num loop infinito e voc&#234; n&#227;o tem como detectar isso. Uma solu&#231;&#227;o &#233; sair pela tangente: a maioria dos problemas da vida real podem ser resolvidos com modelos computacionais mais fracos que a m&#225;quina de Turing. Em assembly, n&#243;s poder&#237;amos proibir os saltos pra tr&#225;s, o que resolve essa limita&#231;&#227;o.&lt;br /&gt;&lt;br /&gt;Essa t&#233;cnica para achar o programa m&#237;nimo se chama &lt;a href=&quot;http://en.wikipedia.org/wiki/Superoptimization&quot;&gt;Superotimiza&#231;&#227;o&lt;/a&gt;, e hoje em dia h&#225; v&#225;rios papers sobre o assunto. Em 2003 eu escrevi um superotimizador para assembly Z80, ent&#227;o foi f&#225;cil adapt&#225;-lo para fazer Single-person Pair Programming.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.ricbit.com/code/singleppp.c&quot;&gt;Single-person Pair Programming escrito em C&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vamos testar. Se eu tenho um &#250;nico teste, 1-&amp;gt;2, o programa acha tr&#234;s solu&#231;&#245;es m&#237;nimas, sendo uma delas ADD&amp;nbsp;A,A. &#201; claro, com esse &#250;nico teste, ele n&#227;o sabe se estamos somando um ou multiplicando por dois. Colocando dois testes, 1-&amp;gt;2 e 2-&amp;gt;3, ele j&#225; converge para a solu&#231;&#227;o &#250;nica INC&amp;nbsp;A.&lt;br /&gt;&lt;br /&gt;Complicando: e se quisermos um incremento m&#243;dulo 8 (ou seja, a=(a+1)%8)? Podemos definir isso com os testes 1-&amp;gt;2, 2-&amp;gt;3 e 7-&amp;gt;0. Colocando essa suite no programa, temos o resultado abaixo:&lt;br /&gt;&lt;br /&gt;INC A&lt;br /&gt;AND 7&lt;br /&gt;&lt;br /&gt;Ou seja, o Single-person Pair Programming funciona direitinho!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;B&#244;nus!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;O vencedor do Ricbit Jam #1 foi o &lt;b&gt;Davi Costa&lt;/b&gt;, parab&#233;ns! Por uma quest&#227;o de log&#237;stica que envolve a China eu ainda n&#227;o tive como compilar os resultados, mas fiquem de olho l&#225; no meu twitter que em breve eu farei uma p&#225;gina com solu&#231;&#245;es e coment&#225;rios.&lt;div class=&quot;blogger-post-footer&quot;&gt;
&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/6306509703738480474-1258845451433215472?l=www.ricbit.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Ricardo Bittencourt</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.ricbit.com/</uri>
		</author>
		<source>
			<title type="html">Brain Dump</title>
			<subtitle type="html">O que est&#225; passando pela cabe&#231;a do Ricbit no momento.</subtitle>
			<link rel="self" href="http://www.ricbit.com/rss.xml"/>
			<id>tag:blogger.com,1999:blog-6306509703738480474</id>
			<updated>2010-03-11T16:44:41+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Exportando MySQL para CSV</title>
		<link href="http://feedproxy.google.com/~r/Fechatag/~3/O_xW-qka5Bs/"/>
		<id>http://blog.elcio.com.br/exportando-mysql-para-csv/</id>
		<updated>2010-02-04T18:14:18+00:00</updated>
		<content type="html">&lt;p&gt;Criei agora um pequeno script para resolver um problema meu, um exportador de base de dados MySQL para arquivos CSV. Resolvi compartilhar:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://github.com/elcio/mysql2csv&quot;&gt;MySQL2CSV&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Para baixar, voc&#234; vai precisar do git. No Ubuntu, para instalar, fa&#231;a:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;prettyprint&quot;&gt;$ sudo apt-get install git-core&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Depois, para baixar:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;prettyprint&quot;&gt;$ git clone git@github.com:elcio/mysql2csv.git&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Isso vai criar a pasta mysql2csv, com o script dentro. Voc&#234; pode copi&#225;-lo para a pasta /usr/local/bin/ e dar permiss&#227;o de execu&#231;&#227;o se for usar com muita freq&#252;&#234;ncia:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;prettyprint&quot;&gt;$ cd mysql2csv&lt;br /&gt;
$ sudo cp mysql2csv.py /usr/local/bin/mysql2csv&lt;br /&gt;
$ sudo chmod +x /usr/local/bin/mysql2csv&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Se fizer isso, vai poder chamar, em qualquer diret&#243;rio:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;prettyprint&quot;&gt;$ mysql2csv host user passwd dbname&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/XK4SAEK_1FissOnHHYHeTxpA92g/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/XK4SAEK_1FissOnHHYHeTxpA92g/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/XK4SAEK_1FissOnHHYHeTxpA92g/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/XK4SAEK_1FissOnHHYHeTxpA92g/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/Fechatag?a=O_xW-qka5Bs:tJZd9TluVeY:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Fechatag?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Fechatag?a=O_xW-qka5Bs:tJZd9TluVeY:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Fechatag?i=O_xW-qka5Bs:tJZd9TluVeY:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Elcio Luiz Ferreira</name>
			<uri>http://blog.elcio.com.br</uri>
		</author>
		<source>
			<title type="html">fechaTag</title>
			<subtitle type="html">XML, XHTML, CSS, Tableless, Desenvolvimento Web, Python, Linux</subtitle>
			<link rel="self" href="http://blog.elcio.com.br/tag/programacao/feed/"/>
			<id>http://blog.elcio.com.br/tag/programacao/feed/</id>
			<updated>2010-03-17T17:44:18+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Rodando comandos do sistema operacional com cache no Python</title>
		<link href="http://feedproxy.google.com/~r/Fechatag/~3/JQii8UCu4zM/"/>
		<id>http://blog.elcio.com.br/rodando-comandos-do-sistema-operacional-com-cache-no-python/</id>
		<updated>2010-02-01T16:41:00+00:00</updated>
		<content type="html">&lt;p&gt;C&#243;digo simples, mas que pode ser &#250;til para algu&#233;m n&#227;o ter que escrev&#234;-lo de novo (arquivo runcached.py):&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;prettyprint&quot;&gt;import os,time&lt;br /&gt;
cachepath='cache'&lt;br /&gt;
timeout=360&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
def runcached(cmd):&lt;br /&gt;
&amp;nbsp; filename=os.path.join(cachepath,str(hash(cmd)))&lt;br /&gt;
&amp;nbsp; if os.path.isfile(filename):&lt;br /&gt;
&amp;nbsp; &amp;nbsp; if time.time()-os.path.getmtime(filename)&amp;lt;timeout:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; return open(filename).read()&lt;br /&gt;
&amp;nbsp; t=os.popen(cmd).read()&lt;br /&gt;
&amp;nbsp; open(filename,'w').write(t)&lt;br /&gt;
&amp;nbsp; return t&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;A fun&#231;&#227;o runcached roda comandos do sistema operacional, e faz cache do resultado por 6 minutos. Para alterar o tempo do cache, basta mudar a vari&#225;vel timeout. Por exemplo, para cachear por 10 horas:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;prettyprint&quot;&gt;import runcached&lt;br /&gt;
runcached.timeout=36000&lt;br /&gt;
r=runcached('lynx --source http://www.tableless.com.br')&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/Z1lzotjaD19si1lRN5I1GodyOX4/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/Z1lzotjaD19si1lRN5I1GodyOX4/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/Z1lzotjaD19si1lRN5I1GodyOX4/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/Z1lzotjaD19si1lRN5I1GodyOX4/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/Fechatag?a=JQii8UCu4zM:bZfqvXUrKdY:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Fechatag?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Fechatag?a=JQii8UCu4zM:bZfqvXUrKdY:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Fechatag?i=JQii8UCu4zM:bZfqvXUrKdY:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Elcio Luiz Ferreira</name>
			<uri>http://blog.elcio.com.br</uri>
		</author>
		<source>
			<title type="html">fechaTag</title>
			<subtitle type="html">XML, XHTML, CSS, Tableless, Desenvolvimento Web, Python, Linux</subtitle>
			<link rel="self" href="http://blog.elcio.com.br/tag/programacao/feed/"/>
			<id>http://blog.elcio.com.br/tag/programacao/feed/</id>
			<updated>2010-03-17T17:44:18+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">MRNN Brasil &amp;#8211; Para discuss&#227;o de solu&#231;&#245;es MRNN ( N1NF &amp;#124; NoSQL &amp;#8211; NotOnlySQL )</title>
		<link href="http://techberto.wordpress.com/2010/01/31/mrnn-brasil-para-discussao-de-solucoes-mrnn-n1nf-nosql-notonlysql/"/>
		<id>http://techberto.wordpress.com/?p=198</id>
		<updated>2010-01-31T17:18:28+00:00</updated>
		<content type="html">&lt;p&gt;Apesar de extremamente prazeroso (ou &#224;s vezes nem tanto) acompanhar mailists e foruns nem sempre &#233; tarefa f&#225;cil, seja pelo rumo que certas discuss&#245;es geram, pela falta de tempo &#160;ou &#224;s vezes pela quest&#227;o do foco. Acredito eu, que eventualmente todos v&#234;em um assunto que &#233; meio (ou inteiramente) off-topic sendo tratado com certo pudor, mas que voc&#234; gostaria que a discuss&#227;o evolu&#237;sse mas a pr&#243;pria lista e a netiqueta n&#227;o permite.&lt;/p&gt;
&lt;p&gt;Alguns dizem que a rela&#231;&#227;o entre arquiteto e programador &#233; de confian&#231;a e compreens&#227;o, arquitetos n&#227;o confiam em programadores e estes n&#227;o compreendem os arquitetos!&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-198&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Esta afirma&#231;&#227;o pode parecer exagerada (como de fato &#233;) mas recentemente identifiquei exatamente esta situa&#231;&#227;o numa reuni&#227;o onde o foco era NoSQL, atritos &#224; parte, na hora pensei que este &#233; um assunto que merece ser profundamente e adequadamente discutido e difundido e ver ele restrito a censura ou limite dos off topics era algo cruel, e isto me fez lembrar de algumas conversas que tive, sendo uma delas com o &lt;a href=&quot;http://blog.pedro.lamarao.nom.br/&quot; target=&quot;_blank&quot;&gt;Pedro Lamar&#227;o&lt;/a&gt; (figura carimbada do grupo C &amp;amp; C++ Brasil) num happy hour e outra com o &lt;a title=&quot;Jack Ganssle&quot; href=&quot;http://www.ganssle.com/bio.htm&quot; target=&quot;_blank&quot;&gt;Jack Ganssle&lt;/a&gt; (quando ele esteve no Brasil para o workshop que o &lt;a href=&quot;http://www.embarcados.com.br/&quot; target=&quot;_blank&quot;&gt;Portal Embarcados&lt;/a&gt; promoveu sobre Engenharia de Software) no qual o foco de ambas conversas foi o est&#237;mulo e a iniciativa. Pra ser sincero, foi com este foco que convidamos o &lt;a href=&quot;http://felipetonello.com/blog/&quot; target=&quot;_blank&quot;&gt;Felipe Tonello &lt;/a&gt; para palestrar no &lt;a href=&quot;http://www.ccppbrasil.org/wiki/Grupo:Encontro_VI&quot; target=&quot;_blank&quot;&gt;VI Encontro de Programadores do grupo C &amp;amp; C++ Brasil&lt;/a&gt; (que vai ocorrer no pr&#243;ximo s&#225;bado dia 06/02/2010) para falar sobre seu projeto RoboQT, &#233; com esta abordagem em mente pensei que era necess&#225;rios fazer algo em rala&#231;&#227;o ao NoSQL&amp;#8230;&lt;/p&gt;
&lt;p&gt;Como muitos sabem:&lt;/p&gt;
&lt;p&gt;DBMS != SQL&lt;br /&gt;
SQL != Evil&lt;br /&gt;
NoSQL != Para&#237;so&lt;/p&gt;
&lt;p&gt;Para aqueles que apreciam o assunto e desejam discuti-los sem a&#160;preocupa&#231;&#227;o de criar &amp;#8220;OFF TOPICS&amp;#8221;, com o&#160; prop&#243;sito de criar um canal&lt;br /&gt;
independente (de linguagens de programa&#231;&#227;o e DBMS) destinada para a&#160;discuss&#227;o de Banco (n&#227;o bando) de Dados n&#227;o relacionais -&#160;NF&#178;, NF2,&#160;N1NF (non first normal form) , MRNN (Modelo Relacional&#160;N&#227;o-Normalizado) tamb&#233;m conhecidos como nested relational,&#160;dimensional, multivalue, free-form, schemaless por&#233;m mais populares&#160;como NoSQL (Not Only SQL) criei a&#160;lista MRNN-Brasil:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://groups.google.com/group/MRNN-Brasil&quot; target=&quot;_blank&quot;&gt;http://groups.google.com/group/MRNN-Brasil&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;O foco &#233; tratar o assunto sem pudores de abordagens acad&#234;micas,&lt;br /&gt;
profissionais ou produtos podendo ser tratado tanto BigTable (???),&lt;br /&gt;
Dynomite, Riak, Cassandra, CouchDB, &#160;HBase, Sherpa, Voldemort, Tokyo&lt;br /&gt;
Cabinet, MongoDB como as bibliotecas das mais diversas linguagens, sejam elas C, C++, Python, ERlang, Go, Haskell, Ruby, Brainfuck ou Whitespace ou at&#233; novas iniciativas; seja do ponto de vista de arquitetura, programa&#231;&#227;o, seguran&#231;a ou o que for, mas obviamente relacionado com MRNNs.&lt;/p&gt;
&lt;p&gt;Talvez eu n&#227;o tenha procurado direito, mas como eu n&#227;o havia encontrado nada semelhante em Pt-BR, resolvi tomar esta iniciativa.&lt;/p&gt;
&lt;p&gt;A escolha de um nome do vern&#225;culo foi em raz&#227;o de que NoSQL n&#227;o&#160;intui muito para o que ele realmente representa (Not Only SQL) e esta N&#195;O&#160;&#233; uma lista n&#227;o para aqueles que relacionam SQL com algo do mal e&#160;NoSQL d&#225; impress&#227;o de ser &#160;uma campanha anti-SQL; mesmo que no fundo esta&#160;&amp;#8221;buzzword&amp;#8221; n&#227;o (?!?!) signifique &#160;isto e ap&#243;s est&#237;mulo (indireto) do &lt;a href=&quot;http://blog.ramgarlic.com/&quot; target=&quot;_blank&quot;&gt;Luciano Ramalho&lt;/a&gt; (que &#233; um entusiasta do assunto tanto quanto ele &#233; de Python) acabei adotando o nome MRNN-Brasil ao inv&#233;s de NoSQL-Brasil.&lt;/p&gt;
&lt;p&gt;Espero que &#160;iniciativa possa ser &#250;til para a comunidade.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/techberto.wordpress.com/198/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/techberto.wordpress.com/198/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/techberto.wordpress.com/198/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/techberto.wordpress.com/198/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/techberto.wordpress.com/198/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/techberto.wordpress.com/198/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/techberto.wordpress.com/198/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/techberto.wordpress.com/198/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/techberto.wordpress.com/198/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/techberto.wordpress.com/198/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=techberto.wordpress.com&amp;blog=400569&amp;post=198&amp;subd=techberto&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>techberto</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">SciTech::Inno::Blog</title>
			<subtitle type="html">Ci&#234;ncia, tecnologia, programa&#231;&#227;o, m&#250;sica e insights geeks do meu herm&#233;tico box nervoso...</subtitle>
			<link rel="self" href="http://techberto.wordpress.com/feed/atom/"/>
			<id>http://techberto.wordpress.com/feed/atom/</id>
			<updated>2010-03-08T02:44:23+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Livro Python para Desenvolvedores &#8211; Baixe a segunda vers&#227;o</title>
		<link href="http://christiano.me/2010/01/26/livro-python-para-desenvolvedores-baixe-a-segunda-versao/"/>
		<id>http://christiano.blog.br/?p=955</id>
		<updated>2010-01-26T15:52:20+00:00</updated>
		<content type="html">&lt;div id=&quot;HOTWordsTxt&quot; name=&quot;HOTWordsTxt&quot;&gt;&lt;p&gt;N&#227;o posso deixar de divulgar a grande iniciativa do &lt;a href=&quot;http://ark4n.wordpress.com/&quot; target=&quot;_blank&quot;&gt;Luiz Eduardo Borges&lt;/a&gt; em disponibilizar a segunda vers&#227;o do livro Python para Desenvolvedores sob licen&#231;a Creative Commons. Ainda n&#227;o li todo o livro, mas pelo &#237;ndice j&#225; d&#225; para perceber que &#233; um grande material, leitura indispens&#225;vel para programadores de outras linguagens que desejam conhecer Python ou at&#233; mesmo programadores Python que desejam aperfei&#231;oar seus conhecimentos.&lt;/p&gt;
&lt;p&gt;Uma leitura t&#233;cnica como esta, al&#233;m de revigorante &#233; bastante inspiradora. Por mais experi&#234;ncia que algu&#233;m tenha sobre uma determinada tecnologia, ao ler um &#243;timo material como este, &#233; poss&#237;vel aprender novas t&#233;cnicas ou melhorar procedimentos j&#225; utilizados. Ent&#227;o vale muito a leitura, al&#233;m de tudo est&#225; sob licen&#231;a CC.&lt;/p&gt;
&lt;p&gt;O download do livro pode ser feito na p&#225;gina &lt;a href=&quot;http://ark4n.wordpress.com/python/&quot; target=&quot;_blank&quot;&gt;Python para Desenvolvedores&lt;/a&gt; no pr&#243;prio site do Ark4n ou se tiver alguma dificuldade no download, fiz um mirror do livro. &lt;a href=&quot;http://christiano.blog.br/downloads/python_para_desenvolvedores_2ed.pdf&quot;&gt;Clique aqui para baixar do mirror&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;div id=&quot;crp_related&quot;&gt;&lt;h3&gt;Leia tamb&#233;m:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://christiano.me/2007/12/07/segunda-alfa-da-versao-30-do-python-disponivel/&quot; rel=&quot;bookmark&quot; class=&quot;crp_title&quot;&gt;Segunda alfa da vers&#227;o 3.0 do Python dispon&#237;vel&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://christiano.me/2006/03/26/livro-de-ruby/&quot; rel=&quot;bookmark&quot; class=&quot;crp_title&quot;&gt;Livro de Ruby&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://christiano.me/2007/03/12/expressoes-regulares-uma-abordagem-divertida/&quot; rel=&quot;bookmark&quot; class=&quot;crp_title&quot;&gt;Express&#245;es Regulares &amp;#8211; Uma abordagem divertida&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://christiano.me/2007/12/13/livro-the-definitive-guide-to-django/&quot; rel=&quot;bookmark&quot; class=&quot;crp_title&quot;&gt;Livro The Definitive Guide to Django&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://christiano.me/2008/04/11/shell-script-profissional-livro/&quot; rel=&quot;bookmark&quot; class=&quot;crp_title&quot;&gt;Shell Script Profissional &amp;#8211; Livro&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Powered by &lt;a href=&quot;http://ajaydsouza.com/wordpress/plugins/contextual-related-posts/&quot;&gt;Contextual Related Posts&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</content>
		<author>
			<name>Christiano Anderson</name>
			<uri>http://christiano.me</uri>
		</author>
		<source>
			<title type="html">Christiano Anderson&#187; python</title>
			<subtitle type="html">Software Livre, Web 2.0, Programa&#231;&#227;o, Home Office e nerdisses em geral</subtitle>
			<link rel="self" href="http://christiano.me/category/python/feed/"/>
			<id>http://christiano.me/category/python/feed/</id>
			<updated>2010-03-22T02:44:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Luminesc&#234;ncia, meu tio Jos&#233; e Avatar</title>
		<link href="http://techberto.wordpress.com/2010/01/25/luminescencia-meu-tio-jose-e-avatar/"/>
		<id>http://techberto.wordpress.com/?p=190</id>
		<updated>2010-01-25T19:52:56+00:00</updated>
		<content type="html">&lt;p&gt;Final de ano, num rancho a beira-rio, curtindo o feriad&#227;o com a fam&#237;lia, meus primos tiveram a id&#233;ia de fazer uma festa (que para minha surpresa havia sido&lt;img class=&quot;alignright&quot; title=&quot;Lightstick&quot; src=&quot;http://images.quebarato.com.br/photos/big/E/B/3792EB_4.jpg&quot; alt=&quot;&quot; width=&quot;320&quot; height=&quot;320&quot; /&gt; preparada com boa anteced&#234;ncia) com direito a v&#225;rios badulaques e inclusive com &lt;a href=&quot;http://en.wikipedia.org/wiki/Glowstick&quot; target=&quot;_blank&quot;&gt;lightsticks&lt;/a&gt; (&#224; volont&#233; como diria os franceses ou &#224; la vont&#233; como n&#243;s abrasileiramos e gostamos de dizer)&#160;que sempre d&#225; um tom alegre a festas noturnas e sempre leva a crian&#231;ada (e inclusive v&#225;rios marmanjos) a brincar diante das l&#226;mpadas ultra-violetas, devido aos agrad&#225;veis efeitos visuais que tal combina&#231;&#227;o produz, sendo sempre um bom elemento para complementar a divers&#227;o.&lt;/p&gt;
&lt;p&gt;Ap&#243;s a festa e em momento oportuno, meu s&#225;bio tio Jos&#233;, que tem uma curiosidade que eu muito aprecio, &#160;me fez a seguinte pergunta:&lt;/p&gt;
&lt;p&gt;- O que faz estas pulseiras brilharem?&#160;Elas s&#227;o realmente de neon?&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-190&quot;&gt;&lt;/span&gt;Estes s&#227;o um daqueles momentos que voc&#234; sente imenso prazer, afinal perguntaram algo do que eu sabia responder e pelo qual naquele momento eu estava pensando por raz&#245;es que voc&#234;s ir&#227;o descobrir abaixo. &#160;Sem contar que com certas pessoas &#233; sempre prazeiroso compartilhar um pouco de erudi&#231;&#227;o &#160;ou como alguns preferem chamar, um pouco de cultura in&#250;til para desopilar o f&#237;gado; apesar que se tratando de cultura eu nunca a acho in&#250;til, mesmo que seja para filosofar sobre o &#160;bater de asas das borboletas &#160;do ponto de vista entomol&#243;gico, neural, da f&#237;sica tratando da teoria do caos, da perspectiva cinematogr&#225;fica comentando sobre criativo filme &amp;#8220;&lt;em&gt;&lt;strong&gt;efeito borboleta&lt;/strong&gt;&lt;/em&gt;&amp;#8221; ou po&#233;tico lembrando por exemplo da famosa pretens&#227;o de Mhuammad Ali de &amp;#8220;&lt;em&gt;&lt;strong&gt;float like a butterfly, sting like a bee&lt;/strong&gt;&lt;/em&gt;&amp;#8220;. Mas dependendo do contexto isto pode ser um porre para quem est&#225; participando e ningu&#233;m gosta de ser desagrad&#225;vel, mas este n&#227;o era o caso.&lt;/p&gt;
&lt;p&gt;O neon &#233; um g&#225;s nobre incolor, abundante no universo, mas presente em pequena quantidade no ar atmosf&#233;rico, ele foi descoberto pelos qu&#237;micos brit&#226;nicos &lt;em&gt;&lt;strong&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Morris_Travers&quot; target=&quot;_blank&quot;&gt;Morris Travers&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt; (que eu sempre confundo com Tavares) e &lt;strong&gt;&lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/William_Ramsay&quot; target=&quot;_blank&quot;&gt;William Ramsay&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt; no s&#233;culo 19, os mesmos que descobriram o g&#225;s xen&#244;nio e o&#160;cript&#244;nio; &#160;que apesar do nome &lt;a href=&quot;http://en.wikipedia.org/wiki/Krypton&quot; target=&quot;_blank&quot;&gt;krypton&lt;/a&gt; nada tem a ver com a saga de Kal-EL.&lt;/p&gt;
&lt;p&gt;Segundo g&#225;s nobre mais leve, com um alto poder de refrigera&#231;&#227;o, 40 vezes maior que do h&#233;lio l&#237;quido e tr&#234;s vezes maior que o hidrog&#234;nio l&#237;quido, ele&#160;&lt;strong&gt;n&#227;o est&#225; presente no light-stick&lt;/strong&gt;&lt;strong&gt;!!!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A tradu&#231;&#227;o de ligh-stick &#233; &amp;#8220;bast&#227;o luminoso&amp;#8221;, mas sei l&#225; por que cargas d&amp;#8217;&#225;gua&#160;(talvez pela mesma raz&#227;o que vulgarizaram a express&#227;o francesa &lt;em&gt;&lt;strong&gt;&#224; volont&#233;&lt;/strong&gt;&lt;/em&gt; para &lt;strong&gt;&lt;em&gt; &#224; la vont&#233;&lt;/em&gt;&lt;/strong&gt;) o mercado abrasileirou &#160;o nome para&#160;bast&#227;o de neon ou pulseira de neon, &#160;devido a sutil semelhan&#231;a com as l&#226;mpadas de neon, por&#233;m n&#227;o &#233; o g&#225;s nobre o respons&#225;vel pela fonte de energia luminosa deste artefato, mas sim uma rea&#231;&#227;o que ocorre com o &lt;a href=&quot;http://en.wikipedia.org/wiki/Cyalume&quot; target=&quot;_blank&quot;&gt;cyalume&lt;/a&gt; (que est&#225; no bast&#227;o) similar e mais barato que&#160;ao &lt;a href=&quot;http://en.wikipedia.org/wiki/Luminol&quot; target=&quot;_blank&quot;&gt;luminol&lt;/a&gt;. No caso do luminol, ele reage com cobre e ferro, e como h&#225; ferro na hemoglobina, o luminol &#233; vastamente empregado por equipes de investiga&#231;&#227;o forense (como de CSI) para investiga&#231;&#245;es criminais.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://techberto.files.wordpress.com/2010/01/luminol.jpg&quot;&gt;&lt;img class=&quot;aligncenter size-medium wp-image-191&quot; title=&quot;Luminol&quot; src=&quot;http://techberto.files.wordpress.com/2010/01/luminol.jpg?w=300&amp;h=225&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;225&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;O que presenciamos no &lt;em&gt;&lt;strong&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Glowstick&quot; target=&quot;_blank&quot;&gt;ligh-tstick&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Glowstick&quot; target=&quot;_blank&quot;&gt; &lt;/a&gt;(e nas cenas de CSI quando eles encontram sangue em algum local ou objeto)&#160;&#233; o efeito conhecido como &lt;strong&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Luminescence&quot;&gt;luminesc&#234;ncia&lt;/a&gt;&lt;/strong&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Luminescence&quot;&gt; &lt;/a&gt;(nome com origem no latim &amp;#8220;lumem&amp;#8221;) que &#233; a emiss&#227;o de luz atrav&#233;s por est&#237;mulo de radia&#231;&#227;o ionizante, luz ou rea&#231;&#227;o &#160;onde uma energia qu&#237;mica &#160;&#233; transformada em energia luminosa. Na realidade quando o efeito &#233; obtido atrav&#233;s de algum composto qu&#237;mico sint&#233;tico, como no caso do light-stick, ele &#233; chamado de &lt;strong&gt;&lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Chemoluminescence&quot; target=&quot;_blank&quot;&gt;quimiluminesc&#234;ncia&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Chemoluminescence&quot; target=&quot;_blank&quot;&gt; &lt;/a&gt;e, apesar de n&#227;o ser o caso, se fosse produzido por um organismo vivo ele seria chamado de &lt;strong&gt;&lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Bioluminescence&quot; target=&quot;_blank&quot;&gt;bioluminesc&#234;ncia&lt;/a&gt; &lt;span&gt;sendo-se que h&#225; v&#225;rios outros tipos de &lt;a href=&quot;http://en.wikipedia.org/wiki/Luminescence&quot; target=&quot;_blank&quot;&gt;luminesc&#234;ncia&lt;/a&gt;.&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Voltando ao bast&#227;o.&lt;/p&gt;
&lt;p&gt;No caso deste, normalmente h&#225; um solu&#231;&#227;o de cyalume com uma ampola de vidro contendo uma solu&#231;&#227;o de per&#243;xido de hidrog&#234;nio (&#225;gua oxigenada &#160;35%) e quando o bast&#227;o &#233; dobrado a ampola &#233; quebrada, as solu&#231;&#245;es s&#227;o misturadas o luminol come&#231;a a ser oxigenado e a &lt;em&gt;quimiluminesc&#234;ncia&lt;/em&gt; come&#231;a a ocorrer e fazer a alegria da galera. A dura&#231;&#227;o do efeito depende da &#160;temperatura do local, sendo-se que temperaturas baixas s&#227;o mais prop&#237;cias &#160;para sua durabilidade, portanto colocar a pulseira na geladeira tende a prologar o efeito mas ele n&#227;o se eternizar&#225; ou far&#225; a efeito ocorrer novamente.&lt;/p&gt;
&lt;p&gt;Vale lembrar que apesar de ser um efeito estudado a centenas de anos, com grandes evolu&#231;&#245;es no &#250;ltimo s&#233;culo, este &#233; um fen&#244;meno n&#227;o totalmente compreendido plenamente ainda sendo alvo de estudos e pesquisas.&lt;/p&gt;
&lt;p&gt;No caso da &lt;a href=&quot;http://en.wikipedia.org/wiki/Bioluminescence&quot; target=&quot;_blank&quot;&gt;bioluminesc&#234;ncia&lt;/a&gt;, normalmente o substrato de uma prote&#237;na&lt;a href=&quot;http://techberto.files.wordpress.com/2010/01/bathocyroe_fosteri1.jpg&quot;&gt;&lt;img class=&quot;alignright size-thumbnail wp-image-193&quot; title=&quot;Bathocyroe_fosteri&quot; src=&quot;http://techberto.files.wordpress.com/2010/01/bathocyroe_fosteri1.jpg?w=150&amp;h=138&quot; alt=&quot;&quot; width=&quot;150&quot; height=&quot;138&quot; /&gt;&lt;/a&gt; denominada &lt;a href=&quot;http://pt.wikipedia.org/wiki/Luciferina&quot; target=&quot;_blank&quot;&gt;luciferina&lt;/a&gt; (nome com origem no latim &amp;#8220;lucifer&amp;#8221; que significa &amp;#8220;que ilumina&amp;#8221;)&#160;&#233; oxidada por uma enzima, denominada &lt;a href=&quot;http://en.wikipedia.org/wiki/Luciferase&quot; target=&quot;_blank&quot;&gt;luciferase&lt;/a&gt;.&#160;Nesta rea&#231;&#227;o h&#225; o consumo de uma mol&#233;cula de &lt;a href=&quot;http://en.wikipedia.org/wiki/Luciferase&quot; target=&quot;_blank&quot;&gt;trifosfato de adenosina&lt;/a&gt; (ATP) que excita energ&#233;ticamente a luciferina e proporciona a gera&#231;&#227;o de energia luminosa atrav&#233;s da libera&#231;&#227;o da energia qu&#237;mica.&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;A luminesc&#234;ncia tem atra&#237;do o interesse do homem desde o princ&#237;pio de sua exist&#234;ncia, visto que do Pernambuco&#160;&#224; China, os primeiros registros&#160;e pirilampos, fen&#244;meno que Arist&#243;teles (384 &amp;#8211; 322 A.C) &#160;descreveu como &amp;#8220;luz&lt;a href=&quot;http://techberto.files.wordpress.com/2010/01/panellusstipticusaug12_2009_animated.gif&quot;&gt;&lt;img class=&quot;alignright size-thumbnail wp-image-195&quot; title=&quot;PanellusStipticusAug12_2009_Animated&quot; src=&quot;http://techberto.files.wordpress.com/2010/01/panellusstipticusaug12_2009_animated.gif?w=150&amp;h=102&quot; alt=&quot;&quot; width=&quot;150&quot; height=&quot;102&quot; /&gt;&lt;/a&gt; fria&amp;#8221;.&#160;Em 1669, o m&#233;dico H. Brandt criou a&#160;&#8220;phosphorus mirabilis&#8221;, que era uma rea&#231;&#227;o que utiliza uma propriedade do f&#243;sforo quando exposto ao oxig&#234;nio do ar em certas circunst&#226;ncias e por esta rea&#231;&#227;o ele obtia a &amp;#8220;quimiluminesc&#234;ncia&amp;#8221; (termo que fui criado 200 anos depois), &#160;mas &#160;Brandt que era um alquimista na &#233;poca n&#227;o compreendia exatamente o que ele estava fazendo, apenas o que ele estava conseguindo; o fasc&#237;nio das pessoas para quem ele apresentava seu experimento alquimista.&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;Talvez seja este fasc&#237;nio (o a inten&#231;&#227;o de fascinar) que fez&#160;James&#160;Cameron&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;alignright&quot; title=&quot;Jack Sullivan rodeado de Woodsprites&quot; src=&quot;http://4.bp.blogspot.com/_h3jgTAdJYWQ/S0JVAtX5gTI/AAAAAAAAAOM/Azt1gV8yi4o/s400/avatar-001.jpg&quot; alt=&quot;&quot; width=&quot;400&quot; height=&quot;240&quot; /&gt;inserir na hist&#243;ria de Avatar, &#160;a luminesc&#234;ncia e a bioluminesc&#234;ncia em Pandora como uma propriedade de todo organismo deste planeta, dos animais aos pequenes Woodsprites, as sementes de Utraya &amp;#8220;Mokri&amp;#8221;, e a &#193;rvore das Almas, com propriedades m&#237;sticas.&lt;/p&gt;
&lt;p&gt;Quando meu tio Z&#233; perguntou-me sobre o bast&#227;o de luz, a pouco eu estava lembrando da carinha de alegria de minhas sobrinhas ao brincar com os bast&#245;es de luz, sobre o fasc&#237;nio da luminesc&#234;ncia na humanidade e sobre o belo efeito que James Cameron conseguiu com Avatar, portanto nem preciso dizer o quanto achei oportuno a pergunta dele; por&#233;m confesso que na hora puxei um pouco o freio de m&#227;o e n&#227;o externei toda minha viagem.&lt;/p&gt;
&lt;p&gt;E por falar em viagem e para finalizar, vejam s&#243; o que este maluco fez com um bocado destes bast&#245;es:&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;a href=&quot;http://techberto.wordpress.com/2010/01/25/luminescencia-meu-tio-jose-e-avatar/&quot;&gt;&lt;img src=&quot;http://img.youtube.com/vi/l69Vi5IDc0g/2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Alerta, Cyalume &#233; t&#243;xico e al&#233;m disto como comentei acima, h&#225; vidro nos bast&#245;es, portanto n&#227;o fa&#231;am isto em casa!&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;Namast&#234;!&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/techberto.wordpress.com/190/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/techberto.wordpress.com/190/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/techberto.wordpress.com/190/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/techberto.wordpress.com/190/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/techberto.wordpress.com/190/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/techberto.wordpress.com/190/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/techberto.wordpress.com/190/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/techberto.wordpress.com/190/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/techberto.wordpress.com/190/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/techberto.wordpress.com/190/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=techberto.wordpress.com&amp;blog=400569&amp;post=190&amp;subd=techberto&amp;ref=&amp;feed=1&quot; /&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>techberto</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">SciTech::Inno::Blog</title>
			<subtitle type="html">Ci&#234;ncia, tecnologia, programa&#231;&#227;o, m&#250;sica e insights geeks do meu herm&#233;tico box nervoso...</subtitle>
			<link rel="self" href="http://techberto.wordpress.com/feed/atom/"/>
			<id>http://techberto.wordpress.com/feed/atom/</id>
			<updated>2010-03-08T02:44:23+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">VI Encontro de Programadores C &amp;amp; C++</title>
		<link href="http://techberto.wordpress.com/2010/01/18/vi-encontro-de-programadores-c-c/"/>
		<id>http://techberto.wordpress.com/?p=177</id>
		<updated>2010-01-22T11:43:18+00:00</updated>
		<content type="html">&lt;p&gt;O core de organiza&#231;&#227;o de eventos do grupo C &amp;amp; C++ Brasil, com colabora&#231;&#227;o da&#160; &lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/programadores_independentes&quot; target=&quot;_blank&quot;&gt;Liga dos Programadores Indepentes&lt;/a&gt; mais alguns colaboradores e com apoio da galera do hashtag &lt;a href=&quot;http://twitter.com/#search?q=%23ccppbrasil_meetings&quot; target=&quot;_blank&quot;&gt;#ccppbrasil_meetings&lt;/a&gt; est&#227;o trabalhando na remotada dos eventos do grupo C &amp;amp; C++ Brasil para 2010, sendo-se que o primeiro evento ser&#225; o encontro de programadores que est&#225; programado para o dia 06 de fevereiro de 2010 em S&#227;o Paulo.&lt;/p&gt;
&lt;p&gt;A programa&#231;&#227;o ainda n&#227;o est&#225; fechada mas h&#225; propostas de palestras sobre concorr&#234;ncia para C++, rob&#243;tica, programa&#231;&#227;o segura entre outras.&lt;/p&gt;
&lt;p&gt;Maiores detalhes em &lt;a href=&quot;http://www.ccppbrasil.org/wiki/Grupo:Encontro_VI&quot; target=&quot;_blank&quot;&gt;http://www.ccppbrasil.org/wiki/Grupo:Encontro_VI&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Est&#225; em planejamento tamb&#233;m um encontro do pessoal de Porto Alegre.&lt;/p&gt;
&lt;p&gt;Em breve ser&#225; divulgado uma previs&#227;o de&#160; agenda para 2010.&lt;/p&gt;
&lt;p&gt;Bons c&#243;digos e nos vemos l&#225;!&lt;/p&gt;
&lt;p&gt;Namast&#234;!&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/techberto.wordpress.com/177/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/techberto.wordpress.com/177/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/techberto.wordpress.com/177/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/techberto.wordpress.com/177/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/techberto.wordpress.com/177/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/techberto.wordpress.com/177/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/techberto.wordpress.com/177/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/techberto.wordpress.com/177/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/techberto.wordpress.com/177/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/techberto.wordpress.com/177/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=techberto.wordpress.com&amp;blog=400569&amp;post=177&amp;subd=techberto&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>techberto</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">SciTech::Inno::Blog</title>
			<subtitle type="html">Ci&#234;ncia, tecnologia, programa&#231;&#227;o, m&#250;sica e insights geeks do meu herm&#233;tico box nervoso...</subtitle>
			<link rel="self" href="http://techberto.wordpress.com/feed/atom/"/>
			<id>http://techberto.wordpress.com/feed/atom/</id>
			<updated>2010-03-08T02:44:23+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Lei de Stigler, ressaca de pan-galactic gargle blaster,  a vida, o universo e tudo mais</title>
		<link href="http://techberto.wordpress.com/2010/01/18/batata-stigler-newton-ressaca-de-pan-galactic-gargle-blaster/"/>
		<id>http://techberto.wordpress.com/?p=173</id>
		<updated>2010-01-20T12:59:03+00:00</updated>
		<content type="html">&lt;p&gt;&lt;strong&gt;&lt;em&gt;Ep&#243;nymos &lt;/em&gt;&lt;/strong&gt;era a figura que atribu&#237;a o nome a uma cidade na gr&#233;cia cl&#225;ssica.&#160; Epon&#237;mia &#233; o nome que dela deriva.&#160; Este conceito generalizou-se ao batismo de&#160; t&#233;cnicas, objetos, atributos, inven&#231;&#245;es seja por vias diretas ou indiretas, sendo considerada a forma suprema de reconhecimento da atividade de um pesquisador.&lt;/p&gt;
&lt;p&gt;Quando eu era adolescente e morava l&#225; em &lt;a title=&quot;Santa F&#233; do Sul&quot; href=&quot;http://pt.wikipedia.org/wiki/Santa_F%C3%A9_do_Sul&quot; target=&quot;_blank&quot;&gt;Santa F&#233; do Sul&lt;/a&gt; (proporcionalmente 105.18 Km mais distante de S&#227;o Paulo e &lt;em&gt;3.7840092199092412 vezes &lt;/em&gt;menor que &lt;a title=&quot;Barbacena&quot; href=&quot;http://pt.wikipedia.org/wiki/Barbacena_(Minas_Gerais)&quot; target=&quot;_blank&quot;&gt;Barbarcena&lt;/a&gt;) &#160;numa &#233;poca em &#160;que eu realizava um curso t&#233;cnico em eletr&#244;nica, &#160;com grande &#160;freq&#252;&#234;ncia eu conversava com o (bom amigo) &lt;em&gt;&lt;strong&gt;Batata&lt;/strong&gt;&lt;/em&gt; sobre f&#237;sica, eletricidade, v&#225;lvulas raras, RF,&#160;&lt;a title=&quot;A Vida, o Universo e Tudo Mais&quot; href=&quot;http://pt.wikipedia.org/wiki/A_Vida,_o_Universo_e_Tudo_Mais&quot; target=&quot;_blank&quot;&gt;a vida, o universo e tudo mais&lt;/a&gt;; num destes bate-papo logo ap&#243;s uma desopila&#231;&#227;o hep&#225;tica&#160; ele me comentou que quem deveria ser creditado pelo invento do r&#225;dio deveria ter sido o &lt;a title=&quot;Padre Landell&quot; href=&quot;http://pt.wikipedia.org/wiki/Roberto_Landell_de_Moura&quot; target=&quot;_blank&quot;&gt;Padre Landell&lt;/a&gt;, um ga&#250;cho que foi &#160;padre cat&#243;lico e um not&#225;vel inventor e n&#227;o &lt;a title=&quot;Marconi&quot; href=&quot;http://pt.wikipedia.org/wiki/Guglielmo_Marconi&quot; target=&quot;_blank&quot;&gt;Marconi &lt;/a&gt;; f&#237;sico italiano que plagiando estudos apresentandos pelo &lt;a title=&quot;Nikola Tesla&quot; href=&quot;http://pt.wikipedia.org/wiki/Nikola_Tesla&quot;&gt;Nikola Tesla&lt;/a&gt; em 1899 apresentou ao mundo que Pe.Landell j&#225; havia apresentado em 1893 para um pequeno p&#250;blico em Campinas. &#160;Tamb&#233;m foi o Batata que me revelou que o verdadeiro inventor do telefone teria sido &lt;a title=&quot;Elisha Gray&quot; href=&quot;http://en.wikipedia.org/wiki/Elisha_Gray&quot; target=&quot;_blank&quot;&gt;Elisha Gray &lt;/a&gt;e n&#227;o &lt;a title=&quot;Alexander Graham Bell&quot; href=&quot;http://en.wikipedia.org/wiki/Alexander_Graham_Bell&quot;&gt;Alexander Graham Bell&lt;/a&gt;, quando eu solicitei suas &amp;#8220;fontes&amp;#8221; ele sacou de seu arquivo duas revistas &#160;&lt;em&gt;&lt;a href=&quot;http://www.editorasaber.com.br/&quot;&gt;Saber Eletr&#244;nica&lt;/a&gt; que relatavam estes fatos.&#160; Quando terminei de ler os artigos comentei: &amp;#8220;Isto sim &#233; pilantragem&amp;#8221;&lt;/em&gt; e o Batata soltou uma que (na &#233;poca)&#160; eu&#160; n&#227;o entendi&lt;em&gt;: &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;- &lt;/em&gt;&lt;em&gt;&amp;#8220;Isto sim &#233; a apoteose da irresponsabilidade consciente&amp;#8221; &#160;e tomei nota desta frase &#160;na hora, &#160;pois achei um &amp;#8220;insight&amp;#8221; muito inspirado&amp;#8230;&lt;br /&gt;
&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-173&quot;&gt;&lt;/span&gt;Fiquei bastante curioso sobre estes fatos, infelizmente naquela &#233;poca (d&#233;cada de 80) minhas fontes de pesquisas mais confi&#225;veis diziam que os inventores da primeira aeronave havia sido os &#160;irm&#227;os Orville e Wilbur Wright. &#160;Estas informa&#231;&#245;es n&#227;o mudaram minha vida, mas me tornaram um ass&#237;duo leitor na revista Saber Eletr&#244;nica por alguns anos como tamb&#233;m me&#160; estimularam a pesquisar (eventualmente)&#160; sobre a hist&#243;ria das inven&#231;&#245;es e das ci&#234;ncias.&lt;/p&gt;
&lt;p&gt;Nestas primeiras pesquisas,&#160; percebi que muitas inven&#231;&#245;es passaram por disputas de paternidade, mas nem sempre a disputa tinha motiva&#231;&#245;es financeira, como por exemplo foi o caso de Bob Kearn retratado no filme &lt;a href=&quot;http://www.horadopovo.com.br/2009/Outubro/2810-21-10-09/P8/pag8a.htm&quot; target=&quot;_blank&quot;&gt;Flash of Genius&lt;/a&gt;. Um caso mais popular&#160; foi o exemplo da &lt;a title=&quot;Incandescent light bulb&quot; href=&quot;http://en.wikipedia.org/wiki/Incandescent_light_bulb&quot;&gt;l&#226;mpada&lt;/a&gt; que teve como primeiro inventor &lt;a title=&quot;Joseph Swan&quot; href=&quot;http://en.wikipedia.org/wiki/Joseph_Swan&quot;&gt;Joseph Swan&lt;/a&gt; mas&#160; &lt;a title=&quot;Thomas Edison&quot; href=&quot;http://en.wikipedia.org/wiki/Thomas_Edison&quot;&gt;Thomas Edison&lt;/a&gt; levou os cr&#233;ditos, por&#233;m foi quem melhor explorou a inven&#231;&#227;o, tendo inventado o sistema el&#233;trico com rede de distribui&#231;&#227;o de energia, geradores de energia e todo um universo que viabilizou a comercializa&#231;&#227;o da eletricidade,&#160; conseguindo explorar melhor a inven&#231;&#227;o. Caso similar ao&#160; &lt;a title=&quot;Telephone&quot; href=&quot;http://en.wikipedia.org/wiki/Telephone&quot;&gt;telefone&lt;/a&gt; visto que &lt;a title=&quot;Alexander Graham Bell&quot; href=&quot;http://en.wikipedia.org/wiki/Alexander_Graham_Bell&quot;&gt;Bell&lt;/a&gt; explorou muito bem &amp;#8220;sua&amp;#8221; inven&#231;&#227;o e as redes telef&#244;nicas. Por&#233;m, no caso dele vamos dizer que se aplica a &lt;strong&gt;m&#225;xima do batata&lt;/strong&gt; visto que Bell se inspirou no trabalho de &lt;a title=&quot;Johann Philipp Reis&quot; href=&quot;http://en.wikipedia.org/wiki/Johann_Philipp_Reis&quot;&gt;Johann Philipp Reis&lt;/a&gt;,&#160; descobriu o trabalho de &lt;a title=&quot;Stephen Gray&quot; href=&quot;http://pt.wikipedia.org/wiki/Stephen_Gray&quot; target=&quot;_blank&quot;&gt;Stephen Gray &lt;/a&gt; (que em 1729 teorizou um telefone funcional) comprou (a pre&#231;o de banana) prot&#243;tipos de &lt;a title=&quot;Antonio Meucci&quot; href=&quot;http://en.wikipedia.org/wiki/Antonio_Meucci&quot;&gt;Antonio Meucci&lt;/a&gt;, ouviu boatos do aparelho de &lt;a href=&quot;http://pt.wikipedia.org/wiki/Hans_Christian_%C3%98rsted&quot;&gt;&lt;em&gt;Christian&lt;/em&gt; &#216;rsted&lt;/a&gt; e quando ficou sabendo que &#160; &lt;a title=&quot;Elisha Gray&quot; href=&quot;http://en.wikipedia.org/wiki/Elisha_Gray&quot;&gt;Elisha Gray&lt;/a&gt; (que era algu&#233;m com quem ele sabia que devia-se preocupar) iria registrar a patente de um telefone funcional, Bell subornou um funcion&#225;rio do escrit&#243;rio de patentes e &amp;#8220;conseguiu&amp;#8221; registrar a patente do telefone primeiro, mas em 2002 a suprema corte americana reconheceu o trabalho de&#160;&lt;em&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;http://www.house.gov/hensarling/rsc/doc/Lb61102.pdf&quot;&gt;Antonio Meucci&lt;/a&gt; &lt;/em&gt;&lt;em&gt;por ter sido o verdadeiro inventor do telefone;&#160; decis&#227;o&#160; justa mas tardia, afinal Meucci &lt;/em&gt;faleceu no s&#233;culo 19. No caso do r&#225;dio, entre aqueles que se proclamaram pais da inven&#231;&#227;o havia &lt;a title=&quot;Nikola Tesla&quot; href=&quot;http://en.wikipedia.org/wiki/Nikola_Tesla&quot;&gt;Nikola Tesla&lt;/a&gt;, &lt;a title=&quot;Alexander Stepanovich Popov&quot; href=&quot;http://en.wikipedia.org/wiki/Alexander_Stepanovich_Popov&quot;&gt;Alexander Popov&lt;/a&gt;,&#160; &lt;a title=&quot;Reginald Fessenden&quot; href=&quot;http://en.wikipedia.org/wiki/Reginald_Fessenden&quot;&gt;Reginald Fessenden&lt;/a&gt;, &lt;a title=&quot;Landell de Moura&quot; href=&quot;http://en.wikipedia.org/wiki/Landell_de_Moura&quot;&gt;Pe.Landell de Moura&lt;/a&gt;;&#160; em 1943 a Suprema Corte dos Estados Unidos concedeu a Tesla a &lt;a rel=&quot;nofollow&quot; href=&quot;http://www.google.com/patents?vid=763772&quot;&gt;Patente 763,772&lt;/a&gt; creditando a ele a inven&#231;&#227;o do r&#225;dio, talvez porque era o &#250;nico que ainda havia algum representante ativo nesta luta, pois analisando historicamente o Pe.Landell Moura foi quem conseguiu primeiro. Felizmente hoje Landell &#233; mais conhecido no Brasil, sendo patrono dos radiamadores brasileiros sendo conhecido como um dos pioneiros na inven&#231;&#227;o da TV, ele foi o inventor do telefone sem fio,&#160; da comunica&#231;&#227;o via portadora &#243;tica e entre outros campos ele &#233; conhecido mundialmente por seu pioneirismo na &lt;a title=&quot;Bioeletrografia&quot; href=&quot;http://pt.wikipedia.org/wiki/Fotografia_Kirlian&quot; target=&quot;_blank&quot;&gt;bioeletrografia&lt;/a&gt; por&#233;m quanto ao r&#225;dio&amp;#8230;&lt;/p&gt;
&lt;p&gt;Numa destas pesquisas encontrei a palavra&#160; &lt;strong&gt;epon&#237;mia&lt;/strong&gt; (acho que)&#160; pela primeira vez.&#160; Um exemplo de epon&#237;mia &#233; a&#160; &lt;a title=&quot;Salmonella&quot; href=&quot;http://en.wikipedia.org/wiki/Salmonella&quot;&gt;Salmonella&lt;/a&gt;, que tem origem do sobrenome do&#160; &lt;a title=&quot;Daniel Elmer Salmon&quot; href=&quot;http://en.wikipedia.org/wiki/Daniel_Elmer_Salmon&quot;&gt;Dr.Daniel Elmer Salmon&lt;/a&gt;, mas que na realidade ela foi descoberta por&#160; &lt;a title=&quot;Theobald Smith&quot; href=&quot;http://en.wikipedia.org/wiki/Theobald_Smith&quot;&gt;Theobald Smith&lt;/a&gt;. U&#233;, como assim? De forma simplista, olha a &lt;strong&gt;m&#225;xima do batata&lt;/strong&gt; a&#237; novamente.&lt;/p&gt;
&lt;p&gt;Num acaso, em 1992&#160; li uma nota que Joel Cohen havia escrito um artigo no qual ele revelava que a &amp;#8220;&lt;em&gt;&lt;strong&gt;lei da epon&#237;mia de Stigler&lt;/strong&gt;&lt;/em&gt;&amp;#8221; foi muitas vezes formulada antes de Stigler a ter sequer nomeado. Mas o que era esta tal lei? Infelizmente era 1992,&#160; n&#227;o consegui encontrar nada nas bibliotecas que eu tinha acesso e eu estava procurando nos lugares errados.&lt;/p&gt;
&lt;p&gt;Poucos anos depois, ao acaso, descobri que a chamada &lt;a href=&quot;http://en.wikipedia.org/wiki/Stigler%27s_law_of_eponymy&quot; target=&quot;_blank&quot;&gt;Lei &amp;#8211; da&#160; meson&#237;mia ou epon&#237;mia &amp;#8211; de Stigler &lt;/a&gt;afirmava que &lt;strong&gt;&amp;#8220;no scientific discovery is named after its original discoverer&amp;#8221; &lt;/strong&gt;(nenhuma descoberta cient&#237;fica &#233; designada com o nome do seu descobridor original)&#160;&#160; bem, neste momento comecei a pensar, &lt;strong&gt;nenhuma&lt;/strong&gt;?&#160; Stigler chegou a esta conclus&#227;o observando v&#225;rias descobertas, na &#225;rea de economia e ci&#234;ncias, sendo-se que este trabalho proporcionou a ele o Nobel de Economia em 1982. Por&#233;m, se Cohen estava correto, at&#233; a lei de Stigler era v&#237;tima dela pr&#243;pria; ao menos ela era coerente. E ali senti que eu estava comen&#231;ando a aprender os nomes dos bois.&lt;/p&gt;
&lt;p&gt;E eu ainda tinha aquela d&#250;vida: &lt;strong&gt;todas&lt;/strong&gt;? Obviamente que n&#227;o podia ser todas, mas o quanto ela se aplicava? Qual ci&#234;ncia era mais suscet&#237;vel? Porque esta tipo de situa&#231;&#227;o era tolerada? N&#227;o h&#225; uma &#250;nica resposta, cada caso &#233; um hist&#243;ria.&lt;/p&gt;
&lt;p&gt;Alguns anos depois, felizmente j&#225; com a internet, resolvi pesquisar a origem de algo que a muito tempo eu tinha curiosidade e o que descobri foi interessante:&lt;/p&gt;
&lt;p&gt;Em 1949, &lt;a href=&quot;http://pt.wikipedia.org/wiki/John_Paul_Stapp&quot; target=&quot;_blank&quot;&gt;John Paul Stapp&lt;/a&gt;,&#160; um&#160; Ph.D, m&#233;dico e coronel da&#160; &lt;a title=&quot;USAF&quot; href=&quot;http://pt.wikipedia.org/wiki/USAF&quot;&gt;USAF&lt;/a&gt; (nascido na Bahia em 1910)&#160; pioneiro nos estudos dos efeitos das for&#231;as de acelera&#231;&#227;o e desacelera&#231;&#227;o no organismo humano, que havia sido selecionado dois anos antes como &lt;em&gt;&amp;#8220;cobaia&amp;#8221;&lt;/em&gt; de testes para medir a resist&#234;ncia humana a grandes acelera&#231;&#245;es,&#160; consegui bateu o recorde mundial de acelera&#231;&#227;o mas n&#227;o p&#244;de&#160; festejar o feito. Isto porqu&#234; os aceler&#244;metros do tren&#243;-foguete simplesmente n&#227;o funcionaram. P. da vida, Stapp&#160; solicitou ao engenheiro respons&#225;vel pelas medi&#231;&#245;es -&#160; o ent&#227;o capit&#227;o &lt;a title=&quot;Edward A. Murphy&quot; href=&quot;http://pt.wikipedia.org/wiki/Edward_A._Murphy&quot;&gt;Edward Murphy Jr.&lt;/a&gt; -&#160; uma an&#225;lise para identificar a falha. Logo eles descobriram que&#160; um t&#233;cnico ligara os circuitos do ve&#237;culo ao contr&#225;rio. No relat&#243;rio de an&#225;lise do problema,&#160; Murphy anotou: &lt;em&gt;&amp;#8220;Se h&#225; mais de uma forma de fazer um trabalho e uma dessas formas redundar&#225; em desastre, ent&#227;o algu&#233;m far&#225; o trabalho dessa forma&amp;#8221;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dr. Stapp popularizou a express&#227;o ao comentar em uma entrevista a jornalistas, o diagn&#243;stico de Murphy, atribuindo ao fato de que ningu&#233;m saiu ferido dos testes por levarem em conta a Lei de Murphy e explicou as vari&#225;veis que integravam a assertiva, ante ao risco de erro e consequente cat&#225;strofe.&lt;/p&gt;
&lt;p&gt;Enfim, quem a popularizou&#160; foi Stapp e o seu autor (mesmo que atormentado por isto) sempre recebeu os m&#233;ritos. Assim quando tive contato com as origens da folcl&#243;rica e emblem&#225;tica a &lt;a href=&quot;http://en.wikipedia.org/wiki/Murphy%27s_law&quot; target=&quot;_blank&quot;&gt;Lei de Murphy&lt;/a&gt; minha primeira observa&#231;&#227;o&#160; foi que a Lei de Stigler n&#227;o se aplica a ela. Imagino que esta seja uma daquelas cita&#231;&#245;es desgastadas que ningu&#233;m mais aguenta,&#160; mas como j&#225; dizia Nelson Rodrigues &amp;#8220;toda unaminidade &#233; burra&amp;#8221;. Mas o que mostrou-se mais evidente &#233; que a Lei de Murphy &#233; mais poderosa que a Lei de Stigler! rs&lt;/p&gt;
&lt;p&gt;Outro dia, j&#225; em 2010, lendo o post &lt;a href=&quot;http://www.ricbit.com/2010/01/newton-e-os-universos-paralelos_02.html&quot; target=&quot;_blank&quot;&gt;Newton e os Universos Paralelos&lt;/a&gt; vi uma refer&#234;ncia ao cl&#225;ssico embate &lt;a href=&quot;http://www.ifi.unicamp.br/~ghtc/Biografias/Newton/Newtonnxh.htm&quot; target=&quot;_blank&quot;&gt;Newton vs Hooke&lt;/a&gt;, que sempre me faz lembrar do embate &lt;a href=&quot;http://www.angelfire.com/md/byme/mathsample.html&quot;&gt;&lt;em&gt;Newton&lt;/em&gt; vs&#160; &lt;em&gt;Leibniz&lt;/em&gt;&lt;/a&gt; . Muitas vezes a fama indevida ou a prova da Lei de Stigler ocorre de forma involunt&#225;ria, no caso do C&#225;lculo, n&#227;o h&#225; epon&#237;mia, mas houve literalmente &lt;em&gt;&amp;#8220;a apoteose da irresponsabilidade consciente&amp;#8221;&lt;/em&gt;, enfim, houve a pilantragem de Newton. Com o tempo descobri que o Batata n&#227;o havia sido original, que a frase que me deslumbrou era do &lt;a href=&quot;http://pt.wikipedia.org/wiki/A_Turma_da_Pilantragem&quot; target=&quot;_blank&quot;&gt;Carlos Imperial&lt;/a&gt; e ele omitiu, mas comparado ao que Newton fez isto n&#227;o foi nada!&lt;/p&gt;
&lt;p&gt;Apenas para contextualizar:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://pt.wikipedia.org/wiki/Isaac_Newton&quot; target=&quot;_blank&quot;&gt;Isaac Newton &lt;/a&gt;fez descobertas elementares em gravita&#231;&#227;o, &#243;ptica, mec&#226;nica, din&#226;mica celeste e matem&#225;tica!&#160; Era um cientista. J&#225; &lt;a href=&quot;http://pt.wikipedia.org/wiki/Gottfried_Leibniz&quot; target=&quot;_blank&quot;&gt;Leibniz,&lt;/a&gt; pai do termo fun&#231;&#227;o, era um fil&#243;sofo e se interessava&#160; por ling&#252;&#237;stica, hist&#243;ria, direito, diplomacia, pol&#237;tica, economia, teologia,&#160; biologia, geologia,&#160; matem&#225;tica, filosofia e metaf&#237;sica, sendo considerado&#160; como o &#250;ltimo g&#234;nio universal e inclusive um virtuoso atleta.&lt;/p&gt;
&lt;p&gt;Leibniz publicou o seu trabalho sobre C&#225;lculo antes de Newton.&#160; Quando Newton teve acesso, ele ficou bastante irritado e temendo cr&#237;ticas, principalmente advindas de Robert Hooke, com quem n&#227;o tinha muita afinidade desde quando ele publicou seu trabalho sobre &#243;tica e que na ocasi&#227;o era o presidente da Royal Society, Newton preferiu adotar uma estrat&#233;gia vitri&#243;lica para &amp;#8220;defender&amp;#8221; seus interesses.&lt;/p&gt;
&lt;p&gt;Quando&#160; Hooke faleceu, Newton tornou-se uma esp&#233;cie de presidente vital&#237;cio da Royal Society, da qual Leibniz tamb&#233;m era membro. Desta forma, ainda inconformado por ter perdido o bonde do C&#225;lculo, com um aliado escoc&#234;s, John Kell,&#160; come&#231;ou a provocar Leibniz como plagiador.&#160; Muito irritado com esta hist&#243;ria, ele enviou of&#237;cios violentos &#224; Royal Society para&#160;provar que ele, sim, inventara o C&#225;lculo Diferencial e Integral (at&#233; hoje s&#227;o&#160;usadas as nota&#231;&#245;es de Leibniz &#8211; por exemplo, o famoso dy/dx). Diante&#160;daquela querela entre tit&#227;s e como s&#243;i acontecer, criou-se um comit&#234; para&#160;investigar a quest&#227;o. Esse comit&#234; foi formado em quase sua totalidade por&#160;membros pr&#243; Newton. Em tempo recorde ficou pronto um relat&#243;rio&#160;conferindo a Newton a prioridade da inven&#231;&#227;o. Mais tarde foi descoberto&#160;um rascunho desse relat&#243;rio manuscrito por Newton! Na realidade, com o tempo descobriu-se que quase todos os artigos que foram escritos &amp;#8221; atacando&amp;#8221; Leibniz foram apenas publicados em nomes de outros cientistas da &#233;poca, mas foram escritos por Newton (tsc). &#160;Newton recebeu o t&#237;tulo de Sir, faleceu em 31 de mar&#231;o de 1727 e foi sepultado na Abadia de Westminster, em Londres, entre os reis do Imp&#233;rio Brit&#226;nico. &#160;Apesar de suas mentiras e desvios de car&#225;ter, ele foi&#160;&#160;evidentemente um g&#234;nio, pregui&#231;oso e ardiloso, por&#233;m sagaz e extremamente inteligente.&lt;/p&gt;
&lt;p&gt;Todavia, a filosofia de Leibniz contribuiu para o que hoje chamamos&#160;de f&#237;sica moderna. Ele trabalhou com l&#243;gica simb&#243;lica, aperfei&#231;oou uma&#160;primitiva m&#225;quina de calcular e foi precursor da aritm&#233;tica bin&#225;ria, base dos&#160;atuais computadores. Leibniz morreu em Hanover no dia 14 de novembro de 1716.&lt;/p&gt;
&lt;p&gt;A melhor s&#237;ntese desta hist&#243;ria que eu j&#225; encontrei, do qual me apropriei de parte do texto est&#225; no trabalho&lt;a href=&quot;http://www4.fct.unesp.br/docentes/dmec/vanessa/index_arquivos/Newton%2520versus%2520Leibniz.pdf&quot; target=&quot;_blank&quot;&gt; Newton vs Leibinniz de Adalberto Nascimento&lt;/a&gt;, por&#233;m esta hist&#243;ria &#233; contada em v&#225;rios livros.&lt;/p&gt;
&lt;p&gt;Comentando sobre alguns destes assuntos &#160;no twitter com o &lt;a title=&quot;@AlanJumpi&quot; href=&quot;http://twitter.com/AlanJumpi&quot; target=&quot;_blank&quot;&gt;@AlanJump&lt;/a&gt;i e o &lt;a href=&quot;http://twitter.com/feuteston&quot; target=&quot;_blank&quot;&gt;@Feutestoun&lt;/a&gt;, surgiu um insight de escrever este post (ou algo parecido) foi quando comentei da Lei de Stigler e logo algu&#233;m me comentou que a &lt;a href=&quot;http://twitter.com/cyberdecker&quot; target=&quot;_blank&quot;&gt;@cyberdecker&lt;/a&gt; havia escrito a pouco tempo o post &lt;a href=&quot;http://www.giseliramos.com.br/blog/2009/12/breve-panorama-da-estatistica-e-lei-de-stigler/&quot; target=&quot;_blank&quot;&gt;breve panorama da estat&#237;stica e lei de Stigler&lt;/a&gt; que li gostei muito, sinceramente recomendo. &#160;Na sequ&#234;ncia surgiu a id&#233;ia de debatermos tudo isto com mais algum tempero de nerdices num bar, numa divaga&#231;&#227;o imaginei que o local ideal seria o&lt;a href=&quot;http://pt.wikipedia.org/wiki/The_Restaurant_at_the_End_of_the_Universe&quot; target=&quot;_blank&quot;&gt; bar &amp;amp; restaurante no fim do universo&lt;/a&gt;, logo pensei:&#160; como ser&#225; uma ressaca &#160;de &lt;a title=&quot;Zaphod Beeblebrox&quot; href=&quot;http://en.wikipedia.org/wiki/Zaphod_Beeblebrox#Pan-Galactic_Gargle_Blaster&quot; target=&quot;_blank&quot;&gt;Pan-Galactic Gargle Blaster&lt;/a&gt;? &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saideira:&lt;/strong&gt; por falar em aritm&#233;tica bin&#225;ria, grandes g&#234;nios, inventores, absurdos e pol&#234;micas sobre patentes, lembrei de uma cl&#225;ssica hist&#243;ria onde em 1948 quando tentaram patentear as portas l&#243;gicas digitais, a U.S.Patents a negaram&#160; pois &lt;a href=&quot;http://en.wikipedia.org/wiki/List_of_Tesla_patents&quot; target=&quot;_blank&quot;&gt;Nicola Tesla&lt;/a&gt; j&#225; a detinha&#160; desde a virada do s&#233;culo.&#160; Esta foi uma contribui&#231;&#227;o indireta de Tesla extremamente valiosa, visto que&#160; este&#160; monop&#243;lio certamente iria gerar um absurdo atraso tecnol&#243;gico.&lt;/p&gt;
&lt;p&gt;Ps: Ainda pensando nestes sci-fi drinks, &#160;como ser&#225; uma ressaca de &amp;#8220;&lt;a href=&quot;http://memory-alpha.org/en/wiki/Romulan_ale&quot; target=&quot;_blank&quot;&gt;Romulan Ale&lt;/a&gt;&amp;#8220;?&#160; Bom, esta divaga&#231;&#227;o incidental e um pouco (ou muito mais) sobre curiosidades sobre Tesla, &#160;Landell e hist&#243;ria da ci&#234;ncia &#160;ficam para outro(s) post(s) que ap&#243;s quebrar o jejum, nas pr&#243;ximas aplicarei as t&#233;cnicas de jack.&lt;/p&gt;
&lt;p&gt;Namast&#234;!&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/techberto.wordpress.com/173/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/techberto.wordpress.com/173/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/techberto.wordpress.com/173/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/techberto.wordpress.com/173/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/techberto.wordpress.com/173/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/techberto.wordpress.com/173/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/techberto.wordpress.com/173/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/techberto.wordpress.com/173/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/techberto.wordpress.com/173/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/techberto.wordpress.com/173/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=techberto.wordpress.com&amp;blog=400569&amp;post=173&amp;subd=techberto&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>techberto</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">SciTech::Inno::Blog</title>
			<subtitle type="html">Ci&#234;ncia, tecnologia, programa&#231;&#227;o, m&#250;sica e insights geeks do meu herm&#233;tico box nervoso...</subtitle>
			<link rel="self" href="http://techberto.wordpress.com/feed/atom/"/>
			<id>http://techberto.wordpress.com/feed/atom/</id>
			<updated>2010-03-08T02:44:23+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Django-Brasil ultrapassa Zope-PT</title>
		<link href="http://blog.ramgarlic.com/2010/01/django-brasil-ultrapassa-zope-pt.html"/>
		<id>tag:blogger.com,1999:blog-4463022840615424564.post-6174422341476002450</id>
		<updated>2010-01-19T06:23:38+00:00</updated>
		<content type="html">Conforme eu previa, em algum momento de 2009 a lista &lt;a href=&quot;http://groups.google.com/group/django-brasil&quot;&gt;django-brasil&lt;/a&gt; ultrapassou em n&#250;mero de assinantes a lista &lt;a href=&quot;http://br.groups.yahoo.com/group/zope-pt/&quot;&gt;zope-pt&lt;/a&gt;. Algu&#233;m sabe exatamente quando foi?&lt;br /&gt;&lt;br /&gt;Na minha palestra-rel&#226;mpago na &lt;a href=&quot;http://www.slideshare.net/ramalho/python-in-brasil&quot;&gt;PyCon 2009 em Chicago&lt;/a&gt; eu mostrei n&#250;meros que indicavam que isso estava prestes a acontecer.&lt;br /&gt;&lt;br /&gt;Ent&#227;o por esse crit&#233;rio o Django &#233; hoje o mais popular framework Web da linguagem Python no Brasil.&lt;br /&gt;&lt;br /&gt;Parab&#233;ns a todos que ajudaram isso a acontecer, como usu&#225;rios, consultores, tradutores, autores, instrutores e evangelizadores!&lt;br /&gt;&lt;br /&gt;A simplicidade, a praticidade e o poder do Django combinam com o jeito Python de programar. Assim como Python, Django faz bem para a auto-estima do principiante (como diz o &lt;a href=&quot;http://marrcandre.blogspot.com/&quot;&gt;Marco Andr&#233;&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Ao mesmo tempo, Python e Django v&#234;m com pilhas inclu&#237;das (componentes prontos para usar), e n&#227;o se limitam a solu&#231;&#245;es simples, pois oferecem ferramentas e extensibilidade para programadores experientes produzirem sistemas muito sofisticados, flex&#237;veis e robustos.&lt;br /&gt;&lt;br /&gt;O sucesso do Django foi a melhor coisa que aconteceu para o Python nos &#250;ltimos anos.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/4463022840615424564-6174422341476002450?l=blog.ramgarlic.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Luciano Ramalho</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.ramgarlic.com/</uri>
		</author>
		<source>
			<title type="html">Ramgarlic</title>
			<subtitle type="html">Programador repentista</subtitle>
			<link rel="self" href="http://blog.ramgarlic.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-4463022840615424564</id>
			<updated>2010-03-19T11:44:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Tr&#234;s perguntas sobre Python</title>
		<link href="http://blog.ramgarlic.com/2010/01/tres-perguntas-sobre-python.html"/>
		<id>tag:blogger.com,1999:blog-4463022840615424564.post-185783866697797072</id>
		<updated>2010-01-18T14:57:21+00:00</updated>
		<content type="html">&lt;span&gt;Desde quando o Google e o Youtube usam Python?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Desde o in&#237;cio. Os algoritmos inovadores do Google foram criados em Python e em C, e at&#233; hoje Python &#233; usada em todos os milh&#245;es de servidores do Google. O Youtube j&#225; era feito em Python antes de ser adquirido pelo Google. Veja a p&#225;gina &lt;a href=&quot;http://web.archive.org/web/19990204033714/google.stanford.edu/about.html&quot;&gt;About Google&lt;/a&gt; de 1998 e o &lt;a href=&quot;http://www.python.org/about/quotes/&quot;&gt;depoimento de Peter Norvig&lt;/a&gt;, diretor de pesquisa do Google e co-autor do livro &lt;span&gt;Intelig&#234;ncia Artificial: uma abordagem moderna&lt;/span&gt;. Ah sim: a primeira linguagem suportada no &lt;a href=&quot;http://code.google.com/intl/pt-BR/appengine/&quot;&gt;Google App Engine&lt;/a&gt; foi Python.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Porqu&#234; o MIT est&#225; usando Python?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O Massachussetts Institute of Technology, a mais famosa escola de engenharia do mundo, est&#225; usando Python em sua principal &lt;a href=&quot;http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-00Fall-2008/CourseHome/index.htm&quot;&gt;disciplina introdut&#243;ria de computa&#231;&#227;o&lt;/a&gt;. Python foi adotada porque possui bibliotecas muito vers&#225;teis (redes, rob&#244;s, computa&#231;&#227;o gr&#225;fica, etc.) e permite explorar conceitos avan&#231;ados de orienta&#231;&#227;o a objetos e meta-programa&#231;&#227;o, mas tem uma curva de aprendizagem suave. O livro-texto adotado pelo MIT j&#225; foi traduzido pela comunidade Python brasileira: &lt;a href=&quot;http://code.google.com/p/aprendacompy/&quot;&gt;Aprenda Computa&#231;&#227;o com Python&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Existe emprego para programadores Python?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sim. Hoje existem mais vagas para .Net, Java e PHP do que para Python, mas as vagas para programadores Python s&#227;o mais atraentes. O motivo &#233; que Python n&#227;o &#233; uma op&#231;&#227;o &quot;default&quot;, mas &#233; uma escolha consciente feita por empresas que se preocupam com qualidade e buscam inova&#231;&#227;o, e isso se reflete em melhores condi&#231;&#245;es de trabalho, sal&#225;rios maiores e ambientes mais estimulantes para a pesquisa e a aprendizagem. O programador milion&#225;rio Paul Graham blogou sobre isso: &lt;a href=&quot;http://www.paulgraham.com/pypar.html&quot;&gt;The Python Paradox&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Para quem tem um perfil mais empreendedor: v&#225;rios programadores Python brasileiros atendem clientes no exterior, vivendo no Brasil e recebendo em d&#243;lar ou euros. Outros tantos foram convidados para trabalhar no exterior. A demanda de especialistas em Python &#233; muito maior que a oferta, e isso cria grandes oportunidades profissionais.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/4463022840615424564-185783866697797072?l=blog.ramgarlic.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Luciano Ramalho</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.ramgarlic.com/</uri>
		</author>
		<source>
			<title type="html">Ramgarlic</title>
			<subtitle type="html">Programador repentista</subtitle>
			<link rel="self" href="http://blog.ramgarlic.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-4463022840615424564</id>
			<updated>2010-03-19T11:44:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Tatuagens em cadeia</title>
		<link href="http://www.ricbit.com/2010/01/tatuagens-em-cadeia.html"/>
		<id>tag:blogger.com,1999:blog-6306509703738480474.post-806756697191745963</id>
		<updated>2010-01-17T22:32:00+00:00</updated>
		<content type="html">Uma classe de artistas que eu admiro muito s&#227;o os tatuadores, e por um motivo simples: eles n&#227;o podem errar. Um desenhista pode usar borracha, um arte-finalista pode cobrir o erro com tinta branca, um artista digital pode apertar control-Z, mas o tatuador n&#227;o pode fazer nada disso. Um escultor, se erra, tem a op&#231;&#227;o de jogar fora o bloco de pedra e come&#231;ar de novo, mas o tatuador nem essa op&#231;&#227;o tem.&lt;br /&gt;&lt;br /&gt;Exatamente por isso, tem um tatuador que eu conhe&#231;o que se recusa a tatuar nomes de namorados. Tatuagens s&#227;o permanentes, mas namoros s&#227;o ef&#234;meros: imagine namorar algu&#233;m que tem uma tatuagem com o nome do ex? Nesse caso, uma solu&#231;&#227;o pr&#225;tica &#233; reciclar a tatuagem e namorar algu&#233;m que tenha o mesmo nome do seu ex. N&#227;o &#233; elegante, mas funciona.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://www.ricbit.com/uploaded_images/tatuagem-727747.jpg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;283&quot; src=&quot;http://www.ricbit.com/uploaded_images/tatuagem-727697.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Isso leva a conclus&#245;es curiosas. Veja o meu caso, por exemplo. Se eu tatuar ILA e minha esposa tatuar RICARDO, aparentemente ela estaria levando vantagem. &#201; muito mais f&#225;cil arrumar outro Ricardo que arrumar outra Ila. Por outro lado, eu n&#227;o precisaria procurar apenas Ilas, eu poderia arranjar uma Priscila ou uma Camila, bastando adicionar mais letras na tatuagem!&lt;br /&gt;&lt;br /&gt;Isso naturalmente leva &#224; pergunta: qual &#233; o m&#225;ximo de namoradas que um Serial Tatuator pode ter?  Por exemplo, uma pessoa poderia ir de Ana para Iana e depois Fabiana. Ser&#225; que d&#225; pra achar uma cadeia de tatuagens de tamanho quatro? Cinco? Hora de fazer uma simula&#231;&#227;o!&lt;br /&gt;&lt;br /&gt;Antes de come&#231;ar, precisamos de um corpus de nomes. O jeito mais f&#225;cil de conseguir o corpus &#233; escrevendo um crawler para um desses sites com nomes de beb&#234;s. Uma busca r&#225;pida e eu achei o &lt;a href=&quot;http://www.babyhold.com/&quot;&gt;Babyhold&lt;/a&gt;, que tem a vantagem de separar os nomes por sexo. &lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.ricbit.com/code/crawl_names.py&quot;&gt;&lt;i&gt;Script python para fazer crawling de nomes de meninas&lt;/i&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;O script retornou mais de 7100 nomes de meninas. Agora &#233; s&#243; fazer um outro script que calcule a m&#225;xima cadeia de nomes. Como a quantidade de nomes n&#227;o &#233; t&#227;o grande assim, um algoritmo c&#250;bico bobo d&#225; conta do recado:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.ricbit.com/code/name_chain.py&quot;&gt;&lt;i&gt;Script python para achar cadeias m&#225;ximas&lt;/i&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;O script acabou achando v&#225;rias solu&#231;&#245;es de tamanho seis, mas sem d&#250;vida a seq&#252;&#234;ncia mais curiosa foi a abaixo :)&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://www.ricbit.com/uploaded_images/mulheres_li-784991.jpg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;167&quot; src=&quot;http://www.ricbit.com/uploaded_images/mulheres_li-784959.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot;&gt;Li -&amp;gt; Lin -&amp;gt; Elin -&amp;gt; Elina -&amp;gt; Angelina -&amp;gt; Angelina Jolie&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;B&#244;nus!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Embora o algoritmo c&#250;bico funcione bem para 7100 nomes, certamente h&#225; como otimiz&#225;-lo. Ao inv&#233;s de fazer uma solu&#231;&#227;o mais r&#225;pida, dessa vez eu vou abrir para os leitores enviarem suas solu&#231;&#245;es! Clicando no link abaixo voc&#234; vai para o primeiro &lt;i&gt;Ricbit Jam&lt;/i&gt;, feito com a engine do spoj. Ganha quem enviar a solu&#231;&#227;o mais r&#225;pida nos pr&#243;ximos quinze dias. N&#227;o tem pr&#234;mio, mas o vencedor ter&#225; seu nome divulgado no pr&#243;ximo post :)&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.ricbit.com/ricbitjam1/&quot;&gt;Ricbit Jam #1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;N&#227;o adianta tentar mandar o programa em python acima, ele n&#227;o acha todas as solu&#231;&#245;es e vai dar TLE no servidor do spoj. Mas voc&#234; pode usar como base pra fazer a sua solu&#231;&#227;o.&lt;div class=&quot;blogger-post-footer&quot;&gt;
&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/6306509703738480474-806756697191745963?l=www.ricbit.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Ricardo Bittencourt</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.ricbit.com/</uri>
		</author>
		<source>
			<title type="html">Brain Dump</title>
			<subtitle type="html">O que est&#225; passando pela cabe&#231;a do Ricbit no momento.</subtitle>
			<link rel="self" href="http://www.ricbit.com/rss.xml"/>
			<id>tag:blogger.com,1999:blog-6306509703738480474</id>
			<updated>2010-03-11T16:44:41+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">FizzBuzz (No Stairway to Heaven)</title>
		<link href="http://kodumaro.blogspot.com/2010/01/fizzbuzz.html"/>
		<id>tag:blogger.com,1999:blog-1387996720436450649.post-6779938689445226658</id>
		<updated>2010-01-15T00:13:00+00:00</updated>
		<content type="html">&lt;img src=&quot;http://2.bp.blogspot.com/_rGfO7DAuOSE/SwSZGIY_eXI/AAAAAAAAATA/Gh-qDqdTMX0/s200/glider.png&quot; alt=&quot;Glider&quot; /&gt; Hoje um &lt;a href=&quot;http://twitter.com/flavioamieiro&quot;&gt;amigo meu&lt;/a&gt; veio falar comigo de uma brincadeira velha &#8211; e que eu n&#227;o conhecia &#8211; chamada &lt;a href=&quot;http://stackoverflow.com/questions/437/what-is-your-solution-to-the-fizzbuzz-problem&quot;&gt;FizzBuzz&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;[update 2010-01-15]&lt;/tt&gt;&lt;br /&gt;Sugest&#227;o de apontador do &lt;a href=&quot;http://twitter.com/identica_cesarb&quot;&gt;Cesar Barros&lt;/a&gt;: &lt;a href=&quot;http://wolfbyte-net.blogspot.com/2007/09/if-something-is-worth-doing.html&quot;&gt;If something is worth doing&#8230;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A prop&#243;sito, atualizei o c&#243;digo Lisp.&lt;br /&gt;&lt;tt&gt;[/update]&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;A brincadeira consiste em imprimir uma sequ&#234;ncia de n&#250;meros, tradicionalmente de 1 a 100. Por&#233;m os n&#250;meros m&#250;ltiplos de 3 devem ser substitu&#237;dos por &lt;em&gt;fizz&lt;/em&gt; e os n&#250;meros m&#250;ltiplos de 5 por &lt;em&gt;buzz&lt;/em&gt;. Os n&#250;meros que s&#227;o divis&#237;veis por 3 e por 5 devem ser substitu&#237;dos por &lt;em&gt;fizzbuzz&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;No Stackoverflow voc&#234; pode encontrar as vers&#245;es mais loucas, como &lt;a href=&quot;http://stackoverflow.com/questions/437/what-is-your-solution-to-the-fizzbuzz-problem/21328#21328&quot;&gt;LOLCODE&lt;/a&gt;, &lt;a href=&quot;http://stackoverflow.com/questions/437/what-is-your-solution-to-the-fizzbuzz-problem/4295#4295&quot;&gt;Brainf*ck&lt;/a&gt;, &lt;a href=&quot;http://stackoverflow.com/questions/437/what-is-your-solution-to-the-fizzbuzz-problem/10452#10452&quot;&gt;Ook&lt;/a&gt;, &lt;em&gt;assembly&lt;/em&gt; de &lt;a href=&quot;http://stackoverflow.com/questions/437/what-is-your-solution-to-the-fizzbuzz-problem/10421#10421&quot;&gt;8051&lt;/a&gt;, &lt;a href=&quot;http://stackoverflow.com/questions/437/what-is-your-solution-to-the-fizzbuzz-problem/66914#66914&quot;&gt;6502&lt;/a&gt; e &lt;a href=&quot;http://stackoverflow.com/questions/437/what-is-your-solution-to-the-fizzbuzz-problem/37420#37420&quot;&gt;Linux IA-32&lt;/a&gt;, &lt;a href=&quot;http://stackoverflow.com/questions/437/what-is-your-solution-to-the-fizzbuzz-problem/48722#48722&quot;&gt;Hebreu Estruturado&lt;/a&gt;, &lt;a href=&quot;http://stackoverflow.com/questions/437/what-is-your-solution-to-the-fizzbuzz-problem/35629#35629&quot;&gt;Cobol&lt;/a&gt; e &lt;a href=&quot;http://stackoverflow.com/questions/437/what-is-your-solution-to-the-fizzbuzz-problem/124485#124485&quot;&gt;Forth&lt;/a&gt;, como destaque para o po&#233;tico c&#243;digo em &lt;a href=&quot;http://stackoverflow.com/questions/437/what-is-your-solution-to-the-fizzbuzz-problem/91068#91068&quot;&gt;Perl&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Aqui quero postar algumas solu&#231;&#245;es que achei interessantes.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Em &lt;a href=&quot;http://haskell.org/&quot;&gt;Haskell&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;&lt;code class=&quot;prettyprint&quot;&gt;putStr (concat [if (mod x 15)==0 then &quot;fizzbuzz\n&quot; else if (mod x 3)==0 then &quot;fizz\n&quot; else if (mod x 5)==0 then &quot;buzz\n&quot; else (show x) ++ &quot;\n&quot; | x &amp;lt;- [1..100]])&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Em &lt;a href=&quot;http://python.org/&quot;&gt;Python&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;&lt;code class=&quot;prettyprint&quot;&gt;print &quot;\n&quot;.join('fizzbuzz' if x%15==0 else 'fizz' if x%3==0 else 'buzz' if x%5==0 else str(x) for x in xrange(1, 101))&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Em &lt;a href=&quot;http://www.perl.org/&quot;&gt;Perl&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;&lt;code class=&quot;prettyprint&quot;&gt;print +(fizz)[$_%3] . (buzz)[$_%5] || $_, $/ for 1..100;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Em &lt;a href=&quot;http://clisp.cons.org/&quot;&gt;Common Lisp&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;(format t &quot;~{~A~%~}&quot; (loop for x from 1 to 100 collect (if (= (mod x 15) 0) &quot;fizzbuzz&quot; (if (= (mod x 3) 0) &quot;fizz&quot; (if (= (mod x 5) 0) &quot;buzz&quot; x)))))&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;[]&#8217;s&lt;br /&gt;Cacilhas, La Batalema&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1387996720436450649-6779938689445226658?l=kodumaro.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Cacilh&#945;&#962;, La Batalema</name>
			<email>noreply@blogger.com</email>
			<uri>http://kodumaro.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Kodumaro</title>
			<subtitle type="html">As sombras da programa&#231;&#227;o</subtitle>
			<link rel="self" href="http://kodumaro.blogspot.com/feeds/posts/default?alt=rss"/>
			<id>tag:blogger.com,1999:blog-1387996720436450649</id>
			<updated>2010-03-19T02:44:31+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">PythonBrasil[6]: Curitiba, 2010</title>
		<link href="http://associacao.python.org.br/associacao/imprensa/noticias/pythonbrasil-6-curitiba-2010"/>
		<id>http://associacao.python.org.br/associacao/imprensa/noticias/pythonbrasil-6-curitiba-2010</id>
		<updated>2010-01-13T02:05:25+00:00</updated>
		<content type="html">Definido o local do sexto encontro brasileiro da comunidade Python.</content>
		<author>
			<name>Noticias da APyB</name>
			<uri>http://associacao.pythonbrasil.org/noticias</uri>
		</author>
		<source>
			<title type="html">Not&#237;cias</title>
			<subtitle type="html">Not&#237;cias sobre a Associa&#231;&#227;o.</subtitle>
			<link rel="self" href="http://associacao.python.org.br/noticias/RSS"/>
			<id>http://associacao.python.org.br/noticias/RSS</id>
			<updated>2010-03-22T05:44:04+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Porque meu GPS n&#227;o fala com a web?</title>
		<link href="http://feedproxy.google.com/~r/Fechatag/~3/tq8oF91NToM/"/>
		<id>http://blog.elcio.com.br/porque-meu-gps-nao-fala-com-a-web/</id>
		<updated>2010-01-11T13:00:40+00:00</updated>
		<content type="html">&lt;p&gt;Passei a &#250;ltima semana no &lt;a href=&quot;http://www.ipae.org.br/&quot;&gt;IPAE&lt;/a&gt;, &lt;a href=&quot;http://maps.google.com.br/?ie=UTF8&amp;ll=-22.439348,-43.184096&amp;spn=0.002474,0.006866&amp;t=h&amp;z=18&quot;&gt;aqui&lt;/a&gt;. &#201; o col&#233;gio em que fiz o segundo grau (faz tempo!), um lugar fant&#225;stico, ao p&#233; de uma montanha, regi&#227;o com paisagens inacredit&#225;veis. Me hospedei no col&#233;gio com minha fam&#237;lia, para matar saudades, e todos os dias sa&#237;amos para visitar algum lugar em Petr&#243;polis ou Teres&#243;polis.&lt;/p&gt;
&lt;p&gt;H&#225; catorze anos, quando estudei l&#225;, telefonava para minha fam&#237;lia uma vez por semana apenas, pois os interurbanos eram muito caros. Dessa vez, estava conectado via rede 3G o tempo todo. O mundo mudou muito r&#225;pido em catorze anos. Ponto para o 3G da Claro, que funcionou em todo lugar onde fui, inclusive em todo o trajeto paulista (Dutra, Carvalho Pinto, Ayrton Senna) e em boa parte do estado do Rio de Janeiro. Na regi&#227;o de Itatiaia virou 2G, mas continuou funcionando.&lt;/p&gt;
&lt;p&gt;Antes de sair para viajar, us&#225;vamos o &lt;a href=&quot;http://maps.google.com.br/&quot;&gt;Google Maps&lt;/a&gt; e a &lt;a href=&quot;http://wikimapia.org/&quot;&gt;Wikimapia&lt;/a&gt; para encontrar os pontos de interesse. O problema? Depois de encontrar o ponto de interesse, &lt;a href=&quot;http://twitter.com/josuesupernet&quot;&gt;meu sobrinho&lt;/a&gt; tinha que digitar os endere&#231;os no GPS para obter a rota. E quando o ponto de interesse ficava no meio de uma estrada, o jeito era navegar &#224; m&#227;o no GPS at&#233; o lugar, arrastando o mapa para c&#225; e para l&#225;.&lt;/p&gt;
&lt;p&gt;Ser&#225; que s&#243; eu sofri com isso? Voc&#234;s, meus bem informados leitores, conhecem algum aparelho de GPS que fale com a web, atrav&#233;s de alguma integra&#231;&#227;o maluca? O ideal seria GPRS. Seria muito interessante se, enquanto estou dirigindo, um passageiro pudesse pegar o GPS e ver a navega&#231;&#227;o acontecendo sobre a Wikimapia, por exemplo. Algu&#233;m j&#225; viu isso? Alguma id&#233;ia de como fazer?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/dg4WcTi-WSOoK77Eb3tAnWf_gD4/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/dg4WcTi-WSOoK77Eb3tAnWf_gD4/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/dg4WcTi-WSOoK77Eb3tAnWf_gD4/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/dg4WcTi-WSOoK77Eb3tAnWf_gD4/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/Fechatag?a=tq8oF91NToM:B3AndMUJ6DI:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Fechatag?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Fechatag?a=tq8oF91NToM:B3AndMUJ6DI:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Fechatag?i=tq8oF91NToM:B3AndMUJ6DI:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Elcio Luiz Ferreira</name>
			<uri>http://blog.elcio.com.br</uri>
		</author>
		<source>
			<title type="html">fechaTag</title>
			<subtitle type="html">XML, XHTML, CSS, Tableless, Desenvolvimento Web, Python, Linux</subtitle>
			<link rel="self" href="http://blog.elcio.com.br/tag/programacao/feed/"/>
			<id>http://blog.elcio.com.br/tag/programacao/feed/</id>
			<updated>2010-03-17T17:44:18+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Ajude a mostrar a PythonBrasil na PyCon 2010</title>
		<link href="http://kodumaro.blogspot.com/2010/01/ajude-mostrar-pythonbrasil-na-pycon.html"/>
		<id>tag:blogger.com,1999:blog-1387996720436450649.post-6576141260006879094</id>
		<updated>2010-01-09T02:07:00+00:00</updated>
		<content type="html">&lt;img src=&quot;http://photos1.blogger.com/blogger/6505/3295/200/python.png&quot; alt=&quot;&quot; /&gt; Meu amigo &lt;a href=&quot;http://henriquebastos.net/&quot;&gt;Henrique Bastos&lt;/a&gt; publicou hoje um artigo entitulado &lt;a href=&quot;http://henriquebastos.net/2010/01/08/ajude-a-mostrar-a-pythonbrasil-na-pycon-2010/&quot;&gt;Ajude a mostrar a PythonBrasil na PyCon 2010&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A proposta &#233; muito legal e j&#225; preenchi o &lt;a href=&quot;http://henriquebastos.wufoo.com/forms/vamos-divulgar-nossa-comunidade-python-na-pycon/&quot;&gt;formul&#225;rio&lt;/a&gt; para reunir informa&#231;&#245;es sobre a Comunidade Python no Brasil.&lt;br /&gt;&lt;br /&gt;Segue uma reprodu&#231;&#227;o do artigo:&lt;br /&gt;&lt;blockquote&gt;Salve Pythonistas!&lt;br /&gt;&lt;br /&gt;De 19 a 21 de fevereiro ser&#225; realizada a &lt;a title=&quot;Site do evento.&quot; href=&quot;http://us.pycon.com&quot;&gt;PyCon&lt;/a&gt;, &lt;a title=&quot;Veja onde ser&#225; realizada a confer&#234;ncia.&quot; href=&quot;http://maps.google.com.br/maps/place?cid=16656910773578529375&amp;q=hyatt+atlanta&amp;hl=pt-BR&amp;cd=1&amp;cad=src:pplink&amp;ei=TL1HS9TrJp_EyQTwxqTmBw&amp;sig2=FbA0IOSLu6RvNabKmyeADg&quot;&gt;em Atlanta nos Estados Unidos&lt;/a&gt;. Como alguns de voc&#234;s j&#225; sabem, participarei do evento apresentando a &lt;a title=&quot;Veja o resumo na p&#225;gina das palestras.&quot; href=&quot;http://us.pycon.org/2010/conference/talks&quot;&gt;palestra #78 entitulada &#171;Small acts make great revolutions&#187;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Esta apresenta&#231;&#227;o ser&#225; uma evolu&#231;&#227;o da palestra rel&#226;mpago que fiz na &lt;a title=&quot;Site do evento.&quot; href=&quot;http://www.pythonbrasil.org.br/2009&quot;&gt;PythonBrasil[5] em Caxias do Sul&lt;/a&gt;, onde tento difundir os conceitos por tr&#225;s das iniciativas que v&#234;m movimentando a comunidade no Rio de Janeiro.&lt;br /&gt;&lt;br /&gt;No entanto, falar s&#243; do que acontece no Rio me parece muito pouco para uma oportunidade dessas. Quero muito aproveitar a &lt;a title=&quot;Site do evento.&quot; href=&quot;http://us.pycon.com&quot;&gt;PyCon&lt;/a&gt; para mostrar o grande desenvolvimento da &lt;a href=&quot;http://www.python.org.br/wiki&quot;&gt;Comunidade Python no Brasil&lt;/a&gt;. Pessoasfant&#225;sticas est&#227;o fazendo as coisas acontecerem em Terras Brasilis. E a &lt;a title=&quot;Video da 1a palestra rel&#226;mpago sobre &quot;&gt;exemplo do que fiz no FISL 10&lt;/a&gt;, pretendo continuar na linha de tentar evidenciar que na nossa comunidade, o todo &#233; muito maior do que a soma das partes. Mas para isto, eu preciso da ajuda de voc&#234;s.&lt;br /&gt;&lt;br /&gt;Para poder falar com propriedade sobre a &lt;a href=&quot;http://www.python.org.br/wiki&quot;&gt;Comunidade Python no Brasil&lt;/a&gt;, precisamos tra&#231;ar o perfil do nosso grupo. Por isso, preparei um r&#225;pido question&#225;rio &lt;em&gt;online&lt;/em&gt; que ajudar&#225; a levantar informa&#231;&#245;es sobre nossa comunidade. Ele est&#225; dispon&#237;vel em: &lt;a title=&quot;N&#227;o deixe de responder &#224; pesquisa!&quot; href=&quot;http://henriquebastos.wufoo.com/forms/vamos-divulgar-nossa-comunidade-python-na-pycon/&quot;&gt;http://henriquebastos.wufoo.com/forms/vamos-divulgar-nossa-comunidade-python-na-pycon/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&#201; muito importante que o maior n&#250;mero de &lt;em&gt;pythonistas&lt;/em&gt; respondam &#224; pesquisa. Isso vai ajudar muito! Portanto, &lt;strong&gt;n&#227;o economizem nos &lt;em&gt;retweets&lt;/em&gt; e espalhem o &lt;em&gt;link&lt;/em&gt; da pesquisa por todas as listas de email&lt;/strong&gt; no Brasil,  relacionadas com &lt;a title=&quot;Site da linguagem&quot; href=&quot;http://python.org&quot;&gt;Python&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Al&#233;m disso, tamb&#233;m estou buscando &lt;em&gt;links&lt;/em&gt; para boas fotos em alta resolu&#231;&#227;o, como as tiradas na escadaria da PUC-RS durante o FISL 10 e as fotos &#171;a&#233;reas&#187; da &lt;a href=&quot;http://www.pythonbrasil.org.br/2008&quot;&gt;PythonBrasil[4] na UVA&lt;/a&gt; etc. Basta publicarem os &lt;em&gt;links&lt;/em&gt; para as fotos nos coment&#225;rios deste &lt;em&gt;post&lt;/em&gt; ou me enviar por &lt;em&gt;email&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Obrigado &#224; todos, e &lt;em&gt;vamo que vamo&lt;/em&gt;!&lt;br /&gt;&lt;br /&gt;[]&#8217;s!&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;J&#225; andei &lt;a href=&quot;http://twitter.com/batalema/status/7541409617&quot;&gt;tuitando&lt;/a&gt; e divulguei nas &lt;a href=&quot;http://montegasppa.blogspot.com/2010/01/ajude-mostrar-pythonbrasil-na-pycon.html&quot;&gt;Reflex&#245;es de Monte Gasppa e Giulia C.&lt;/a&gt; tamb&#233;m. Convido todos ent&#227;o a &lt;a href=&quot;http://henriquebastos.net/2010/01/08/ajude-a-mostrar-a-pythonbrasil-na-pycon-2010/&quot;&gt;ler o artigo&lt;/a&gt; e &lt;a href=&quot;http://henriquebastos.wufoo.com/forms/vamos-divulgar-nossa-comunidade-python-na-pycon/&quot;&gt;preencher o formul&#225;rio&lt;/a&gt;, ajudando assim o Henrique a revelar e expor a Comunidade Python no Brasil ao Mundo!&lt;br /&gt;&lt;br /&gt;[]&#8217;s&lt;br /&gt;Cacilhas, La Batalema&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1387996720436450649-6576141260006879094?l=kodumaro.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Cacilh&#945;&#962;, La Batalema</name>
			<email>noreply@blogger.com</email>
			<uri>http://kodumaro.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Kodumaro</title>
			<subtitle type="html">As sombras da programa&#231;&#227;o</subtitle>
			<link rel="self" href="http://kodumaro.blogspot.com/feeds/posts/default?alt=rss"/>
			<id>tag:blogger.com,1999:blog-1387996720436450649</id>
			<updated>2010-03-19T02:44:31+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Enlightenment meets ConnMan</title>
		<link href="http://feedproxy.google.com/~r/GustavoSverzutBarbieri/~3/qJS9LbEgcLk/"/>
		<id>http://blog.gustavobarbieri.com.br/?p=203</id>
		<updated>2010-01-02T23:05:33+00:00</updated>
		<content type="html">&lt;p&gt;I&amp;#8217;m proud to present you with my last &lt;a href=&quot;http://www.enlightenment.org/&quot;&gt;Enlightenment&lt;/a&gt; module: &lt;a href=&quot;http://connman.net/&quot;&gt;ConnMan&lt;/a&gt;!&lt;/p&gt;
&lt;div&gt;
&lt;img src=&quot;http://blog.gustavobarbieri.com.br/wp-content/uploads/2010/01/connman-popup.png&quot; alt=&quot;ConnMan module popup.&quot; title=&quot;ConnMan module popup.&quot; /&gt;
&lt;/div&gt;
&lt;p&gt;For those unfamiliar with ConnMan, it is a solution to configure and manager your network connections. Unlike NetworkManager, it is very simple and fast, specially for users of it&amp;#8217;s DBus API. It will manage everything, including DNS proxy to avoid messing with your &lt;code&gt;/etc/resolv.conf&lt;/code&gt;. It also handles WiFi, Ethernet, WiMax, Bluetooth and even Cellular connections easily. For developers using it, it is very simple to use and you just need to use the high level &amp;#8220;Service&amp;#8221; interface.&lt;/p&gt;
&lt;div&gt;
&lt;img src=&quot;http://blog.gustavobarbieri.com.br/wp-content/uploads/2010/01/connman-tooltip.png&quot; alt=&quot;ConnMan module tooltip&quot; title=&quot;ConnMan module tooltip&quot; /&gt;
&lt;/div&gt;
&lt;p&gt;In order to make it more useful, I created &lt;code&gt;econnman&lt;/code&gt; inside &lt;code&gt;e_dbus&lt;/code&gt; that abstracts the DBus API as a nice C interface that matches it perfectly and optimally, keeping objects in sync with server and emitting &lt;code&gt;Ecore_Event&lt;/code&gt; whenever things change.&lt;/p&gt;
&lt;p&gt;The module is quite simple, yet useful. As seen in the above screenshots, it will list the current status and service name (if module is bigger than 32px), when you mouse over it will show a fancy popup with more details, including error messages and IPv4 addresses. If you click it, you get a simple popup with the current connected service selected and clicking it will disconnect, while clicking a new one will connect to that one. Services requiring password will automatically ask for it, while those that failed to connect will also re-ask your password.&lt;/p&gt;
&lt;p&gt;The module nicely exposes the &lt;b&gt;offline mode&lt;/b&gt; feature to turn off radios. It integrates well with E17 mode: whenever you change E17 or ConnMan, they will sync with the other.&lt;/p&gt;
&lt;p&gt;There is still work to do, mainly focus on the cellular specific needs and also create static services. And I also plan to have an application to allow managing your services, reorder them (that defines the priority) and even switch technologies that are available.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/GustavoSverzutBarbieri/~4/qJS9LbEgcLk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Gustavo Barbieri</name>
			<uri>http://blog.gustavobarbieri.com.br</uri>
		</author>
		<source>
			<title type="html">Gustavo Sverzut Barbieri</title>
			<subtitle type="html">a hacker analysis of life</subtitle>
			<link rel="self" href="http://blog.gustavobarbieri.com.br/feed/atom/"/>
			<id>http://blog.gustavobarbieri.com.br/feed/atom/</id>
			<updated>2010-03-12T23:44:21+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Newton e os universos paralelos</title>
		<link href="http://www.ricbit.com/2010/01/newton-e-os-universos-paralelos_02.html"/>
		<id>tag:blogger.com,1999:blog-6306509703738480474.post-8361784126950886319</id>
		<updated>2010-01-02T03:45:00+00:00</updated>
		<content type="html">&lt;a href=&quot;http://www.blogger.com/&quot;&gt;&lt;/a&gt;&lt;span id=&quot;goog_1262398529649&quot;&gt;&lt;/span&gt;&lt;span id=&quot;goog_1262398529650&quot;&gt;&lt;/span&gt;Neste &#250;ltimo Natal fomos passar o feriado no s&#237;tio. N&#227;o precisei de muito tempo pra notar que eu n&#227;o funciono muito bem nesse ambiente. Al&#233;m de ser al&#233;rgico a quase todos os insetos, eu tinha apenas uma pequena no&#231;&#227;o de coisas b&#225;sicas de quem vive por l&#225; (como andar a cavalo, por exemplo).&amp;nbsp;Isso nem me chateia, porque em compensa&#231;&#227;o eu tenho outras habilidades que o pessoal do s&#237;tio n&#227;o tem, como saber usar o &lt;a href=&quot;http://www.google.com/sky/skymap.html&quot;&gt;Google Sky Map&lt;/a&gt; pra identificar as estrelas no c&#233;u.&lt;br /&gt;&lt;br /&gt;Enquanto eu descansava numa rede, eu comecei a pensar como seria um universo paralelo onde o Ricbit &#233; um matuto que entende tudo da vida no campo. Mas o pensamento n&#227;o durou muito. Que coisa batida isso, se for pra imaginar um universo paralelo, vamos imaginar um mais original!&lt;br /&gt;&lt;br /&gt;Sempre que pensamos em universo paralelos, tendemos a imaginar um muito semelhante ao nosso, onde apenas alguns detalhes mudam. E se imagin&#225;ssemos um universo t&#227;o diferente que at&#233; as leis f&#237;sicas s&#227;o distintas da nossa? Por exemplo, como seriam as &#243;rbitas planet&#225;rias num universo onde a Lei da Gravidade n&#227;o variasse com o quadrado da dist&#226;ncia, mas sim com alguma outra express&#227;o qualquer?&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://www.ricbit.com/uploaded_images/rede_sitio-776204.jpg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;315&quot; src=&quot;http://www.ricbit.com/uploaded_images/rede_sitio-776197.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Esse exemplo &#233; bacana por causa da sua import&#226;ncia hist&#243;rica. Vamos voltar para o tempo do &lt;a href=&quot;http://en.wikipedia.org/wiki/Isaac_Newton&quot;&gt;Isaac Newton&lt;/a&gt;, que o Asimov considerava o maior de todos os cientistas. &#201; ineg&#225;vel que o Newton era um g&#234;nio, mas o que nem todo mundo sabe &#233; que ele era briguento, vingativo, e costumava cometer o maior pecado que um cientista pode fazer: n&#227;o citar as fontes.&lt;br /&gt;&lt;br /&gt;Isso aconteceu com a Lei da Gravidade. Naquela &#233;poca ainda n&#227;o existiam as listas de discuss&#227;o, ent&#227;o os cientistas conversavam por cartas escritas &#224; m&#227;o. Certa vez, Newton recebeu uma carta do &lt;a href=&quot;http://en.wikipedia.org/wiki/Robert_Hooke&quot;&gt;Robert Hooke&lt;/a&gt;, aquele que hoje &#233; conhecido pela &lt;a href=&quot;http://en.wikipedia.org/wiki/Hooke's_Law&quot;&gt;lei da molas&lt;/a&gt;. Nessa carta, Hooke dizia que suspeitava da exist&#234;ncia de uma for&#231;a da gravidade, que seria central (dependendo apenas da dist&#226;ncia), e provavelmente proporcional ao inverso do quadrado da dist&#226;ncia. Na carta ele ainda dizia que n&#227;o sabia como provar essa suspeita.&lt;br /&gt;&lt;br /&gt;Hoje em dia a raz&#227;o para o Hooke n&#227;o saber provar &#233; clara. Pra conseguir provar, voc&#234; precisa saber C&#225;lculo, que o Newton j&#225; tinha inventado, mas ainda n&#227;o tinha contado pra ningu&#233;m. Se o Newton fosse gente boa, ele teria respondido algo do tipo &quot;eu sei provar, chega mais e vamos resolver juntos&quot;. Ao inv&#233;s disso, ele ficou na mi&#250;da, e anos depois publicou o Principia Mathematica, onde ele usava o C&#225;lculo para mostrar que a tal for&#231;a central inversamente quadr&#225;tica implica em &#243;rbitas que s&#227;o se&#231;&#245;es c&#244;nicas.&lt;br /&gt;&lt;br /&gt;O Hooke, compreensivelmente, ficou puto, e foi reclamar com o editor do livro, o &lt;a href=&quot;http://en.wikipedia.org/wiki/Edmond_Halley&quot;&gt;Halley&lt;/a&gt; (o cientista, n&#227;o o cometa). Depois de muito bate-boca, o Halley convenceu o Newton a colocar um pref&#225;cio onde ele dizia que a lei da gravidade tinha sido sugerida informalmente pelo Hooke, mas sem demonstra&#231;&#227;o. Numa carta posterior ao Hooke, Newton ainda diria &quot;&lt;i&gt;se enxerguei mais longe, foi porque estava sobre o ombro de gigantes&lt;/i&gt;&quot;. N&#227;o era humildade, era trollagem. Conta-se que Hooke era baixinho e corcunda.&lt;br /&gt;&lt;br /&gt;Mas o Newton n&#227;o parou por a&#237;. Certa vez, ele ficou como respons&#225;vel pela mudan&#231;a de pr&#233;dio da Royal Society. Entre os quadros que precisavam ser mudados, estavam os retratos de todos os membros do grupo. Por uma coincid&#234;ncia n&#227;o-explicada, o quadro do Hooke foi o &#250;nico que se perdeu no caminho. Hoje em dia, ningu&#233;m sabe como era o rosto do Hooke, esse quadro perdido era o &#250;nico retrato dele.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://www.ricbit.com/uploaded_images/royal_society-746652.jpg&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;124&quot; src=&quot;http://www.ricbit.com/uploaded_images/royal_society-746604.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Nada disso teria acontecido se o Hooke soubesse C&#225;lculo. E n&#243;s, para calcularmos nossas &#243;rbitas em universos paralelos, vamos fazer exatamente as contas que o Hooke desconhecia! Se voc&#234; tamb&#233;m n&#227;o sabe c&#225;lculo, pule a caixa azul e v&#225; direto pro resultado.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Consideremos um sistema com duas massas pontuais no v&#225;cuo. As contas em coordenadas cartesianas s&#227;o meio chatas, ent&#227;o vamos usar coordenadas polares, centradas numa das massas. Nesse tipo de conta, o normal &#233; usar um sistema de versores &lt;b&gt;r&lt;/b&gt; e &lt;b&gt;&#952;&lt;/b&gt; que giram junto com o planeta, mas a engenharia me deixou v&#237;cios dif&#237;ceis de largar, ent&#227;o eu vou usar exponenciais complexas. A posi&#231;&#227;o do planeta &#233; a seguinte:&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;p=re^{j\theta}&quot; class=&quot;ee_img tr_noresize&quot; src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=p%3Dre%5E%7Bj%5Ctheta%7D&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Note que r e &#952; na verdade s&#227;o r(t) e &#952;(t), eu vou omitir o tempo pra n&#227;o poluir as equa&#231;&#245;es. A acelera&#231;&#227;o da part&#237;cula &#233; a segunda derivada:&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;p'=r'e^{ j\theta}+rj\theta'e^{j\theta}&quot; class=&quot;ee_img tr_noresize&quot; src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=p'%3Dr'e%5E%7B%20j%5Ctheta%7D%2Brj%5Ctheta'e%5E%7Bj%5Ctheta%7D&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;p''=r''e^{j\theta} +r'j\theta'e^{j\theta}+r'j\theta'e^{j\theta}+rj \theta''e^{j\theta}+rj^{2}\theta'^{2} e^{j\theta}&quot; class=&quot;ee_img tr_noresize&quot; src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=p''%3Dr''e%5E%7Bj%5Ctheta%7D%20%2Br'j%5Ctheta'e%5E%7Bj%5Ctheta%7D%2Br'j%5Ctheta'e%5E%7Bj%5Ctheta%7D%2Brj%20%5Ctheta''e%5E%7Bj%5Ctheta%7D%2Brj%5E%7B2%7D%5Ctheta'%5E%7B2%7D%20e%5E%7Bj%5Ctheta%7D&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Agrupando os termos e lembrando que j&lt;sup&gt;2&lt;/sup&gt; = -1, temos:&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;p''=(r''-r\theta'^{2})e^{j\theta}+(2r'\theta'+r\theta'')je^{j\theta}&quot; class=&quot;ee_img tr_noresize&quot; src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=p''%3D(r''-r%5Ctheta'%5E%7B2%7D)e%5E%7Bj%5Ctheta%7D%2B(2r'%5Ctheta'%2Br%5Ctheta'')je%5E%7Bj%5Ctheta%7D&quot; /&gt;&lt;br /&gt;&lt;br /&gt;At&#233; aqui tudo gen&#233;rico. Vamos impor agora que a for&#231;a seja central. Nesse caso, a componente transversal vale zero. Note que, com uma pequena manipula&#231;&#227;o alg&#233;brica, d&#225; pra isolar uma derivada:&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;2r'\theta'+r\theta''=\frac{1}{r}(2rr'\theta'+r^{2}\theta'')=\frac{1}{r}\frac{d}{dt}(r^{2}\theta')=0&quot; class=&quot;ee_img tr_noresize&quot; src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=2r'%5Ctheta'%2Br%5Ctheta''%3D%5Cfrac%7B1%7D%7Br%7D(2rr'%5Ctheta'%2Br%5E%7B2%7D%5Ctheta'')%3D%5Cfrac%7B1%7D%7Br%7D%5Cfrac%7Bd%7D%7Bdt%7D(r%5E%7B2%7D%5Ctheta')%3D0&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Aqui temos duas solu&#231;&#245;es. A primeira &#233; sem gra&#231;a, 1/r=0 se as duas massas estiverem infinitamente distantes, a&#237; naturalmente a for&#231;a transversal &#233; zero. O segundo caso &#233; mais legal:&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;\frac{d}{dt}(r^{2}\theta')=0 \Rightarrow r^{2}\theta'=k&quot; class=&quot;ee_img tr_noresize&quot; src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=%5Cfrac%7Bd%7D%7Bdt%7D(r%5E%7B2%7D%5Ctheta')%3D0%20%5CRightarrow%20r%5E%7B2%7D%5Ctheta'%3Dk&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Se a derivada &#233; zero, ent&#227;o a integral &#233; uma constante. Se voc&#234; lembrar que r&lt;sup&gt;2&lt;/sup&gt;&#952; &#233; o dobro da &#225;rea de um setor circular, ent&#227;o o que essa f&#243;rmula diz &#233; que a taxa de varia&#231;&#227;o da &#225;rea de um setor &#233; constante, ou seja, para um dado intervalo de tempo, ele percorre sempre a mesma &#225;rea. Ora, essa &#233; a segunda lei de Kepler! Pelo que conclu&#237;mos, ela funciona pra qualquer for&#231;a central, n&#227;o s&#243; pra gravidade.&lt;br /&gt;&lt;br /&gt;Vamos lidar com a componente radial agora. As massas s&#227;o todas constantes, ent&#227;o vale que F=ma. Al&#233;m disso, vamos introduzir uma vari&#225;vel u pra facilitar as contas:&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;\frac{F}{m}=r''-r\theta'^{2}&quot; class=&quot;ee_img tr_noresize&quot; src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=%5Cfrac%7BF%7D%7Bm%7D%3Dr''-r%5Ctheta'%5E%7B2%7D&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;r=\frac{1}{u}\Rightarrow u=\frac{1}{r}&quot; class=&quot;ee_img tr_noresize&quot; src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=r%3D%5Cfrac%7B1%7D%7Bu%7D%5CRightarrow%20u%3D%5Cfrac%7B1%7D%7Br%7D&quot; /&gt;&lt;br /&gt;&lt;br /&gt;N&#243;s podemos isolar o tempo e deixar o raio em fun&#231;&#227;o do &#226;ngulo, usando uma mudan&#231;a de v&#225;riaveis com a regra da cadeia.&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;r^{2} \theta'=k \Rightarrow \frac{d\theta}{dt}=\frac{k}{r^{2}}=ku^{2}&quot; class=&quot;ee_img tr_noresize&quot; src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=r%5E%7B2%7D%20%5Ctheta'%3Dk%20%5CRightarrow%20%5Cfrac%7Bd%5Ctheta%7D%7Bdt%7D%3D%5Cfrac%7Bk%7D%7Br%5E%7B2%7D%7D%3Dku%5E%7B2%7D&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;r'=\frac{dr}{dt}=\frac{dr}{d\theta}\frac{d\theta}{dt}=\frac{d}{d\theta}(\frac{1}{u})ku^{2} =-\frac{1}{u^{2}}\frac{du}{d\theta}ku^{2}=-k\frac{du}{d\theta}&quot; class=&quot;ee_img tr_noresize&quot; src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=r'%3D%5Cfrac%7Bdr%7D%7Bdt%7D%3D%5Cfrac%7Bdr%7D%7Bd%5Ctheta%7D%5Cfrac%7Bd%5Ctheta%7D%7Bdt%7D%3D%5Cfrac%7Bd%7D%7Bd%5Ctheta%7D(%5Cfrac%7B1%7D%7Bu%7D)ku%5E%7B2%7D%20%3D-%5Cfrac%7B1%7D%7Bu%5E%7B2%7D%7D%5Cfrac%7Bdu%7D%7Bd%5Ctheta%7Dku%5E%7B2%7D%3D-k%5Cfrac%7Bdu%7D%7Bd%5Ctheta%7D&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;r''=\frac{dr'}{dt}=\frac{dr'}{d\theta}\frac{d\theta}{dt}=\frac{d}{d\theta}(-k\frac{du}{d\theta})ku^{2}=-k^{2}u^{2}\frac{d^{2}u}{d\theta^{2}}&quot; class=&quot;ee_img tr_noresize&quot; src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=r''%3D%5Cfrac%7Bdr'%7D%7Bdt%7D%3D%5Cfrac%7Bdr'%7D%7Bd%5Ctheta%7D%5Cfrac%7Bd%5Ctheta%7D%7Bdt%7D%3D%5Cfrac%7Bd%7D%7Bd%5Ctheta%7D(-k%5Cfrac%7Bdu%7D%7Bd%5Ctheta%7D)ku%5E%7B2%7D%3D-k%5E%7B2%7Du%5E%7B2%7D%5Cfrac%7Bd%5E%7B2%7Du%7D%7Bd%5Ctheta%5E%7B2%7D%7D&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Agora &#233; s&#243; substituir na equa&#231;&#227;o original:&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;\frac{F}{m}=r''-r(\frac{d\theta}{dt})^{2}=-k^{2}u^{2}\frac{d^{2}u}{d\theta^{2}}-\frac{1}{u}(ku^{2})^{2}=-k^{2}u^{2}(\frac{d^{2}u}{d\theta^{2}}+u)&quot; class=&quot;ee_img tr_noresize&quot; src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=%5Cfrac%7BF%7D%7Bm%7D%3Dr''-r(%5Cfrac%7Bd%5Ctheta%7D%7Bdt%7D)%5E%7B2%7D%3D-k%5E%7B2%7Du%5E%7B2%7D%5Cfrac%7Bd%5E%7B2%7Du%7D%7Bd%5Ctheta%5E%7B2%7D%7D-%5Cfrac%7B1%7D%7Bu%7D(ku%5E%7B2%7D)%5E%7B2%7D%3D-k%5E%7B2%7Du%5E%7B2%7D(%5Cfrac%7Bd%5E%7B2%7Du%7D%7Bd%5Ctheta%5E%7B2%7D%7D%2Bu)&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;-\frac{F}{mk^{2}u^{2}}=\frac{d^{2}u}{d\theta^{2}}+u&quot; class=&quot;ee_img tr_noresize&quot; src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=-%5Cfrac%7BF%7D%7Bmk%5E%7B2%7Du%5E%7B2%7D%7D%3D%5Cfrac%7Bd%5E%7B2%7Du%7D%7Bd%5Ctheta%5E%7B2%7D%7D%2Bu&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Pronto! Esta &#233; a equa&#231;&#227;o geral das &#243;rbitas com for&#231;a central. Para conferir se est&#225; certo, vamos colocar uma for&#231;a inversamente quadr&#225;tica. Note que as for&#231;as precisam ser negativas, pois, na nossa orienta&#231;&#227;o, for&#231;as atrativas s&#227;o negativas. Ali&#225;s, como eu n&#227;o estou interessado em unidades, vou escolher constantes que cancelem.&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;F=-\frac{mk^{2}}{r^{2}}=-mk^{2}u^{2}&quot; class=&quot;ee_img tr_noresize&quot; src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=F%3D-%5Cfrac%7Bmk%5E%7B2%7D%7D%7Br%5E%7B2%7D%7D%3D-mk%5E%7B2%7Du%5E%7B2%7D&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;1=\frac{d^{2}u}{d\theta^{2}}+u&quot; class=&quot;ee_img tr_noresize&quot; src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=1%3D%5Cfrac%7Bd%5E%7B2%7Du%7D%7Bd%5Ctheta%5E%7B2%7D%7D%2Bu&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Para resolver a equa&#231;&#227;o diferencial, somamos a solu&#231;&#227;o particular com as homog&#234;neas. Uma particular &#233; f&#225;cil, u=1. A homog&#234;nea todo mundo sabe de cabe&#231;a, &#233; cos(&#952;) (vezes uma constante que depende das condi&#231;&#245;es de contorno). Afinal, &#233; a mesma solu&#231;&#227;o do sistema massa-mola, do oscilador LC, e assim por diante.&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;u=1+e.cos(\theta) \Rightarrow r=\frac{1}{1+e.cos(\theta)&quot; class=&quot;ee_img tr_noresize&quot; src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=u%3D1%2Be.cos(%5Ctheta)%20%5CRightarrow%20r%3D%5Cfrac%7B1%7D%7B1%2Be.cos(%5Ctheta)&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Ah&#225;! Esta &#233; equa&#231;&#227;o da se&#231;&#227;o c&#244;nica em coordenadas polares. Dependendo do valor de e, a &#243;rbita pode ser circular (e=0, como V&#234;nus, aproximadamente), el&#237;ptica (e&amp;lt;1, como a Terra), parab&#243;lica ou hiperb&#243;lica (e=1 ou e&amp;gt;1, como os cometas).&lt;br /&gt;&lt;br /&gt;Vamos tentar outro tipo de for&#231;a, por exemplo, uma inversamente c&#250;bica. Nesse caso:&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;F=-\frac{mk^{2}}{r^{3}}=-mk^{2}u^{3}&quot; class=&quot;ee_img tr_noresize&quot; src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=F%3D-%5Cfrac%7Bmk%5E%7B2%7D%7D%7Br%5E%7B3%7D%7D%3D-mk%5E%7B2%7Du%5E%7B3%7D&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;u=\frac{d^{2}u}{d\theta^{2}}+u \Rightarrow \frac{d^{2}u}{d\theta^{2}} =0 \Rightarrow u=\theta \Rightarrow r=\frac{1}{\theta}&quot; class=&quot;ee_img tr_noresize&quot; src=&quot;http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chco=000000&amp;chl=u%3D%5Cfrac%7Bd%5E%7B2%7Du%7D%7Bd%5Ctheta%5E%7B2%7D%7D%2Bu%20%5CRightarrow%20%5Cfrac%7Bd%5E%7B2%7Du%7D%7Bd%5Ctheta%5E%7B2%7D%7D%20%3D0%20%5CRightarrow%20u%3D%5Ctheta%20%5CRightarrow%20r%3D%5Cfrac%7B1%7D%7B%5Ctheta%7D&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Ou seja, a &#243;rbita agora &#233; uma espiral.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Agora que temos a equa&#231;&#227;o geral, podemos colocar a for&#231;a que quisermos, e analisar a &#243;rbita resultante. O problema &#233; que muitas f&#243;rmulas geram equa&#231;&#245;es que n&#227;o tem solu&#231;&#227;o anal&#237;tica, ent&#227;o eu fiz um scriptzinho em python pra resolver numericamente mesmo. Abaixo o script e os resultados para v&#225;rias fun&#231;&#245;es:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.ricbit.com/code/orbit.py&quot;&gt;Script em python para resolver &#243;rbitas em universos paralelos&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.ricbit.com/uploaded_images/orbit-740350.gif&quot; /&gt;Para uma for&#231;a &lt;b&gt;inversamente quadr&#225;tica&lt;/b&gt;, a &#243;rbita &#233; circular, como esperado pela Lei da Gravidade.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.ricbit.com/uploaded_images/orbit-797050.gif&quot; /&gt;J&#225; uma for&#231;a &lt;b&gt;inversamente c&#250;bica&lt;/b&gt; gera uma espiral. Essa for&#231;a &#233; fraquinha demais pra manter uma &#243;rbita, e o planeta vai aos poucos se afastando.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.ricbit.com/uploaded_images/orbit-734776.gif&quot; /&gt;Uma for&#231;a &lt;b&gt;inversamente linear&lt;/b&gt; demora para estabilizar, mas acaba fazendo uma &#243;rbita circular tamb&#233;m.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.ricbit.com/uploaded_images/orbit-793860.gif&quot; /&gt;E uma for&#231;a &lt;b&gt;constante&lt;/b&gt;, independente da dist&#226;ncia? Ela tamb&#233;m termina numa &#243;rbita circular, o que pra mim faz sentido. O planeta se move at&#233; o ponto onde a for&#231;a constante &#233; igual &#224; centr&#237;peta.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.ricbit.com/uploaded_images/orbit-758036.gif&quot; /&gt;Agora vamos sacanear e colocar uma for&#231;a &lt;b&gt;senoidal&lt;/b&gt; s&#243; pra ver o que acontece. Ele n&#227;o diverge, mas faz uma &#243;rbita muito doida. Provavelmente &#233; um atrator estranho.&lt;div class=&quot;blogger-post-footer&quot;&gt;
&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/6306509703738480474-8361784126950886319?l=www.ricbit.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Ricardo Bittencourt</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.ricbit.com/</uri>
		</author>
		<source>
			<title type="html">Brain Dump</title>
			<subtitle type="html">O que est&#225; passando pela cabe&#231;a do Ricbit no momento.</subtitle>
			<link rel="self" href="http://www.ricbit.com/rss.xml"/>
			<id>tag:blogger.com,1999:blog-6306509703738480474</id>
			<updated>2010-03-11T16:44:41+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">National Geographic Wallpaper</title>
		<link href="http://leogregianin.wordpress.com/2009/12/25/national-geographic-wallpaper/"/>
		<id>http://leogregianin.wordpress.com/?p=89</id>
		<updated>2009-12-25T21:55:03+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;National Geographic Wallpaper&lt;/strong&gt; is a software adapted to &lt;a href=&quot;http://code.google.com/p/ngwallpaper&quot;&gt;Desktop Wallpaper Love&lt;/a&gt; with enhancements such as:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It really puts the image on the desktop.&lt;/li&gt;
&lt;li&gt; Watermark of link the photo of &lt;a href=&quot;http://www.nationalgeographic.com/photography/today&quot;&gt;National Geographic Photo of the Day&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Schedule for implementation of the NG Wallpaper 1 minute after turning on the computer.&lt;/li&gt;
&lt;li&gt;Installation All-in-One: Python 2.6, Python Imaging Library, PyWin32 and settings of National Geographic Wallpaper.&lt;/li&gt;
&lt;li&gt;User friendly&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://valeo.googlecode.com/files/ngwallpaper.exe&quot;&gt;Installer All-in-One (Python2.6, PIL, PyWin32)&lt;/a&gt; if you newer versions of Python, install only the settings of the NG Wallpaper inside installer.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/valeo/source/browse/#svn/trunk/national%20geographic%20wallpaper&quot;&gt;Source code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A fun afternoon of Christmas &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/leogregianin.wordpress.com/89/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/leogregianin.wordpress.com/89/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/leogregianin.wordpress.com/89/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/leogregianin.wordpress.com/89/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/leogregianin.wordpress.com/89/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/leogregianin.wordpress.com/89/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/leogregianin.wordpress.com/89/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/leogregianin.wordpress.com/89/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/leogregianin.wordpress.com/89/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/leogregianin.wordpress.com/89/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=leogregianin.wordpress.com&amp;blog=920615&amp;post=89&amp;subd=leogregianin&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>leogregianin</name>
			<uri>http://leogregianin.wordpress.com</uri>
		</author>
		<source>
			<title type="html">&#187; python</title>
			<link rel="self" href="http://leogregianin.wordpress.com/category/python/feed/atom/"/>
			<id>http://leogregianin.wordpress.com/feed/atom/</id>
			<updated>2009-12-25T22:44:22+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Seaside</title>
		<link href="http://kodumaro.blogspot.com/2009/12/seaside.html"/>
		<id>tag:blogger.com,1999:blog-1387996720436450649.post-7740215310213452111</id>
		<updated>2009-12-22T22:28:00+00:00</updated>
		<content type="html">&lt;img src=&quot;http://3.bp.blogspot.com/_rGfO7DAuOSE/SByvpfxLTOI/AAAAAAAAAFQ/nea8UWGDh5A/s200/squeak.jpg&quot; alt=&quot;Squeak&quot; /&gt; &lt;a href=&quot;http://seaside.st/&quot;&gt;Seaside&lt;/a&gt; &#233; um arcabou&#231;o (&lt;em&gt;framework&lt;/em&gt;) para desenvolvimento de aplica&#231;&#245;es &lt;em&gt;web&lt;/em&gt; para &lt;a href=&quot;http://smalltalk.org&quot;&gt;Smalltalk&lt;/a&gt;. &#201; descrito pelo pr&#243;prio autor como um arcabou&#231;o &lt;strong&gt;her&#233;tico&lt;/strong&gt;, por quebrar todas as regras dos guru&lt;del&gt;don&lt;/del&gt;s atuais.&lt;br /&gt;&lt;br /&gt;Pessoalmente gosto muito de coisas her&#233;ticas ou &lt;strong&gt;subversivas&lt;/strong&gt;. Sou um apaixonado por subvers&#227;o. =D&lt;br /&gt;&lt;br /&gt;Olhando a &lt;a href=&quot;http://book.seaside.st/book&quot;&gt;documenta&#231;&#227;o&lt;/a&gt;, podemos ver que Seaside &#233; suportado pelas m&#225;quinas virtuais &lt;a href=&quot;http://smalltalk.cincom.com/&quot;&gt;Cincom VisualWorks&lt;/a&gt;, &lt;a href=&quot;http://smalltalk.gnu.org/&quot;&gt;GNU Smalltalk&lt;/a&gt;, &lt;a href=&quot;http://www.instantiations.com/VAST/prod/vast.html&quot;&gt;VA Smalltalk&lt;/a&gt;, &lt;a href=&quot;http://squeak.org/&quot;&gt;Squeak&lt;/a&gt; e seus derivados &lt;a href=&quot;http://pharo-project.org/&quot;&gt;Pharo&lt;/a&gt; e &lt;a href=&quot;http://seaside.gemstone.com/&quot;&gt;GLASS&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;GNU Smalltalk&lt;/h3&gt;&lt;br /&gt;A m&#225;quina virtual recomentada &#233; Squeak, da qual gosto muito e que &#233; &#243;tima para aplica&#231;&#245;es &lt;em&gt;desktop&lt;/em&gt;, no entanto Squeak &#233; uma plataforma muito pesada, consome muitos recursos da m&#225;quina, por isso, para Seaside, optei por uma plataforma mais leve: GNU Smalltalk.&lt;br /&gt;&lt;br /&gt;GNU Smalltalk sofre por&#233;m de um mal extremamente irritante: a sintaxe da linguagem &#233; muito irregular &#8211; para ser euf&#233;mico.&lt;br /&gt;&lt;br /&gt;Teoricamente GNU Smalltalk suportaria a sintaxe correta de &lt;a href=&quot;http://pt.wikipedia.org/wiki/Smalltalk#Sintaxe&quot;&gt;Smalltalk-80&lt;/a&gt;, mas n&#227;o funciona bem assim&#8230; ele &#233; muito chato e levanta erros de sintaxe para c&#243;digos perfeitamente corretos, mas que diferem do que o GNU Smalltalk espera de Smalltalk-80. Ent&#227;o &#233; preciso experimentar algumas formas diferentes &#8211; mas regulares &#8211; de fazer as coisas antes de encontrar uma que funcione (&#224;s vezes ele implica at&#233; com nomes de argumentos).&lt;br /&gt;&lt;br /&gt;Vou usar aqui a sintaxe Smalltalk-80 precisa &#8211; e que funciona no GNU Smalltalk &#8211;, mas colocarei o mesmo c&#243;digo na sintaxe peculiar do GNU Smalltalk ao final deste artigo apenas por curiosidade.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Prepara&#231;&#227;o da imagem&lt;/h3&gt;&lt;br /&gt;Para criar a imagem para nosso exemplo usei o comando:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;bash$&lt;/em&gt; gst-load -iI seaside.im Seaside Seaside-Development Seaside-Examples&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Isso cria uma imagem &lt;code&gt;seaside.im&lt;/code&gt; com os pacotes &lt;code&gt;Seaside&lt;/code&gt; (Seaside em si), &lt;code&gt;Seaside-Development&lt;/code&gt; (ferramentas de desenvolvimento) e &lt;code&gt;Seaside-Examples&lt;/code&gt; (exemplos).&lt;br /&gt;&lt;br /&gt;Usei ent&#227;o o &lt;a href=&quot;http://book.seaside.st/book/getting-started/gst/first-component&quot;&gt;exemplo&lt;/a&gt; de componente da pr&#243;pria documenta&#231;&#227;o: &lt;code&gt;MyCounter.st&lt;/code&gt;.&lt;br /&gt;&lt;ul&gt; &lt;li&gt;O m&#233;todo de classe &lt;code&gt;#canBeRoot&lt;/code&gt; diz se o componente pode ser registrado como uma aplica&#231;&#227;o aut&#243;noma ou n&#227;o.&lt;/li&gt; &lt;li&gt;Na inicializa&#231;&#227;o (&lt;code&gt;#initialize&lt;/code&gt;) o atributo &lt;code&gt;count&lt;/code&gt; &#233; zerado.&lt;/li&gt; &lt;li&gt;O m&#233;todo &lt;code&gt;#states&lt;/code&gt; retorna uma cole&#231;&#227;o de estados que podem ser retrilhados (&lt;em&gt;backtracked&lt;/em&gt;).&lt;/li&gt; &lt;li&gt;O m&#233;todo &lt;code&gt;#renderContentOn:&lt;/code&gt; &#233; usado para renderizar a p&#225;gina.&lt;/li&gt; &lt;li&gt;Ao final a mensagem &lt;code&gt;#registerAsApplication:&lt;/code&gt; registra o componente como aplica&#231;&#227;o.&lt;/li&gt; &lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;O c&#243;digo fica ent&#227;o (se copiar e colar, substituia &lt;code&gt;&#8593;&lt;/code&gt; por &lt;code&gt;^&lt;/code&gt;):&lt;br /&gt;&lt;pre&gt;&lt;code class=&quot;prettyprint&quot;&gt;&quot; See: http://www.gnu.org/software/smalltalk/manual/html_node/Seaside.html &quot;&lt;br /&gt;&lt;br /&gt;Seaside.WAComponent subclass: #MyCounter&lt;br /&gt;    instanceVariableNames: 'count'&lt;br /&gt;    classVariableNames: ''&lt;br /&gt;    poolDictionaries: ''&lt;br /&gt;    category: 'Seaside Examples'&lt;br /&gt;!&lt;br /&gt;&lt;br /&gt;!MyCounter class methodsFor: 'testing'!&lt;br /&gt;&lt;br /&gt;    canBeRoot&lt;br /&gt;        &#8593;true&lt;br /&gt;    !&lt;br /&gt;&lt;br /&gt;!&lt;br /&gt;&lt;br /&gt;!MyCounter methodsFor: 'initializing'!&lt;br /&gt;&lt;br /&gt;    initialize&lt;br /&gt;        super initialize.&lt;br /&gt;        count := 0.&lt;br /&gt;    !&lt;br /&gt;&lt;br /&gt;!&lt;br /&gt;&lt;br /&gt;!MyCounter methodsFor: 'accessing'!&lt;br /&gt;&lt;br /&gt;    states&lt;br /&gt;        &#8593;{ self }&lt;br /&gt;    !&lt;br /&gt;&lt;br /&gt;!&lt;br /&gt;&lt;br /&gt;!MyCounter methodsFor: 'rendering'!&lt;br /&gt;&lt;br /&gt;    renderContentOn: html&lt;br /&gt;        html heading: count.&lt;br /&gt;        html anchor&lt;br /&gt;            callback: [ count := count + 1 ];&lt;br /&gt;            with: '++'.&lt;br /&gt;        html space.&lt;br /&gt;        html anchor&lt;br /&gt;            callback: [ count := count - 1 ];&lt;br /&gt;            with: '--'.&lt;br /&gt;    !&lt;br /&gt;&lt;br /&gt;!&lt;br /&gt;&lt;br /&gt;MyCounter registerAsApplication: 'mycounter'.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Para carregar o componente na imagem usei o comando:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;bash$&lt;/em&gt; gst -I seaside.im -S MyCounter.st&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Rodar a aplica&#231;&#227;o&lt;/h3&gt;&lt;br /&gt;O seguinte comando levanta a m&#225;quina virtual no modo servidor:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;bash$&lt;/em&gt; gst-remote -I seaside.im --daemon&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Depois disso voc&#234; poder&#225; ver a m&#225;quina virtual ouvindo na porta 12345/TCP:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;bash$&lt;/em&gt; netstat -ln4 | grep 12345&lt;br /&gt;&lt;em&gt;tcp        0      0 0.0.0.0:12345           0.0.0.0:*               LISTEN&lt;/em&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&#201; poss&#237;vel obter o PID do processo da m&#225;quina virtual com seguinte comando:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;bash$&lt;/em&gt; gst-remote --pid&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Por&#233;m o Seaside n&#227;o est&#225; rodando. Para rodar o servi&#231;o &lt;em&gt;web&lt;/em&gt; use o comando:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;bash$&lt;/em&gt; gst-remote --start=Seaside&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&#201; poss&#237;vel tamb&#233;m iniciar a m&#225;quina virtual &lt;strong&gt;j&#225; rodando o Seaside&lt;/strong&gt; com o seguinte comando:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;bash$&lt;/em&gt; gst-remote -I seaside.im --daemon --start=Seaside&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Por padr&#227;o o servi&#231;o &lt;em&gt;web&lt;/em&gt; Seaside estar&#225; escutando na porta 8080/TCP.&lt;br /&gt;&lt;br /&gt;Para acessar a aplica&#231;&#227;o que acabamos de criar use o endere&#231;o &lt;a href=&quot;http://localhost:8080/seaside/mycounter&quot;&gt;http://localhost:8080/seaside/mycounter&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Parar a aplica&#231;&#227;o&lt;/h3&gt;&lt;br /&gt;Para parar a aplica&#231;&#227;o use o comando:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;bash$&lt;/em&gt; gst-remote --stop=Seaside&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Repare que, apesar do servi&#231;o &lt;em&gt;web&lt;/em&gt; ter parado, a m&#225;quina virtual continua rodando. Para par&#225;-la:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;em&gt;bash$&lt;/em&gt; gst-remote --kill&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Para compara&#231;&#227;o&lt;/h3&gt;&lt;br /&gt;A t&#237;tulo de compara&#231;&#227;o, segue o c&#243;digo usando a sintaxe &lt;del&gt;bizarra e esdr&#250;xula&lt;/del&gt; peculiar do GNU Smalltalk:&lt;br /&gt;&lt;pre&gt;&lt;code class=&quot;prettyprint&quot;&gt;Seaside.WAComponent subclass: MyCounter [&lt;br /&gt;    | count |&lt;br /&gt;    &lt;br /&gt;    &amp;lt;category: 'Seaside Examples'&amp;gt;&lt;br /&gt;    &amp;lt;comment: nil&amp;gt;&lt;br /&gt;&lt;br /&gt;    MyCounter class &amp;gt;&amp;gt; canBeRoot [&lt;br /&gt;        &amp;lt;category: 'testing'&amp;gt;&lt;br /&gt;        ^true&lt;br /&gt;    ]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    initialize [&lt;br /&gt;        &amp;lt;category: 'initializing'&amp;gt;&lt;br /&gt;        super initialize.&lt;br /&gt;        count := 0&lt;br /&gt;    ]&lt;br /&gt;&lt;br /&gt;    states [&lt;br /&gt;        &amp;lt;category: 'accessing'&amp;gt;&lt;br /&gt;        ^{ self }&lt;br /&gt;    ]&lt;br /&gt;&lt;br /&gt;    renderContentOn: html [&lt;br /&gt;        &amp;lt;category: 'rendering'&amp;gt;&lt;br /&gt;        html heading: count.&lt;br /&gt;        (html anchor)&lt;br /&gt;            callback: [count := count + 1];&lt;br /&gt;            with: '++'.&lt;br /&gt;        html space.&lt;br /&gt;        (html anchor)&lt;br /&gt;            callback: [count := count - 1];&lt;br /&gt;            with: '--'&lt;br /&gt;    ]&lt;br /&gt;].&lt;br /&gt;&lt;br /&gt;MyCounter registerAsApplication: 'mycounter'.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;[]'s&lt;br /&gt;Cacilhas, La Batalema&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1387996720436450649-7740215310213452111?l=kodumaro.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Cacilh&#945;&#962;, La Batalema</name>
			<email>noreply@blogger.com</email>
			<uri>http://kodumaro.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Kodumaro</title>
			<subtitle type="html">As sombras da programa&#231;&#227;o</subtitle>
			<link rel="self" href="http://kodumaro.blogspot.com/feeds/posts/default?alt=rss"/>
			<id>tag:blogger.com,1999:blog-1387996720436450649</id>
			<updated>2010-03-19T02:44:31+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">LaTeX Tikz examples</title>
		<link href="http://feedproxy.google.com/~r/PythonInScience/~3/fWVbbcVjIFw/latex-tikz-examples.html"/>
		<id>tag:blogger.com,1999:blog-840127493134277990.post-1123828241350127968</id>
		<updated>2009-12-14T09:27:42+00:00</updated>
		<content type="html">I am currently working on a presentation where I have to include a lot of mathematical graphs, so instead of plotting using matplotlib and inserting the result as a figure, I am considering using specialized LaTeX packages to create the graphs. While searching for documentation, I found this great repository of examples for the Tikz package.referente a: http://www.texample.net/tikz/examples/ (ver</content>
		<author>
			<name>Flavio Coelho</name>
			<email>noreply@blogger.com</email>
			<uri>http://pyinsci.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Python in Science</title>
			<subtitle type="html">Scientific adventures with Python.</subtitle>
			<link rel="self" href="http://pyinsci.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-840127493134277990</id>
			<updated>2010-03-22T11:44:21+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Testando aplica&#231;&#245;es django com nose-django.</title>
		<link href="http://andrewsmedina.com/2009/12/08/testando-aplicacoes-django-com-nose-django/"/>
		<id>http://andrewsmedina.com/2009/12/08/testando-aplicacoes-django-com-nose-django/</id>
		<updated>2009-12-08T20:28:46+00:00</updated>
		<content type="html">&lt;p&gt;O nose-django &#233; um plugin para o nose com o objetivo rodar testes de aplica&#231;&#245;es Django.&lt;/p&gt;
&lt;p&gt;Com ele &#233; poss&#237;vel criar testes em uma estrutura de arquivos menos engessada que a estrutura imposta pelo Django, sem perder as funcionalidades de testes do framework como fixtures, client e etc.&lt;/p&gt;
&lt;p&gt;Outra vantagem do nose-django &#233; a possibilidade de utiliz&#225;-lo em conjunto com outros plugins para o nose como o coverage por exemplo.&lt;/p&gt;
&lt;p&gt;Mais informa&#231;&#245;es sobre o projeto: &lt;a href=&quot;http://www.assembla.com/spaces/nosedjango&quot;&gt;http://www.assembla.com/spaces/nosedjango&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Andrews Medina</name>
			<uri>http://andrewsmedina.com/tag/python/</uri>
		</author>
		<source>
			<title type="html">andrewsmedina.com's Weblog: entries tagged &quot;python&quot;</title>
			<subtitle type="html">Latest entries for tag &quot;python&quot;</subtitle>
			<link rel="self" href="http://www.andrewsmedina.com/tag/rss/python/"/>
			<id>http://www.andrewsmedina.com/tag/rss/python/</id>
			<updated>2010-03-22T13:44:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Navega&#231;&#227;o r&#225;pida com o Google Public DNS</title>
		<link href="http://feedproxy.google.com/~r/Fechatag/~3/fn9GQaY-Afg/"/>
		<id>http://blog.elcio.com.br/navegacao-rapida-com-o-google-public-dns/</id>
		<updated>2009-12-07T18:48:56+00:00</updated>
		<content type="html">&lt;p&gt;Uma coisa que sempre me espantou &#233; a inefici&#234;ncia dos servidores de DNS dos provedores de hospedagem brasileiros. J&#225; testei ADSL, cabo coaxial, 3G e, aqui em S&#227;o Paulo, de maneira geral as conex&#245;es s&#227;o boas. Mas como o servidor de DNS dos provedores &#233; ruim, a navega&#231;&#227;o &#233; muito lenta.&lt;/p&gt;
&lt;p&gt;Eu vinha usando &lt;a href=&quot;http://www.opendns.com/&quot;&gt;OpenDNS&lt;/a&gt;, cuja performance &#233; muito boa. Mas hoje resolvi testar o &lt;a href=&quot;http://code.google.com/speed/public-dns/&quot;&gt;Google Public DNS&lt;/a&gt;. Deixa o OpenDNS no chinelo!&lt;/p&gt;
&lt;p&gt;Como o Google conseguiu isso? Um &lt;a href=&quot;http://code.google.com/speed/public-dns/docs/performance.html&quot;&gt;mega sistema de cache, com cobertura global, e um inovador sistema de prefetching&lt;/a&gt;. Se voc&#234; n&#227;o est&#225; usando ainda, &lt;a href=&quot;http://code.google.com/speed/public-dns/docs/using.html&quot;&gt;vale a pena testar&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Para facilitar a vida dos usu&#225;rios de Linux, segue meu /etc/resolv.conf:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;prettyprint&quot;&gt;nameserver 8.8.8.8&lt;br /&gt;
nameserver 8.8.4.4&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sim, s&#227;o esses IPs mesmo &lt;img src=&quot;http://blog.elcio.com.br/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; N&#227;o &#233; fant&#225;stico?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/Q0j7civKQeXxGxAVct8BHlB-JOc/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/Q0j7civKQeXxGxAVct8BHlB-JOc/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/Q0j7civKQeXxGxAVct8BHlB-JOc/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/Q0j7civKQeXxGxAVct8BHlB-JOc/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/Fechatag?a=fn9GQaY-Afg:bptODzRBTr8:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Fechatag?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Fechatag?a=fn9GQaY-Afg:bptODzRBTr8:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Fechatag?i=fn9GQaY-Afg:bptODzRBTr8:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Elcio Luiz Ferreira</name>
			<uri>http://blog.elcio.com.br</uri>
		</author>
		<source>
			<title type="html">fechaTag</title>
			<subtitle type="html">XML, XHTML, CSS, Tableless, Desenvolvimento Web, Python, Linux</subtitle>
			<link rel="self" href="http://blog.elcio.com.br/tag/programacao/feed/"/>
			<id>http://blog.elcio.com.br/tag/programacao/feed/</id>
			<updated>2010-03-17T17:44:18+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">[jab&#225;] Treinamento Python e Django</title>
		<link href="http://feedproxy.google.com/~r/pythonologia/~3/yHWYBB-eANo/"/>
		<id>http://pythonologia.org/?p=346</id>
		<updated>2009-12-07T13:19:28+00:00</updated>
		<content type="html">&lt;p&gt;A &lt;a href=&quot;http://www.triveos.com.br/&quot;&gt;Triveos&lt;/a&gt; est&#225; lan&#231;ando o seu treinamento de &lt;a href=&quot;http://triveos.com.br/python-and-django/&quot; title=&quot;Desenvolvimento Web &#193;gil com Python e Django &#8211; Aprenda Python e Django em apenas 5 dias!&quot;&gt;Desenvolvimento Web &#193;gil com Python e Django&lt;/a&gt; e por isso pega carona nesse conceituado blog (que por coincid&#234;ncia &#233; um dos s&#243;cios da Triveos) para anunciar este lan&#231;amento.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://triveos.com.br/python-and-django/&quot; title=&quot;Desenvolvimento Web &#193;gil com Python e Django &#8211; Aprenda Python e Django em apenas 5 dias!&quot;&gt;&lt;img src=&quot;http://pythonologia.org/wp-content/uploads/trein_pydjango_small.png&quot; alt=&quot;Imagem ilustrativa do treinamento com a apostila e o texto 'Aprenda Python e Django em apenas 5 dias'&quot; width=&quot;374&quot; height=&quot;240&quot; class=&quot;aligncenter size-full wp-image-347&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Eu n&#227;o costumo fazer esse tipo de &lt;em&gt;post&lt;/em&gt; (jab&#225;) por aqui mas este &#233; um caso especial por dois motivos: o produto anunciado foi criado pela minha empresa (como eu j&#225; havia dito); e porque que at&#233; o momento s&#227;o poucas as empresas que ministram esse curso no Brasil.&lt;/p&gt;
&lt;p&gt;Esse treinamento &#233; o primeiro entre muitos que planejamos desenvolver no pr&#243;ximo ano sempre com algumas caracter&#237;sticas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;treinamentos &lt;em&gt;in-company&lt;/em&gt; &#8212; isso nos d&#225; mobilidade e permite que o treinamento seja ministrado em qualquer lugar do Brasil e n&#227;o somente no eixo Rio-S&#227;o Paulo.&lt;/li&gt;
&lt;li&gt;treinamentos de curta dura&#231;&#227;o &#8212; achamos que tecnologias precisam ser simples e que se elas forem realmente simples n&#227;o seria necess&#225;rio investir meses num treinamento. O treinamento de Python e Django precisa de 5 dias apenas para ser ministrado com grande tranquilidade para pessoas que j&#225; desenvolvem em alguma linguagem OO.&lt;/li&gt;
&lt;li&gt;treinamentos personaliz&#225;veis &#8212; a linha principal do treinamento &#233; mantida mas algumas modifica&#231;&#245;es podem ser feitas para adequar o treinamento aos requisitos das empresas. Exemplos: dedicar um tempo do treinamento &#224; implanta&#231;&#227;o do Django, apresentar alguma biblioteca Javascript para desenvolvimento de RIAs, ministrar s&#243; o m&#243;dulo Django, etc.&lt;/li&gt;
&lt;li&gt;materiais de qualidade &#8212; nada de apostilas contendo s&#243; slides impressos. Disponibiliza&#231;&#227;o de todo o material usado em aula (Slides, reposit&#243;rio de c&#243;digos, etc).&lt;/li&gt;
&lt;li&gt;instrutores qualificados &#8212; n&#227;o posso falar muito mais sobre isso. Sou um dos instrutores :D&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quem tiver interesse no treinamento pode entrar em contato com a gente atrav&#233;s do &lt;a href=&quot;http://triveos.com.br/contact/&quot; title=&quot;contate-nos!&quot;&gt;site&lt;/a&gt; ou diretamente comigo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Pessoal, n&#227;o tinha ficado claro mas, a Triveos s&#243; trabalha com treinamentos &lt;em&gt;in-company&lt;/em&gt;, ou seja, n&#227;o temos infra-estrutura para ministrar esse treinamento em nossa empresa. Fazemos isso dentro da sua empresa (ou da empresa onde voc&#234; trabalha). De qualquer maneira estamos avaliando um modo de atender &#224;s demandas que est&#227;o surgindo.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/S8TY3OGl7RnkjVWMR9FklNE-sKA/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/S8TY3OGl7RnkjVWMR9FklNE-sKA/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/S8TY3OGl7RnkjVWMR9FklNE-sKA/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/S8TY3OGl7RnkjVWMR9FklNE-sKA/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/pythonologia?a=yHWYBB-eANo:kyYpPYyqvZc:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/pythonologia?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/pythonologia?a=yHWYBB-eANo:kyYpPYyqvZc:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/pythonologia?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Osvaldo Santana</name>
			<uri>http://pythonologia.org</uri>
		</author>
		<source>
			<title type="html">Pythonologia</title>
			<subtitle type="html">Python, open-source e desenvolvimento</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/pythonologia"/>
			<id>http://pythonologia.org/feed/atom/</id>
			<updated>2010-03-22T10:44:04+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Mais sobre reitera&#231;&#227;o</title>
		<link href="http://kodumaro.blogspot.com/2009/12/mais-sobre-reiteracao.html"/>
		<id>tag:blogger.com,1999:blog-1387996720436450649.post-1284665232521181172</id>
		<updated>2009-12-06T15:42:00+00:00</updated>
		<content type="html">&lt;img src=&quot;http://2.bp.blogspot.com/_rGfO7DAuOSE/SwSZGIY_eXI/AAAAAAAAATA/Gh-qDqdTMX0/s200/glider.png&quot; alt=&quot;Glider&quot; /&gt; A reitera&#231;&#227;o ou itera&#231;&#227;o &#233; um dos mais efetivos algoritmos para para processamento de sequ&#234;ncias, mas sua efici&#234;ncia n&#227;o se limita a processamento de conjuntos prontos, essa t&#233;cnica de algoritmo tamb&#233;m pode ser usada para processamento de amostragens em plena coleta.&lt;br /&gt;&lt;br /&gt;Vamos a um algoritmo bem simples, a m&#233;dia aritm&#233;tica:&lt;br /&gt;&lt;center&gt;&lt;img src=&quot;http://cacilhas.info/bin/mimetex.cgi?\bar{x}=\frac{\sum_{i=1}^nx_i}{n}&quot; alt=&quot;mean_x=sum_x/n&quot; /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;O algoritmo reiterativo pode ser expresso da seguinte forma:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;(defun mean ((a-list list))&lt;br /&gt;  (/&lt;br /&gt;    (apply #'+ a-list)&lt;br /&gt;    (length a-list)))&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Agora imagine que voc&#234; tem o registro cont&#237;nuo do comportamento de um dado espec&#237;fico ao longo do tempo e gostaria de manter sua m&#233;dia sem preocupa&#231;&#227;o como os valores em si (acho um caso pouco prov&#225;vel, mas&#8230;).&lt;br /&gt;&lt;br /&gt;Se reparando bem, h&#225; dois dados importantes para o c&#225;lculo da m&#233;dia aritm&#233;tica: a pr&#243;pria m&#233;dia e a quantidade de elementos. Basta que a fun&#231;&#227;o receba esses valores al&#233;m dos novos valores que ser&#227;o usados para atualizar a m&#233;dia anterior.&lt;br /&gt;&lt;br /&gt;Assim &#233; poss&#237;vel armazenar apenas a m&#233;dia atual e a quantidade de elementos avaliados:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;(defun update-mean ((the-mean hash-table) (a-list list))&lt;br /&gt;  (let ((*count* (+ (gethash 'count the-mean) (length a-list))))&lt;br /&gt;    (setf (gethash 'mean the-mean)&lt;br /&gt;      (/&lt;br /&gt;        (+&lt;br /&gt;          (apply #'+ a-list)&lt;br /&gt;          (* (gethash 'mean the-mean) (gethash 'count the-mean)))&lt;br /&gt;        *count*))&lt;br /&gt;    (setf (gethash 'count the-mean) *count*)&lt;br /&gt;    the-mean))&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ent&#227;o, al&#233;m de receber a lista com os dados mais recentes (segundo par&#226;metro), a fun&#231;&#227;o recebe como primeiro par&#226;metro um &lt;em&gt;hash&lt;/em&gt; com os dados de m&#233;dia anteriores.&lt;br /&gt;&lt;br /&gt;O formato inicial do &lt;em&gt;hash&lt;/em&gt; deve ser:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#s(hash-table :test fasthash-eql (count . 0) (mean . 0))&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ou seja, &lt;code&gt;'mean&lt;/code&gt; zero (0) e &lt;code&gt;'count&lt;/code&gt; zero (0). O &lt;em&gt;hash&lt;/em&gt; ser&#225; atualizado e retornado:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;(setq *mean*&lt;br /&gt;  (make-hash-table&lt;br /&gt;    :initial-contents (list&lt;br /&gt;      (cons 'count 0)&lt;br /&gt;      (cons 'mean 0))))&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Na pr&#243;xima falarei em &lt;a href=&quot;http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm&quot;&gt;vari&#226;ncia &lt;em&gt;on-line&lt;/em&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;[]'s&lt;br /&gt;Cacilhas, La Batalema&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/1387996720436450649-1284665232521181172?l=kodumaro.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Cacilh&#945;&#962;, La Batalema</name>
			<email>noreply@blogger.com</email>
			<uri>http://kodumaro.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Kodumaro</title>
			<subtitle type="html">As sombras da programa&#231;&#227;o</subtitle>
			<link rel="self" href="http://kodumaro.blogspot.com/feeds/posts/default?alt=rss"/>
			<id>tag:blogger.com,1999:blog-1387996720436450649</id>
			<updated>2010-03-19T02:44:31+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Meu roteiro de instalacao do Ubuntu 9.10</title>
		<link href="http://marrcandre.blogspot.com/2009/12/meu-roteiro-de-instalacao-do-ubuntu-910_05.html"/>
		<id>tag:blogger.com,1999:blog-4593771306625888277.post-5409508088484072242</id>
		<updated>2009-12-06T12:27:45+00:00</updated>
		<content type="html">&lt;br /&gt;&lt;div&gt;&lt;div class=&quot;writely-toc&quot; id=&quot;WritelyTableOfContents&quot;&gt;&lt;ol class=&quot;writely-toc-none&quot;&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Introdu_o_7534447129950442_210_9809285781193006&quot;&gt;Introdu&#231;&#227;o&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Instala_o_32581590320991305_00_8465628228167368&quot;&gt;Iniciando a instala&#231;&#227;o&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Configurar_a_placa_de_v_deo_Si_15333727005850395&quot;&gt;Configurando a placa de v&#237;deo Sis 771&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Modificar_os_reposit_rios_3881_9122260456776543&quot;&gt;Modificando os reposit&#243;rios&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Instalar_o_pacote_ubuntu_restr_21841984242239487&quot;&gt;Instalando o pacote ubuntu-restricted-extras&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Configura_es_do_ambiente_de_tr&quot;&gt;Configurando o ambiente de trabalho&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Configura_es_do_firefox_798136&quot;&gt;Configurando o Firefox&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Instalando_extens_es_do_Firefo&quot;&gt;Instalando extens&#245;es do Firefox&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Screenlets_361106048113518_255_4714315732831563&quot;&gt;Screenlets&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Fonte_Monaco_7698832133696443__638306258845883&quot;&gt;Fonte Monaco&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Tempo_de_boot_7743570191990878_48735335686725423&quot;&gt;Tempo de boot&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Gnome_Global_Menu_669257460768&quot;&gt;Gnome-Global-Menu&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Um_monte_de_programas_de_uma_v_14051430057432857&quot;&gt;Um monte de programas de uma vez&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Ubuntu_Perfeito_40343507905714193&quot;&gt;Ubuntu Perfeito&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Configura_es_de_Terminal_09940_4764580935688669&quot;&gt;Configura&#231;&#245;es de Terminal&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#ack_em_grep_melhorado_30520814&quot;&gt;ack - em grep melhorado&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Gerenciador_de_inicializa_o_80_2846156055447885&quot;&gt;Gerenciador de inicializa&#231;&#227;o&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Latex_6521048093730865_7994790&quot;&gt;Latex&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Webcam_5295952686267833_326312&quot;&gt;Webcam&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#P_ginas_de_manual_man_colorida_7660827569341345&quot;&gt;P&#225;ginas de manual (man) coloridas&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Python_6448526723957749_486965&quot;&gt;Python&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Gedit_6274458864351474_7412957&quot;&gt;Gedit&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Gnome_do_9978949346332701_1708&quot;&gt;Gnome-do&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Nautilus_9481539467263916_5214&quot;&gt;Nautilus&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Criar_links_simb_licos_para_pa_24781057710680066&quot;&gt;Criar links simb&#243;licos para pastas&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Ativar_o_CTRL_ALT_BACKSPACE_pa&quot;&gt;Ativar o CTRL+ALT+BACKSPACE para reiniciar o X&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Instalar_impressoras_978166535&quot;&gt;Instalar impressoras&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#DVD_3110031562013573_219516393_33305110232494717&quot;&gt;DVD&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Jpilot_10677118415911868_74351_1904321877042442&quot;&gt;Jpilot&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Diff_7411494450152585_17068869_9019674331474129&quot;&gt;Diff&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Aplicativos_e_jogos_para_crian&quot;&gt;Aplicativos e jogos para crian&#231;as&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#IRC_04234294273251882_56843911_170932522576549&quot;&gt;IRC&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#C_pia_de_seguran_a_com_sincron&quot;&gt;C&#243;pia de seguran&#231;a com sincroniza&#231;&#227;o&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#LED_da_rede_sem_fio_3333164954&quot;&gt;LED da rede sem fio&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_self&quot; href=&quot;http://marrcandre.blogspot.com/feeds/posts/default#Gmail_como_cliente_padr_o_de_e&quot;&gt;Gmail como cliente padr&#227;o de email&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;&lt;a id=&quot;Introdu_o_7534447129950442_210_9809285781193006&quot; name=&quot;Introdu_o_7534447129950442_210_9809285781193006&quot;&gt;&lt;/a&gt;Introdu&#231;&#227;o&lt;/h1&gt;&lt;br /&gt;&lt;p&gt;Este artigo descreve o meu roteiro de atualiza&#231;&#227;o dos meus computadores&lt;br /&gt;pessoais com o Ubuntu 9.10 Karmic Koala. Eu costumo instalar muitos&lt;br /&gt;programas, seja para testar ou mesmo para usar nas aulas que ministro.&lt;br /&gt;Assim, a cada seis meses, quando sai uma vers&#227;o nova do Ubuntu, costumo&lt;br /&gt;fazer uma reinstala&#231;&#227;o completa desses computadores. Eu tamb&#233;m costumo&lt;br /&gt;adaptar esses computadores ao meu gosto, e sempre que os reinstalo,&lt;br /&gt;preciso sair &#224; procura das modifica&#231;&#245;es que havia feito. &lt;/p&gt;&lt;br /&gt;Sendo&lt;br /&gt;assim, resolvi anotar cuidadosamente cada modifica&#231;&#227;o feita na&lt;br /&gt;instala&#231;&#227;o. Estes roteiro foi criado pensando nas minhas necessidades,&lt;br /&gt;mas pode ser adaptadopara satisfazer outras pessoas. Percebi tamb&#233;m que&lt;br /&gt;a cada vers&#227;o nova do Ubuntu, algumas configura&#231;&#245;es que eu fazia antes,&lt;br /&gt;passaram a vir por padr&#227;o nele.&lt;br /&gt;&lt;br /&gt;Tentei deixar as dicas curtas.&lt;br /&gt;Se voc&#234; cosiderar alguma dica incompleta, entre em contato, que eu&lt;br /&gt;tentarei explicar melhor. Para corre&#231;&#245;es a fazer ou outras&lt;br /&gt;configura&#231;&#245;es a sugerir, envie um coment&#225;rio. Terei prazer em ler e&lt;br /&gt;responder.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;&lt;a id=&quot;Instala_o_32581590320991305_00_8465628228167368&quot; name=&quot;Instala_o_32581590320991305_00_8465628228167368&quot;&gt;&lt;/a&gt;Iniciando a instala&#231;&#227;o&lt;/h1&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;N&#227;o vou descrever a instala&#231;&#227;o. Recomendo deixar uma parti&#231;&#227;o de cerca&lt;br /&gt;de 25 GB pro sistema uma de swap do tamanho da sua RAM e uma parti&#231;&#227;o&lt;br /&gt;de dados separada. A instala&#231;&#227;o pelo pen drive &#233; muita mais r&#225;pida do&lt;br /&gt;que pelo CD. Recomendo deixar um de 1 GB s&#243; pra isso.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;&lt;a id=&quot;Configurar_a_placa_de_v_deo_Si_15333727005850395&quot; name=&quot;Configurar_a_placa_de_v_deo_Si_15333727005850395&quot;&gt;&lt;/a&gt;Configurando a placa de v&#237;deo Sis 771&lt;br /&gt;&lt;/h1&gt;&lt;br /&gt;No meu caso, um Positivo com placa &lt;b&gt;Sis 771/671&lt;/b&gt;, siga o tutorial, para instalar o driver da placa de v&#237;deo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;http://pequenotux.blogspot.com/2009/10/sis-771-671-no-ubuntu-karmic-koala.html&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Adicione estas linhas no seu arquivo /etc/X11/xorg.conf:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Section &quot;Device&quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; Identifier&amp;nbsp;&amp;nbsp; &quot;Configured Video Device&quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; Driver &quot;sis671&quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;EndSection &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;&lt;a id=&quot;Modificar_os_reposit_rios_3881_9122260456776543&quot; name=&quot;Modificar_os_reposit_rios_3881_9122260456776543&quot;&gt;&lt;/a&gt;Modificando os reposit&#243;rios&lt;/h1&gt;&lt;br /&gt;Para gerar a lista de repos&#237;t&#243;rios, estou utilizando o &lt;b&gt;Ubuntu Source List Generator&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;http://repogen.simplylinux.ch/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;No site, voc&#234; define o pa&#237;s e os reposit&#243;rios desejados e ele cria um arquivo sources.list. Basta copiar e colar no seu computador. Pra fazer isso, abra um terminal ou digite &lt;span&gt;Alt+F2&lt;/span&gt; (executar aplica&#231;&#227;o) e digite ou cole esta linha:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;gksu gedit /etc/apt/sources.list&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Depois de criada a nova lista de reposit&#243;rios, atualize o sistema. Num terminal, digite:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;sudo aptitude update &amp;amp;&amp;amp; sudo aptitude safe-upgrade&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Isto far&#225; com que seus sistema seja atualizado para a sua vers&#227;o mais nova. Ele deve baixar e atualizar algumas centenas de megabytes, dependendo da data da instala&#231;&#227;o.&lt;br /&gt;&lt;br /&gt;Meu &lt;span&gt;sources.list&lt;/span&gt;, depois de gerado e modificado ficou assim:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;http://paste.pocoo.org/show/155162/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;A partir desse ponto, voc&#234; pode instalar outros programas, fontes, drivers, codecs e tudo mais.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;&lt;a id=&quot;Instalar_o_pacote_ubuntu_restr_21841984242239487&quot; name=&quot;Instalar_o_pacote_ubuntu_restr_21841984242239487&quot;&gt;&lt;/a&gt;Instalando o pacote ubuntu-restricted-extras&lt;/h1&gt;&lt;br /&gt;&lt;div&gt;O pacote ubuntu-restricted-extras instala uma s&#233;rie de codecs, aplicativos, fontes e drivers que possuem algum tipo de restri&#231;&#227;o e que por isso n&#227;o fazem parte da instala&#231;&#227;o padr&#227;o. Entre eles, podemos citar: M&#225;quina virtual Java (usada por sitesde bancos, por exemplo) flash (sem ele, o youtube n&#227;o funciona) fontes true type (do windows), codecs de &#225;udio e v&#237;deo (wmv, divx, mp3, rmvb, etc.) e outros. Para instalar este pacote, digite num terminal:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;font&gt;sudo aptitude install ubuntu-restricted-extras&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;&lt;a id=&quot;Configura_es_do_ambiente_de_tr&quot; name=&quot;Configura_es_do_ambiente_de_tr&quot;&gt;&lt;/a&gt;Configurando o ambiente de trabalho&lt;/h1&gt;&lt;br /&gt;&lt;br /&gt;- Retirar &#237;cone de Help&lt;br /&gt;&lt;br /&gt;- Menu Gnome Padr&#227;o&lt;br /&gt;- Adicionar: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Menu Principal do Gnome (reduzido)&lt;/li&gt;&lt;li&gt;Lista de Janelas&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;- Retirar barra inferior&lt;br /&gt;- Mudar tema e papel de parede&lt;br /&gt;- Habilitar efeitos&lt;br /&gt;&lt;br /&gt;- Instalar o Gnome Global Menu (descrito mais abaixo)&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;&lt;a id=&quot;Configura_es_do_firefox_798136&quot; name=&quot;Configura_es_do_firefox_798136&quot;&gt;&lt;/a&gt;Configurando o Firefox&lt;/h1&gt;Eu costumo modificar o Firefox da seguinte forma:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;- Tirar barra de favoritos&lt;/li&gt;&lt;li&gt;- Mudar &#237;cones para &#237;cones pequenos&lt;/li&gt;&lt;li&gt;- Colocar &#237;cone de &quot;Nova aba&quot;&lt;/li&gt;&lt;li&gt;- Definir p&#225;gina inicial: &lt;span&gt;http://google.com.br/ig&lt;/span&gt;&lt;/li&gt;&lt;li&gt;- Adicionar Pesquisas: &lt;span&gt;http://mycroft.mozdev.org/&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;MercadoLivre &lt;/li&gt;&lt;li&gt;Youtube Brasil&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Instalando_extens_es_do_Firefo&quot; name=&quot;Instalando_extens_es_do_Firefo&quot;&gt;&lt;/a&gt;Instalando extens&#245;es do Firefox&lt;/h1&gt;&lt;div&gt;No Firefox, menu Ferramentas, Complementos:&lt;br /&gt;&lt;br /&gt;- Adblock Plus&lt;br /&gt;- Colt&lt;br /&gt;- Delicious&lt;br /&gt;- Download Helper&lt;br /&gt;- Forecastfox&lt;br /&gt;- Search Preview&lt;br /&gt;- Echofon&lt;br /&gt;- FireGPG&lt;br /&gt;- Fission&lt;br /&gt;- Power Twitter&lt;br clear=&quot;all&quot; /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Screenlets_361106048113518_255_4714315732831563&quot; name=&quot;Screenlets_361106048113518_255_4714315732831563&quot;&gt;&lt;/a&gt;Screenlets&lt;/h1&gt;&lt;div&gt;Instale o pacote screenlets. N&#227;o tenho mais usado, mas fica a dica de alguns screenlets interessantes:&lt;br /&gt;&lt;br /&gt;- Relogio, Calend&#225;rio&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Fonte_Monaco_7698832133696443__638306258845883&quot; name=&quot;Fonte_Monaco_7698832133696443__638306258845883&quot;&gt;&lt;/a&gt;Fonte Monaco&lt;/h1&gt;&lt;div&gt;A Fonte Monaco &#233; a fonte monoespa&#231;ada padr&#227;o do Mac OS. Ela &#233; muito bonita, e&amp;nbsp; a utilizo no Gedit, Terminal e X-chat, entre outros programas.&lt;br /&gt;&lt;br /&gt;Baixar a fonte: &lt;span&gt;http://blog.siverti.com.br/2008/05/22/fonte-monaco-no-ubuntugedit/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Instalar a fonte:&lt;br /&gt;&lt;font&gt;&lt;br /&gt;cd /usr/share/fonts/truetype; sudo mkdir myfonts ; cd myfonts ; sudo cp /dados/downloads/Monaco_Linux.ttf . ; sudo chown root.root *.ttf ; sudo mkfontdir ;&lt;/font&gt;&lt;br /&gt;&lt;font&gt;cd .. ; fc-cache&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font&gt;Aparentemente &#233; preciso iniciar a sess&#227;o novamente para que a fonte fique dispon&#237;vel.&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Tempo_de_boot_7743570191990878_48735335686725423&quot; name=&quot;Tempo_de_boot_7743570191990878_48735335686725423&quot;&gt;&lt;/a&gt;Tempo de boot&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;font&gt;&lt;span&gt;Pra diminuir o tempo de boot, siga este tutorial:&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font&gt;http://pastie.org/676730&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font&gt;&lt;span&gt;Eu cheguei a 80 segundos, do boot frio at&#233; todo o sistema carregado, wifi conectada, firefox com gmail, reader e calendar completamente carregados e pidgin conectado. Fa&#231;a a medi&#231;&#227;o e me envie nos coment&#225;rios.&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Gnome_Global_Menu_669257460768&quot; name=&quot;Gnome_Global_Menu_669257460768&quot;&gt;&lt;/a&gt;Gnome-Global-Menu&lt;/h1&gt;&lt;div&gt;&lt;font&gt;O Gnome Global Menu faz com que os menus da aplica&#231;&#245;es passem a aparecer na barra superior, no estilo do Mac OS. Junto com um Dock, o sistema come&#231;a a ficar parecido com o Mac OS. &lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font&gt;Acrescente as seguintes linhas no seu sources.list:&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font&gt;&lt;span class=&quot;c&quot;&gt;#Gnome Global Menu&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&lt;span class=&quot;k&quot;&gt;deb&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://ppa.launchpad.net/globalmenu-team/ppa/ubuntu&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;jaunty&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;main&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Depois adicione o Global Menu pela op&#231;&#227;o de Adicionar ao Painel. Para mais detalhes, procure por tutoriais, como este:&lt;br /&gt;&lt;br /&gt;&lt;font&gt;http://nancib.wordpress.com/2009/11/24/update-the-globalmenu-in-ubuntu-9-10/&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;a id=&quot;Um_monte_de_programas_de_uma_v&quot; name=&quot;Um_monte_de_programas_de_uma_v&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Um_monte_de_programas_de_uma_v_14051430057432857&quot; name=&quot;Um_monte_de_programas_de_uma_v_14051430057432857&quot;&gt;&lt;/a&gt;Um monte de programas de uma vez&lt;br /&gt;&lt;/h1&gt;&lt;div&gt;&lt;font&gt;&lt;span&gt;O Ubuntu vem com um desktop corporativo padr&#227;o, mas eu sinto falta de v&#225;rias aplica&#231;&#245;es. N&#227;o vou explicar pra que serve cada uma. Instale todas, experimente e crie a sua lista. Se n&#227;o gostar, &#233; s&#243; remover depois:&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font&gt;sudo aptitude install ubuntu-restricted-extras mplayer nautilus-dropbox nautilus-open-terminal vlc virtualbox gnome-do gnome-do-plugins banshee audacious amule vim-full gedit-plugins picasa gparted htop pidgin xchat skype&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Ubuntu_Perfeito_40343507905714193&quot; name=&quot;Ubuntu_Perfeito_40343507905714193&quot;&gt;&lt;/a&gt;Ubuntu Perfeito&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;Por mais que o Ubuntu tenha evolu&#237;do em termos de configura&#231;&#245;es, o Ubuntu Perfeito continua sendo uma importante aplica&#231;&#227;o para instalar e configurar o sistema. Baixe e instale-o daqui:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;http://sourceforge.net/projects/ubuntu-perfeito/files/ubuntu-perfeito-9.10/ubuntuperfeito-9.10.1_all.deb/download&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Depois, v&#225; em Sistema - Administra&#231;&#227;o - Ubuntu Perfeito e o execute. Paa configurar diversas op&#231;&#245;es dele, v&#225; em Sistema - Prefer&#234;ncias - Menu de Servi&#231;os do Ubuntu Perfeito&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Configura_es_de_Terminal_09940_4764580935688669&quot; name=&quot;Configura_es_de_Terminal_09940_4764580935688669&quot;&gt;&lt;/a&gt;Configura&#231;&#245;es de Terminal&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;Hist&#243;rico do bash: adicionar em &lt;span&gt;~/.bashrc&lt;/span&gt;: &lt;br /&gt;&lt;br /&gt;&lt;span&gt;export HISTSIZE=5000&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- Alias: descomentar linhas de&amp;nbsp; &lt;span&gt;~/.bashrc:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;if [ -x /usr/bin/dircolors ]; then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; eval &quot;`dircolors -b`&quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alias ls='ls --color=auto'&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alias dir='dir --color=auto'&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alias vdir='vdir --color=auto'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alias grep='grep --color=auto'&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alias fgrep='fgrep --color=auto'&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alias egrep='egrep --color=auto'&lt;/span&gt;&lt;br /&gt;&lt;span&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;alias ll='ls -lh'&lt;/span&gt;&lt;br /&gt;&lt;span&gt;alias la='ls -A'&lt;/span&gt;&lt;br /&gt;&lt;span&gt;alias l='ls -CF'&lt;/span&gt;&lt;br /&gt;&lt;span&gt;alias ..='cd ..' &lt;/span&gt;&lt;br /&gt;&lt;span&gt;alias grep='ack-grep'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- Adicione no arquivo &lt;span&gt;~/.inputrc&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font&gt;set completion-ignore-case On&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&quot;\e[B&quot;: history-search-forward&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&quot;\e[A&quot;: history-search-backward&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;ack_em_grep_melhorado_30520814&quot; name=&quot;ack_em_grep_melhorado_30520814&quot;&gt;&lt;/a&gt;ack - em grep melhorado&lt;/h1&gt;&lt;div&gt;Eu uso este programa para substituir o grep tradicional:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;http://betterthangrep.com/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;sudo aptitude install ack-grep &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;coloque o alias no &lt;span&gt;~/.bashrc&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;alias grep='ack-grep'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Gerenciador_de_inicializa_o_80_2846156055447885&quot; name=&quot;Gerenciador_de_inicializa_o_80_2846156055447885&quot;&gt;&lt;/a&gt;Gerenciador de inicializa&#231;&#227;o&lt;/h1&gt;&lt;div&gt;Para modificar op&#231;&#245;es de boot:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;sudo aptitude install startupmanager&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Latex_6521048093730865_7994790&quot; name=&quot;Latex_6521048093730865_7994790&quot;&gt;&lt;/a&gt;Latex&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;font&gt;&lt;font&gt;sudo aptitude install texlive texlive-humanities texlive-lang-portuguese babel latex-beamer \&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&lt;font&gt;abntex aspell-pt-br gedit-plugins gedit-latex-plugin rubber texmaker&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Webcam_5295952686267833_326312&quot; name=&quot;Webcam_5295952686267833_326312&quot;&gt;&lt;/a&gt;&lt;font&gt;&lt;span&gt;Webcam&lt;/span&gt;&lt;/font&gt;&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;font&gt;sudo aptitude install cheese&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;P_ginas_de_manual_man_colorida_7660827569341345&quot; name=&quot;P_ginas_de_manual_man_colorida_7660827569341345&quot;&gt;&lt;/a&gt;P&#225;ginas de manual (man) coloridas&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;font&gt;sudo aptitude install most &amp;amp;&amp;amp; sudo update-alternatives --config pager&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Python_6448526723957749_486965&quot; name=&quot;Python_6448526723957749_486965&quot;&gt;&lt;/a&gt;&lt;font&gt;&lt;span&gt;Python&lt;/span&gt;&lt;/font&gt;&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;font&gt;sudo aptitude install ipython bpython python-django python-sqlite&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Gedit_6274458864351474_7412957&quot; name=&quot;Gedit_6274458864351474_7412957&quot;&gt;&lt;/a&gt;&lt;font&gt;&lt;span&gt;Gedit&lt;/span&gt;&lt;/font&gt;&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;font&gt;&lt;span&gt;Instalar plugins:&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;font&gt;sudo aptitude install gedit-plugins gedit-latex-plugin &lt;/font&gt;&lt;br /&gt;&lt;font&gt;&lt;font&gt;&lt;span&gt;&lt;br /&gt;Ativar plugins e modificar configura&#231;&#245;es. O Gedit pode se tornar um excelente editor de programas, p&#225;ginas web e arquivos de configura&#231;&#227;o. Fa&#231;a as seguintes configura&#231;&#245;es:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;ul&gt;&lt;li&gt;&lt;font&gt;&lt;font&gt;&lt;span&gt;Editar - Prefer&#234;ncias - Vis&#227;o: Marque todas as op&#231;&#245;es&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font&gt;&lt;font&gt;&lt;span&gt;Editar - Prefer&#234;ncias - Editor:&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Defina a largura da tabula&#231;&#227;o para 4&lt;/li&gt;&lt;li&gt;Marque &quot;Inserir espa&#231;os em vez de tabula&#231;&#245;es&quot;&lt;/li&gt;&lt;li&gt;Marque &quot;Habilitar recuo autom&#225;tico&quot;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;font&gt;&lt;font&gt;&lt;span&gt;Editar - Prefer&#234;ncias - Fontes e cores:&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;font&gt;&lt;font&gt;&lt;span&gt;Escolha a fonte de sua prefer&#234;ncia. Eu uso a fonte Monaco com tamanho 11&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;font&gt;&lt;font&gt;&lt;span&gt;Editar - Prefer&#234;ncias - Plugins. Habilite os seguintes plugins:&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;font&gt;&lt;font&gt;&lt;span&gt;Abertura r&#225;pida&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font&gt;&lt;font&gt;&lt;span&gt;Alterar maiusculiza&#231;&#227;o&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font&gt;&lt;font&gt;&lt;span&gt;Comentar c&#243;digo&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font&gt;&lt;font&gt;&lt;span&gt;Desenhar espa&#231;os&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font&gt;&lt;font&gt;&lt;span&gt;Espa&#231;os inteligentes&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font&gt;&lt;font&gt;&lt;span&gt;Fechamento de par&#234;nteses (verifique se voc&#234; gosta deste recurso)&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font&gt;&lt;font&gt;&lt;span&gt;Painel do navegador de arquivos (habilite o painel com &lt;span&gt;F9&lt;/span&gt;)&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font&gt;&lt;font&gt;&lt;span&gt;Trechos&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font&gt;&lt;font&gt;&lt;span&gt;Verificador ortogr&#225;fico&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;font&gt;&lt;font&gt;&lt;span&gt;&lt;br /&gt;Configurar  fonte Monaco&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;: No Gedit, v&#225; em Editar - Prefer&#234;ncias - Fontes e Cores - Fonte do editor&lt;br /&gt;&lt;br /&gt;&lt;font&gt;&lt;font&gt;&lt;span&gt;Instalar outros plugins manualmente de &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span&gt;http://live.gnome.org/Gedit/Plugins&lt;/span&gt;&lt;font&gt;&lt;font&gt;:&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font&gt;&lt;font&gt;&lt;span&gt;latex open_terminal better_python_console&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Gnome_do_9978949346332701_1708&quot; name=&quot;Gnome_do_9978949346332701_1708&quot;&gt;&lt;/a&gt;&lt;font&gt;&lt;span&gt;Gnome-do&lt;/span&gt;&lt;/font&gt;&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;font&gt;sudo aptitude install gnome-do gnome-do-plugins&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Nautilus_9481539467263916_5214&quot; name=&quot;Nautilus_9481539467263916_5214&quot;&gt;&lt;/a&gt;Nautilus&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;font&gt;sudo aptitude install nautilus-open-terminal&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font&gt;&lt;span&gt;Baixar e instalar&lt;/span&gt;:&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;font&gt;nautilus-send-gmail_0.1.1-1_all.deb&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font&gt;nautilus-rename-exif-date_0.1.1-1_all.deb &lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;font&gt;- trocar linhas:&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font&gt;&lt;span&gt;-- Alterar o programa /usr/lib/nautilus/extensions-2.0/python/nautilus-rename-exif-date.py&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def menu_activate_cb(self, menu, names):&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;&quot;&quot;Called when the user selects the menu. Rename the selected files.&quot;&quot;&quot;&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for path in names:&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; img_file = open(path, &quot;rb&quot;)&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tags = EXIF.process_file(img_file)&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date = str(tags[&quot;EXIF DateTimeOriginal&quot;]).replace(&quot;:&quot;, &quot;-&quot;, 2)&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date = date.replace(&quot;:&quot;, &quot;&quot;, 1)&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date = date.replace(&quot;:&quot;, &quot;&quot;, 1)&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date = date.replace(&quot;:&quot;, &quot;&quot;,1)&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date = date.replace(&quot; &quot;, &quot;-&quot;,1)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dir_name = os.path.split(path)[0]&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; file_name = os.path.split(path)[1]&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parts = file_name.split(&quot;.&quot;)&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if len(parts) == 1:&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; extension = &quot;&quot;&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; extension = &quot;.&quot; + parts[-1].lower()&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.rename(path, dir_name + &quot;/&quot; + date + extension)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font&gt;&lt;span&gt;Adicionar scripts a ~/.gnome2/nautilus-scripts (menu de contexto)&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Criar_links_simb_licos_para_pa_24781057710680066&quot; name=&quot;Criar_links_simb_licos_para_pa_24781057710680066&quot;&gt;&lt;/a&gt;Criar links simb&#243;licos para pastas&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;Padr&#227;o: &lt;/span&gt;ln -s destino&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;sudo rm -Rf /usr/local/bin &amp;amp;&amp;amp; ln -s /dados/downloads/scripts /usr/local/bin&lt;/span&gt;&lt;br /&gt;&lt;span&gt;cd&lt;/span&gt;&lt;br /&gt;&lt;span&gt;sudo rm -Rf Documentos Imagens Modelos M&#250;sica P&#250;blico V&#237;deos&lt;/span&gt;&lt;br /&gt;&lt;span&gt;ln -s /dados/Dropbox/aulas/&lt;/span&gt;&lt;br /&gt;&lt;span&gt;ln -s /dados/imagens/&lt;/span&gt;&lt;br /&gt;&lt;span&gt;ln -s /dados/videos/&lt;/span&gt;&lt;br /&gt;&lt;span&gt; ln -s /dados/videos/filmes/&lt;/span&gt;&lt;br /&gt;&lt;span&gt;ln -s /dados/musicas/&lt;/span&gt;&lt;br /&gt;&lt;span&gt; ln -s /dados/series/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Ativar_o_CTRL_ALT_BACKSPACE_pa&quot; name=&quot;Ativar_o_CTRL_ALT_BACKSPACE_pa&quot;&gt;&lt;/a&gt;Ativar o CTRL+ALT+BACKSPACE para reiniciar o X&lt;br /&gt;&lt;/h1&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;Se voc&#234; n&#227;o sabe o que &#233;, provavelmente n&#227;o precisa. Isto habilita uma combina&#231;&#227;o de teclas pra derrubar e reiniciar o servidor gr&#225;fico,conhecido por &quot;X&quot;:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;gksu gedit /etc/X11/xorg.conf&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;Adicione as seguintes linhas:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Section &quot;ServerFlags&quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Option&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;DontZap&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;false&quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;EndSection&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Instalar_impressoras_978166535&quot; name=&quot;Instalar_impressoras_978166535&quot;&gt;&lt;/a&gt;Instalar impressoras&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;Existem duas op&#231;&#245;es:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;span&gt;No Menu: Sistema - Administra&#231;&#227;o - Impress&#227;o&lt;/span&gt;&lt;/li&gt;&lt;li&gt;No navegador: &lt;span&gt;http://localhost:631/&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;DVD_3110031562013573_219516393_33305110232494717&quot; name=&quot;DVD_3110031562013573_219516393_33305110232494717&quot;&gt;&lt;/a&gt;DVD&lt;/h1&gt;&lt;div&gt;&lt;span&gt;sudo aptitude install dvdrip devede &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Jpilot_10677118415911868_74351_1904321877042442&quot; name=&quot;Jpilot_10677118415911868_74351_1904321877042442&quot;&gt;&lt;/a&gt;Jpilot&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;span&gt;sudo aptitude install jpilot jpilot-plugins jpilot-backup jppy-jpilot-plugins &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Diff_7411494450152585_17068869_9019674331474129&quot; name=&quot;Diff_7411494450152585_17068869_9019674331474129&quot;&gt;&lt;/a&gt;Diff&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;span&gt;sudo aptitude install meld&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Aplicativos_e_jogos_para_crian&quot; name=&quot;Aplicativos_e_jogos_para_crian&quot;&gt;&lt;/a&gt;Aplicativos e jogos para crian&#231;as&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;span&gt;sudo aptitude install gcompris gcompris-sound-ptbr tuxpaint tuxpaint-plugins ktuberling &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;IRC_04234294273251882_56843911_170932522576549&quot; name=&quot;IRC_04234294273251882_56843911_170932522576549&quot;&gt;&lt;/a&gt;IRC&lt;/h1&gt;&lt;div&gt;&lt;span&gt;sudo aptitude install xchat&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- Modificar encoding para utf-8&lt;br /&gt;- Usar fonte Monaco&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;C_pia_de_seguran_a_com_sincron&quot; name=&quot;C_pia_de_seguran_a_com_sincron&quot;&gt;&lt;/a&gt;C&#243;pia de seguran&#231;a com sincroniza&#231;&#227;o&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;span&gt;rsync -acruz --progress --rsh=ssh /dados/ usuario@servidor.com.br:/home/usuario/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;LED_da_rede_sem_fio_3333164954&quot; name=&quot;LED_da_rede_sem_fio_3333164954&quot;&gt;&lt;/a&gt;LED da rede sem fio&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;span&gt;sudo aptitude install linux-backports-modules-jaunty&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;&lt;a id=&quot;Gmail_como_cliente_padr_o_de_e&quot; name=&quot;Gmail_como_cliente_padr_o_de_e&quot;&gt;&lt;/a&gt;Gmail como cliente padr&#227;o de email&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;Criar script (&lt;span&gt;/usr/local/bin/gmail.sh&lt;/span&gt;, por exemplo)&lt;br /&gt;&lt;br /&gt;&lt;span&gt;gksu gedit /usr/local/bin/gmail.sh&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;font&gt;&lt;span&gt;&lt;span&gt;Colocar as seguintes linhas no arquivo:&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font&gt;&lt;span&gt;#!/bin/sh&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&lt;span&gt;firefox -remote &quot;openurl(https://mail.google.com/mail?view=cm&amp;amp;tf=0&amp;amp;to=`&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;font&gt;&lt;span&gt;echo $1 | sed 's/mailto://'`,new-tab)&quot;&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tornar execut&#225;vel:&lt;br /&gt;&lt;br /&gt;&lt;span&gt;sudo chmod +x /usr/local/bin/gmail.sh&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Atribuir o script em Sistema - Prefer&#234;ncias - Aplicativos Preferenciais - Leitor de email:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/4593771306625888277-5409508088484072242?l=marrcandre.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Marco Andr&#233; Lopes Mendes</name>
			<email>noreply@blogger.com</email>
			<uri>http://marrcandre.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">marrcandr&#233;</title>
			<link rel="self" href="http://marrcandre.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-4593771306625888277</id>
			<updated>2010-03-02T16:44:50+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Breaking into an Android password manager &#8211; Practice</title>
		<link href="http://blog.labix.org/2009/12/05/breaking-into-an-android-password-manager-practice"/>
		<id>http://blog.labix.org/?p=230</id>
		<updated>2009-12-06T00:38:11+00:00</updated>
		<content type="html">&lt;p&gt;In &lt;a href=&quot;http://blog.labix.org/2009/12/01/breaking-into-an-android-password-manager-theory&quot;&gt;the last post&lt;/a&gt;, we&amp;#8217;ve seen some security issues which exist in the Android password manager &lt;a href=&quot;http://www.gbizapps.com/gbasafe.htm&quot;&gt;gbaSafe&lt;/a&gt; version 1.1.0a, by analyzing the security description provided in its web site.  As described there, even though the system depends on a &amp;#8220;master key&amp;#8221; which might be secure, the security of the system is seriously compromised by the encouragement of very weak keys (a few &lt;i&gt;digits&lt;/i&gt; only) in what is named an &amp;#8220;unlock key&amp;#8221;, used to encrypt the master key itself.  All of that in an application which claims to strongly &lt;i&gt;protect&lt;/i&gt; people&amp;#8217;s data from unwanted eyes.&lt;/p&gt;
&lt;p&gt;In this post, we will play a bit with the Linux-based Android OS to actually explore these security deficiencies, demonstrating that such issues are very real, and that the claims of being hard to unveil the data is unfounded.  Since the most serious weakness lies in the key itself, we&amp;#8217;ll run a simple brute force attack to try to find arbitrary unlock keys.&lt;/p&gt;
&lt;p&gt;This procedure is actually mentioned by the author of gbaSafe himself in the web page, except he overestimates the work involved in producing such a mechanism:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Theoretically, somebody could write a program that tries to decrypt the master key by trying all possible values of the short key (with 4 digits there are only 10000 possibilities), but this would still be much work, as more information about the crypting algorithm is needed (e.g. salt bytes, iteration count).
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;So let&amp;#8217;s get started.&lt;/p&gt;
&lt;p&gt;As a first step, we&amp;#8217;ll need the &lt;a href=&quot;http://developer.android.com/sdk/index.html&quot;&gt;Android SDK&lt;/a&gt; with a working emulator (I&amp;#8217;ve used API level 5, revision 1), and a copy of the application itself.  I got a &lt;a href=&quot;http://andappstore.com/AndroidApplications/apps/gbaSafe_Password_Safe&quot;&gt;trial version of the application&lt;/a&gt; from &lt;a href=&quot;http://andappstore.com/&quot;&gt;AndAppStore.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The application downloaded is bundled within that &lt;i&gt;.apk&lt;/i&gt; file, which is really a &lt;i&gt;.zip&lt;/i&gt; file that may be opened up normally with any tool which understands this file format.&lt;/p&gt;
&lt;p&gt;Once that&amp;#8217;s done, we get access to all the information needed to run the application, including icons, interface layouts, and most importantly in this case, the bytecode which targets the &lt;a href=&quot;http://en.wikipedia.org/wiki/Dalvik_virtual_machine&quot;&gt;Dalvik VM&lt;/a&gt;.   This bytecode is the end result of a sequence of translations which happen when the program&amp;#8217;s Java source code is compiled, so that&amp;#8217;s what we&amp;#8217;ll have to fiddle with to figure details of the application we want to investigate.&lt;/p&gt;
&lt;p&gt;The bytecode is located inside the &lt;i&gt;classes.dex&lt;/i&gt; file, and as expected it&amp;#8217;s not easy to read in its native format.  Luckily, though, a smart guy has already written a couple of tools, &lt;a href=&quot;http://code.google.com/p/smali/&quot;&gt;smali and baksmali&lt;/a&gt;, which allow people to decompile and recompile that bytecode format to/from something that is much easier to understand.&lt;/p&gt;
&lt;p&gt;After downloading these tools, the following command should decompile the file:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
$ java -jar baksmali.jar &amp;#8211;output classes classes.dex
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;We now have a &lt;i&gt;classes/&lt;/i&gt; directory full of &lt;i&gt;.smali&lt;/i&gt; files.&lt;/p&gt;
&lt;p&gt;Before going any further, let&amp;#8217;s ponder for a moment about what we want to do.  A brute force attack is when we attempt sequentially many possible keys, and given the context already presented, what we&amp;#8217;re looking after is to attempt different &amp;#8220;unlock keys&amp;#8221;.  With that in mind, we&amp;#8217;ll introduce a very small modification in the application so that it will attempt to enter the unlock key automatically, rather than reporting an error when the key entered in the unlock dialog is invalid.&lt;/p&gt;
&lt;p&gt;With that in mind, after some quick research, it looks like the &lt;i&gt;onClick()&lt;/i&gt; method within the &lt;i&gt;DlgUnlock.smali&lt;/i&gt; file is a pretty good candidate.  This is supposedly called when the button in the unlock dialog is clicked, so something interesting about the password being correct or not must happen there.&lt;/p&gt;
&lt;p&gt;Before doing anything there, I&amp;#8217;ve increased the number of registers in the function to 12, to get some additional registers to play with, and then initialized a register with the value zero, to serve as a monotonically increasing number (our keys!):&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
 .method public onClick(Landroid/view/View;)V&lt;br /&gt;
-    .registers 9&lt;br /&gt;
+    .registers 12&lt;br /&gt;
     .parameter &amp;#8220;view&amp;#8221;&lt;br /&gt;
+    const/16 v9, 0&amp;#215;0
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Then, we have to instruct the program to use these keys rather than whatever is typed in the dialog box.  Some lines down, we&amp;#8217;ll see a call to the &lt;i&gt;checkUnlockKey()&lt;/i&gt; method, which is certainly what we&amp;#8217;re looking after.  Let&amp;#8217;s do this now:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
+    :mykey&lt;br /&gt;
+    invoke-static {v9}, Ljava/lang/String;-&gt;valueOf(I)Ljava/lang/String;&lt;br /&gt;
+    move-result-object v2&lt;br /&gt;
     invoke-static {v2}, Lcom/gbizapps/safeA/Crypt;-&gt;checkUnlockKey(Ljava/lang/String;)I
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Now, what if this key is wrong?  We don&amp;#8217;t want the master key to be removed as mentioned in the software description.  We want to simply attempt the next key.  With some analysis, we see that in case of errors, the next couple of lines below the above code will instruct the VM to jump to an error branch.  Rather than following up with the normal error logic, we&amp;#8217;ll increment the key, and jump back to the above code:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
     :cond_6c&lt;br /&gt;
+    add-int/lit8 v9, v9, 0&amp;#215;1&lt;br /&gt;
+    goto :mykey
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Now we just have to rebundle this and put it into the emulator.  I won&amp;#8217;t go over it in too much detail here, since there&amp;#8217;s plenty of information available online, but the steps to do that are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Recreate a modified classes.dex with &lt;i&gt;smali&lt;/i&gt;
&lt;li&gt;Recreate a modified &lt;i&gt;.apk&lt;/i&gt; file by just zipping the modified content
&lt;li&gt;Sign and zipalign the new &lt;i&gt;.apk&lt;/i&gt; file
&lt;li&gt;Install it
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;And that&amp;#8217;s it, seriously!  This would be enough to break the software security if it was working &lt;i&gt;correctly&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Interestingly, though, the software &lt;i&gt;wasn&amp;#8217;t&lt;/i&gt; working correctly with this change.  Instead, it was &lt;i&gt;Force Closing&lt;/i&gt; on certain keys.   To test it out, use the master key &amp;#8220;master key&amp;#8221;, and the unlock key &amp;#8220;999999&amp;#8243;, and then once you close and open the application again, try to unlock it with the key &amp;#8220;1175&amp;#8243;.  Instead of showing an error message, it will break badly.&lt;/p&gt;
&lt;p&gt;Now, for the proof of concept to work, I actually had to &lt;i&gt;fix&lt;/i&gt; the bug, which felt a bit funny to do given the context.&lt;/p&gt;
&lt;p&gt;Looking at the traceback trough &lt;i&gt;adb logcat&lt;/i&gt;, I found out that there was a null being dereferenced in the file &lt;i&gt;Crypt.smali&lt;/i&gt;, so I fixed the problem by injecting some error checking at this position and jumping the flow into an existing error branch:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
+    if-eqz v3, :cond_5a&lt;br /&gt;
     const-string v4, &amp;#8220;ucpmhkexov85MDKhdfdfFGQPYxywq7209fcrqhghjkuiopy&amp;#8221;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;With this in place came the biggest surprise of the experiment. The keys which were crashing the application were special, in the sense that they actually &lt;i&gt;decode the master key successfully&lt;/i&gt;!  That&amp;#8217;s right: whatever the algorithm is doing, that six-digit &amp;#8220;999999&amp;#8243; encrypts the master key in such a way that attempting the &amp;#8220;1175&amp;#8243; key works, so even big keys are rendered extremely weak with the logic used to encrypt the master key.&lt;/p&gt;
&lt;p&gt;At this point, I added some trivial logic to display the key found with a &lt;a href=&quot;http://developer.android.com/reference/android/widget/Toast.html&quot;&gt;Toast&lt;/a&gt;, just to ensure the whole thing was working correctly:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.labix.org/wp-content/uploads/2009/12/device.png&quot; alt=&quot;Toast displaying unlock key found&quot; title=&quot;Toast displaying unlock key found&quot; width=&quot;320&quot; height=&quot;480&quot; class=&quot;aligncenter size-full wp-image-242&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Note that the key generation implemented above is a bit simplistic, in the sense that it doesn&amp;#8217;t attempt keys with leading zeros, but this would be trivial to implement, and my intention here isn&amp;#8217;t to actually break any keys for real, but just to show how the promised security in this application is not to be trusted at all.  Just the logic above will already be enough for a brute force attack against the application, and has broken all the keys I&amp;#8217;ve tried in mere seconds, in a &lt;i&gt;slow emulator&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;As a conclusion, if you want to put your data in a secure place, rather than picking an application which promises security because &lt;i&gt;the salt is hidden somewhere&lt;/i&gt; or because it&amp;#8217;s &lt;i&gt;too much work to figure its logic&lt;/i&gt;, pick an open source application with logic which is publicly verifiable and has already had many eyes over it.  Chances are that doing something like what was described in this post won&amp;#8217;t be so trivial.  Then, &lt;i&gt;choose your keys wisely&lt;/i&gt;!  The most secure application won&amp;#8217;t be enough if you pick a bad key.&lt;/p&gt;</content>
		<author>
			<name>Gustavo Niemeyer</name>
			<uri>http://blog.labix.org</uri>
		</author>
		<source>
			<title type="html">Labix Blog</title>
			<subtitle type="html">by Gustavo Niemeyer</subtitle>
			<link rel="self" href="http://blog.labix.org/feed"/>
			<id>http://blog.labix.org/feed</id>
			<updated>2010-03-09T22:44:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">amaral</title>
		<link href="http://rodrigoamaral.net/2009/12/04/novo-app-engine-sdk-na-rua/"/>
		<id>http://rodrigoamaral.net/?p=207</id>
		<updated>2009-12-04T13:02:50+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;A vers&#227;o 1.2.8 do &lt;a href=&quot;http://code.google.com/appengine&quot;&gt;Google App Engine SDK&lt;/a&gt; j&#225; est&#225; dispon&#237;vel para &lt;a href=&quot;http://code.google.com/appengine/downloads.html&quot;&gt;download&lt;/a&gt;. O novo release traz muitas melhorias no servi&#231;o de &lt;a href=&quot;http://code.google.com/appengine/docs/python/taskqueue/&quot;&gt;Task Queue&lt;/a&gt; e no &lt;a href=&quot;http://code.google.com/appengine/docs/python/tools/devserver.html#The_Development_Console&quot;&gt;Admin Console&lt;/a&gt;, al&#233;m de v&#225;rias pequenas corre&#231;&#245;es.&lt;/p&gt;
&lt;p&gt;Para mais detalhes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://googleappengine.blogspot.com/2009/12/app-engine-sdk-128-released-including.html&quot;&gt;An&#250;ncio oficial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/googleappengine/wiki/SdkReleaseNotes&quot;&gt;Notas de vers&#227;o do App Engine SDK 1.2.8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/ramaral.wordpress.com/207/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/ramaral.wordpress.com/207/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/ramaral.wordpress.com/207/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/ramaral.wordpress.com/207/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/ramaral.wordpress.com/207/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/ramaral.wordpress.com/207/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/ramaral.wordpress.com/207/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/ramaral.wordpress.com/207/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/ramaral.wordpress.com/207/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/ramaral.wordpress.com/207/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rodrigoamaral.net&amp;blog=9876794&amp;post=207&amp;subd=ramaral&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Rodrigo Amaral</name>
			<uri>http://rodrigoamaral.net</uri>
		</author>
		<source>
			<title type="html">Rodrigo Amaral &#187; Python</title>
			<subtitle type="html">Pensando em uma frase interessante para colocar aqui</subtitle>
			<link rel="self" href="http://rodrigoamaral.net/category/python/feed/"/>
			<id>http://rodrigoamaral.net/category/python/feed/</id>
			<updated>2009-12-17T23:44:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Breaking into an Android password manager &#8211; Theory</title>
		<link href="http://blog.labix.org/2009/12/01/breaking-into-an-android-password-manager-theory"/>
		<id>http://blog.labix.org/?p=203</id>
		<updated>2009-12-02T01:33:16+00:00</updated>
		<content type="html">&lt;p&gt;For some time now I&amp;#8217;ve been wanting to research more deeply about the internals of &lt;a href=&quot;http://www.android.com&quot;&gt;Android&lt;/a&gt;.  Until now, though, this was just a sentiment.  Then, a couple of weeks ago I&amp;#8217;ve finally managed to replace &lt;a href=&quot;http://blog.labix.org/2009/06/30/my-iphone-for-an-android&quot;&gt;my iPhone for an Android&lt;/a&gt; phone, and that was the final motivator for me to actually get into learning more about the inner workings of the Linux-based OS.&lt;/p&gt;
&lt;p&gt;Now, I just had to pick an actual task for digging into.  The Dalvik VM is certainly one of the most innovative and advertised technical details about the OS, so something around it would be a nice start.. some kind of bytecode fiddling perhaps, but what?  Luckily, even without trying too hard, I eventually stumbled upon an interesting case for researching upon.&lt;/p&gt;
&lt;p&gt;The &amp;#8220;victim&amp;#8221; of this research is the application &lt;a href=&quot;http://www.gbizapps.com/gbasafe.htm&quot;&gt;gbaSafe&lt;/a&gt; version 1.1.0a, which claims to protect user passwords using &lt;i&gt;unbreakable algorithms&lt;/i&gt; (how&amp;#8217;s that for a hint of a &lt;a href=&quot;http://en.wikipedia.org/wiki/Snake_oil_(cryptography)&quot;&gt;Snake oil&lt;/a&gt; case?).&lt;/p&gt;
&lt;p&gt;Before we get into some hacking, let&amp;#8217;s see some words on the software security by the author himself, and then render some analysis on conceptual issues on it:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
The confidential data can only be decrypted if the master key is known. You should choose a long key (at least 16 characters) with mixed case and unreadable text. Of course you cannot enter this key each time you want to access the confidential data, so it is stored in the user settings encrypted with a shorter key (4 to 6 digits) and normally you only have to enter this unlock key. Theoretically it is possible to try all possible values (brute force attack), but then you must use another program, since gbaSafe deletes the encrypted master key from the user settings when you enter the unlock key wrong three times repeatedly, and then you must enter the master key. If you wrote a program to decrypt the master key, you would have to know the algorithm used, the salt bytes and iteration count (used to augment the short unlock key), which are very hard to extract from the binary program module gbaSafe.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;If you have some security background, I&amp;#8217;m sure that by now you&amp;#8217;re already counting the issues on this single paragraph.&lt;/p&gt;
&lt;p&gt;The most obvious issue is the fact that there&amp;#8217;s a &amp;#8220;strong key&amp;#8221; and a &amp;#8220;weak key&amp;#8221;, and the strong key is encrypted with the weak one.  This is a very common cryptography sin, as would say my friend and coworker Andreas Hasenack (a security researcher himself).  A security system is only as secure as its weakest spot.  It obviously makes little difference for an attacker if he has to attempt decrypting a master key or the actual data, since decrypting the master key will give access to the data.&lt;/p&gt;
&lt;p&gt;Then, it mentions en passant that the software &lt;i&gt;enforces&lt;/i&gt; the use of &lt;i&gt;digits&lt;/i&gt; for the weak key.  This ensures that the weak key is &lt;i&gt;really&lt;/i&gt; weak!  Four digits is basically ten thousand attempts, which is absolutely nothing for nowadays&amp;#8217;s hardware.  This number would move up to about 15 million by simply allowing upper and lowercase letters as well (which isn&amp;#8217;t great either, but a few orders of magnitude never hurt in this scenario).&lt;/p&gt;
&lt;p&gt;It follows up encouraging people to think that it&amp;#8217;s actually hard to figure the algorithm and other implementation details.  Considering that there&amp;#8217;s absolutely nothing preventing people from getting their hands in the implementation itself, this is in fact asserting that the security mechanism is based on the ignorance of the attacker.  Counting on the ignorance of people is bad at all times, and in a security context it&amp;#8217;s a major error.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s a final security issue in this description which is a bit more subtle, but further analysis on the logic used leaves no doubt.  In cryptography, the &lt;a href=&quot;http://en.wikipedia.org/wiki/Salt_(cryptography)&quot;&gt;salt&lt;/a&gt; is supposed to increase the work needed in a brute force attack by strengthening the number of bits of the actual passphrase, in a case where the salt is &lt;i&gt;actually&lt;/i&gt; unavailable, or at least prevent that a single large word dictionary can be used to attack several encryptions or hashes at once, in a case where the salt is known but variable.  In the latter case, it helps because encrypting a single key with two different salts must be done twice, rather than once, so it increases the computational task when attacking multiple items.  A salt which is known and does not change across all processed items is worth pretty close to nothing.&lt;/p&gt;
&lt;p&gt;So, indeed, considering the many security issues here, this isn&amp;#8217;t something I&amp;#8217;d store my passwords or credit card numbers on, and I suggest you don&amp;#8217;t do it either.&lt;/p&gt;
&lt;p&gt;In my next post on this topic I&amp;#8217;ll actually implement a trivial brute force attack to prove that these issues are &lt;i&gt;very&lt;/i&gt; real, and that, actually, it&amp;#8217;s not even hard to break into a security system like this.&lt;/p&gt;
&lt;p&gt;The application author has been contacted about this blog post, since he&amp;#8217;ll likely want to fix some of these issues.&lt;/p&gt;</content>
		<author>
			<name>Gustavo Niemeyer</name>
			<uri>http://blog.labix.org</uri>
		</author>
		<source>
			<title type="html">Labix Blog</title>
			<subtitle type="html">by Gustavo Niemeyer</subtitle>
			<link rel="self" href="http://blog.labix.org/feed"/>
			<id>http://blog.labix.org/feed</id>
			<updated>2010-03-09T22:44:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Creating the urllist.txt with your sitemaps configuration</title>
		<link href="http://blog.afurlan.org/2009/12/01/creating-urllisttxt-with-sitemaps-configuration/"/>
		<id>http://blog.afurlan.org/2009/12/01/creating-urllisttxt-with-sitemaps-configuration/</id>
		<updated>2009-12-01T16:42:30+00:00</updated>
		<content type="html">&lt;p&gt;In &lt;a href=&quot;http://djangoproject.com&quot;&gt;Django&lt;/a&gt;, you can configure the &lt;a href=&quot;http://en.wikipedia.org/wiki/Sitemaps&quot;&gt;sitemap&lt;/a&gt; of your website using the &lt;a href=&quot;http://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/&quot;&gt;sitemaps framework&lt;/a&gt; and then use this configuration to generate the &lt;b&gt;sitemap.xml&lt;/b&gt;. Notwithstanding, the &lt;a href=&quot;http://yahoo.com&quot;&gt;Yahoo!&lt;/a&gt; used to support only the &lt;b&gt;urllist.txt&lt;/b&gt; type of sitemap and, because of that, I still use to have both (urllist.txt and sitemap.xml) available on my websites.
&lt;/p&gt;
&lt;p&gt;But, once you have your sitemap configured, why not use it to generate the urllist.txt? I created a view which generates the urllist.txt based on your sitemap configuration, as follows:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# -*- coding: utf-8 -*-

from django.conf import settings
from django.http import HttpResponse
from django.contrib.sites.models import Site

def urllist_from_sitemaps(request, sitemaps):
        urllist = []
        protocol = getattr(settings, 'PROTOCOL', 'http')
        baseurl = u'%s://%s' % (protocol, Site.objects.get_current().domain)
        for cls in sitemaps.values():
                instance = object.__new__(cls)
                for item in instance.items():
                        urllist.append(baseurl + item.get_absolute_url())
        return HttpResponse(u'\n'.join(urllist), mimetype='text/plain')
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And now, you just need to configure the urls.py and add the urllist.txt entry:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sitemaps = {
    'entries': EntrySitemap,
    'tags': TagSitemap,
    'archive': ArchiveSitemap,
}

urlpatterns = patterns('',
    ...
    (r'^sitemap.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}),
    (r'^urllist.txt$', 'myproj.apps.myapp.views.urllist_from_sitemaps', {'sitemaps': sitemaps}),
    ...
)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And I think that is all for now...
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Update 1:&lt;/b&gt; I submitted a patch to be added into the official &lt;a href=&quot;http://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/&quot;&gt;Sitemaps framework&lt;/a&gt; of the Django. The patch is very different of the code in this post and, if you'd like to see it and its code, &lt;a href=&quot;http://code.djangoproject.com/ticket/12347&quot;&gt;here it is&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;&lt;small&gt;As always: if you found some english bug, warn me and I'll be glad to fix it. :)&lt;/small&gt;
&lt;/p&gt;</content>
		<author>
			<name>Arthur Furlan</name>
			<uri>http://blog.afurlan.org/tags/python/</uri>
		</author>
		<source>
			<title type="html">afurlan's blog -- tag: python</title>
			<subtitle type="html">Latest entries for tag &quot;python&quot;</subtitle>
			<link rel="self" href="http://blog.arthurfurlan.org/tags/python/rss/"/>
			<id>http://blog.arthurfurlan.org/tags/python/rss/</id>
			<updated>2010-03-22T13:44:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Droplet: Um Twitter &amp;amp; Google Reader em C++ para Arduino</title>
		<link href="http://techberto.wordpress.com/2009/11/30/droplet-um-twitter-google-reader-em-c-para-arduino/"/>
		<id>http://techberto.wordpress.com/?p=170</id>
		<updated>2009-12-01T00:34:01+00:00</updated>
		<content type="html">&lt;p&gt;&lt;img class=&quot;alignnone&quot; src=&quot;http://farm4.static.flickr.com/3461/3791394747_8903a57aae.jpg&quot; alt=&quot;&quot; width=&quot;500&quot; height=&quot;174&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Esbarrei com este projeto que achei bastante interessante, como um link &#224;s vezes &#233; mais verboso do que mil palavras:&lt;/p&gt;
&lt;p&gt;-&lt;a href=&quot;http://rapplogic.blogspot.com/2009/08/droplet.html&quot; target=&quot;_blank&quot;&gt; Droplet&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;alignnone&quot; title=&quot;Droplet&quot; src=&quot;http://farm3.static.flickr.com/2535/3791394561_74cc3f06f2.jpg&quot; alt=&quot;&quot; width=&quot;402&quot; height=&quot;500&quot; /&gt;&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/techberto.wordpress.com/170/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/techberto.wordpress.com/170/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/techberto.wordpress.com/170/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/techberto.wordpress.com/170/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/techberto.wordpress.com/170/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/techberto.wordpress.com/170/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/techberto.wordpress.com/170/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/techberto.wordpress.com/170/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/techberto.wordpress.com/170/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/techberto.wordpress.com/170/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=techberto.wordpress.com&amp;blog=400569&amp;post=170&amp;subd=techberto&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>techberto</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">SciTech::Inno::Blog</title>
			<subtitle type="html">Ci&#234;ncia, tecnologia, programa&#231;&#227;o, m&#250;sica e insights geeks do meu herm&#233;tico box nervoso...</subtitle>
			<link rel="self" href="http://techberto.wordpress.com/feed/atom/"/>
			<id>http://techberto.wordpress.com/feed/atom/</id>
			<updated>2010-03-08T02:44:23+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">As fotos e v&#237;deos da PythonBrasil[5] est&#227;o dispon&#237;veis!</title>
		<link href="http://associacao.python.org.br/associacao/imprensa/noticias/fotos-e-videos-da-pythonbrasil-5-disponiveis"/>
		<id>http://associacao.python.org.br/associacao/imprensa/noticias/fotos-e-videos-da-pythonbrasil-5-disponiveis</id>
		<updated>2009-11-26T16:40:40+00:00</updated>
		<content type="html">A Associa&#231;&#227;o Python Brasil liberou os v&#237;deos da &#250;ltima edi&#231;&#227;o da PythonBrasil, ocorrida em Caxias do Sul.</content>
		<author>
			<name>Noticias da APyB</name>
			<uri>http://associacao.pythonbrasil.org/noticias</uri>
		</author>
		<source>
			<title type="html">Not&#237;cias</title>
			<subtitle type="html">Not&#237;cias sobre a Associa&#231;&#227;o.</subtitle>
			<link rel="self" href="http://associacao.python.org.br/noticias/RSS"/>
			<id>http://associacao.python.org.br/noticias/RSS</id>
			<updated>2010-03-22T05:44:04+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Make e Makefile</title>
		<link href="http://blog.stiod.com/2009/11/25/make-e-makefile/"/>
		<id>http://blog.stiod.com/?p=719</id>
		<updated>2009-11-25T14:43:43+00:00</updated>
		<content type="html">&lt;p&gt;Voc&#234; que utiliza algum *nix da vida j&#225; deve ter passado pelo momento m&#225;gico de ter executado o comando make em algum c&#243;digo fonte, n&#227;o?&lt;/p&gt;
&lt;p&gt;O &lt;strong&gt;make&lt;/strong&gt; (&lt;a href=&quot;http://www.gnu.org/software/make/&quot;&gt;GNU make&lt;/a&gt;) &#233; uma ferramenta que executa os comandos inclusos dentro de um arquivo. &#201; normalmente utilizado na &lt;strong&gt;compila&#231;&#227;o&lt;/strong&gt; e &lt;strong&gt;instala&#231;&#227;o&lt;/strong&gt; de programas.&lt;/p&gt;
&lt;p&gt;Uma das vantagens do make &#233; que ele identifica quais partes do programa devem ser recompiladas de acordo com as mudan&#231;as efetuadas desde a &#250;ltima compila&#231;&#227;o.&lt;/p&gt;
&lt;p&gt;Dependendo do tamanho do programa pode-se economizar minutos ou horas entre as recompila&#231;&#245;es, pois n&#227;o ser&#225; necess&#225;rio recompilar o programa inteiro.&lt;/p&gt;
&lt;p&gt;Exemplo de uso:&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;$ &lt;span&gt;make&lt;/span&gt; -f arquivo_com_os_comandos&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Se voc&#234; chamar o comando make sem passar nenhum par&#226;metro ele tentar&#225; utilizar o arquivo com nome de &lt;strong&gt;Makefile&lt;/strong&gt; do diret&#243;rio atual.&lt;/p&gt;
&lt;p&gt;&#201; o que normalmente acontece quando voc&#234; precisa compilar e instalar um programa pelo c&#243;digo fonte.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Descompactar o c&#243;digo fonte (se for um &quot;&lt;strong&gt;*.tar.gz&lt;/strong&gt;&quot;).&lt;/li&gt;
&lt;li&gt;Entrar na pasta descompactada. Haver&#225; um arquivo &lt;strong&gt;Makefile&lt;/strong&gt; dentro.&lt;/li&gt;
&lt;li&gt;Executar o comando &quot;&lt;strong&gt;make&lt;/strong&gt;&quot; para compilar.&lt;/li&gt;
&lt;li&gt;Executar o comando &quot;&lt;strong&gt;make install&lt;/strong&gt;&quot; como root para instalar.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Makefile&lt;/h3&gt;
&lt;p&gt;Se voc&#234; quiser utilizar o comando make s&#243; &#233; necess&#225;rio criar um arquivo &lt;strong&gt;Makefile&lt;/strong&gt; e dentro dele colocar as instru&#231;&#245;es que o make deve executar.&lt;/p&gt;
&lt;p&gt;Formato do Makefile:&lt;/p&gt;
&lt;pre&gt;regra: depend&#234;ncias...
	comandos
	...&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Os &lt;strong&gt;comandos&lt;/strong&gt; s&#227;o comandos normais do &lt;strong&gt;shell&lt;/strong&gt; (bash). Pode-se colocar v&#225;rios comandos, por&#233;m devem estar &lt;strong&gt;identados com tabula&#231;&#245;es&lt;/strong&gt;. Isto &#233; importante, &lt;strong&gt;n&#227;o utilize espa&#231;os&lt;/strong&gt; pois n&#227;o ir&#225; funcionar.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;regra&lt;/strong&gt; &#233; s&#243; um nome para identificar um bloco de comandos. Fazendo uma analogia com programa&#231;&#227;o, a &quot;regra&quot; seria semelhante a uma fun&#231;&#227;o.&lt;/p&gt;
&lt;p&gt;As &lt;strong&gt;depend&#234;ncias&lt;/strong&gt; s&#227;o os arquivos necess&#225;rios para a execu&#231;&#227;o dos comandos da regra, o make ir&#225; fazer a verifica&#231;&#227;o deles. Tamb&#233;m podem ser outras &lt;strong&gt;regras&lt;/strong&gt; que ser&#227;o chamadas antes da execu&#231;&#227;o dos comandos. Se houver mais de uma depend&#234;ncia elas devem ser separadas com espa&#231;os.&lt;/p&gt;
&lt;p&gt;Aqui vai um exemplo de um Makefile que compila um programa em C:&lt;/p&gt;
&lt;pre&gt;program:
	gcc -o meuprograma meuprograma.c&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Um exemplo com depend&#234;ncias:&lt;/p&gt;
&lt;pre&gt;program: cod1.c cod2.c lib1.a
	gcc -c cod1.c cod2.c
	gcc cod1.o cod2.o lib1.a -o program

lib1.a: lib1.c cod3.c
	gcc -c lib1.c cod3.c
	ar rcs lib1.a lib1.o cod3.o
	ranlib lib1.a&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Pode-se utilizar vari&#225;veis tamb&#233;m. A declara&#231;&#227;o &#233; simples, mas devem ser chamados com a nota&#231;&#227;o &quot;&lt;strong&gt;$(vari&#225;vel)&lt;/strong&gt;&quot;. Repare tamb&#233;m que elas podem ser concatenadas:&lt;/p&gt;
&lt;pre&gt;CC=gcc
CFLAGS=-O2
CFLAGS=$(CFLAGS) -Wall

program:
	$(CC) $(CFLAGS) -o program program.c&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Olha que legal no Makefile a seguir, advinha o que acontece ao executar o comando `make clean' no terminal?&lt;/p&gt;
&lt;pre&gt;program: program.c
        gcc -o program program.c

clean:
        rm *.o
        rm program&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;O que aconteceria tamb&#233;m se houvesse um arquivo no diret&#243;rio atual que se chamasse &quot;clean&quot;? O `make clean' n&#227;o iria executar a lista de comandos da regra. Para evitar este tipo de conflito utilize a regra &quot;&lt;strong&gt;.PHONY&lt;/strong&gt;&quot;:&lt;/p&gt;
&lt;pre&gt;program: program.c
        gcc -o program program.c

.PHONY: clean
clean:
        rm *.o
        rm program&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Agora a regra &quot;clean&quot; ser&#225; executada mesmo se houver um arquivo no diret&#243;rio atual com mesmo nome.&lt;/p&gt;</content>
		<author>
			<name>Stiods Palace</name>
			<uri>http://blog.stiod.com</uri>
		</author>
		<source>
			<title type="html">Stiod Blog &#187; C/C++</title>
			<subtitle type="html">Just another WordPress weblog</subtitle>
			<link rel="self" href="http://blog.stiod.com.br/?feed=rss2&amp;cat=4"/>
			<id>http://blog.stiod.com.br/?feed=rss2&amp;cat=4</id>
			<updated>2010-03-22T13:44:23+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">The last 4 years (and the next N?)</title>
		<link href="http://blog.labix.org/2009/11/25/the-last-4-years-and-the-next-n"/>
		<id>http://blog.labix.org/?p=190</id>
		<updated>2009-11-25T04:16:59+00:00</updated>
		<content type="html">&lt;p&gt;Some interesting changes have been happening in my professional life, so I wanted to share it here to update friends and also for me to keep track of things over time (at some point I will be older and will certainly laugh at what I called &amp;#8220;interesting changes&amp;#8221; in the ol&amp;#8217;days).  Given the goal, I apologize but this may come across as more egocentric than usual, so please feel free to jump over to your next blog post at any time.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s been little more than four years since I left &lt;a href=&quot;http://www.conectiva.com.br&quot;&gt;Conectiva / Mandriva&lt;/a&gt; and joined &lt;a href=&quot;http://www.canonical.com&quot;&gt;Canonical&lt;/a&gt;, in August of 2005.  Shortly after I joined, I had the luck of spending a few months working on the different projects which the company was pushing at the time, including &lt;a href=&quot;http://launchpad.net&quot;&gt;Launchpad&lt;/a&gt;, then &lt;a href=&quot;http://bazaar-vcs.org/en/&quot;&gt;Bazaar&lt;/a&gt;, then a little bit on some projects which didn&amp;#8217;t end up seeing much light. It was a great experience by itself, since all of these projects were abundant in talent.  Following that, in the beginning of 2006, counting on the trust of people which knew more than I did, I was requested/allowed to lead the development of a brand new project the company wanted to attempt.  After a few months of research I had the chance to sit next to Chris Armstrong and Jamu Kakar to bootstrap the development of what is now known as the &lt;a href=&quot;https://landscape.canonical.com&quot;&gt;Landscape&lt;/a&gt; distributed systems management project.&lt;/p&gt;
&lt;p&gt;Fast forward three and a half years, in mid 2009, and Landscape became a massive project with hundreds of thousands of very well tested lines, sprawling not only a client branch, but also external child projects such as the &lt;a href=&quot;https://storm.canonical.com&quot;&gt;Storm Object Relational Mapper&lt;/a&gt;, in use also by Launchpad and &lt;a href=&quot;https://one.ubuntu.com&quot;&gt;Ubuntu One&lt;/a&gt;.  In the commercial side of things it looks like Landscape&amp;#8217;s life is just starting, with its hosted and standalone versions getting more and more attention from enterprise customers.  And the three guys which started the project didn&amp;#8217;t do it alone, for sure.  The toy project of early 2006 has grown to become a well structured team, with added talent spreading areas such as development, business and QA.&lt;/p&gt;
&lt;p&gt;While I wasn&amp;#8217;t watching, though, something happened.  Facing that great action, my attention was slowly being spread thinly among management, architecture, development, testing, code reviews, meetings, and other tasks, sometimes in areas not entirely related, but very interesting of course.  The net result of increased attention sprawl isn&amp;#8217;t actually good, though.  If it persists, even when the several small tasks may be individually significant, the achievement just doesn&amp;#8217;t feel significant given the invested effort as a whole.  At least not for someone that truly enjoys being a software architect, and loves to feel that the effort invested in the growth of a significant working software is really helping people out in the same magnitude of that investment.  In simpler words, it felt like my position within the team just wasn&amp;#8217;t helping the team out the same way it did before, and thus it was time for a change.&lt;/p&gt;
&lt;p&gt;Last July an external factor helped to catapult that change. &lt;a href=&quot;http://www.eucalyptus.com&quot;&gt;Eucalyptus&lt;/a&gt; needed a feature to be released with Ubuntu 9.10, due in October, to greatly simplify the installation of some standard machine images.. an &lt;i&gt;Image Store&lt;/i&gt;.  It felt like a very tight schedule, even more considering that I hadn&amp;#8217;t been doing Java for a while, and Eucalyptus uses some sexy (and useful) new technology called  the &lt;a href=&quot;http://code.google.com/webtoolkit/&quot;&gt;Google Web Toolkit&lt;/a&gt;, something I had to get acquainted with.  Two months looked like a tight schedule, and a risky bet overall, but it also felt like a great opportunity to strongly refocus on a task that needed someone&amp;#8217;s attention urgently.  Again I was blessed with trust I&amp;#8217;m thankful for, and by now I&amp;#8217;m relieved to look back and perceive that it went alright, certainly thanks to the help of other people like Sidnei da Silva and Mathias Gug.  Meanwhile, on the Landscape side, my responsibilities were distributed within the team so that I could be fully engaged on the problem.&lt;/p&gt;
&lt;p&gt;Moving this forward a little bit we reach the current date.  Right now the Landscape project has a new organizational structure, and it actually feels like it&amp;#8217;s moving along quite well.  Besides the internal changes, a major organizational change also took place around Landscape over that period, and the planned restructuring led me to my current role.  In practice, I&amp;#8217;m now engaging into the research of a new concept which I&amp;#8217;m hoping to publish openly quite soon, if everything goes well.    It&amp;#8217;s challenging, it&amp;#8217;s exciting, and most importantly, allows me to focus strongly on something which has a great potential (I will stop teasing you now).  In addition to this, I&amp;#8217;ll definitely be spending some of that time on the progress of Landscape and the Image Store, but mostly from an architectural point of view, since both of these projects will have bright hands taking care of them more closely.&lt;/p&gt;
&lt;p&gt;Sit by the fireside if you&amp;#8217;re interested in the upcoming chapters of that story. &lt;img src=&quot;http://blog.labix.org/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;</content>
		<author>
			<name>Gustavo Niemeyer</name>
			<uri>http://blog.labix.org</uri>
		</author>
		<source>
			<title type="html">Labix Blog</title>
			<subtitle type="html">by Gustavo Niemeyer</subtitle>
			<link rel="self" href="http://blog.labix.org/feed"/>
			<id>http://blog.labix.org/feed</id>
			<updated>2010-03-09T22:44:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">And more EFL news out there!</title>
		<link href="http://feedproxy.google.com/~r/GustavoSverzutBarbieri/~3/EjSxIbvoWx8/"/>
		<id>http://blog.gustavobarbieri.com.br/?p=197</id>
		<updated>2009-11-23T12:03:16+00:00</updated>
		<content type="html">&lt;p&gt;Wow! Just after my &lt;a href=&quot;http://feeds.feedburner.com/2009/11/18/efl-things-becoming-public/&quot;&gt;last week post&lt;/a&gt; about companies supporting EFL, we were pleased with two more announcements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://edjy.wordpress.com/2009/11/19/ardy-arduino-efl-and-python/&quot;&gt;Ardy&lt;/a&gt;, a tool that brings together EFL and Arduino using Python&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.enlightenment.org/p.php?p=news/show&amp;l=en&amp;news_id=18&quot;&gt;Free.fr&lt;/a&gt;, the second biggest ISP in France opened up the development of their Freebox HD set-top box using Enlightenment Foundation Libraries and Mozilla JavaScript library. This is pretty amazing as it&amp;#8217;s the biggest deployment of EFL out there, an uncertain number that ranges from &lt;b&gt;2 to 3 million devices&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/GustavoSverzutBarbieri/~4/EjSxIbvoWx8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Gustavo Barbieri</name>
			<uri>http://blog.gustavobarbieri.com.br</uri>
		</author>
		<source>
			<title type="html">Gustavo Sverzut Barbieri</title>
			<subtitle type="html">a hacker analysis of life</subtitle>
			<link rel="self" href="http://blog.gustavobarbieri.com.br/feed/atom/"/>
			<id>http://blog.gustavobarbieri.com.br/feed/atom/</id>
			<updated>2010-03-12T23:44:21+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Developing a Wave Robot in Python</title>
		<link href="http://feedproxy.google.com/~r/PythonInScience/~3/eUcxueWYebE/dveloping-wave-robot.html"/>
		<id>tag:blogger.com,1999:blog-840127493134277990.post-4547637543559404172</id>
		<updated>2009-11-19T07:45:28+00:00</updated>
		<content type="html">I have been so busy lately that I almost forgot to write about my lightning venture into writing a Google Wave robot: Trendy.For those of you living under a rock in the last several months, Google Wave offers an API for the development of robot, which are... well, robots, which when added to waves, do automated tasks with its contents. There are robots for translating, do syntax highlighting on</content>
		<author>
			<name>Flavio Coelho</name>
			<email>noreply@blogger.com</email>
			<uri>http://pyinsci.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Python in Science</title>
			<subtitle type="html">Scientific adventures with Python.</subtitle>
			<link rel="self" href="http://pyinsci.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-840127493134277990</id>
			<updated>2010-03-22T11:44:21+00:00</updated>
		</source>
	</entry>

</feed>
