<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>foobar + h2o</title>
	<atom:link href="http://pythonlog.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://pythonlog.wordpress.com</link>
	<description>hacks em python e pensamentos gerais sobre software livre</description>
	<lastBuildDate>Wed, 18 Jan 2012 11:18:40 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='pythonlog.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>foobar + h2o</title>
		<link>http://pythonlog.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://pythonlog.wordpress.com/osd.xml" title="foobar + h2o" />
	<atom:link rel='hub' href='http://pythonlog.wordpress.com/?pushpress=hub'/>
		<item>
		<title>O Paradoxo Python</title>
		<link>http://pythonlog.wordpress.com/2011/01/11/o-paradoxo-python/</link>
		<comments>http://pythonlog.wordpress.com/2011/01/11/o-paradoxo-python/#comments</comments>
		<pubDate>Tue, 11 Jan 2011 17:06:01 +0000</pubDate>
		<dc:creator>nosklo</dc:creator>
				<category><![CDATA[computers]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://pythonlog.wordpress.com/?p=65</guid>
		<description><![CDATA[Este texto é uma tradução autorizada do texto The Python Paradox de autoria de Paul Graham, feita por tellarin. Texto original: The Python Paradox, autoria de Paul Graham. Tradução por Börje Karlsson (tellarin at sounerd dot com). Eventuais comentários entre colchetes são adições pelo tradutor, não existindo na versão original. &#8211; Numa palestra recente, eu [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=65&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Este texto é uma tradução autorizada do texto The Python Paradox de autoria de Paul Graham, feita por tellarin.<br />
Texto original: The Python Paradox, autoria de Paul Graham.<br />
Tradução por Börje Karlsson (tellarin at sounerd dot com).<br />
Eventuais comentários entre colchetes são adições pelo tradutor, não existindo na versão original.<br />
&#8211;</p>
<p>Numa palestra recente, eu [Paul] disse algo que perturbou muitas pessoas: que poderia-se conseguir programadores mais espertos para trabalhar num projeto com Python do que se conseguiria para trabalhar num projeto com Java.</p>
<p>Eu não quis dizer com isso que programadores Java são burros. O que eu quis dizer é que programadores Python são espertos. Dá muito trabalho aprender uma nova linguagem de programação. E as pessoas não aprendem Python porque ela vá lhes garantir um trabalho; elas a aprendem pois genuinamente gostam de porgramar e não estão satisfeitas com as linguagens de programação que elas já conhecem.</p>
<p>Isso faz dessas pessoas exatamente o tipo de programadores que as empresas deveriam estar interessadas em contratar. Daí que, por falta de um nome melhor, eu vou chamar de &#8220;O Paradoxo Python&#8221;: se uma empresa escolhe escrever seu software numa linguagem comparativamente esotérica, ela vai ter a possibilidade de contratar programadores melhores, pois ela vai atrair somente aqueles que se interessaram/preocuparam o suficiente para aprender anteriormente a linguagem. E no caso dos programadores o paradoxo é ainda mais pronunciado: a linguagem a se aprender, se você quer conseguir um emprego, é a linguagem que as pessoas não apredem somente para conseguir um emprego.</p>
<p>Apenas poucas companhias tem sido espertas o suficiente para perceber isso até agora. Mas existe um tipo de seleção acontecendo nesse caso também: essas são exatamente as empresas para as quais os programadores gostariam mais de trabalhar. O Google, por exemplo. Quando eles fazem chamadas para empregos para programção em Java, eles também querem e pedem experiência em Python.</p>
<p>Um amigo meu que sabe quase todas as linguagens de programação amplamente usadas usa Python para a maioria dos seus projetos. Ele diz que a razão principal é que ele gosta do jeito que o código fonte fica [quão bonito ele fica]. Essa pode parecer uma razão frívola para se escolher uma linguagem de programação em relação a outra. Mas não é tão frívola quanto parece: quando você programa, você passa bem mais tempo lendo código do que escrevendo. Você move pedaços de código de um lado para o outro como um escultor faz com pedaços de argila. Então uma linguagem de programação que faça com que o código fique feio é enlouquecedora para um programador exigente, assim como argila cheia de protuberâncias seria para um escultor.</p>
<p>A mera menção de código fonte &#8220;feio&#8221;, muitas pessoas vão logo obviamente pensar em Perl. Mas a feiura superficial de Perl não é o tipo de feiura ao qual me refiro. Feiura de verdade não é a sintaxe áspera ao olhar(harsh-looking), mas sim ter que construir programas a partir dos conceitos errados. Perl pode parecer com um personagem de desenho animado xingando, mas existem casos onde Perl é até mesmo melhor que Python conceitualmente.</p>
<p>Até agora, pelo menos. Ambas as linguagem obviamente são alvos móveis. Mas elas compartilham, assim como com Ruby (e Icon, e Joy, e J, e Lisp, e Smalltalk), o fato que elas foram criadas por, e usadas por, pessoas realmente interessadas em programação. E estas linguagem são as que tendem a fazer o serviço melhor.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pythonlog.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pythonlog.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pythonlog.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pythonlog.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pythonlog.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pythonlog.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pythonlog.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pythonlog.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pythonlog.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pythonlog.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pythonlog.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pythonlog.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pythonlog.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pythonlog.wordpress.com/65/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=65&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pythonlog.wordpress.com/2011/01/11/o-paradoxo-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a40e069c43150d08cba27f590aa7bf3c?s=96&#38;d=wavatar&#38;r=X" medium="image">
			<media:title type="html">nosklo</media:title>
		</media:content>
	</item>
		<item>
		<title>Convertendo um excel xls em table HTML usando python</title>
		<link>http://pythonlog.wordpress.com/2010/12/23/convertendo-um-excel-xls-em-table-html-usando-python/</link>
		<comments>http://pythonlog.wordpress.com/2010/12/23/convertendo-um-excel-xls-em-table-html-usando-python/#comments</comments>
		<pubDate>Thu, 23 Dec 2010 18:17:29 +0000</pubDate>
		<dc:creator>nosklo</dc:creator>
				<category><![CDATA[computers]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[etree]]></category>
		<category><![CDATA[example]]></category>
		<category><![CDATA[excel]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[lxml]]></category>
		<category><![CDATA[parse]]></category>
		<category><![CDATA[serialization]]></category>
		<category><![CDATA[table]]></category>

		<guid isPermaLink="false">http://pythonlog.wordpress.com/?p=61</guid>
		<description><![CDATA[import xlrd from lxml.html import builder as E, tostring from lxml.etree import ElementTree def itermeth(obj, method, endattr): for index in xrange(getattr(obj, endattr)): yield getattr(obj, method)(index) def xls_tree(xls_filename, header=True, tableattrs=None): if tableattrs is None: tableattrs = {} workbook = xlrd.open_workbook(xls_filename) head = E.HEAD(E.TITLE(xls_filename)) body = E.BODY() for sheet in workbook.sheets(): if sheet.nrows &#60;= 0 or sheet.ncols [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=61&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div class="highlight" style="background:#f8f8f8;">
<pre style="line-height:125%;"><span style="color:#008000;font-weight:bold;">import</span> <span style="color:#0000FF;font-weight:bold;">xlrd</span>
<span style="color:#008000;font-weight:bold;">from</span> <span style="color:#0000FF;font-weight:bold;">lxml.html</span> <span style="color:#008000;font-weight:bold;">import</span> builder <span style="color:#008000;font-weight:bold;">as</span> E, tostring
<span style="color:#008000;font-weight:bold;">from</span> <span style="color:#0000FF;font-weight:bold;">lxml.etree</span> <span style="color:#008000;font-weight:bold;">import</span> ElementTree

<span style="color:#008000;font-weight:bold;">def</span> <span style="color:#0000FF;">itermeth</span>(obj, method, endattr):
    <span style="color:#008000;font-weight:bold;">for</span> index <span style="color:#AA22FF;font-weight:bold;">in</span> <span style="color:#008000;">xrange</span>(<span style="color:#008000;">getattr</span>(obj, endattr)):
        <span style="color:#008000;font-weight:bold;">yield</span> <span style="color:#008000;">getattr</span>(obj, method)(index)

<span style="color:#008000;font-weight:bold;">def</span> <span style="color:#0000FF;">xls_tree</span>(xls_filename, header<span style="color:#666666;">=</span><span style="color:#008000;">True</span>, tableattrs<span style="color:#666666;">=</span><span style="color:#008000;">None</span>):
    <span style="color:#008000;font-weight:bold;">if</span> tableattrs <span style="color:#AA22FF;font-weight:bold;">is</span> <span style="color:#008000;">None</span>:
        tableattrs <span style="color:#666666;">=</span> {}
    workbook <span style="color:#666666;">=</span> xlrd<span style="color:#666666;">.</span>open_workbook(xls_filename)
    head <span style="color:#666666;">=</span> E<span style="color:#666666;">.</span>HEAD(E<span style="color:#666666;">.</span>TITLE(xls_filename))
    body <span style="color:#666666;">=</span> E<span style="color:#666666;">.</span>BODY()
    <span style="color:#008000;font-weight:bold;">for</span> sheet <span style="color:#AA22FF;font-weight:bold;">in</span> workbook<span style="color:#666666;">.</span>sheets():
        <span style="color:#008000;font-weight:bold;">if</span> sheet<span style="color:#666666;">.</span>nrows <span style="color:#666666;">&lt;=</span> <span style="color:#666666;">0</span> <span style="color:#AA22FF;font-weight:bold;">or</span> sheet<span style="color:#666666;">.</span>ncols <span style="color:#666666;">&lt;=</span> <span style="color:#666666;">0</span>:
            <span style="color:#008000;font-weight:bold;">continue</span> <span style="color:#408080;font-style:italic;"># sheet is empty</span>
        table <span style="color:#666666;">=</span> E<span style="color:#666666;">.</span>TABLE(E<span style="color:#666666;">.</span>CAPTION(sheet<span style="color:#666666;">.</span>name), <span style="color:#666666;">**</span>tableattrs)
        container <span style="color:#666666;">=</span> E<span style="color:#666666;">.</span>THEAD()
        table<span style="color:#666666;">.</span>append(container)
        cellClass <span style="color:#666666;">=</span> E<span style="color:#666666;">.</span>TH
        <span style="color:#008000;font-weight:bold;">for</span> xlsrow <span style="color:#AA22FF;font-weight:bold;">in</span> itermeth(sheet, <span style="color:#BA2121;">&#39;row&#39;</span>, <span style="color:#BA2121;">&#39;nrows&#39;</span>):
            row <span style="color:#666666;">=</span> E<span style="color:#666666;">.</span>TR()
            container<span style="color:#666666;">.</span>append(row)
            <span style="color:#008000;font-weight:bold;">if</span> header:
                container <span style="color:#666666;">=</span> E<span style="color:#666666;">.</span>TBODY()
                table<span style="color:#666666;">.</span>append(container)
                cellClass <span style="color:#666666;">=</span> E<span style="color:#666666;">.</span>TD
                header <span style="color:#666666;">=</span> <span style="color:#008000;">False</span>
            <span style="color:#008000;font-weight:bold;">for</span> cell <span style="color:#AA22FF;font-weight:bold;">in</span> xlsrow:
                row<span style="color:#666666;">.</span>append(cellClass(<span style="color:#008000;">unicode</span>(cell<span style="color:#666666;">.</span>value)))
        body<span style="color:#666666;">.</span>append(table)
    <span style="color:#008000;font-weight:bold;">return</span> ElementTree(E<span style="color:#666666;">.</span>HTML(head, body))

<span style="color:#408080;font-style:italic;">## Example usage:</span>
html <span style="color:#666666;">=</span> xls_tree(<span style="color:#BA2121;">&#39;/home/nosklo/Documentos/teste.xls&#39;</span>,
    tableattrs<span style="color:#666666;">=</span>{<span style="color:#BA2121;">&#39;class&#39;</span>: <span style="color:#BA2121;">&#39;mytable&#39;</span>, <span style="color:#BA2121;">&#39;border&#39;</span>: <span style="color:#BA2121;">&#39;2&#39;</span>})
<span style="color:#408080;font-style:italic;"># print to screen</span>
<span style="color:#008000;font-weight:bold;">print</span> tostring(html, pretty_print<span style="color:#666666;">=</span><span style="color:#008000;">True</span>)
<span style="color:#408080;font-style:italic;"># write to file</span>
html<span style="color:#666666;">.</span>write(<span style="color:#BA2121;">&#39;/tmp/resultado.html&#39;</span>)
</pre>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pythonlog.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pythonlog.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pythonlog.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pythonlog.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pythonlog.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pythonlog.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pythonlog.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pythonlog.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pythonlog.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pythonlog.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pythonlog.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pythonlog.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pythonlog.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pythonlog.wordpress.com/61/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=61&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pythonlog.wordpress.com/2010/12/23/convertendo-um-excel-xls-em-table-html-usando-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a40e069c43150d08cba27f590aa7bf3c?s=96&#38;d=wavatar&#38;r=X" medium="image">
			<media:title type="html">nosklo</media:title>
		</media:content>
	</item>
		<item>
		<title>Problema da soma de sub-ítens</title>
		<link>http://pythonlog.wordpress.com/2010/01/19/problema-da-soma-de-sub-itens/</link>
		<comments>http://pythonlog.wordpress.com/2010/01/19/problema-da-soma-de-sub-itens/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 11:37:13 +0000</pubDate>
		<dc:creator>nosklo</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[algorithm]]></category>
		<category><![CDATA[algoritmo]]></category>
		<category><![CDATA[matemática]]></category>
		<category><![CDATA[math]]></category>
		<category><![CDATA[optmization]]></category>
		<category><![CDATA[otimização]]></category>
		<category><![CDATA[problem]]></category>
		<category><![CDATA[problema]]></category>
		<category><![CDATA[sublist sum]]></category>

		<guid isPermaLink="false">http://pythonlog.wordpress.com/?p=52</guid>
		<description><![CDATA[Estes dias estava desenvolvendo um programa de conciliação contábil quando me deparei com um problema de programação, no trampo. Passei o programa no canal #python-br e estamos tentando resolvê-lo da forma que tenha mais performance. Achei muito interessante o fato de conseguir envolver a todos, muita gente está tentando escrever o algoritmo. O problema consiste [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=52&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Estes dias estava desenvolvendo um programa de conciliação contábil quando me deparei com um problema de programação, no trampo. Passei o programa no canal #python-br e estamos tentando resolvê-lo da forma que tenha mais performance.</p>
<p>Achei muito interessante o fato de conseguir envolver a todos, muita gente está tentando escrever o algoritmo.</p>
<p>O problema consiste em fazer um algoritmo que ao receber uma lista de números inteiros, retorne uma sublista cuja soma é zero.</p>
<p>Porém, tem os seguintes modificadores:</p>
<div id="_mcePaste">
<ul>
<li>Caso não exista nenhuma sublista que alcance zero, a lista vazia deverá ser retornada.</li>
<li>Caso exista mais de uma sublista que some zero, o algoritmo deve encontrar aquela que tem o maior valor absoluto, ou seja, o maior valor desconsiderando o sinal (módulo).</li>
<li>Em caso de empate, qualquer uma das combinações pode ser retornada.</li>
</ul>
</div>
<p>Nada como alguns exemplos para entender melhor:</p>
<ul>
<li>Para a lista [-5, -3, 10, 16] não tem nenhuma sublista que dê zero, então o algoritmo deve retornar a lista vazia []</li>
<li>No caso da lista [-5, -3, 3, 10] o algoritmo deve calcular a sublista [-3, 3] (cuja soma dá 0).</li>
<li>Porém, se a lista é [-15, -3, 3, 18] o algortmo tem duas possibilidades cuja soma é zero:
<ul>
<li>retornar [-3, 3] (soma 0)</li>
<li>retornar [-15, -3, 18] (soma 0)</li>
</ul>
</li>
<p>Quando isso ocorrer, o algoritmo deve estar montado de forma a retornar a sublista com maior valor absoluto, ou seja, [-15, -3, 18] (soma absoluta 36).</ul>
<p>Após intensiva pesquisa, encontrei <a title="Wikipedia - Subset Sum Problem" href="http://en.wikipedia.org/wiki/Subset_sum_problem">isto</a> na wikipedia. O problema é da classe NP-Hard, e não existe solução linear. Porém com uma linguagem dinâmica, é possível fazer soluções pseudo-polinomiais.</p>
<p>O que estou procurando é justamente este algoritmo otimizado.</p>
<p>Resolvi desenvolver primeiramente o programa de referência. Este programa encontra a solução do problema através da <strong>força bruta</strong>, ou seja, gera todas as possibilidades de combinações existentes, soma cada uma pra encontrar as combinações cuja soma é zero, e depois verifica qual delas é a que tem maior valor absoluto. A resposta deste código <span style="text-decoration:underline;">sempre está correta</span>, porém, o tempo para gerar todas as possibilidades é quadrático e dobra a cada novo ítem acrescentado na lista.</p>
<p>Aqui está o programa de referência:</p>
<table class="highlighttable">
<tbody>
<tr>
<td class="linenos">
<div class="linenodiv">
<pre> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38</pre>
</div>
</td>
<td class="code">
<div class="highlight">
<pre><span style="color:#408080;font-style:italic;">#!/usr/bin/env python</span>
<span style="color:#408080;font-style:italic;"># -*- coding: utf-8 -*-</span>
<span style="color:#408080;font-style:italic;"># Copyright © 2010 Clóvis Fabrício Costa</span>
<span style="color:#408080;font-style:italic;"># Licensed under GPL version 3.0 or higher</span> 

<span style="color:#008000;font-weight:bold;">from</span> <span style="color:#0000ff;font-weight:bold;">itertools</span> <span style="color:#008000;font-weight:bold;">import</span> chain, combinations

<span style="color:#008000;font-weight:bold;">def</span> <span style="color:#0000ff;">acha_combinacao</span>(itens):
    <span style="color:#ba2121;font-style:italic;">"""</span>
<span style="color:#ba2121;font-style:italic;">    Função que resolve o problema "subset sum" através da geração de todas</span>
<span style="color:#ba2121;font-style:italic;">    as possibilidades.</span>
<span style="color:#ba2121;font-style:italic;">    </span>
<span style="color:#ba2121;font-style:italic;">    Passe uma lista de números inteiros, e a função retornará uma sublista</span>
<span style="color:#ba2121;font-style:italic;">    cuja soma é zero. </span>
<span style="color:#ba2121;font-style:italic;">    </span>
<span style="color:#ba2121;font-style:italic;">    Caso não exista nenhuma sublista que alcance zero, a lista vazia será</span>
<span style="color:#ba2121;font-style:italic;">    retornada.</span>
<span style="color:#ba2121;font-style:italic;">    </span>
<span style="color:#ba2121;font-style:italic;">    Caso exista mais de uma sublista que tem zero, o algoritmo deve encontrar</span>
<span style="color:#ba2121;font-style:italic;">    aquela que tem o maior valor absoluto, ou seja, o maior valor </span>
<span style="color:#ba2121;font-style:italic;">    desconsiderando o sinal (módulo).</span>
<span style="color:#ba2121;font-style:italic;">    </span>
<span style="color:#ba2121;font-style:italic;">    Em caso de empate, qualquer uma das combinações pode ser retornada.</span>
<span style="color:#ba2121;font-style:italic;">    """</span>
    <span style="color:#408080;font-style:italic;"># gera todas as combinações possíveis</span>
    todas_combs <span style="color:#666666;">=</span> chain<span style="color:#666666;">.</span>from_iterable(combinations(itens, n<span style="color:#666666;">+1</span>)
                                   <span style="color:#008000;font-weight:bold;">for</span> n <span style="color:#aa22ff;font-weight:bold;">in</span> <span style="color:#008000;">xrange</span>(<span style="color:#008000;">len</span>(itens)))
    <span style="color:#408080;font-style:italic;"># procura a maior</span>
    maior_comb <span style="color:#666666;">=</span> []
    maior_somaabs <span style="color:#666666;">=</span> <span style="color:#666666;">0</span>
    <span style="color:#008000;font-weight:bold;">for</span> comb <span style="color:#aa22ff;font-weight:bold;">in</span> todas_combs:
        <span style="color:#008000;font-weight:bold;">if</span> <span style="color:#008000;">sum</span>(comb) <span style="color:#666666;">!=</span> <span style="color:#666666;">0</span>:
            <span style="color:#008000;font-weight:bold;">continue</span> <span style="color:#408080;font-style:italic;"># Combinação não dá zero, pulando.</span>
        somaabs <span style="color:#666666;">=</span> <span style="color:#008000;">sum</span>([<span style="color:#008000;">abs</span>(item) <span style="color:#008000;font-weight:bold;">for</span> item <span style="color:#aa22ff;font-weight:bold;">in</span> comb])
        <span style="color:#008000;font-weight:bold;">if</span> somaabs <span style="color:#666666;">&gt;</span> maior_somaabs:
            maior_comb <span style="color:#666666;">=</span> comb
            maior_somaabs <span style="color:#666666;">=</span> somaabs
    <span style="color:#008000;font-weight:bold;">return</span> maior_comb</pre>
</div>
</td>
</tr>
</tbody>
</table>
<p>Para quem quiser tentar fazer o seu algoritmo, estou disponibilizando em meu repositório o programa de referência acima, todas as minhas tentativas até agora, um <a href="http://bitbucket.org/nosklo/subset_sum/src/tip/dados_teste.txt">arquivo de dados</a> contendo números para teste com a respectiva resposta correta, e um programa que lê este arquivo de dados e testa a sua função automaticamente. Desta forma fica fácil achar os problemas do código.</p>
<p>A versão disponibilizada no repositório é compatível com versões do python &lt; 2.6 (o código acima não é).</p>
<p>O repositório está <a href="http://bitbucket.org/nosklo/subset_sum">hospedado no bitbucket</a>, e pode ser baixado utilizando o <a href="http://mercurial.selenic.com/">mercurial</a>, com o seguinte comando:</p>
<pre>hg clone http://bitbucket.org/nosklo/subset_sum</pre>
<p>Para testar seu código, coloque seu arquivo contendo o código na mesma pasta onde você baixou o repositório acima e use o seguinte modelo:</p>
<table class="highlighttable">
<tbody>
<tr>
<td class="linenos">
<div class="linenodiv">
<pre>1
2</pre>
</div>
</td>
<td class="code">
<div class="highlight">
<pre><span style="color:#008000;font-weight:bold;">import</span> <span style="color:#0000ff;font-weight:bold;">referencia</span>
referencia<span style="color:#666666;">.</span>teste(sua_funcao)</pre>
</div>
</td>
</tr>
</tbody>
</table>
<p>Isso é o suficiente. A sua função será testada com todos os dados de teste que gerei, e vai mostrar qualquer erro encontrado nos resultados.</p>
<p>Qualquer dúvida, estou no canal #python-br da freenode. Muito obrigado a todos que estão ajudando a encontrar este algoritmo.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pythonlog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pythonlog.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pythonlog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pythonlog.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pythonlog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pythonlog.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pythonlog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pythonlog.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pythonlog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pythonlog.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pythonlog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pythonlog.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pythonlog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pythonlog.wordpress.com/52/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=52&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pythonlog.wordpress.com/2010/01/19/problema-da-soma-de-sub-itens/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a40e069c43150d08cba27f590aa7bf3c?s=96&#38;d=wavatar&#38;r=X" medium="image">
			<media:title type="html">nosklo</media:title>
		</media:content>
	</item>
		<item>
		<title>Traduzindo pylons book</title>
		<link>http://pythonlog.wordpress.com/2009/12/15/traduzindo-pylons-book/</link>
		<comments>http://pythonlog.wordpress.com/2009/12/15/traduzindo-pylons-book/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 15:14:54 +0000</pubDate>
		<dc:creator>nosklo</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[documentação]]></category>
		<category><![CDATA[documentation]]></category>
		<category><![CDATA[português]]></category>
		<category><![CDATA[pt-br]]></category>
		<category><![CDATA[pylons]]></category>
		<category><![CDATA[pylonsbook]]></category>
		<category><![CDATA[tradução]]></category>
		<category><![CDATA[translation]]></category>

		<guid isPermaLink="false">http://pythonlog.wordpress.com/?p=49</guid>
		<description><![CDATA[Iniciando trabalho de tradução do pylonsbook pra Português do Brasil! Alguém pode dar uma força? O livro está na Gnu FDL. O primeiro passo é arrumar o fonte do livro. O renatopp já criou um projeto aqui pra gente publicar a tradução.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=49&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Iniciando trabalho de tradução do pylonsbook pra Português do Brasil! Alguém pode dar uma força?</p>
<p>O livro está na Gnu FDL. O primeiro passo é arrumar o fonte do livro.</p>
<p>O renatopp já criou um projeto <a href="http://code.google.com/p/pylonsbook-ptbr/">aqui</a> pra gente publicar a tradução.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pythonlog.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pythonlog.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pythonlog.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pythonlog.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pythonlog.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pythonlog.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pythonlog.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pythonlog.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pythonlog.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pythonlog.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pythonlog.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pythonlog.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pythonlog.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pythonlog.wordpress.com/49/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=49&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pythonlog.wordpress.com/2009/12/15/traduzindo-pylons-book/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a40e069c43150d08cba27f590aa7bf3c?s=96&#38;d=wavatar&#38;r=X" medium="image">
			<media:title type="html">nosklo</media:title>
		</media:content>
	</item>
		<item>
		<title>twisted 9.0 pré</title>
		<link>http://pythonlog.wordpress.com/2009/11/24/twisted-9-0-pre/</link>
		<comments>http://pythonlog.wordpress.com/2009/11/24/twisted-9-0-pre/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 17:50:49 +0000</pubDate>
		<dc:creator>nosklo</dc:creator>
				<category><![CDATA[computers]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[async]]></category>
		<category><![CDATA[asynchronous]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[twisted]]></category>
		<category><![CDATA[twistedmatrix]]></category>

		<guid isPermaLink="false">http://pythonlog.wordpress.com/2009/11/24/twisted-9-0-pre/</guid>
		<description><![CDATA[Saiu o twisted 9 pre-release! \o/ Vamos testar enquanto ainda está quente!! Download aqui.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=46&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://labs.twistedmatrix.com/2009/11/twisted-9-is-in-works-first-pre-release.html">Saiu o twisted 9 pre-release</a>!</p>
<p>\o/</p>
<p>Vamos testar enquanto ainda está quente!!</p>
<p>Download <a href="http://twistedmatrix.com/users/radix/twisted-prereleases/9.0.0pre1/">aqui</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pythonlog.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pythonlog.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pythonlog.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pythonlog.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pythonlog.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pythonlog.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pythonlog.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pythonlog.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pythonlog.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pythonlog.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pythonlog.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pythonlog.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pythonlog.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pythonlog.wordpress.com/46/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=46&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pythonlog.wordpress.com/2009/11/24/twisted-9-0-pre/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a40e069c43150d08cba27f590aa7bf3c?s=96&#38;d=wavatar&#38;r=X" medium="image">
			<media:title type="html">nosklo</media:title>
		</media:content>
	</item>
		<item>
		<title>Definição de estrutura de diretórios de projetos python</title>
		<link>http://pythonlog.wordpress.com/2009/11/12/definicao-de-estrutura-de-diretorios-de-projetos-python/</link>
		<comments>http://pythonlog.wordpress.com/2009/11/12/definicao-de-estrutura-de-diretorios-de-projetos-python/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 00:12:33 +0000</pubDate>
		<dc:creator>nosklo</dc:creator>
				<category><![CDATA[computers]]></category>
		<category><![CDATA[irc]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://pythonlog.wordpress.com/?p=41</guid>
		<description><![CDATA[Uma dúvida que sempre surge é como definir a estrutura de pastas para um novo projeto. Eu sempre sigo estas dicas que vou passar agora, pois elas permitem uma grande facilidade de instalar, testar e distribuir o código, e assegura que ele se comportará corretamente em todas as plataformas. Crie uma pasta para seu projeto. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=41&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Uma dúvida que sempre surge é como definir a estrutura de pastas para um novo projeto. Eu sempre sigo estas dicas que vou passar agora, pois elas permitem uma grande facilidade de instalar, testar e distribuir o código, e assegura que ele se comportará corretamente em todas as plataformas.</p>
<ul>
<li>Crie uma pasta para seu projeto. Por exemplo, se seu projeto se chama NetoChat, crie uma pasta <code>NetoChat</code> para ser a raiz do seu projeto. Quando você lançar uma versão, inclua um sufixo de versão: <code>NetoChat-2.5</code></li>
<li>Crie dentro desta pasta um pacote python para conter o fonte do seu projeto. Dê a ela um nome sem traços e sem espaços, somente com letras minúsculas. Exemplo: <code>NetoChat/netochat</code>. Crie um arquivo <code>__init__.py</code> vazio dentro desta pasta para que ela seja considerada um pacote. <code>NetoChat/netochat/__init__.py</code></li>
<li>Coloque seus módulos lá dentro do pacote: <code>NetoChat/netochat/interface.py</code> <code>NetoChat/netochat/rede.py</code></li>
<li>Você também pode organizar em subpacotes. Primeiro crie <code>NetoChat/netochat/eventos/__init__.py</code> para criar um pacote eventos. Em seguida crie seus módulos lá dentro, por exemplo, N<code>etoChat/netochat/eventos/som.py</code> Fazendo desta forma, estes módulos podem ser chamados facilmente de forma absoluta, sem ambiguidades nem confusões. Exemplos:
<ul>
<li><code>from netochat.eventos import som</code></li>
<li><code>from netochat import rede</code></li>
</ul>
</li>
<li>Crie uma pasta <code>NetoChat/bin</code> onde você colocará seus executáveis. Estes executáveis devem ser scripts python sem a extensão <code>.py</code>, que possuem somente uma linha importando e executando uma função que deve estar definida em outro ponto do projeto. Não coloque o código em si nestes scripts, apenas a chamada. Exemplo, <code>NetoChat/bin/nchat</code>:
<ul>
<li><code>from netochat.interface import main_window ; main_window()</code></li>
</ul>
</li>
<li>Ponha seus <a href="http://pt.wikipedia.org/wiki/Teste_de_unidade">testes de unidade</a> em um outro pacote python. Mais uma vez, isto implica em criar o pacote (<code>NetoChat/tests/__init__.py</code>)  e colocar seus testes lá (<code>NetoChat/tests/test_rede.py</code>, <code>NetoChat/tests/test_interface.py</code>)</li>
<li>Adicione alguns arquivos que é sempre bom ter:
<ul>
<li><code>NetoChat/setup.py</code> &#8211; programa de instalação criado com <a href="http://docs.python.org/distutils/"><code>distutils</code></a> para instalar seu programa e registrá-lo automaticamente;</li>
<li><code>NetoChat/README</code> &#8211; descrição do seu programa;</li>
<li><code>NetoChat/LICENSE</code> &#8211; licença de distribuição do seu código;</li>
<li><code>NetoChat/TODO</code>, <code>NetoChat/INSTALL</code>, etc</li>
</ul>
</li>
</ul>
<p>A estrutura do código ficaria assim:</p>
<ul>
<li><code>NetoChat/</code>
<ul>
<li><code>setup.py</code></li>
<li><code>README</code></li>
<li><code>bin/</code>
<ul>
<li><code>nchat</code></li>
</ul>
</li>
<li><code>netochat/</code>
<ul>
<li><code>__init__.py</code></li>
<li><code>interface.py</code></li>
<li><code>rede.py</code></li>
<li><code>eventos</code>
<ul>
<li><code>__init__.py</code></li>
<li><code>som.py</code></li>
</ul>
</li>
<li><code>tests/</code>
<ul>
<li><code>__init__.py</code></li>
<li><code>test_interface.py</code></li>
<li><code>test_rede.py</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Por favor, não faça, repito, <strong>não faça</strong> as coisas abaixo:</p>
<ul>
<li><strong>NÃO</strong> coloque seu código fonte em uma pasta chamada <code>lib</code> ou <code>src</code> &#8211; dificulta a execução do seu código sem instalá-lo.</li>
<li><strong>NÃO</strong> ponha seus testes fora do pacote python principal do seu projeto &#8211; dificulta a execução dos testes em uma versão instalada do código</li>
<li><strong>NÃO</strong> crie um pacote com apenas um <code>__init__.py</code> e ponha o código todo em <code>__init__.py</code>. Simplesmente crie um módulo comum ao invés de um pacote. É mais simples.</li>
<li><strong>NÃO</strong> tente criar gambiarras e usar magia negra para fazer seu módulo ser importável sem que o usuário tenha que adicioná-lo ao caminho de importação dele (através de <code>PYTHONPATH</code>,<code> setup.py</code> ou qualquer outro mecanismo). Você com certeza vai deixar algo faltando e seu programa não vai rodar em alguma plataforma ou caso específico se você tentar assim. Simplesmente crie o <code>setup.py</code> usando  <a href="http://docs.python.org/distutils/"><code>distutils</code></a> e ele fará a coisa certa automaticamente.</li>
</ul>
<p>Leia em seguida a conversa de irc que deu origem a este post (uma das muitas vezes que respondi essa dúvida):</p>
<p><span id="more-41"></span>&lt;xNetoXMartinsx&gt; nosklo, estou começando ainda&#8230; sorry!<br />
&lt;nosklo&gt; xNetoXMartinsx: sim, sim, veja vou te explicar<br />
&lt;nosklo&gt; xNetoXMartinsx: suponha q seu projeto seja um cliente de IRC e chame NetoChat<br />
&lt;nosklo&gt; xNetoXMartinsx: vc cria uma pasta NetoChat para conter o projeto<br />
&lt;nosklo&gt; xNetoXMartinsx: dentro desta pasta vc coloca os arquivos setup.py (instalador do seu projeto), README, etc<br />
&lt;xNetoXMartinsx&gt; e todos os módulos eu coloco dentro daquela mesma pasta?<br />
&lt;nosklo&gt; xNetoXMartinsx: dai vc cria uma pasta NetoChat/netochat que é o pacote python do seu projeto<br />
&lt;nosklo&gt; xNetoXMartinsx: dentro vc cria um arquivo NetoChat/netochat/__init__.py vazio<br />
&lt;nosklo&gt; xNetoXMartinsx: dai vc pode criar outras subpastas, como NetoChat/netochat/comunica.py, NetoChat/netochat/tela.py NetoChat/netochat/eventos/som.py NetoChat/netochat/eventos/email.py<br />
&lt;nosklo&gt; xNetoXMartinsx: crie um NetoChat/netochat/principal.py que vai ser o seu programa principal, dentro de uma funcao def main()<br />
&lt;nosklo&gt; xNetoXMartinsx: dai vc gera um NetoChat/bin/nchat.py que dá um &#8220;from netochat.principal import main ; main()&#8221;<br />
&lt;nosklo&gt; xNetoXMartinsx: se dentro de principal.py vc precisa de comunica.py vc pode fazer: from netochat import comunica<br />
&lt;nosklo&gt; xNetoXMartinsx: from netochat.eventos import som<br />
&lt;nosklo&gt; xNetoXMartinsx: crie tbm um NetoChat/netochat/tests e ponha seus testes la<br />
&lt;xNetoXMartinsx&gt; nosklo, cara, você me ensinou tudo que eu tava querendo saber<br />
&lt;xNetoXMartinsx&gt; kkkkkkkkkkkk<br />
&lt;nosklo&gt; xNetoXMartinsx: a documentação vc poe em NetoChat/doc<br />
&lt;xNetoXMartinsx&gt; nosklo, você é o cara mano!<br />
&lt;xNetoXMartinsx&gt; nosklo, eu vou é copiar essa conversa e salvar!!!<br />
&lt;xNetoXMartinsx&gt; kkkkkkkkkkkkkkkkkkk<br />
&lt;nosklo&gt; xNetoXMartinsx: vou postá-la no meu blog<br />
&lt;nosklo&gt; xNetoXMartinsx: agora<br />
&lt;nosklo&gt; xNetoXMartinsx: pythonlog.wordpress.com<br />
&lt;nosklo&gt; xNetoXMartinsx: qdo lançar seu programa, copie ele para NetoChat-1.0<br />
&lt;nosklo&gt; xNetoXMartinsx: se compactar, fica NetoChat-1.0.tar.gz</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pythonlog.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pythonlog.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pythonlog.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pythonlog.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pythonlog.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pythonlog.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pythonlog.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pythonlog.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pythonlog.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pythonlog.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pythonlog.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pythonlog.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pythonlog.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pythonlog.wordpress.com/41/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=41&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pythonlog.wordpress.com/2009/11/12/definicao-de-estrutura-de-diretorios-de-projetos-python/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a40e069c43150d08cba27f590aa7bf3c?s=96&#38;d=wavatar&#38;r=X" medium="image">
			<media:title type="html">nosklo</media:title>
		</media:content>
	</item>
		<item>
		<title>Código no escopo global</title>
		<link>http://pythonlog.wordpress.com/2009/10/20/codigo-no-escopo-global/</link>
		<comments>http://pythonlog.wordpress.com/2009/10/20/codigo-no-escopo-global/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 05:39:44 +0000</pubDate>
		<dc:creator>nosklo</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[global]]></category>
		<category><![CDATA[import]]></category>
		<category><![CDATA[prática]]></category>
		<category><![CDATA[zen]]></category>

		<guid isPermaLink="false">http://pythonlog.wordpress.com/?p=38</guid>
		<description><![CDATA[Todo mundo parece achar que colocar código diretamente no escopo superior (global) de um módulo python é legal. Eu não ligo, só peço que, se você fizer isso, não me faça usar o programa resultante. Mais especificamente, não me faça usar frameworks ou bibliotecas que cheguem a depender deste comportamento. Afinal, tem um motivo pelo [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=38&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Todo mundo parece achar que colocar código diretamente no escopo superior (global) de um módulo python é legal. Eu não ligo, só peço que, se você fizer isso, não me faça usar o programa resultante. Mais especificamente, não me faça usar frameworks ou bibliotecas que cheguem a depender deste comportamento.</p>
<p>Afinal, tem um motivo pelo qual todo livro de Python que se preze, no primeiro capítulo, coloca uma cláusula desta forma:</p>
<pre>if __name__ == '__main__':
   # do stuff</pre>
<p>Isto permite a execução desta parte do módulo como um script, mas impede a execução caso o módulo seja importado por outro módulo. Todo script pode no futuro ser importado por outro módulo, e como o autor do módulo parece não querer que o código dentro do bloco &#8220;if&#8221; seja executado neste caso, faz sentido colocar tudo que não faz parte da inicialização do próprio módulo dentro de uma cláusula destas.</p>
<p><code>__name__</code> é uma variável definida automaticamente pelo interpretador, que recebe o valor <code>'__main__'</code> quando o script atual é o que foi iniciado no interpretador. Para scripts importados, <code>__name__</code> é o nome de importação do script. Essa diferença permite escrever código que execute condicionado ao módulo ter sido importado ou executado.</p>
<p>Importar um módulo deve fazer no máximo estas coisas:</p>
<ul>
<li>Importar outros módulos ou globais</li>
<li>Atribuir valores constantes a variáveis</li>
<li>Adicionar novas funções usando a cláusula def</li>
<li>Adicionar novas classes usando a cláusula class</li>
<li>Fluxo de controle que pode controlar partes condicionais do módulo para tratar erros ou versões específicas de certas plataformas para os casos acima.</li>
</ul>
<p>Qualquer outro tipo de lógica executada direto no corpo de um módulo python (código que roda automaticamente durante imports) é tratado com suspeita e provavelmente está no lugar errado.</p>
<p>É um absurdo construir um sistema que se inicia ou se configura baseado em efeitos colaterais da importação de módulos. Você perde o controle de quando o código será executado. Ferramentas de inspeção automática de código, geração de documentação e de testes muitas vezes precisam importar o módulo para efetuar suas tarefas, e isto causa efeitos indesejados.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pythonlog.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pythonlog.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pythonlog.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pythonlog.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pythonlog.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pythonlog.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pythonlog.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pythonlog.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pythonlog.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pythonlog.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pythonlog.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pythonlog.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pythonlog.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pythonlog.wordpress.com/38/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=38&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pythonlog.wordpress.com/2009/10/20/codigo-no-escopo-global/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a40e069c43150d08cba27f590aa7bf3c?s=96&#38;d=wavatar&#38;r=X" medium="image">
			<media:title type="html">nosklo</media:title>
		</media:content>
	</item>
		<item>
		<title>rss no wordpress</title>
		<link>http://pythonlog.wordpress.com/2009/10/08/rss-no-wordpress/</link>
		<comments>http://pythonlog.wordpress.com/2009/10/08/rss-no-wordpress/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 12:19:48 +0000</pubDate>
		<dc:creator>nosklo</dc:creator>
				<category><![CDATA[1]]></category>

		<guid isPermaLink="false">http://pythonlog.wordpress.com/?p=19</guid>
		<description><![CDATA[Como que faz pra adicionar posts via RSS de outro site aqui no wordpress? Procurei uns links e parece que não tem jeito, a não ser que eu instale meu próprio wordpress? Ridículo&#8230; Eu tenho posts em outros lugares que gostaria que viessem para meu blog. Será que eu tenho que fazer uma ferramenta automática [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=19&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Como que faz pra adicionar posts via RSS de outro site aqui no wordpress? Procurei uns links e parece que não tem jeito, a não ser que eu instale meu próprio wordpress? Ridículo&#8230; Eu tenho posts em outros lugares que gostaria que viessem para meu blog.</p>
<p>Será que eu tenho que fazer uma ferramenta automática de publicação? Algo simples, pegaria as novidades de RSSs que eu gosto e enviaria em forma de post para meu blog. O chato de uma ferramenta é que eu teria que lembrar de rodar. Deveria ter isso pronto, não?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pythonlog.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pythonlog.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pythonlog.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pythonlog.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pythonlog.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pythonlog.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pythonlog.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pythonlog.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pythonlog.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pythonlog.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pythonlog.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pythonlog.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pythonlog.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pythonlog.wordpress.com/19/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=19&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pythonlog.wordpress.com/2009/10/08/rss-no-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a40e069c43150d08cba27f590aa7bf3c?s=96&#38;d=wavatar&#38;r=X" medium="image">
			<media:title type="html">nosklo</media:title>
		</media:content>
	</item>
		<item>
		<title>ajuste a água conforme o foobar</title>
		<link>http://pythonlog.wordpress.com/2009/03/03/ajuste-a-agua-conforme-o-foobar/</link>
		<comments>http://pythonlog.wordpress.com/2009/03/03/ajuste-a-agua-conforme-o-foobar/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 20:06:48 +0000</pubDate>
		<dc:creator>nosklo</dc:creator>
				<category><![CDATA[irc]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[codecs]]></category>
		<category><![CDATA[encoding]]></category>
		<category><![CDATA[iconv]]></category>

		<guid isPermaLink="false">http://pythonlog.wordpress.com/?p=8</guid>
		<description><![CDATA[Geralmente uma simples conversa de IRC gera um projeto. Desta vez foi o meu iconv_codecs, um módulo python para encodificação e decodificação usando os codecs definidos pelo GNU iconv. Leia aqui a conversa na íntegra: &#60;NandoFlorestan&#62; socorro, o Python não tem uma encoding de que preciso. self._current_txt = pay.decode(charset, &#8216;ignore&#8217;) &#60;NandoFlorestan&#62; LookupError: unknown encoding: ansi_x3.110-1983 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=8&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Geralmente uma simples conversa de IRC gera um projeto. Desta vez foi o meu <a title="iconv_codecs no pypi" href="http://pypi.python.org/pypi/iconv_codecs" target="_blank">iconv_codecs</a>, um módulo python para encodificação e decodificação usando os codecs definidos pelo <a title="GNU libiconv" href="http://www.gnu.org/software/libiconv/" target="_blank">GNU iconv</a>. Leia aqui a conversa na íntegra:</p>
<p><span id="more-8"></span>&lt;NandoFlorestan&gt; socorro, o Python não tem uma encoding de que preciso. self._current_txt = pay.decode(charset, &#8216;ignore&#8217;)<br />
&lt;NandoFlorestan&gt; LookupError: unknown encoding: ansi_x3.110-1983<br />
&lt;nosklo&gt; NandoFlorestan, crie seu proprio encoding e registre-o<br />
&lt;NandoFlorestan&gt; heheheheh. Talvez eu consiga usar o iconv<br />
&lt;vambboy nosklo, como criar um coding?<br />
&lt;vambboy&gt; num sabia q era possível<br />
&lt;nosklo&gt; vambboy, faca uma funcao pra encodificar, uma pra decodificar, uma classe que encodifique e decodifique incrementalmente, e subclasses para escrita e leitura de streams<br />
&lt;NandoFlorestan&gt; vambboy, tá interessado? Quer fazer pra mim? Implementa aí o tal ansi_x3.110-1983&#8230;<br />
&lt;nosklo&gt; vambboy, em seguida registre estas funcoes usando codecs.register()<br />
&lt;NandoFlorestan O nosklo é uma enciclopédia<br />
&lt;nosklo&gt; eu ja fiz um encoding pra 13375p34k<br />
&lt;vambboy&gt;  é o eu diga, ele nasceu com sangue de cobra<br />
&lt;vambboy&gt; e cabra era o python<br />
&lt;vambboy&gt; kkkkkk<br />
&lt;NandoFlorestan&gt; &#8220;é o eu diga&#8221;?<br />
&lt;NandoFlorestan&gt; cabra?<br />
&lt;vambboy&gt; foi mal<br />
&lt;vambboy&gt; era cobra<br />
&lt;nosklo&gt; precisamos de um encoding pra decodificar as frases do vambboy<br />
&lt;NandoFlorestan&gt; só por causa disso, meu próximo software em python vai se chamar CABRÓN<br />
&lt;vambboy nosklo, c te ofendi desculpa<br />
&lt;nosklo&gt; ofendeu nada, eu nem entendi o q vc falou<br />
&lt;vambboy&gt; kkkkkkkkkkkkk<br />
* NandoFlorestan vê que vambboy está na berlinda&#8230;<br />
&lt;NandoFlorestan&gt; cabra + python = cabrón<br />
&lt;nosklo&gt; NandoFlorestan, tem alguma documentação deste encoding? não é mto difícil implementar encodings.<br />
&lt;NandoFlorestan&gt; Maldito seja o feadapot que resolveu me mandar email com essa desgraça&#8230;<br />
* NandoFlorestan não quer ficar fazendo encodings, saco<br />
&lt;vambboy&gt; num intendi direito o q o NandoFlorestan quer fazer<br />
&lt;NandoFlorestan&gt; vambboy, existe uma encoding chamada ansi_x3.110-1983<br />
&lt;NandoFlorestan&gt; se você tentar usá-la no Python, dá erro<br />
&lt;NandoFlorestan&gt; Ele não a conhece<br />
&lt;vambboy&gt; nunca vi<br />
&lt;NandoFlorestan&gt; Então eu vou ter que implementá-la e registrá-la<br />
&lt;NandoFlorestan&gt; Tou a fim de delegar para o iconv que todo linux tem<br />
&lt;vambboy&gt; onde é aplicada<br />
&lt;NandoFlorestan&gt; também nunca vi<br />
&lt;vambboy&gt; em q tipos d caracteres?<br />
&lt;NandoFlorestan&gt; não sei, mas é exótica mesmo<br />
* NandoFlorestan não decodificou e portanto não leu o email<br />
&lt;vambboy&gt; ah tah<br />
&lt;vambboy&gt; e quem diabos mandaria um email assim?<br />
&lt;vambboy&gt; um agente secreto?<br />
&lt;NandoFlorestan&gt; heheheh<br />
&lt;NandoFlorestan&gt; vai ajudar ou só zoar?<br />
&lt;vambboy&gt; bem<br />
&lt;vambboy&gt; procurarei algo<br />
* NandoFlorestan saca seu editor de textos colaborativo<br />
&lt;NandoFlorestan&gt; &#8230;como chamava mesmo?<br />
&lt;nosklo&gt; NandoFlorestan, se vc tiver documentação do encoding fica fácil, delegar pro iconv sux<br />
&lt;nosklo&gt; hummmmmmmm<br />
&lt;NandoFlorestan&gt; gobby<br />
* nosklo começa a escrever um encoding para iconv x.decode(&#8216;iconv:XXXX&#8217;) onde XXXX é passado para o iconv<br />
&lt;nosklo&gt; mas relaxe, mto breve vc poderá usar qq codec suportado pelo iconv<br />
&lt;NandoFlorestan&gt; <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
* nosklo está modificando o código q já tinha<br />
* NandoFlorestan pensa num recurso: dar um iconv &#8211;list e registrar todos os codecs que Python não tenha<br />
&lt;nosklo&gt; besteira<br />
&lt;nosklo&gt; NandoFlorestan, x.decode(&#8216;iconv:xxxx&#8217;)<br />
&lt;nosklo&gt; NandoFlorestan, vc só roda o subprocesso iconv se precisar usar o codec<br />
&lt;vambboy&gt; em q módulo se encontra o iconv?<br />
&lt;nosklo&gt; vambboy, iconv é um aplicativo escrito em C<br />
* NandoFlorestan testa<br />
&lt;nosklo&gt; NandoFlorestan, hah, teste depois q eu mandar o codigo <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
&lt;NandoFlorestan nosklo, não faz &#8216;iconv:xxx&#8217;<br />
&lt;NandoFlorestan&gt; faz com o nome correto da encoding: ansi_x3.110-1983<br />
&lt;nosklo&gt; NandoFlorestan, entao, isso q estou falando<br />
&lt;nosklo&gt; NandoFlorestan, no seu caso vc vai usar, suastring.decode(&#8216;iconv:ansi_x3.110-1983&#8242;)<br />
&lt;NandoFlorestan&gt; mas sem prefixo iconv:<br />
&lt;NandoFlorestan&gt; tá, mas eu vou mudar seu código pra tirar o prefixo<br />
&lt;nosklo&gt; NandoFlorestan, bom ok<br />
&lt;NandoFlorestan&gt; porque isso tá chegando de um email e eu não quero ficar lidando com exceções<br />
&lt;nosklo&gt; NandoFlorestan, a minha idéia é não precisar saber de antemão quais os codecs que tem disponíveis, pq senão eu tenho que chamar o iconv mesmo se não for precisar dele<br />
&lt;NandoFlorestan&gt; Faz sentido, mas eu acho que precisamos dos 2 modos de operação então<br />
&lt;NandoFlorestan nosklo, o comando é iconv -f utf8 -t ansi_x3.110-1983 -c<br />
&lt;NandoFlorestan&gt; -f é from, -t é to, -c é pra omitir caracteres inválidos.<br />
&lt;nosklo&gt; o -c será dado se vc passar x.decode(&#8216;iconv:xxx&#8217;, errors=&#8217;ignore&#8217;)<br />
&lt;NandoFlorestan&gt; isso isso<br />
&lt;nosklo&gt; pronto, .decode e .encode já está funcionando<br />
&lt;nosklo&gt; agora vou fazer codecs.open(&#8216;arq&#8217;, encoding=&#8217;iconv:xxxx&#8217;)<br />
&lt;vambboy&gt; quando terminarem manda um paste aí, quero estudar o código<br />
&lt;NandoFlorestan nosklo, http://pypi.python.org/pypi/iconv/1.0<br />
&lt;nosklo&gt; argh<br />
&lt;nosklo&gt; ja existe<br />
* nosklo deleta tudo<br />
&lt;NandoFlorestan&gt; caaalma<br />
&lt;NandoFlorestan&gt; tem que ver se é bom<br />
&lt;nosklo&gt; testa aí então, vou comer alguma coisa<br />
&lt;NandoFlorestan&gt; nosklo, import iconv já dá pau<br />
&lt;NandoFlorestan&gt; nosklo, essa porcaria de módulo iconv não funfa porque foi feito em C em 2005<br />
&lt;nosklo&gt; NandoFlorestan, okay, continuando</p>
<p><strong><em>(&#8230; alguns minutos depois &#8230;)</em></strong></p>
<p>&lt;nosklo&gt; bom, tá funcioando<br />
&lt;nosklo&gt; funcionando<br />
&lt;nosklo&gt; NandoFlorestan, vambboy, huahauhauahuaha<br />
&lt;nosklo&gt; &gt;&gt;&gt; u&#8217;teste&#8217;.encode(&#8216;iconv:CP284&#8242;)<br />
&lt;nosklo&gt; &#8216;\xa3\x85\xa2\xa3\x85&#8242;<br />
&lt;nosklo&gt; &gt;&gt;&gt; _.decode(&#8216;iconv:CP284&#8242;)<br />
&lt;nosklo&gt; u&#8217;teste&#8217;<br />
&lt;NandoFlorestan&gt; nosklo, cadê?<br />
&lt;NandoFlorestan&gt; cá&#8230; dê !!! dê cá!<br />
&lt;NandoFlorestan nosklo&#8230; por favor?<br />
&lt;nosklo&gt; NandoFlorestan, opa&#8230; ja vai, colando&#8230;<br />
&lt;vambboy&gt; nosklo, tô vuando isso quer dizer que funcionou?<br />
&lt;nosklo&gt; NandoFlorestan, vambboy, tá ai http://dpaste.com/5377/<br />
&lt;nosklo&gt; só dá um import estearquivo<br />
&lt;nosklo&gt; e pronto<br />
&lt;nosklo&gt; vc pode usar qq codec do iconv<br />
&lt;nosklo&gt; no codecs.open etc</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pythonlog.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pythonlog.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pythonlog.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pythonlog.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pythonlog.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pythonlog.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pythonlog.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pythonlog.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pythonlog.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pythonlog.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pythonlog.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pythonlog.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pythonlog.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pythonlog.wordpress.com/8/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=8&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pythonlog.wordpress.com/2009/03/03/ajuste-a-agua-conforme-o-foobar/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a40e069c43150d08cba27f590aa7bf3c?s=96&#38;d=wavatar&#38;r=X" medium="image">
			<media:title type="html">nosklo</media:title>
		</media:content>
	</item>
		<item>
		<title>Licenciamento</title>
		<link>http://pythonlog.wordpress.com/2009/03/02/licenciamento/</link>
		<comments>http://pythonlog.wordpress.com/2009/03/02/licenciamento/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 17:02:45 +0000</pubDate>
		<dc:creator>nosklo</dc:creator>
				<category><![CDATA[irc]]></category>
		<category><![CDATA[licenciamento]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[gpl]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[software-as-a-service]]></category>

		<guid isPermaLink="false">http://pythonlog.wordpress.com/?p=5</guid>
		<description><![CDATA[Estava hoje cedo no irc e tive uma conversa interessante sobre licenciamento e ganhar dinheiro com programas python e opensource. Coloco aqui a conversa na íntegra. &#60;durfos&#62; Hai ! raça &#60;durfos&#62; podem me dar um help para entender a licença do python &#60;durfos&#62; ? &#60;durfos&#62; o povo lah do escritorio quer usar python pra fazer [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=5&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Estava hoje cedo no irc e tive uma conversa interessante sobre licenciamento e ganhar dinheiro com programas python e opensource.<br />
Coloco aqui a conversa na íntegra.</p>
<p><span id="more-5"></span>&lt;durfos&gt; Hai ! raça<br />
&lt;durfos&gt; podem me dar um help para entender a licença do python<br />
&lt;durfos&gt; ?<br />
&lt;durfos&gt; o povo lah do escritorio quer usar python pra fazer um software pra vender .. tem algum problema ?<br />
&lt;durfos&gt; e outra eles num querem enviar o codigo soh os bytecode pro cliente<br />
&lt;Khaoz&gt; durfos: dando uma olhada por cima da licensa, parece que você pode fazer isso sim.<br />
&lt;nosklo&gt; não que enviar só o bytecode tenha alguma utilidade<br />
&lt;nosklo&gt; durfos, não tem binário, o python é compilado para bytecode, e este bytecode pode ser facilmente decompilado<br />
&lt;durfos&gt; a certo eu não sabia q era tão fácil assim<br />
&lt;nosklo&gt; durfos, em qualquer linguagem decompilação é muito fácil. Tentar esconder o código hoje em dia é besteira<br />
&lt;durfos&gt; o pessoal com quem trabalho .. esta afim de fazer um aplicativo comercial<br />
&lt;nosklo&gt; durfos, Aplicativos livres e de código aberto podem ser vendidos comercialmente<br />
&lt;durfos&gt; e usar alguns módulos inclusive readline que é GPL ..<br />
&lt;durfos&gt; certo entendi .. vc tem razão<br />
&lt;nosklo&gt; durfos, GPL tem uma cláusula que permite a venda do programa<br />
&lt;nosklo&gt; GPL nunca restringiu venda<br />
&lt;durfos&gt; tem ?<br />
&lt;nosklo&gt; claro!<br />
&lt;durfos&gt; entendi<br />
&lt;durfos&gt; é verdade .. tem q enviar o source junto né .. essa é a clausula e manter os nome dos autores<br />
&lt;nosklo&gt; se for GPL, a única coisa que você não pode fazer é impedir quem comprar o seu programa de distribuí-lo<br />
&lt;nosklo&gt; o source você tem que mandar de qq jeito, afinal é em python<br />
&lt;durfos&gt; é verdade faz todo sentido .. não vale a pena mesmo pra gente .. os pode fazer é só enviar os pyc bytecode ..<br />
&lt;durfos&gt; no caso de vender a app<br />
&lt;nosklo&gt; qdo vc desenvolve um software, se vc não usar nenhuma lib que te obrigue a adotar alguma licença, você pode criar sua própria licença dizendo que o que vc quer que o cara possa fazer com o programa<br />
&lt;durfos&gt; mesmo assim nada impede da decompialacão<br />
&lt;nosklo&gt; mandar só os bytecode não vale a pena, não faça isso<br />
&lt;durfos&gt; pq ?<br />
&lt;nosklo&gt; os bytecodes são específicos da versão do python que você os criou, e só rodam nesta versão e plataforma<br />
&lt;nosklo&gt; e você não ganha nada mandando só o bytecode<br />
&lt;nosklo&gt; não te dá nenhuma vantagem de obscuridade<br />
&lt;durfos&gt; tá .. mas eu ralei pra fazer meu software, um cara pega .. e vende ele sem nenhum esforço<br />
&lt;nosklo&gt; para impedir isso você usa uma licença<br />
&lt;nosklo&gt; mandar em bytecode não segura o cara, o que segura, legalmente, é a licença do software<br />
&lt;durfos&gt; tá mas ae eu vou precisar escrever do zero tudo em C ?<br />
&lt;nosklo&gt; não tem nada a ver<br />
&lt;durfos&gt; eu posso colocar outra licença sobre o python ?<br />
&lt;nosklo&gt; você pode escrever em qualquer linguagem<br />
&lt;nosklo&gt; a licença do python não influencia em nada na licença do software em python que você escreve<br />
&lt;nosklo&gt; para distribuir o python você segue a licença do python<br />
&lt;nosklo&gt; mas para distribuir seu programa você pode criar a forma de licenciamento<br />
&lt;durfos&gt; a tá no caso a licença do python é usada para distribuir o source do interpretador é isso ?<br />
&lt;durfos&gt; e para distribuir meu código eu uso outra licença<br />
&lt;nosklo&gt; exatamente. Você pode até distribuir seu código sem um interpretador, daí o cara pode pegar qualquer interpretador e rodar, Cpython, activepython, jython, Pypy, IronPython<br />
&lt;durfos&gt; mas seu usar no caso um modulo q tem licença GPL digamos o SQLObject<br />
&lt;nosklo&gt; aí para distribuir código que usa esta lib você tem que seguir os termos da licença da lib<br />
&lt;nosklo&gt; ou seja seu código teria q ser GPL<br />
&lt;durfos&gt; entendeu .. eu vou ter q dar parte do meu source .. em GLP não vou poder aplicar minha licença em cima<br />
&lt;nosklo&gt; exatamente. Porém mesmo sendo GPL você pode vender. Só que o cara que comprou vai poder redistribuir a vontade<br />
&lt;nosklo&gt; agora que você entendeu: vou te contar o canal para desenvolvimento opensource comercial<br />
&lt;nosklo&gt; -&gt; venda de serviço<br />
&lt;nosklo&gt; você dá o software pro seu cliente, mas vende os serviços de instalação, customização, treinamento, manutenção<br />
&lt;nosklo&gt; o software é GPL mas o serviço não<br />
&lt;durfos&gt; é isso eu já manjei <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
&lt;durfos&gt; trabalho com algo assim já<br />
&lt;nosklo&gt; o cliente vai querer que você faça o serviço pq foi vc que fez o programa, ninguém melhor q vc para mexer nele<br />
&lt;durfos&gt; minha duvida era com o bytecode seu eu posso colocar licença nele<br />
&lt;nosklo&gt; esquece bytecode<br />
&lt;nosklo&gt; bytecode é besteira, distribui o fonte de qq forma<br />
&lt;durfos&gt; entendi<br />
&lt;nosklo&gt; se não usar nenhuma lib com licença viral, você pode sim distribuir seu código em qq licença.  A licença do python não impede isso<br />
&lt;durfos&gt; é, mas a sqlobject é viral<br />
&lt;durfos&gt; ela é GPL<br />
&lt;nosklo&gt; então pra usar sqlobject você tem que distribuir seu código em GPL também. Não tem alternativa<br />
&lt;nosklo&gt; pq vc não usa sqlalchemy? é bem melhor!<br />
&lt;durfos&gt; aé melhor ?<br />
&lt;nosklo&gt; com certeza!<br />
&lt;durfos&gt; vc trabalho com python a quanto tempo .. ?<br />
&lt;nosklo&gt; profissionalmente tem uns 3 anos<br />
&lt;durfos&gt; e vc distribui seu source só pro cliente q vc vende o software certo ?<br />
&lt;durfos&gt; ou melhor vende o serviço<br />
&lt;nosklo&gt; bom, eu sou contratado por uma empresa, o software que eu desenvolvo pertence a empresa, ela licencia como quiser<br />
&lt;nosklo&gt; geralmente nao licencia<br />
&lt;nosklo&gt; usa internamente e pronto<br />
&lt;nosklo&gt; como o software nao vai ser distribuido, nao precisa de licença<br />
&lt;durfos&gt; entendi<br />
&lt;durfos&gt; eu fui pro sqlobject pq eu achei ele rápido e intuitivo<br />
&lt;durfos&gt; bom . na verdade foi o único q eu experimentei<br />
&lt;nosklo&gt; bom, sqlalchemy é mto melhor<br />
&lt;nosklo&gt; sqlobject mistura a declaração da classe com a da tabela<br />
&lt;nosklo&gt; o sqlalchemy separa isso<br />
&lt;nosklo&gt; de forma que você pode vincular qualquer query à Classe<br />
&lt;nosklo&gt; isso é mto útil<br />
&lt;nosklo&gt; mapear classes a queries<br />
&lt;nosklo&gt; mas tem outras diferenças<br />
&lt;durfos&gt; hum .. e desempenho ?<br />
&lt;nosklo&gt; coisas como polimorfismo, herança multipla, versionamento de registro, ordenação automática de relacionamento, que eu acho que não tem no sqlobject<br />
&lt;durfos&gt; caraka versionamento de registro !? polimorfismo ?<br />
&lt;durfos&gt; me convenceu !<br />
&lt;nosklo&gt; se vc quiser for usar o sqlalchemy, criei o canal #sqlalchemy-br aqui na freenode a algum tempo e estou sempre lá<br />
&lt;durfos&gt; blz !<br />
&lt;nosklo&gt; e a licença do sqlalchemy é MIT<br />
&lt;durfos&gt; vou passar lá com certeza<br />
&lt;nosklo&gt; &lt;durfos&gt; e vc distribui seu source só pro cliente q vc vende o software certo ?<br />
&lt;nosklo&gt; &lt;durfos&gt; ou melhor vende o serviço<br />
&lt;durfos&gt; legal !<br />
&lt;nosklo&gt; sim, é assim que eu faria<br />
&lt;nosklo&gt; depende do source é claro<br />
&lt;nosklo&gt; posso distribuir para todos tbm dependendo do que for, pode me ajudar a conseguir mais clientes se eu divulgar o código<br />
&lt;durfos&gt; hum interessante<br />
&lt;nosklo&gt; e se colocar o código em GPL posso conseguir ajuda de outros programadores gratuitamente<br />
&lt;nosklo&gt; tendo assim um código de qualidade maior com menos custo e esforço<br />
&lt;nosklo&gt; do que fazendo tudo sozinho<br />
&lt;durfos&gt; é eu sou mais fã das licenças do tipo BSD<br />
&lt;durfos&gt; é vc tem razão, e as licenças tem os dois gumes né <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
&lt;nosklo&gt; o problema é que o cara pega seu código, modifica, e licencia na licença dele e você não pega as modificações<br />
&lt;nosklo&gt; eu sou a favor de ganhar dinheiro em troca de trabalho<br />
&lt;nosklo&gt; não vendendo licença<br />
&lt;nosklo&gt; por isso prefiro vender serviço<br />
&lt;durfos&gt; é o estilo que a Red Hat adotou e supreendeu todo mundo em 2004<br />
&lt;nosklo&gt; sou contra o cara que faz um programa uma vez e depois quer ganhar dinheiro com ele para sempre<br />
&lt;nosklo&gt; geralmente faço o programa sob encomenda, então recebo uma vez e pronto, o programa vai pra GPL. Eu já recebi.<br />
&lt;nosklo&gt; Se quiser continuar recebendo tenho que continuar trabalhando.<br />
&lt;nosklo&gt; Então vendo serviço&#8230;<br />
&lt;durfos&gt; depende do programa q vc vai fazer<br />
&lt;durfos&gt; na verdade depende do jeito q cada um quer ganhar dinheiro é gosto<br />
&lt;nosklo&gt; não acho legal eu ir recebendo por &#8220;cópias do programa&#8221;, sem trabalhar deitado na minha cama<br />
&lt;durfos&gt; é gosto né<br />
&lt;nosklo&gt; não, é ética<br />
&lt;durfos&gt; mas digamos q vc faz um programa legal pacas pra um cliente seu<br />
&lt;durfos&gt; e ele te paga beeeeeeeem<br />
&lt;durfos&gt; ae vc vai lá e licencia .. GPL<br />
&lt;durfos&gt; um cliente q ia te pagar mais ainda por ele .. pega o source . e usa e pronto, vc não sentirá mal ?<br />
&lt;durfos&gt; tipo poderia ter ganhado bem mais ?<br />
&lt;nosklo&gt; não<br />
&lt;nosklo&gt; eu já recebi pelo serviço que eu fiz<br />
&lt;nosklo&gt; recebi o tanto que o serviço vale<br />
&lt;nosklo&gt; para receber mais, éticamente eu tenho que trabalhar mais<br />
&lt;nosklo&gt; o outro cliente vai acabar me chamando pra configurar/customizar pra ele pq fui eu q fiz o programa<br />
&lt;nosklo&gt; daí eu ganho mais, porém por ter trabalhado mais<br />
&lt;durfos&gt; é interessante<br />
&lt;nosklo&gt; o primeiro cara já me pagou, o programa vai pra GPL, todo mundo pode usar e ajudar a melhorar ainda mais o programa, que é legal pacas<br />
&lt;nosklo&gt; o resultado final é melhor para todos<br />
&lt;nosklo&gt; se eu fechar, meu programa não vai ser tão &#8220;legal pacas&#8221; assim<br />
&lt;durfos&gt; <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
&lt;durfos&gt; mas e se o cliente comprar teu source ?<br />
&lt;nosklo&gt; a empresa que trabalho atualmente é assim, escrevo o source mas ele não é meu<br />
&lt;nosklo&gt; recebo pelo meu serviço do mesmo jeito<br />
&lt;nosklo&gt; uso um monte de coisas GPL então se a empresa quiser distribuir vai ter q licenciar em GPL<br />
&lt;durfos&gt; mas vc não pode licenciar em GPL<br />
&lt;nosklo&gt; poderia<br />
&lt;nosklo&gt; não posso pq ele não é meu<br />
&lt;durfos&gt; exatamente<br />
&lt;nosklo&gt; mas poderia licenciar no que eu quisesse, pq não vou distribuir<br />
&lt;nosklo&gt; a licença só serve qdo vc vai distribuir<br />
&lt;nosklo&gt; se vc vai usar vc mesmo o programa, não importa a licença<br />
&lt;durfos&gt; tá eu vou vender pra várias empresas meu prgrama .. e não vou enviar o source ? se eles pedirem eu tenho q dar<br />
&lt;durfos&gt; isso é certo<br />
&lt;nosklo&gt; você tem que mandar o source de qualquer jeito<br />
&lt;nosklo&gt; pra eles poderem rodar o programa, precisam do source<br />
&lt;nosklo&gt; python funciona assim<br />
&lt;nosklo&gt; a questão é como você vai licenciar o source para entregar para eles<br />
&lt;nosklo&gt; no meu caso atual o source é deles<br />
&lt;durfos&gt; é ae eu posso licenciar pra eles sobre a minha licença ..<br />
&lt;nosklo&gt; eu não posso sair e levar pra outra empresa, eu teria que começar de novo<br />
&lt;durfos&gt; e no caso vou ter q tirar o sql object da jogada<br />
&lt;nosklo&gt; ou então, licencia em GPL<br />
&lt;nosklo&gt; você tem que entregar o source mesmo<br />
&lt;nosklo&gt; qualquer q seja a licença<br />
&lt;durfos&gt; maravilha entendi perfeitamente<br />
&lt;durfos&gt; vlw pela ajuda nosklo!<br />
&lt;nosklo&gt; durfos, &#8220;licenciamento&#8221; é uma lei restritiva artificial que serve para estimular a criatividade e o desenvolvimento<br />
&lt;nosklo&gt; durfos, porém ela acaba cumprindo mal o seu papel, pq com licenças restritivas todo mundo fica reescrevendo a mesma coisa de forma inferior<br />
&lt;nosklo&gt; durfos, quantos programas de controle de estoque vc já viu?<br />
&lt;nosklo&gt; heheheh<br />
&lt;durfos&gt; rsrs<br />
&lt;durfos&gt; miilhoes hein ! rs<br />
&lt;nosklo&gt; se todo mundo programasse pra 5 ou 6 programas de controle de estoque BONS, GPL<br />
&lt;nosklo&gt; ia ser um estimulo muito maior ao desenvolvimento e criatividade<br />
&lt;nosklo&gt; do que nego que acaba de aprender a programar, ficar querendo fazer um programa só de controle de estoque e vender ele pra todo mundo<br />
&lt;durfos&gt; rsrs<br />
&lt;nosklo&gt; então a lei de direito autoral está furada, ela não está servindo para o que deveria, quem deveria ganhar não está ganhando.<br />
&lt;nosklo&gt; a GPL é uma tentativa de consertar isso<br />
&lt;nosklo&gt; pq acontece que existem 100000 programas de cont. estoque ruins, você faz mais um, e acaba tendo que vender pra meia duzia de gatos pingados por 10 reais<br />
&lt;nosklo&gt; ao inves ter uns poucos programas, porem bons e completos, e você vender customizações e serviços em cima deles<br />
&lt;durfos&gt; é infelizmente isso numca vai mudar né<br />
&lt;nosklo&gt; quem ganha com essa lei e licenciamento são só gigantes como Corel, Microsoft&#8230;<br />
&lt;nosklo&gt; nós meros mortais ganhamos mixaria<br />
&lt;nosklo&gt; ganhamos mais é trabalhando mesmo</p>
<p>&lt;NandoFlorestan&gt; nosklo, concordo tanto com as coisas que você falou agora que é como se eu fosse 50<br />
&lt;NandoFlorestan&gt; &#8230;50% mais inteligente e as tivesse dito eu mesmo.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pythonlog.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pythonlog.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pythonlog.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pythonlog.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pythonlog.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pythonlog.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pythonlog.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pythonlog.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pythonlog.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pythonlog.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pythonlog.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pythonlog.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pythonlog.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pythonlog.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pythonlog.wordpress.com&amp;blog=5906752&amp;post=5&amp;subd=pythonlog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pythonlog.wordpress.com/2009/03/02/licenciamento/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a40e069c43150d08cba27f590aa7bf3c?s=96&#38;d=wavatar&#38;r=X" medium="image">
			<media:title type="html">nosklo</media:title>
		</media:content>
	</item>
	</channel>
</rss>
