<?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.pythonbrasil.com.br/planet/atom.xml"/>
	<link href="http://www.pythonbrasil.com.br/planet/"/>
	<id>http://www.pythonbrasil.com.br/planet/atom.xml</id>
	<updated>2008-12-05T09:06:32+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="pt-br">
		<title type="html">Prospec&#231;&#245;es</title>
		<link href="http://techberto.wordpress.com/2008/12/04/prospeccoes/"/>
		<id>http://techberto.wordpress.com/?p=139</id>
		<updated>2008-12-04T16:29:06+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Talvez um teco influenciado pelo documento &amp;#8220;&lt;a href=&quot;http://www.sagres.org.br/biblioteca/metodologia.pdf&quot;&gt;Prospectiva Estrat&#233;gica, Metodologia de Descri&#231;&#227;o de Cen&#225;rios&lt;/a&gt;&amp;#8221; temperada a puro palpite vision&#225;rio, outro dia quando na piclistbr o Mak lan&#231;ou esta:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;1996 - um supercomputador usava 10 mil processadores Pentium Pro clocados a&lt;br /&gt;
200 MHz pra atingir 1 teraflops (um trilh&#227;o de opera&#231;&#245;es matem&#225;ticas por&lt;br /&gt;
segundo). ocupava um andar inteiro de um laborat&#243;rio no Novo M&#233;xico. Ele&lt;br /&gt;
consumia absurdos 500 kW e, pasme, mais 500 kW s&#243; de cooler, ar-condicionado&lt;br /&gt;
e tudo o mais para manter a sala geladinha e n&#227;o pifar a baga&#231;a.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;2008 - uma Radeon HD 4870, placa de video das mais r&#225;pidas atualmente,&lt;br /&gt;
atinge esse mesmo n&#250;mero de flops com apenas um chip. A placa de v&#237;deo da&lt;br /&gt;
AMD, assim como as outras dessa categoria, cabe num slotzinho PCI Express e&lt;br /&gt;
gasta 110 watts, o que j&#225; &#233; uma cavalice.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;2015 - tentem fazer uma proje&#231;&#227;o&amp;#8230;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;http://info.abril.com.br/blog/papodemicreiro/20081104_listar.shtml?125707&lt;/p&gt;
&lt;p&gt;E lancei o seguinte cen&#225;rio:&lt;/p&gt;
&lt;p&gt;2050: Life, the Universe and Everything:  q-bits e processamento de&lt;br /&gt;
chuckflops por segundo ser&#227;o triviais. Seth Lloyd e Miguel Nicolelis&lt;br /&gt;
ser&#227;o mais populares que Von Newman e Alan Turing. Haver&#225; dispositivos&lt;br /&gt;
computacionais com processamento de chuckflops do tamanho de um&lt;br /&gt;
alfinente  usados como implantes com baterias recarreg&#225;veis via&lt;br /&gt;
wireless. Todo boteco ter&#225; um recarregador wireless. Estes implantes&lt;br /&gt;
computacionais usar&#227;o o protocolo 802.11xyz para se conectar com a&lt;br /&gt;
spacenet, seja da Terra ou de Marte e a segunda l&#237;ngua mundial ser&#225; o&lt;br /&gt;
chin&#234;s. Via 802.11xyz q-telepatia ser&#225; algo muito comum; por&#233;m isto&lt;br /&gt;
ser&#225; coisas para os jovens, a galerinha de 80 e 90 anos ainda usar&#225;&lt;br /&gt;
menssegers baseado nos protocolos XMPP em seus handhelds.&lt;/p&gt;
&lt;p&gt;A plebe ainda usar&#225; estes dispositivos de 2015, com PCs digitais com&lt;br /&gt;
placas de v&#237;deo com meros 100 teraflops consumindo os exagerados 70&lt;br /&gt;
Watts, utilizando toda a arcaica tecnologia digital bin&#225;ria. Ainda&lt;br /&gt;
existir&#227;o analfabetos digitais e ONGs lutando contra a fome mundial,&lt;br /&gt;
isto em 2050.&lt;/p&gt;
&lt;p&gt;2100: Em 2100 os Estados Unidos eleger&#225; o primeiro presidente&lt;br /&gt;
marciano, descendente de terr&#225;queos chineses e brasileiros, que foram&lt;br /&gt;
para a col&#244;nia marciana em 2060, que se promoveu a base de q-telepatia.&lt;/p&gt;
&lt;p&gt;(&amp;#8230;)&lt;/p&gt;
&lt;p&gt;OK: Para justificar este minha prospec&#231;&#227;o eu teria que escrever um relat&#243;rio de mais de 100 p&#225;ginas, mas est&#225; a&#237; um cen&#225;rio fact&#237;vel, n&#227;o exatamente nestas datas e com esta terminologia, mas num futuro n&#227;o muito distante.&lt;/p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/techberto.wordpress.com/139/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/techberto.wordpress.com/139/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/techberto.wordpress.com/139/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/techberto.wordpress.com/139/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/techberto.wordpress.com/139/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/techberto.wordpress.com/139/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/techberto.wordpress.com/139/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/techberto.wordpress.com/139/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/techberto.wordpress.com/139/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/techberto.wordpress.com/139/&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;amp;blog=400569&amp;amp;post=139&amp;amp;subd=techberto&amp;amp;ref=&amp;amp;feed=1&quot; /&gt;&lt;/div&gt;
		<!--
		&lt;p&gt;&lt;a href=&quot;http://www.pyconbrasil.com.br&quot; 
		title=&quot;PyConBrasil 2008 - 18, 19 e 20 de setembro - Rio de Janeiro&quot;&gt;&lt;img
		src=&quot;http://pyconbrasil.com.br/sobre-o-evento/divulgue-a-pyconbrasil/full_rotativo.gif&quot;
		alt=&quot;PyConBrasil 2008 - Inscreva-se j&aacute;!&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
		-->

		</content>
		<author>
			<name>techberto</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Inno::Blog /* by Alberto Fabiano */</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>2008-12-05T09:05:30+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Ganhamos do MySpace</title>
		<link href="http://ramalho.org/?p=19"/>
		<id>http://ramalho.org/?p=19</id>
		<updated>2008-12-04T13:09:18+00:00</updated>
		<content type="html">&lt;p&gt;E perdemos do Google, como j&#225; imagin&#225;vamos. Estive ontem no coquetel do Pr&#234;mio Info 2008 e o resultado na categoria &amp;#8220;Personalidade do Ano&amp;#8221; ficou assim: 61% para Bruno Diniz do Google, 23% para Luciano Ramalho do Python Brasil e 16% para Edson Calegaretti do MySpace.&lt;/p&gt;
&lt;p&gt;Quero agrade&#231;er muito a todos os que votaram no meu nome e fizeram campanha. N&#227;o levamos o trof&#233;u mas fizemos bonito, porque o Google &#233; realmente uma marca quase imbat&#237;vel hoje.&lt;/p&gt;
&lt;p&gt;Nenhuma marca foi nomeada em tantas categorias, e o Google levou 10 das 13 que disputou. O poder da marca fez at&#233; o Picasa ganhar do Flickr. S&#243; o IPhone e o Firefox bateram concorrentes do Google (o Firefox em duas categorias).&lt;/p&gt;
&lt;p&gt;O Django, produto da comunidade Python, ficou em terceiro na categoria &amp;#8220;Desenvolvimento&amp;#8221;, atr&#225;s do Rails e do Adobe AIR. &lt;a href=&quot;http://info.abril.com.br/premioinfo/2008/&quot;&gt;[resultados completos]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;O mais importante &#233; que a gente teve as nomea&#231;&#245;es, ent&#227;o estamos de novo na revista (pags. 90 e 92 da edi&#231;&#227;o de dezembro), e vamos entrando no radar de mais leitores. E a nomea&#231;&#227;o me deu a oportunidade de estar l&#225; ontem &#224; noite, em nome da Associa&#231;&#227;o Python Brasil, trocando cart&#245;es de visita com empresas que podem patrocinar ou ajudar de outra forma em nossas a&#231;&#245;es. Tentamos aproveitar ao m&#225;ximo a oportunidade, porque tava claro que ganhar seria muito dif&#237;cil.&lt;/p&gt;
&lt;p&gt;Para a nossa comunidade, a melhor not&#237;cia da noite foi que a Sandra Carvalho, &lt;em&gt;publisher&lt;/em&gt; da Info, quer abrir um f&#243;rum permanente sobre Python no site da revista.&lt;/p&gt;
&lt;p&gt;Valeu pessoal, muito muito grato pela for&#231;a!
&lt;/p&gt;
		<!--
		&lt;p&gt;&lt;a href=&quot;http://www.pyconbrasil.com.br&quot; 
		title=&quot;PyConBrasil 2008 - 18, 19 e 20 de setembro - Rio de Janeiro&quot;&gt;&lt;img
		src=&quot;http://pyconbrasil.com.br/sobre-o-evento/divulgue-a-pyconbrasil/full_rotativo.gif&quot;
		alt=&quot;PyConBrasil 2008 - Inscreva-se j&aacute;!&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
		-->

		</content>
		<author>
			<name>luciano</name>
			<uri>http://ramalho.org</uri>
		</author>
		<source>
			<title type="html">Ramalho.org</title>
			<subtitle type="html">Blog do Luciano R, programador repentista</subtitle>
			<link rel="self" href="http://ramalho.org/?feed=atom"/>
			<id>http://ramalho.org/?feed=atom</id>
			<updated>2008-12-05T09:03:56+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry>
		<title type="html">H&#225; N&#227;o Muito Tempo...</title>
		<link href="http://pycappuccino.blogspot.com/2008/12/h-no-muito-tempo.html"/>
		<id>tag:blogger.com,1999:blog-3425970146544581445.post-6407052950315769027</id>
		<updated>2008-12-03T08:35:25+00:00</updated>
		<content type="html">&lt;div&gt;&lt;blockquote&gt;&lt;/blockquote&gt;C &#233; uma linguagem muito poderosa; dizem que um holand&#234;s a decifrou para os humanos.&lt;br /&gt;(rumores sobre Python)&lt;br /&gt;&lt;/div&gt;
		<!--
		&lt;p&gt;&lt;a href=&quot;http://www.pyconbrasil.com.br&quot; 
		title=&quot;PyConBrasil 2008 - 18, 19 e 20 de setembro - Rio de Janeiro&quot;&gt;&lt;img
		src=&quot;http://pyconbrasil.com.br/sobre-o-evento/divulgue-a-pyconbrasil/full_rotativo.gif&quot;
		alt=&quot;PyConBrasil 2008 - Inscreva-se j&aacute;!&quot; /&gt;&lt;/a&gt;&lt;/p&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">Tecnologia e Python 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>2008-12-05T09:02:24+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Python for Unix and Linux System Administration</title>
		<link href="http://claudiotorcato.wordpress.com/2008/12/02/python-for-unix-and-linux-system-administration/"/>
		<id>http://claudiotorcato.wordpress.com/2008/12/02/python-for-unix-and-linux-system-administration/</id>
		<updated>2008-12-02T03:43:15+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Estou lendo o livro &lt;b&gt;Python for Unix and Linux System Administration&lt;/b&gt; e estou gostando muito, por isso estou aqui escrevendo sobre ele.&lt;/p&gt;
&lt;p&gt;Este livro da editora O&amp;#8217;Reilly, escrito por Noah Gift e Jeremy M. Jones &#233; uma cole&#231;&#227;o de problemas-solu&#231;&#227;o em Python. Nele voc&#234; encontra de quase tudo. Seu lan&#231;amento recente (Agosto de 2008) contempla as novidades do Python 2.5, apesar de j&#225; estamos com Python 2.6 pronto para instalarmos em nossas m&#225;quinas.&lt;/p&gt;
&lt;p&gt;Ele est&#225; voltado para administradores de sistemas que precisam resolver problemas recorrentes e repetitivos e necessitam de uma ferramente &#225;gil e completa. Python pareceu ser a escolha adequada, apesar dos autores confessarem que a escolha ter sido bem subjetiva.&lt;/p&gt;
&lt;p&gt;Ao ler suas p&#225;ginas fica claro que&amp;nbsp; o material contido nele serve para todos os programadores. &#201; uma forma maravilhosa de conhecer bibliotecas e fun&#231;&#245;es nunca antes utilizadas por n&#243;s, ou descobrirmos novas formas de fazer as coisas com as que j&#225; conhec&#237;amos (eu descobri).&lt;/p&gt;
&lt;p&gt;Logicamente, tem coisas que s&#227;o quase exclusivamente para administradores de redes e nos deleitamos como tarefas complexas podem ser resolvidas em poucas linhas de c&#243;digo. Sinaliza tamb&#233;m o fato de que a vida de um administrador de redes j&#225; &#233; dura e n&#227;o precisa ficar pior. Desenvolver suas pr&#243;prias ferramentas em Python &#233; algo prazeroso.&lt;/p&gt;
&lt;p&gt;H&#225; um maravilhoso cap&#237;tulo chamado &lt;b&gt;Package Management&lt;/b&gt; explanando coisas como Setuptools e os Python Eggs, os ovos de cobra, os conhecidos arquivos de distribui&#231;&#227;o. S&#243; por este cap&#237;tulo eu compraria o livro.&lt;/p&gt;
&lt;p&gt;E tem mais. Sobre persist&#234;ncia de dados, temos o simples &lt;b&gt;shelve&lt;/b&gt;, o &lt;b&gt;ZODB&lt;/b&gt;, &lt;b&gt;SQLite&lt;/b&gt;, &lt;b&gt;Storm ORM&lt;/b&gt; e &lt;b&gt;SQLAlchemy&lt;/b&gt;. &#201; uma aula de atualidades do mundo Python.&lt;/p&gt;
&lt;p&gt;H&#225; coisas que j&#225; li a respeito mas n&#227;o me aprofundei, como, por exemplo, &lt;b&gt;Buildout&lt;/b&gt;, &lt;b&gt;Twisted&lt;/b&gt;, &lt;b&gt;Scapy&lt;/b&gt;, entre outros.&lt;/p&gt;
&lt;p&gt;Vou continuar lendo. Leitura recomendada.&lt;/p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/claudiotorcato.wordpress.com/271/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/claudiotorcato.wordpress.com/271/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/claudiotorcato.wordpress.com/271/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/claudiotorcato.wordpress.com/271/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/claudiotorcato.wordpress.com/271/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/claudiotorcato.wordpress.com/271/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/claudiotorcato.wordpress.com/271/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/claudiotorcato.wordpress.com/271/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/claudiotorcato.wordpress.com/271/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/claudiotorcato.wordpress.com/271/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=claudiotorcato.wordpress.com&amp;amp;blog=257944&amp;amp;post=271&amp;amp;subd=claudiotorcato&amp;amp;ref=&amp;amp;feed=1&quot; /&gt;&lt;/div&gt;
		<!--
		&lt;p&gt;&lt;a href=&quot;http://www.pyconbrasil.com.br&quot; 
		title=&quot;PyConBrasil 2008 - 18, 19 e 20 de setembro - Rio de Janeiro&quot;&gt;&lt;img
		src=&quot;http://pyconbrasil.com.br/sobre-o-evento/divulgue-a-pyconbrasil/full_rotativo.gif&quot;
		alt=&quot;PyConBrasil 2008 - Inscreva-se j&aacute;!&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
		-->

		</content>
		<author>
			<name>claudiotorcato</name>
			<uri>http://claudiotorcato.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Mosaico Livre &#187; python</title>
			<subtitle type="html">Blog guiado pelo meu temperamento, meus hobbies e o que me atrai no momento</subtitle>
			<link rel="self" href="http://claudiotorcato.wordpress.com/category/python/feed/atom/"/>
			<id>http://claudiotorcato.wordpress.com/feed/atom/</id>
			<updated>2008-12-05T09:00:26+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Desenho de &#225;rvore bin&#225;ria em Python</title>
		<link href="http://juracy.wordpress.com/2008/11/30/desenho-de-arvore-binaria-em-python/"/>
		<id>http://juracy.wordpress.com/?p=32</id>
		<updated>2008-11-30T22:42:48+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Como comentei no post anterior estou fazendo faculdade, o que sugou bastante o meu tempo. Na faculdade desenvolvi alguns pequenos projetos (sozinho ou em equipe), e realizei alguns trabalhos, vou tentar publica-los aqui aos poucos.&lt;/p&gt;
&lt;p&gt;Na mat&#233;ria de &lt;strong&gt;Estrutura de Dados&lt;/strong&gt; o professor aceitou que os exerc&#237;cios fossem feitos na linguagem que o aluno quisesse, a limita&#231;&#227;o era apenas a capacidade dele de entender a l&#243;gica (&lt;em&gt;talvez ele n&#227;o tivesse aceito em linguagens funcionais por exemplo&lt;/em&gt;). E &#233; claro, j&#225; que eu podia escolher, escolhi &lt;strong&gt;Python&lt;/strong&gt; &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Recentemente desenvolvemos uma &#225;rvore bin&#225;ria e apesar de n&#227;o solicitado desenvolvi tamb&#233;m uma representa&#231;&#227;o gr&#225;fica da mesma, assim ficaria mais f&#225;cil depura-la. Achei o resultado suficiente interessante para compartilhar com voc&#234;s, espero que gostem.&lt;/p&gt;
&lt;p&gt;O c&#243;digo &#233; um pouco extenso para publicar no corpo do post ent&#227;o coloco aqui os links para download, por&#233;m o wordpress n&#227;o suporta arquivos .py, ent&#227;o converti-os para PDF (se algu&#233;m tiver sugest&#245;es de como melhorar este processo aceito dicas). At&#233; a pr&#243;xima.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://juracy.files.wordpress.com/2008/11/arvore_binariapy.pdf&quot;&gt;arvore_binaria.py&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://juracy.files.wordpress.com/2008/11/arvore_drawpy.pdf&quot;&gt;arvore_draw.py&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
Posted in Python&amp;nbsp;&amp;nbsp;&amp;nbsp;Tagged: Python&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/juracy.wordpress.com/32/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/juracy.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/juracy.wordpress.com/32/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/juracy.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/juracy.wordpress.com/32/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/juracy.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/juracy.wordpress.com/32/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/juracy.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/juracy.wordpress.com/32/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/juracy.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=juracy.wordpress.com&amp;amp;blog=347154&amp;amp;post=32&amp;amp;subd=juracy&amp;amp;ref=&amp;amp;feed=1&quot; /&gt;&lt;/div&gt;
		<!--
		&lt;p&gt;&lt;a href=&quot;http://www.pyconbrasil.com.br&quot; 
		title=&quot;PyConBrasil 2008 - 18, 19 e 20 de setembro - Rio de Janeiro&quot;&gt;&lt;img
		src=&quot;http://pyconbrasil.com.br/sobre-o-evento/divulgue-a-pyconbrasil/full_rotativo.gif&quot;
		alt=&quot;PyConBrasil 2008 - Inscreva-se j&aacute;!&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
		-->

		</content>
		<author>
			<name>juracy</name>
			<uri>http://juracy.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Juracy Filho - Simplesmente eu &#187; Python</title>
			<subtitle type="html">Meus gostos, id&#233;ias, pesquisas, tecnologias que escolho, utilizo e recomendo. Simplesmente eu !</subtitle>
			<link rel="self" href="http://juracy.wordpress.com/tag/python/feed/atom/"/>
			<id>http://juracy.wordpress.com/feed/atom/</id>
			<updated>2008-12-05T09:02:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Introdu&#231;&#227;o &#224; pyglet</title>
		<link href="http://fazerjogos.org/?p=107"/>
		<id>http://fazerjogos.org/?p=107</id>
		<updated>2008-11-29T04:45:31+00:00</updated>
		<content type="html">&lt;p&gt;Se voc&#234; j&#225; tentou ou foi atr&#225;s de m&#243;dulos para programar jogos em python, provavelmente j&#225; se deparou com a conhecida &lt;a href=&quot;http://www.pygame.org/&quot;&gt;pygame&lt;/a&gt;. O projeto come&#231;ou a ser desenvolvido em 2000 e j&#225; tem um nome muito forte e associado ao desenvolvimento de jogos em Python. No entanto, existe uma alternativa bem menos conhecida que eu acho muito interessante. Essa alternativa &#233; a &lt;a href=&quot;http://www.pyglet.org/&quot;&gt;pyglet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nesse post vou mostrar a pyglet atrav&#233;s de um tutorial simples. Para acompanhar melhor o tutorial, sugiro a familiariza&#231;&#227;o com o conceito de &lt;a href=&quot;http://pt.wikipedia.org/wiki/Programa&#231;&#227;o_orientada_a_eventos&quot;&gt;programa&#231;&#227;o orientada a eventos&lt;/a&gt;. Tamb&#233;m &#233; importante saber python e orienta&#231;&#227;o a objetos em python.&lt;/p&gt;
&lt;h3&gt;&lt;span id=&quot;more-107&quot;&gt;&lt;/span&gt;Uma Vis&#227;o Geral&lt;/h3&gt;
&lt;p&gt;A pyglet &#233; uma biblioteca multim&#237;dia multiplataforma. Ela consegue carregar e exibir imagens, abrir e tocar sons e at&#233; mesmo passar v&#237;deos. Ela tamb&#233;m tem uma s&#233;rie de classes e fun&#231;&#245;es &#250;teis para cria&#231;&#227;o de jogos, como sprites e fun&#231;&#245;es de gerenciamento de tempo, uma s&#233;rie de m&#243;dulos de renderiza&#231;&#227;o de texto bastante avan&#231;ados e um sistema de eventos elegante e f&#225;cil de extender.&lt;/p&gt;
&lt;p&gt;Se voc&#234; n&#227;o tem problemas com ingl&#234;s eu recomendo fortemente a leitura do &lt;a href=&quot;http://www.pyglet.org/doc/programming_guide/index.html&quot;&gt;guia de programa&#231;&#227;o&lt;/a&gt; e uma olhada pela &lt;a href=&quot;http://www.pyglet.org/doc/api/index.html&quot;&gt;documenta&#231;&#227;o da API&lt;/a&gt; da pyglet para ter uma id&#233;ia melhor do que ela &#233; capaz.&lt;/p&gt;
&lt;h3&gt;Sua Primeira Aplica&#231;&#227;o Pyglet&lt;/h3&gt;
&lt;p&gt;A menor aplica&#231;&#227;o poss&#237;vel escrita com a pyglet tem apenas 3 linhas.&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;python python&quot;&gt;&lt;span&gt;import&lt;/span&gt; pyglet
window = pyglet.&lt;span&gt;window&lt;/span&gt;.&lt;span&gt;Window&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
pyglet.&lt;span&gt;app&lt;/span&gt;.&lt;span&gt;run&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Bem simples, n&#227;o? Primeiro importamos o m&#243;dulo da pyglet, depois criamos uma janela. Essa janela exibir&#225; as coisas que iremos desenhar e tamb&#233;m responder&#225; a eventos de mouse e teclado quando estiver em foco. A &#250;ltima chamada, inicia um la&#231;o de processamento de eventos.&#160;&lt;/p&gt;
&lt;p&gt;Bom, essas 3 linhas s&#227;o simples, mas n&#227;o fazem l&#225; muitas coisas &#250;teis. O m&#225;ximo que voc&#234; vai conseguir &#233; fechar sua janela apertando &amp;lt;Esc&amp;gt; ou clicando no bot&#227;o de fechar, caso seu gerenciador de janelas mostre um. Al&#233;m disso, dependendo de onde voc&#234; estiver executando esse script, pode ser que a sua janela exiba um padr&#227;o meio aleat&#243;rio de pixels. Isso acontece porque ela est&#225; despejando o conte&#250;do de sua mem&#243;ria de v&#237;deo diretamente (n&#227;o &#233; &lt;em&gt;exatamente&lt;/em&gt;&#160;isso que acontece, mas n&#227;o conv&#233;m entrar em detalhes aqui).&lt;/p&gt;
&lt;p&gt;Para mudar um pouco esse cen&#225;rio e fazer com que nossa aplica&#231;&#227;o fa&#231;a algo &#250;til, vamos entender como os eventos da pyglet funcionam.&lt;/p&gt;
&lt;h3&gt;Eventos na Pyglet&lt;/h3&gt;
&lt;p&gt;Como eu mencionei, a chamada a pyglet.app.run inicia um la&#231;o de tratamento de eventos. Na pyglet existe uma classe para a gera&#231;&#227;o de eventos chamada &lt;a href=&quot;http://www.pyglet.org/doc/api/pyglet.event.EventDispatcher-class.html&quot;&gt;EventDispatcher&lt;/a&gt;. Todas as classes que geram eventos derivam da EventDispatcher. Por conven&#231;&#227;o, os eventos gerados por um dispatcher se chamam on_&amp;lt;alguma coisa&amp;gt;, por exemplo on_draw ou on_key_release.&lt;/p&gt;
&lt;p&gt;Para tratar eventos gerados por um dispatcher precisamos de event handlers. N&#227;o existe uma classe espec&#237;fica para handlers, eles podem ser qualquer objeto ou fun&#231;&#227;o python desde que sejam conectados ao dispatcher da maneira adequada.&#160;Existem v&#225;rias maneiras de conectar um handler a um dispatcher. &#201; mais f&#225;cil mostrar atrav&#233;s de um exemplo:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;python python&quot;&gt;&lt;span&gt;# A classe window da pyglet &#233; um EventDispatcher&lt;/span&gt;
window = pyglet.&lt;span&gt;window&lt;/span&gt;.&lt;span&gt;Window&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;# Cada vez que o conte&#250;do da janela precisa ser redesenhado, um evento&lt;/span&gt;
&lt;span&gt;# on_draw &#233; gerado. Podemos trat&#225;-lo usando o evento como uma&lt;/span&gt;
&lt;span&gt;# propriedade do objeto&lt;/span&gt;
&lt;span&gt;def&lt;/span&gt; my_draw&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;:
    &lt;span&gt;print&lt;/span&gt; &lt;span&gt;&amp;quot;desenhando a janela&amp;quot;&lt;/span&gt;
window.&lt;span&gt;on_draw&lt;/span&gt; = my_draw
&amp;nbsp;
&lt;span&gt;# Inst&#226;ncias de EventDispatcher possuem um decorador event para&lt;/span&gt;
&lt;span&gt;# conectar eventos a eles&lt;/span&gt;
@window.&lt;span&gt;event&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'on_draw'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;def&lt;/span&gt; my_draw&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;:
    &lt;span&gt;print&lt;/span&gt; &lt;span&gt;&amp;quot;desenhando a janela&amp;quot;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;# Se a fun&#231;&#227;o python tem o mesmo nome do evento tratado, basta usar&lt;/span&gt;
@window.&lt;span&gt;event&lt;/span&gt;
&lt;span&gt;def&lt;/span&gt; on_draw&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;:
    &lt;span&gt;print&lt;/span&gt; &lt;span&gt;&amp;quot;desenhando a janela&amp;quot;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;# O m&#233;todo push_handlers de um dispatcher tamb&#233;m pode ser usado&lt;/span&gt;
&lt;span&gt;# passando uma fun&#231;&#227;o...&lt;/span&gt;
window.&lt;span&gt;push_handlers&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;on_draw=my_draw&lt;span&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;# ... ou um objeto com m&#233;todos com o mesmo nome dos eventos a&lt;/span&gt;
&lt;span&gt;# serem tratados&lt;/span&gt;
&lt;span&gt;class&lt;/span&gt; MyClass&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;:
    &lt;span&gt;def&lt;/span&gt; on_draw&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;:
        &lt;span&gt;print&lt;/span&gt; &lt;span&gt;&amp;quot;desenhando a janela a partir do objeto &amp;quot;&lt;/span&gt;, &lt;span&gt;self&lt;/span&gt;
&amp;nbsp;
obj = MyClass&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
window.&lt;span&gt;push_handlers&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;obj&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Uma outra forma ainda, n&#227;o mostrada no exemplo acima, &#233; fazer uma classe herdando de um EventDispatcher e sobrescrevendo os m&#233;todos correspondente aos eventos. Bom, existem muitos jeitos de fazer e cada um deles vai ser mais adequado dependendo da arquitetura da sua aplica&#231;&#227;o e de como voc&#234; acha mais intuitivo. Agora seguindo em frente com a pyglet&amp;#8230;&lt;/p&gt;
&lt;h3&gt;Uma aplica&#231;&#227;o mais interessante&lt;/h3&gt;
&lt;p&gt;Agora que j&#225; sabemos como come&#231;ar uma aplica&#231;&#227;o pyglet e como tratar eventos, vamos come&#231;ar a botar isso para algum uso construindo uma aplica&#231;&#227;o um pouco mais interessante. A pyglet pode ser usada pra v&#225;rios tipos de aplica&#231;&#227;o, mas como esse &#233; um blog sobre fazer jogos a nossa aplica&#231;&#227;o de exemplo ser&#225; uma base para um pequeno jogo. Para seguir em frente, voc&#234; pode adicionar os trechos de c&#243;digo aqui descritos logo ap&#243;s a cria&#231;&#227;o do objeto window (ou logo antes da chamada pyglet.app.run()) na nossa aplica&#231;&#227;o minimalista.&lt;/p&gt;
&lt;p&gt;A id&#233;ia &#233; bem simples: carregar uma imagem para ser nosso personagem e mov&#234;-lo pela tela usando o teclado. A imagem que eu vou usar &#233; realmente simples. Voc&#234; pode usar outra se quiser. Aqui est&#225; ela:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-111&quot; title=&quot;char&quot; src=&quot;http://fazerjogos.org/wp-content/uploads/2008/11/char.png&quot; alt=&quot;&quot; width=&quot;31&quot; height=&quot;31&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Na pyglet carregamos arquivos de m&#237;dia atrav&#233;s do m&#243;dulo &lt;a href=&quot;http://www.pyglet.org/doc/api/toc-pyglet.resource-module.html&quot;&gt;pyglet.resource&lt;/a&gt;. Esse m&#243;dulo tem fun&#231;&#245;es para carregar v&#225;rios tipos de arquivo. Al&#233;m disso tamb&#233;m &#233; poss&#237;vel adicionar diret&#243;rios onde os arquivos ser&#227;o procurados para serem carregados. Por padr&#227;o, os caminhos s&#227;o relativos ao diret&#243;rio onde o script python se encontra. Para carregar a imagem do nosso personagem, fazemos o seguinte:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;python python&quot;&gt;image = pyglet.&lt;span&gt;resource&lt;/span&gt;.&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'char.png'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Essa imagem carregada possui um ponto de &#226;ncora definido pelas propriedades anchor_x e anchor_y do objeto image. Quando vamos desenhar uma imagem em uma posi&#231;&#227;o x, y &#233; esse ponto de &#226;ncora que &#233; posicionado na posi&#231;&#227;o indicada. Por padr&#227;o o ponto de &#226;ncora &#233; o canto inferior esquerdo da imagem. No caso do nosso personagem, parece mais interessante posicion&#225;-lo a partir do seu centro, ent&#227;o mudaremos o ponto de &#226;ncora para o centro da imagem:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;python python&quot;&gt;image.&lt;span&gt;anchor_x&lt;/span&gt; = image.&lt;span&gt;width&lt;/span&gt; // &lt;span&gt;2&lt;/span&gt;
image.&lt;span&gt;anchor_y&lt;/span&gt; = image.&lt;span&gt;height&lt;/span&gt; // &lt;span&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Apesar de n&#243;s podermos desenhar diretamente nossa imagem na tela com o m&#233;todo blit(x, y), iremos criar um objeto Sprite com a nossa imagem, que j&#225; encapsula uma s&#233;rie de propriedades muito &#250;teis para um objeto de jogo como posi&#231;&#227;o, rota&#231;&#227;o e escala.&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;python python&quot;&gt;sprite = pyglet.&lt;span&gt;sprite&lt;/span&gt;.&lt;span&gt;Sprite&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;image, x=&lt;span&gt;320&lt;/span&gt;, y=&lt;span&gt;240&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Os par&#226;metros x e y s&#227;o opcionais e s&#227;o apenas os valores iniciais x e y da posi&#231;&#227;o do sprite. Depois de criar o nosso objeto sprite vamos tratar o evento on_draw da nossa janela para desenh&#225;-lo. Al&#233;m de desenhar o sprite, tamb&#233;m chamamos o m&#233;todo window.clear() para limpar o conte&#250;do da nossa janela a cada frame.&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;python python&quot;&gt;@window.&lt;span&gt;event&lt;/span&gt;
&lt;span&gt;def&lt;/span&gt; on_draw&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;:
    window.&lt;span&gt;clear&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
    sprite.&lt;span&gt;draw&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Como voc&#234; pode ver, &#233; muito f&#225;cil desenhar um sprite. Agora vamos aprender como tratar eventos de teclado para mov&#234;-lo pela tela conforme apertamos as teclas de seta.&lt;/p&gt;
&lt;h4&gt;Eventos de Teclado&lt;/h4&gt;
&lt;p&gt;A classe window gera eventos on_key_press e on_key_release cada vez que uma tecla do teclado &#233; pressionada ou solta. Um pouco diferente do evento on_draw, esses eventos tamb&#233;m enviam par&#226;metros para seus handlers. Nesse caso, os par&#226;metros enviados s&#227;o um valor correspondente &#224; tecla pressionada que gerou o evento e os modificadores ativos naquele momento. Os modificadores s&#227;o referentes &#224;s teclas Shift, Alt ou Ctrl estarem pressionadas ou n&#227;o.&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;python python&quot;&gt;@window.&lt;span&gt;event&lt;/span&gt;
&lt;span&gt;def&lt;/span&gt; on_key_release&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;symbol&lt;/span&gt;, modifiers&lt;span&gt;&amp;#41;&lt;/span&gt;:
    &lt;span&gt;print&lt;/span&gt; &lt;span&gt;symbol&lt;/span&gt;, modifiers&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Com o handler acima voc&#234; pode ver quais valores est&#227;o sendo recebidos cada vez que voc&#234; solta uma tecla do teclado. Se voc&#234; colocar executar o c&#243;digo com esse handler vai perceber que s&#227;o valores num&#233;ricos inteiros. Felizmente, voc&#234; n&#227;o precisa decorar o valor de cada tecla. A pyglet tem constantes com nomes intuitivos para os valores recebidos. Elas est&#227;o no m&#243;dulo pyglet.window.key. Como esse m&#243;dulo &#233; bastante usado no tratamento de eventos de teclado, &#233; conveniente import&#225;-lo no in&#237;cio do seu programa com um&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;python python&quot;&gt;&lt;span&gt;from&lt;/span&gt; pyglet.&lt;span&gt;window&lt;/span&gt; &lt;span&gt;import&lt;/span&gt; key&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Agora, supondo que voc&#234; colocou o import acima no seu c&#243;digo, vamos escrever um handler de teclado mais interessante:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;python python&quot;&gt;@window.&lt;span&gt;event&lt;/span&gt;
&lt;span&gt;def&lt;/span&gt; on_key_release&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;symbol&lt;/span&gt;, modifiers&lt;span&gt;&amp;#41;&lt;/span&gt;:
    &lt;span&gt;if&lt;/span&gt; &lt;span&gt;symbol&lt;/span&gt; == key.&lt;span&gt;UP&lt;/span&gt;:
        &lt;span&gt;print&lt;/span&gt; &lt;span&gt;&amp;quot;Mover o sprite para cima&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Imagino que n&#227;o seja dif&#237;cil prever o que vai acontecer aqui. Quando voc&#234; pressionar a tecla da seta para cima no teclado a mensagem &amp;#8216;Mover o sprite para cima&amp;#8217; ser&#225; exibida. Como esse era para ser apenas um exemplo bobo de como usar as constantes do m&#243;dulo key eu lhe poupei de mensagens semelhantes para as constantes das outras setas.&lt;/p&gt;
&lt;h4&gt;Movendo o Sprite&lt;/h4&gt;
&lt;p&gt;Mover o sprite efetivamente n&#227;o tem nenhum mist&#233;rio tamb&#233;m. Como eu disse antes um Sprite encapsula uma s&#233;rie de propriedades &#250;teis como posi&#231;&#227;o, rota&#231;&#227;o e escala. Um jeito de mudar a posi&#231;&#227;o de um sprite &#233; acessando seus atributos x e y. Vamos ver como fica isso no contexto do nosso handler de teclado:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;python python&quot;&gt;@window.&lt;span&gt;event&lt;/span&gt;
&lt;span&gt;def&lt;/span&gt; on_key_release&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;symbol&lt;/span&gt;, modifiers&lt;span&gt;&amp;#41;&lt;/span&gt;:
    &lt;span&gt;if&lt;/span&gt; &lt;span&gt;symbol&lt;/span&gt; == key.&lt;span&gt;UP&lt;/span&gt;:
        sprite.&lt;span&gt;y&lt;/span&gt; += &lt;span&gt;32&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Agora a nossa mensagem boba foi substitu&#237;da por um c&#243;digo que faz o que a mensagem dizia anteriormente: move o sprite para cima. Esse &#233; um bom momento para mencionar que a pyglet convenciona que o eixo x positivo fica &#224; direita da origem, o y positivo fica acima da origem e a origem fica no canto inferior esquerdo da tela. Essa conven&#231;&#227;o de x &#233; bem comum, mas frequentemente vemos uma conven&#231;&#227;o y trocada. Na pygame, por exemplo, o y cresce para baixo e a origem fica no canto &lt;em&gt;superior&lt;/em&gt;&#160;esquerdo da tela.&lt;/p&gt;
&lt;p&gt;Completar o c&#243;digo acima com movimentos para as outras dire&#231;&#245;es &#233; bastante simples, mas voc&#234; pode tamb&#233;m baixar o &lt;a href=&quot;http://fazerjogos.org/wp-content/uploads/2008/11/walking_char.zip&quot;&gt;c&#243;digo completo do exemplo, junto com a imagem utilizada&lt;/a&gt; e ver como fazer.&lt;/p&gt;
&lt;h3&gt;Conclus&#227;o&lt;/h3&gt;
&lt;p&gt;Nesse post criamos uma aplica&#231;&#227;o muito simples usando a pyglet, mas que poderia servir como base para algo mais sofisticado. V&#225;rias melhorias e altera&#231;&#245;es poderiam ser feitas, por exemplo, no c&#243;digo acima nosso personagem se move apenas cada vez que uma tecla &#233; solta e sempre faz um movimento de 32 pixels por vez. Esse tipo de movimento pode ser apropriado para alguns tipos de jogos, j&#225; outros exigiriam um movimento mais suave e cont&#237;nuo e que fosse realizada durante todo o tempo em que as setas est&#227;o pressionadas.&lt;/p&gt;
&lt;p&gt;Como esse post j&#225; ficou muito longo vou ficando por aqui, mas esse tutorial foi pensado como parte de uma s&#233;rie, ent&#227;o em breve essas melhorias ser&#227;o descritas aqui conforme outros t&#243;picos s&#227;o abordados.&lt;/p&gt;
		<!--
		&lt;p&gt;&lt;a href=&quot;http://www.pyconbrasil.com.br&quot; 
		title=&quot;PyConBrasil 2008 - 18, 19 e 20 de setembro - Rio de Janeiro&quot;&gt;&lt;img
		src=&quot;http://pyconbrasil.com.br/sobre-o-evento/divulgue-a-pyconbrasil/full_rotativo.gif&quot;
		alt=&quot;PyConBrasil 2008 - Inscreva-se j&aacute;!&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
		-->

		</content>
		<author>
			<name>Kao F&#233;lix</name>
			<uri>http://fazerjogos.org</uri>
		</author>
		<source>
			<title type="html">Fazer Jogos</title>
			<subtitle type="html">jogos, python, software livre e tudo mais</subtitle>
			<link rel="self" href="http://fazerjogos.org/?feed=atom"/>
			<id>http://fazerjogos.org/?feed=atom</id>
			<updated>2008-12-05T09:05:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">O mist&#233;rio do teclado sem &amp;#8220;?&amp;#8221;</title>
		<link href="http://ramalho.org/?p=18"/>
		<id>http://ramalho.org/?p=18</id>
		<updated>2008-11-26T22:04:54+00:00</updated>
		<content type="html">&lt;p&gt;Outro dia eu li na Info que um modelo de notebook Vaio lan&#231;ado no Brasil n&#227;o tem o ponto de interroga&#231;&#227;o no teclado. Achei &lt;strong&gt;bizarro&lt;/strong&gt; e fui conferir na Fnac. Fiquei abismado ao constatar que os notebooks novos da Sony, STI e outros fabricantes est&#227;o saindo com teclados &lt;strong&gt;supostamente&lt;/strong&gt; &amp;#8220;padr&#227;o ABNT-2&amp;#8243; que t&#234;m o &amp;#8220;&#199;&amp;#8221; mas n&#227;o t&#234;m a tecla com os caracteres &amp;#8220;?&amp;#8221; e &amp;#8220;/&amp;#8221;. Curiosamente, a tecla do &amp;#8220;\&amp;#8221; e do &amp;#8220;|&amp;#8221; foi mantida. &lt;a title=&quot;Foto de um teclado sem tecla ?&quot; href=&quot;http://ramalho.org/imagens/e-max.jpg&quot;&gt;Veja a foto&lt;/a&gt; de um teclado deste tipo.&lt;/p&gt;
&lt;p&gt;Nesses notebooks, para digitar um ponto de interroga&#231;&#227;o ou uma barra normal &#233; preciso usar uma combina&#231;&#227;o com a tecla &lt;strong&gt;AltGr&lt;/strong&gt;. Por exemplo, &amp;#8220;?&amp;#8221; &#233; &lt;strong&gt;AltGr+W&lt;/strong&gt;. Mas a contrabarra est&#225; l&#225;, com sua pr&#243;pria tecla, e basta um &lt;strong&gt;Shift&lt;/strong&gt; para produzir o &lt;em&gt;pipe&lt;/em&gt;, s&#237;mbolo que s&#243; interessa para programadores. Pena que como programador eu fa&#231;o mais divis&#245;es que &lt;strong&gt;disjun&#231;&#245;es de bits&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Este teclado n&#227;o &#233; para mim. Pensando bem, acho que &lt;strong&gt;minha m&#227;e&lt;/strong&gt; tamb&#233;m usa mais a barra e a interroga&#231;&#227;o que a contrabarra e o &lt;em&gt;pipe&lt;/em&gt;. Para quem ser&#225; que este padr&#227;o de teclado foi feito?&lt;/p&gt;
&lt;p&gt;Fiquei muito interessado em descobrir como &#233; que v&#225;rios fabricantes de notebooks foram levados a tomar esta decis&#227;o. Ser&#225; que foi uma norma t&#233;cnica publicada no &lt;strong&gt;primeiro de abril&lt;/strong&gt;?&lt;/p&gt;
&lt;p&gt;Se voc&#234; sabe alguma coisa sobre os bastidores desta hist&#243;ria, por gentileza, deixe o seu coment&#225;rio contando. Ou, se voc&#234; acha muito mais &#250;til a tecla &amp;#8220;\|&amp;#8221; do que a &amp;#8220;/?&amp;#8221;, ent&#227;o me conte &lt;strong&gt;o que voc&#234; faz&lt;/strong&gt; com o seu computador.&lt;/p&gt;
&lt;p&gt;Vou continuar investigando e quando tiver novidades, colocarei aqui. Conto com voc&#234; para esclarecer este mist&#233;rio!
&lt;/p&gt;
		<!--
		&lt;p&gt;&lt;a href=&quot;http://www.pyconbrasil.com.br&quot; 
		title=&quot;PyConBrasil 2008 - 18, 19 e 20 de setembro - Rio de Janeiro&quot;&gt;&lt;img
		src=&quot;http://pyconbrasil.com.br/sobre-o-evento/divulgue-a-pyconbrasil/full_rotativo.gif&quot;
		alt=&quot;PyConBrasil 2008 - Inscreva-se j&aacute;!&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
		-->

		</content>
		<author>
			<name>luciano</name>
			<uri>http://ramalho.org</uri>
		</author>
		<source>
			<title type="html">Ramalho.org</title>
			<subtitle type="html">Blog do Luciano R, programador repentista</subtitle>
			<link rel="self" href="http://ramalho.org/?feed=atom"/>
			<id>http://ramalho.org/?feed=atom</id>
			<updated>2008-12-05T09:03:56+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="pt-BR">
		<title type="html">Atualiza&#231;&#245;es no Mundo Python</title>
		<link href="http://devlog.waltercruz.com/atualizacoes-no-mundo-python"/>
		<id>http://devlog.waltercruz.com/atualizacoes-no-mundo-python</id>
		<updated>2008-11-26T13:54:36+00:00</updated>
		<content type="html">&lt;p&gt;Os &#250;ltimos dias foram cheios de atualiza&#231;&#245;es para os pythonistas &lt;img src=&quot;http://devlog.waltercruz.com/rsc/smilies/pidgin/smile.gif&quot; alt=&quot;&amp;#58;&amp;#41;&quot; class=&quot;middle&quot; /&gt; . Devido a um problema no empacotamento, 3 dias ap&#243;s o lan&#231;amento do Django 1.0.1, foi lan&#231;ado o 1.0.2. Para quem usa o Google AppEngine, problema semelhante aconteceu: 3 dias ap&#243;s o lan&#231;amento do 1.1.6, saiu o 1.1.7 para corrigir &lt;a href=&quot;http://code.google.com/p/googleappengine/wiki/SdkReleaseNotes&quot;&gt;bugs de &#250;ltima hora&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O Pylons se aproxima da vers&#227;o 0.97 final, no &#250;ltima dia 24 saiu o Release Candidate 4, que eles esperam ser o &#250;ltimo. A documenta&#231;&#227;o atualizada voc&#234; pode ver em &lt;a href=&quot;http://docs.pylonshq.com/&quot;&gt;http://docs.pylonshq.com/&lt;/a&gt; ou baixar em &lt;a href=&quot;http://pylonshq.com/download/0.9.7/Pylons.pdf&quot;&gt;PDF&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O &lt;a href=&quot;http://techspot.zzzeek.org/&quot;&gt;Michael Bayer&lt;/a&gt; (SQLAlchemy, Mako), ap&#243;s usar o Beaker (middleware WSGI de Cache e Sess&#227;o) em produ&#231;&#227;o, corrigiu muitos bugs nos caches em arquivo e memcached. Eu enviei um patch min&#250;sculo que fez com que ele voltasse a funcionar com o Google AppEngine e tudo isso j&#225; est&#225; dispon&#237;vel na vers&#227;o &lt;a href=&quot;http://pypi.python.org/pypi/Beaker/1.1.2&quot;&gt;1.1.2&lt;/a&gt;. Outro projeto que agora funciona melhor com o Google AppEngine &#233; o FormEncode. A vers&#227;o 1.1 tinha introduzido um pequeno problema com o Google AppEngine, que foi corrigido no &lt;a href=&quot;http://pypi.python.org/pypi/FormEncode/1.2&quot;&gt;FormEncode 1.2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao colaborar com a tradu&#231;&#227;o da documenta&#231;&#227;o do Django para portugu&#234;s, descobri um problema com o CSS, que depois acabou se revelando um &lt;a href=&quot;http://code.djangoproject.com/ticket/9645&quot;&gt;problema com a dupla docutils + Sphinx&lt;/a&gt;. Enquanto o bug era testado, saiu uma nova vers&#227;o, o &lt;a href=&quot;http://sphinx.pocoo.org/changes.html#release-0-5-nov-23-2008-birthday-release&quot;&gt;Sphinx 0.5&lt;/a&gt;. O Sphinx se tornou muito popular na gera&#231;&#227;o de documenta&#231;&#227;o para projetos Python (a documenta&#231;&#227;o do Pylons que eu citei agora a pouco &#233; gerada com Sphinx).&lt;/p&gt;

&lt;p&gt;&#201; isso, hora de atualizar os virtualenvs da vida &lt;img src=&quot;http://devlog.waltercruz.com/rsc/smilies/pidgin/smile.gif&quot; alt=&quot;&amp;#58;&amp;#41;&quot; class=&quot;middle&quot; /&gt;&lt;/p&gt;
		<!--
		&lt;p&gt;&lt;a href=&quot;http://www.pyconbrasil.com.br&quot; 
		title=&quot;PyConBrasil 2008 - 18, 19 e 20 de setembro - Rio de Janeiro&quot;&gt;&lt;img
		src=&quot;http://pyconbrasil.com.br/sobre-o-evento/divulgue-a-pyconbrasil/full_rotativo.gif&quot;
		alt=&quot;PyConBrasil 2008 - Inscreva-se j&aacute;!&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
		-->

		</content>
		<author>
			<name>Walter Cruz</name>
			<uri>http://devlog.waltercruz.com/</uri>
		</author>
		<source>
			<title type="html">devlog - Categoria: Python</title>
			<subtitle type="html">Desenvolvimento, software livre e intrigas</subtitle>
			<link rel="self" href="http://devlog.waltercruz.com/python.rss"/>
			<id>http://devlog.waltercruz.com/?tempskin=_atom</id>
			<updated>2008-12-05T09:01:10+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Eu vou ao 1&#186; Encontro de TI da Arteccom</title>
		<link href="http://feeds.feedburner.com/~r/Fechatag/~3/465390311/"/>
		<id>http://blog.elcio.com.br/eu-vou-ao-1%c2%ba-encontro-de-ti-da-arteccom/</id>
		<updated>2008-11-25T19:54:48+00:00</updated>
		<content type="html">&lt;p&gt;A Editora Arteccom est&#225; organizando o I ETI. Eu vou estar l&#225;, e recomendo, parece que vai ser muito interessante. Recebi deles o seguinte release:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;font&gt;&lt;strong&gt;&#201; tempo de interatividade  e o 1&#186; Encontro de TI faz tudo o que o p&#250;blico deseja!&lt;/strong&gt;&lt;br /&gt;
A editora Arteccom promove novo evento que promete agitar o mercado  dos desenvolvedores web.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font&gt;Sabe aquele evento que voc&#234;  sempre sonhou? Com as palestras que voc&#234; sempre quis assistir? Virou  realidade! A Arteccom fez uma pesquisa com desenvolvedores web para  que fossem sugeridos temas e palestrantes para o evento. 512 profissionais  da &#225;rea de TI responderam a pesquisa e, mais tarde, com expressiva  participa&#231;&#227;o do p&#250;blico no site&lt;/font&gt;&lt;font color=&quot;#1f497d&quot;&gt; &lt;/font&gt;&lt;a href=&quot;http://www.encontrodeti.com.br/&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;u&gt;www.encontrodeti.com.br&lt;/u&gt;&lt;/font&gt;&lt;/a&gt;&lt;font color=&quot;#1f497d&quot;&gt;, &lt;/font&gt;&lt;font&gt;foi  desenhado o &lt;strong&gt;1&#186; Encontro de Tecnologia da Informa&#231;&#227;o&lt;/strong&gt;.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font&gt;Os temas mais votados e escolhidos para as palestras foram &#8220;&lt;/font&gt;&lt;font color=&quot;#c00000&quot;&gt;Linguagens &#8211; quais  s&#227;o as mais requisitadas pelas grandes empresas e o valor das forma&#231;&#245;es/certifica&#231;&#245;es&lt;/font&gt;&lt;font&gt;&#8221;, &#8220;&lt;/font&gt;&lt;font color=&quot;#c00000&quot;&gt;CMS  livres: Drupal x Joomla! x WordPress&lt;/font&gt;&lt;font&gt;&#8221;,  &#8220;&lt;/font&gt;&lt;font color=&quot;#c00000&quot;&gt;Ferramenta  Google Analytics: como analisar acessos e gerar melhores resultados&lt;/font&gt;&lt;font&gt;&#8221; e &#8220;&lt;/font&gt;&lt;font color=&quot;#c00000&quot;&gt;Padr&#245;es  W3C &#8211; Como tornar seu site mais leve e mais acess&#237;vel&lt;/font&gt;&lt;font&gt;&#8221;. &lt;/font&gt;&lt;font color=&quot;#1f497d&quot;&gt;E &lt;/font&gt;&lt;font&gt;ocorrer&#227;o ainda, simultaneamente,  algumas oficinas que v&#227;o discutir os assuntos mais atuais da &#225;rea,  como &lt;/font&gt;&lt;font color=&quot;#c00000&quot;&gt;Ruby  On Rails&lt;/font&gt;&lt;font&gt;, &lt;/font&gt;&lt;font color=&quot;#c00000&quot;&gt;SEO&lt;/font&gt;&lt;font&gt;, &lt;/font&gt;&lt;font color=&quot;#c00000&quot;&gt;Interoperabilidade&lt;/font&gt;&lt;font&gt; e &lt;/font&gt;&lt;font color=&quot;#c00000&quot;&gt;Scrum&lt;/font&gt;&lt;font&gt;.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font&gt;Mas a intera&#231;&#227;o n&#227;o p&#225;ra  por a&#237;. Depois de escolhidos os temas, os mediadores das palestrantes  e oficinas prop&#245;em um debate no site do&lt;strong&gt; ETI&lt;/strong&gt; para decidir qual  especialidade dentro do assunto principal ser&#225; abordada para as palestras  (&lt;/font&gt;&lt;a href=&quot;http://www.encontrodeti.com.br/site/?p=558&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;u&gt;http://www.encontrodeti.com.br/site/?p=558&lt;/u&gt;&lt;/font&gt;&lt;/a&gt;&lt;font&gt;). Ou seja, todas as decis&#245;es s&#227;o  feitas atrav&#233;s de pesquisas com o p&#250;blico.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font&gt;Vai ter at&#233; caf&#233; da manh&#227;, espa&#231;o imprensa digital, e, para completar,  eu te fa&#231;o mais uma perguntinha: J&#225; pensou em um evento com as palestras  e oficinas que voc&#234; sempre sonhou, e no final ainda curtir um &lt;strong&gt;&lt;em&gt; Happy Hour&lt;/em&gt;&lt;/strong&gt;? N&#227;o est&#225; acreditando n&#227;o &#233;? &#201; isso a&#237;! Voc&#234;  n&#227;o pode perder! No final deste m&#234;s, dia 27/11, quinta-feira, na Amcham  Brasil, em S&#227;o Paulo, e dia 29/11, s&#225;bado, no Centro de Conven&#231;&#245;es  SulAm&#233;rica, no Rio de Janeiro.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font&gt;Para ter um gostinho do que  vai rolar no evento, confira os quatro chats sobre os temas das palestras,  que tiveram &#243;tima repercuss&#227;o com cerca de 50 participantes em cada  sala: &lt;/font&gt;&lt;a href=&quot;http://www.encontrodeti.com.br/site/?page_id=319&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;u&gt;http://www.encontrodeti.com.br/site/?page_id=319&lt;/u&gt;&lt;/font&gt;&lt;/a&gt;&lt;font&gt;.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font&gt;O Encontro de Tecnologia da  Informa&#231;&#227;o &#233; uma realiza&#231;&#227;o da Arteccom, com os patroc&#237;nios de  PagSeguro UOL, UOL Host, Tecla e Hostnet.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font&gt;&lt;strong&gt;Veja a programa&#231;&#227;o do  evento:&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color=&quot;#c00000&quot;&gt;&lt;strong&gt;08:30&lt;/strong&gt;&lt;/font&gt;&lt;font&gt; &#8211; Credenciamento&lt;br /&gt;
&lt;/font&gt;&lt;font color=&quot;#c00000&quot;&gt;&lt;strong&gt;09:00&lt;/strong&gt;&lt;/font&gt;&lt;font&gt; &#8211; Caf&#233; da manh&#227; (networking e  visita aos estandes)&lt;br /&gt;
&lt;/font&gt;&lt;font color=&quot;#c00000&quot;&gt;&lt;strong&gt;10:00&lt;/strong&gt;&lt;/font&gt;&lt;font&gt; &#8211; Abertura&lt;br /&gt;
&lt;/font&gt;&lt;font color=&quot;#c00000&quot;&gt;&lt;strong&gt;10:15&lt;/strong&gt;&lt;/font&gt;&lt;font&gt; &#8211; &lt;strong&gt;Palestra&lt;/strong&gt;: &lt;strong&gt;&#8220;Linguagens:  quais s&#227;o as mais requisitadas pelas grandes empresas e o valor das  forma&#231;&#245;es/certifica&#231;&#245;es&#8221;&lt;/strong&gt;&lt;br /&gt;
Palestrante SP e RJ: Guilherme Chapiewski (Globo.com)&lt;br /&gt;
&lt;/font&gt;&lt;font color=&quot;#c00000&quot;&gt;&lt;strong&gt;11:15&lt;/strong&gt;&lt;/font&gt;&lt;font&gt; &#8211; &lt;strong&gt;Debate&lt;/strong&gt; &lt;strong&gt;CMS livres:&lt;/strong&gt;&lt;br /&gt;
- WordPress: SP: Jos&#233; Murilo (Minc) | RJ: Guilherme Aguiar (Minc)&lt;br /&gt;
- Joomla!: Ricardo Accioly (Noix)&lt;br /&gt;
- Drupal: Paulino Michelazzo (F&#225;brica Livre)&lt;br /&gt;
&lt;/font&gt;&lt;font color=&quot;#c00000&quot;&gt;&lt;strong&gt;13:00&lt;/strong&gt;&lt;/font&gt;&lt;font&gt; &#8211; Intervalo para almo&#231;o&lt;br /&gt;
&lt;/font&gt;&lt;font color=&quot;#c00000&quot;&gt;&lt;strong&gt;14:30&lt;/strong&gt;&lt;/font&gt;&lt;font&gt; &#8211; &lt;strong&gt;Palestra&lt;/strong&gt;: &lt;strong&gt;&#8220;Google  Analytics: como analisar acessos e gerar melhores resultados&#8221;&lt;/strong&gt;&lt;br /&gt;
Palestrante SP: Ruy Carneiro (WA Consulting)&lt;br /&gt;
Palestrante RJ: Gustavo Loureiro (Infnet)&lt;br /&gt;
&lt;/font&gt;&lt;font color=&quot;#c00000&quot;&gt;&lt;strong&gt;15:30&lt;/strong&gt;&lt;/font&gt;&lt;font&gt; &#8211; Intervalo para visita aos estandes&lt;br /&gt;
&lt;/font&gt;&lt;font color=&quot;#c00000&quot;&gt;&lt;strong&gt;16:00&lt;/strong&gt;&lt;/font&gt;&lt;font&gt; &#8211; &lt;strong&gt;Palestra:  &#8220;Padr&#245;es W3C: torne seu site mais leve e mais acess&#237;vel&#8221;&lt;/strong&gt;&lt;br /&gt;
Palestrante SP: Vagner Diniz (W3C)&lt;br /&gt;
Palestrante RJ: Everaldo Bechara (iLearn)&lt;br /&gt;
&lt;/font&gt;&lt;font color=&quot;#c00000&quot;&gt;&lt;strong&gt;17:00&lt;/strong&gt;&lt;/font&gt;&lt;font&gt; &#8211; Happy hour&lt;br /&gt;
&lt;/font&gt;&lt;font color=&quot;#c00000&quot;&gt;&lt;strong&gt;18:00&lt;/strong&gt;&lt;/font&gt;&lt;font&gt; &#8211; Encerramento&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font&gt;&lt;strong&gt;Oficinas (vagas limitadas):&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color=&quot;#c00000&quot;&gt;&lt;strong&gt;10:15  &#224;s 11:15h&lt;/strong&gt;&lt;/font&gt;&lt;font&gt; (palestra  principal: Linguagens e certifica&#231;&#245;es)&lt;br /&gt;
Ruby on Rails &#8211; SP F&#225;bio Akita (Locaweb)&lt;br /&gt;
Ruby on Rails &#8211; RJ Sylvestre Mergulh&#227;o (Hostnet)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color=&quot;#c00000&quot;&gt;&lt;strong&gt;11:15  &#224;s 12:15&lt;/strong&gt;&lt;/font&gt;&lt;font&gt; (palestra  principal: CMS livres)&lt;br /&gt;
SEO &#8211; SP F&#225;bio Ricotta (MestreSEO)&lt;br /&gt;
SEO &#8211; RJ Paulo Teixeira (Marketing de Busca)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color=&quot;#c00000&quot;&gt;&lt;strong&gt;14:30  &#224;s 15:30&lt;/strong&gt;&lt;/font&gt;&lt;font&gt; (palestra  principal: Google Analytics)&lt;br /&gt;
Interoperabilidade &#8211; SP F&#225;bio Hara (Microsoft)&lt;br /&gt;
Interoperabilidade &#8211; RJ Gilson Banin (Microsoft)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color=&quot;#c00000&quot;&gt;&lt;strong&gt;16:00  &#224;s 17:00&lt;/strong&gt;&lt;/font&gt;&lt;font&gt; (palestra  principal: Padr&#245;es W3C)&lt;br /&gt;
Scrum &#8211; SP Guilherme Chapiewski (Globo.com)&lt;br /&gt;
Scrum &#8211; RJ Guilherme Chapiewski (Globo.com)&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;
Locais:&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font&gt;&lt;strong&gt;S&#227;o Paulo&lt;br /&gt;
&lt;/strong&gt;Data: 27 de novembro de 2008&lt;br /&gt;
Local: Amcham Brasil&lt;br /&gt;
Rua da Paz, 1.431 &#8211; Ch&#225;cara Santo Ant&#244;nio &#8211; S&#227;o Paulo &#8211; SP&lt;br /&gt;
Telefone: (11) 5180-3728&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font&gt;&lt;strong&gt;Rio de Janeiro&lt;/strong&gt;&lt;br /&gt;
Data: 29 de novembro de 2008&lt;br /&gt;
Local: Centro de Conven&#231;&#245;es SulAm&#233;rica&lt;br /&gt;
Av. Paulo de Frontin, 1 &#8211; Cidade Nova &#8211; RJ&lt;br /&gt;
Telefone: (21) 3293-6700&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font&gt;Inscri&#231;&#245;es: &lt;/font&gt;&lt;a href=&quot;http://www.encontrodeti.com.br/&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;u&gt;www.encontrodeti.com.br&lt;/u&gt;&lt;/font&gt;&lt;/a&gt;&lt;font color=&quot;#1f497d&quot;&gt;&lt;br /&gt;
&lt;/font&gt;&lt;font&gt;Mais informa&#231;&#245;es: (21)  2253.0596&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font&gt;Texto de Fl&#225;via Freire&lt;/font&gt;&lt;a href=&quot;mailto:Flavia.freire@arteccom.com.br&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;u&gt;&lt;br /&gt;
Flavia.freire@arteccom.com.br&lt;/u&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Recomendo. Vejo voc&#234; l&#225;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feeds.feedburner.com/~a/Fechatag?a=7ccFNw&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~a/Fechatag?i=7ccFNw&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~f/Fechatag?a=XXlfN&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/Fechatag?i=XXlfN&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/Fechatag?a=WGsHn&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/Fechatag?i=WGsHn&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;
		<!--
		&lt;p&gt;&lt;a href=&quot;http://www.pyconbrasil.com.br&quot; 
		title=&quot;PyConBrasil 2008 - 18, 19 e 20 de setembro - Rio de Janeiro&quot;&gt;&lt;img
		src=&quot;http://pyconbrasil.com.br/sobre-o-evento/divulgue-a-pyconbrasil/full_rotativo.gif&quot;
		alt=&quot;PyConBrasil 2008 - Inscreva-se j&aacute;!&quot; /&gt;&lt;/a&gt;&lt;/p&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>2008-12-05T09:03:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Lock em arquivos usando SVN e Subclipse</title>
		<link href="http://www.eltonminetto.net/lock-em-arquivos-usando-svn-e-subclipse.htm"/>
		<id>http://www.eltonminetto.net/?p=329</id>
		<updated>2008-11-25T17:09:44+00:00</updated>
		<content type="html">&lt;p&gt;Outra novidade para mim ao usar o Subversion foi o controle de Locks.&#160;&lt;/p&gt;
&lt;p&gt;Eu sempre usei o CVS integrado ao Eclipse para gerenciar os projetos que eu trabalhava e com essa duplinha &#233; bem f&#225;cil configurar para evitar que dois programadores alterem o mesmo&#160;arquivo.&lt;/p&gt;
&lt;p&gt;Com o Subversion e o Eclipse (usando o plugin Subclipse) eu n&#227;o encontrei essa op&#231;&#227;o. A solu&#231;&#227;o que encontrei foi configurar o cliente do subversion para quando criar novos arquivos marc&#225;-los com um flag. Este flag indica que, para editar o arquivo &#233; preciso que seja feito o &amp;#8220;lock&amp;#8221; antes. No momento de criar o lock o Subclipse tamb&#233;m verifica a vers&#227;o do arquivo e avisa caso a vers&#227;o local seja inferior a que consta no reposit&#243;rio. Desta forma eu garanto que o programador sempre tenha a &#250;ltima vers&#227;o do arquivo e evito que duas pessoas alterem o mesmo arquivo ao mesmo tempo. Existem formas de corrigir isso usando pr&#225;ticas de merge, mas eu acho mais f&#225;cil evitar o problema do que resolv&#234;-lo &lt;img src=&quot;http://www.eltonminetto.net/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;O que eu fiz foi alterar o arquivo config no diret&#243;rio do usu&#225;rio:&lt;/p&gt;
&lt;pre&gt;mate ~/.subversion/config&lt;/pre&gt;
&lt;p&gt;Eu estou usando o Textmate no MacOSX. Mas o mesmo passo vai funcionar no Linux. No Windows XP o arquivo encontra-se no diret&#243;rio&lt;/p&gt;
&lt;pre&gt;c:\Documents and Settings\usuario\Dados de Aplicativos\Subversion\config&lt;/pre&gt;
&lt;p&gt;Neste arquivo eu alterei&#160;&lt;/p&gt;
&lt;pre&gt;# enable-auto-props = yes&lt;/pre&gt;
&lt;p&gt;para&lt;/p&gt;
&lt;pre&gt;enable-auto-props = yes&lt;/pre&gt;
&lt;p&gt;E adicionei alinha abaixo na se&#231;&#227;o &#160;[auto-props]&lt;/p&gt;
&lt;pre&gt;* = svn:needs-lock&lt;/pre&gt;
&lt;p&gt;Desta forma, assim que o programador criar um novo arquivo e realizar o primeiro commit &#233; adicionada esta flag ao arquivo. Todos que forem alter&#225;-lo v&#227;o passar pela fase &amp;#8220;lock-edit-commit&amp;#8221;, com um &amp;#8220;update&amp;#8221; caso seja necess&#225;rio.&lt;/p&gt;
		<!--
		&lt;p&gt;&lt;a href=&quot;http://www.pyconbrasil.com.br&quot; 
		title=&quot;PyConBrasil 2008 - 18, 19 e 20 de setembro - Rio de Janeiro&quot;&gt;&lt;img
		src=&quot;http://pyconbrasil.com.br/sobre-o-evento/divulgue-a-pyconbrasil/full_rotativo.gif&quot;
		alt=&quot;PyConBrasil 2008 - Inscreva-se j&aacute;!&quot; /&gt;&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>2008-12-05T09:04:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Deploy autom&#225;tico do SVN</title>
		<link href="http://www.eltonminetto.net/deploy-automatico-do-svn-para-o-htdocs.htm"/>
		<id>http://www.eltonminetto.net/?p=325</id>
		<updated>2008-11-25T16:17:25+00:00</updated>
		<content type="html">&lt;p&gt;Estou iniciando um novo projeto e aproveitei para mudar do CVS para o Subversion.&#160;&lt;/p&gt;
&lt;p&gt;Uma das coisas que achei interessante &#233; o esquema de &amp;#8220;&lt;em&gt;hooks&lt;/em&gt;&amp;#8220;. &#201; um conceito parecido com &amp;#8220;&lt;em&gt;triggers&lt;/em&gt;&amp;#8221; de bancos de dados. Voc&#234; pode programar alguns scripts para serem executados em momentos espec&#237;ficos do ciclo gerenciado pelo SVN. As op&#231;&#245;es s&#227;o:&lt;/p&gt;
&lt;pre&gt;post-commit.tmpl&lt;/pre&gt;
&lt;pre&gt;post-lock.tmpl&lt;/pre&gt;
&lt;pre&gt;post-revprop-change.tmpl&lt;/pre&gt;
&lt;pre&gt;post-unlock.tmpl&lt;/pre&gt;
&lt;pre&gt;pre-commit.tmpl&lt;/pre&gt;
&lt;pre&gt;pre-lock.tmpl&lt;/pre&gt;
&lt;pre&gt;pre-revprop-change.tmpl&lt;/pre&gt;
&lt;pre&gt;pre-unlock.tmpl&lt;/pre&gt;
&lt;pre&gt;start-commit.tmpl&lt;/pre&gt;
&lt;p&gt;Os nomes s&#227;o auto-explicativos. Por exemplo, o script post-lock vai ser executado sempre ap&#243;s algum usu&#225;rio ter feito o lock de um arquivo.&lt;/p&gt;
&lt;p&gt;Estes arquivos est&#227;o armazenados no diret&#243;rio &lt;em&gt;hooks &lt;/em&gt;do reposit&#243;rio do projeto.&lt;/p&gt;
&lt;p&gt;O que eu fiz foi alterar o post-commit.tmpl&lt;/p&gt;
&lt;p&gt;&#201; preciso remover a extens&#227;o do nome e dar permiss&#227;o de execu&#231;&#227;o no arquivo, ent&#227;o:&lt;/p&gt;
&lt;pre&gt;cp post-commit.tmpl post-commit&lt;/pre&gt;
&lt;pre&gt;chmod +x post-commit&lt;/pre&gt;
&lt;p&gt;O conte&#250;do do arquivo ficou assim:&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;&lt;span&gt;REPOS=&quot;$1&quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;REV=&quot;$2&quot;&lt;/pre&gt;
&lt;pre&gt;PROD=&quot;/var/www/html&quot;&lt;/pre&gt;
&lt;pre&gt;#pega todas as alteracoes&lt;/pre&gt;
&lt;pre&gt;svnlook changed $REPOS --revision $REV &amp;gt;&amp;gt; /tmp/lixo_$REV&lt;/pre&gt;
&lt;pre&gt;#pega cada alteracao e salva&lt;/pre&gt;
&lt;pre&gt;for i in `cat /tmp/lixo_$REV|cut -c 5-1024` ; do&lt;/pre&gt;
&lt;pre&gt;&#160;&#160;svnlook cat $REPOS $i &amp;gt; $PROD/$i&lt;/pre&gt;
&lt;pre&gt;done&lt;/pre&gt;
&lt;pre&gt;#apagar arquivo&lt;/pre&gt;
&lt;pre&gt;rm /tmp/lixo_$REV&lt;/pre&gt;
&lt;div&gt;Desta forma cada vez que um programador faz o commit do fonte ele &#233; automaticamente salvo no htdocs, onde fica acess&#237;vel para a equipe de testes.&#160;&lt;/div&gt;
&lt;div&gt;L&#243;gico que esse script pode ser melhorado e isso est&#225; sendo executado em um servidor de desenvolvimento e n&#227;o o de produ&#231;&#227;o. Al&#233;m disso eu comecei a usar o SVN somente agora, por isso, se algu&#233;m encontrar um problema ou erro na l&#243;gica me avisem &lt;img src=&quot;http://www.eltonminetto.net/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/div&gt;
		<!--
		&lt;p&gt;&lt;a href=&quot;http://www.pyconbrasil.com.br&quot; 
		title=&quot;PyConBrasil 2008 - 18, 19 e 20 de setembro - Rio de Janeiro&quot;&gt;&lt;img
		src=&quot;http://pyconbrasil.com.br/sobre-o-evento/divulgue-a-pyconbrasil/full_rotativo.gif&quot;
		alt=&quot;PyConBrasil 2008 - Inscreva-se j&aacute;!&quot; /&gt;&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>2008-12-05T09:04:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Gerenciamento de usu&#225;rios Trac com Django</title>
		<link href="http://blog.stiod.com/2008/11/25/gerenciamento-de-usuarios-trac-com-django/"/>
		<id>http://blog.stiod.com/?p=165</id>
		<updated>2008-11-25T16:13:30+00:00</updated>
		<content type="html">&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=ff921322b6cfe076d99baca600953284&amp;amp;default=http://use.perl.org/images/pix.gif&quot; alt=&quot;No Gravatar&quot; width=&quot;40&quot; height=&quot;40/&quot; /&gt;&lt;p&gt;Uma das minhas maiores broncas com o &lt;a href=&quot;http://trac.edgewall.com/&quot;&gt;Trac&lt;/a&gt; &#233; na hora de gerenciar usu&#225;rios.&lt;/p&gt;
&lt;p&gt;At&#233; poucos meses atr&#225;s eu costumava gerenciar os usu&#225;rios com o famoso aplicativo &lt;a href=&quot;http://httpd.apache.org/docs/2.2/programs/htpasswd.html&quot;&gt;htpasswd&lt;/a&gt; que utiliza um arquivo de texto simples pra gerenciar os usu&#225;rios. O primeiro problema que eu tive com ele veio quando eu pensei:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Holly shit...se eu precisar definir permiss&#245;es de acesso a diferentes Tracs eu to fucked
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Foi ent&#227;o que eu resolvi procurar uma alternativa, e o primeiro (e mais obvio) lugar que eu procurei foi no &lt;a href=&quot;http://www.djangoproject.com&quot;&gt;Django&lt;/a&gt;, felizmente encontrei a &lt;a href=&quot;http://docs.djangoproject.com/en/dev/howto/apache-auth/#howto-apache-auth&quot;&gt;documenta&#231;&#227;o que ensina passo-a-passo como configurar o Apache para autenticar com o Django&lt;/a&gt;, &#233; t&#227;o ridiculamente simples configurar que recomendo acessar o link por voc&#234; mesmo e configurar.&lt;/p&gt;
&lt;p&gt;Agora eu estava feliz, tinha 3 tracs pra administrar, felizmente, todos com as mesmas permiss&#245;es de acesso e tudo sobre controle, gerenciamento de usu&#225;rios centralizado e tudo mais. E eis que finalmente surge a oportunidade de por a prova o gerenciamento de permiss&#245;es de acesso com o Trac do projeto &lt;a href=&quot;http://www.djapian.com&quot;&gt;Djapian&lt;/a&gt; (ainda n&#227;o publicado), dessa forma fiz o seguinte:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Os 3 Tracs j&#225; existentes est&#227;o configurados para permitir apenas acesso de pessoas com o atributo &lt;strong&gt;is_staff&lt;/strong&gt; habilidado&lt;/li&gt;
&lt;li&gt;O novo Trac foi configurado para permitir acesso de qualquer pessoa que tenha a &lt;a href=&quot;http://docs.djangoproject.com/en/dev/topics/auth/#custom-permissions&quot;&gt;permiss&#227;o&lt;/a&gt; &lt;strong&gt;djapian&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ap&#243;s configurar o Apache apropriadamente eu criei um usu&#225;rio de teste pelo Admin do Django, feito isso, testei o usu&#225;rio no Trac do Djapian e no Trac interno, resultado: Perfeito, conseguindo logar-se e negando autentica&#231;&#227;o respectivamente.&lt;/p&gt;
&lt;p&gt;Agora estava tudo perfeito, at&#233; eu perceber um detalhe: O projeto Djapian &#233; OpenSource, e eu gostaria que o wiki tamb&#233;m fosse, por&#233;m, n&#227;o gostaria de deixar habilitado a edi&#231;&#227;o do mesmo por usu&#225;rios anonimos, at&#233; por quest&#245;es de rastreamento no caso de alguem apagar ou estragar uma p&#225;gina. &lt;/p&gt;
&lt;p&gt;O problema: Como eu permito que usu&#225;rios se cadastrem?&lt;br /&gt;
A solu&#231;&#227;o: Construir um plugin para o Trac que fa&#231;a a interface com o Django &lt;img src=&quot;http://blog.stiod.com/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Levei aproximadamente 1 dia &#250;til de trabalho para desenvolver esse &lt;a href=&quot;http://pub.stiod.com/TracDjangoAuth-0.1.tar.gz&quot;&gt;plugin que pode ser baixado aqui&lt;/a&gt;, o plugin &#233; bem simples de se configurar e instalar, para isso siga os seguintes passos:&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&amp;nbsp;
$ &lt;span&gt;wget&lt;/span&gt; http://pub.stiod.com/TracDjangoAuth&lt;span&gt;-0.1&lt;/span&gt;.&lt;span&gt;tar&lt;/span&gt;.gz
$ &lt;span&gt;tar&lt;/span&gt; -zxvf TracDjangoAuth&lt;span&gt;-0.1&lt;/span&gt;.&lt;span&gt;tar&lt;/span&gt;.gz
$ &lt;span&gt;cd&lt;/span&gt; TracDjangoAuth&lt;span&gt;-0.1&lt;/span&gt;
$ python setup.py&#160;bdist_egg
$ &lt;span&gt;cp&lt;/span&gt; dist/TracDjangoAuth&lt;span&gt;-0.1&lt;/span&gt;-*.egg /path/para/o/seu/trac/plugins/
&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;Agora &#233; preciso apenas editar o arquivo &lt;strong&gt;trac.ini&lt;/strong&gt; e acrescentar no final dele as seguintes linhas:&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&amp;nbsp;
&lt;span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;djangoauth&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;/span&gt;
# Adicione aqui sua permissao
&lt;span&gt;django_permission_name &lt;/span&gt;=&lt;span&gt; can_do_something&lt;/span&gt;
# Permissoes padroes para cada usuario que se cadastras
&lt;span&gt;default_trac_permissions &lt;/span&gt;=&lt;span&gt; WIKI_CREATE,WIKI_MODIFY,WIKI_VIEW&lt;/span&gt;
# Settings que deve ser usado
&lt;span&gt;django_settings_module &lt;/span&gt;=&lt;span&gt; some_project.settings&lt;/span&gt;
&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;Apenas note que a op&#231;&#227;o &lt;strong&gt;django_permission_name&lt;/strong&gt; requer apenas o atributo &lt;strong&gt;codename&lt;/strong&gt; da permiss&#227;o, diferentemente de seu equivalente no Apache, que precisa do nome da aplica&#231;&#227;o tamb&#233;m como &lt;strong&gt;myapp.some_perm&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Feito isso apenas reinicie o Apache e divirta-se, o novo plugin ir&#225; criar um novo link chamado &quot;Signup&quot; para que seus usu&#225;rios possam se cadastrar e se logar &lt;img src=&quot;http://blog.stiod.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Qualquer d&#250;vida, bug, sugest&#227;o, corre&#231;&#227;o ou patch, &#233; s&#243; comentar ai em baixo &lt;img src=&quot;http://blog.stiod.com/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Em tempo: Fiz esse plugin para o Trac 0.10.x, se voc&#234; estiver disposto a migrar para o 0.11, saiba que a unica mudan&#231;a &#233; no sistema de templates, &lt;a href=&quot;http://trac.edgewall.org/wiki/TracDev/PortingFromClearSilverToGenshi&quot;&gt;de ClearSilver para Genshi&lt;/a&gt;.&lt;/p&gt;
		<!--
		&lt;p&gt;&lt;a href=&quot;http://www.pyconbrasil.com.br&quot; 
		title=&quot;PyConBrasil 2008 - 18, 19 e 20 de setembro - Rio de Janeiro&quot;&gt;&lt;img
		src=&quot;http://pyconbrasil.com.br/sobre-o-evento/divulgue-a-pyconbrasil/full_rotativo.gif&quot;
		alt=&quot;PyConBrasil 2008 - Inscreva-se j&aacute;!&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
		-->

		</content>
		<author>
			<name>Stiods Palace</name>
			<uri>http://blog.stiod.com</uri>
		</author>
		<source>
			<title type="html">Stiod &#187; Python</title>
			<subtitle type="html">Desenvolvimento, design e tecnlogia web aplicada a web social.</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>2008-12-05T09:03:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pt-br">
		<title type="html">Notas sobre o Semin&#225;rio C &amp;#38; C++ para Sistemas Embarcados</title>
		<link href="http://techberto.wordpress.com/2008/11/18/notas-sobre-o-seminario-c-c-para-sistemas-embarcados-2/"/>
		<id>http://techberto.wordpress.com/?p=130</id>
		<updated>2008-11-23T17:49:24+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Numa &lt;a href=&quot;http://hackhour.tripod.com/&quot; target=&quot;_blank&quot;&gt;conversa de boteco&lt;/a&gt; a uns 6 anos atr&#225;s com alguns colegas, fal&#225;vamos de bits, bytes, C, programa&#231;&#227;o, redes e clusters; eis que surge uma id&#233;ia&#160; (talvez inovadora) de distribui&#231;&#227;o de carga em clusters utilizando pirometro &#243;ptico, term&#244;metro digital, amper&#237;metros criando uma grande rede de sensoriamento visando n&#227;o apenas o balanceamento computacional mas tamb&#233;m a economia de energia atrav&#233;s do equil&#237;brio t&#233;rmico e de consumo de energia no datacenter. Foi neste contexto que foi inserido o assunto microcontroladores na conversa e a maioria dos colegas que estavam na mesa ficaram fascinados. Curiosamente, lendo o blog &lt;a href=&quot;http://blogs.msdn.com/otavio/archive/2008/11/09/cool-2x.aspx&quot; target=&quot;_blank&quot;&gt;Arquitetura em Pauta&lt;/a&gt; o Ot&#225;vio comentou que no PDC houve uma apresenta&#231;&#227;o que demonstrou &lt;a href=&quot;http://research.microsoft.com/research/pubs/view.aspx?type=Technical%20Report&amp;amp;id=1303&amp;amp;0sr=a&quot; target=&quot;_blank&quot;&gt;solu&#231;&#227;o similar&lt;/a&gt; e vejo agora que a viagem n&#227;o era t&#227;o grande.&lt;/p&gt;
&lt;p&gt;Mas voltando &#224;s &lt;a href=&quot;http://hackhour.tripod.com/&quot; target=&quot;_blank&quot;&gt;conversas de boteco&lt;/a&gt;, j&#225; naqueles tempos convers&#225;vamos sobre a id&#233;ia de encontros e eventos espec&#237;ficos para programadores de C &amp;amp; C++, sendo-se que dentre estes ao menos um deveria ser exclusivo de embedded systems voltados para microcontroladores e como j&#225; &lt;a href=&quot;http://techberto.wordpress.com/2008/10/26/seminario-c-c-para-sistemas-embarcados/&quot; target=&quot;_blank&quot;&gt;comentado anteriormente&lt;/a&gt; que iria ocorrer, foi realizado no dia 08/11 o &lt;a href=&quot;http://www.temporealeventos.com.br/?area=118&quot; target=&quot;_blank&quot;&gt;semin&#225;rio C &amp;amp; C++ para Sistemas Embarcados&lt;/a&gt;, onde o foco foi adivinha o qu&#234;? Sobre o que l&#225; ocorreu, &#233; poss&#237;vel ficar sabendo pelos blogs do &lt;a href=&quot;http://dqsoft.blogspot.com/2008/11/seminario-c-para-sistemas-embarcados.html&quot; target=&quot;_blank&quot;&gt;DQ&lt;/a&gt; , &lt;a href=&quot;http://pedrolamarao.blogspot.com/2008/11/atividades.html&quot; target=&quot;_blank&quot;&gt;P.&lt;/a&gt; e do &lt;a href=&quot;http://www.embarcados.com.br/Blogs/Blogs-Embarcados/O-desafio-em-tentar-organizar-e-realizar-um-evento.html&quot; target=&quot;_blank&quot;&gt;Diego&lt;/a&gt;, assim como por threads na &lt;a href=&quot;http://groups.google.com/group/ccppbrasil/browse_thread/thread/53b3a4bc9bd9f041/fbf7001bab3f0230?lnk=gst&amp;amp;q=notas#fbf7001bab3f0230&quot; target=&quot;_blank&quot;&gt;ccppbrasil&lt;/a&gt;, &lt;a href=&quot;http://br.groups.yahoo.com/group/programa_embedded_software/message/1803&quot; target=&quot;_blank&quot;&gt;programa embedded software&lt;/a&gt; e &lt;a href=&quot;http://br.groups.yahoo.com/group/sis_embarcados/message/3845&quot; target=&quot;_blank&quot;&gt;sis_embarcados&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Em paralelo, num outro evento que estava ocorrendo no mesmo dia em S&#227;o Paulo, o &lt;a href=&quot;http://lameiro.wordpress.com/2008/11/11/yahoo-open-hack-day-brazil-2008/&quot;&gt;Lameiro&lt;/a&gt; e uma galera do Grupy-SP&#160; fez uma implementa&#231;&#227;o pitoresca de &lt;a href=&quot;http://www.research.rutgers.edu/~mini/sensornetworks.html&quot; target=&quot;_blank&quot;&gt;sensor networks&lt;/a&gt; utilizando AVR numa placa &lt;a href=&quot;http://www.arduino.cc/en/Main/ArduinoBoardDiecimila&quot; target=&quot;_blank&quot;&gt;Arduino Diecimila&lt;/a&gt; que pela id&#233;ia inovadora recebeu um pr&#234;mio especial.&lt;/p&gt;
&lt;p&gt;Portanto vemos que o assunto microcontroladores est&#225; ficando cada vez mais pop, assim como sensor networks que tem sido o campo onde microcontroladores tem sido largamente utilizados, seja para seguran&#231;a da informa&#231;&#227;o, seguran&#231;a privada ou telemetria; tornando telematics algo cada vez mais presente em nosso dia-a-dia.&lt;/p&gt;
&lt;p&gt;E os feedbacks do semin&#225;rio foram excepcionais, muito acima do normal, mais cr&#237;ticos do que recebemos dos outros eventos, superando expectativas e nos mostrando que este p&#250;blico de embedded systems quer eventos diferentes do que eles est&#227;o acostumados a presenciar, quase nos intimando a repetir a dose e experimentar outros formatos mais ousados; o que na medida do poss&#237;vel tentaremos realizar. Portanto, pedido anotado!&lt;/p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/techberto.wordpress.com/130/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/techberto.wordpress.com/130/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/techberto.wordpress.com/130/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/techberto.wordpress.com/130/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/techberto.wordpress.com/130/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/techberto.wordpress.com/130/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/techberto.wordpress.com/130/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/techberto.wordpress.com/130/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/techberto.wordpress.com/130/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/techberto.wordpress.com/130/&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;amp;blog=400569&amp;amp;post=130&amp;amp;subd=techberto&amp;amp;ref=&amp;amp;feed=1&quot; /&gt;&lt;/div&gt;
		<!--
		&lt;p&gt;&lt;a href=&quot;http://www.pyconbrasil.com.br&quot; 
		title=&quot;PyConBrasil 2008 - 18, 19 e 20 de setembro - Rio de Janeiro&quot;&gt;&lt;img
		src=&quot;http://pyconbrasil.com.br/sobre-o-evento/divulgue-a-pyconbrasil/full_rotativo.gif&quot;
		alt=&quot;PyConBrasil 2008 - Inscreva-se j&aacute;!&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
		-->

		</content>
		<author>
			<name>techberto</name>
			<uri>http://techberto.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Inno::Blog /* by Alberto Fabiano */</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>2008-12-05T09:05:30+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Pontos e Vetores</title>
		<link href="http://fazerjogos.org/?p=66"/>
		<id>http://fazerjogos.org/?p=66</id>
		<updated>2008-11-22T23:08:45+00:00</updated>
		<content type="html">&lt;p&gt;&lt;em&gt;Aos que receberam a vers&#227;o incompleta desse post pelo leitor de RSS, pe&#231;o desculpas pelo inconveniente. Eu acidentalmente apertei o bot&#227;o de publicar no Wordpress.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A raz&#227;o de eu escrever esse post &#233; que muita gente que gostaria de fazer jogos n&#227;o tem um background muito matem&#225;tico ou t&#233;cnico e alguns conceitos s&#227;o muito importantes de se entender para fazer pelo menos as coisas mais b&#225;sicas em um jogo. Duas entidades matem&#225;ticas que eu acho particularmente importantes s&#227;o pontos e vetores. J&#225; vi muitas pessoas com dificuldade de entender as diferen&#231;as entre esses dois e eu mesmo s&#243; compreendi completamente ap&#243;s ver v&#225;rios exemplos de uso dos dois.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-66&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Antes de falar do assunto do post em si, gostaria de dizer que a vis&#227;o que eu quero dar aqui &#233; bem pragm&#225;tica, sem entrar em detalhes te&#243;ricos da matem&#225;tica por tr&#225;s das coisas. Minha inten&#231;&#227;o &#233; focar nos conceitos representados e como eles s&#227;o aplicados de maneiras &#250;teis na hora de fazer um jogo.&lt;/p&gt;
&lt;p&gt;Tamb&#233;m vale mencionar que eu tentei come&#231;ar do mais b&#225;sico poss&#237;vel. Eu imagino que pessoas com um &lt;em&gt;background&lt;/em&gt; em exatas v&#227;o passar o post inteiro bocejando com a trivialidade do que &#233; coberto aqui, mas esse post se destina justamente &#224;s pessoas cuja &#250;ltima lembran&#231;a desses conceitos s&#227;o aulas traumatizantes ou h&#225; muito esquecidas.&lt;/p&gt;
&lt;p&gt;Uma &#250;ltima observa&#231;&#227;o: para o prop&#243;sito desse post todos os exemplos ser&#227;o em 2D.&lt;/p&gt;
&lt;h3&gt;Pontos&lt;/h3&gt;
&lt;p&gt;Para colocar elementos gr&#225;ficos na tela de um jogo precisamos atribuir posi&#231;&#245;es para esses elementos. Posi&#231;&#245;es normalmente s&#227;o representadas por pontos. Pontos 2D s&#227;o representados por 2 n&#250;meros. Dependendo do que voc&#234; est&#225; fazendo voc&#234; pode usar n&#250;meros inteiros ou n&#250;meros reais. Esses n&#250;meros s&#227;o n&#250;meros absolutamente normais. Eles n&#227;o tem nada de especial. Voc&#234; pode som&#225;-los, pode subtra&#237;-los, multiplic&#225;-los, divid&#237;-los e at&#233; usar qualquer outro tipo de opera&#231;&#227;o matem&#225;tica que atue sobre um ou mais n&#250;meros. Pode parecer bobagem explicar uma coisa dessas, mas eu vejo muitas pessoas que querem come&#231;ar a fazer jogos e empacam na matem&#225;tica &#224;s vezes dizendo coisas como &amp;#8220;N&#227;o sou bom com n&#250;meros&amp;#8221; ou &amp;#8220;N&#227;o sei fazer contas&amp;#8221;. Eu entendo isso. No col&#233;gio eu ia muito mal em matem&#225;tica simplesmente porque n&#227;o fazia o menor sentido para mim ficar fazendo opera&#231;&#245;es com n&#250;meros de novo e de novo sem chegar a lugar algum. Na faculdade as coisas come&#231;aram a ficar realmente interessantes porque elas ganharam significado.&lt;/p&gt;
&lt;p&gt;Pois ent&#227;o, pontos 2D s&#227;o pares de n&#250;meros e voc&#234; pode fazer com esse n&#250;mero qualquer coisa que voc&#234; j&#225; sabe fazer com um n&#250;mero normal. Mas a quest&#227;o &#233;: pra que fazer isso? N&#227;o tem sentido nenhum fazer qualquer coisa com esses n&#250;meros se n&#227;o acabar dando um resultado interessante. Para enxergar isso &#233; preciso enxergar al&#233;m dos n&#250;meros: &#233; preciso ver o significado. O que significam esses dois n&#250;meros que comp&#245;e um ponto 2D? Para dar uma interpreta&#231;&#227;o para eles a gente precisa de algumas coisas a mais. Lembre-se do col&#233;gio agora e do bom e velho plano cartesiano. Temos dois eixos normalmente chamados de x e y e os n&#250;meros que comp&#245;em um ponto representam deslocamentos atrav&#233;s desses eixos.&lt;/p&gt;
&lt;div id=&quot;attachment_77&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-medium wp-image-77&quot; title=&quot;sistema_cartesiano&quot; src=&quot;http://fazerjogos.org/wp-content/uploads/2008/11/sistema_cartesiano.png&quot; alt=&quot;Plano Cartesiano 2D&quot; width=&quot;212&quot; height=&quot;211&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Plano Cartesiano 2D&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;O ponto onde nossos eixos se cruzam &#233; especial e chamamos ele de origem do sistema de coordenadas. A raz&#227;o dele ser especial &#233; justamente porque &#233; nosso ponto de refer&#234;ncia a partir do qual contamos o quanto nos deslocamos atrav&#233;s dos eixos. O deslocamento nos eixos pode ser positivo ou negativo e isso diz para que sentido estamos nos movendo em rela&#231;&#227;o &#224; origem. Normalmente a parte &#224; direita da origem &#233; o lado do x positivo e a parte acima da origem &#233; o y positivo, mas isso n&#227;o est&#225; escrito em pedra. Diferente conven&#231;&#245;es podem ser adotadas e &#233; importante saber qual voc&#234; est&#225; usando para n&#227;o se perder.&lt;/p&gt;
&lt;p&gt;Ok, pontos s&#227;o simples de entender. No final das contas &#233; um conceito bastante intuitivo. Agora que sabemos que nossos n&#250;meros significam deslocamentos atrav&#233;s de eixos, podemos tamb&#233;m atribuir significado a opera&#231;&#245;es matem&#225;ticas em cima desses n&#250;meros.&lt;/p&gt;
&lt;p&gt;Primeiro, vamos ganhar um pouco mais de intimidade com essa entidade abstrata criando um ponto chamado P. Quando damos nomes para as coisas &#233; muito mais f&#225;cil de pensar sobre elas. Esse nosso ponto P &#233; composto por dois n&#250;meros que n&#243;s chamamos de coordenadas. Como temos uma dessas coordenadas associadas a x e outra a y, vamos chamar cada uma de coordenada x de P e coordenada y de P respectivamente. Para representar de forma mais compacta vamos escrever P = (x, y).&lt;/p&gt;
&lt;p&gt;Ok, agora que temos nosso ponto P vamos come&#231;ar tentando dar um significado para a opera&#231;&#227;o de soma e subtra&#231;&#227;o em cima das suas coordenadas x e y. Como o valor da coordenada representa deslocamento em um eixo, somar ou subtrair um n&#250;mero a esse valor faz com que esse deslocamento aumente ou diminua. Se fizermos isso repetidas vezes ao longo do tempo, podemos interpretar que estamos &lt;em&gt;movendo o ponto P&lt;/em&gt; pelo espa&#231;o 2D.&lt;/p&gt;
&lt;div id=&quot;attachment_79&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-79&quot; title=&quot;movimento_x1&quot; src=&quot;http://fazerjogos.org/wp-content/uploads/2008/11/movimento_x1.png&quot; alt=&quot;Movimento de 10 unidades no eixo X&quot; width=&quot;312&quot; height=&quot;211&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Movimento de 10 unidades no eixo X&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Esse j&#225; &#233; o tipo de coisa que come&#231;a a ficar f&#225;cil de relacionar com jogos. Pense em um jogo 2D com um personagem. Zelda, por exemplo. Apesar de nunca ter visto o c&#243;digo de Zelda na minha vida, posso apostar como o Link tem uma posi&#231;&#227;o associada representada por um parente do nosso ponto P. A cada vez que a tela &#233; desenhada o link &#233; desenhado nessa posi&#231;&#227;o. Conforme apertamos o direcional do nosso controle as coordenadas x e y s&#227;o incrementadas ou decrementadas fazendo com que o personagem seja desenhado em posi&#231;&#245;es diferentes a cada vez dando a impress&#227;o de que ele est&#225; se movimentando.&lt;/p&gt;
&lt;div id=&quot;attachment_82&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-82&quot; title=&quot;zrupee&quot; src=&quot;http://fazerjogos.org/wp-content/uploads/2008/11/zrupee.gif&quot; alt=&quot;Jogo Zelda: O personagem se move em x e y&quot; width=&quot;256&quot; height=&quot;232&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Jogo Zelda: O personagem se move em x e y de acordo com a entrada do jogador.&lt;/p&gt;&lt;/div&gt;
&lt;h4&gt;Vetores&lt;/h4&gt;
&lt;p&gt;Agora que j&#225; voc&#234; j&#225; sabe mais sobre pontos no espa&#231;o 2D, podemos seguir em frente e come&#231;ar a falar sobre uma outra entidade conhecida como vetor. Uma coisa engra&#231;ada &#233; que a representa&#231;&#227;o de vetores &#233; exatamente igual &#224; representa&#231;&#227;o de pontos: um par de n&#250;meros. No entanto eles s&#227;o duas entidades bem diferentes. Isso &#233; uma situa&#231;&#227;o ideal para eu aproveitar e refor&#231;ar: &lt;em&gt;o que realmente conta aqui &#233; o significado&lt;/em&gt;. Sem uma interpreta&#231;&#227;o, um conceito em cima desse par de n&#250;meros, eles n&#227;o servem para absolutamente nada.&lt;/p&gt;
&lt;p&gt;Ent&#227;o, em que exatamente vetores s&#227;o diferentes de pontos? Eles se diferenciam pelos conceitos que eles representam. Enquanto um ponto representa a posi&#231;&#227;o de algo num espa&#231;o, um vetor representa um sentido e um tamanho. Para compreender melhor as diferen&#231;as, n&#243;s desenhamos os vetores de maneira diferente dos pontos tamb&#233;m. Al&#233;m disso costumamos chamar os n&#250;meros que comp&#245;em um vetor de componentes ao inv&#233;s de coordenadas, mas isso n&#227;o &#233; obrigat&#243;rio.&lt;/p&gt;
&lt;div id=&quot;attachment_84&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-84&quot; title=&quot;ponto_vs_vetor1&quot; src=&quot;http://fazerjogos.org/wp-content/uploads/2008/11/ponto_vs_vetor1.png&quot; alt=&quot;Um ponto e um vetor&quot; width=&quot;480&quot; height=&quot;230&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Um ponto e um vetor&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Vamos um pouco al&#233;m com essa hist&#243;ria de sentido e tamanho. A representa&#231;&#227;o gr&#225;fica de seta sintetiza isso da forma ideal para criar uma intui&#231;&#227;o sobre o assunto. O sentido em que a seta aponta &#233; justamente o sentido representado pelo vetor, enquanto o tamanho, chamado mais formalmente de magnitude ou norma do vetor, corresponde ao comprimento dessa seta.&lt;/p&gt;
&lt;div id=&quot;attachment_85&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-85&quot; title=&quot;tamanho_vetor1&quot; src=&quot;http://fazerjogos.org/wp-content/uploads/2008/11/tamanho_vetor1.png&quot; alt=&quot;Tamanho de um Vetor&quot; width=&quot;250&quot; height=&quot;230&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Tamanho de um Vetor&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Outra coisa que &#233; interessante observar &#233; que vetores n&#227;o tem um conceito de posi&#231;&#227;o associado. Ent&#227;o n&#227;o precisamos nos limitar a desenhar as setas dos vetores a partir da origem, mas podemos desenh&#225;-las onde for mais c&#244;modo e facilitar nosso entendimento. Note que isso n&#227;o quer dizer que estejamos mudando os componentes do vetor.&lt;/p&gt;
&lt;p&gt;S&#243; o fato de dar uma interpreta&#231;&#227;o diferente para um par de pontos j&#225; torna eles apropriados para representarem um monte de coisas novas. Um exemplo &#243;timo e intuitivo de uso de vetores &#233; como representa&#231;&#227;o de uma velocidade. Um vetor de velocidade representa de maneira muito compacta o sentido em que um objeto se move e tamb&#233;m, atrav&#233;s da magnitude do vetor, a rapidez com que ele se move nesse sentido. Esse &#233; um dos usos mais universais de vetores em jogos. Entender isso faz com que o n&#237;vel do pensamento suba um tanto e fique muito mais f&#225;cil raciocinar sobre uma s&#233;rie de coisas.&lt;/p&gt;
&lt;p&gt;Vamos dar um exemplo pr&#225;tico para mostrar o quanto ajuda ter o conceito de vetores. Quando est&#225;vamos falando sobre pontos vimos um exemplo de como movimentar nosso ponto P atrav&#233;s dos eixos x e y somando ou subtraindo valores em suas coordenadas. Agora vamos pensar que nossa inten&#231;&#227;o n&#227;o &#233; mover nosso ponto P atrav&#233;s do eixo x ou do eixo y separadamente. Queremos mov&#234;-lo atrav&#233;s dos dois eixos ao mesmo tempo. Obviamente temos que mudar as duas coordenadas ao mesmo tempo.&lt;/p&gt;
&lt;p&gt;Vamos supor que somamos um valor u &#224; nossa coordenada x e um valor v &#224; nossa coordenada y. Se construirmos um vetor V a partir desses dois valores, teremos um vetor que nos d&#225; o sentido em que nosso ponto se movimentar&#225; e o quando esse ponto se movimentar&#225; nesse sentido. Isso quer dizer que, supondo que saibamos construir um vetor V com componentes u e v no sentido que quisermos e saibamos dar a ele o tamanho que quisermos, podemos movimentar nosso ponto P tantas unidades quanto quisermos no sentido apontado pelo vetor. E para isso &#233; s&#243; somar nossas coordenada x e y do ponto P com nossas componentes u e v do vetor V respectivamente.&lt;/p&gt;
&lt;h3&gt;Opera&#231;&#245;es&lt;/h3&gt;
&lt;p&gt;Agora que os dois conceitos envolvidos nesse post j&#225; devem estar mais claros, vamos come&#231;ar a fazer coisas mais &#250;teis e interessantes com eles. Pra come&#231;ar vamos pegar dois pares de n&#250;meros A = (ax, ay) e B = (bx, by), fazer uma opera&#231;&#227;o de soma componente a componente resultando em outro par de n&#250;meros C = (ax + bx, ay + by) e ver como os resultados podem variar conforme mudamos a interpreta&#231;&#227;o de cada um.&lt;/p&gt;
&lt;p&gt;Primeiro vamos imaginar que A e B s&#227;o pontos e vamos som&#225;-los.&lt;/p&gt;
&lt;div id=&quot;attachment_86&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-86&quot; title=&quot;soma_pontos&quot; src=&quot;http://fazerjogos.org/wp-content/uploads/2008/11/soma_pontos.png&quot; alt=&quot;Soma de dois pontos A e B. C &#233; o resultado.&quot; width=&quot;240&quot; height=&quot;230&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Soma de dois pontos A e B. C &#233; o resultado.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Acima temos o resultado C interpretado como um ponto. Existe alguma rela&#231;&#227;o vis&#237;vel e intuitiva entre A e B e o resultado C para esse caso? Bom, eu n&#227;o consigo ver muita rela&#231;&#227;o. Mas conforme mudamos a interpreta&#231;&#227;o de A e B a interpreta&#231;&#227;o do resultado muda tamb&#233;m. Por exemplo, vamos supor agora que A representa um ponto, B representa um vetor e o resultado C &#233; um ponto tamb&#233;m.&lt;/p&gt;
&lt;div id=&quot;attachment_87&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-87&quot; title=&quot;soma_ponto_vetor&quot; src=&quot;http://fazerjogos.org/wp-content/uploads/2008/11/soma_ponto_vetor.png&quot; alt=&quot;Soma de um vetor B com um ponto A. C &#233; A deslocado por B.&quot; width=&quot;240&quot; height=&quot;230&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Soma de um vetor B com um ponto A. C &#233; A deslocado por B.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Esse caso tem uma interpreta&#231;&#227;o muito mais interessante, que por sinal &#233; a mesma do nosso exemplo l&#225; mais pra cima de como usar um vetor para mover nosso ponto P pelo espa&#231;o 2D. Na segunda parte da figura d&#225; pra ver como podemos usar o fato de que vetores n&#227;o t&#234;m posi&#231;&#227;o para desenh&#225;-los num lugar que fica mais intuitivo para enxergar o que est&#225; acontecendo.&lt;/p&gt;
&lt;p&gt;Outra interpreta&#231;&#227;o &#250;til &#233; ver A, B e C como vetores. Essa interpreta&#231;&#227;o &#233; especialmente &#250;til quando os vetores representam for&#231;as. Quando duas for&#231;as agem sobre um objeto ao mesmo tempo a soma dos vetores de for&#231;a resulta em um vetor que &#233; equivalente &#224;s duas for&#231;as combinadas.&lt;/p&gt;
&lt;div id=&quot;attachment_88&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-88&quot; title=&quot;soma_vetores&quot; src=&quot;http://fazerjogos.org/wp-content/uploads/2008/11/soma_vetores.png&quot; alt=&quot;Soma de vetores&quot; width=&quot;240&quot; height=&quot;230&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Soma de vetores&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Como eu disse mais para cima, se soubermos construir vetores com o sentido e tamanho que quisermos fica muito mais f&#225;cil e intuitivo de mover um ponto pelo espa&#231;o 2D. Agora vamos ver algumas ferramentas que nos ajudar&#227;o a construir vetores para mover nossos objetos pela tela.&lt;/p&gt;
&lt;h4&gt;Manipulando o Tamanho do Vetor&lt;/h4&gt;
&lt;p&gt;Manipular o tamanho de um vetor &#233; algo muito, muito f&#225;cil. Vamos supor que temos nosso vetor V = (u, v) e o tamanho dele &#233; um n&#250;mero t. Agora queremos obter um vetor que aponta para o mesmo sentido mas que tem o dobro do tamanho. O que fazemos? Basta multiplicar cada uma das coordenadas u e v por 2. Se o objetivo &#233; dividir t pela metade, basta dividir u e v por 2. Essa opera&#231;&#227;o &#233; chamada muitas vezes de multiplica&#231;&#227;o por escalar. Podemos escrever V*2 e isso quer dizer (u*2, v*2).&lt;/p&gt;
&lt;div id=&quot;attachment_90&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://fazerjogos.org/wp-content/uploads/2008/11/tamanhos_vetores.png&quot;&gt;&lt;img class=&quot;size-full wp-image-90&quot; title=&quot;tamanhos_vetores&quot; src=&quot;http://fazerjogos.org/wp-content/uploads/2008/11/tamanhos_vetores.png&quot; alt=&quot;Tamanhos do vetor&quot; width=&quot;500&quot; height=&quot;171&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Tamanhos do vetor&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Existem momentos em que n&#243;s podemos querer saber qual o tamanho do nosso vetor V. Apesar de ser um pouquinho mais complicado de fazer do que uma multiplica&#231;&#227;o, n&#227;o envolve nenhuma matem&#225;tica super avan&#231;ada. Al&#233;m do mais, calcular o resultado final normalmente &#233; a tarefa do computador: a sua &#233; apenas escrever a f&#243;rmula certa no momento certo e saber interpretar o resultado da maneira certa. Extrair o tamanho de um vetor tem uma nota&#231;&#227;o pr&#243;pria tamb&#233;m. Normalmente escrevemos ||V|| para dizero tamanho do vetor V. A f&#243;rmula para isso &#233; a seguinte:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-76&quot; title=&quot;tamanho_vetor&quot; src=&quot;http://fazerjogos.org/wp-content/uploads/2008/11/tamanho_vetor.png&quot; alt=&quot;&quot; width=&quot;107&quot; height=&quot;34&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Agora digamos que nosso vetor V tem um tamanho t e um sentido e n&#243;s queremos um outro vetor W com exatamente o mesmo sentido mas com um tamanho x que n&#227;o tem uma rela&#231;&#227;o &#243;bvia com t. Como obtemos esse vetor? Um jeito muito f&#225;cil seria se tiv&#233;ssemos um vetor N de tamanho 1 que apontasse no mesmo sentido que V. Da&#237; bastar&#237;amos usar a multiplica&#231;&#227;o por escalar para fazer x*N. O tamanho resultante seria ||N|| = 1 que multiplicado por x ficaria x. Mas como obtemos esse vetor N? N&#243;s dividimos V pelo seu pr&#243;prio tamanho.&lt;/p&gt;
&lt;p&gt;Dividir um vetor pelo seu pr&#243;prio tamanho &#233; uma opera&#231;&#227;o t&#227;o importante e comum que tem um nome pr&#243;prio. &#201; chamada normaliza&#231;&#227;o do vetor. De maneira similar, um vetor que tem um tamanho 1 &#233; chamado de vetor normalizado ou vetor normal em alguns casos. N&#227;o foi por acaso que eu escolhi a letra N para representar o tal vetor ;-).&lt;/p&gt;
&lt;p&gt;Uma coisa legal sobre um vetor normal &#233; que ele representa um sentido de uma maneira mais &amp;#8220;pura&amp;#8221;. Para obter um vetor de qualquer tamanho naquele sentido basta multiplicar o vetor normal pelo tamanho desejado. Dentro de um jogo isso &#233; legal porque podemos querer que um personagem se mova num dado sentido mas com uma rapidez diferente em diferentes instantes de tempo (pode ser que ele esteja caminhando em um momento e correndo em outro). Nesse caso podemos guardar sempre um vetor normalizado para sua dire&#231;&#227;o e um valor correspondente &#224; sua rapidez. Cada vez que movermos o personagem multiplicamos o vetor de dire&#231;&#227;o pela rapidez e somamos &#224; posi&#231;&#227;o dele. Outra coisa legal &#233; que podemos fazer com que ele pare de se mover apenas tornando a rapidez igual a zero.&lt;/p&gt;
&lt;h4&gt;Escolhendo o Sentido dos Vetores&lt;/h4&gt;
&lt;p&gt;Agora que j&#225; sabemos mudar o tamanho dos nossos vetores vamos come&#231;ar a pensar em como criar vetores com o sentido que quisermos. Um jeito intuitivo de pensar em um sentido &#233; pensando em um &#226;ngulo.&lt;/p&gt;
&lt;div id=&quot;attachment_89&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-89&quot; title=&quot;vetor_angulo&quot; src=&quot;http://fazerjogos.org/wp-content/uploads/2008/11/vetor_angulo.png&quot; alt=&quot;Sentido de um vetor a partir de um &#226;ngulo&quot; width=&quot;205&quot; height=&quot;204&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Sentido de um vetor a partir de um &#226;ngulo&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Digamos que tenhamos um determinado &#226;ngulo. Como obter um sentido a partir dele? Usamos o seno e o cosseno. Antes que voc&#234; saia correndo lembrando da sua professora de matem&#225;tica lhe obrigando a decorar uma tabelinha de resultados para fun&#231;&#245;es trigonom&#233;tricas, me deixe lembrar um pequeno detalhe: voc&#234; n&#227;o vai calcular um seno e um cosseno. O computador vai. Existem fun&#231;&#245;es na biblioteca padr&#227;o de praticamente toda linguagem de programa&#231;&#227;o, ent&#227;o n&#227;o tema. Voc&#234; vai apenas usar uma interpreta&#231;&#227;o particular do resultado dessas fun&#231;&#245;es.&lt;/p&gt;
&lt;p&gt;Se pensarmos no nosso &#226;ngulo como sendo em refer&#234;ncia ao eixo x, como mostrado na figura mais acima, &#233; muito f&#225;cil obter as coordenadas que determinam o sentido do nosso vetor. Vamos chamar nosso &#226;ngulo de a (alpha). Se pegarmos as coordenas (cos(a), sen(a)) temos um vetor normalizado que corresponde ao &#226;ngulo que gostar&#237;amos.&lt;/p&gt;
&lt;div id=&quot;attachment_91&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-91&quot; title=&quot;vetor_seno_cosseno&quot; src=&quot;http://fazerjogos.org/wp-content/uploads/2008/11/vetor_seno_cosseno.png&quot; alt=&quot;Sentido a partir de seno e cosseno&quot; width=&quot;205&quot; height=&quot;204&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Sentido a partir de seno e cosseno&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Outra forma intuitiva de pensar sobre o sentido de um vetor &#233; pensando a partir de 2 pontos. Esse &#233; o caso em que pensamos &amp;#8220;eu quero um vetor que aponte do ponto A para o ponto B&amp;#8221;. Obter esse vetor &#233; extremamente simples. Basta subtrair as coordenadas de A das coordenadas de B de forma a obter um vetor com componentes (bx - ax, by - ay). Esse vetor aponta do ponto A para o ponto B. Al&#233;m disso temos um b&#244;nus: o tamanho do vetor obtido &#233; a dist&#226;ncia entre os pontos A e B.&lt;/p&gt;
&lt;div id=&quot;attachment_92&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://fazerjogos.org/wp-content/uploads/2008/11/vetor_ponto_a_ponto.png&quot;&gt;&lt;img class=&quot;size-full wp-image-92&quot; title=&quot;vetor_ponto_a_ponto&quot; src=&quot;http://fazerjogos.org/wp-content/uploads/2008/11/vetor_ponto_a_ponto.png&quot; alt=&quot;Vetor de A para B&quot; width=&quot;240&quot; height=&quot;230&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Vetor de A para B&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Um uso t&#237;pico para um vetor obtido dessa forma &#233; para fazer com que um inimigo persiga o personagem do jogo. Digamos que a posi&#231;&#227;o do personagem seja um ponto chamado P e a do inimigo um ponto chamado I. O vetor P - I aponta na dire&#231;&#227;o do inimigo para o jogador. Ent&#227;o pegamos esse vetor, normalizamos ele e depois multiplicamos pela rapidez com que queremos que nosso inimigo se aproxime do personagem. Depois basta somar o vetor resultante na posi&#231;&#227;o do inimigo. A figura abaixo exemplifica essa situa&#231;&#227;o:&lt;/p&gt;
&lt;div id=&quot;attachment_98&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-98&quot; title=&quot;inimigo&quot; src=&quot;http://fazerjogos.org/wp-content/uploads/2008/11/inimigo.png&quot; alt=&quot;A: P-I &#233; o vetor que aponta de I para P, B:&quot; width=&quot;311&quot; height=&quot;211&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Passo a passo da situa&#231;&#227;o descrita acima&lt;/p&gt;&lt;/div&gt;
&lt;h3&gt;Vetores e Pontos na Programa&#231;&#227;o&lt;/h3&gt;
&lt;p&gt;Procurando na internet &#233; poss&#237;vel encontrar diversas implementa&#231;&#245;es das opera&#231;&#245;es descritas acima. A vers&#227;o mais comum &#233; uma classe de vetor que sobrecarrega operadores de soma, subtra&#231;&#227;o, multiplica&#231;&#227;o, divis&#227;o, etc. e tamb&#233;m tem m&#233;todos para outras opera&#231;&#245;es como a normaliza&#231;&#227;o, por exemplo. Algumas bibliotecas diferenciam pontos de vetores na implementa&#231;&#227;o, mas nem todas. Nesse caso o que fazer?&lt;/p&gt;
&lt;p&gt;Como eu disse algumas vezes durante esse texto, a principal diferen&#231;a entre pontos e vetores &#233; conceitual, ent&#227;o se a biblioteca de programa&#231;&#227;o que voc&#234; usa apenas lhe d&#225; uma classe de vetor e n&#227;o uma de ponto, n&#227;o se preocupe. Voc&#234; pode usar a classe de vetor para representar pontos tamb&#233;m, o importante &#233; interpretar os dois valores num&#233;ricos da maneira mais conveniente para o que voc&#234; estiver fazendo.&lt;/p&gt;
&lt;h3&gt;Conclus&#227;o&lt;/h3&gt;
&lt;p&gt;Minha esperan&#231;a &#233; que esse post atinja pelo menos dois tipos de pessoa: pessoas que est&#227;o iniciando na programa&#231;&#227;o de jogos e ainda n&#227;o chegaram a aprender esses conceitos matem&#225;ticos de uma forma mais aplicada a isso (esse era eu quando estava no Ensino M&#233;dio :-)) e pessoas que t&#234;m interesse em fazer jogos, mas n&#227;o s&#227;o da &#225;rea t&#233;cnica (conhe&#231;o algumas pessoas assim tamb&#233;m). Mais ainda, espero que as pessoas que t&#234;m medo de matem&#225;tica aproveitem para perceber que n&#227;o &#233; fazer um monte de contas, as coisas tem um significado e &#233; quando entendemos ele que tudo come&#231;a a fazer sentido. Olhando desse ponto de vista a matem&#225;tica fica muito mais atraente. Deixe o trabalho duro de calcular as coisas para o computador e comece a se focar no conceito que cada f&#243;rmula representa.&lt;/p&gt;
&lt;p&gt;Bom, chega de recomenda&#231;&#245;es, fico por aqui.&lt;/p&gt;
&lt;p&gt;[]&amp;#8217;s&lt;/p&gt;
		<!--
		&lt;p&gt;&lt;a href=&quot;http://www.pyconbrasil.com.br&quot; 
		title=&quot;PyConBrasil 2008 - 18, 19 e 20 de setembro - Rio de Janeiro&quot;&gt;&lt;img
		src=&quot;http://pyconbrasil.com.br/sobre-o-evento/divulgue-a-pyconbrasil/full_rotativo.gif&quot;
		alt=&quot;PyConBrasil 2008 - Inscreva-se j&aacute;!&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
		-->

		</content>
		<author>
			<name>Kao F&#233;lix</name>
			<uri>http://fazerjogos.org</uri>
		</author>
		<source>
			<title type="html">Fazer Jogos</title>
			<subtitle type="html">jogos, python, software livre e tudo mais</subtitle>
			<link rel="self" href="http://fazerjogos.org/?feed=atom"/>
			<id>http://fazerjogos.org/?feed=atom</id>
			<updated>2008-12-05T09:05:07+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">N&#227;o resisti</title>
		<link href="http://www.dieblinkenlights.com/blog_pt/nao-resisti"/>
		<id>http://www.dieblinkenlights.com/blog_pt/nao-resisti</id>
		<updated>2008-11-21T15:42:08+00:00</updated>
		<content type="html">
		<!--
		&lt;p&gt;&lt;a href=&quot;http://www.pyconbrasil.com.br&quot; 
		title=&quot;PyConBrasil 2008 - 18, 19 e 20 de setembro - Rio de Janeiro&quot;&gt;&lt;img
		src=&quot;http://pyconbrasil.com.br/sobre-o-evento/divulgue-a-pyconbrasil/full_rotativo.gif&quot;
		alt=&quot;PyConBrasil 2008 - Inscreva-se j&aacute;!&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
		-->

		</content>
		<author>
			<name>Ricardo Banffy</name>
			<uri>http://www.dieblinkenlights.com</uri>
		</author>
		<source>
			<title type="html">Blog do Ricardo</title>
			<link rel="self" href="http://www.dieblinkenlights.com/rss.xml"/>
			<id>http://www.dieblinkenlights.com/rss.xml</id>
			<updated>2008-12-05T09:05:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Saiu a Panda 3D 1.5.4</title>
		<link href="http://fazerjogos.org/?p=60"/>
		<id>http://fazerjogos.org/?p=60</id>
		<updated>2008-11-21T00:17:31+00:00</updated>
		<content type="html">&lt;p&gt;Saiu hoje a vers&#227;o 1.5.4 da biblioteca &lt;a href=&quot;http://panda3d.org&quot;&gt;Panda 3D&lt;/a&gt;. Esse release &#233; apenas um bugfix na s&#233;rie 1.5, sem maiores novidades.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-60&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Para quem ainda n&#227;o conhece, a Panda 3D &#233; uma engine 3D para Python bastante completa e cheia de funcionalidades. O release 1.5 trouxe recursos muito legais como a gera&#231;&#227;o autom&#225;tica de shaders para algumas das t&#233;cnicas de renderiza&#231;&#227;o mais comuns. Com isso &#233; poss&#237;vel se beneficiar da qualidade gr&#225;fica providenciada pelas placas 3D program&#225;veis sem precisar escrever seu pr&#243;prio shader no bra&#231;o. A partir da vers&#227;o 1.5.3 a biblioteca de f&#237;sica &lt;a href=&quot;http://www.ode.org/&quot;&gt;Ode&lt;/a&gt; passou a fazer parte da distribui&#231;&#227;o e a Panda 3D agora inclu&#237; seus pr&#243;prios bindings para ela.&lt;/p&gt;
&lt;p&gt;Al&#233;m das novidades a Panda 3D j&#225; contava com v&#225;rios recursos legais:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Implementada em C++, mas usada atrav&#233;s de Python&lt;/li&gt;
&lt;li&gt;F&#225;cil de usar&lt;/li&gt;
&lt;li&gt;Exportadores de modelos para v&#225;rios programas 3D, inclusive um para Blender&lt;/li&gt;
&lt;li&gt;Classes para auxiliar na implementa&#231;&#227;o da l&#243;gica do jogo (agendamento de tarefas, eventos, m&#225;quinas de estado)&lt;/li&gt;
&lt;li&gt;Personagens animados&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.panda3d.org/features.php&quot;&gt;Outras mais&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Apesar de ser uma biblioteca muito legal ela tamb&#233;m possui seus problemas, principalmente para quem j&#225; est&#225; acostumado com o jeito que as coisas normalmente funcionam em Python. Os exemplos e tutoriais da documenta&#231;&#227;o da Panda usam o m&#243;dulo DirectBase que cria um monte de objetos &amp;#8220;m&#225;gicos&amp;#8221; no namespace global do seu programa. Al&#233;m disso ela n&#227;o tem uma hierarquia de m&#243;dulos bem organizada e sua API ainda guarda muitas semelhan&#231;as com C++, sem tirar total proveito dos recursos da linguagem Python.&lt;/p&gt;
		<!--
		&lt;p&gt;&lt;a href=&quot;http://www.pyconbrasil.com.br&quot; 
		title=&quot;PyConBrasil 2008 - 18, 19 e 20 de setembro - Rio de Janeiro&quot;&gt;&lt;img
		src=&quot;http://pyconbrasil.com.br/sobre-o-evento/divulgue-a-pyconbrasil/full_rotativo.gif&quot;
		alt=&quot;PyConBrasil 2008 - Inscreva-se j&aacute;!&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
		-->

		</content>
		<author>
			<name>Kao F&#233;lix</name>
			<uri>http://fazerjogos.org</uri>
		</author>
		<source>
			<title type="html">Fazer Jogos</title>
			<subtitle type="html">jogos, python, software livre e tudo mais</subtitle>
			<link rel="self" href="http://fazerjogos.org/?feed=atom"/>
			<id>http://fazerjogos.org/?feed=atom</id>
			<updated>2008-12-05T09:05:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Game Loop</title>
		<link href="http://fazerjogos.org/?p=18"/>
		<id>http://fazerjogos.org/?p=18</id>
		<updated>2008-11-20T19:07:28+00:00</updated>
		<content type="html">&lt;p&gt;Faz um tempo eu consegui autoriza&#231;&#227;o do &lt;a href=&quot;http://dewitters.koonsolo.com&quot;&gt;Koen Witters&lt;/a&gt; para traduzir um &lt;a href=&quot;http://dewitters.koonsolo.com/gameloop.html&quot;&gt;excelente artigo dele sobre Game Loops&lt;/a&gt;. Al&#233;m de traduzir o texto tamb&#233;m traduzi os exemplos de C para Python. Vale dizer que minha tradu&#231;&#227;o de c&#243;digo n&#227;o foi muito idiom&#225;tica e o c&#243;digo ainda parece um pouco C-like, mas isso tamb&#233;m ajuda a n&#227;o distrair do prop&#243;sito da explica&#231;&#227;o e entrar em detalhes de Python.&lt;/p&gt;
&lt;p&gt;Eu&lt;a href=&quot;http://www.pythonbrasil.com.br/moin.cgi/GameLoop&quot;&gt; publiquei a tradu&#231;&#227;o j&#225; no wiki da Python Brasil&lt;/a&gt; e agora estou publicando ela aqui tamb&#233;m. Espero que ajude voc&#234;s como j&#225; me ajudou tamb&#233;m &lt;img src=&quot;http://fazerjogos.org/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-18&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Introdu&#231;&#227;o&lt;/h3&gt;
&lt;p&gt;O &amp;#8220;game loop&amp;#8221; &#233; o batimento card&#237;aco de todo jogo, nenhum jogo pode ser executado sem ele. Mas, infelizmente para novos programadores de jogo, n&#227;o h&#225; bons artigos na Internet que fornecem a informa&#231;&#227;o adequada sobre este tema. Mas n&#227;o tema, porque voc&#234; acabou de esbarrar no &#250;nico artigo que d&#225; ao &amp;#8220;game loop&amp;#8221; a aten&#231;&#227;o que merece.&lt;/p&gt;
&lt;p&gt;Gra&#231;as ao meu trabalho como programador de jogos, entrei em contato com um monte de c&#243;digo de pequenos jogos para dispositivos m&#243;veis. E sempre me impressiona quantos implementa&#231;&#245;es de &amp;#8220;game loop&amp;#8221; que existem por a&#237;. Voc&#234; pode estar se perguntando como algo simples assim pode ser escrito de formas diferentes. Pois bem, pode, e eu vou discutir os pr&#243;s e os contras das mais populares implementa&#231;&#245;es, e dar-lhe a (na minha opini&#227;o) melhor solu&#231;&#227;o de implementa&#231;&#227;o de um &amp;#8220;game loop&amp;#8221;.&lt;/p&gt;
&lt;h3&gt;O &amp;#8220;Game Loop&amp;#8221;&lt;/h3&gt;
&lt;p&gt;Cada jogo consiste de uma seq&#252;&#234;ncia de pegar a entrada do usu&#225;rio, atualizar o estado do jogo, lidar com a IA, tocar m&#250;sica e efeitos sonoros, e mostrar o jogo. Esta seq&#252;&#234;ncia &#233; tratada atrav&#233;s do &amp;#8220;game loop&amp;#8221;. Assim como eu disse na introdu&#231;&#227;o, o &amp;#8220;game loop&amp;#8221; &#233; o batimento card&#237;aco de cada jogo. Neste artigo, n&#227;o irei entrar em detalhes sobre qualquer uma das tarefas acima mencionadas, mas que irei me concentrar no &amp;#8220;game loop&amp;#8221; em si. Por isso tamb&#233;m reduzi as tarefas a apenas duas fun&#231;&#245;es: Atualizar o jogo e exibi-lo.&lt;/p&gt;
&lt;p&gt;Eis alguns exemplos c&#243;digo do &amp;#8220;game loop&amp;#8221; em sua forma mais simples:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;python python&quot;&gt;jogo_rodando = &lt;span&gt;True&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;while&lt;/span&gt; jogo_rodando:
    atualizar_jogo&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
    desenhar_jogo&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;O problema com este &amp;#8220;loop&amp;#8221; simples &#233; que ele n&#227;o controla o tempo, o jogo s&#243; &#233; executado. Em um hardware mais lento o jogo vai rodar mais devagar e mais r&#225;pido com hardware mais r&#225;pido. De volta aos velhos tempos, quando a velocidade do hardware era conhecida, isso n&#227;o era um problema, mas atualmente existem tantas plataformas de hardware por a&#237;, que temos que implementar algum tipo de gerenciamento de tempo. H&#225; muitas maneiras de fazer isso, e eu vou discuti-las nas se&#231;&#245;es seguintes.&lt;/p&gt;
&lt;p&gt;Em primeiro lugar, deixe-me explicar 2 termos que s&#227;o usados em todo este artigo:&lt;/p&gt;
&lt;h4&gt;FPS&lt;/h4&gt;
&lt;p&gt;FPS &#233; uma abreviatura de frames por segundo. No contexto da execu&#231;&#227;o acima referido, &#233; o n&#250;mero de vezes desenhar_jogo() &#233; chamada por segundo.&lt;/p&gt;
&lt;h4&gt;Velocidade de Jogo&lt;/h4&gt;
&lt;p&gt;Velocidade de Jogo &#233; o n&#250;mero de vezes que o estado do jogo &#233; atualizado por segundo, ou, em outras palavras, o n&#250;mero de vezes que atualizar_jogo() &#233; chamada por segundo.&lt;/p&gt;
&lt;h3&gt;FPS dependente de Velocidade de Jogo Constante&lt;/h3&gt;
&lt;h4&gt;Implementa&#231;&#227;o&lt;/h4&gt;
&lt;p&gt;Uma solu&#231;&#227;o f&#225;cil para a quest&#227;o do tempo &#233; apenas deixar o jogo correr em uma velocidade fixa de 25 frames por segundo. O c&#243;digo ent&#227;o tem esta apar&#234;ncia:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;python python&quot;&gt;&lt;span&gt;import&lt;/span&gt; &lt;span&gt;time&lt;/span&gt;
&lt;span&gt;import&lt;/span&gt; pygame
&amp;nbsp;
FRAMES_PER_SECOND = &lt;span&gt;25&lt;/span&gt;
SKIP_TICKS = &lt;span&gt;1000&lt;/span&gt; / FRAMES_PER_SECOND
&amp;nbsp;
pygame.&lt;span&gt;init&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
next_game_tick = pygame.&lt;span&gt;time&lt;/span&gt;.&lt;span&gt;get_ticks&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;# pygame.time.get_ticks() retorna o n&#250;mero atual de milisegundos&lt;/span&gt;
&lt;span&gt;# decorridos desde que o sistema foi iniciado&lt;/span&gt;
&amp;nbsp;
sleep_time = 0
game_is_running = &lt;span&gt;True&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;while&lt;/span&gt; game_is_running:
    atualizar_jogo&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
    desenhar_jogo&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp;
    next_game_tick + = SKIP_TICKS
    sleep_time = next_game_tick - pygame.&lt;span&gt;time&lt;/span&gt;.&lt;span&gt;get_ticks&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
    &lt;span&gt;if&lt;/span&gt; sleep_time &lt;span&gt;&amp;gt;&lt;/span&gt;= 0:
        &lt;span&gt;time&lt;/span&gt;.&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;sleep_time&lt;span&gt;&amp;#41;&lt;/span&gt;
    sen&#227;o:
        &lt;span&gt;# Droga, estamos ficando para tr&#225;s!&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Esta solu&#231;&#227;o tem uma enorme vantagem: &#233; simples! Uma vez que voc&#234; sabe que atualizar_jogo() &#233; chamada 25 vezes por segundo, escrever o c&#243;digo do seu jogo &#233; bastante simples. Por exemplo, a implementa&#231;&#227;o de uma fun&#231;&#227;o de &amp;#8220;replay&amp;#8221; neste tipo de &amp;#8220;game loop&amp;#8221; &#233; f&#225;cil. Se valores aleat&#243;rios n&#227;o forem utilizados no jogo, voc&#234; pode apenas registrar a entrada do usu&#225;rio e repic&#225;-la posteriormente.&lt;/p&gt;
&lt;p&gt;No seu hardware de teste voc&#234; pode adaptar FRAMES_PER_SECOND a um valor ideal, mas o que ir&#225; acontecer em um hardware que for mais r&#225;pido ou mais lento? Bem, vamos descobrir.&lt;/p&gt;
&lt;h4&gt;Hardware Lento&lt;/h4&gt;
&lt;p&gt;Se o hardware ag&#252;enta o FPS definido, n&#227;o h&#225; problema. Mas os problemas v&#227;o come&#231;ar quando o hardware n&#227;o puder lidar com ele. O jogo vai rodar mais devagar. No pior dos casos o jogo tem algumas partes mais pesadas onde ele vai rodar muito lenta e outras onde ele vai rodar normal. O tempo se torna vari&#225;vel, o que pode fazer seu jogo ficar injog&#225;vel.&lt;/p&gt;
&lt;h4&gt;Hadware r&#225;pido&lt;/h4&gt;
&lt;p&gt;O jogo n&#227;o ter&#225; problemas com hardware r&#225;pido, mas voc&#234; est&#225; desperdi&#231;ando muitos ciclos de &amp;#8220;clock&amp;#8221; preciosos. Rodar um jogo em 25 ou 30 FPS quando ele poderia facilmente rodar a 300 FPS&amp;#8230; que vergonha! Voc&#234; vai perder uma grande quantidade de apelo visual nessa situa&#231;&#227;o, especialmente com objetos que se movimentam rapidamente.&lt;/p&gt;
&lt;p&gt;Por outro lado, com dispositivos m&#243;veis, isso pode ser visto como uma vantagem. N&#227;o deixando o jogo rodar constantemente em seu extremo poderia poupar algum tempo de bateria.&lt;/p&gt;
&lt;h4&gt;Conclus&#227;o&lt;/h4&gt;
&lt;p&gt;Tornar o FPS dependente de uma velocidade de jogo constante &#233; uma solu&#231;&#227;o que &#233; implementada rapidamente e mant&#233;m o c&#243;digo do jogo simples. Mas existem alguns problemas: Definir um FPS alto vai causar problemas com hardware mais lento, e defini&#231;&#227;o de um FPS baixo ir&#225; desperdi&#231;ar apelo visual em hardware r&#225;pido.&lt;/p&gt;
&lt;h3&gt;Velocidade de Jogo dependente de FPS Vari&#225;vel&lt;/h3&gt;
&lt;h4&gt;Implementa&#231;&#227;o&lt;/h4&gt;
&lt;p&gt;Outra forma de implementar um &amp;#8220;game loop&amp;#8221; &#233; deix&#225;-lo correr o mais r&#225;pido poss&#237;vel, e deixar o FPS ditar a velocidade do jogo. O jogo &#233; atualizado com a diferen&#231;a de tempo do quadro anterior.&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;python python&quot;&gt;&lt;span&gt;# imports e incializa&#231;&#227;o omitidos&lt;/span&gt;
&amp;nbsp;
prev_frame_tick
curr_frame_tick = pygame.&lt;span&gt;time&lt;/span&gt;.&lt;span&gt;get_ticks&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp;
game_is_running = &lt;span&gt;True&lt;/span&gt;
&lt;span&gt;while&lt;/span&gt; game_is_running:
    prev_frame_tick = curr_frame_tick
    curr_frame_tick = pygame.&lt;span&gt;time&lt;/span&gt;.&lt;span&gt;get_ticks&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp;
    atualizar_jogo&lt;span&gt;&amp;#40;&lt;/span&gt;curr_frame_tick - prev_frame_tick&lt;span&gt;&amp;#41;&lt;/span&gt;
    desenhar_jogo&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;O c&#243;digo do jogo torna-se um pouco mais complicado, pois temos agora que considerar a diferen&#231;a de tempo na fun&#231;&#227;o atualizar_jogo(). Mas ainda assim, n&#227;o &#233; t&#227;o dif&#237;cil.&lt;/p&gt;
&lt;p&gt;&#192; primeira vista, esta parece a solu&#231;&#227;o ideal para o nosso problema. Eu tenho visto muitos programadores espertos implementar este tipo de &amp;#8220;game loop&amp;#8221;. Alguns deles teriam provavelmente desejariam ter lido este artigo antes de implementar o seu &amp;#8220;loop&amp;#8221;. Vou mostrar-lhe em um minuto que este &amp;#8220;loop&amp;#8221; pode ter s&#233;rios problemas em hardware lento e tamb&#233;m em hardware r&#225;pido (sim, R&#193;PIDO!).&lt;/p&gt;
&lt;h4&gt;Hardware Lento&lt;/h4&gt;
&lt;p&gt;Hardware lento pode causar alguns atrasos, &#224;s vezes, em alguns pontos onde o jogo fica &amp;#8220;pesado&amp;#8221;. Isto pode definitivamente acontecer com um jogo 3D onde, em um determinado per&#237;odo de tempo, pol&#237;gonos demais s&#227;o exibidos. Esta queda na taxa de frames ir&#225; afetar o tempo de resposta da entrada e, por conseguinte, o tempo de rea&#231;&#227;o do jogador tamb&#233;m. A atualiza&#231;&#227;o do jogo tamb&#233;m ir&#225; sentir o atraso e o estado do jogo ser&#225; atualizado em grandes fatias de tempo. Como resultado o tempo de rea&#231;&#227;o do jogador, e tamb&#233;m o da IA, vai ficar mais devagar e pode fazer uma simples manobra falhar, ou at&#233; mesmo ficar imposs&#237;vel. Por exemplo, um obst&#225;culo que poderia ser evitado com um FPS normal, pode se tornar imposs&#237;vel de evitar com um FPS baixo. Um problema mais grave com o hardware lento &#233; que quando se utiliza f&#237;sica, sua simula&#231;&#227;o pode at&#233; mesmo [http://www.gaffer.org/game-physics/fix-your-timestep explodir]!&lt;/p&gt;
&lt;h4&gt;Hardware R&#225;pido&lt;/h4&gt;
&lt;p&gt;Voc&#234; provavelmente est&#225; se perguntando como o &amp;#8220;game loop&amp;#8221; acima pode dar errado em hardware r&#225;pido. Infelizmente pode e para lhe mostrar como, deixe-me primeiro explicar algumas coisas sobre como funciona a matem&#225;tica em computadores.&lt;/p&gt;
&lt;p&gt;O espa&#231;o de mem&#243;ria de um valor float ou double &#233; limitado, ent&#227;o alguns valores n&#227;o podem ser representados. Por exemplo, 0.1 n&#227;o pode ser representado em bin&#225;rio e, por conseguinte, &#233; arredondado quando armazenados em um double. Permita mostrar-lhe utilizando um shell interativo de python:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;python python&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span&gt;0.1&lt;/span&gt;
&lt;span&gt;0.10000000000000001&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Isso por si s&#243; n&#227;o &#233; dram&#225;tico, mas as consequ&#234;ncias s&#227;o. Digamos que voc&#234; tem um carro de corrida que tem uma velocidade de 0.001 unidades por milisegundo. Ap&#243;s 10 segundos o seu carro de corrida ter&#225; viajado uma dist&#226;ncia de 10.0. Se voc&#234; dividir este c&#225;lculo como um jogo iria fazer, voc&#234; tem as seguintes fun&#231;&#245;es utilizando frames por segundo como entrada:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;python python&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span&gt;def&lt;/span&gt; get_distance&lt;span&gt;&amp;#40;&lt;/span&gt; fps &lt;span&gt;&amp;#41;&lt;/span&gt;:
...     &lt;span&gt;skip_ticks&lt;/span&gt; = &lt;span&gt;1000&lt;/span&gt; / fps
...     &lt;span&gt;total_ticks&lt;/span&gt; = 0
...     &lt;span&gt;distance&lt;/span&gt; = &lt;span&gt;0.0&lt;/span&gt;
...     &lt;span&gt;speed_per_tick&lt;/span&gt; = &lt;span&gt;0.001&lt;/span&gt;
...     &lt;span&gt;while&lt;/span&gt; total_ticks &lt;span&gt;&amp;lt;&lt;/span&gt; &lt;span&gt;10000&lt;/span&gt;:
...         &lt;span&gt;distance&lt;/span&gt; += speed_per_tick &lt;span&gt;*&lt;/span&gt; skip_ticks
...         &lt;span&gt;total_ticks&lt;/span&gt; += skip_ticks
...     &lt;span&gt;return&lt;/span&gt; distance&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Agora podemos calcular a dist&#226;ncia em 40 frames por segundo:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;python python&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; get_distance&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;40&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;10&lt;/span&gt;,000000000000075&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Espere um pouco&amp;#8230; n&#227;o &#233; 10.0??? O que aconteceu? Pois bem, porque dividimos o c&#225;lculo em 400 adi&#231;&#245;es, o erro de arredondamento cresceu. Fico pensando o que ir&#225; acontecer a 100 quadros por segundo &amp;#8230;&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;python python&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; get_distance&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;9&lt;/span&gt;,&lt;span&gt;9999999999998312&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;O que??? O erro &#233; ainda maior!! Pois bem, por termos mais adi&#231;&#245;es em 100 fps, o erro de arredondamento tem mais chances de aumentar. Portanto, o jogo ser&#225; diferente quando rodando em 40 ou 100 frames por segundo:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;python python&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; get_distance&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;40&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; - get_distance&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
2.4336088699783431e-13&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Voc&#234; pode pensar que essa diferen&#231;a &#233; pequena demais para ser vista no jogo em si. Mas o problema real vai come&#23