<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;AkcDSX48eip7ImA9WhBVF04.&quot;"><id>tag:blogger.com,1999:blog-19840256</id><updated>2013-04-23T18:27:58.072+01:00</updated><category term="coñazo" /><category term="exposición" /><category term="flash" /><category term="navidad" /><category term="chorrads" /><category term="pintura" /><category term="QR" /><category term="sms" /><category term="coche" /><category term="terror feed" /><category term="aparcamiento" /><category term="casque" /><category term="la palma" /><category term="veredita view" /><category term="robot" /><category term="icities" /><category term="discurso" /><category term="greader" /><category term="15m" /><category term="coop" /><category term="globos" /><category term="blogsYgofio" /><category term="western" /><category term="teléfonos" /><category term="concurso" /><category term="supervillanos" /><category term="dc" /><category term="televisión" /><category term="frases lapidaria" /><category term="clientes" /><category term="video" /><category term="geografía" /><category term="dinosaurio" /><category term="mashup" /><category term="definiciones" /><category term="carteles" /><category term="sistemas operativos" /><category term="StackOverflow" /><category term="cerveza" /><category term="fotos ebrias" /><category term="rolling stones" /><category term="retro" /><category term="Coulson-está-vivo-Furia-mintió" /><category term="tranviatas versus guagüeros" /><category term="reseña" /><category term="java" /><category term="fotozum" /><category term="incendio" /><category term="intro" /><category term="chuleo" /><category term="terremotos" /><category term="cartoon" /><category term="pulp" /><category term="Google Developers Day" /><category term="DesCon2" /><category term="django" /><category term="romería" /><category term="taller" /><category term="TLP" /><category term="pygments" /><category term="vendemotos" /><category term="LNDLMV" /><category term="boncho" /><category term="envidia cochina" /><category term="ojobuscador" /><category term="viajes" /><category term="auditorio" /><category term="armas" /><category term="300" /><category term="ubuntu" /><category term="pesca" /><category term="censura" /><category term="feedly" /><category term="salud" /><category term="google" /><category term="xenófobos" /><category term="agarrate los machos" /><category term="ak-47" /><category term="vax" /><category term="speed painting" /><category term="deviantart" /><category term="tdc" /><category term="ligarto" /><category term="bcndevcon" /><category term="gadget" /><category term="capullos" /><category term="pincho" /><category term="toolbox" /><category term="publicidad" /><category term="política" /><category term="2013" /><category term="imágenes" /><category term="transparencias" /><category term="rones" /><category term="EBE09" /><category term="Big Culo Day" /><category term="paridas vacacionales" /><category term="heroes" /><category term="planetas" /><category term="eoe" /><category term="The Blues Brothers" /><category term="radio" /><category term="machangadas" /><category term="obus" /><category term="división de poderes" /><category term="elecciones" /><category term="teaser" /><category term="eelt" /><category term="ecologismo" /><category term="music" /><category term="doraemon" /><category term="tópicos" /><category term="corto" /><category term="gps" /><category term="seo" /><category term="arquelogía informática" /><category term="friki" /><category term="zasca" /><category term="historia" /><category term="jodía informática" /><category term="tipografía" /><category term="revistas" /><category term="google earth" /><category term="siglas" /><category term="starwars" /><category term="ipod" /><category term="unix" /><category term="congreso" /><category term="canarisms" /><category term="emds" /><category term="marvel" /><category term="propaganda linux" /><category term="pc" /><category term="dia del padre" /><category term="londrs" /><category term="web" /><category term="seguridad" /><category term="cata" /><category term="sketchup" /><category term="poster" /><category term="ateísmo" /><category term="wtf" /><category term="Appy/POD" /><category term="fotos" /><category term="simpsons" /><category term="fútbol" /><category term="Ay oma que rica" /><category term="respeto" /><category term="py3k" /><category term="tortilla" /><category term="pastafari" /><category term="madmen" /><category term="css" /><category term="libros" /><category term="fabric" /><category term="conspiranoia" /><category term="DSL" /><category term="cultura" /><category term="turismo" /><category term="sun" /><category term="chuleta" /><category term="El Escarabajo Verde" /><category term="animación" /><category term="lotr" /><category term="tv" /><category term="walkman" /><category term="malaprensa" /><category term="humor" /><category term="wikileaks" /><category term="ull" /><category term="Red Neutral" /><category term="spectrum" /><category term="fotógrafos" /><category term="chorradas" /><category term="recursos útiles" /><category term="UML" /><category term="gofio" /><category term="pincho tortilla" /><category term="escepticismo" /><category term="ocio" /><category term="Religiones y otras enfermedades mentales" /><category term="inglés" /><category term="regreso al futuro" /><category term="velociraptor" /><category term="30rock" /><category term="colas" /><category term="cada vez más cabreado" /><category term="watchmen" /><category term="prensa" /><category term="puerto rican rock" /><category term="programación" /><category term="buena vida" /><category term="rollo viral" /><category term="software" /><category term="lluvia" /><category term="html" /><category term="estrellas" /><category term="anarroseo" /><category term="móviles" /><category term="El Monstruo del Sebadal" /><category term="katana" /><category term="VNC" /><category term="derechos de imagen" /><category term="ciencia" /><category term="tuenti" /><category term="ong" /><category term="Guerras y otras enfermedades mundiales" /><category term="juegos" /><category term="microformatos" /><category term="Google Maps" /><category term="caña" /><category term="tributo" /><category term="javascript" /><category term="récord" /><category term="buscatarareos" /><category term="paridas" /><category term="comics" /><category term="euribor" /><category term="batallitas" /><category term="muelte" /><category term="profesionales" /><category term="matemáticas" /><category term="malahostia" /><category term="música" /><category term="cablegate" /><category term="chavo" /><category term="citas" /><category term="automeme" /><category term="fotografía" /><category term="nuevas tecnologías" /><category term="2012" /><category term="El Supositorio" /><category term="trucos" /><category term="dinero" /><category term="galactica" /><category term="palante" /><category term="shield" /><category term="#hqj" /><category term="python" /><category term="2D" /><category term="camiseta" /><category term="windows" /><category term="casting" /><category term="canarias" /><category term="monotremas" /><category term="linux" /><category term="meme" /><category term="amigos" /><category term="xml-zombie" /><category term="husos horarios" /><category term="Internet" /><category term="vhs" /><category term="traductor" /><category term="diseño gráfico" /><category term="tutorial" /><category term="htc" /><category term="fulbol" /><category term="tenerife" /><category term="espías" /><category term="webmaster" /><category term="absurdo" /><category term="wii" /><category term="fundamentos web" /><category term="garimba" /><category term="YouTube" /><category term="bbc" /><category term="burocracia" /><category term="innovación" /><category term="abreviaturas" /><category term="API" /><category term="XXX" /><category term="google chrome" /><category term="mieditos" /><category term="post patrocinado" /><category term="saturnalias" /><category term="colegas" /><category term="plurk" /><category term="blogger" /><category term="empresas" /><category term="relato" /><category term="porno" /><category term="supervivencia" /><category term="accesibilidad" /><category term="cine" /><category term="series" /><category term="universidad" /><category term="libertades" /><category term="Daraemon" /><category term="símbolos" /><title>El Ornitorrinco Enmascarado</title><subtitle type="html">¡Allí! ¡En el cielo! ¿Es un pájaro!</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>735</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/ElOrnitorrincoEnmascarado" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="elornitorrincoenmascarado" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">ElOrnitorrincoEnmascarado</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;DUUERXk5fyp7ImA9WhBQFUQ.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-4014782461506423731</id><published>2013-03-18T09:00:00.000Z</published><updated>2013-03-18T09:00:04.727Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-18T09:00:04.727Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="monotremas" /><category scheme="http://www.blogger.com/atom/ns#" term="2013" /><title>#Monotremas: HabbitRPG, MyScriptFont y Lino</title><content type="html">&lt;p&gt;En mi afán de animar un poco el blog, voy a empezar una sección (etiqueta #Monotremas) con las utilidades, aplicaciones, páginas o servicios que más me han llamado la atención en Internet. No descarto poner algún día una chorrada, si me parece graciosa, pero seran raras excepciones. vamos con &lt;b&gt;Los monotremas de la semana&lt;/b&gt;:&lt;/p&gt;

&lt;h2&gt;HabbitRPG&lt;/h2&gt;

&lt;p&gt;&lt;b&gt;&lt;a href="https://habitrpg.com/splash.html"&gt;HabbitRPG&lt;/a&gt;&lt;/b&gt; te permite convertir tus metas y tus objetivos en un &lt;b&gt;Juego de Rol&lt;/b&gt;. Si lo haces bien, ganas puntos de experiencia y monedas de plata y oro con las que puedes conseguir nuevas armas, escudos, armaduras y demás parafernalia. Si fallas, pierdes puntos de vida; si fallas miserablemente, pierdes todo lo ganado y tienes que empezar de nuevo. Quien sabe, quiza sea el extra de motivación que algunos necesitamos. Tiene una &lt;a href="http://www.kickstarter.com/projects/lefnire/habitrpg-mobile"&gt;Campaña en Kickstarter&lt;/a&gt; para mejorar el producto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://habitrpg.com/splash.html" imageanchor="1" &gt;&lt;img border="0" src="http://1.bp.blogspot.com/-3L3eA6hV-sM/UT9wwS1UMuI/AAAAAAAACEE/vjdE9n855ak/s320/habitrpg_pixel.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;MyScriptFont&lt;/h2&gt;

&lt;p&gt;&lt;b&gt;&lt;a href="http://www.myscriptfont.com/"&gt;MyScriptFont&lt;/a&gt;&lt;/b&gt; es una aplicación web que te permite obtener una fuente o tipografia a partir de tu propia letra manuscrita. Es muy sencillo de usar; te descargas desde la web una plantilla,la rellenas con tu letra, la escaneas y la subes. Tras unos pocos segundos, obtienes un fichero con la tipografía en formato TrueType. Lo que ya no resulta tan sencillo es que tengas una letra bonita que merezca el esfuerzo. Ojo con la orientación, tamaño y posición relativa de los caracteres. Mi primera versión ha sido un truño, si consigo algo mas presentable la publicaré aquí.

&lt;p&gt;&lt;a href="http://www.myscriptfont.com/" imageanchor="1" &gt;&lt;img border="0" src="http://4.bp.blogspot.com/-sVaSOyIt0Iw/UT9zz_TUefI/AAAAAAAACEM/dZxUj57aFYw/s320/MyScriptFont.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Lino&lt;/h2&gt;

&lt;p&gt;&lt;b&gt;&lt;a href="http://en.linoit.com/"&gt;Lino&lt;/a&gt;&lt;/b&gt; es un servicio de publicación y compartición de notas, fotos, vídeos, enlaces, y lo que se ocurra, sobre una pizarra virtual. Es como el tablero de corcho de toda la vida, pero en la nube. Es sencillo de usar y puede ser una gran herramienta de trabajo colaborativo. Los tableros pueden ser privados, públicos pero sólo para lectura (cualquiera puede ver el tablero, pero no modificarlo), o totalmente públicos. El registro es gratuito, y solo necesitas un navegador moderno y/o un &lt;i&gt;smartphone&lt;/i&gt; para usarlo. Puedes acceder a una demostración de lino -sin necesida de registrarte- desde su página web.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/-uYoM6-o2HUE/UUBW-rQaajI/AAAAAAAACEc/wWFXNqVgS90/s1600/lino.png" imageanchor="1" &gt;&lt;img border="0" src="http://4.bp.blogspot.com/-uYoM6-o2HUE/UUBW-rQaajI/AAAAAAAACEc/wWFXNqVgS90/s320/lino.png" /&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/4014782461506423731/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=4014782461506423731" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/4014782461506423731?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/4014782461506423731?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2013/03/monotremas-habbitrpg-myscriptfont-y-lino.html" title="#Monotremas: HabbitRPG, MyScriptFont y Lino" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-3L3eA6hV-sM/UT9wwS1UMuI/AAAAAAAACEE/vjdE9n855ak/s72-c/habitrpg_pixel.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkYAQng8eSp7ImA9WhBQEko.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-441381117784683523</id><published>2013-03-14T14:09:00.000Z</published><updated>2013-03-14T14:09:03.671Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-14T14:09:03.671Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agarrate los machos" /><category scheme="http://www.blogger.com/atom/ns#" term="API" /><category scheme="http://www.blogger.com/atom/ns#" term="feedly" /><category scheme="http://www.blogger.com/atom/ns#" term="#hqj" /><category scheme="http://www.blogger.com/atom/ns#" term="greader" /><title>Google Reader ha muerto, larga vida a Feedly</title><content type="html">&lt;p&gt;¿Te sientes dolido, casi traicionado por la anunciada muerte de Google Reader? Una rápida búsqueda en Google y parece que su próximo sucesor apunta maneras: &lt;b&gt;&lt;a href="http://www.feedly.com/"&gt;Feedly&lt;/a&gt;&lt;/b&gt;. Como no hay mejor suerte que estar en el sitio preciso en el momento preciso (¿Verdad, &lt;a href="http://es.wikipedia.org/wiki/Casa_Stark"&gt;Eddard Stark&lt;/a&gt;?), los de feedly parece que se venían oliendo que esto iba a pasar, y llevan trabajando en un reemplazo, el &lt;b&gt;proyecto Normandía&lt;/b&gt;, una reimplementación compatible a nivel de API de los servidores de GoogleReader, y ejecutandose sobre Google App Engine, por añadir un poco de sal a la herida.&lt;/p&gt;

