<?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>Conocimiento Abierto &#187; python</title>
	<atom:link href="http://conocimientoabierto.es/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://conocimientoabierto.es</link>
	<description></description>
	<lastBuildDate>Mon, 02 Apr 2012 23:14:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Herramientas de análisis de código estático en Python</title>
		<link>http://conocimientoabierto.es/herramientas-analisis-codigo-estatico-python/468/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=herramientas-analisis-codigo-estatico-python</link>
		<comments>http://conocimientoabierto.es/herramientas-analisis-codigo-estatico-python/468/#comments</comments>
		<pubDate>Mon, 02 Apr 2012 23:14:47 +0000</pubDate>
		<dc:creator>fpuga</dc:creator>
				<category><![CDATA[Sin categoría]]></category>
		<category><![CDATA[análisis estático de código]]></category>
		<category><![CDATA[comparativa]]></category>
		<category><![CDATA[desarrollo sofware]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://conocimientoabierto.es/?p=468</guid>
		<description><![CDATA[Programar es fácil, y puede hacerse con el bloc de notas. Escribir buen código es bastante más complicado, por ello existen un montón de herramientas que pueden ayudarnos. Un tipo de herramientas que he empezado a usar (en python) ultimamente son las de análisis estático de código. Estas herramientas examinan tu código (sin ejecutarlo) en [...]]]></description>
			<content:encoded><![CDATA[<p>Programar es fácil, y puede hacerse con el bloc de notas. Escribir buen código es bastante más complicado, por ello existen un montón de herramientas que pueden ayudarnos. Un tipo de herramientas que he empezado a usar (en python) ultimamente son las de <a href="http://en.wikipedia.org/wiki/Static_program_analysis">análisis estático de código</a>. <a href="http://eetimes.com/design/embedded/4006735/Integrate-static-analysis-into-a-software-development-process">Estas herramientas</a> examinan tu código (sin ejecutarlo) en busca de ciertos patrones, alertando de &#8220;code smells&#8221;, incroguencias de estilo, posibles bugs, código repetido e incluso dando consejos sobre rendimiento o encapsulamiento en algunos casos.</p>
<p>En python tenemos disponibles <a href="http://www.doughellmann.com/articles/pythonmagazine/completely-different/2008-03-linters/">distintos analizadores de código</a>, y es habitual <a href="http://stackoverflow.com/questions/1428872/pylint-pychecker-or-pyflakes">ver preguntas sobre cual es mejor</a>. Las cuatro herramientas de este tipo para python están actualizadas a las últimas versiones en los repositorios de ubuntu. Para instalarlas:</p>
<div class="codecolorer-container bash geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> pyflakes pep8 pychecker pylint</div></div>
<h2>Pyflakes</h2>
<p><a href="http://pypi.python.org/pypi/pyflakes">Pyflakes</a>parece la más sencilla de las cuatro herramientas que he usado. Hace pocas comprobaciones del tipo, imports no usados, variables asignadas y no empleadas, &#8230;<br />
No chequea el estilo, ni advierte sobre posibles bugs, aunque dicen que es de las más rápidas, por lo que es la que la gente suele usar como &#8220;chequeador de código automático&#8221; en IDEs como PyDev o emacs.</p>
<h2>pep8</h2>
<p><a href="http://pypi.python.org/pypi/pep8">pep8</a> valida el estilo de nuestro código (de forma bastante rigurosa) contra el estándar de estilo PEP8 de Python. Puede ayudar a detectar &#8220;code smells&#8221;, pero no chequea &#8220;errores&#8221;. Comprueba cosas como que las líneas no tengan más de 80 caracteres, los nombres de variables tengan un determinado formato, &#8230;</p>
<p>Para chequear un fichero llega con hacer:</p>
<div class="codecolorer-container bash geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">pep8 nombre_de_ficheros.py</div></div>
<p>Aunque habitualmente se lanza con más opciones para obtener más información:</p>
<div class="codecolorer-container bash geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">pep8 <span style="color: #660033;">--show-source</span> <span style="color: #660033;">--show-pep8</span> nombre_de_ficheros.py</div></div>
<p>Cuando lo lanzamos con <em>&#8211;show-pep8</em> proporciona bastante información sobre la regla de estilo que estamos rompiendo por lo que resulta útil para ir interiorizándolas.</p>
<h2>Pychecker</h2>
<p>P<a href="http://pychecker.sourceforge.net/">ychecker</a> es la más antigua pero ahora está algo parado. La última versión 0.8.19 es de enero de 2011 y la anterior del 2008. PyChecker si que es bastante potente en cuanto a la detección de posibles bugs o errores como el de usar una variable antes de asignales un valor, llamar a un método que no existe, &#8230; En general detecta bastantes de esos errores que se cometen en python (cuando no se usa un IDE que ya detecte estas cosas)<br />
Parámetros interesantes.<br />
<em>&#8211;blacklist</em>=unittest Este módulo de python saca algún error con pychecker, así que para evitar ruido le decimos que no lo chequee.</p>
<h2>Pylint</h2>
<p>P<a href="http://www.logilab.org/project/pylint">ylint</a> es una especie de mezcla entre pep8 y pychecker puesto que hace análisis tanto del estilo del código como de posibles bugs. Tiene un <a href="http://blog.milmazz.com.ve/archivos/2010/03/13/pylint-analisis-estatico-del-codigo-en-python">montón de características</a>, es extensible mediante plugins, &#8230;</p>
<p>El informe que proporciona sobre el código es bastante extenso, clasifica los errores por su gravedad, &#8230; Como tiene muchas opciones es conveniente echarle un ojo al <a href="http://www.logilab.org/card/pylint_tutorial">tutorial</a> y al <a href="http://www.logilab.org/card/pylint_manual">manual</a> aunque no hace falta para ver su potencial.</p>
<p>Los parámetros más interesantes de pyling son:</p>
<ul>
<li><em>&#8211;reports=n</em> Para que sólo nos saque los posibles errores y no imprima las estadísticas e informes. Puede ser útil ver el informe de vez en cuando, pero si vamos a pasar el chequeo muchas veces sólo mete ruido.</li>
<li><em>&#8211;include-ids=y</em> Por defecto no nos muestra el código de error completo. Con esto hacemos que nos lo muestre para poder obtener más información sobre él si no lo entendemos (Esto lo haríamos con pyling <em>&#8211;help-msg=ERROR_CODE</em>)</li>
<li><em>&#8211;disable=C0111</em> Esto hace que no se chequeen, los errores C0111, que indican que todos los métodos deberían tener un docstring. Me gusta eliminarlos porque soy de los que piensan que &#8220;los comentarios apestan&#8221;</li>
</ul>
<p>Para que la línea de comandos no se vuelva muy complicada estás opciones pueden indicarse en un fichero de configuración para que sean usadas por defecto</p>
<h2>Como y cuando usarlas</h2>
<p>Lo que me gusta de estas cuatro herramientas es que no hay excusa para no usarlas. Son realmente sencillas, rápidas, y ayudan a hacer un código más legible y mantenible.</p>
<p>Por ahora, para acostumbrarme a ellas, lo que hago es al inicio de cada sesión de trabajo paso las cuatro herramientas en el siguiente orden:</p>
<ol>
<li>pep8 &#8211;show-source &#8211;show-pep8 *.py</li>
<li>pylint &#8211;reports=n &#8211;include-ids=y &#8211;disable=C0111 *.py</li>
<li>pychecker &#8211;blacklist=unittest *.py</li>
<li>pyflakes *.py</li>
</ol>
<p>Lo hago así porque me gusta la información sobre el estilo que proporciona pep8, y tras solucionar los errores de pylint ni pychecker ni pyflakes me están proporcionando ayuda adicional así que es probable que pronto deje de usarlos. De hecho cuando me acostumbre a la guía de estilo de pep8 es probable que sólo use pylint.</p>
<p>Como el proyecto en el que la estoy probando apenas son 6 o 7 clases de alrededor de 200 líneas, está forma de trabajar me resulta cómoda y me permite aprender a usarlas, pero está claro que en otros contextos puede no ser lo más adecuado.</p>
<p>En el próximo artículo de esta serie hablaremos sobre como integrar estas herramientas en emacs, al estilo de las sugerencias de eclipse u otros IDE, y otras aproximaciones un poco más sofisticadas de como integrarlas en nuestro flujo de trabajo.</p>
<p>¡Pruebas y cuéntame!</p>
]]></content:encoded>
			<wfw:commentRss>http://conocimientoabierto.es/herramientas-analisis-codigo-estatico-python/468/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Python Scripting for Students of Remote Sensing</title>
		<link>http://conocimientoabierto.es/python-scripting-for-students-of-remote-sensing/391/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=python-scripting-for-students-of-remote-sensing</link>
		<comments>http://conocimientoabierto.es/python-scripting-for-students-of-remote-sensing/391/#comments</comments>
		<pubDate>Sun, 02 Oct 2011 15:14:35 +0000</pubDate>
		<dc:creator>fpuga</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[desarrollo sofware]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[teledetección]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://conocimientoabierto.es/?p=391</guid>
		<description><![CDATA[Python Scripting for Students of Remote Sensing es un manual de python orientado a la teledetección. Si no sabes nada de python es mejor empezar por otro manual y luego saltar directamente al capítulo 5, &#8220;Plottin&#8221;. La parte de python en sí es muy básica y no está muy bien explicada. Del capítulo 5 al 10 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.landmap.ac.uk/index.php/Learning-Materials/Python-Scripting/Python-Scripting-for-Students-of-Remote-Sensing/menu-id-100767.html">Python Scripting for Students of Remote Sensing</a> es un manual de python orientado a la teledetección. Si no sabes nada de python es mejor empezar por otro manual y luego saltar directamente al capítulo 5, &#8220;Plottin&#8221;. La parte de python en sí es muy básica y no está muy bien explicada. Del capítulo 5 al 10 se muestran algunas librerías interesantes de python para mostrar gráficos (matplotlib), para estadística y calculos científicos (numpy), para procesado de raster (gdal), o ejemplos sencillos de trabajo con datos lidar en ficheros ascii. La información que dan es bastante escueta, pero si ya conoces python en un par de horas puedes leerlo para hacerte una idea de que posibilidades hay en estos campos.</p>
<p>En la misma página se pueden encontrar otros manuales interesantes sobre teledetección.</p>
<p>Descubrí el curso gracias al <a href="http://conocimientoabierto.es/curso-objetivo-programacao-python/325/comment-page-1/#comment-15182">comentario</a> de <a href="http://joseguerreroa.wordpress.com/">José Guerrero</a>.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://conocimientoabierto.es/python-scripting-for-students-of-remote-sensing/391/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Um curso objetivo de programação em Python</title>
		<link>http://conocimientoabierto.es/curso-objetivo-programacao-python/328/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=curso-objetivo-programacao-python</link>
		<comments>http://conocimientoabierto.es/curso-objetivo-programacao-python/328/#comments</comments>
		<pubDate>Wed, 01 Jun 2011 07:04:09 +0000</pubDate>
		<dc:creator>fpuga</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[desarrollo sofware]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://conocimientoabierto.es/?p=325</guid>
		<description><![CDATA[Gracias al blog de Anderson Medeiros encuentro un interesante tutorial de python escrito en Portugués pero muy facilito de seguir. Es un tutorial de introducción, rápido de leer y que me ha ayudado a recordar algunos de esos conceptos que por estar más habituado a otros lenguajes tipo Java no empleas a menudo. Algunas cosillas [...]]]></description>
			<content:encoded><![CDATA[<p>Gracias al blog de <a href="http://andersonmedeiros.wordpress.com/2010/06/13/curso-online-de-python/trackback/">Anderson Medeiros</a> encuentro un <a href="http://www.async.com.br/projects/python/pnp/node20.html">interesante tutorial de python escrito en Portugués</a> pero muy facilito de seguir.</p>
<p>Es un tutorial de introducción, rápido de leer y que me ha ayudado a recordar algunos de esos conceptos que por estar más habituado a otros lenguajes tipo Java no empleas a menudo.</p>
<p>Algunas cosillas que he recordado, aprendido o me han gustado.</p>
<h3>Listas, tupas y strings</h3>
<p>Explica bien que son <a href="http://www.async.com.br/projects/python/pnp/node13.html">listas, tuplas, diccionarios y strings</a>. A listas y tuplas se las llama en ocasiones secuencias puesto que sus propiedades son muy parecidas. Una tupla es en realidad una lista inmutable.</p>
<p>Conviene tener en la cabeza lo fácil que es hacer slices (subconjuntos de secuencias) y substrings en python, incluso empleando índices negativos para empezar a contar por el final. LLega con escribir:</p>
<div class="codecolorer-container text geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&amp;gt;&amp;gt;&amp;gt; lista = ['a', 'b', 'c', 'd', 'e', 'f', 'g']<br />
&amp;gt;&amp;gt;&amp;gt; lista[2:5]<br />
['c', 'd', 'e']<br />
&amp;gt;&amp;gt;&amp;gt; &nbsp;lista[2:]<br />
['c', 'd', 'e', 'f', 'g']<br />
&amp;gt;&amp;gt;&amp;gt; lista[:5]<br />
['a', 'b', 'c', 'd', 'e']<br />
&amp;gt;&amp;gt;&amp;gt; lista[:-2]<br />
['a', 'b', 'c', 'd', 'e']<br />
&amp;gt;&amp;gt;&amp;gt; lista[-2:]<br />
['f', 'g']</div></div>
<p>Los operadores * y + se pueden usar sobre listas, tuplas y strings. * replica n veces el elemento y + concatena.</p>
<p>Ejemplo para strings:</p>
<div class="codecolorer-container text geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&amp;gt;&amp;gt;&amp;gt; a = &quot;exato&quot;<br />
&amp;gt;&amp;gt;&amp;gt; print a * 2<br />
exatoexato<br />
&amp;gt;&amp;gt;&amp;gt; print &quot;quase &quot; + a<br />
quase exato</div></div>
<p>Ejemplo para listas:</p>
<div class="codecolorer-container text geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&amp;gt;&amp;gt;&amp;gt; a = [-1, 0]<br />
&amp;gt;&amp;gt;&amp;gt; b = [1, 2, 3]<br />
&amp;gt;&amp;gt;&amp;gt; print b * 3<br />
[1, 2, 3, 1, 2, 3, 1, 2, 3]<br />
&amp;gt;&amp;gt;&amp;gt; print a + b<br />
[-1, 0, 1, 2, 3]</div></div>
<p>Para chequear si un elemento está contenido en una secuencia o diccionario se usa el operador in</p>
<div class="codecolorer-container text geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&amp;gt;&amp;gt;&amp;gt; &quot;x&quot; in &quot;cha&quot;<br />
False<br />
&amp;gt;&amp;gt;&amp;gt; 1 in [1,2,3]<br />
True</div></div>
<h3>Combinar de forma implícita operaciones lógicas</h3>
<p>Además de los operadores lógicos not, or, and python permite <a href="http://www.async.com.br/projects/python/pnp/op-logical.html#SECTION000345100000000000000">combinar ciertas operaciones lógicas de forma implícita</a>:</p>
<p>Por ejemplo podemos comprobar un número está en un determinado rango de esta forma:</p>
<div class="codecolorer-container text geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">a = 5<br />
if 3 &amp;lt; a &amp;lt; 9:<br />
&nbsp; &nbsp; &nbsp;print &amp;quot;Entre 3 y 9&amp;quot;<br />
<br />
a = 3; b = 3; c = 2;<br />
if a == b &amp;lt;= c:<br />
&nbsp; &nbsp; &nbsp;print &amp;quot;a igual a b y b menor o igual que c&amp;quot;</div></div>
<h3>Clausula else en bloques for y while</h3>
<p>En los for y los while <a href="http://www.async.com.br/projects/python/pnp/node28.html#SECTION000352200000000000000">se puede emplear una claúsula else</a> que se ejecutará cuando se salga del bloque de iteración por haber acabado la secuencia (en lugar de salir por un break)</p>
<div class="codecolorer-container text geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">valores = [2, 4, 5, 2, -1]<br />
for i in valores:<br />
&nbsp; &nbsp; &nbsp; &nbsp; if i &amp;lt; 0:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print &amp;quot;Negativo encontrado: %d&amp;quot; %i<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break<br />
else:<br />
&nbsp; &nbsp; &nbsp; &nbsp; print &amp;quot;Nenhum negativo encontrado&amp;quot;</div></div>
<h3>Valores booleanos</h3>
<p>No está de más recordar que <a href="http://www.async.com.br/projects/python/pnp/node29.html#SECTION000353100000000000000">en python se considera falso</a> a:</p>
<ul>
<li>el booleano False</li>
<li>el valor 0 (zero)</li>
<li>una lista, diccionario, tupla o string vacios (de tamaño cero)</li>
<li>el valor especial None</li>
</ul>
<p>Así por ejemplo para comprobar si una lista no está vacía mejor que emplear</p>
<div class="codecolorer-container text geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">lista = ['a']<br />
if (len(lista)) != 0:<br />
&nbsp; &nbsp; &nbsp; print &quot;forma poco apropiada de comprobar si una lista no está vacia&quot;</div></div>
<p>usaremos directamente</p>
<div class="codecolorer-container text geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">if lista:<br />
&nbsp; &nbsp; &nbsp; print &quot;Lista no vacia&quot;</div></div>
<h3>Argumentos de funciones</h3>
<p>Existen <a href="http://www.async.com.br/projects/python/pnp/node33.html#SECTION000362300000000000000">dos formas de pasar un número variable de argumentos a una función</a>:</p>
<div class="codecolorer-container text geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">def desculpa(alvo, *motivos):<br />
&nbsp; &nbsp; &nbsp; &nbsp; d = &quot;Desculpas %s, mas estou doente&quot; % alvo<br />
&nbsp; &nbsp; &nbsp; &nbsp; for motivo in motivos:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; d = d + &quot; e %s&quot; % motivo<br />
&nbsp; &nbsp; &nbsp; &nbsp; return d + &quot;.&quot;<br />
<br />
&nbsp; &nbsp; &amp;gt;&amp;gt;&amp;gt; desculpa(&quot;senhor&quot;, &quot;meu gato fugiu&quot;, <br />
&nbsp; &nbsp; ... &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;minha tia veio visitar&quot;)</div></div>
<p>o bien</p>
<div class="codecolorer-container text geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;def equipe(diretor, produtor, **atores):<br />
&nbsp; &nbsp; &nbsp; &nbsp; for personagem in atores.keys():<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print &quot;%s: %s&quot; % (personagem, atores[personagem])<br />
&nbsp; &nbsp; &nbsp; &nbsp; print &quot;-&quot; * 20<br />
&nbsp; &nbsp; &nbsp; &nbsp; print &quot;Diretor: &nbsp;%s&quot; % diretor<br />
&nbsp; &nbsp; &nbsp; &nbsp; print &quot;Produtor: %s&quot; % produtor<br />
<br />
&nbsp; &nbsp; &amp;gt;&amp;gt;&amp;gt; equipe(diretor=&quot;Paul Anderson&quot;, <br />
&nbsp; &nbsp; ... &nbsp; &nbsp; &nbsp; &nbsp;produtor=&quot;Paul Anderson&quot;, <br />
&nbsp; &nbsp; ... &nbsp; &nbsp; &nbsp; &nbsp;Frank=&quot;Tom Cruise&quot;, Edmund=&quot;Pat Healy&quot;, <br />
&nbsp; &nbsp; ... &nbsp; &nbsp; &nbsp; &nbsp;Linda=&quot;Julianne Moore&quot;)<br />
<br />
&nbsp; &nbsp; Frank: Tom Cruise<br />
&nbsp; &nbsp; Edmund: Pat Healy<br />
&nbsp; &nbsp; Linda: Julianne Moore<br />
&nbsp; &nbsp; --------------------<br />
&nbsp; &nbsp; Diretor: Paul Anderson<br />
&nbsp; &nbsp; Produtor: Paul Anderson</div></div>
<p>Si tienes algún tutoirial de python que te haya gustado o algún truquillo que quieres compartir deja un comentario.</p>
]]></content:encoded>
			<wfw:commentRss>http://conocimientoabierto.es/curso-objetivo-programacao-python/328/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Traducir automáticamente ficheros .po</title>
		<link>http://conocimientoabierto.es/traducir-automaticamente-ficheros-po/207/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=traducir-automaticamente-ficheros-po</link>
		<comments>http://conocimientoabierto.es/traducir-automaticamente-ficheros-po/207/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 22:43:02 +0000</pubDate>
		<dc:creator>fpuga</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[poss-gl]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[traducción]]></category>

		<guid isPermaLink="false">http://conocimientoabierto.es/?p=207</guid>
		<description><![CDATA[Ultimamente estoy dedicando parte de mi tiempo libre a algunos trabajos relacionados con la traducción. En concreto he portado a windows la última versión del software de traducción gtranslator y estoy participando en un proyecto para traducir de forma colaborativa al gallego el libro Producing Open Source Software. Uno de los aspectos interesantes del proyecto [...]]]></description>
			<content:encoded><![CDATA[<p>Ultimamente estoy dedicando parte de mi tiempo libre a algunos trabajos relacionados con la traducción. En concreto he portado a windows la última versión del <a href="http://gtranslator.sourceforge.net/">software de traducción gtranslator</a> y estoy participando en un proyecto para <a href="http://producingoss.ghandalf.org/">traducir de forma colaborativa al gallego el libro Producing Open Source Software</a>.</p>
<p>Uno de los aspectos interesantes del proyecto poss-gl es que estamos usando una metodología propia de la traducción de software para un libro, con bastante buen resultado. Cada capítulo del libro se ha convertido en un <a href="http://es.wikipedia.org/wiki/Gettext">fichero .po</a>, que son los ficheros estándar de traducción en Software Libre. De este modo en lugar de ir traduciendo cada línea con un procesador de texto podemos emplear una herramienta avanzada como gtranslator para ello. Una de las características de gtranslator es que se puede visualizar además del texto original el contenido de otro fichero .po que contenga por ejemplo la traducción a un tercer idioma que nos sirva para comparar como han hecho otros traductores.</p>
<p>Basándome en esa posibilidad acabo de escribir un programita que permite traducir automaticamente un fichero po haciendo consultas a un <a href="http://www.opentrad.com/">servicio de traducción web</a>. Las traducciones automáticas, a no ser que sean entre lenguas similares como castellano y gallego, son bastante malas pero, cargándolas como idioma alternativo en gtranslator pueden sernos de ayuda en nuestra propia traducción.</p>
<p>El programa se trata de un script programado en python y liberado con licencia GPL v3 que podeis <a href="http://repo.or.cz/w/fpuga.git/blob_plain/HEAD:/localizacion/translatePO.py">descargar directamente</a> desde <a href="http://repo.or.cz/w/fpuga.git">mi repositorio de software</a>. Para que funcione es necesario instalar también los módulos de python <a href="http://bitbucket.org/izi/polib/src/">polib</a> y <a href="http://www.crummy.com/software/BeautifulSoup/">BeautifulSoup</a>.</p>
<p>Para ejecutarlo escribiremos en una consola de linux:</p>
<div class="codecolorer-container text geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">python translatePO.py -d [dirección] -i [fichero.po]</div></div>
<p>La dirección indica de que idioma a que idioma queremos traducirlo, por ejemplo en-es para traducir de inglés a castellano o gl-fr para hacerlo de gallego a francés.</p>
]]></content:encoded>
			<wfw:commentRss>http://conocimientoabierto.es/traducir-automaticamente-ficheros-po/207/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

