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

<channel>
	<title>lucmult</title>
	<atom:link href="http://blog.lucmult.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.lucmult.com.br</link>
	<description>Python, Django and Plone</description>
	<lastBuildDate>Thu, 12 Nov 2009 01:30:48 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Sprint Plone no Plone Symposium</title>
		<link>http://blog.lucmult.com.br/2009/11/sprint-plone-no-plone-symposium/</link>
		<comments>http://blog.lucmult.com.br/2009/11/sprint-plone-no-plone-symposium/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 01:30:48 +0000</pubDate>
		<dc:creator>lucmult</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Plone]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.lucmult.com.br/?p=124</guid>
		<description><![CDATA[Nossa já faz 2 meses que não escrevo! 
Esse post é fruto da minha empolgação com Sprint que vai rolar na Simples após o Plone Symposium.







Vou participar de 2 dias de Sprint com pessoas importantes como Alexander Limi, Eric Steele e Dorneles Treméa e poder me divertir trabalhando a favor do noss Plone!

Vocês também podem [...]]]></description>
			<content:encoded><![CDATA[<p>Nossa já faz 2 meses que não escrevo! </p>
<p>Esse post é fruto da minha empolgação com Sprint que vai rolar na <a href="http://www.simplesconsultoria.com.br/">Simples</a> após o <a href="http://www.plonesymposium.com.br">Plone Symposium</a>.</p>
<div>
<a href="http://www.plonesymposium.com.br/" title="Plone Symposium South America"><br />
<img src="http://www.plonesymposium.com.br/divulgue/fullbanner.gif" alt="Plone Symposium South America" /><br />
</a>
</div>
<p></p>
<p>
Vou participar de 2 dias de Sprint com pessoas importantes como Alexander Limi, Eric Steele e Dorneles Treméa e poder me divertir trabalhando a favor do noss Plone!
</p>
<p>Vocês também podem participar, não &#8220;<em>perdam</em>&#8220;! </p>
<p>Vejam a <a href="http://www.plonesymposium.com.br/programacao/programacao">programação</a>.</p>
<p>Eu tenho interesse particular <a href="http://dev.plone.org/plone/ticket/8862">num bug</a> que já trabalhei mais ainda não consegui corrigir.</p>
<p>Além disso no evento haverá os OpenSpaces, onde poderemos trocar experiências. Nesse caso um dos meus interesses será falar sobre testes no Zope/Plone.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lucmult.com.br/2009/11/sprint-plone-no-plone-symposium/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Relato PythonBrasil[5]</title>
		<link>http://blog.lucmult.com.br/2009/09/relato-pythonbrasil5/</link>
		<comments>http://blog.lucmult.com.br/2009/09/relato-pythonbrasil5/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 03:14:05 +0000</pubDate>
		<dc:creator>lucmult</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[apyb]]></category>

		<guid isPermaLink="false">http://blog.lucmult.com.br/?p=116</guid>
		<description><![CDATA[Foi ótima a PythonBrasil[5].
Primeiramente quero começar dizendo que aqui é um relato pessoal e vou tentar evitar falar das coisas óbvias, como elogiar e/ou agradecer Luciano Ramalho, Senra, Deo, Niemeyer, e outros.
O nosso evento foi muito bom, mesmo Caxias tentando diminuir o seu brilho, com muito frio, neblina e chuva.
Comecei perdendo a palestra do Jacob, [...]]]></description>
			<content:encoded><![CDATA[<p>Foi ótima a PythonBrasil[5].</p>
<p>Primeiramente quero começar dizendo que aqui é um relato pessoal e vou tentar evitar falar das coisas óbvias, como elogiar e/ou agradecer Luciano Ramalho, Senra, Deo, Niemeyer, e outros.</p>
<p>O nosso evento foi muito bom, mesmo Caxias tentando diminuir o seu brilho, com muito frio, neblina e chuva.</p>
<p>Comecei perdendo a palestra do Jacob, devido ao mau tempo de Caxias que atrasou meu voo.</p>
<p>Senti falta de grandes amigos como Bruno Gola, Humberto Diógenes, Werneck, Daniel Cassiano, Lameiro, outros e até o Andrews Medina que estava lá mas nos encontramos pouco.</p>
<p>Aliás, um puxão de orelha para mim, que nessa PythonBrasil, conversei pouco com novas pessoas.</p>
<p>Só no último dia vi quem era o Kao, mau conversei com o nosso promotor do pypy, Santagada, o divertidíssimo ikke e o nosso programador do ano Marinho.</p>
<p>O Marinho com sua palestra relâmpago me convenceu a dar uma olhada no seu &#8220;filho&#8221; Geraldo Reports.</p>
<p>Vale mais um agradecimento ao Bruno (e ao Yahoo!) e ao xiru que me forneceram caronas nos primeiros dias de boa vontade. <img src='http://blog.lucmult.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Conheci várias coisas que posso passar a utilizar, o Rudá Figueiras, me mostrou alguns benchmarks com o Zope/Plone, e a ferramente de benchmark FunkLoad &#8211; http://funkload.nuxeo.org/ que certamente vamos usar na Simples.</p>
<p>Na palestra Django Apps do Leandro Zanuz, que eu cheguei no finalzinho, eu vi que ele utilizou uma ferramenta legal para o analisar os dados de profile, eu já fiz uns profilers em alguns casos e essa ferramenta pareceu bem útil, mas preciso descobrir qual é. :-/</p>
<h2>Alguns fatos em ordem cronológica:</h2>
<p>O finalzinho da palestra do Santagada sobre o compilador JavaScript do pypy, me deixou mais motivado a tentar o pypy.</p>
<p>Enquanto o Rudá me mostrava o benchemark do Zope/Plone eu perdia a palestra do Bruno e do Rodrigo Bamboo, que vi só o finalzinho e todos elogiaram, evento bom é isso, enquanto você algo legal você perde outras coisas bem legais.</p>
<p>A palestra do Colin sobre a turbinada que eles estão fazendo no nosso CPython, me deixou mais motivado a estudar o CPython.</p>
<p>A palestra do Niemeyer colocou todos para pensar sobre as nossas qualidades e defeitos enquanto liguagem e comunidade, comparando-os com Java.</p>
<p>O GIL (Global Interpreter Lock), foi referenciado diversas vezes no evento e normalmente citando-o como uma limitação de nossa implementação padrão. </p>
<p>O fato engraçado foi que na palestra do Niemeyer, quando ele começou a criticar o GIL a chuva que nunca parava de cair, virou uma tempetade que fazia um barulho dificultando ouvir a palestra.</p>
<h2>A APyB</h2>
<p>Tivemos nossa Assembléia, e a votação para a nova Diretoria, agora eu sou Diretor Administrativo. <img src='http://blog.lucmult.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Depois tivemos um debate sobre a nossa postura sobre as PythonBrasis, porque não tivemos nenhum candidatura no prazo. Prazo prorrogado por 4 semanas. E Curitiba é uma forte candidata.</p>
<p>Minha Palestra</p>
<p>Minha palestra foi após a do Gustavo Niemeyer, entre nossos palestras teve a foto do evento. </p>
<p>Na minha palestra ficaram poucas pessoas. <img src='http://blog.lucmult.com.br/blog/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' />  E não sube utilizar bem o tempo.</p>
<p>A material já está on-line, pode ser visto <a href="http://www.pythonbrasil.org.br/2009/sobre-o-evento/slides/ddd.py/view">aqui</a> .</p>
<p>Agora é nos prepararmos para começar oreganizar a Python Brasil [6].</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lucmult.com.br/2009/09/relato-pythonbrasil5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Django + AMF + Flex</title>
		<link>http://blog.lucmult.com.br/2009/08/django-amf-flex/</link>
		<comments>http://blog.lucmult.com.br/2009/08/django-amf-flex/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 18:40:29 +0000</pubDate>
		<dc:creator>lucmult</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.lucmult.com.br/?p=100</guid>
		<description><![CDATA[
Hoje fui almoçar na casa da mamãe e levei o note &#8211; o macluck. Meu pai estava lá estudando o C# com o Flex, que eles estão começando a utlizar na  Mult . 

O assunto foi o que utilizar entre o .Net e o Flex? Web Service (xml), JSON ou qualquer outra coisa.
Com isso [...]]]></description>
			<content:encoded><![CDATA[<p>
Hoje fui almoçar na casa da mamãe e levei o note &#8211; o macluck. Meu pai estava lá estudando o C# com o Flex, que eles estão começando a utlizar na <a href="http://multprocessing.com.br"> Mult </a>. </p>
<p>
O assunto foi o que utilizar entre o .Net e o Flex? Web Service (xml), JSON ou qualquer outra coisa.</p>
<p>Com isso fiquei pensando nas alternativas em Python e pesquisando o pessoal recomenda utilizar o formato AMF para serializar e transmitir objetos do servidor para o cliente Flex.</p>
<p>Logo pensei em tentar fazer algo em Django + AMF.</p>
<p>E é isso que vamos ver, faremos um Hello World. <img src='http://blog.lucmult.com.br/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><h2> O que precisamos ? </h2>
<p>Django, SQLite e DjangoAMF no servidor para conseguirmos enviar objetos para o cliente Flex.</p>
<p>Flex SDK para compilarmos os fontes Flex e gerarmos o .swf que irá rodar no browser.</p>
<p>O Flex roda no Flash Player, portante você precisará dele também, mas hoje em dia todo mundo tem, afinal precisamos assistir ao YouTube. <img src='http://blog.lucmult.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h2> Instanlando o Flex SDK </h2>
<p>Faça o download do <a href="http://download.macromedia.com/pub/flex/sdk/flex_sdk_3.zip"> Flex SDK </a>, esse é um arquivão gigante com o Flex SDK compilado para as 3 plataformas (Linux, Mac e Win), ou seja basta descompactar em uma pasta que está pronto.</p>
<p>Mas crie uma pasta só para esse arquivo .zip, pois ele irá criar tudo na pasta em que ele está.</p>
<p>Então façamos isso:</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ <span class="kw2">mkdir</span> -p ~<span class="sy0">/</span>bin<span class="sy0">/</span>flex-sdk &nbsp; <span class="co0"># vou colocar no diretório bin na home do meu usuário</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ <span class="kw3">cd</span> ~<span class="sy0">/</span>bin<span class="sy0">/</span>flex-sdk</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ <span class="kw2">wget</span> http:<span class="sy0">//</span>download.macromedia.com<span class="sy0">/</span>pub<span class="sy0">/</span><span class="kw2">flex</span><span class="sy0">/</span>sdk<span class="sy0">/</span>flex_sdk_3.<span class="kw2">zip</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ <span class="kw2">unzip</span> flex_sdk_3.<span class="kw2">zip</span></div>
</li>
</ol>
</div>
<p>Vamos testar compilando um exemplo:</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ <span class="kw3">cd</span> ~<span class="sy0">/</span>bin<span class="sy0">/</span>flex-sdk<span class="sy0">/</span>samples<span class="sy0">/</span>explorer</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ .<span class="sy0">/</span>build.<span class="kw2">sh</span> <span class="co0"># ou &#39;sh build.sh&#39; ou no windows &#39;build.bat&#39;</span></div>
</li>
</ol>
</div>
<p>Agora verifque se funcionou abrindo o arquivo ~/bin/flex-sdk/samples/explorer/explorer.html </p>
<p>Você verá algo como: </p>
<p><img class="alignnone size-full wp-image-103" title="flex_explorer" src="http://blog.lucmult.com.br/blog/wp-content/uploads/2009/08/flex_explorer.png" alt="Flex Explorer" width="640" height="289" /></p>
<h2> Vamos para o Django </h2>
<p>Eu utilizo o virtualenv, mas você pode fazer sem ele se você preferir.</p>
<p>Criando o virtualenv, o importante é utilizar pelo menos o Python 2.5, pois o DjangoAMF requer.</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ <span class="kw3">cd</span> ~<span class="sy0">/</span>src_rm <span class="co0"># diretório onde deixo os fontes que desenvolvo</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ virtualenv django_flex</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ <span class="kw3">cd</span> django_flex </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ <span class="kw3">source</span> bin<span class="sy0">/</span>activate</div>
</li>
</ol>
</div>
<p>Instalar o Django 1.1 e o DjangoAMF:</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ easy_install django </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ <span class="kw2">mkdir</span> src &nbsp; <span class="co0"># ~/src_rm/django_flex/src</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ <span class="kw3">cd</span> src</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ <span class="kw2">wget</span> http:<span class="sy0">//</span>globalbase.dl.sourceforge.jp<span class="sy0">/</span>djangoamf<span class="sy0">/</span><span class="nu0">36602</span><span class="sy0">/</span>djangoamf<span class="nu0">-0.8</span>.<span class="kw2">zip</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ <span class="kw2">unzip</span> djangoamf<span class="nu0">-0.8</span>.<span class="kw2">zip</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ <span class="kw3">cd</span> djangoamf<span class="nu0">-0.8</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ python setup.py <span class="kw2">install</span></div>
</li>
</ol>
</div>
<h2> Criando uma aplicação django </h2>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ <span class="kw3">cd</span> ~<span class="sy0">/</span>src_rm<span class="sy0">/</span>django_flex</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ django-admin.py startproject mysite</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ <span class="kw3">cd</span> mysite</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ python manage.py startapp teste</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ vi settings.py</div>
</li>
</ol>
</div>
<p>Configure no settings.py, o banco de dados e adicione o Middleware do DjangoAMF que permitirá enviar os objetos pelo protocolo AMF.</p>
<div class="geshi no python">
<div class="head">Arquivo: mysite/settings.py</div>
<ol>
<li class="li1">
<div class="de1">DATABASE_ENGINE = <span class="st0">&#39;sqlite3&#39;</span></div>
</li>
<li class="li1">
<div class="de1">DATABASE_NAME = <span class="st0">&#39;mydb.db&#39;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&#8230;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="me1">MIDDLEWARE_CLASSES</span> = <span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&#8230;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&#39;amf.django.middleware.AMFMiddleware&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Agora vamos fazer um método que será chamado pelo Flex:</p>
<div class="geshi no python">
<div class="head">Arquivo: mysite/teste/views.py</div>
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> <span class="kw3">datetime</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> horaAgora<span class="br0">&#40;</span>request<span class="br0">&#41;</span>: &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">datetime</span>.<span class="kw3">datetime</span>.<span class="me1">now</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Vamos configurar para essse método utilizar o AMF:</p>
<div class="geshi no python">
<div class="head">Arquivo: mysite/urls.py</div>
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">urlpatterns = patterns<span class="br0">&#40;</span><span class="st0">&#39;&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&#8230;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="me1"><span class="br0">&#40;</span>r</span><span class="st0">&#39;^gateway/teste/(.*)&#39;</span>, <span class="st0">&#39;amf.django.views&#39;</span>, <span class="br0">&#123;</span><span class="st0">&#39;views&#39;</span>: <span class="st0">&#39;mysite.teste.views&#39;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Isso é o básico para você conseguir fazer a chamada no Flex.</p>
<h2> Fazendo o nosso cliente Flex </h2>
<p>Eu vou utilizar o Flex sem o Flex Builder que é pago, você pode fazer com Flex Builder, ou se você tiver no Windows com o FlashDevelop, que dá para trabalhar muito bem com o Flex.</p>
<p>Eu fiz o cliente Flex em outra pasta fora do Django e do virtualenv, para dar a idéia de ser totalmente separado, só fazendo a chamada via HTTP (e AMF).</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp;$ <span class="kw3">cd</span> src_rm</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;$ <span class="kw2">mkdir</span> flex_cliente</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;$ <span class="kw3">cd</span> flex_cliente</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;$ vi hora_servidor.mxml</div>
</li>
</ol>
</div>
<p>Agora vem a parte que eu não conheço muito e praticamente só copiei <a href="http://chevitarese.wordpress.com/2009/07/24/django-django-e-flex-1%C2%B0-exemplo"> daqui </a>.</p>
<p>Muito embora, eu também não domino o Django eu comecei a estudar ele a pouco tempo e não sei muito não. :-/</p>
<div class="geshi no actionscript">
<div class="head">Arquivo: hora_servidor.mxml</div>
<ol>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>?<span class="kw3">xml</span> <span class="kw3">version</span>=<span class="st0">&quot;1.0&quot;</span> encoding=<span class="st0">&quot;utf-8&quot;</span> ?<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>mx:Application xmlns:mx=<span class="st0">&quot;http://www.adobe.com/2006/mxml&quot;</span> layout=<span class="st0">&quot;absolute&quot;</span> creationComplete=<span class="st0">&quot;getTime()&quot;</span><span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>mx:Script<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sy0">&lt;!</span><span class="br0">&#91;</span>CDATA<span class="br0">&#91;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">import</span> mx.<span class="me1">controls</span>.<span class="me1">Alert</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">import</span> mx.<span class="me1">rpc</span>.<span class="me1">events</span>.<span class="me1">ResultEvent</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">import</span> mx.<span class="me1">rpc</span>.<span class="me1">events</span>.<span class="me1">FaultEvent</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">import</span> mx.<span class="me1">rpc</span>.<span class="me1">remoting</span>.<span class="me1">mxml</span>.<span class="me1">RemoteObject</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">private</span> <span class="kw2">function</span> <span class="kw3">getTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span>: <span class="kw3">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">var</span> ro: RemoteObject;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;ro = <span class="kw2">new</span> RemoteObject<span class="br0">&#40;</span><span class="st0">&quot;teste&quot;</span><span class="br0">&#41;</span>; <span class="co1">// Aqui é o nome do objeto remoto, no nosso caso temos apenas uma função, mas o que está após o /gateway/ no urls.py, será considerado o objeto remote</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;ro.<span class="me1">endpoint</span> = <span class="st0">&#39;http://127.0.0.1:8000/gateway/&#39;</span> &nbsp;<span class="co1">// URL do que chama-se de gateway</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;ro.<span class="me1">addEventListener</span><span class="br0">&#40;</span>FaultEvent.<span class="me1">FAULT</span>, getErro<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;ro.<span class="me1">addEventListener</span><span class="br0">&#40;</span>ResultEvent.<span class="me1">RESULT</span>, showResult<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;ro.<span class="me1">getOperation</span><span class="br0">&#40;</span><span class="st0">&#39;horaAgora&#39;</span><span class="br0">&#41;</span>.<span class="kw3">send</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; &nbsp; <span class="co1">// nome do método do objeto remoto</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">public</span> <span class="kw2">function</span> getErro<span class="br0">&#40;</span>ro:FaultEvent<span class="br0">&#41;</span>: <span class="kw3">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;Alert.<span class="kw3">show</span><span class="br0">&#40;</span>ro.<span class="me1">fault</span>.<span class="me1">faultDetail</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">public</span> <span class="kw2">function</span> showResult <span class="br0">&#40;</span>ro: ResultEvent<span class="br0">&#41;</span> :<span class="kw3">void</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;Alert.<span class="kw3">show</span><span class="br0">&#40;</span><span class="st0">&quot;A hora é &quot;</span> + ro.<span class="me1">result</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;/</span>mx:Script<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;/</span>mx:Application<span class="sy0">&gt;</span></div>
</li>
</ol>
</div>
<p>Agora temos que compilar o danado.</p>
<p>Eu não coloquei o diretório <strong> bin </strong> do Flex SDK no PATH, pois eu não uso o Flex no dia-a-dia, portanto terei que utilizar o caminho para o compilador, mas se você for utilizar isso no dia-a-dia, recomendo colocar no PATH.</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;$ <span class="kw3">cd</span> ~<span class="sy0">/</span>src_rm<span class="sy0">/</span>flex_cliente</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;$ &nbsp;~<span class="sy0">/</span>bin<span class="sy0">/</span>flex-sdk<span class="sy0">/</span>bin<span class="sy0">/</span>mxmlc hora_servidor.mxml</div>
</li>
</ol>
</div>
<p>Pronto você já tem um cliente Flex, pode abrí-lo no Firefox, no Safari eu não consegui abrir o .swf, tive que fazer um HTML que chama o .swf. :-/</p>
<p>Se você tiver sorte já irá funcionar <img src='http://blog.lucmult.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  E você verá algo como:</p>
<p><img class="alignnone size-full wp-image-102" title="flex_cliente_ok" src="http://blog.lucmult.com.br/blog/wp-content/uploads/2009/08/flex_cliente_ok.png" alt="Flex Cliente OK" width="622" height="284" /></p>
<p>Ou você não teve sorte e apareceu algo como:</p>
<p><img class="alignnone size-full wp-image-101" title="flex_cliente_erro" src="http://blog.lucmult.com.br/blog/wp-content/uploads/2009/08/flex_cliente_erro.png" alt="Flex Cliente Erro" width="640" height="289" /></p>
<p>Mas você não deve ter sorte, e teremos que adicionar um novo arquivo no &#8220;servidor&#8221;, lá no Django, para o Flex funcionar, eu não entendi direito o que é isso e porque as vezes funciona sem esse arquivo.</p>
<p>Eu estava estudando isso por puro prazer, então não fui muito a fundo nos questões referentes ao flex, porém isso é algo importante para se saber ao usar em um ambiente de produção.</p>
<p>Vamos vamos resolver:</p>
<p>Lá no Django vamos criar um novo arquivo e disponibilizá-lo na raiz do site.</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ <span class="kw3">cd</span> ~<span class="sy0">/</span>src_rm<span class="sy0">/</span>django_flex<span class="sy0">/</span>mysite</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $ vi crossdomain.xml</div>
</li>
</ol>
</div>
<p>O arquivo deve conter esse conteúdo:</p>
<div class="geshi no xml">
<div class="head">Arquivo: mysite/crossdomain.xml</div>
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span><span class="re2">?&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;cross-domain-policy<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;allow-http-request-headers-from</span> <span class="re0">domain</span>=<span class="st0">&quot;*&quot;</span> <span class="re0">headers</span>=<span class="st0">&quot;*&quot;</span> <span class="re0">secure</span>=<span class="st0">&quot;false&quot;</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;allow-access-from</span> <span class="re0">domain</span>=<span class="st0">&quot;*&quot;</span> <span class="re0">secure</span>=<span class="st0">&quot;false&quot;</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/cross-domain-policy<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>Ainda falta ensinar o Django a disponibilizar esse arquivo como se estivesse na raiz.</p>
<div class="geshi no python">
<div class="head">Arquivo: mysite/urls.py</div>
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">from</span> django.<span class="me1">conf</span> <span class="kw1">import</span> settings</div>
</li>
<li class="li1">
<div class="de1">&#8230;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> settings.<span class="me1">DEBUG</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; urlpatterns += patterns<span class="br0">&#40;</span><span class="st0">&#39;&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>r<span class="st0">&#39;^(crossdomain.xml)$&#39;</span>, <span class="st0">&#39;django.views.static.serve&#39;</span>, <span class="br0">&#123;</span><span class="st0">&#39;document_root&#39;</span>: <span class="st0">&#39;./&#39;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Provavelmente tem outras formas mais intenligentes de disponibilizar isso no raiz do Django, mas como eu sou iniciante ainda, fiz desse jeito mesmo que é simples o suficiente para resolver o problema. <img src='http://blog.lucmult.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>E agora está pronto nosso Hello World, ou melhor, nosso What time is it ? </p>
<p>Eu achei legal e simples a forma de utilizar o AMF no Django, permitindo interagir com clientes Flex.</p>
<p>E vocês, o que acharam ?</p>
<h2> Fontes:</h2>
<p>Django AMF: <a href"http://djangoamf.sourceforge.jp/"> http://djangoamf.sourceforge.jp/ </a><br />
Django + Flex: <a href="http://chevitarese.wordpress.com/2009/07/24/django-django-e-flex-1%C2%B0-exemplo/">http://chevitarese.wordpress.com/2009/07/24/django-django-e-flex-1%C2%B0-exemplo/</a><br />
Django + Flex: <a href="http://chevitarese.files.wordpress.com/2009/07/djangoflex.pdf">http://chevitarese.files.wordpress.com/2009/07/djangoflex.pdf </a><br />
VIM + Flex: <a href="http://ubuntuforums.org/showthread.php?t=742981">http://ubuntuforums.org/showthread.php?t=742981</a><br />
Meu VIM, agora com flex: <a href="http://hg.lucmult.com.br/vim/rev/32e24bf7768a" > http://hg.lucmult.com.br/vim/rev/32e24bf7768a </a><br />
Flex SDK: <a href="http://download.macromedia.com/pub/flex/sdk/flex_sdk_3.zip"> http://download.macromedia.com/pub/flex/sdk/flex_sdk_3.zip </a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lucmult.com.br/2009/08/django-amf-flex/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Customize o hg web</title>
		<link>http://blog.lucmult.com.br/2009/07/customize-hg-web/</link>
		<comments>http://blog.lucmult.com.br/2009/07/customize-hg-web/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 23:16:01 +0000</pubDate>
		<dc:creator>lucmult</dc:creator>
				<category><![CDATA[admin]]></category>
		<category><![CDATA[hg]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blog.lucmult.com.br/?p=75</guid>
		<description><![CDATA[No post anterior configuramos o hg web, mas temos mais algumas opções que podemos configurar, por exemplo:

Configurar permissões de usuários
Tema do seu repositório
Informações dos projetos
Habilitar downloads de snapshots do repositório


As configurações podem ir na home do usuário que roda o serviço ~/.hgrc, ou como é mais utilizado, dentro de cada projeto hospedado /path/do/projeto/.hg/hgrc, ou ainda [...]]]></description>
			<content:encoded><![CDATA[<p>No<a href=": http://blog.lucmult.com.br/2009/07/hg-mercurial-web"> post anterior configuramos o hg web</a>, mas temos mais algumas opções que podemos configurar, por exemplo:</p>
<ol>
<li>Configurar permissões de usuários</li>
<li>Tema do seu repositório</li>
<li>Informações dos projetos</li>
<li>Habilitar downloads de snapshots do repositório</li>
</ol>
<p>
As configurações podem ir na home do usuário que roda o serviço <strong>~/.hgrc</strong>, ou como é mais utilizado, dentro de cada projeto hospedado<strong> /path/do/projeto/.hg/hgrc</strong>, ou ainda como utilizamos no<strong> hgweb.config</strong> que configura o serviço <strong>WSGI</strong>, funciona também para <strong>CGI</strong>
</p>
<p>
Dentro de cada projeto você pode gerenciar os usuários que podem fazer commit (pull):
</p>
<p>
Uma configuração útil para ir no <strong>hgweb.config</strong> é qual tema você quer utilizar:
</p>
<p>Os temas disponíveis estão em:</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1"><span class="sy0">/</span>usr<span class="sy0">/</span>share<span class="sy0">/</span>mercurial<span class="sy0">/</span>templates</div>
</li>
</ol>
</div>
<p>E são eles:</p>
<blockquote><p><strong>coal gitweb monoblue paper spartan<br />
</strong></p></blockquote>
<p>
Ainda no <strong>hgweb.config </strong>você pode configurar quais projetos você quer publicar.
</p>
<p>Podemos fazer estaticamente cada um dos projetos</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>paths<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">repo1 = c:/webdata/repos.<span class="me1">merc</span>/images</div>
</li>
<li class="li1">
<div class="de1">repo2 = c:/webdata/repos.<span class="me1">merc</span>/web/htdocs/</div>
</li>
</ol>
</div>
<p>
Ou como eu utilizei no post anterior:
</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>paths<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">/trunk = /webdata/hg_repos/trunk/<span class="sy0">**</span>  <span class="co1"># verifica recursivamente os repositórios</span></div>
</li>
</ol>
</div>
<p>
ou ainda:
</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>paths<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">/trunk = /webdata/hg_repos/trunk/<span class="sy0">*</span>  <span class="co1"># verifica somentes repositórios em trunk</span></div>
</li>
</ol>
</div>
<p>
Você pode configurar por projeto, <strong>contat,</strong> <strong>description,</strong> <strong>name</strong> e <strong>permissões </strong>de push
</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>web<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">allow_archive = gz <span class="kw2">zip</span> <span class="kw3">bz2</span>  <span class="co1"># permite o download do repositório nesses formatos</span></div>
</li>
<li class="li1">
<div class="de1">push_ssl = false                     <span class="co1"># permite o push por http puro</span></div>
</li>
<li class="li1">
<div class="de1">deny_push = saruman         <span class="co1"># negar o push para o usuário saruman</span></div>
</li>
<li class="li1">
<div class="de1">allow_push = frodo, sam     <span class="co1"># permitir o push para frodo e sam</span></div>
</li>
<li class="li1">
<div class="de1">allow_push = <span class="sy0">*</span>                       <span class="co1"># permitir o push para todos</span></div>
</li>
<li class="li1">
<div class="de1">contact = Bilbo Baggins        <span class="co1"># informações de contato sobre o repositório, pode colocar o seu e-mail por exemplo</span></div>
</li>
<li class="li1">
<div class="de1">description = My precious<span class="sy0">!</span>  <span class="co1"># Um descrição do projeto</span></div>
</li>
<li class="li1">
<div class="de1">name = lord/rings                  <span class="co1"># Um noe para o projeto</span></div>
</li>
</ol>
</div>
<p>
É isso ai, agora já dá para deixar os seus repositórios na publicados e personalizados. <img src='http://blog.lucmult.com.br/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />
</p>
<hr />
<p>Referências:<br />
<a href="http://mercurial.selenic.com/wiki/HgWebDirStepByStep">http://mercurial.selenic.com/wiki/HgWebDirStepByStep</a><br />
<a href="http://mercurial.selenic.com/wiki/PublishingRepositories">http://mercurial.selenic.com/wiki/PublishingRepositories</a><br />
<a href="http://mercurial.selenic.com/wiki/Theming">http://mercurial.selenic.com/wiki/Theming</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lucmult.com.br/2009/07/customize-hg-web/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mercurial &#8211; Publique seu repositórios</title>
		<link>http://blog.lucmult.com.br/2009/07/hg-mercurial-web/</link>
		<comments>http://blog.lucmult.com.br/2009/07/hg-mercurial-web/#comments</comments>
		<pubDate>Sat, 11 Jul 2009 23:44:26 +0000</pubDate>
		<dc:creator>lucmult</dc:creator>
				<category><![CDATA[admin]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[hg]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blog.lucmult.com.br/?p=36</guid>
		<description><![CDATA[Hg - Mercurial Web - Publique seus repositórios na Web, usando o wsgi]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignright" style="width: 170px"><a href="http://mercurial.selenic.com/wiki/"><img class=" " title="Mercurial Logo" src="http://www.selenic.com/hg-logo/logo-droplets-200.png" alt="Mercurial Logo" width="160" height="192" /></a><p class="wp-caption-text">Mercurial Logo</p></div>
<p>
Já tem um tempo que eu quero começar a usar o <a href="http://mercurial.selenic.com/wiki/">Mercurial</a> de verdade e como agora eu tenho um host nada mais justo de disponibilizar meus repositórios <a href="http://hg.lucmult.com.br/">lá</a> &#8211; ou seria <a href="http://hg.lucmult.com.br/">aqui</a> !?</p>
<p>
O Mercurial tem algumas maneiras de disponibilizar o repositório, mas eu queria:</p>
<ol>
<li> Uma página que dê para navegar no código</li>
<li> Permitir fazer o clone via http</li>
<li> Permitir fazer o pull (subir as alterações) para o servidor também via http</li>
<li> Usar WSGI ao invés de CGI</li>
<li> Integrar no apache que eu já tenho configurado lá</li>
</ol>
<p>
<strong>Servidor:</strong> Ubuntu 8.10</p>
<p>
Eu estou utilizando o <a href="https://launchpad.net/~mercurial-ppa">repositóro do mercurial</a>, assim eu tenho a última versão, mas deve funcionar com a versão padrão do Ubuntu.</p>
<p><pre><strong>Pacotes necessários</strong>: mercurial, mercurial-common, libapache2-mod-wsgi</pre>
<p>
Talvez tenha mais algum, mas eu não lembrei de anotar durante a instalação :-/</p>
<p>
Como eu já disse, eu já tinha o apache rodando com alguns Virtuais Hosts, eu queria apenas adicionar mais um Virtual Host naparte do apache.</p>
<p>
Verifique se o mod_wsgi já está habilitado:</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1"><span class="co0"># a2enmod wsgi</span></div>
</li>
<li class="li1">
<div class="de1">Module wsgi already <span class="kw3">enable</span></div>
</li>
</ol>
</div>
<p>
A configuração é dividia em 3 partes:</p>
<p>
1 &#8211; VirtualHost no Apache<br />
2 &#8211; A aplicação mercurial.web (WSGI)<br />
3 &#8211; Os repositórios hg (mercurial)</p>
<p>
Eu criei uma pasta na home para manter a aplicação e os repositórios</p>
<p>
Criei o arquivo hgwebdir.wsgi, ou baixe direto do <a href="http://selenic.com/repo/hg-stable/file/67389a94825a/contrib/hgwebdir.wsgi">repositório contrib do Mercurial</a>.</p>
<div class="geshi no python">
<div class="head">Arquivo: <strong>/home/lucmult/hg/hgwebdir.wsgi</strong></div>
<ol>
<li class="li1">
<div class="de1"><span class="kw1">from</span> mercurial <span class="kw1">import</span> demandimport<span class="sy0">;</span> demandimport.<span class="me1">enable</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">from</span> mercurial.<span class="me1">hgweb</span>.<span class="me1">hgwebdir_mod</span> <span class="kw1">import</span> hgwebdir</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">application = hgwebdir<span class="br0">&#40;</span><span class="st0">&#39;/home/lucmult/hg/hgweb.config&#39;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>O arquivo só precisa dessas 3 linhas.</p>
<p>
<strong>IMPORTANTE</strong>: Utilize o caminho absoluto do arquivo de configuração, eu perdi muito tempo por conta desse detalhe.</p>
<p>
Crie o arquivo de configuração que referenciamos no arquivo anterior.</p>
<p>
Hoje, o modo correto de publicar vários repositórios é assim:</p>
<div class="geshi no ini">
<div class="head">Arquivo: <strong>/home/lucmult/hg/hgweb.config</strong></div>
<ol>
<li class="li1">
<div class="de1"><span class="re0"><span class="br0">&#91;</span>paths<span class="br0">&#93;</span></span></div>
</li>
<li class="li1">
<div class="de1">/ <span class="sy0">=</span> /home/lucmult/hg/projects/*</div>
</li>
</ol>
</div>
<p>
Onde os subdiretórios de <strong> projects</strong> são repositórios mercurial distintos.</p>
<p>
<p>
Crie um repositório como exemplo:</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">$ <span class="kw2">mkdir</span> -p <span class="sy0">/</span>home<span class="sy0">/</span>lucmult<span class="sy0">/</span>hg<span class="sy0">/</span>projects<span class="sy0">/</span>sandbox</div>
</li>
<li class="li1">
<div class="de1">$ <span class="kw3">echo</span> <span class="st0">&quot;lero lero&quot;</span> <span class="sy0">&gt;</span> <span class="sy0">/</span>home<span class="sy0">/</span>lucmult<span class="sy0">/</span>hg<span class="sy0">/</span>projects<span class="sy0">/</span>sandbox<span class="sy0">/</span>readme.txt</div>
</li>
<li class="li1">
<div class="de1">$ <span class="kw3">cd</span> <span class="sy0">/</span>home<span class="sy0">/</span>lucmult<span class="sy0">/</span>hg<span class="sy0">/</span>projects<span class="sy0">/</span>sandbox</div>
</li>
<li class="li1">
<div class="de1">$ hg init</div>
</li>
<li class="li1">
<div class="de1">$ hg add</div>
</li>
<li class="li1">
<div class="de1">$ hg ci -m <span class="st0">&quot;meu primeiro commit&quot;</span></div>
</li>
<li class="li1">
<div class="de1">$ <span class="kw3">echo</span> <span class="st0">&quot;bip bip&quot;</span> <span class="sy0">&gt;&gt;</span> readme.txt</div>
</li>
<li class="li1">
<div class="de1">$ hg st</div>
</li>
<li class="li1">
<div class="de1">$ hg ci -m <span class="st0">&quot;segundo commit&quot;</span></div>
</li>
</ol>
</div>
</pre>
<p>Agora só falta o VirtualHost:</p>
<div class="geshi no apache">
<div class="head">Arquivo: <strong>/etc/apache2/sites-available/hg.lucmult.com.br</strong></div>
<ol>
<li class="li1">
<div class="de1">&lt;VirtualHost *:<span class="nu0">80</span>&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">ServerName</span> hg.lucmult.com.br</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">ServerAlias</span> hg.lucianopacheco.com.br</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">ErrorLog</span> /var/log/apache2/hg.lucmult.com.br-error_log</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">CustomLog</span> /var/log/apache2/hg.lucmult.com.br-access_log common</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; WSGIScriptAliasMatch ^<span class="br0">&#40;</span>.*<span class="br0">&#41;</span> /home/lucmult/hg/hgwebdir.wsgi$<span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1"># To enable &quot;daemon&quot; mode, uncomment following lines. (Read mod_wsgi docs for more info)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; WSGIDaemonProcess hg.lucmult.com.br <span class="kw1">user</span>=lucmult <span class="kw1">group</span>=lucmult threads=<span class="nu0">15</span> maximum-requests=<span class="nu0">1000</span> processes=<span class="nu0">2</span> umask=<span class="nu0">0007</span> display-name=wsgi-hg.lucmult.com.br</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1"># some more interesting options (tested on mod_wsgi 2.0):</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; WSGIProcessGroup hg.lucmult.com.br</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &lt;Location /&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Allow</span> <span class="kw1">from</span> <span class="kw1">all</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">AuthType</span> Digest</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">AuthName</span> <span class="st0">&quot;lucmult Mercurial repositories&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; AuthDigestProvider file</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">AuthUserFile</span> /home/lucmult/hg/hgusers</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &lt;LimitExcept GET&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Require</span> valid-<span class="kw1">user</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &lt;/LimitExcept&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &lt;/Location&gt;</div>
</li>
<li class="li1">
<div class="de1">&lt;/VirtualHost&gt;</div>
</li>
</ol>
</div>
<div class="geshi no bash">
<div class="head">Habilitar o Virtual Host</div>
<ol>
<li class="li1">
<div class="de1"><span class="co0"># a2ensite hg.lucmult.com.br</span></div>
</li>
<li class="li1">
<div class="de1">Site hg.lucmult.com.br already enabled</div>
</li>
</ol>
</div>
<p>No arquivo de configuração do VirtualHost tá configurado para fazer autenticação, quando for fazer o push para o servidor.</p>
<div class="geshi no bash">
<div class="head">Para criar os usuários utilize:</div>
<ol>
<li class="li1">
<div class="de1">$ htdigest &nbsp;-c hgusers <span class="st0">&#39;lucmult Mercurial repositories&#39;</span> lucmult</div>
</li>
</ol>
</div>
<p>
Onde:<br />
<strong>-c hgusers </strong>  Criar o arquivo hgusers<br />
<strong>'lucmult Mercurial repositories'</strong> Identificação, mesmo texto que foi configurado em <strong>AuthName</strong> no Virtual Host<br />
<strong>lucmult</strong> Nome do usuário a ser criado
</p>
<p>Mais uma configuração que tem que ser feita, agora com relação a permissão.<br />
Tudo que fizemos na pasta /home/lucmult/hg, foi com o usuário lucmult, com isso o usuário que roda o apache (www-data) não tem permissão de escrita na pasta e isso impede o funcionamento.</p>
<div class="geshi no bash">
<div class="head">Atribuindo permissão para o grupo do apache <strong>www-data</strong></div>
<ol>
<li class="li1">
<div class="de1">$ <span class="kw2">chown</span> -R lucmult:www-data <span class="sy0">/</span>home<span class="sy0">/</span>lucmult<span class="sy0">/</span>hg<span class="sy0">/</span>projects</div>
</li>
<li class="li1">
<div class="de1">$ <span class="kw2">chmod</span> -R g+rw &nbsp;<span class="sy0">/</span>home<span class="sy0">/</span>lucmult<span class="sy0">/</span>hg<span class="sy0">/</span>projects</div>
</li>
</ol>
</div>
<p>
<strong>Imporante</strong> o endereço DNS hg.lucmult.com.br, tem que ser configurado no seu DNS.</p>
<p>Pronto agora é só reiniciar o seu apache e acessar o seu repositório, via browser ou via linha de comando. <img src='http://blog.lucmult.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">hg clone http:<span class="sy0">//</span>hg.lucmult.com.br<span class="sy0">/</span>sandbox</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">cd</span> sandbox</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> <span class="st0">&quot;lero lero&quot;</span> <span class="sy0">&gt;&gt;</span> readme.txt</div>
</li>
<li class="li1">
<div class="de1">hg st</div>
</li>
<li class="li1">
<div class="de1">hg ci</div>
</li>
<li class="li1">
<div class="de1">hg push</div>
</li>
</ol>
</div>
<p>Fontes:<br />
<a href="http://devlog.waltercruz.com/mercurial_web">http://devlog.waltercruz.com/mercurial_web </a><br />
<a href="http://mercurial.selenic.com/wiki/PublishingRepositories">http://mercurial.selenic.com/wiki/PublishingRepositories </a><br />
<a href="http://mercurial.selenic.com/wiki/modwsgi">http://mercurial.selenic.com/wiki/modwsgi</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lucmult.com.br/2009/07/hg-mercurial-web/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Postgres e psycopg2 8.4 no Mac OSX</title>
		<link>http://blog.lucmult.com.br/2009/07/postgres-psycopg2-mac/</link>
		<comments>http://blog.lucmult.com.br/2009/07/postgres-psycopg2-mac/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 02:34:40 +0000</pubDate>
		<dc:creator>lucmult</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[postgres]]></category>

		<guid isPermaLink="false">http://blog.lucmult.com.br/?p=29</guid>
		<description><![CDATA[Hoje precisei instalar o Postgres e o psycopg2 no Mac. Não foi muito difícil, mas não foi uma instalação normal, portanto vamos compartilhar!  
Para instalar o Postgres é fácil, basta ir no site e fazer o download do pacote compilado para o Mac que já vem tudo pronto.
Aqui o cara tem a explicação passo [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-family: sans-serif;">Hoje precisei instalar o <a href="http://www.postgresql.org/">Postgres</a> e o <a href="http://www.initd.org/pub/software/psycopg/">psycopg2</a> no Mac. Não foi muito difícil, mas não foi uma instalação normal, portanto vamos compartilhar! <img src='http://blog.lucmult.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </span></p>
<p><span style="font-family: sans-serif;">Para instalar o <a href="http://www.postgresql.org/download/macosx">Postgres</a> é fácil, basta ir no <a href="http://www.postgresql.org/download/macosx">site</a> e fazer o download do pacote compilado para o Mac que já vem tudo pronto.</span></p>
<p><span style="font-family: sans-serif;"><a href="http://www.rodrigomerino.com.br/site/2008/12/instalando-banco-de-dados-postgresql-no-mac-os/">Aqui</a> o cara tem a explicação passo a passo do instalação.</span></p>
<p><span style="font-family: sans-serif;">Agora vem o psycopg2 que é o diferente.<br />
</span></p>
<ul>
<li>Comece <a href="http://www.initd.org/pub/software/psycopg/">Baixando</a> o <a href="http://www.initd.org/pub/software/psycopg/psycopg2-2.0.11.tar.gz">psycopg2-2.0.11.tar.gz</a></li>
<li>Descompacte</li>
<li>Configurar os headers, libs, includes do postgres</li>
<li>Edite o <strong>setup.cfg </strong>- aprendi <a href="http://jasonism.org/weblog/2008/nov/06/getting-psycopg2-work-mac-os-x-leopard/">aqui</a> como devia fazer<strong><br />
</strong></li>
</ul>
<blockquote><p><strong><span style="font-family: Courier New;">p</span><span style="font-family: Courier New;">g_config=/Library/PostgreSQL/8.4/bin/pg_config<br />
</span><span style="font-family: Courier New;">include_dirs=/Library/PostgreSQL/8.4/include<br />
</span><span style="font-family: Courier New;">library_dirs=/Library/PostgreSQL/8.4/lib</span></strong></p></blockquote>
<ul>
<li><strong>$ python setup.py config</strong></li>
<li><strong>$ python setup.py build</strong></li>
<li><strong>$ sudo python setup.py install</strong></li>
</ul>
<p>Pronto, verifique:</p>
<blockquote><p><strong>$ python</strong><br />
<strong>&gt;&gt;&gt; import psycopg2</strong><br />
<strong>&gt;&gt;&gt;</strong></p></blockquote>
<p>Agora espero que eu não deixe aqui abandonado novamente! <img src='http://blog.lucmult.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lucmult.com.br/2009/07/postgres-psycopg2-mac/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>OLPC Game Jam no FISL</title>
		<link>http://blog.lucmult.com.br/2008/04/olpc-game-jam-no-fisl/</link>
		<comments>http://blog.lucmult.com.br/2008/04/olpc-game-jam-no-fisl/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 02:06:02 +0000</pubDate>
		<dc:creator>lucmult</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[apyb]]></category>
		<category><![CDATA[fisl]]></category>
		<category><![CDATA[pygame]]></category>

		<guid isPermaLink="false">http://lucmult.wordpress.com/?p=20</guid>
		<description><![CDATA[OLPC Game Jam no FISL
Durante o FISL rolou o Game Jam da OLPC, que consiste em criar um jogo educativo em 30 horas para o XO da OLPC.
É uma competição e quem avalia os jogos são as próprias crianças.
O Andrews Medina e Bruno Gola se inscreveram para participar e assim que fiquei sabendo mendiguei pedi [...]]]></description>
			<content:encoded><![CDATA[<p>OLPC Game Jam no FISL</p>
<p>Durante o FISL rolou o <a href="http://wiki.laptop.org/go/Game_Jam_Brasil/2008" target="_blank">Game Jam da OLPC</a>, que consiste em criar um jogo educativo em 30 horas para o XO da OLPC.</p>
<p>É uma competição e quem avalia os jogos são as próprias crianças.</p>
<p>O <a href="http://andrewsmedina.com/" target="_blank">Andrews Medina</a> e <a href="http://blog.brunogola.com.br/" target="_blank">Bruno Gola</a> se inscreveram para participar e assim que fiquei sabendo <span style="text-decoration:line-through;">mendiguei</span> pedi para entrar na equipe também.</p>
<p>Quando eles se inscreveram já tinha começado a competição, o prazo encerrava as 20h da sexta-feira.</p>
<p>Nós fizemos a minha inscrição, mas programar que era bom nada, isso até aproximadamente às 14h da sexta-feira, ou seja, 6 horas antes de acabar o prazo.</p>
<p>Finalmente começamos a codar e resolvemos fazer isso lá no espaço da <a href="http://associacao.pythonbrasil.org/" target="_blank">APyB</a> onde tinha conexão a cabo, pois o wifi estava horrível.</p>
<p><img style="max-width:800px;" src="http://lucmult.files.wordpress.com/2008/04/img-ambiente-espaco-apyb.jpg" alt="" /></p>
<p>Essa decisão foi bem prejudicial, pois a todo momento vinham pessoas falar com a gente, ou para conhecer Python ou falar de Python, ou queriam saber como estava o andamento do jogo.</p>
<p>E não foi só isso que nos tirou a concentração, a nossa esquerda, na imagem vocês podem ver uma pessoa de camiseta azul, estavam o hermanos da <a href="http://www.python.com.ar" target="_blank">PyAr &#8211; Python Argentina</a>, e tinha uma hermana muito atraente que tirava a nossa concetração e a nossa direita havia um espaço não habitado, mas durante uma parte da tarde rolou uma discussão sobre Java X Python, mas ficar ouvindo sobre Java e J daqui e J de lá, não foi fácil.</p>
<p>Os hermanos também estavam participando do Game Jam, eles sempre participam da <a href="http://www.pyweek.org/" target="_blank">PyWeek</a> uma competição de games em Python que dura uma semana.</p>
<p>E não era o bastante, boa parte do tempo ficamos codando diretamente no chão, pois não havia cadeiras livres e nem espaço na mesa.</p>
<p>Aqui nessa foto da para ver nosso espaço no chão, da esquerda para direita, o note do Andrews, o meu MacBook e o note do Gola e o XO que recebemos para testar o jogo. Nesse momento o Gola estava inicializando o repositório http://svn.brunogola.com.br/olpyc</p>
<p><img style="max-width:800px;" src="http://lucmult.files.wordpress.com/2008/04/img-ambiente-dev-gamejam.jpg" alt="" /></p>
<p>O nosso jogo é uma réplica do Genius porém adaptado para o XO e que pode ser jogado com o XO em modo tablet. O nome final ficou como OLPyC Genius</p>
<p>Para quem não lembra o Genius.<br />
<img style="max-width:800px;" src="http://lucmult.files.wordpress.com/2008/04/genius37.jpg" alt="" /></p>
<p>Depois de conseguirmos espaço na mesa chegou um cara falando comigo:</p>
<ul>
<li><strong>Desconhecido</strong> &#8211; Você é amigo do <a href="http://humberto.digi.com.br/" target="_blank">Humberto Diógenes</a>?</li>
<li><em><strong>Eu</strong></em> &#8211; Sim.</li>
<li><strong>Desconhecido</strong> &#8211; Você que anda sempre com o CD do Mac Leopard?</li>
<li><em><strong>Eu</strong></em> &#8211; Sim, mas ninguém sabe que eu ando com esses CDs.</li>
<li><strong>Desconhecido</strong> &#8211; É que deu problema na atualização do firmware do meu Mac e eu queria o CD para tentar recuperá-lo.</li>
</ul>
<p>Mesmo deconfiando, afinal eu não o conhecia, eu emprestei o meu CD do Leopard.</p>
<p>Após algum tempo, ele ficou no stand a nossa esquerda tentando recuperar o Mac dele. Quando ele desistiu de recuperar o Mac, ele devolveu o CD e quis saber o que estávamos fazendo.</p>
<p>Quando dissemos do jogo ele falou que podia fazer umas imagens, mas a princípio nós não queríamos perder mais tempo com a arte, queríamos fazer funcionar o jogo.</p>
<p>Mas o cara é o <a href="http://valessiobrito.info/blog/" target="_blank">Valessio Brito</a> um dos caras que mais movimenta o <a href="http://br.gnome.org/bin/view/InkscapeBrasil/" target="_blank">Inkscape Brasil</a>, e fez a arte do nosso jogo ficar excelente e trouxe uma nova onda de ânimo a equipe.</p>
<p>Por volta de umas 19:40h, o hermanos ao nosso lado terminaram o jogo deles e começaram a testar e apareceu muita gente para ver o jogo deles, devia ter umas 50 pessoas em volta do stand deles e todos vibravam muito. O pior é que nesse momento o nosso jogo estava com um bug que nem rodava mais o jogo e isso causou uma grande ansiedade.</p>
<p>Finalmente as 20:05h entregamos o XO com o nosso jogo instalado! E tiramos a foto da equipe OLPyC. No momento da foto estávamos muito eufóricos e o Andrews tremia que nem vara verde!</p>
<p><img style="max-width:800px;" src="http://lucmult.files.wordpress.com/2008/04/img-olpyc-team.jpg" alt="" /></p>
<p>No momento de entrega encontramos os outros grupos participantes, 2 grupos do <a title="UNISINOS" href="http://www.unisinos.br/principal/" target="_blank">UNISINOS</a>, que têm aula de <a title="PyGame" href="http://www.pygame.org/" target="_blank">PyGame</a> na faculdade! Ficamos com inveja deles por terem aula de PyGame.</p>
<p>No dia seguinte as 2 garotinhas encarregas de julgar os jogos estavam no stand do LEC e fui mostrar para ela como jogar o OLPyC Genius, eis que ela me solta o nosso prêmio: <strong>&#8220;Eu sei, eu já joguei mais de 1000 vezes!&#8221;</strong>.</p>
<p>Ela falou meio que tirando uma da minha cara, mas foi uma felicidade única ouvir que nosso jogo foi jogado 1000 vezes!</p>
<p>No final do FISL teve o resultado do Game Jam e os hermanos ganharam com o <strong><em>PacMan de comer letras</em></strong> para formar palavras, em segundo lugar muito próximo aos hermanos ficou um dos grupos da UNISINOS com o <em><strong>tetris matemático</strong></em>.</p>
<p>Depois conversando com a organização soubemos que o nosso jogo de um erro na pré seleção, onde os adultos passavam pelo jogo para ver se funcionava e por isso ficamos em último lugar!</p>
<p>Mas a sensação de participar do GameJam foi inesquecível e sensacional. Na minha opinião foi o melhor momento do FISL.</p>
<p>Abaixo um screenshot do jogo.<br />
<img style="max-width:800px;" src="http://lucmult.files.wordpress.com/2008/04/olpyc-shot.png" alt="" /></p>
<p><strong>UPDATE:</strong> Esqueci de mencionar a impressionante <strong>portabilidade</strong> do <strong>PyGame</strong>. O mesmo código rodou sem pestenejar no <strong>Linux</strong> (note do Bola e do Andres), no meu <strong>Mac</strong> e no <strong>XO</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lucmult.com.br/2008/04/olpc-game-jam-no-fisl/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Primeira Colaboração de Código ! :)</title>
		<link>http://blog.lucmult.com.br/2006/07/primeira-colaboracao-de-codigo/</link>
		<comments>http://blog.lucmult.com.br/2006/07/primeira-colaboracao-de-codigo/#comments</comments>
		<pubDate>Fri, 21 Jul 2006 13:00:00 +0000</pubDate>
		<dc:creator>lucmult</dc:creator>
				<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://lucmult.wordpress.com/2006/07/21/primeira-colaboracao-de-codigo/</guid>
		<description><![CDATA[Semana passada surgiu uma dúvida na lista python-brasil ,
 manipulação de datas com o pymssql e como eu tenho interesse na utilização de Python com o MS-SQL dei bastante atenção à dúvida, gerando  minha primeira colaboração com código a um projeto Open Source. 
 O Problema 
Em um comando INSERT desejava-se inserir uma data [...]]]></description>
			<content:encoded><![CDATA[<p>Semana passada surgiu uma dúvida na lista <a href="http://br.groups.yahoo.com/group/python-brasil/">python-brasil</a> ,<br />
<a href="http://thread.gmane.org/gmane.comp.python.brasil/18907/focus=18929"> manipulação de datas com o pymssql</a> e como eu tenho interesse na utilização de Python com o MS-SQL dei bastante atenção à dúvida, gerando <strong> minha primeira colaboração com código a um projeto Open Source. </strong></p>
<h2> O Problema </h2>
<p>Em um comando INSERT desejava-se inserir uma data no banco de dados.</p>
<p>No Python 2.4 temos o objeto <strong>datetime</strong> para trabalhar com datas, porém o driver de acesso ao banco (<strong>pymssql</strong>) não reconhece esse tipo e isso nos obriga a converter a data para <strong>string</strong> antes de enviar ao <strong>pymssql</strong>.</p>
<p>Obviamente essa conversão é uma responsabilidade do driver <strong>pymssql</strong>.</p>
<p>Simulei o erro com esse código:<br />
<code><br />
&gt;&gt;&gt; import pymssql<br />
&gt;&gt;&gt; pymssql.__version__<br />
&gt;&gt;&gt; from datetime import datetime<br />
&gt;&gt;&gt; con = pymssql.connect(host='server', user='usuario', password='senha', database='base')<br />
&gt;&gt;&gt; cur = con.cursor()<br />
&gt;&gt;&gt; cur.execute('insert into PrazoLog(Data) values(%s)',&gt;&gt;&gt;                             [datetime(2006, 7, 20, 11, 6, 14)])<br />
&gt;&gt;&gt; con.commit()</code></p>
<h2> Contornando o Problema </h2>
<p>Após eu conseguir simular o erro na minha máquina fui investigar como contornar o erro, e graças ao fato do Python ser executado a partir dos fontes eu pude ler o código do pymssql que estava instalado na minha máquina sem ter que consultar o site, repositórios ou qualquer outro local.</p>
<p>Novamente graças ao Python executar os fontes, pude fazer alterações nos fontes do pymssql e simplemente testar. Obviamente como não desenvolvo constantemente em Python fiz meus testes e debugs de forma bem artesanal (usando <strong>print</strong>s).</p>
<p>Apenas consultando o e-mail com o problema e os arquivos que já estavam na minha máquina consegui chegar em um patch que permitia contornar o problema de forma simples rápida e ao meu ver bem feita.</p>
<p>Tomei alguns cuidados que achei importante, como tentar não adicionar mais uma dependência ao <strong>pymssql</strong>. A versão do pymssql que eu disponho não depende do módulo <strong>datetime</strong> e como eu sabia que esse módulo foi incorporado somente na versão 2.4 não queria adicionar essa dependência.</p>
<p>Lembrei-me, então, do <strong><i>duck typing</i></strong>. Como eu queria apenas o método <strong>timetuple</strong> da classe <strong>datetime.datetime</strong>. Apenas verifiquei se o objeto tem o método e tendo-o eu executo-o.</p>
<p>Funcionou que foi uma beleza <img src='http://blog.lucmult.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , testei nas 3 versões do MS-SQL que eu tenho aqui na empresa (7.0, 2000, 2005) e funcionou. Fiquei empolgado e eufórico! Mandei a minha correção para a lista e o Girão, que é quem teve o problema, falou que funcionou beleza e gostou da correção.</p>
<h2> Colaborando com a Comunidade </h2>
<p>Aproveitando a euforia e a &#8220;aprovação&#8221; do Girão fui a página do projeto para enviar a minha proposta de patch. O projeto está no <a href="http://sourceforge.net/projects/pymssql"> sourceforge.net </a>, dei uma olhada no Fórum e todas as mensagens <span style="font-weight:bold;">não</span> recebiam respostas <img src='http://blog.lucmult.com.br/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  e não achava nenhum link do tipo &#8220;reporte um bug&#8221;.</p>
<p>Mas navegando pelo site do projeto achei uma nota sobre a dependência do módulo <strong>datetime</strong> e achei bem estranha. Então fui verificar os fontes, nos fontes da minha máquina não via nada que levasse ao módulo <strong>datetime</strong>, então fui consultar o repositório CVS.</p>
<p>Qual não foi minha surpresa quando a versão do CVS revelou-me que a dependência era justamente para solucionar o mesmo problema que eu tinha solucionado :S . Fiquei meio triste, pois pensei, re-invetei a roda, mas fiquei contante pois ainda achava minha solução mais adequada por não adicionar a tão falada dependência.</p>
<p>Apelei e mandei o patch direto para os 2 e-mails de desenvolvedores que eu achei no site.</p>
<p>Após 4 dias o Andrzej Kukula, um dos desenvolvedores, me respondeu dizendo que o meu patch seria incorporado no projeto! <img src='http://blog.lucmult.com.br/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  A empolgação foi total !</p>
<h2> Moral da História </h2>
<ol>
<li> O Python facilita a leitura e a depuração dos fontes </li>
<li> Sempre verificar a versão do CVS/SVN </li>
<li> Colaborar com algum projeto não é tão difícil assim
<ul> <strong> Precisa-se de: </strong></p>
<li> um pouco de interesse </li>
<li> um pouco de experiência para saber o que esperar de um módulo/biblioteca/framework, pois para mim (e para o Girão também) a conversão de tipo era função do módulo pymssql </li>
<li> um pouco de inglês </li>
<li> o que eu menos precisei foi conhecer bem a linguagem &#8211; <i> eu acho</i></li>
</ul>
</li>
<li> e por último, mas não menos importante, colaborar é empolgante e divertido, principalmente em Python <img src='http://blog.lucmult.com.br/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  </li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.lucmult.com.br/2006/07/primeira-colaboracao-de-codigo/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>