&lt;a href="http://www.feedly.com/" imageanchor="1" &gt;&lt;img border="0" src="http://1.bp.blogspot.com/-pCuWeAWFAkY/UUHZp-18qAI/AAAAAAAACE8/afA2EJoW9hU/s320/feedly.jpg" style="float:right;" /&gt;&lt;/a&gt;

&lt;p&gt;Feedly tienen aplicaciones nativas para teléfonos iOS, Android y Kindle, y &lt;i&gt;plugins&lt;/i&gt; para Chrome y Firefox. Puedes usarlo simplemente registrándote con tu cuenta de Google, y el día fatídico en que se cierre el servicio de Google las aplicaciones empezarán a usar Normandy, con lo cual el usuario no debería notar ningún problema. Parece que han añadido más servidores para evitar el colapso ante la avalancha de usuarios que, presumiblemente, les caerá encima.&lt;/p&gt;

&lt;p&gt;Por lo que he podido ver usa más o menos los mismos atajos de teclado (J/K para avanzar/retroceder, ? para la ayuda), y tiene diferentes formas de visualización, por defecto nos muestra una llamada &lt;b&gt;magazine&lt;/b&gt;, bastante atractiva, pero tiene la posiblidad de cambiar a una vista más resumida, &lt;b&gt;title&lt;/b&gt;, solo con los títulos de las entradas; esto es imprescindible para poder filtrar rápido cuando tienes, como yo, poco tiempo y muchos feeds. En esta página hay &lt;a href="http://blog.feedly.com/2013/03/14/tips-for-google-reader-users-migrating-to-feedly/"&gt;más consejos para sentirte cómodo en feedly si vienes de Google Reader&lt;/a&gt; (en Inglés).&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/441381117784683523/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=441381117784683523" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/441381117784683523?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/441381117784683523?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2013/03/google-reader-ha-muerto-larga-vida.html" title="Google Reader ha muerto, larga vida a Feedly" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-pCuWeAWFAkY/UUHZp-18qAI/AAAAAAAACE8/afA2EJoW9hU/s72-c/feedly.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0AHRHcyfip7ImA9WhBQEUU.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-2068772806495506358</id><published>2013-03-13T14:42:00.002Z</published><updated>2013-03-13T14:42:15.996Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-13T14:42:15.996Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="py3k" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="pygments" /><title>Pygments: Embellece tu código fuente</title><content type="html">&lt;a href="http://pygments.org/" imageanchor="1"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-IMKYREvgdPE/UUCL44I_TlI/AAAAAAAACEs/E0V1z_0vO0E/s320/pygments-logo.png" style="float: right;" /&gt;&lt;/a&gt;
&lt;p&gt;
&lt;a href="http://pygments.org/"&gt;&lt;b&gt;Pygments&lt;/b&gt;&lt;/a&gt; es una librería, &lt;i&gt;plugin&lt;/i&gt; y utilidad, todo en uno, que nos permite &lt;i&gt;embellecer&lt;/i&gt; nuestro código, añadiendo resaltado de palabras claves y colores que facilitan la lectura del mismo. Es especialmente útil para foros, &lt;i&gt;wikis&lt;/i&gt;, &lt;i&gt;blogs&lt;/i&gt; o cualquier sistema de enseñanza &lt;i&gt;on-line&lt;/i&gt; que necesiten mostrar código fuente. por ejemplo, lo usa mi repositorio de código favorito, &lt;a href="http://bitbucket.org/"&gt;bitbucket&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Pygments está escrito en Python, pero entiende muchos tipos de lenguaje, incluyendo los lenguajes de programación más populares como Python, Ruby, JavaScript, C, C++, C#, Java, Lua, Perl, lenguajes clásicos como Pascal, Common Lisp o Fortran, lenguajes nuevos como CoffeeScript o Clojure, lenguajes de plantillas como los de Django, Jinja, ERB (Ruby templating), Mako o Myghty y mil cosas más: ficheros de configuración de Apache, hojas de estilo CSS, SQL, etc... Esta variedad viene dada por lo sencillo que resulta escribir nuevos analizadores léxicos; la mayoría de los lenguajes solo necesitan definir algunas expresiones regulares.&lt;/p&gt;

&lt;p&gt;Puede usarse como herramienta de línea de comandos: &lt;code&gt;pygmentize&lt;/code&gt;, como librería para uso interno o como &lt;i&gt;plugin&lt;/i&gt; o añadido para sistemas ya existentes: Wordpress, MoinMoin y REsT entre otros. Es muy fácil tanto de utilizar como de extender; puedes &lt;a href="http://pygments.org/docs/styles/"&gt;personalizar la hoja de estilos&lt;/a&gt; para reflejar tus gustos estéticos (Pero recuerda, marrón y azul rara vez combinan). La salida más común es Html, pero también podemos obtener la salida en RTF, LaTex o códigos ANSI para la consola.&lt;/p&gt;

&lt;p&gt;Para integrarlo con Blogger usé la línea de comandos para obtener los estilos CSS correspondientes (&lt;code&gt;pygmentize -f html -S colorful&lt;/code&gt;) y los incluí en mi plantilla.&lt;/p&gt;

&lt;p&gt;Como creo fervientemente en las virtudes didácticas de los ejemplos, he aquí un cacho de código Python (¡Mi primer código publicado en Python 3!) antes de Pygments:&lt;/p&gt;

&lt;pre&gt;
granos = 1
for escaque in range(1, 65):
    print ("En el escaque #{0} hay #{1} granos".format(escaque, granos))
    granos *= 2
&lt;/pre&gt;

&lt;p&gt;Y después:&lt;/p&gt;

&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="n"&gt;granos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;escaque&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"En el escaque #{0} hay #{1} granos"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;escaque&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;granos&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;granos&lt;/span&gt; &lt;span class="o"&gt;*=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Veamos otro ejemplo, esta vez con Ruby. Antes:&lt;/p&gt;

&lt;pre&gt;
granos = 1
64.times do |escaque|
    puts "En el escaque #{escaque+1} hay #{granos} granos"
    granos *= 2
    end
&lt;/pre&gt;

&lt;p&gt;Y después:&lt;/p&gt;

&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="n"&gt;granos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;times&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;escaque&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"En el escaque &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;escaque&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; hay &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;granos&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; granos"&lt;/span&gt;
    &lt;span class="n"&gt;granos&lt;/span&gt; &lt;span class="o"&gt;*=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/2068772806495506358/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=2068772806495506358" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/2068772806495506358?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/2068772806495506358?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2013/03/pygments-embellece-tu-codigo-fuente.html" title="Pygments: Embellece tu código fuente" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-IMKYREvgdPE/UUCL44I_TlI/AAAAAAAACEs/E0V1z_0vO0E/s72-c/pygments-logo.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEIFQHg4cCp7ImA9WhBQEUU.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-7207190054572900233</id><published>2013-03-12T13:57:00.001Z</published><updated>2013-03-13T14:55:11.638Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-13T14:55:11.638Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="DSL" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>Como escribir una calculadora en 70 líneas de Python, mediante un analizador descendente recursivo</title><content type="html">&lt;p&gt;Este post es una traducción del artículo original de Erez, publicado en
su blog &lt;a class="reference external" href="http://blog.erezsh.com/"&gt;Stories For Sad Robots&lt;/a&gt;. El original puede consultarse aquí:&lt;/p&gt;
&lt;blockquote&gt;
&lt;a class="reference external" href="http://blog.erezsh.com/how-to-write-a-calculator-in-70-python-lines-by-writing-a-recursive-descent-parser/"&gt;http://blog.erezsh.com/how-to-write-a-calculator-in-70-python-lines-by-writing-a-recursive-descent-parser/&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;Hay referencias a un artículo anterior, si alguien está interesado un que
lo traduzca también que me deje un comentario y se hará lo que se pueda.&lt;/p&gt;

&lt;a href="http://4.bp.blogspot.com/-ix3e1f6rBTA/UT8wKsafRHI/AAAAAAAACDs/v0f3TgxTVPE/s1600/open_quote.png" imageanchor="1" &gt;&lt;img border="0" src="http://4.bp.blogspot.com/-ix3e1f6rBTA/UT8wKsafRHI/AAAAAAAACDs/v0f3TgxTVPE/s320/open_quote.png" width="48" height="40" alt="Empieza la traducción" /&gt;&lt;/a&gt;

&lt;p&gt;Hace tres meses, escribí un post detallando el proceso de implementar una
calculadora usando una librería de &lt;em&gt;parsing&lt;/em&gt;. La respuesta popular, sin embargo,
mostró que la mayoría de los lectores estaban más interesados en ver una
calculadora implementada desde cero, usando solo las &amp;quot;pilas incluidas&amp;quot;. Y me
dije ¿Por qué no?&lt;/p&gt;
&lt;p&gt;Implementar una calculadora es fácil, si usas algunos trucos específicos de
las expresiones aritméticas, pero usar estos trucos siempre produce lo mismo:
La solución pierde elegancia, no se puede extender y se hace difícil de
comprender intuitivamente. Como parecía un desafío interesante, y puede
conducir a un post útil, he decidido escribirlo usando un &lt;strong&gt;analizador
descendente recursivo&lt;/strong&gt; (&lt;a class="reference external" href="http://en.wikipedia.org/wiki/Recursive_descent_parser"&gt;recursive descent parser&lt;/a&gt; en wikipedia) genérico. Con
la mismo filosofía de la vez anterior, quiero mantener el menor número de
líneas que sea razonable, así que el código estará lleno de trucos y &lt;em&gt;hacks&lt;/em&gt;,
pero estarán a un nivel superficial y no serán específicos de la tarea que
tenemos entre manos.&lt;/p&gt;
&lt;p&gt;Este artículo es una explicación detallada, paso a paso, de la implementación.
Si quieres pasar directamente al código e intentar entenderlo por tu cuenta,
solo tienes que ir a la última parte. Con suerte una vez leído y entendido el
artículo tendrás una mejor comprensión del funcionamiento interno de un
analizador sintáctico. Luego puedes incluso utilizar una librería de análisis
sintáctico de verdad y ahorrarte todos estos enojosos detalles.&lt;/p&gt;
&lt;p&gt;Para entender este artículo, hace  falta tener un conocimiento más o menos
completo de Python, y es recomendable tener al menos una idea de lo que son
los analizadores sintácticos o &lt;strong&gt;parsers&lt;/strong&gt; y para que sirven. Si no estás seguro,
te recomiendo que leas el artículo anterior &lt;a class="reference external" href="http://blog.erezsh.com/how-to-write-a-calculator-in-50-python-lines-without-eval/"&gt;How To Write A Calculator in 50
Python Lines (Without Eval)&lt;/a&gt;, en el que se explica la gramática que
usaremos aquí.&lt;/p&gt;
&lt;div class="section" id="paso-1-tokenizar-tokenize"&gt;
&lt;h1&gt;Paso 1: Tokenizar (Tokenize)&lt;/h1&gt;
&lt;p&gt;Para poder evaluar una expresión, el primer paso será convertirla en una lista
de símbolos individuales, o &lt;strong&gt;tokens&lt;/strong&gt;. Esta es la parte más fácil, y no es el tema central
de interés en este artículo, así que haremos un poco de trampa para facilitar
las cosas.&lt;/p&gt;
&lt;p&gt;En primer lugar, definiremos los &lt;em&gt;tokens&lt;/em&gt; (Se observará que falta la definición
de números, eso es porque vamos a considerarlos el valor por defecto):&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;token_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;+&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ADD&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ADD&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MUL&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MUL&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="s"&gt;&amp;#39;(&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;LPAR&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;RPAR&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;Token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;namedtuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Token&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Y este es el código que usaremos para &lt;em&gt;tokenizar&lt;/em&gt; una expresión dada, &lt;tt class="docutils literal"&gt;expr&lt;/tt&gt;:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;split_expr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;[\d.]+|[&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;]&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token_map&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Token&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token_map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;NUM&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;split_expr&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;La primera línea es un truco que divide la expresión en sus componentes básicos, de
forma que:&lt;/p&gt;

&lt;pre class="literal-block"&gt;
'1.2 / ( 11+3)' --&amp;gt; ['1.2', '/', '(', '11', '+', '3', ')']
&lt;/pre&gt;

&lt;p&gt;La siguiente línea asigna nombres a los &lt;em&gt;tokens&lt;/em&gt;, para que el parser
pueda reconocerlos por categoría:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
['1.2', '/', '(', '11', '+', '3', ')']
--&amp;gt;
[Token(name='NUM', value='1.2'), Token(name='MUL', value='/'),
Token(name='LPAR', value='('), Token(name='NUM', value='11'),
Token(name='ADD', value='+'), Token(name='NUM', value='3'),
Token(name='RPAR', value=')')]
&lt;/pre&gt;

