<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1800461261730007882</id><updated>2012-05-20T02:40:51.676-07:00</updated><category term='linux'/><category term='reflexiones'/><category term='xkcd'/><category term='laboratorio'/><category term='visual basic'/><category term='python'/><category term='php'/><category term='bug'/><category term='windows'/><category term='matemáticas'/><category term='mozilla'/><category term='offtopic'/><category term='proyectos personales'/><title type='text'>"Steal This Software"</title><subtitle type='html'>descripcion = ["Programación","Tests","G33k Hum0r"]</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/-/python'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/search/label/python'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-7203482141891142234</id><published>2012-04-10T15:50:00.006-07:00</published><updated>2012-04-14T07:40:57.497-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyectos personales'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Cloud.obj - Objetos Python en la nube</title><content type='html'>Primero que nada, un poco de historia. Estaba pensando: Se pueden importar módulos que estén en un servidor remoto? Y, si es sí, se puede hacer fácil, con poco código y, portable? &lt;br /&gt;&lt;br /&gt;Todo eso, en Python, fue un &lt;i&gt;&lt;b&gt;SI&lt;/b&gt;&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;La idea es, Cloud.Obj es un repositorio de modulos de Python, de donde todo el mundo puede hacer sus "imports", sin modificar demasiado el código que usarían para importarlo localmente.&lt;br /&gt;&lt;br /&gt;Lo único que se necesita &lt;a href="https://github.com/downloads/mcerdeira/cloud.obj/cloud.zip"&gt;es bajar un modulito, "cloud.py"&lt;/a&gt; y ya está listo para usar, sin dependencias ni nada más extra.&lt;br /&gt;&lt;br /&gt;Aquí, un ejemplo de uso:&lt;br /&gt;&lt;style type="text/css"&gt;&lt;!-- /**  * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann  * (http://qbnz.com/highlighter/ and http://geshi.org/)  */ .python .de1, .python .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;} .python  {font-family:monospace;color: #006; border: 1px solid #d0d0d0; background-color: #f0f0f0;} .python a:link {color: #000060;} .python a:hover {background-color: #f0f000;} .python .imp {font-weight: bold; color: red;} .python li, .python .li1 {font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;} .python .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;} .python .li2 {font-weight: bold; vertical-align:top;font-weight: bold; color: #006060;} .python .kw1 {color: #ff7700;font-weight:bold;} .python .kw2 {color: #008000;} .python .kw3 {color: #dc143c;} .python .kw4 {color: #0000cd;} .python .co1 {color: #808080; font-style: italic;} .python .coMULTI {color: #808080; font-style: italic;} .python .es0 {color: #000099; font-weight: bold;} .python .br0 {color: black;} .python .sy0 {color: #66cc66;} .python .st0 {color: #483d8b;} .python .nu0 {color: #ff4500;} .python .me1 {color: black;} .python span.xtra { display:block; }  --!&gt;&lt;/style&gt;&lt;br /&gt;&lt;div class="python"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co1"&gt;#A simple, example&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw1"&gt;import&lt;/span&gt; cloud&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;o = cloud.&lt;span class="me1"&gt;Obj&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="st0"&gt;"http://cloudobj.appspot.com/sys"&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="co1"&gt;#o is the module sys&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw1"&gt;print&lt;/span&gt; &lt;span class="st0"&gt;"The path is "&lt;/span&gt;, o.&lt;span class="me1"&gt;path&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw1"&gt;print&lt;/span&gt; o&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;Por supuesto, si picara la curiosidad o si, simplemente, quisieran montar su propio servicio, el código del "server", también está en GitHub, listo para que lo bajen, en sus versiones "Servidor local" y "listo para deploy en GAE"&lt;br /&gt;&lt;br /&gt;Más adelante, tendrá dos sabores:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Public Repo:&lt;/b&gt; Módulos importables públicos, para todos.&lt;br /&gt;&lt;b&gt;Private Repo:&lt;/b&gt; Con login, para quienes quieran subir código importable, protegido con password.&lt;br /&gt;&lt;br /&gt;Cabe aclarar que, si bien hablo de repositorios, la idea no es ser un github, sino, un lugar común y en la nube, desde donde importar la última versión del módulo X.&lt;br /&gt;&lt;br /&gt;Aquí los links:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://cloudobj.appspot.com/"&gt;Servicio en GAE&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/downloads/mcerdeira/cloud.obj/cloud.zip"&gt;Download&lt;/a&gt; &lt;br /&gt;&lt;a href="https://github.com/mcerdeira/cloud.obj"&gt;GitHub&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Y, cómo siempre, se aceptan ideas, críticas y quien quiera participar, bienvenidisimo!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-7203482141891142234?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/7203482141891142234/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2012/04/cloudobj-objetos-python-en-la-nube.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/7203482141891142234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/7203482141891142234'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2012/04/cloudobj-objetos-python-en-la-nube.html' title='Cloud.obj - Objetos Python en la nube'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-8023266954759364351</id><published>2011-12-11T15:42:00.000-08:00</published><updated>2011-12-11T15:42:03.809-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyectos personales'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Django-IDE: Ahora en GitHub!</title><content type='html'>Ya está subido el código de lo que hay hasta ahora, de la IDE que estoy cocinando: &lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/mcerdeira/django-ide" rel="nofollow"&gt;Introducing: Django-IDE&lt;/a&gt;&lt;span class="comhead"&gt;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hay mucho por hacer y mucho por mejorarle, por lo que, colaboradores bienvenidos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-8023266954759364351?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/8023266954759364351/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2011/12/django-ide-ahora-en-github.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/8023266954759364351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/8023266954759364351'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2011/12/django-ide-ahora-en-github.html' title='Django-IDE: Ahora en GitHub!'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-5686136138872673014</id><published>2011-10-25T16:36:00.000-07:00</published><updated>2011-10-25T18:17:34.193-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyectos personales'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Django-IDE: Video preview</title><content type='html'>Luego de escribir este post &lt;a href="http://stealthissoftware.blogspot.com/2011/10/ipnaf-ide-la-ide-definitiva-para-python.html"&gt;IPnaf IDE - La IDE definitiva para python&lt;/a&gt;, y recibir algunos comentarios que me hicieron pensar (y ver que, estaba un poco equivocado en mis comentatios), me dije "y por qué no puedo ser yo quién arme una IDE?"&lt;br /&gt;&lt;br /&gt;Y así fue que, pensando un poco, me puse a intentar llenar un hueco que, creo que está lo suficientemente vacío como para que un esfuerzo allí, valga la pena.&lt;br /&gt;Entonces, empezó a nacer Django-IDE.&lt;br /&gt;&lt;br /&gt;Les dejo un video con una preview muy muy muuuuy temprana (no tiene para nada todos los features que va a tener), en fin, acá va:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/ddQDgp4XrJ4" width="420"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;h1&gt;&lt;a href="http://www.youtube.com/watch?v=ddQDgp4XrJ4"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif; font-size: small; font-weight: normal;"&gt;Ver en youtube &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;h1&gt;What is Django-IDE good for?&lt;/h1&gt;Django-IDE&lt;span style="font-family: inherit;"&gt; helps you to:&lt;/span&gt;&lt;br /&gt;&lt;ul class="simple"&gt;&lt;li&gt;Easily create Django projects.&lt;/li&gt;&lt;li&gt;Manage and edit existing project&lt;/li&gt;&lt;li&gt;Edit and Save your code, with a editor based on &lt;a href="http://ace.ajax.org/"&gt;Ace.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Run and debug.&lt;/li&gt;&lt;/ul&gt;La estoy armando a pulmón, esto es, codeo un poco los findes, y cuando puedo...&lt;br /&gt;Espero comments!!! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-5686136138872673014?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/5686136138872673014/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2011/10/django-ide-video-preview.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/5686136138872673014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/5686136138872673014'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2011/10/django-ide-video-preview.html' title='Django-IDE: Video preview'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/ddQDgp4XrJ4/default.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-1489287754002685791</id><published>2011-10-07T20:08:00.000-07:00</published><updated>2011-10-07T20:08:46.124-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='reflexiones'/><title type='text'>IPnaf IDE - La IDE definitiva para python</title><content type='html'>Dentro del titulo mentiroso, que usé para atraer la atención (el plan B era poner "cerveza gratis!") encierro un pensamiento mío, pero que creo que muchos compartimos. Pero, primero lo primero:&lt;br /&gt;&lt;br /&gt;IPnaf IDE quiere decir: &lt;b&gt;I&lt;/b&gt;Pnaf &lt;b&gt;P&lt;/b&gt;lease &lt;b&gt;N&lt;/b&gt;ot &lt;b&gt;A&lt;/b&gt;nother &lt;b&gt;F&lt;/b&gt;ucking &lt;b&gt;IDE&lt;/b&gt;!!&lt;br /&gt;&lt;br /&gt;Aunque, debería ser "not another fucking python IDE!" Y a qué me refiero con esta misteriosa frase?? He visto, y ultimamente mucho mas, una proliferacion de lo que hacen llamar IDEs. Pero, me voy a centrar en IDEs para el lenguaje pythyon: cito, spyder, Ninja, entre otros, que aparecieron como "somos la IDE definitiva".&lt;br /&gt;&lt;br /&gt;Hay &lt;a href="http://xkcd.com/927/"&gt;un chiste de Xkcd&lt;/a&gt; donde, la idea más o menos es que, alguien dice "uh, hay n maneras de hacer x! No puede ser, hay que generar un standard. Horas luego hay n+1 maneras de hacer x"&lt;br /&gt;&lt;br /&gt;Y es así. Siempre. Siempre?? Bueno, no siempre, pero en el 99.9% de los casos. Otras veces, ese pensamiento da lugar a innovaciones. Pero, es lo común?? Diríamos que no.&lt;br /&gt;&lt;br /&gt;Vuelvo a los ejemplos que cité: Spyder y Ninja. Ambas las bajé, instalé y probé. Aclaro que no tengo nada en contra de quienes la desarrollan (ni los conozco) ni me parece que su trabajo y esfuerzo sea malo. Al contrario. Pero, veo que está desperdiciado. Gente con talento claro, pone esfuerzo en cosas que ya existen y, sin innovaciones reales. A qué me refiero??&lt;br /&gt;&lt;br /&gt;&lt;a href="http://packages.python.org/spyder/"&gt;Spyder &lt;/a&gt;y &lt;a href="http://code.google.com/p/ninja-ide/"&gt;Ninja&lt;/a&gt; [0] son, sin duda esfuerzos de desarrollo y diseño. Pero, que son? Editores de texto lindos y python friendly. Nada más. Ah, y que ejecutan código. Nada que no puede hacer con Emacs y un poco de tiempo + macros.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Debugger? No, gracias.&lt;/b&gt; [1]&lt;br /&gt;&lt;br /&gt;Ojo, no es que sea fácil hacer un debugger como la gente, que corrar el código paso a paso y podamos inspeccionar varibles, ejecutar código en el contexto de ejecución, editar código on the fly, hacer remote debugging etc. [2] &lt;br /&gt;Pero, es lo que falta!! (en general) Y si, es más lindo ponerse a escribir la IDE desde cero [3], y luego agregarle esas funcionalidades superstar, pero, primero hay que hacer el editor, el highlighter, el buscador de código, el generador de plugins, el pseudo intellisense, etc. Y, para cuando llegamos a las funcionalidades breakers, rockstar, "la papa", quizá el proyecto ya murió.&lt;br /&gt;&lt;br /&gt;"No necesitamos esos features de maricones". Diría el macho programmer. (y esto me hizo acordar a &lt;a href="http://xkcd.com/378/"&gt;otro chiste de Xkcd&lt;/a&gt;) pero, la realidad es que, cuando más cómodo esté uno, mejor trabaja y más se puede concentrar en el problema puntual que esté resolviendo.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Por qué no tomar una IDE existente y opensource y mejorarla en vez de arrancer una from scratch? &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Entonces, si se van a poner a programar, aviso, no necesitamos más IDEs =)&amp;nbsp; &lt;br /&gt;&lt;br /&gt;EOF &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[0]&lt;/b&gt; Elegí Spyder y Ninja porque son 2 que recuerdo haber visto últimamente, y que además las instalé y probé.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[1]&lt;/b&gt;&amp;nbsp; Creo que Spyder estaba implementando pdb y winpdb. De todos modos, mi punto sigue en pie.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[2]&lt;/b&gt; Acá es cuando alguien me va a decir, "vos, porque estás acosbumbrado a visual basic" Puedo asegurar que he programado en editores de texto plano como en Visual Studio, Eclipse o Netbeans. Uno puede usar un debugger o usar prints, pero, las funcionalidades rock star en las IDEs, son geniales!! No es que uno no pueda vivir sin ellas, pero, si existen, mucho mejor!! &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[3]&lt;/b&gt; Es como el caso de las n distribuciones de Linux. Ya hay suficientes en variedad como para parar un poco, si tenés tantas ganas de laburar en una distro, contribuí con una que exista!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-1489287754002685791?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/1489287754002685791/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2011/10/ipnaf-ide-la-ide-definitiva-para-python.html#comment-form' title='10 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/1489287754002685791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/1489287754002685791'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2011/10/ipnaf-ide-la-ide-definitiva-para-python.html' title='IPnaf IDE - La IDE definitiva para python'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-9107391940846945702</id><published>2011-07-14T16:19:00.000-07:00</published><updated>2011-07-14T16:19:30.004-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyectos personales'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Volvi a programar en mi "spare time": web_alert - Parte 2</title><content type='html'>En un &lt;a href="http://stealthissoftware.blogspot.com/2011/06/volvi-programar-en-mi-spare-time.html"&gt;post anterior&lt;/a&gt;, estuve contando sobre un proyectito que arranqué, por puro hobbie pero, esperando que sea útil a la vez.&lt;br /&gt;&lt;br /&gt;La cosa es que me encontré con algo que me desaminó un poco: &lt;a href="http://www.webalertpro.com/"&gt;http://www.webalertpro.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Primero, es casi exactamente la misma idea.&lt;br /&gt;Segundo, tiene casi el mismo nombre!&lt;br /&gt;&lt;br /&gt;Obviamente, esto es culpa de mi, evidente, &lt;a href="http://stealthissoftware.blogspot.com/2011/05/todo-inventado-o.html"&gt;falta de inventiva.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Por ahora sigue el proyecto, pero lamentablemente, perdió un poco de empuje.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-9107391940846945702?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/9107391940846945702/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2011/07/volvi-programar-en-mi-spare-time.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/9107391940846945702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/9107391940846945702'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2011/07/volvi-programar-en-mi-spare-time.html' title='Volvi a programar en mi &quot;spare time&quot;: web_alert - Parte 2'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-4894131472113634807</id><published>2011-06-28T17:16:00.000-07:00</published><updated>2011-06-29T18:05:40.995-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyectos personales'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Volvi a programar en mi "spare time": web_alert</title><content type='html'>&lt;b&gt;Proyecto:&lt;/b&gt; web_alert&lt;br /&gt;&lt;b&gt;Objetivos:&lt;/b&gt; Divertirme, aprender y, en una de esas, sale algo útil.&lt;br /&gt;&lt;b&gt;Lenguajes:&lt;/b&gt; Python, obvio!&lt;br /&gt;&lt;br /&gt;Queriendo meterme un poco con python+web, empecé un proyectito al que nombré "web_alert".&lt;br /&gt;&lt;br /&gt;Primero lo armé versión consola y "on demand", luego la idea es que sea una especie de servicio web.&lt;br /&gt;&lt;br /&gt;Qué haría? Fácil, toma como input urls que el usuario suministra y tags de interés que el usuario suministra, por ejemplo:&lt;br /&gt;&lt;br /&gt;urls: http://barrapunto.com, http://www.lanacion.com.ar&lt;br /&gt;tags: panchos, celulares, perros&lt;br /&gt;&lt;br /&gt;La aplicación 'mira' esas urls, y genera como output links relacionados con los tags que le pasas como input y, te lo presenta donde vos le digas, por ejemplo:&lt;br /&gt;&lt;br /&gt;mail, twitter, facebook.&lt;br /&gt;&lt;br /&gt;Sirve? No se, pero que me voy a divertir, seguro. =)&lt;br /&gt;&lt;br /&gt;P.D: Previews y el código en google, coming soon...&lt;br /&gt;&lt;br /&gt;EDITADO: Este post estaba en planeta python y desapareció, jua! =)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-4894131472113634807?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/4894131472113634807/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2011/06/volvi-programar-en-mi-spare-time.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/4894131472113634807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/4894131472113634807'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2011/06/volvi-programar-en-mi-spare-time.html' title='Volvi a programar en mi &quot;spare time&quot;: web_alert'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-2920399436882179324</id><published>2011-06-16T16:04:00.000-07:00</published><updated>2011-06-16T16:04:25.970-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='reflexiones'/><title type='text'>Advide from an old programmer</title><content type='html'>&lt;div class="documentwrapper"&gt;           &lt;div class="body"&gt;                &lt;div class="section" id="advice-from-an-old-programmer"&gt; &lt;h1&gt;Advice From An Old Programmer&lt;/h1&gt;You have finished this book and have decided to continue with programming. Maybe it will be a career for you, or maybe it will be a hobby.  You will need some advice to make sure you continue on the right path, and get the most enjoyment out of your newly chosen hobby.&lt;br /&gt;I have been programming for a very long time.  So long that it is incredibly boring to me.  At the time that I wrote this book I knew about 20 programming languages and could learn new ones in about a day to a week depending on how weird they were.  Eventually though this just became boring and couldn't hold my interest.&lt;br /&gt;What I discovered after this journey of learning is that the languages did not matter, it's what you do with them.  Actually, I always knew that, but I'd get distracted by the languages and forget it periodically.  Now I never forget it, and neither should you.&lt;br /&gt;Which programming language you learn and use does not matter.  Do &lt;em&gt;not&lt;/em&gt; get sucked into the religion surrounding programing languages as that will only blind you to their true purpose of being your tool for doing interesting things.&lt;br /&gt;Programming as an intellectual activity is the &lt;em&gt;only&lt;/em&gt; art form that allows you to create interactive art.  You can create projects that other people can play with, and you can talk to them indirectly.  No other art form is quite this interactive.  Movies flow to the audience in one direction.  Paintings do not move.  Code goes both ways.&lt;br /&gt;Programming as a profession is only moderately interesting.  It can be a good job, but if you want to make about the same money and be happier, you could actually just go run a fast food joint.  You are much better off using code as your secret weapon in another profession.&lt;br /&gt;People who can code in the world of technology companies are a dime a dozen and get no respect.  People who can code in biology, medicine, government, sociology, physics, history, and mathematics are respected and can do amazing things to advance those disciplines.&lt;br /&gt;Of course, all of this advice is pointless.  If you liked learning to write software with this book, you should try to use it to improve your life any way you can.  Go out and explore this weird wonderful new intellectual pursuit that barely anyone in the last 50 years has been able to explore.  Might as well enjoy it while you can.&lt;br /&gt;Finally, I will say that learning to create software changes you and makes you different.  Not better or worse, just different.  You may find that people treat you harshly because you can create software, maybe using words like "nerd".  Maybe you will find that because you can dissect their logic that they hate arguing with you.  You may even find that simply knowing how a computer works makes you annoying and weird to them.&lt;br /&gt;To this I have one just piece of advice: they can go to hell.  The world needs more weird people who know how things work and who love to figure it all out. When they treat you like this, just remember that this is &lt;em&gt;your&lt;/em&gt; journey, not theirs.  Being different is not a crime, and people who tell you it is are just jealous that you have picked up a skill they never in their wildest dreams could acquire.&lt;br /&gt;You can code. They cannot.  That is pretty damn cool.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://learnpythonthehardway.org/book/advice.html"&gt;Fuente &lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-2920399436882179324?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/2920399436882179324/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2011/06/advide-from-old-programmer.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/2920399436882179324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/2920399436882179324'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2011/06/advide-from-old-programmer.html' title='Advide from an old programmer'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-7073507604513565314</id><published>2011-06-01T16:45:00.000-07:00</published><updated>2011-06-01T16:47:16.804-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyectos personales'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Framework web minimo</title><content type='html'>Estaba buscando algún framework web, chiquito y sencillo. Quería tirar código y que salga andando algo, fácil, sin instalar mucho ni configurar.&lt;br /&gt;Se me ocurrió preguntar en la lista de python argentina[0].&lt;br /&gt;Al instante, muchas respuestas y, una de ellas me nombraba web.py (que lo conocía) y otro más[1], que es el motivo de este post:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://bottlepy.org/docs/dev/index.html"&gt;&lt;img border="0" src="http://bottlepy.org/docs/dev/_static/logo_nav.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Muy zarpado. Lo primero que me cautivó:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"Bottle does not depend on any external libraries. You can just download &lt;a class="reference external" href="http://bottlepy.org/bottle.py"&gt;bottle.py&lt;/a&gt; into your project directory and start coding."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Un solo archivo! Lo importo y, habemus web. Eso es lo que quería!&lt;br /&gt;&lt;br /&gt;Luego, el hello world:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;bottle&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="nd"&gt;@route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/hello'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Hello World!"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/pre&gt;Cada vez se ponía mejor. Sintaxis clara y, una linda manera de resolver la relación url-código: Decoradores.&lt;br /&gt;&lt;br /&gt;Creó que me enamoré =)&lt;br /&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://python.org.ar/pyar/"&gt;[0] PyAr&lt;/a&gt;&lt;br /&gt;&lt;a href="http://bottlepy.org/docs/dev/"&gt;[1] Bottle&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-7073507604513565314?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/7073507604513565314/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2011/06/framework-web-minimo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/7073507604513565314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/7073507604513565314'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2011/06/framework-web-minimo.html' title='Framework web minimo'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-6696790455410103911</id><published>2011-03-10T15:44:00.000-08:00</published><updated>2011-05-30T18:54:23.612-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyectos personales'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Magia Negra: Un ActiveRecord en pytnon</title><content type='html'>&lt;strike&gt;Pensando &lt;a href="http://code.google.com/p/codmacs/"&gt;en un proyecto cuasi muerto&lt;/a&gt; que tengo, me vino a la mente que, aprovechando el código ya escrito y con muy poco esfuerzo/código más, puedo armar un framework que implemente &lt;a href="http://en.wikipedia.org/wiki/Active_record_pattern"&gt;ActiveRecord&lt;/a&gt;&lt;/strike&gt;&lt;br /&gt;&lt;strike&gt;&lt;br /&gt;&lt;/strike&gt;&lt;br /&gt;&lt;strike&gt;Y &lt;a href="http://code.google.com/p/blackmagic/"&gt;acá&lt;/a&gt; está (solo está creado el espacio y subido un commit inicial) pero promete.&lt;/strike&gt;&lt;br /&gt;&lt;strike&gt;El nombre, inspirado en el efecto mágico y, un tributo a las viejas bandas del metal quizá?&lt;/strike&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Status: Muerto por falta de interés. &lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-6696790455410103911?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/6696790455410103911/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2011/03/magia-negra-un-activerecord-en-pytnon.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/6696790455410103911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/6696790455410103911'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2011/03/magia-negra-un-activerecord-en-pytnon.html' title='Magia Negra: Un ActiveRecord en pytnon'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-2160824726939415420</id><published>2011-01-31T13:06:00.001-08:00</published><updated>2011-01-31T13:09:18.140-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Quick Hack</title><content type='html'>Tenia que resolver lo siguiente:&lt;br /&gt;&lt;br /&gt;Una macbook que baja mails desde un servidor propio (con un Kerio en la empresa)&lt;br /&gt;&lt;br /&gt;Un router que no soporta loopback&lt;br /&gt;&lt;br /&gt;Entonces, cuando la mac esta fuera de la empresa, se podia hacer referencia, en el cliente de mail, al DNS, que llamaremos empresa.dyndns.ws (para no revelar datos reales)&lt;br /&gt;Pero, dentro de la empresa, el DNS empresa.dyndns.ws, simplemente no funciona.&lt;br /&gt;Habia que resolverlo, y rapido[0].&lt;br /&gt;&lt;br /&gt;Python al rescate!&lt;br /&gt;&lt;title&gt;Colorized Source Code&lt;/title&gt;&lt;br /&gt;&lt;style&gt; &lt;!--  .cch1{background:#FFFFCC;}  --&gt; &lt;/style&gt;&lt;br /&gt;&lt;br /&gt;He aquí el script (es feo, muy feo, pero salio rapidisimo y con fritas!)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: red;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt; os&lt;br /&gt;from subprocess &lt;span style="color: red;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt; Popen&lt;span style="color: blue;"&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt; PIPE&lt;span style="color: blue;"&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt; STDOUT&lt;br /&gt;esta &lt;span style="color: blue;"&gt;=&lt;/span&gt; False&lt;br /&gt;p &lt;span style="color: blue;"&gt;=&lt;/span&gt; Popen&lt;span style="color: blue;"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;[&lt;/b&gt;&lt;/span&gt;&lt;span style="color: purple;"&gt;'ping'&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;span style="color: purple;"&gt;'-c'&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;span style="color: purple;"&gt;'1'&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;span style="color: purple;"&gt;'server'&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;]&lt;/b&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt; stdout &lt;span style="color: blue;"&gt;=&lt;/span&gt; PIPE&lt;span style="color: blue;"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;output &lt;span style="color: blue;"&gt;=&lt;/span&gt; p&lt;span style="color: blue;"&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;stdout&lt;span style="color: blue;"&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;read&lt;span style="color: blue;"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;p&lt;span style="color: blue;"&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;wait&lt;span style="color: blue;"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt; &lt;span style="color: purple;"&gt;'bytes from'&lt;/span&gt; &lt;span style="color: red;"&gt;&lt;b&gt;in&lt;/b&gt;&lt;/span&gt; output&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;br /&gt;    ok &lt;span style="color: blue;"&gt;=&lt;/span&gt; True&lt;br /&gt;&lt;span style="color: red;"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;br /&gt;    ok &lt;span style="color: blue;"&gt;=&lt;/span&gt; False&lt;br /&gt;&lt;br /&gt;f &lt;span style="color: blue;"&gt;=&lt;/span&gt; open&lt;span style="color: blue;"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;span style="color: purple;"&gt;'/etc/hosts'&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt; &lt;span style="color: purple;"&gt;'r'&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;f2 &lt;span style="color: blue;"&gt;=&lt;/span&gt; open&lt;span style="color: blue;"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;span style="color: purple;"&gt;'/etc/hosts2'&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt; &lt;span style="color: purple;"&gt;'w'&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/span&gt; i &lt;span style="color: red;"&gt;&lt;b&gt;in&lt;/b&gt;&lt;/span&gt; f&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: red;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt; &lt;span style="color: purple;"&gt;'empresa.dyndns'&lt;/span&gt; &lt;span style="color: red;"&gt;&lt;b&gt;in&lt;/b&gt;&lt;/span&gt; i&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;br /&gt;        esta &lt;span style="color: blue;"&gt;=&lt;/span&gt; True&lt;br /&gt;        &lt;span style="color: red;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt; ok&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;br /&gt;            f2.write&lt;span style="color: blue;"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;i&lt;span style="color: blue;"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;   &lt;br /&gt;    &lt;span style="color: red;"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;br /&gt;        f2.write&lt;span style="color: blue;"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;i&lt;span style="color: blue;"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;      &lt;br /&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt; not esta and ok&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;br /&gt;    f2.write&lt;span style="color: blue;"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;span style="color: purple;"&gt;'192.168.0.1    empresa.dyndns.ws \n'&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;	&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;f&lt;span style="color: blue;"&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;close&lt;span style="color: blue;"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;f2.close&lt;span style="color: blue;"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;os&lt;span style="color: blue;"&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;remove&lt;span style="color: blue;"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;span style="color: purple;"&gt;'/etc/hosts'&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;os&lt;span style="color: blue;"&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;rename&lt;span style="color: blue;"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;span style="color: purple;"&gt;'/etc/hosts2'&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;span style="color: purple;"&gt;'/etc/hosts'&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Basicamente, hace un ping al nombre del servidor donde esta el servidor de mail (el Kerio) con el nombre local, 'server'. Si esta, estoy en le empresa, sino, no.&lt;br /&gt;Entonces, basado en eso, toco el archivo hots (gracias Apple por hacer su OS un UNIX) y listo[1]. Se agrego al inicio y se corre con permisos de root y logramos lo que esta persona queria, una solucion rapida y magica.&lt;br /&gt;&lt;br /&gt;No estoy orgulloso del script en si, sino, del poder de python para hacer estos quick hacks, que te salvan la papas. =)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[0] Dicen que rapido y bien, es imposible.&lt;br /&gt;[1] Pero, como decia TuSam, puede fallar. Por ejemplo, si justo hay otro 'server', donde esta esta persona (shit happens)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-2160824726939415420?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/2160824726939415420/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2011/01/quick-hack.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/2160824726939415420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/2160824726939415420'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2011/01/quick-hack.html' title='Quick Hack'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-8551182749734280697</id><published>2010-11-06T15:01:00.000-07:00</published><updated>2010-11-06T15:06:37.725-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyectos personales'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='reflexiones'/><title type='text'>Programar: Ensuciarse hace bien</title><content type='html'>A quienes hayan podido ver en &lt;a href="http://en.wikipedia.org/wiki/Television"&gt;"la caja boba"&lt;/a&gt; la publicidad de una conocida marca de productos para lavar la ropa, les sonará esta frase con la que titulo esta entrada:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"Ensuciarse hace bien"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Lo que quizá no se entienda es por qué la adopto, o qué puede tener que ver con la programación.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;La historia &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Brevemente, y para no aburrir a quienes ya conocen el aviso, trata de unos niños jugando, ensuciandose y de cómo eso es beneficioso para estos chiquitos. Obviamente, el ensuciarse beneficia a la marca, pero ese es un tema aparte. Lo que me interesa es el concepto:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #cccccc;"&gt;jugar + ensuciarse + cansarse + ensuciarse de nuevo = beneficio&lt;/div&gt;&lt;br /&gt;Esto es muy cierto y, creo que se aplica a la programación. No es que me haya dado cuenta de golpe, pero, algo que experimenté hace unas horas, hizo que me inspire y escriba esta entrada. &lt;br /&gt;&lt;br /&gt;Estaba (y estoy) escribiendo una mini-nano-&lt;a href="http://en.wikipedia.org/wiki/Integrated_development_environment"&gt;IDE&lt;/a&gt; en &lt;a href="http://www.python.org/"&gt;python&lt;/a&gt;+&lt;a href="http://www.riverbankcomputing.co.uk/software/pyqt/download"&gt;pyqt4&lt;/a&gt;. Lo que hace es levantar una ventanita gráfica muy simple con un editor de texto con highlighter de sintaxis de python y, lo más interesante, quería que tuviera un &lt;a href="http://en.wikipedia.org/wiki/Debugger"&gt;debugger&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Entonces, me puse a leer. ¿Cómo demonios hago un debugger? Obviamente, nunca pensé escribirlo desde cero, no es la idea reinventar la rueda (más allá de que sería interesante) por lo que, caí en lo más básico que se me ocurrió, &lt;a href="http://docs.python.org/library/pdb.html"&gt;Pdb&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Y acá empieza todo el tema del juego: comencé a jugar con la clase, probé como funcionaba (hacía mucho que no la usaba y no recordaba los comandos) y estuve así un rato. Después, leí un poco de la documentación como para ser un poco más prolijo.&lt;br /&gt;&lt;br /&gt;Luego, empecé a escribir códigos de prueba, donde heredé la clase, y seguí jugando un poco más.&lt;br /&gt;&lt;br /&gt;Luego, usando mi editor de texto favorito (¿cuál será?) abrí el módulo pdb.py, y me lo puse a mirar. Ahi noté que, la clase Pdb heredaba otras dos clases: cmd y, la más interesante, &lt;a href="http://docs.python.org/library/bdb.html"&gt;Bdb&lt;/a&gt; que, no era otra cosa que un framework para implementar debuggers!! Así que abrí también el módulo bdb.py y me puse a leerlo, junto con un poco de la documentación.&lt;br /&gt;&lt;br /&gt;Pero, estaba avanzando lento, quería realmente zambullirme de lleno, quería experimentar con el código un poco más, involucrarma más, en fin, quería &lt;i&gt;ensuciarme.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Así que: ¿que hice? Cómo tampoco la idea es romper (sobre todo, bibliotecas estandard) me copié el módulo como pdd.py a la carpeta de mis scripts y, ahi, con una copia del pdb.py original, me arremangué y metí los dos brazos de lleno en el barro y la mugre.&lt;br /&gt;Y me puse a chapotear: Agregué prints con estados (que forma moderna de debuggear, ¿no?) cambié cosas, saqué otras cosas más, agregué atributos y métodos nuevos a la clase, sobreescribí algunos métodos originales, en fin, toqué el código como si fuese mío y, en cierto sentido, lo hice mío, me sumergí y salí, tiempo después, escupiendo código python (es sólo una metáfora) y, lo más importante, terminé de definir cómo voy a hacer el debugger usando, la clase original pdb (y no su versión diezmada por mí)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Moraleja&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Y, luego de todo esto, ¿cuál es la moraleja?&lt;br /&gt;La moraleja es que, cuando uno quiere entender algo que, como en este caso, es código ajeno y es un tema nuevo para uno, no alcanza con leer el código y la documentación. &lt;br /&gt;Uno tiene que, apropiarse del código, meterle mano, cambiarle cosas, &lt;i&gt;ensuciarse&lt;/i&gt; de él. Haciendo esto, uno logra entender de forma más profunda, e incluso, más rápida, el código ajeno.&lt;br /&gt;&lt;br /&gt;Así que, la próxima vez que quieran entender código ajeno, ya se una biblioteca estandar, una biblioteca de terceros o, simplemente, el módulo que escribió tu compañero de trabajo, no tengas miedo de mirar el código, ejecutarlo, tocarlo (haciendo una copia, claro) porque, como dije al principio:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=SxUUXFE9cEU"&gt;&lt;i&gt;"Ensuciarse hace bien"&lt;/i&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-8551182749734280697?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/8551182749734280697/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2010/11/programar-ensuciarse-hace-bien.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/8551182749734280697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/8551182749734280697'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2010/11/programar-ensuciarse-hace-bien.html' title='Programar: Ensuciarse hace bien'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-550421024285387600</id><published>2010-09-20T18:42:00.000-07:00</published><updated>2010-09-20T18:42:25.851-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyectos personales'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Client side Python</title><content type='html'>El pasado sábado 18-09, estuve en la &lt;a href="http://www.mozilla-ar.org/2010/09/sfd-mozilla-%E2%80%93-argentina/"&gt;Mozilla SFD &lt;/a&gt;y, en una de las charlas me enteré de un proyecto llamado DrumBeat.&lt;br /&gt;&lt;br /&gt;Es realmente interesante: Basandose en el objetivo de Mozilla de mantener y ayudar a que la web sea cada vez más abierta, lo que proponen es un sitio donde se agrupan proyectos, ideas, sobre cosas que ayuden a que esto pase, es decir, a que la web sea cada vez más abierta.&lt;br /&gt;Pueden ser proyectos de todo tipo, no tiene que ser necesariamente relacionado con programación. &lt;br /&gt;La idea detrás de DrumBeat es conseguir apoyo y financiación de estos proyectos, con el fin de, claro está, concretarlos.&lt;br /&gt;&lt;br /&gt;En fin, el día de la charla hubo un &lt;a href="http://en.wikipedia.org/wiki/Brainstorming"&gt;brainstorming&lt;/a&gt; y, me quedó el tema dando vueltas en la cabeza. En el camino de vuelta, se me ocurrió algo:&lt;br /&gt;&lt;br /&gt;Un Python, Client-Side. =)&lt;br /&gt;&lt;br /&gt;La idea es, para el desarrollo web, lo que es Server-Side, uno tiene alternativas, entre ellas, python, php, perl, ruby, etc. Pero, para el lado del cliente no hay tantas. Basicamente, javascript y, luego empezar a dar vueltas por soluciones oscuras, plugin-dependientes, etc. &lt;br /&gt;&lt;br /&gt;Qué bueno sería tener más lenguajes disponibles para los scripts del lado del cliente, no? Y no sería genial arrancar por (a mi entender) el lenguaje más cómodo, amigable, divertido y, a la vez, poderoso del universo???&lt;br /&gt;Así que armé el proyectito: &lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.drumbeat.org/project/client-side-python"&gt;Client-Side Python en DrumBeat&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Creo que la idea en si, no es mala... Obviamente, lo que necesita es notoriedad!! Por lo que, unos votos no le vendrían nada mal!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-550421024285387600?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/550421024285387600/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2010/09/client-side-python.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/550421024285387600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/550421024285387600'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2010/09/client-side-python.html' title='Client side Python'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-5402000378154093604</id><published>2010-08-21T15:48:00.000-07:00</published><updated>2010-08-21T15:48:33.590-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyectos personales'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='visual basic'/><title type='text'>VbAutodoc: Auto documentando VB</title><content type='html'>Qué lindo sería contar con una herramienta que, lea el código fuente (en este caso en VB) y me arme un archivo de documentación sobre las funciones y sub rutinas (preferentemente en html). &lt;br /&gt;Cómo soy programador y me gusta python =) decidí hacerla. La bautizé vbautodoc (muy original) y está disponible una muy &lt;strike&gt;precoz&lt;/strike&gt; temprana versión. &lt;br /&gt;&lt;br /&gt;Próximamente, voy a mejorar aspectos en cómo se construyó, por ejemplo, el pedazo de html que uso como base, lo metí dentro del código, y sólo funciona para documentar VB, cuando, si se parametriza podría servir para cualquie lenguaje.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/vbautodoc/"&gt;Web del proyecto&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/vbautodoc/downloads/list"&gt;Descargas&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-5402000378154093604?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/5402000378154093604/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2010/08/vbautodoc-auto-documentando-vb.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/5402000378154093604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/5402000378154093604'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2010/08/vbautodoc-auto-documentando-vb.html' title='VbAutodoc: Auto documentando VB'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-2561025274811783926</id><published>2010-06-19T14:24:00.000-07:00</published><updated>2010-06-19T14:25:10.764-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyectos personales'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='reflexiones'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Top 5 tips para desarrollar mejores aplicaciones</title><content type='html'>&amp;nbsp;Muchas veces me pongo a pensar en retrospectiva, acerca de cosas que se han hecho bien y cosas que se han hecho mal. Aquí escribo un resumen de las principales cosas que recomiendo hacer para ser un programador más feliz.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1- El usuario no tiene tiempo, ni quiere leer.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Olvidense del RTFM. Nadie lo lee. Hay que imaginarse que el usuario está inmerso en un caos tremendo, teléfonos sonando, gente, alarmas, etc. Lo que menos quisiera es estar lidiando con carteles del tipo "está seguro que desea cerrar etc", o, con aplicaciones oscuras que, si bien hace lo que se debe, tienen muchos botones, radio button y demás, y que, ni el mismo desarrollador entiende sin mirar el código.&lt;br /&gt;Por eso, las aplicaciones tienen que ser intuitivas, se tienen que "auto-explicar". Lo mismo se aplica para los carteles y pop-ups que requieren una decisión del usuario. Si no hay más remedio que poner un cartel, que sea corto y puntal. Por ejemplo:&lt;br /&gt;&lt;br /&gt;¿Está seguro que desea cerrar la aplicación? &lt;br /&gt;[si]  [no] &lt;br /&gt;&lt;br /&gt;Cuando se podría:&lt;br /&gt;&lt;br /&gt;¿Salir? &lt;br /&gt;[si]  [no] &lt;br /&gt;&lt;br /&gt;Mucho más corto y al pie. &lt;br /&gt;&lt;br /&gt;Por último, recuerden la página de Google, un cuadro de texto y un botón. ¿Qué mas?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2- Refactorizar vs From Scratch.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;No siempre es bueno reescribir todo, ni tampoco siempre lo es reusar. Hay que usar esto de forma inteligente. Por un lado el código viejo no es necesariamente malo o confuso. Hay que tener en cuenta que, por un lado, leer código es más dificil que escribirlo (por eso siempre es tentador el reescribir todo) y por otro, el código viejo es, muchas veces, un código ya testeado, con bugs correjidos, en fin, es tiempo de trabajo. Reescribir todo desde cero significaría, tirar todo eso a la basura.&lt;br /&gt;Lo ideal es un balance entre, reescribir las partes "mal escritas" tratando de reusar lo más posible. Es significativamente menos tiempo que escribir todo desde cero, sobre todo, si tenemos en cuenta que, el código desde cero va a tener bugs nuevos.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3- Pensar en grande.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Todo buen programa tiene que empezar cómo algo simple, pero, pensado a lo grande. Esto es, pensar que en un futuro, el programa puede crecer. Por eso, hay que escribir todo de forma flexible, aunque lleve más tiempo ahora, en un futuro va a ser más facil expandir y mantener. Mucho se ha hablado de la &lt;a href="http://en.wikipedia.org/wiki/Technical_debt"&gt;deuda técnica&lt;/a&gt;.Esto es un poco lo que trato de comunicar aquí: El tiempo que se ahorra escribiendo código chapucero ahora, lo pagás mañana.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4- Keep it simple.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Muchas aplicaciones tienen varias faces de desarrollo. Esto es, se reune con el cliente, se diseña, se programa, se vuelve a ver con el cliente, se corrijen cosas, se agregan otras. Entonces, es de esperar que el cliente no sea muy lógico, que haga cambios sobre la marcha y que no tenga en cuenta el diseño general del sistema. Para eso nos paga a nosotros ¿Verdad? Por eso, siempre hay que hacer limpieza del código y del programa. Lo que no se usa, fuera (por lo menos, de la vista) Esto ayuda mucho a que se cumpla el punto 1.&lt;br /&gt;Si la aplicación en si, estaba pensada con otro espiritu y luego, se modificó, tratar de quitar todo lo que sobre. A veces más es menos. Muchos botones y radio button, checks, etc, para mantener un poco la idea anterior y que conviva con la idea nueva genera más problemas que soluciones. Use it or lose it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5- Testing&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Esto es obvio, pero, no se respeta mucho. El cliente no es un beta tester. Si se programa con la idea "que tenga bugs, total lo corrijo rápido" se arriesga, primero, problemas en datos que haya que resolver (esto es tiempo) y, segundo, da la idea de que el programa anda mal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-2561025274811783926?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/2561025274811783926/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2010/06/top-n-tips-para-desarrollar-mejores.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/2561025274811783926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/2561025274811783926'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2010/06/top-n-tips-para-desarrollar-mejores.html' title='Top 5 tips para desarrollar mejores aplicaciones'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-2533812973871200515</id><published>2009-12-13T18:17:00.000-08:00</published><updated>2009-12-13T18:17:59.578-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyectos personales'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Octopys: Octopus para linux</title><content type='html'>Algún día prometí que iba a hacer una versión de &lt;a href="http://www.octopusproject.tk/"&gt;octopus&lt;/a&gt; para linux, y &lt;a href="http://code.google.com/p/octopys/"&gt;cumplí&lt;/a&gt;. Por lo menos, ya hace algo, habrá que pulirlo un poco, lógicamente.&lt;br /&gt;&lt;br /&gt;Está escrito en Python, con una GUI en Qt y lo pueden descargar desde &lt;a href="http://octopys.googlecode.com/files/octopys.zip"&gt;acá.&lt;/a&gt;&lt;br /&gt;O, pueden mirar el código directamente gracias a pastebin:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pastebin.com/f21db77f"&gt;main.py&lt;/a&gt;&lt;br /&gt;&lt;a href="http://pastebin.com/f69f8b152"&gt;oct.ui&lt;/a&gt;&lt;br /&gt;&lt;a href="http://pastebin.com/f7e629b16"&gt;octo.py&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-2533812973871200515?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/2533812973871200515/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2009/12/octopys-octopus-para-linux.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/2533812973871200515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/2533812973871200515'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2009/12/octopys-octopus-para-linux.html' title='Octopys: Octopus para linux'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-5314593356493775053</id><published>2009-12-12T08:01:00.000-08:00</published><updated>2009-12-12T08:06:37.277-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='reflexiones'/><title type='text'>El funesto caso de Is y ==</title><content type='html'>Hace varios días (creo que pasaron meses) inicié una discusión en la lista de mail (creo yo, más famosa y con más gente que sabe en serio) de python. &lt;a href="http://python.org.ar/pyar/"&gt;PyAr&lt;/a&gt;.&lt;br /&gt;La cosa empezó por un artículo que leo, donde se mostraba lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; a = 10&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; b = 10&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a == b&lt;br /&gt;True&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a is b &lt;br /&gt;True&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Luego&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; a = 500&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; b = 500&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a == b&lt;br /&gt;True&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a is b&lt;br /&gt;False&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Claro. Al ser relativamente nuevo en python, ver esto me sorprendió, por lo que decido preguntar de que se trataba en la lista.&lt;br /&gt;Mi pregunta no fue del todo clara, (y acepto 100% la culpa) por lo que se entendió que mi sorpresa venia por una confusión de conceptos y que, lo que no sabía era la diferencia entre "is" y "==". &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lo que pasó:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;En realidad, yo posteo todo el ejemplo (que incluye "is" y "==") para dar un contexto, pero, en si, mi sorpresa venía SOLAMENTE por ver como el operador "is" se comportaba &lt;b&gt;aparentemente&lt;/b&gt; distinto en dos situaciones &lt;b&gt;aparentemente&lt;/b&gt; iguales.&lt;br /&gt;Noten el uso de &lt;b&gt;aparentemente&lt;/b&gt;. Esto es:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;entero_valor_x&gt; [entero_valor_x] is &lt;/entero_valor_x&gt; [entero_valor_x]&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;True&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;entero_valor_x&gt; [entero_valor_Y] is &lt;/entero_valor_x&gt; [entero_valor_Y]&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;False&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Olvidemos que comparar enteros con "is" es una chanchada, es incorrecto y no tiene mucho sentido. Más allá de eso, no me parecía (noten que uso el tiempo pasado) que comparar enteros (del mismo valor numérico) con "is" resultara True en algunos casos y False en otros. No veia el por qué, y me parecía feo (noten que sigo usando el pasado).&lt;br /&gt;&lt;br /&gt;Pero claro, como se interpretó mal mi pregunta, todo se enfocó a explicarme que "is" no era "==", lo cuál, no era &lt;b&gt;PARA NADA&lt;/b&gt; el punto del topic.&lt;br /&gt;Claro, fue mi culpa por no ser claro en una primera instancia. Luego, traté de remediarlo, pero ya era tarde y... el resto es &lt;a href="http://mx.grulic.org.ar/lurker/thread/20091105.152338.41a67519.es.html#20091105.152338.41a67519"&gt;historia&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;La explicación:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;La explicación la había encontrado muy al comienzo del thread. Posteo una que me gustó y es sencilla:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;Autor: Facundo Batista&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;Fecha: 2009-11-04 12:192009-11-04 15:19 -300UTC&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;A: pyar&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;Asunto: Re: [pyar] WTF?&lt;/span&gt;&lt;br /&gt;&lt;div style="color: #666666;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #666666;"&gt;a apunta a un 3 en memoria, y b apunta al mismo 3 en memoria. Python &lt;br /&gt;no creó dos objetos "3", sino que usó el mismo para los nombres a y b. &lt;br /&gt;&lt;/div&gt;&lt;div style="color: #666666;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #666666;"&gt;a apunta a un 500 en memoria, y b apunta a otro 500 en memoria. Python &lt;br /&gt;sí creó dos objetos "500". &lt;br /&gt;&lt;br /&gt;La pregunta es... ¿por qué la diferencia de comportamiento?  Como bien &lt;br /&gt;dijo Nati arriba, Python precachea (o tiene internalizado) algunos &lt;br /&gt;enteros chicos, porque sabe que siempre se van a usar. &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Esa es sólo una, varios usuarios lo explicaron muy bien también. =)&lt;br /&gt;Y eso era todo lo que quería escuchar. Una explicación sobre el funcionamiento, en apariencia, raro del "is" comparando enteros. No que me digan que usar "is" en ese caso estaba mal (cosa que sabía) ni que "is" no es "==" (cosa que sabía), y un largo etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-5314593356493775053?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/5314593356493775053/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2009/12/el-funesto-caso-de-is-y.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/5314593356493775053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/5314593356493775053'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2009/12/el-funesto-caso-de-is-y.html' title='El funesto caso de Is y =='/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-9149681035942757946</id><published>2009-10-15T18:49:00.000-07:00</published><updated>2009-10-22T15:18:07.436-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyectos personales'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>CodMACs/Python</title><content type='html'>Finalmente, subí a code.google la primera versión de CodMACs (implementación escrita en python) la pueden bajar desde &lt;a href="http://code.google.com/p/codmacs/"&gt;acá.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;El zip tiene clave. La idea es tener un poco de control sobre quién bajó el script. Todavía no estoy utilizando el sistema de control de versiones que provee google.&lt;br /&gt;&lt;br /&gt;Quién desee la clave, me puede enviar un mail a mi dirección hosteada en gmail: martincerdeira.&lt;br /&gt;&lt;br /&gt;Edito:&lt;br /&gt;&lt;br /&gt;Nuevo blog dedicado: &lt;a href="http://www.codmacs.blogspot.com/"&gt;http://www.codmacs.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_4kgjazFo0gM/StzfwnExykI/AAAAAAAAADU/FaNGUNXOrkY/S1600-R/logo2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="84" src="http://2.bp.blogspot.com/_4kgjazFo0gM/StzfwnExykI/AAAAAAAAADU/FaNGUNXOrkY/S1600-R/logo2.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-9149681035942757946?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/9149681035942757946/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2009/10/codmacspython.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/9149681035942757946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/9149681035942757946'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2009/10/codmacspython.html' title='CodMACs/Python'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4kgjazFo0gM/StzfwnExykI/AAAAAAAAADU/FaNGUNXOrkY/s72-Rc/logo2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-1299016509050510498</id><published>2009-08-10T17:28:00.001-07:00</published><updated>2009-09-16T19:06:49.698-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='reflexiones'/><title type='text'>Porqué Python?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/en/thumb/0/06/Python_logo.svg/475px-Python_logo.svg.png"&gt;&lt;img style="cursor: pointer; width: 475px; height: 114px;" src="http://upload.wikimedia.org/wikipedia/en/thumb/0/06/Python_logo.svg/475px-Python_logo.svg.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Python es un lenguaje sencillo y versátil que todo el mundo (inclusive quienes no trabajen directamente en programación) debería conocer.&lt;br /&gt;Posee:&lt;br /&gt;&lt;br /&gt;- Sintaxis limpia y sencilla. Esto hace que sea rápido desarrollar reduciendo los tiempos y la cantidad necesaria de programadores. Es ideal para escritura de scripts rápidos.&lt;br /&gt;&lt;br /&gt;- Baterías incluidas: Tiene una enorme biblioteca estándar lo que hace que el trabajo sea más veloz y sencillo.&lt;br /&gt;&lt;br /&gt;- Multiparadigma.&lt;br /&gt;&lt;br /&gt;- Poderoso y robusto.&lt;br /&gt;&lt;br /&gt;- Su identación obligatoria hace que la claridad de los programas resalte.&lt;br /&gt;&lt;br /&gt;- Usado en conjunto con bibliotecas gráficas (como GTK+ o Qt) es posible armar proyectos grandes que incluyan GUIs.&lt;br /&gt;&lt;br /&gt;- Portable. Es posible ejecutarlo en, por ejemplo, Linux, windows y Mac, Windows Mobile, y Google Android (gracias Fisa)&lt;br /&gt;&lt;br /&gt;- Documentación altamente disponible: 1) En internet (muchas páginas y wikis incluyendo oficiales y no oficiales) 2) Listas de correo (como pyar) donde hay un feedback constante. 3) En el mismo modo interactivo.&lt;br /&gt;&lt;br /&gt;- Una comunidad excelente en Argentina (gracias Facundo)  &lt;a href="http://www.python.org.ar/"&gt;http://www.python.org.ar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Creo que esas son las principales.&lt;br /&gt;La pregunta es, todavía no probaste python?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-1299016509050510498?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/1299016509050510498/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2009/08/porque-python.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/1299016509050510498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/1299016509050510498'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2009/08/porque-python.html' title='Porqué Python?'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-7877829670994604062</id><published>2009-07-29T15:29:00.000-07:00</published><updated>2009-09-16T19:06:29.282-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='matemáticas'/><title type='text'>Conjetura de Collatz:: 3n+1</title><content type='html'>&lt;a href="http://es.wikipedia.org/wiki/Conjetura_de_Collatz"&gt;Explicación&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Por si no les dió ganas de leer, basicamente lo que expone es que dado un numero entero positivo cualquiera (n), si se le realizan una serie operaciones sucesivas (si el nro es par, se lo divide por 2, caso contrario, se lo multiplica por 3 y se le suma 1) el resultado siempre es 1.&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;{7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1}&lt;br /&gt;&lt;br /&gt;Una vez alcanzado el 1, no se continúa ya que quedaríamos en un &lt;span style="font-style: italic;"&gt;loop&lt;/span&gt; ya que 1 es impar y:&lt;br /&gt;&lt;br /&gt;1 * 3 + 1 = 4&lt;br /&gt;4 / 2 = 2&lt;br /&gt;2 / 2 = 1&lt;br /&gt;1 * 3 + 1 = 4&lt;br /&gt;etc&lt;br /&gt;etc&lt;br /&gt;&lt;br /&gt;Hasta la fecha no se ha demostrado.&lt;br /&gt;&lt;br /&gt;Dejo un script en python que (si bien no lo demuestra) sirve para jugar un rato probando con distintos números.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def syracusse&lt;span style="font-size:+1;color:BLUE;"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;init&lt;span style="font-size:+1;color:BLUE;"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size:+1;color:BLUE;"&gt;:&lt;/span&gt;&lt;br /&gt;   print &lt;span style="color:PURPLE;"&gt;"&amp;lt;--START ("&lt;/span&gt; &lt;span style="font-size:+1;color:BLUE;"&gt;+&lt;/span&gt; &lt;span style="color:RED;"&gt;&lt;b&gt;str&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size:+1;color:BLUE;"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;init&lt;span style="font-size:+1;color:BLUE;"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt; &lt;span style="font-size:+1;color:BLUE;"&gt;+&lt;/span&gt; &lt;span style="color:PURPLE;"&gt;")"&lt;/span&gt;&lt;br /&gt;   syr &lt;span style="font-size:+1;color:BLUE;"&gt;=&lt;/span&gt; init&lt;br /&gt;   &lt;span style="color:RED;"&gt;&lt;b&gt;while&lt;/b&gt;&lt;/span&gt; syr &lt;span style="font-size:+1;color:BLUE;"&gt;!&lt;/span&gt;&lt;span style="font-size:+1;color:BLUE;"&gt;=&lt;/span&gt; &lt;span style="color:BROWN;"&gt;1&lt;/span&gt;&lt;span style="font-size:+1;color:BLUE;"&gt;:&lt;/span&gt;   &lt;br /&gt;       &lt;span style="color:RED;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt; syr &lt;span style="font-size:+1;color:BLUE;"&gt;%&lt;/span&gt; &lt;span style="color:BROWN;"&gt;2&lt;/span&gt; &lt;span style="font-size:+1;color:BLUE;"&gt;=&lt;/span&gt;&lt;span style="font-size:+1;color:BLUE;"&gt;=&lt;/span&gt; &lt;span style="color:BROWN;"&gt;0&lt;/span&gt;&lt;span style="font-size:+1;color:BLUE;"&gt;:&lt;/span&gt;&lt;br /&gt;           syr &lt;span style="font-size:+1;color:BLUE;"&gt;=&lt;/span&gt; syr &lt;span style="font-size:+1;color:BLUE;"&gt;/&lt;/span&gt; &lt;span style="color:BROWN;"&gt;2&lt;/span&gt;&lt;br /&gt;       &lt;span style="color:RED;"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size:+1;color:BLUE;"&gt;:&lt;/span&gt;&lt;br /&gt;           syr &lt;span style="font-size:+1;color:BLUE;"&gt;=&lt;/span&gt; &lt;span style="font-size:+1;color:BLUE;"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;syr &lt;span style="font-size:+1;color:BLUE;"&gt;*&lt;/span&gt; &lt;span style="color:BROWN;"&gt;3&lt;/span&gt;&lt;span style="font-size:+1;color:BLUE;"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt; &lt;span style="font-size:+1;color:BLUE;"&gt;+&lt;/span&gt; &lt;span style="color:BROWN;"&gt;1&lt;/span&gt;       &lt;br /&gt;       print syr&lt;br /&gt;   print &lt;span style="color:PURPLE;"&gt;"&amp;lt;--END"&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-7877829670994604062?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/7877829670994604062/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2009/07/conjetura-de-collatz-3n1.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/7877829670994604062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/7877829670994604062'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2009/07/conjetura-de-collatz-3n1.html' title='Conjetura de Collatz:: 3n+1'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1800461261730007882.post-4677487136790817577</id><published>2009-07-27T14:29:00.000-07:00</published><updated>2009-09-16T19:06:06.656-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='laboratorio'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Autodocumentación</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.etianen.com/media/img/about/technology/python-logo.png"&gt;&lt;img style="cursor: pointer; width: 50px; height: 50px;" src="http://www.etianen.com/media/img/about/technology/python-logo.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Algo muy bueno y que realmente puede ser muy útil en python es la autodocumentación.&lt;br /&gt;&lt;br /&gt;Realmente no requiere demasiada explicación, solamente es necesario ingresar un comentario del tipo (""") al comienzo de nuestra function (debe estar identada) y luego, invocando el comando help() pasandole el nombre la función veremos ese texto. Ejemplo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def autodoc&lt;span style=";font-size:78%;color:BLUE;"  &gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;msj&lt;span style=";font-size:78%;color:BLUE;"  &gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;span style=";font-size:78%;color:BLUE;"  &gt;&lt;b&gt;:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color:PURPLE;"&gt;""&lt;/span&gt;&lt;span style="color:PURPLE;"&gt;"Ejemplo de autodocumentacion&lt;br /&gt;      parametros: msj = Mensaje a mostrar"&lt;/span&gt;&lt;span style="color:PURPLE;"&gt;""&lt;/span&gt;&lt;br /&gt;  print msj&lt;br /&gt;help&lt;span style=";font-size:78%;color:BLUE;"  &gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;autodoc&lt;span style=";font-size:78%;color:BLUE;"  &gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Vamos a ver algo asi:&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;Help on function autodoc in module __main__:&lt;br /&gt;&lt;br /&gt;autodoc(msj)&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;····&lt;/span&gt;Ejemplo de autodocumentacion&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;····&lt;/span&gt;parametros: msj = Mensaje a mostrar&lt;br /&gt;(END) &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1800461261730007882-4677487136790817577?l=stealthissoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stealthissoftware.blogspot.com/feeds/4677487136790817577/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://stealthissoftware.blogspot.com/2009/07/autodocumentacion.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/4677487136790817577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1800461261730007882/posts/default/4677487136790817577'/><link rel='alternate' type='text/html' href='http://stealthissoftware.blogspot.com/2009/07/autodocumentacion.html' title='Autodocumentación'/><author><name>mRt</name><uri>http://www.blogger.com/profile/11096123777484326185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://3.bp.blogspot.com/_4kgjazFo0gM/StfTOk4z_oI/AAAAAAAAACw/8VkHrlRlcXI/S220/ghjgjgh.jpg'/></author><thr:total>0</thr:total></entry></feed>