&lt;p&gt;Se asume que cualquier &lt;em&gt;token&lt;/em&gt; que no esté en el diccionario &lt;tt class="docutils literal"&gt;token_map&lt;/tt&gt;
corresponderá a un número. Nuestro tokenizador carece de la virtud de
la &lt;em&gt;validación&lt;/em&gt;, que evitaría que se aceptaran cosas que no fueran
números, pero por suerte el evaluador realizará más tarde esta tarea por
nosotros.&lt;/p&gt;

&lt;p&gt;Ahora que ya tenemos una lista de &lt;em&gt;tokens&lt;/em&gt;, nuestro siguiente paso será &lt;em&gt;parsearlo&lt;/em&gt; para
obtener un &lt;a class="reference external" href="http://en.wikipedia.org/wiki/Abstract_syntax_tree"&gt;AST&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;

&lt;div class="section" id="paso-2-definir-la-gramatica"&gt;
&lt;h1&gt;Paso 2: Definir la gramática&lt;/h1&gt;

&lt;p&gt;El parser que usaremos en esta implementación es un versión un tanto ingenua
de &lt;strong&gt;parser recursivo descendente&lt;/strong&gt; (&lt;a class="reference external" href="http://en.wikipedia.org/wiki/Recursive_descent_parser"&gt;recursive descent parser&lt;/a&gt;), que  es una
versión simplificada del parser LL (&lt;a class="reference external" href="http://en.wikipedia.org/wiki/LL_parser"&gt;LL parser&lt;/a&gt;). Este tipo de parser es el
más fácil de implementar, y de hecho solo nos ocupará unas 14 líneas de
código. Es un tipo de parser descendente, lo que significa que primero intenta
emparejar la regla más alta (como &lt;tt class="docutils literal"&gt;expression&lt;/tt&gt;), y continua de forma
recursiva intentado emparejar subreglas hasta que alcanza las reglas de más
bajo nivel (como por ejemplo, &lt;tt class="docutils literal"&gt;number&lt;/tt&gt;). Para expresarlo de otra manera,
mientras que un parser ascendente (Como un &lt;a class="reference external" href="http://en.wikipedia.org/wiki/LR_parser"&gt;LR Parser&lt;/a&gt; o &lt;a class="reference external" href="http://es.wikipedia.org/wiki/Analizador_sint%C3%A1ctico_LR"&gt;Analizador sintáctico LR&lt;/a&gt; en
español) intenta de forma gradual &amp;quot;plegar&amp;quot; o &amp;quot;comprimir&amp;quot; tokens y reglas dentro de otras
reglas, hasta que solo quede una, un parser descendente irá expandiendo las
reglas, usando cada vez reglas menos abstractas, hasta el punto en que haya
emparejado completamente los &lt;em&gt;tokens&lt;/em&gt; de entrada.&lt;/p&gt;
&lt;p&gt;Pero antes de entrar en materia con el parser, hablemos un poco de la
gramática. En el post anterior usamos un parser LR, y se definió la gramática
así (las mayúsculas son tokens):&lt;/p&gt;

&lt;pre class="literal-block"&gt;
add: add ADD mul | mul;
mul: mul MUL atom | atom;
atom: NUM | '(' add ')' | neg;
neg: '-' atom;
&lt;/pre&gt;

&lt;div class="note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;Si no entiendes esta gramática, deberías leer el artículo
anterior: &lt;a class="reference external" href="http://blog.erezsh.com/how-to-write-a-calculator-in-50-python-lines-without-eval/"&gt;How To Write A Calculator in 50 Python Lines (Without Eval)&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;esta vez usaremos un parser LL, así que definiremos la gramática de esta otra forma:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
rule_map = {
    'add' : ['mul ADD add', 'mul'],
    'mul' : ['atom MUL mul', 'atom'],
    'atom': ['NUM', 'LPAR add RPAR', 'neg'],
    'neg' : ['ADD atom'],
}
&lt;/pre&gt;
&lt;p&gt;Hay un cambio sutil: Las definiciones recursivas de &lt;tt class="docutils literal"&gt;add&lt;/tt&gt; y &lt;tt class="docutils literal"&gt;mul&lt;/tt&gt;
están invertidas. Este detalle es muy importante, y necesita su
aclaración.&lt;/p&gt;
&lt;p&gt;La versión LR de esta gramática usa lo que se llama recursividad por la izquierda
(&lt;a class="reference external" href="http://en.wikipedia.org/wiki/Left_recursion"&gt;left recursion&lt;/a&gt; en inglés). Cuando un parser LL se encuentra con una
llamada recursiva, la ejecuta de inmediato, en un intento de emparejar la
regla que está utilizando, por lo que puede entrar en un bucle infinito.
&lt;a class="reference external" href="http://www.antlr.org/wiki/display/ANTLR3/Left-Recursion+Removal"&gt;Incluso parsers LL bastante avanzados como ANTLR se enfrentan a esta problema&lt;/a&gt;, aunque
probablemente, en vez de dar vueltas indefinidamente, como hace nuestro
parser de juguete, terminarán con un conveniente  mensaje de error .&lt;/p&gt;
&lt;p&gt;La recursividad por la izquierda se soluciona de forma sencilla cambiándola
por recursividad por la derecha, que es justo lo que acabamos de hacer con
nuestro sutil cambio. Pero como nada en la vida es fácil cuando tratamos con
&lt;em&gt;parsers&lt;/em&gt;, se ha creado otro problema: Mientras que la recursividad por la
izquierda analiza &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;3-2-1&lt;/span&gt;&lt;/tt&gt; &lt;em&gt;correctamente&lt;/em&gt; como &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;(3-2)-1&lt;/span&gt;&lt;/tt&gt;, la recursividad
por la derecha lo analiza, de forma &lt;em&gt;incorrecta&lt;/em&gt;, como &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;3-(2-1)&lt;/span&gt;&lt;/tt&gt;. No sé como
solucionar esto de forma fácil, así que para mantener las cosas sencillas he
optado por mantener la forma incorrecta y resolverlo en una etapa posterior
(véase el paso 4).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="paso-3-obtener-un-ast-arbol-de-sintaxis-abstracta"&gt;
&lt;h1&gt;Paso 3: Obtener un AST (Árbol de Sintaxis Abstracta)&lt;/h1&gt;
&lt;p&gt;El algoritmo es sencillo. Vamos a definir una función recursiva que acepta dos
parámetros: El primero es el nombre de la regla que estamos intentando
capturar, y el segundo es una lista de los tokens que nos quedan por
comprobar. Empezaremos con &lt;tt class="docutils literal"&gt;add&lt;/tt&gt;, -que es la regla más alta- y con la lista
de todos los &lt;em&gt;tokens&lt;/em&gt;, y haremos que las sucesivas llamadas recursivas sean cada
vez más específicas. La función  retorna una tupla: La correspondencia
encontrada y una lista de los &lt;em&gt;tokens&lt;/em&gt; que faltan por comprobar. Con el
propósitos de reducir en lo posible el código, este será capaz de encontrar
&lt;em&gt;tokens&lt;/em&gt; también (En los dos casos son cadenas de texto: en un caso con todas
las letras en mayúsculas y en el otro con todas las letras en minúsculas).&lt;/p&gt;
&lt;p&gt;Este es el código del &lt;em&gt;parser&lt;/em&gt;:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;RuleMatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;namedtuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;RuleMatch&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;matched&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rule_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;rule_name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;      &lt;span class="c"&gt;# Match a token?&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;RuleMatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;expansion&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rule_map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rule_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()):&lt;/span&gt;   &lt;span class="c"&gt;# Match a rule?&lt;/span&gt;
        &lt;span class="n"&gt;remaining_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;
        &lt;span class="n"&gt;matched_subrules&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;subrule&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;expansion&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;matched&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;remaining_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subrule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;remaining_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;matched&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;   &lt;span class="c"&gt;# no such luck. next expansion!&lt;/span&gt;
            &lt;span class="n"&gt;matched_subrules&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matched&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;RuleMatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rule_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matched_subrules&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;remaining_tokens&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;   &lt;span class="c"&gt;# match not found&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Las líneas 4-5 comprueban si &lt;tt class="docutils literal"&gt;rule_name&lt;/tt&gt; es realmente un &lt;em&gt;token&lt;/em&gt;, y si coincide
con el &lt;em&gt;token&lt;/em&gt; actual. Si lo hace, devuelve la coincidencia, junto con el resto
de los &lt;em&gt;tokens&lt;/em&gt; que aun faltan por consumir.&lt;/p&gt;
&lt;p&gt;La línea 6 itera sobre las subreglas de &lt;tt class="docutils literal"&gt;rule_name&lt;/tt&gt;, de forma que cada una
pueda ser analizada recursivamente. Si &lt;tt class="docutils literal"&gt;rule_name&lt;/tt&gt; es un &lt;em&gt;token&lt;/em&gt;, la llamada a
&lt;tt class="docutils literal"&gt;get()&lt;/tt&gt; devolverá una tupla vacía y el código continuará hasta alcanzar el
return final, que devuelve una tupla sin valores.&lt;/p&gt;
&lt;p&gt;Las líneas 9-14 iteran sobre cada elemento de la subregla actual, e intenta
hacerlas coincidir de forma secuencial. Cada iteración intenta consumir tantos
&lt;em&gt;tokens&lt;/em&gt; como le sea posible. Si un elemento no coincide, se descarta toda la
regla. Si, por el contrario, se consigue casar todos los elementos, alcanzaremos
la cláusula &lt;tt class="docutils literal"&gt;else&lt;/tt&gt; y devolveremos nuestra coincidencia para &lt;tt class="docutils literal"&gt;rule_name&lt;/tt&gt;,
junto con el resto de &lt;em&gt;tokens&lt;/em&gt; que faltan por casar.&lt;/p&gt;
&lt;p&gt;Vamos a ejecutarlo con &lt;tt class="docutils literal"&gt;1.2 / ( 11+3)&lt;/tt&gt; como entrada:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; tokens = [Token(name='NUM', value='1.2'), Token(name='MUL', value='/'),
              Token(name='LPAR', value='('), Token (name='NUM', value='11'),
              Token(name='ADD', value='+'), Token(name='NUM', value='3'),
              Token(name='RPAR', value=')')]
&amp;gt;&amp;gt;&amp;gt; match('add', tokens)
(RuleMatch(name='add', matched=[RuleMatch(name='mul',
matched=[RuleMatch(name='atom', matched=[Token(name='NUM', value='1.2')]),
Token(name='MUL', value='/'), RuleMatch(name='mul',
matched=[RuleMatch(name='atom', matched=[Token(name='LPAR',
value='('), RuleMatch(name='add', matched=[RuleMatch(name='mul',
matched=[RuleMatch(name='atom', matched=[Token(name='NUM', value='11')])]),
Token(name='ADD', value='+'), RuleMatch(name='add',
matched=[RuleMatch(name='mul', matched=[RuleMatch(name='atom',
matched=[Token(name='NUM', value='3')])])])]), Token(name='RPAR',
value=')')])])])]), [])
&lt;/pre&gt;
&lt;p&gt;El resultado es una tupla, como era de esperar, y podemos ver que no queda
ningún token para analizar. La coincidencia actual no es fácil de leer, vamos
a representarla gráficamente para que se entienda mejor:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
add
    mul
        atom
            NUM '1.2'
        MUL '/'
        mul
            atom
                LPAR    '('
                add
                    mul
                        atom
                            NUM '11'
                    ADD '+'
                    add
                        mul
                            atom
                                NUM '3'
                RPAR    ')'
&lt;/pre&gt;
&lt;p&gt;Esta es la pinta que presenta un AST, en concepto. Es una buena práctica
ejecutar mentalmente el &lt;em&gt;parser&lt;/em&gt;, o quizá con la ayuda de papel. Me atrevería a
decir que es necesario si realmente quieres entenderlo. Puedes usar este AST
como referencia para asegurarte de que lo estás haciendo bien.&lt;/p&gt;
&lt;p&gt;En este punto, henos escrito un &lt;em&gt;parser&lt;/em&gt; capaz de analizar correctamente
operaciones binarias, operadores unitarios, paréntesis y precedencia,&lt;/p&gt;
&lt;p&gt;Solo hay una cosa que hace mal, y vamos a arreglarla a continuación.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="paso-4-post-procesado"&gt;
&lt;h1&gt;Paso 4: Post Procesado&lt;/h1&gt;
&lt;p&gt;El &lt;em&gt;parser&lt;/em&gt; no es perfecto en muchos aspectos. El más importante ahora es que no
puede manejar la recursividad por la izquierda, lo que obliga a que la
gramática sea recursiva derecha. En consecuencia, analizar la cadena &lt;tt class="docutils literal"&gt;8/4/2&lt;/tt&gt;
nos genera el siguiente AST:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
add
    mul
        atom
            NUM 8
        MUL '/'
        mul
            atom
                NUM 4
            MUL '/'
            mul
                atom
                    NUM 2
&lt;/pre&gt;
&lt;p&gt;Si intentamos resolver esta expresión con este árbol, tendríamos que calcular
primero &lt;tt class="docutils literal"&gt;4/2&lt;/tt&gt;, que es incorrecto. Algunos parsers LL eligen arreglar la
asociatividad en el árbol. Pero esto llevaría demasiadas líneas ;). En vez de
eso, lo que vamos a hacer en &amp;quot;aplanarlo&amp;quot;. El método es sencillo: Para cada regla en el AST que:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;necesite ser arreglada,&lt;/li&gt;
&lt;li&gt;sea una operación binaria (tiene tres subreglas), y&lt;/li&gt;
&lt;li&gt;el operando por la derecha resulta ser la misma regla&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;entonces &amp;quot;aplanaremos&amp;quot; la última en la primera. Por &amp;quot;aplanar&amp;quot; quiero decir
reemplazar un nodo por sus hijos, en el contexto de su padre. Como nuestro
recorrido por el árbol es DFS post-order, esto significa que empieza por los
bordes del árbol y va progresando hacia la raíz, de forma que los efectos son
acumulativos. Este es el código:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;fix_assoc_rules&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;add&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;mul&amp;#39;&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_recurse_tree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;matched&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rule_map&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;flatten_right_associativity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_recurse_tree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flatten_right_associativity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fix_assoc_rules&lt;/span&gt;
        &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;
        &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;matched&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;RuleMatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Este código convertirá cualquier composición secuencial de sumas o
multiplicaciones en una lista plana (sin mezclar unas con otras). Los
paréntesis rompen la secuencia, por supuesta, así que no se ven afectados.&lt;/p&gt;
&lt;p&gt;A partir de aquí se &lt;em&gt;podría&lt;/em&gt; reconstruir la estructura en forma asociativa
por la izquierda, usando código como:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build_left_associativity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;new_nodes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_recurse_tree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;build_left_associativity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fix_assoc_rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_nodes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;new_nodes&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;RuleMatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_nodes&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;RuleMatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_nodes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Pero no lo vamos a hacer. Queremos reducir el número de líneas de
código, y cambiar el código de evaluación para que pueda manejar listas
conlleva menos líneas que reconstruir el árbol.&lt;/p&gt;

&lt;div class="note"&gt;
&lt;p class="first admonition-title"&gt;Nota&lt;/p&gt;
&lt;p class="last"&gt;DFS post order: DFS significa &amp;quot;búsqueda  en profundidad&amp;quot;, y significa que
a medida que recorremos el árbol, se visitan primero los nodos que están en los
niveles inferiores (O, dicho de otra manera, los más profundos). Hay dos tipos
de búsquedas en profundidad, en preorden o postorden. La diferencia entra
las dos es el momento en que se añade un nodo a la salida, antes o después de
visitarlo)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="paso-5-evaluar"&gt;
&lt;h1&gt;Paso 5: Evaluar&lt;/h1&gt;
&lt;p&gt;Evaluar el árbol es muy sencillo. Lo único que hace falta es navegar por él de
forma similar a como lo hicimos en el código de post-proceso (Es decir, DFS
post-order) y evaluar cada regla que nos encontramos. Como hemos evaluado
primero los nodos más profundos, cada vez que alcanzamos un nodo de tipo regla,
sus hijos no pueden ser otra cosa más que números. Este es el código:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;bin_calc_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;mul&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;+&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calc_binary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;bin_calc_map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]](&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;calc_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;NUM&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;atom&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;neg&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;mul&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc_binary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;add&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc_binary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;solutions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_recurse_tree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;calc_map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;solutions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Hemos escrito &lt;tt class="docutils literal"&gt;calc_binary&lt;/tt&gt; para que evalúe tanto la suma como
la multiplicación (y sus contrapartidas). También evalúa listas, dado
el caso, de manera asociativa por la izquierda. De esa forma resolvemos
el problema que teníamos con nuestra pequeña gramática LL.&lt;/p&gt;
&lt;/div&gt;

&lt;div class="section" id="paso-6-el-repl-readevalprint-loop"&gt;
&lt;h1&gt;Paso 6: El REPL (Read–Eval–Print Loop)&lt;/h1&gt;
&lt;p&gt;La forma más sencilla posible sería:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;raw_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;amp;gt; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Que no precisa más explicación. Espero :)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="apendice-todo-el-codigo-en-uno-una-calculadora-en-70-lineas"&gt;
&lt;h1&gt;Apéndice: Todo el código en uno: una calculadora en 70 líneas&lt;/h1&gt;
&lt;p&gt;Este es el código final:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="sd"&gt;&amp;#39;&amp;#39;&amp;#39;A Calculator Implemented With A Top-Down, Recursive-Descent Parser&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="c"&gt;# Author: Erez Shinan, Dec 2012&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;collections&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;operator&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;mul&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;

&lt;span class="n"&gt;Token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;namedtuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Token&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;RuleMatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;namedtuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;RuleMatch&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;matched&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;token_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;+&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ADD&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ADD&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MUL&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MUL&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;(&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;LPAR&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;RPAR&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;rule_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;add&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mul ADD add&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;mul&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;mul&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;atom MUL mul&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;atom&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;atom&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;NUM&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;LPAR add RPAR&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;neg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;neg&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ADD atom&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;fix_assoc_rules&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;add&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;mul&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;bin_calc_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;mul&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;+&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calc_binary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;bin_calc_map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]](&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;calc_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;NUM&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;atom&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;neg&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;mul&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc_binary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;add&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc_binary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rule_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;rule_name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;      &lt;span class="c"&gt;# Match a token?&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;expansion&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rule_map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rule_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()):&lt;/span&gt;   &lt;span class="c"&gt;# Match a rule?&lt;/span&gt;
        &lt;span class="n"&gt;remaining_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;
        &lt;span class="n"&gt;matched_subrules&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;subrule&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;expansion&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;matched&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;remaining_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subrule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;remaining_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;matched&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;   &lt;span class="c"&gt;# no such luck. next expansion!&lt;/span&gt;
            &lt;span class="n"&gt;matched_subrules&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matched&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;RuleMatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rule_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matched_subrules&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;remaining_tokens&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;   &lt;span class="c"&gt;# match not found&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_recurse_tree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;matched&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rule_map&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;flatten_right_associativity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_recurse_tree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flatten_right_associativity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fix_assoc_rules&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;matched&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;RuleMatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;solutions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_recurse_tree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;calc_map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;solutions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;split_expr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;[\d.]+|[&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;]&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token_map&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Token&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token_map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;NUM&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;split_expr&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;add&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;,&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;flatten_right_associativity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;raw_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;amp;amp;gt; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;a href="http://2.bp.blogspot.com/-bO23mo8zZPg/UT8wlDzqNFI/AAAAAAAACD0/ckWOWR3rF2s/s1600/close_quote.png" imageanchor="1" &gt;&lt;img border="0" src="http://2.bp.blogspot.com/-bO23mo8zZPg/UT8wlDzqNFI/AAAAAAAACD0/ckWOWR3rF2s/s320/close_quote.png" width="48" height="40" alt="Termina la traducción" /&gt;&lt;/a&gt;

&lt;p&gt;Hasta aquí el artículo original. Si quieres que traduzca el artículo anterior al que
se hace referencia en el texto, déjame una nota en los comentarios.&lt;/p&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/7207190054572900233/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=7207190054572900233" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/7207190054572900233?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/7207190054572900233?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2013/03/como-escribir-una-calculadora-en-70.html" title="Como escribir una calculadora en 70 líneas de Python, mediante un analizador descendente recursivo" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-ix3e1f6rBTA/UT8wKsafRHI/AAAAAAAACDs/v0f3TgxTVPE/s72-c/open_quote.png" height="72" width="72" /><thr:total>0</thr:total><georss:featurename>Atlantic/Canary</georss:featurename><georss:point>28.265682390146477 -16.5673828125</georss:point><georss:box>24.636822390146477 -21.7309568125 31.894542390146476 -11.4038088125</georss:box></entry><entry gd:etag="W/&quot;D0ENSXg4fSp7ImA9WhBREUk.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-2576833457297123280</id><published>2013-03-01T13:43:00.002Z</published><updated>2013-03-01T13:48:18.635Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-01T13:48:18.635Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="revistas" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="propaganda linux" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>Edición especial Python de Full Circle Magazine</title><content type="html">&lt;p&gt;La revista &lt;a href="http://fullcirclemagazine.org/"&gt;Full Circle Magazine&lt;/a&gt; ha sacado un especial agrupando la serie de artículos sobre programación en Python. Se puede descargar libremente desde aquí:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fullcirclemagazine.org/python-special-edition-volume-six/"&gt;Full Circle magazine Python Special edition Volume 06&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://fullcirclemagazine.org/python-special-edition-volume-six/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-o3Ke1Gje4Mw/UTCvhSkPWRI/AAAAAAAACDc/XtCeubULyTM/s320/portada.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Es la edición número 6, así que supongo que en algún lado estarán las ediciones anteriores, &lt;strike&gt;si las encuentro las pondré también&lt;/strike&gt;. &lt;b&gt;Dicho y hecho:&lt;/b&gt;&lt;/p&gt;

&lt;h4&gt;Ediciones anteriores&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://fullcirclemagazine.org/python-special-edition-volume-five/"&gt;Quinta edición&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://fullcirclemagazine.org/python-special-edition-volume-four"&gt;Cuarta edición&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://fullcirclemagazine.org/python-special-edition-issue-three/"&gt;Tercera edición&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://fullcirclemagazine.org/python-special-edition-2/"&gt;Segunda edición&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://fullcirclemagazine.org/python-special-edition-1/"&gt;Primera edición&lt;/a&gt;&lt;/li&gt;

&lt;/ul&gt;
   </content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/2576833457297123280/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=2576833457297123280" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/2576833457297123280?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/2576833457297123280?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2013/03/edicion-especial-python-de-full-circle.html" title="Edición especial Python de Full Circle Magazine" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-o3Ke1Gje4Mw/UTCvhSkPWRI/AAAAAAAACDc/XtCeubULyTM/s72-c/portada.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUYDSHs_eSp7ImA9WhBSEk0.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-1401910122683496913</id><published>2013-02-18T15:59:00.000Z</published><updated>2013-02-18T15:59:39.541Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-18T15:59:39.541Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="pulp" /><category scheme="http://www.blogger.com/atom/ns#" term="Big Culo Day" /><category scheme="http://www.blogger.com/atom/ns#" term="western" /><title>Big Culo Day 2013</title><content type="html">Mi aportación al gran &lt;a href="http://jotacedt.blogspot.com.es/2013/02/feliz-big-culo-day-2013.html"&gt;Big Culo Day 2013&lt;/a&gt;. En esta ocasión, cortesía de &lt;a href="http://en.wikipedia.org/wiki/Russ_Heath"&gt;Russ Heath&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-aling: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-3GnVXA70EjE/USJLVwCe9BI/AAAAAAAACC8/LI1Dvz7B_Kg/s1600/cowgirls-at-war.jpg" imageanchor="1"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-3GnVXA70EjE/USJLVwCe9BI/AAAAAAAACC8/LI1Dvz7B_Kg/s1600/cowgirls-at-war.jpg" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br /&gt;
Extra bonus: Por si está repetida:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-aling: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-Ax2zKr71Mto/USJPSVhfTGI/AAAAAAAACDM/QcafEDlUM08/s1600/midnight_at_the_oasis_29.jpg" imageanchor="1"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Ax2zKr71Mto/USJPSVhfTGI/AAAAAAAACDM/QcafEDlUM08/s320/midnight_at_the_oasis_29.jpg" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br /&gt;
¡Ah! ¡Qué satisfacción da el deber cumplido! Hasta el año que viene.


</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/1401910122683496913/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=1401910122683496913" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/1401910122683496913?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/1401910122683496913?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2013/02/big-culo-day-2013.html" title="Big Culo Day 2013" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-3GnVXA70EjE/USJLVwCe9BI/AAAAAAAACC8/LI1Dvz7B_Kg/s72-c/cowgirls-at-war.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DU4MQXs6fip7ImA9WhNVEEU.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-3394246956416199614</id><published>2012-12-21T11:06:00.000Z</published><updated>2012-12-21T11:06:20.516Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-21T11:06:20.516Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="chorradas" /><title>FAQ sobre el fin del mundo 2012</title><content type="html">&lt;p&gt;Pregunta: &lt;b&gt;¿Se acabará el mundo en el 2012?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Respuesta: &lt;b&gt;No&lt;/b&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/3394246956416199614/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=3394246956416199614" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/3394246956416199614?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/3394246956416199614?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2012/12/faq-sobre-el-fin-del-mundo-2012.html" title="FAQ sobre el fin del mundo 2012" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkYCQn0_eCp7ImA9WhNQFkU.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-3906364970588649263</id><published>2012-11-23T14:16:00.000Z</published><updated>2012-11-23T14:16:03.340Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-11-23T14:16:03.340Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="buena vida" /><category scheme="http://www.blogger.com/atom/ns#" term="2012" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="bcndevcon" /><title>Nos vemos en la Barcelona Developers Conference</title><content type="html">&lt;p&gt;Del 6 al 8 de diciembre voy a asistir a la &lt;a href="http://bcndevcon.org/"&gt;&lt;b&gt;Barcelona Developers Conference&lt;/b&gt;&lt;/a&gt; (hashtag &lt;tt&gt;&lt;a href="https://es.twitter.com/search?q=%23bcndevcon"&gt;#bcndevcon&lt;/a&gt;&lt;/tt&gt;), encuentro organizado por desarrolladores para desarrolladores con una pinta muy interesante.&lt;/p&gt;


&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-EXgaAgk8zoY/UK-DJfgddrI/AAAAAAAAB34/nmYioXdoCPw/s1600/bdc.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="264" width="308" src="http://4.bp.blogspot.com/-EXgaAgk8zoY/UK-DJfgddrI/AAAAAAAAB34/nmYioXdoCPw/s400/bdc.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p style="text-align: center"&gt;&lt;small&gt;Me encanta el look apocalípico del evento. Tremendas las profecías de la abeja esa.&lt;/small&gt;&lt;/p&gt;


&lt;p&gt;Me atraen especialmente los tracks sobre javascript y alternativas (&lt;a href="http://coffeescript.org/"&gt;coffeescript&lt;/a&gt; sobre todo), desarrollo para android, arduino y &lt;i&gt;hardware&lt;/i&gt; abierto, bases de datos NoSql y, como no, Python. En caso de que en los &lt;i&gt;tracks&lt;/i&gt; no haya nada interesante -perece poco probable- siempre se puede uno acercar al taller de robótica y sacar ideas para el Plan de Conquista Mundial, que tan abandonado tengo.&lt;/p&gt;

&lt;p&gt;Si vas a estar por la conferencia o cercanías, dame un toque por los canales habituales, teléfono, twitter (&lt;a href="https://es.twitter.com/jileon"&gt;@jileon&lt;/a&gt;), email, etc o, si todo lo anterior falla, deja un comentario en el post. Como mínimo te invitaré a un café.&lt;/p&gt;

&lt;p&gt;¡Nos vemos en Barcelona!&lt;p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/3906364970588649263/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=3906364970588649263" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/3906364970588649263?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/3906364970588649263?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2012/11/nos-vemos-en-la-barcelona-developers.html" title="Nos vemos en la Barcelona Developers Conference" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-EXgaAgk8zoY/UK-DJfgddrI/AAAAAAAAB34/nmYioXdoCPw/s72-c/bdc.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEIFQ3s7eCp7ImA9WhJaFkU.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-2413406003664116243</id><published>2012-10-08T09:54:00.000+01:00</published><updated>2012-10-08T09:55:12.500+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-10-08T09:55:12.500+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="boncho" /><category scheme="http://www.blogger.com/atom/ns#" term="buena vida" /><category scheme="http://www.blogger.com/atom/ns#" term="blogsYgofio" /><title>Nuevo Blogs and Gofio: XXXVIII edición triunfal</title><content type="html">&lt;p&gt;El ínclito compañero &lt;a href="http://twitter.com/jfrechin"&gt;jfrechin&lt;/a&gt; ha convocado la muy necesaria y esperada XXXVIII edición de  los &lt;b&gt;Blogs &amp; Gofio&lt;/b&gt;; básicamente una reunión informal de gente inquieta con ganas de pasarlo bien y conocer personas interesantes. Copio y pego de la convocatoria oficial:&lt;/p&gt;

&lt;blockquote&gt;

    &lt;p&gt;Será el próximo &lt;b&gt;jueves 11 de octubre de 2012&lt;/b&gt;*, a partir de las &lt;b&gt;21:30&lt;/b&gt; horas, en &lt;b&gt;La Casa Abierta&lt;/b&gt; de La Laguna.&lt;/p&gt;

    &lt;p&gt;Si te quieres inscribir, solo es necesario dejar un comentario &lt;a href="http://tunelcarpiano.net/2012/10/blogs-gofio-xxxviii.html"&gt;en esta entrada&lt;/a&gt; diciéndolo y listo.&lt;/p&gt;

    &lt;p&gt;Preguntas y respuestas habituales:&lt;/p&gt;
    &lt;ul&gt;

    &lt;li&gt;&lt;b&gt;¿Quién puede asistir?&lt;/b&gt; -&gt; Cualquiera, tanto si escribes blogs, como si los lees, incluso si no sabes lo que es un blog y quieres pasar un buen rato.&lt;/li&gt;

    &lt;li&gt;&lt;b&gt;¿Qué es un Blog &amp; Gofio?&lt;/b&gt; -&gt; Una reunión de gente relacionada con los blogs (o no) que se reúne de vez en cuando para verse las caras y echarse unas risas.&lt;/li&gt;

    &lt;li&gt;&lt;b&gt;¿Eso es un rollo de frikis?&lt;/b&gt; -&gt; No, la gente que asiste es totalmente normal, o al menos eso cree.&lt;/li&gt;

    &lt;li&gt;&lt;b&gt;Quiero ir, pero me da rollo porque no conozco a nadie&lt;/b&gt; -&gt; No pasa nada, la curva de progreso en la amistad durante los blogs &amp; gofio es, sin exagerar, un millón de veces mayor que en otros ámbitos.&lt;/li&gt;
   
     &lt;/ul&gt;

&lt;p&gt;* Si, lo sabemos, es jueves, pero el viernes es fiesta, está todo estudiado.&lt;/p&gt;

&lt;/blockquote&gt;

&lt;h4&gt;Me encanta el cartel:&lt;/h4&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-OZeY7CzcGHo/UHKUCXtCy9I/AAAAAAAAB3k/ZL_1ANSH1XE/s1600/blogs-and-gofio-38-500x375.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="300" width="400" src="http://4.bp.blogspot.com/-OZeY7CzcGHo/UHKUCXtCy9I/AAAAAAAAB3k/ZL_1ANSH1XE/s400/blogs-and-gofio-38-500x375.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;


</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/2413406003664116243?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/2413406003664116243?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2012/10/nuevo-blogs-and-gofio-xxxviii-edicion.html" title="Nuevo Blogs and Gofio: XXXVIII edición triunfal" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-OZeY7CzcGHo/UHKUCXtCy9I/AAAAAAAAB3k/ZL_1ANSH1XE/s72-c/blogs-and-gofio-38-500x375.jpg" height="72" width="72" /></entry><entry gd:etag="W/&quot;C0UAQHo7fyp7ImA9WhJbF04.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-5901014567212532713</id><published>2012-09-27T08:34:00.000+01:00</published><updated>2012-09-27T08:34:01.407+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-09-27T08:34:01.407+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="anarroseo" /><category scheme="http://www.blogger.com/atom/ns#" term="arquelogía informática" /><title>Keep Calm And Code On</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-vHrooFsmHxQ/UGQAqtXPAUI/AAAAAAAAB3Q/xcPVtwzZiyA/s1600/keep-calm-and-code-on.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-vHrooFsmHxQ/UGQAqtXPAUI/AAAAAAAAB3Q/xcPVtwzZiyA/s400/keep-calm-and-code-on.jpg" width="274" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Visto en el tumblr de &lt;a href="http://h4xg33k.tumblr.com/post/32062380160"&gt;h4xg33k&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/5901014567212532713/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=5901014567212532713" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/5901014567212532713?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/5901014567212532713?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2012/09/keep-calm-and-code-on.html" title="Keep Calm And Code On" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-vHrooFsmHxQ/UGQAqtXPAUI/AAAAAAAAB3Q/xcPVtwzZiyA/s72-c/keep-calm-and-code-on.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEQNQHo_fip7ImA9WhJQGUU.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-2739638151974048418</id><published>2012-08-03T10:33:00.000+01:00</published><updated>2012-08-03T10:33:11.446+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-03T10:33:11.446+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="taller" /><category scheme="http://www.blogger.com/atom/ns#" term="django" /><category scheme="http://www.blogger.com/atom/ns#" term="2012" /><category scheme="http://www.blogger.com/atom/ns#" term="shield" /><category scheme="http://www.blogger.com/atom/ns#" term="Coulson-está-vivo-Furia-mintió" /><category scheme="http://www.blogger.com/atom/ns#" term="TLP" /><title>Presentación del Taller sobre Django</title><content type="html">&lt;p&gt;Acabo de subir a &lt;a href="http://www.slideshare.net/jileon/taller-de-introduccin-al-desarrollo-web-con-django" title="Taller de introducción al desarrollo web con Django"&gt;Slideshare&lt;/a&gt; la presentación que hice para el taller "Introducción al desarrollo web con Django", realizado en la Tenerife Lan Party 2012.&lt;/p&gt;

&lt;p&gt;
&lt;iframe src="http://www.slideshare.net/slideshow/embed_code/13852377" width="512" height="421" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen&gt; &lt;/iframe&gt; &lt;div style="margin-bottom:5px"&gt; &lt;strong&gt; &lt;a href="http://www.slideshare.net/jileon/taller-de-introduccin-al-desarrollo-web-con-django" title="Taller de introducción al desarrollo web con Django" target="_blank"&gt;Taller de introducción al desarrollo web con Django&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href="http://www.slideshare.net/jileon" target="_blank"&gt;Juan Rodríguez&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Esta era la descripción del taller, para que no haya sorpresas:&lt;/p&gt;

&lt;p&gt;"Django es código abierto, modular, escrito en Python, y muy potente. En este taller daremos una introducción a Django, e implementaremos desde cero una aplicación web para gestionar los informes secretos de SHIELD. Con registro de usuarios, acceso a base de datos, páginas dinámicas y servicios web."&lt;/p&gt;

&lt;p&gt;Creo que a la gente que asistió le gustó el taller, y baso mi suposición en que no me tiraron ni un solo tomate&lt;sup&gt;*&lt;/sup&gt;. Q.E.D.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;*&lt;/sup&gt;Aunque tampoco podemos descartar el hecho de que el precio de los tomates se ha disparado últimamente.&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/2739638151974048418/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=2739638151974048418" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/2739638151974048418?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/2739638151974048418?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2012/08/presentacion-del-taller-sobre-django.html" title="Presentación del Taller sobre Django" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DEMMQHk4fSp7ImA9WhJQGUU.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-203907498438831811</id><published>2012-07-18T10:56:00.001+01:00</published><updated>2012-08-03T10:34:41.735+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-03T10:34:41.735+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="taller" /><category scheme="http://www.blogger.com/atom/ns#" term="django" /><category scheme="http://www.blogger.com/atom/ns#" term="shield" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="TLP" /><category scheme="http://www.blogger.com/atom/ns#" term="marvel" /><title>Taller de Introducción a Django en la TLP</title><content type="html">Actualización: &lt;a href="/2012/08/presentacion-del-taller-sobre-django.html"&gt;La presentación que use para este taller&lt;/a&gt;.

Este viernes, 20 de julio, daré un taller de &lt;a href="http://www.tenerife-lanparty.com/2k12/tlpinnova/cursos-y-talleres/32-tlp/tlp-innova/cursos-y-talleres/637-conferencia-django"&gt;Introducción a Django&lt;/a&gt; en la &lt;a href="http://www.tenerife-lanparty.com/2k12/"&gt;Tenerife Lan Party&lt;/a&gt;, dentro de la seccion TLP Innova. En el taller se intentará implementar una aplicación web en menos de cuatro horas, a la vez que damos un repaso por encima de las posibilidades de Django. Django es un mundo, así que no saldremos convertidos en expertos, pero si, espero, con una idea de las posibilidades de este &lt;i&gt;framework&lt;/i&gt;.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-CIYNN5LBP3Q/UAaMMucMwxI/AAAAAAAAB2o/vdiqhhtb4xo/s1600/nick_fury_by_jprart-d3g5y5p.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-CIYNN5LBP3Q/UAaMMucMwxI/AAAAAAAAB2o/vdiqhhtb4xo/s200/nick_fury_by_jprart-d3g5y5p.jpg" width="132" /&gt;&lt;/a&gt;&lt;/div&gt;
Siguiendo el espítitu friki que rodea tanto al evento como a este humilde blog, la estructura del taller será la siguiente: &lt;b&gt;Eres un agente recién incorporado a &lt;a href="http://es.wikipedia.org/wiki/S.H.I.E.L.D."&gt;S.H.I.E.L.D.&lt;/a&gt;, la agencia de inteligencia y antiterrorismo del Universo Marvel. El mismisimo &lt;a href="http://es.wikipedia.org/wiki/Nick_Fury"&gt;Nick Furia&lt;/a&gt;, mirándote fijamente con su ojo derecho (tampoco es que pueda elegir) te ha encargado que desarrolles una aplicación para realizar el seguimiento de las actividades de los llamados "superheroes" (amenazas enmascaradas, según el editor del Daily Bugle). Las respuestas que Nick Furia espera obtener de tu aplicación son, entre otras&lt;/b&gt;:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;¿Qué poderes tiene un determinado superheroe?&lt;/li&gt;
&lt;li&gt;¿Podemos clasificar a los superheroes en distintos niveles de potencia?&lt;/li&gt;
&lt;li&gt;Dado un poder determinado, ¿Qué superheroes lo tienen? ¿Cuáles no? ¿Qué superheroes pueden volar?&lt;/li&gt;
&lt;li&gt;¿Qué superheroes forman parte de un determinado grupo, por ejemplo, los Cuatro Fantásticos?&lt;/li&gt;
&lt;li&gt;¿Dónde fue la última vez que se ha visto a La Masa (Hulk)?&lt;/li&gt;
&lt;li&gt;¿Dónde suele verse con más frecuencia a Spiderman? ¿Podemos mostrar estos avistamientos en un mapa de googleMaps?&lt;/li&gt;
&lt;li&gt;Y sobre todo, lo más importante: ¿Quién puede más, La Cosa o La Masa?&lt;/li&gt;
&lt;/ul&gt;
Si después de este planteamiento, no te atrae el curso, lo entenderé. Además, a la misma hora &lt;a href="http://twitter.com/ydarias"&gt;Yeray Darias&lt;/a&gt;, de &lt;a href="http://developerscookbook.blogspot.com.es/"&gt;A software developer cookbook&lt;/a&gt;, dará un taller sobre &lt;a href="http://www.tenerife-lanparty.com/2k12/tlpinnova/cursos-y-talleres/32-tlp/tlp-innova/cursos-y-talleres/641-conferencia-coffeescript"&gt;CoffeScript: Javascript bien hecho&lt;/a&gt; con muy buena pinta, al que yo mismo iría si pudiera, pero queda muy feo escaquearse del propio curso. Eso si, si te apuntas, prepárate para tu primer día en S.H.I.E.L.D. ¿Coulson, dices que te llamas?&lt;br /&gt;
PD: No olviden que el sábado tenemos otra cita con las &lt;a href="http://www.descon2.com/"&gt;DesCon2&lt;/a&gt;.</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/203907498438831811/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=203907498438831811" title="3 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/203907498438831811?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/203907498438831811?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2012/07/taller-de-introduccion-django-en-la-tlp.html" title="Taller de Introducción a Django en la TLP" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-CIYNN5LBP3Q/UAaMMucMwxI/AAAAAAAAB2o/vdiqhhtb4xo/s72-c/nick_fury_by_jprart-d3g5y5p.jpg" height="72" width="72" /><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;A0QMRH4yeCp7ImA9WhJTGUs.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-486505027020495620</id><published>2012-06-29T12:29:00.000+01:00</published><updated>2012-06-29T12:29:45.090+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-29T12:29:45.090+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Appy/POD" /><category scheme="http://www.blogger.com/atom/ns#" term="transparencias" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>Uso de python y Appy/POD para generar documentos automáticamente</title><content type="html">&lt;p&gt;Una presentación que hice para el trabajo sobre el &lt;i&gt;framework&lt;/i&gt; &lt;a href="http://appyframework.org/pod.html"&gt;&lt;b&gt;Appy/POD&lt;/b&gt;&lt;/a&gt;, que nos permite generar documentos LibreOffice/openOffice desde &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt;, usando documentos como plantillas.&lt;p&gt;

&lt;p class="style="text-align: center"&gt;
&lt;div style="width:595px" id="__ss_13492994"&gt; &lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/jileon/presentacion-appypod" title="Presentación appy/pod" target="_blank"&gt;Presentación appy/pod&lt;/a&gt;&lt;/strong&gt; &lt;iframe src="http://www.slideshare.net/slideshow/embed_code/13492994" width="595" height="497" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0" allowfullscreen&gt;&lt;/iframe&gt; &lt;div style="padding:5px 0 12px"&gt; View more &lt;a href="http://www.slideshare.net/" target="_blank"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/jileon" target="_blank"&gt;Juan Rodríguez&lt;/a&gt; &lt;/div&gt; &lt;/div&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.slideshare.net/jileon/presentacion-appypod"&gt;La presentación en slideshare&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bitbucket.org/euribates/presentacion-appy/"&gt;Un repositorio público con los ejemplos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Quiza útil. Pero para nada divertido. &lt;i&gt;All work and no play makes the Masked Platypus a dullboy&lt;/i&gt;.&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/486505027020495620/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=486505027020495620" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/486505027020495620?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/486505027020495620?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2012/06/uso-de-python-y-appypod-para-generar.html" title="Uso de python y Appy/POD para generar documentos automáticamente" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUEAQXY8fyp7ImA9WhVaFUU.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-3987392008701915574</id><published>2012-06-13T12:40:00.001+01:00</published><updated>2012-06-13T12:40:40.877+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-13T12:40:40.877+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fotografía" /><title>Aprender fotografía con un simulador</title><content type="html">&lt;p&gt;Hacia tiempo que no veía una de esas ideas a la vez sencillas (de imaginar, que no de implementar, claro) y poderosas; aprender los conceptos básicos de fotografía, como sensibilidad ISO, tiempo de obturación, profundidad de campo, apertura de diafragma, etc... con un simulador que te permite hacer mil y una perrerías en los ajustes, disparar a un sujeto en movimiento y ver que pasa:&lt;/p&gt;

&lt;p style="text-align:center;"&gt;
&lt;a href="http://camerasim.com/camera-simulator/"&gt;http://camerasim.com/camera-simulator/&lt;/a&gt;
&lt;/p&gt;

&lt;p style="text-align:center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-bu3LvsdT-l4/T9h7gr3kpzI/AAAAAAAAB2Y/v6gaoILDNc8/s1600/camerasim.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="392" width="400" src="http://1.bp.blogspot.com/-bu3LvsdT-l4/T9h7gr3kpzI/AAAAAAAAB2Y/v6gaoILDNc8/s400/camerasim.png" /&gt;&lt;/a&gt;
&lt;p style="text-align:center;"&gt;


&lt;p&gt;Mi hija se aburrió soberanamente en un curso de fotografía al que fue hace poco, y en el que no daban casi ninguno de estos conceptos. Quizá con esta herramienta se interese algo más.&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/3987392008701915574/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=3987392008701915574" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/3987392008701915574?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/3987392008701915574?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2012/06/aprender-fotografia-con-un-simulador.html" title="Aprender fotografía con un simulador" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-bu3LvsdT-l4/T9h7gr3kpzI/AAAAAAAAB2Y/v6gaoILDNc8/s72-c/camerasim.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUYFRHg9cCp7ImA9WhVbGEU.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-2822803699352442778</id><published>2012-06-05T08:48:00.000+01:00</published><updated>2012-06-05T08:58:35.668+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-05T08:58:35.668+01:00</app:edited><title>Un boceto hecho en el taller "Dibujando Criaturas Fantásticas"</title><content type="html">&lt;p&gt;Un boceto hecho en el taller "Dibujando Criaturas Fantásticas", organizado por la buena gente del &lt;a href="http://www.ilustradorescanarios.com/"&gt;Colectivo de Ilustradores Canarias&lt;/a&gt;. Se suponía
que tenía que hacer un monstruo horripilante, pero al final me salió este con cara de buena persona. O sapo. O lo que sea.
Me lo pasé pipa en el taller.&lt;/p&gt;

&lt;div style="border:1px solid #666; margin:0; padding:2px; width: 504px;"&gt;
&lt;a href="http://jileon.deviantart.com/art/Boceto-del-taller-de-Creacion-de-Monstruos-306294589" imageanchor="1"&gt;&lt;img border="0" height="707" width="500" src="http://3.bp.blogspot.com/-p0G6JVHDLuA/T823y1D8jgI/AAAAAAAAB2I/DkagBTSC_tQ/s400/boceto-monstruos.png" /&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Su título es &lt;b&gt;Simpática alienigena retratada mientras repara su nave en los alrededores de Magerath-VI&lt;/b&gt;.&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/2822803699352442778/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=2822803699352442778" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/2822803699352442778?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/2822803699352442778?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2012/06/un-boceto-hecho-en-el-taller-dibujando.html" title="Un boceto hecho en el taller &quot;Dibujando Criaturas Fantásticas&quot;" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-p0G6JVHDLuA/T823y1D8jgI/AAAAAAAAB2I/DkagBTSC_tQ/s72-c/boceto-monstruos.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CU8ASXo7eSp7ImA9WhVVEU4.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-3402396194353260427</id><published>2012-05-04T13:17:00.000+01:00</published><updated>2012-05-04T13:17:28.401+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-04T13:17:28.401+01:00</app:edited><title>Nuevo y triunfal Blog &amp; Gofio, el XXXVIII, en Adeje</title><content type="html">&lt;p&gt;Nada menos que &lt;a href="http://aldea-irreductible.blogspot.com.es/"&gt;El Irreductible&lt;/a&gt; se ha decidido a convocar la que, según todos los indicios, será la XXXVIII edición de los Blogs&amp;amp;Gofio, encuentro cultural, social y visceral -pero no virtual- de la gofioesfera. Las tres preguntas importantes son:&lt;/p&gt;

&lt;dl&gt;

 &lt;dt style="font-size:200%;"&gt;¿Dónde?&lt;/dt&gt;
  &lt;dd style="padding-top:10px; padding-bottom: 15px; font-size:110%;"&gt;En &lt;b&gt;Adeje&lt;/b&gt;. Si señor, coincidiendo con el encuentro tecnológico &lt;a href="http://adejetec.com/"&gt;Adejetec 2012&lt;/a&gt;, así
aprovechas el viaje si vienes del gélido norte.&lt;/dd&gt;

 &lt;dt style="font-size:200%;"&gt;¿Cuándo?&lt;/dt&gt;
  &lt;dd style="padding-top:10px; padding-bottom: 15px; font-size:110%;"&gt;El &lt;b&gt;17 de mayo de 2012&lt;/b&gt;, al medio día y después de las charlas.&lt;/dd&gt;

 &lt;dt style="font-size:200%;"&gt;¿Por qué?&lt;/dt&gt; 
  &lt;dd style="padding-top:10px; padding-bottom: 15px; font-size:110%;"&gt;porque &lt;b&gt;sí&lt;/b&gt;.&lt;/dd&gt;

&lt;/dl&gt;

&lt;p&gt;Más detalles en el post de la convocatoria: &lt;a href="http://aldea-irreductible.blogspot.com.es/2012/05/blog-and-gofio-edicion-xxxvii.html"&gt;La Aldea Irreductible - Blog and Gofio - Edición XXXVII&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Aquí el poster que dibujó algún desustanciado:&lt;/p&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://jileon.deviantart.com/art/BlogsAndGofio-Adeje-XXXVII-Triunfal-Red-BlueGod-299958176" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="400" width="283" src="http://1.bp.blogspot.com/-9exXcSsutBY/T6PG3XRGYzI/AAAAAAAAB1A/CxxGxCAzIOs/s400/portada.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;PD: Hay una Versión No Oficial del cartel, si alguien quiera verla que me la pida por email. O por twitter. O yo que sé.&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/3402396194353260427/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=3402396194353260427" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/3402396194353260427?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/3402396194353260427?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2012/05/nuevo-y-triunfal-blog-gofio-el-xxxviii.html" title="Nuevo y triunfal Blog &amp; Gofio, el XXXVIII, en Adeje" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-9exXcSsutBY/T6PG3XRGYzI/AAAAAAAAB1A/CxxGxCAzIOs/s72-c/portada.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkUHQX8yeip7ImA9WhVTFUQ.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-3966946896978031371</id><published>2012-03-01T10:34:00.002Z</published><updated>2012-03-01T10:37:10.192Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-01T10:37:10.192Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agarrate los machos" /><category scheme="http://www.blogger.com/atom/ns#" term="cada vez más cabreado" /><category scheme="http://www.blogger.com/atom/ns#" term="censura" /><category scheme="http://www.blogger.com/atom/ns#" term="absurdo" /><category scheme="http://www.blogger.com/atom/ns#" term="watchmen" /><category scheme="http://www.blogger.com/atom/ns#" term="burocracia" /><category scheme="http://www.blogger.com/atom/ns#" term="vendemotos" /><category scheme="http://www.blogger.com/atom/ns#" term="libertades" /><category scheme="http://www.blogger.com/atom/ns#" term="Internet" /><category scheme="http://www.blogger.com/atom/ns#" term="división de poderes" /><title>Hoy empieza a aplicarse la ley Sinde ...</title><content type="html">&lt;p&gt;... Y tenemos otro día más de vergüenza ajena. Acabamos de ponernos a la altura de China
en lo que respecta a libertad de expresión y censura gubernamental &lt;sup&gt;&lt;a href="#nota"&gt;1&lt;/a&gt;&lt;/sup&gt;. Que ganas tienen de que no se hubiera inventado Internet.&lt;/p&gt;

&lt;p&gt;Y como es una &lt;b&gt;obligación moral&lt;/b&gt; oponerse a una ley injusta, aquí va mi enlace a
&lt;a href="http://www.wertdeenlaces.net/"&gt;wertdeenlaces.net&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.wertdeenlaces.net" title="wertdeenlaces.net"&gt;&lt;img src="http://wertdeenlaces.net/labios.png" style="vertical-align:middle;border:0;" alt="labioswert" /&gt;&lt;/a&gt; &lt;a href="http://www.wertdeenlaces.net/enlace.php" style="text-decoration:none;color:#383838;font:10px Consolas,Courrier,monospace;"&gt;Bájame&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ya está, ya pueden demandarme. La única duda que tengo es si deberían juzgarnos a los disidentes en tribunal
español o norteamericano, ya que en última instancia estamos desobedeciendo a aquellos.&lt;/p&gt;

&lt;p&gt;&lt;a name="nota"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt;Quizá no de forma efectiva, pero si conceptual. El tiempo lo dirá. Lo más probable es que se convierte en otra más de las &lt;b&gt;leyes embudo&lt;/b&gt; típicas de Españistan: Se aplicará con extrema dureza y ejemplar dedicación a los enemigos, se hará la vista gorda y tolerante a los amiguitos, y al resto que le vayan dando.&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/3966946896978031371/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=3966946896978031371" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/3966946896978031371?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/3966946896978031371?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2012/03/hoy-empieza-aplicarse-la-ley-sinde.html" title="Hoy empieza a aplicarse la ley Sinde ..." /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0UEQnwyeyp7ImA9WhRaFEs.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-5473726336545576150</id><published>2012-02-17T09:00:00.000Z</published><updated>2012-02-17T09:00:03.293Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-17T09:00:03.293Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="xml-zombie" /><category scheme="http://www.blogger.com/atom/ns#" term="fabric" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="toolbox" /><title>Fabric - Simplifica la gestión de tus servidores</title><content type="html">&lt;p&gt;&lt;a class="reference external" href="http://fabfile.org/"&gt;Fabric&lt;/a&gt; es un módulo y conjunto de utilidades que nos simplifica enormemente el
realizar muchas tareas, normalmente repetitivas y tediosos, un una o varias
máquinas simultáneamente. Es una especie de &lt;em&gt;make con esteroides&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Fabric tiene varias características interesantes, entra las que destacan que
es &lt;strong&gt;software libre&lt;/strong&gt;, y que resulta &lt;strong&gt;sencillo de utilizar&lt;/strong&gt; y de instalar. Pero
tiene el interés añadido de que está escrito en &lt;a class="reference external" href="http://www.python.org/"&gt;Python&lt;/a&gt;, por lo cual es
relativamente fácil añadir nuevas funcionalidades. Además, los ficheros
&lt;tt class="docutils literal"&gt;fabfile&lt;/tt&gt;, que vendrían a ser los equivalente a los &lt;tt class="docutils literal"&gt;Makefile&lt;/tt&gt; para make o
a los ficheros de configuración &lt;tt class="docutils literal"&gt;build.xml&lt;/tt&gt; de Apache Ant, son en si
programas Python. Por cierto, soy de los que piensan que los ficheros de
configuración necesitan del XML tanto como un pez necesita una bicicleta. Si
eres un &lt;em&gt;xml-zombie&lt;/em&gt; puedes ir a la parte de comentarios e insultar allí
directamente. De nada.&lt;/p&gt;
&lt;p&gt;Veamos un ejemplo: supongamos que tenemos una máquina de desarrollo, 'alfa',
otra de pruebas, 'beta', y una tercera de explotación, 'omega'. Queremos, desde
la máquina de desarrollo, subir una actualización de código al repositorio,
previo control de nuestra batería de pruebas. Si todo es correcto, deseariamos
actualizar los servidores. Podemos crear un fichero &lt;cite&gt;fabfile.py&lt;/cite&gt; con el
siguiente contenido:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
from fabric.api import run, cd, local

def deploy_up():
    code_dir = '/home/euribates/workarea/proyecto'
    with cd(code_dir):
        local('nosetests')
        local('hg commit')
        local('hg push')

def deploy_down():
    code_dir = '/var/www/django/proyecto'
    with cd(code_dir):
        run('hg pull')
        run('hg update')
        run('service apache2 restart')
&lt;/pre&gt;
&lt;p&gt;El uso de las utilidades de Fabric como &lt;cite&gt;cd&lt;/cite&gt; o &lt;cite&gt;run&lt;/cite&gt; hacen que el fichero sea
fácil de escribir y, lo que es más importante, fácil de leer. Estoy usando
&lt;a class="reference external" href="http://somethingaboutorange.com/mrl/projects/nose/"&gt;Nose&lt;/a&gt; para las pruebas unitarias y &lt;a class="reference external" href="http://mercurial.selenic.com/"&gt;Mercurial&lt;/a&gt; como sistema de control de
versiones, pero esto son mis opciones personales, fácilmente sustituibles por
otras. Con este fichero, ahora puedo hacer:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
fab deploy_up
&lt;/pre&gt;
&lt;p&gt;Y fabric hará el trabajo sucio por mi. Fabric aborta el proceso si alguno de
las programas devuelve un código de error, así que si no se pasan todos los
tests, no se ejecutarán ni el &lt;tt class="docutils literal"&gt;commit&lt;/tt&gt; ni el &lt;tt class="docutils literal"&gt;push&lt;/tt&gt;, algo bastante
de agradecer.&lt;/p&gt;
&lt;p&gt;Si todo ha ido bien, puedo hacer:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
fab deploy_down -D beta
&lt;/pre&gt;
&lt;p&gt;Para que actualice el código en 'Beta' y reinicie el servidor Apache2. Si eres
persona animosa y de corazón valiente, también puedes actualizar en las dos
máquinas a la vez, con:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
fab deploy_down -D beta,omega
&lt;/pre&gt;
&lt;p&gt;Nota: &lt;tt class="docutils literal"&gt;local&lt;/tt&gt; y &lt;tt class="docutils literal"&gt;run&lt;/tt&gt; son equivalentes, ambas ejecutan el comando que se
les indica, pero &lt;tt class="docutils literal"&gt;local&lt;/tt&gt; siempre lo hace en la máquina local, mientras que
&lt;tt class="docutils literal"&gt;run&lt;/tt&gt; lo hará en las maquinas que le indiquemos, usando ssh. Por eso podemos
hacer &lt;tt class="docutils literal"&gt;deploy_up&lt;/tt&gt; sin indicar nada, pero si intentamos hacer un
&lt;tt class="docutils literal"&gt;deploy_down&lt;/tt&gt; sin especificar al menos una máquina, fabric protestará.&lt;/p&gt;

&lt;p&gt;Hay muchas cosas más que se pueden hacer con esta herramienta, y podemos 
aprenderlas en el &lt;a class="reference external" href="http://docs.fabfile.org/"&gt;Tutorial
de Fabric&lt;/a&gt;.&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/5473726336545576150/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=5473726336545576150" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/5473726336545576150?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/5473726336545576150?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2012/02/fabric-simplifica-la-gestion-de-tus.html" title="Fabric - Simplifica la gestión de tus servidores" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUAFQH0zfSp7ImA9WhRVFEU.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-1756511633393209025</id><published>2012-01-13T20:48:00.002Z</published><updated>2012-01-13T20:48:31.385Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-13T20:48:31.385Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="universidad" /><category scheme="http://www.blogger.com/atom/ns#" term="ull" /><title>Curso de Python en la ULL (Posible)</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-95I9GXVtQsQ/TxCYLRcH-tI/AAAAAAAAByU/cIZ1bHRPdjs/s1600/python_powered.png" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="182" width="140" src="http://3.bp.blogspot.com/-95I9GXVtQsQ/TxCYLRcH-tI/AAAAAAAAByU/cIZ1bHRPdjs/s320/python_powered.png" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;La &lt;a href="http://www.ull.es/"&gt;Universidad de La Laguna&lt;/a&gt; está pensado organizar unos cursos intensivos de &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt;, dirigidos a "aquellos interesados en introducirse o conocer el lenguaje Python y sus posibilidades para su uso particular o para introducirlo en sus clase con los alumnos".&lt;/p&gt;

&lt;p&gt;El curso sería, en principio, los días &lt;b&gt;23, 24 y 25 de enero&lt;/b&gt;, durante tres horas (&lt;b&gt;09:00&lt;/b&gt; a &lt;b&gt;12:30&lt;/b&gt; con descanso en medio) en el &lt;b&gt;aula 19 de la Facultad de Física&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;El temario propuesto, orientado claramente a un perfil científico, sería el siguiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Introducción a Python: Variables estructuradas. Control de flujo. Calculo simbólico.&lt;/li&gt;
&lt;li&gt;Cálculo numérico con &lt;tt&gt;numpy&lt;/tt&gt; (paquete numérico). Dibujos y graficos con &lt;tt&gt;matplotlib&lt;/tt&gt; (paquete gráfico). Ajustes de funciones.&lt;/li&gt;
&lt;li&gt;Otros paquetes de cálculo científico (&lt;tt&gt;scipy&lt;/tt&gt; y otros que puedan interesar).&lt;/li&gt;
&lt;li&gt;Utilización de programas (en Fortran o C o ...) dentro de Python.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para más información, consultar con la &lt;a href="http://osl.ull.es/content/python-en-la-facultad-de-f%C3%ADsica"&gt;Oficina de Software Libre - Curso de Python&lt;/a&gt;.&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/1756511633393209025/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=1756511633393209025" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/1756511633393209025?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/1756511633393209025?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2012/01/curso-de-python-en-la-ull-posible.html" title="Curso de Python en la ULL (Posible)" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-95I9GXVtQsQ/TxCYLRcH-tI/AAAAAAAAByU/cIZ1bHRPdjs/s72-c/python_powered.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEcDQHs8eSp7ImA9WhRXF0k.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-700154260616393534</id><published>2011-12-24T15:54:00.001Z</published><updated>2011-12-24T15:54:31.571Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-24T15:54:31.571Z</app:edited><title>Avances en detección de mentiras</title><content type="html">&lt;p&gt;Muy interesante, instructiva y provechosa la charla TED de Pamela Meyer: ¿&lt;b&gt;Cómo descubrir a un mentiroso&lt;/b&gt;?&lt;/p&gt;

&lt;object width="526" height="374"&gt;
&lt;param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt;&lt;/param&gt;
&lt;param name="allowFullScreen" value="true" /&gt;
&lt;param name="allowScriptAccess" value="always"/&gt;
&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;
&lt;param name="bgColor" value="#ffffff"&gt;&lt;/param&gt;
&lt;param name="flashvars" value="vu=http://video.ted.com/talk/stream/2011G/Blank/PamelaMeyer_2011G-320k.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/PamelaMeyer_2011G-embed.jpg&amp;vw=512&amp;vh=288&amp;ap=0&amp;ti=1246&amp;lang=es&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=pamela_meyer_how_to_spot_a_liar;year=2011;theme=how_the_mind_works;theme=hidden_gems;event=TEDGlobal+2011;tag=Culture;tag=Science;tag=psychology;tag=society;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /&gt;
&lt;embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="526" height="374" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talk/stream/2011G/Blank/PamelaMeyer_2011G-320k.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/PamelaMeyer_2011G-embed.jpg&amp;vw=512&amp;vh=288&amp;ap=0&amp;ti=1246&amp;lang=es&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=pamela_meyer_how_to_spot_a_liar;year=2011;theme=how_the_mind_works;theme=hidden_gems;event=TEDGlobal+2011;tag=Culture;tag=Science;tag=psychology;tag=society;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;"&gt;&lt;/embed&gt;
&lt;/object&gt;

&lt;iframe src="http://rcm.amazon.com/e/cm?t=elornitenmas-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=0312611730&amp;ref=tf_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;

&lt;p&gt;Tiene un libro en que explica el tema con más detalle: &lt;a href="http://www.amazon.com/Liespotting-Proven-Techniques-Detect-Deception/dp/0312611730/ref=ntt_at_ep_dpt_1"&gt;&lt;i&gt;Liespotting: Proven Techniques to Detect Deception&lt;/i&gt;&lt;/a&gt;. Ya  lo tengo en la lista para próximas compras. Hubiera caído ya, si no fuera por esa manía que les ha dado ahora a algunas editoriales de poner el &lt;i&gt;ebook&lt;/i&gt; &lt;b&gt;más caro&lt;/b&gt; que la versión impresa. Por ahí no paso.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Nota de advertencia&lt;/b&gt;: No sirve para analizar la política en Españistán. Ahí mienten todos y no tiene gracia.&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/700154260616393534/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=700154260616393534" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/700154260616393534?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/700154260616393534?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2011/12/avances-en-deteccion-de-mentiras.html" title="Avances en detección de mentiras" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;A0cHSXszfSp7ImA9WhRTGE8.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-1888015880007851449</id><published>2011-11-09T08:56:00.001Z</published><updated>2011-11-09T08:57:18.585Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-09T08:57:18.585Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cine" /><category scheme="http://www.blogger.com/atom/ns#" term="política" /><category scheme="http://www.blogger.com/atom/ns#" term="LNDLMV" /><category scheme="http://www.blogger.com/atom/ns#" term="emds" /><title>Teaser trailer de "La Noche de los Muertos Votantes"</title><content type="html">&lt;p&gt;El &lt;i&gt;teaser Trailer&lt;/i&gt; de "La Noche de os Muertos Votantes":&lt;/p&gt;

&lt;iframe width="420" height="315" src="http://www.youtube.com/embed/94ip-Y5pKRc" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;Con su cartel a juego:&lt;/p&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-eqJqcyWAa8w/Tro_lLBA1vI/AAAAAAAABxU/1bdlP3tjsww/s1600/la_noche_de_los_muertos_votantes_by_jileon-A5.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="400" width="283" src="http://1.bp.blogspot.com/-eqJqcyWAa8w/Tro_lLBA1vI/AAAAAAAABxU/1bdlP3tjsww/s400/la_noche_de_los_muertos_votantes_by_jileon-A5.png" /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/1888015880007851449/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=1888015880007851449" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/1888015880007851449?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/1888015880007851449?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2011/11/teaser-trailer-de-la-noche-de-los.html" title="Teaser trailer de &quot;La Noche de los Muertos Votantes&quot;" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/94ip-Y5pKRc/default.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C08NQ307fSp7ImA9WhdUGEw.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-3262376528225516315</id><published>2011-10-05T11:51:00.001+01:00</published><updated>2011-10-05T11:51:32.305+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-05T11:51:32.305+01:00</app:edited><title>XXXIV Blogs and Gofio</title><content type="html">&lt;p&gt;&lt;a href="http://www.canarias7.es/blogs/atarecos/"&gt;Esther, de Atarecos&lt;/a&gt;. Dicho así, suena a nombre de filósofo griego: Zeón de Elea, Tales de Mileto, Esther de Atarecos. Mola. Pero a lo que vamos, que me desvío, Esther, de Atarecos, convoca la &lt;a href="http://www.canarias7.es/blogs/atarecos/2011/10/xxxiv_blogsgofi.html"&gt;&lt;big&gt;XXXIV convocatoria de Blogs &amp; Gofio&lt;/big&gt;&lt;/a&gt;, esta vez en Gran Canaria. Las grandes preguntas que, cual filósofos griegos, debemos responder, son las siguientes:&lt;/p&gt;

&lt;h2&gt;¿Dónde?&lt;/h2&gt;

&lt;p&gt;En Gran Canaria, en el &lt;a href="http://maps.google.com/maps/place?cid=14002468543981010238"&gt;Restaurante La Barbería (c/ Mendizábal, 14)&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;¿Cuándo?&lt;/h2&gt;
 
&lt;p&gt;El &lt;b&gt;viernes 14 de octubre&lt;/b&gt;, a las &lt;b&gt;20:30&lt;/b&gt; horas&lt;/p&gt;

&lt;h2&gt;¿Quién?&lt;/h2&gt;

&lt;p&gt;En general, cualquiera que desee asistir. En particular, &lt;b&gt;tú&lt;/b&gt;, que estás leyendo esto. No lo niegues, &lt;b&gt;sé&lt;/b&gt; que lo estás leyendo justo ahora. No me preguntes cómo lo sé, es uno de mis superpoderes. Si piensas ir, &lt;b&gt;no te olvides de dejar un comentario en &lt;a href="http://www.canarias7.es/blogs/atarecos/2011/10/xxxiv_blogsgofi.html"&gt;el post convocante&lt;/a&gt;&lt;/b&gt;, más que nada para el tema de reservar en el restaurante.&lt;/p&gt;

&lt;p&gt;El cartel oficial del Blogs &amp; Gofio XXXIV, obra del gran &lt;a href="http://www.jmorgan.es/"&gt;Morgan&lt;/a&gt;: 

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-k9nR9FY0VVM/Towusuxx8tI/AAAAAAAABvs/XCx39LVzEhc/s1600/34blogsandgofio_pq.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="400" width="400" src="http://2.bp.blogspot.com/-k9nR9FY0VVM/Towusuxx8tI/AAAAAAAABvs/XCx39LVzEhc/s400/34blogsandgofio_pq.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;

</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/3262376528225516315/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=3262376528225516315" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/3262376528225516315?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/3262376528225516315?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2011/10/xxxiv-blogs-and-gofio.html" title="XXXIV Blogs and Gofio" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-k9nR9FY0VVM/Towusuxx8tI/AAAAAAAABvs/XCx39LVzEhc/s72-c/34blogsandgofio_pq.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0EEQH84fCp7ImA9WhdUEko.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-2306942154738111027</id><published>2011-09-29T08:00:00.000+01:00</published><updated>2011-09-29T08:00:01.134+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-29T08:00:01.134+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="chuleta" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="StackOverflow" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>Python unittest: Eliminar información redundante en los informes</title><content type="html">&lt;p&gt;En la actualizacion a Python 2.7, el módulo &lt;a href="http://docs.python.org/library/unittest.html"&gt;unittest&lt;/a&gt; ha modificado la forma que tiene de presentar los resultados. Antes te mostraba una única línea de texto por &lt;i&gt;test&lt;/i&gt;, con la primera línea de las descripción del test, si lo hubiera, o el nombre de la clase y función del test, si no lo hubiera. Por ejemplo, el siguiente código:

&lt;pre&gt;&lt;code&gt;
import unittest

class A(unittest.TestCase):

    def test_A(self):
        pass

    def test_B(self):
        '''este es el test B.
        '''
        pass
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nos daba este limpio resultado:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
test_A (__main__.A) ... ok
este es el test B. ... ok
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pero en la 2.7 han cambiado este comportamiento, y ahora imprime el nombre de la clase y el método del test siempre, y si hay una descripción, la incluye como segunda línea. Es decir, produce este resultado:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
test_A (__main__.A) ... ok
test_B (__main__.A)
este es el test B. ... ok
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;Si preferimos la manera antigua, la forma más sencilla de conseguirlo, por ahora, es incluir el siguiente código al principio de tus test (visto en &lt;a href="http://stackoverflow.com/questions/5274942/how-to-change-the-test-description-of-python-2-7-untitest/5277716#5277716"&gt;esta respuesta a una pregunta en Stack Overflow: how to change the test description of python (2.7) untitest&lt;/a&gt;).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
from unittest.runner import TextTestResult
TextTestResult.getDescription = lambda _, test: str(test.shortDescription())
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Un &lt;i&gt;hack&lt;/i&gt; un poco feo. pero funciona. Es una tontería, pero me tenía de los nervios. Suelo (o intento) documentar casi todos mis &lt;i&gt;tests&lt;/i&gt;, con lo que, para mi, el añadido era  solo ruido.&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/2306942154738111027/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=2306942154738111027" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/2306942154738111027?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/2306942154738111027?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2011/09/python-unittest-eliminar-informacion.html" title="Python unittest: Eliminar información redundante en los informes" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUIFQHkycCp7ImA9WhdUEU8.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-2546399891219390006</id><published>2011-09-27T13:45:00.000+01:00</published><updated>2011-09-27T13:45:11.798+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-27T13:45:11.798+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="chuleta" /><category scheme="http://www.blogger.com/atom/ns#" term="trucos" /><category scheme="http://www.blogger.com/atom/ns#" term="coñazo" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title>Eliminar las nuevas barras de desplazamiento de Ubuntu/Unity</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-nEoWImRK37Q/ToHFBmE2IVI/AAAAAAAABvc/WvzCWS2pUI0/s1600/unity-sucks.png" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="213" width="225" src="http://4.bp.blogspot.com/-nEoWImRK37Q/ToHFBmE2IVI/AAAAAAAABvc/WvzCWS2pUI0/s400/unity-sucks.png" /&gt;&lt;/a&gt;&lt;/div&gt;


&lt;p&gt;Al principio me parecieron buena idea, pero después de estar usándolas durante semanas, las &lt;a href="http://design.canonical.com/2011/03/introducing-overlay-scrollbars-in-unity/"&gt;nuevas barras de desplazamiento de Ubuntu&lt;/a&gt; me han acabado pareciendo un &lt;b&gt;tremendo coñaz*&lt;/b&gt;. Ahorrarme 10 &lt;i&gt;pixels&lt;/i&gt; en pantalla no se merece tener que estar buscando arriba y abajo cada vez que tengo que hacer un &lt;i&gt;scroll&lt;/i&gt;. Además, me daban problemas con un nuevo editor que estoy probando, &lt;a href="http://editra.org/"&gt;Editra&lt;/a&gt;, por ahora con muy buena pinta. Para eliminarlas de Ubuntu 11.04 (mientras nos dejen) la receta es:&lt;/p&gt;

&lt;blockquote&gt;
sudo apt-get remove overlay-scrollbar liboverlay-scrollbar-0.1-0
&lt;/blockquote&gt;

&lt;p&gt;Nota para los diseñadores de Ubuntu: Solo porque puedas hacer algo, no significa que tengas que hacerlo.&lt;/p&gt;

&lt;p&gt;Visto en: &lt;a href="http://www.webupd8.org/2011/04/how-to-disable-overlay-scrollbars-in.html"&gt;WEB UDP8 - How To Disable The Overlay Scrollbars In Ubuntu 11.04 [Quick Tip]&lt;/a&gt;.</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/2546399891219390006/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=2546399891219390006" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/2546399891219390006?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/2546399891219390006?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2011/09/eliminar-las-nuevas-barras-de.html" title="Eliminar las nuevas barras de desplazamiento de Ubuntu/Unity" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-nEoWImRK37Q/ToHFBmE2IVI/AAAAAAAABvc/WvzCWS2pUI0/s72-c/unity-sucks.png" height="72" width="72" /><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DUcMQXczeSp7ImA9WhdVEUQ.&quot;"><id>tag:blogger.com,1999:blog-19840256.post-3196688569135880105</id><published>2011-09-15T20:13:00.000+01:00</published><updated>2011-09-16T19:18:00.981+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-16T19:18:00.981+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="absurdo" /><category scheme="http://www.blogger.com/atom/ns#" term="humor" /><category scheme="http://www.blogger.com/atom/ns#" term="símbolos" /><category scheme="http://www.blogger.com/atom/ns#" term="heroes" /><title>Quien puede más: ¿Dora la Exploradora o Lara Croft?</title><content type="html">&lt;p&gt;Hace tiempo que tengo esta duda, que me reconcome:&lt;/p&gt;

&lt;h2&gt;¿Quién puede más&lt;sup&gt;*&lt;/sup&gt;? ¿Dora la Exploradora o Lara Croft?&lt;/h2&gt;

&lt;p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-qfRDpxql2lU/TnJMhLTcSeI/AAAAAAAABu0/hBh9JAYF7-M/s1600/dora_vs_lara.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="256" width="400" src="http://1.bp.blogspot.com/-qfRDpxql2lU/TnJMhLTcSeI/AAAAAAAABu0/hBh9JAYF7-M/s400/dora_vs_lara.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Mi hijo lo tiene clarísimo. Yo tengo dudas...&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;*&lt;/sup&gt;Obsérvese que la pregunta es ¿Quién puede más? NO quien es más fuerte, ni más poderoso, ni ningún otro criterio que sea mínimamente objetivo.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Nota:&lt;/b&gt; Añado este comentario que me hizo el amigo Alvaro de Felipe por correo, y que me parece particularmente esclarecedor del nivel intelectual exhibido repetidas veces por Dora:&lt;/p&gt;

&lt;blockquote&gt;
En realidad Dora la Exploradora es hija natural de Bob Esponja, lo que pasa es que nunca la hicieron la prueba de paternidad y el no la reconoció oficialmente. Yo creo que Dora la Exploradora tiene una capacidad de absorción superior a la de Lara Croft y exclusivamente con ese criterio  "abierto", creo que Dora "puede más". Camilo José Cela, en una entrevista televisiva en directo, también aseveró tener una capacidad de absorción de hasta tres litros de agua, pero en este caso por vía rectal. No se ha podido establecer relación alguna entre Bob Esponja y D. Camilo José. Al menos yo no he podido.
&lt;/blockquote&gt;
&lt;hr&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.elornitorrincoenmascarado.com/feeds/3196688569135880105/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19840256&amp;postID=3196688569135880105" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/3196688569135880105?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19840256/posts/default/3196688569135880105?v=2" /><link rel="alternate" type="text/html" href="http://www.elornitorrincoenmascarado.com/2011/09/quien-puede-mas-dora-la-exploradora-o.html" title="Quien puede más: ¿Dora la Exploradora o Lara Croft?" /><author><name>Juan Ignacio Rodríguez de León</name><uri>https://plus.google.com/114737320583284529276</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-GaL2zUKBywI/AAAAAAAAAAI/AAAAAAAACAE/2wlceIY5c1Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-qfRDpxql2lU/TnJMhLTcSeI/AAAAAAAABu0/hBh9JAYF7-M/s72-c/dora_vs_lara.png" height="72" width="72" /><thr:total>4</thr:total></entry></feed>
