<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4759448024504207667</id><updated>2012-02-16T05:26:04.155-03:00</updated><category term='ruby'/><category term='alienware'/><category term='templates'/><category term='m11x'/><category term='software libre'/><category term='web'/><category term='bugs'/><category term='apple'/><category term='pycamp'/><category term='demandas'/><category term='pyweek'/><category term='chrome'/><category term='buzz'/><category term='css'/><category term='python'/><category term='apps'/><category term='rails'/><category term='debian'/><category term='rafaela'/><category term='windows'/><category term='fraude'/><category term='vim'/><category term='windows mobile'/><category term='diseño'/><category term='review'/><category term='blogs'/><category term='linux'/><category term='pyday'/><category term='cocos2d'/><category term='voto electronico'/><category term='opencv'/><category term='htc'/><category term='videos'/><category term='programacion'/><category term='consola'/><category term='lisp'/><category term='web2py'/><category term='legal'/><category term='django'/><category term='samsung'/><category term='hackers'/><category term='moviles'/><category term='gae'/><category term='pyar'/><category term='paquetes'/><category term='pyconar'/><category term='bpython'/><category term='prensa'/><category term='pygments'/><category term='android'/><category term='worldst'/><category term='opinion'/><category term='html'/><category term='netbook'/><category term='patentes'/><category term='sitio'/><category term='eventos'/><category term='regular expressions'/><category term='crackers'/><category term='china'/><category term='ubuntu'/><category term='iPad'/><category term='censura'/><category term='pyconar2010'/><category term='google'/><title type='text'>FisaDev</title><subtitle type='html'>pensamientos para indexar</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>44</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-9141918279578967294</id><published>2011-04-21T17:14:00.000-03:00</published><updated>2011-04-21T17:14:03.847-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='samsung'/><category scheme='http://www.blogger.com/atom/ns#' term='demandas'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Apple vs Samsung</title><content type='html'>&lt;p&gt;Apple acaba de demandar a Samsung, alegando que toda su linea Galaxy son copias de los productos iPhone.&lt;/p&gt;&lt;p&gt;Es decir, Apple dice que esto:&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-JhYpeB9BeAM/Ta9DTTMAAOI/AAAAAAAASPI/O0mo8sRC1s4/s1600/galaxyS.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="200" width="113" src="http://3.bp.blogspot.com/-JhYpeB9BeAM/Ta9DTTMAAOI/AAAAAAAASPI/O0mo8sRC1s4/s200/galaxyS.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;es una copia de esto:&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Cnfk4GeLRSY/Ta9DYxsTUQI/AAAAAAAASPQ/dnkLdIXq5Yk/s1600/iphone.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="200" width="114" src="http://4.bp.blogspot.com/-Cnfk4GeLRSY/Ta9DYxsTUQI/AAAAAAAASPQ/dnkLdIXq5Yk/s200/iphone.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Hasta acá pueden discutir todo lo que quieran acerca de qué tan parecidos o diferentes son. Pero lo gracioso viene ahora. Samsung, un año antes de que salga el iPhone, estaba mostrando al mundo esto:&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-yJB8wxLtPec/Ta9DotBCbbI/AAAAAAAASPY/QeCsibl3KGQ/s1600/f700.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="200" width="113" src="http://2.bp.blogspot.com/-yJB8wxLtPec/Ta9DotBCbbI/AAAAAAAASPY/QeCsibl3KGQ/s200/f700.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Repasemos los tres aparatos en el órden que fueron saliendo al mercado:&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-7y2980UmJDg/Ta9Fyg8owBI/AAAAAAAASPw/aP81r5SSzDU/s1600/todos.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="240" width="400" src="http://4.bp.blogspot.com/-7y2980UmJDg/Ta9Fyg8owBI/AAAAAAAASPw/aP81r5SSzDU/s400/todos.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;(Samsung F700 - Apple iPhone - Samsung Galaxy S)&lt;/p&gt;&lt;p&gt;En mi opinión Samsung simplemente siguió con su estilo, mientras que en el medio apareció Apple con productos que se le parecen. Pero si Apple quiere decir que Samsung le copió, entonces tendríamos que decir que en realidad ellos le copiaron a Samsung.&lt;/p&gt;&lt;p&gt;Apple, Apple... cada día me caes menos bien.&lt;/p&gt;&lt;p&gt;(me enteré de esto en una nota de Android Community)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-9141918279578967294?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/9141918279578967294/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2011/04/apple-vs-samsung.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/9141918279578967294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/9141918279578967294'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2011/04/apple-vs-samsung.html' title='Apple vs Samsung'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-JhYpeB9BeAM/Ta9DTTMAAOI/AAAAAAAASPI/O0mo8sRC1s4/s72-c/galaxyS.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-5006964311489127196</id><published>2011-04-18T17:55:00.002-03:00</published><updated>2011-04-27T11:00:12.143-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='voto electronico'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='software libre'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Voto electrónico con Python y Ubuntu</title><content type='html'>&lt;p&gt;Buenas! Hoy escribo post largo, pero que creo que era necesario que alguien lo escriba :)&lt;/p&gt; &lt;p&gt;Hay mucha gente hablando sobre voto electrónico y lo que se hizo en Salta, pero laverdad es que pocos tienen conocimiento de qué se hizo realmente, cómo funciona, ydemás. Muchos opinólogos que sacan conclusiones acerca de lo magnífico o terrible que es,pero a partir de cosas que adivinan o inventan. Y remarco que pasa en los dos lados,tanto de parte de los detractores como de parte de los defensores de este sistema.&lt;/p&gt; &lt;p&gt;Así que primero lo primero: como le gusta decir a un amigo, &amp;quot;desasnémosnos&amp;quot;. Empecemosentendiendo cómo funciona el sistema de voto electrónico que se utilizó en Salta.Como soy programador es lógico que mi explicación va a incluir unas cuantas cosas bientécnicas, pero también voy a abarcar otras más referidas al proceso.&lt;/p&gt; &lt;p&gt;Luego de la explicación también voy a incluir algunos de los planteos más comunes quesurgen, y las respuestas a esos planteos. Así que si durante la explicación se lesplantea algún cuestionamiento, estén atentos a si no lo respondo en esa sección.&lt;/p&gt; &lt;p&gt;Y recién después de eso voy a plantear mi opinión (por si a alguien le interesa, jeje),y dejar abierto el debate para que todos opinen y pregunten :)Por mi salud mental y la del debate, abstenerse de opinar quienes no tengan ganas deleer todo el post.&lt;/p&gt; &lt;p&gt;Ah, y casi me olvido: ¿por qué escribo yo sobre esto, y cómo se lo que se? Porque haceun tiempo empecé a trabajar para la empresa que desarrolla el sistema (MSA).¿Eso le quita objetividad a lo que digo? Puede que sí en la parte de opinión, pero no enlo referido al funcionamiento, es información y hechos verificables :)&lt;/p&gt; &lt;p&gt;No está de más aclarar que todo lo que digo en este post es opinión y palabramia y no de la empresa para la que trabajo, ya que se trata de mi blog personal. Asíque por cualquier cosa, yo (Juan Pedro Fisanotti, DNI 32.726.247) soy el responsable.&lt;/p&gt; &lt;div class="section" id="la-parte-objetiva-funcionamiento-del-sistema"&gt; &lt;h1&gt;La parte objetiva: funcionamiento del sistema&lt;/h1&gt; &lt;p&gt;Podemos dividir al sistema en tres grandes partes: el proceso de votación en sí, elrecuento por mesas, y el recuento final donde se transmiten y suman los recuentos detodas las mesas.&lt;/p&gt; &lt;p&gt;El hardware que vamos a usar:&lt;/p&gt; &lt;p&gt;Para la votación en sí y el recuento de las mesas se usan pcs especiales que vamos allamar &amp;quot;máquinas de votar&amp;quot; (más detalles después). Para transmitir la información delas mesas también se van a utilizar máquinas de votar (aunque no las mismas, sinootras dispuestas especialmente para la tarea). Y como se imaginarán los que tenganconocimientos técnicos, del &amp;quot;otro lado&amp;quot; hay servidores que van a recibir esainformación a la hora del recuento global (en este caso el &amp;quot;otro lado&amp;quot; está ubicadoen el tribunal electoral).&lt;/p&gt; &lt;p&gt;Las máquinas de voto merecen un poco más de explicación, ya que tienen algunascaracterísticas especiales:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Consisten en una valija con una pc todo en uno (pantalla táctil), una batería deemergencia, una impresora térmica, y un lector/grabador de RFID.&lt;/li&gt; &lt;li&gt;La pc no tiene ningún tipo de almacenamiento ni conexión a ninguna red. Sí tieneuna lectora de DVD.&lt;/li&gt; &lt;li&gt;La batería de emergencia garantiza alimentación suficiente para cortes no tanprolongados, mientras que si se espera una ausencia de energía prolongada lasmáquinas también poseen los cables necesarios para conectar una batería de auto, quele da autonomía suficiente para una votación completa.&lt;/li&gt; &lt;/ul&gt; &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-T00QQr60HGA/Tayqx1FkPXI/AAAAAAAASOo/SSGV3V6vEEo/s1600/voto_electronico-1024x700.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="271" width="320" src="http://2.bp.blogspot.com/-T00QQr60HGA/Tayqx1FkPXI/AAAAAAAASOo/SSGV3V6vEEo/s320/voto_electronico-1024x700.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Y finalmente, dentro de lo que podemos considerar como &amp;quot;hardware&amp;quot;, están las boletasde voto electrónico. Son boletas con papel para impresión térmica, y un chip RFID depoco alcance dentro.Hay varios tipos de boletas: las que se utilizan para la apertura de las mesas, las devoto, y las de cierre y transmisión. Después vamos a ir viendo cuándo se utiliza cadauna.Es importante ya ir sabiendo que una vez que el chip se graba con datos, ya no puede seralterado. Se graban y se &amp;quot;queman&amp;quot; de manera que no se pueda modificar la informaciónalmacenada.&lt;/p&gt; &lt;p&gt;El software:&lt;/p&gt; &lt;p&gt;Para la votación en sí y el recuento por mesa las máquinas de votar van a usar unsistema que vamos a llamar &amp;quot;sistema de voto&amp;quot;.Para la transmisión de los datos se va a usar un &amp;quot;sistema de transmisión&amp;quot;.Y en los servidores vamos a tener el &amp;quot;sistema de recuento global&amp;quot;.(Son todos nombres que pongo yo en este post para entendernos, vale la aclaración)&lt;/p&gt; &lt;p&gt;Tanto las máquinas de votar como los servidores corren Ubuntu (en el caso de lasmáquinas de votar, con modificaciones para que tengan solo lo necesario para elsistema). Y las aplicaciones desarrolladas por MSA para este sistema están escritascasi en su totalidad en el lenguaje de programación Python.¿Base de datos de los servidores? Postgresql. ¿Y de las máquinas? No usan ningún sistemade base de datos (después van a entender por qué no es necesario. Si les digo ahora quelas máquinas de voto &lt;em&gt;no guardan info&lt;/em&gt;, probablemente no entiendan cómo puede serpor ejemplo que hagan el recuento, jeje).&lt;/p&gt; &lt;p&gt;¿Recuerdan que les conté que la máquina de votar no tiene ningún tipo de almacenamiento?Entonces, ¿cómo puede tener el sistema de votación o el de transmisión?Simple: ambos sistemas se distribuyen en CD antes de comenzar la votación (livecds deUbuntu customizados, con cada sistema ya instalado y configurado). Como pueden imaginarsehay medios para garantizar que estos CDs no sean alterados. Los mismos son generados enuna única tirada con la presencia de los fiscales, son precintados, y luego se abren eldía de la elección. Y para los más técnicos: cada CD tiene un detalle de los hashs MD5 detodos sus archivos, que un fiscal podría luego comparar contra el maestro que posee eltribunal electoral. &lt;strong&gt;[EDIT: ya no usamos MD5, ahora usamos SHA512]&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Y la gente:&lt;/p&gt; &lt;p&gt;En el proceso van a participar las mismas personas de siempre (presidentes de mesa,fiscales, el tribunal electoral, etc.), y un grupo nuevo de personas: los técnicos enlas escuelas. La labor de estos técnicos va a ser la de soporte a las autoridades dela elección en cada escuela, y van a ayudar a transmitir los datos en conjunto con lospresidentes de mesa.&lt;/p&gt; &lt;p&gt;Ahora sí, votemos con el sistema. El proceso:&lt;/p&gt; &lt;p&gt;Arranca la mañana, los presidentes de mesa tienen que hacer la apertura de las mesas.Este proceso va a permitir que la gente comience a votar con la máquina.Para ello necesitan de:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Una máquina de votar (normalmente es una máquina por mesa, pero es posible plantearotros esquemas).&lt;/li&gt; &lt;li&gt;El sistema de votar (livecd).&lt;/li&gt; &lt;li&gt;Sus credenciales (con chip RFID que los identifica como presidentes de mesa).&lt;/li&gt; &lt;li&gt;Una boleta de apertura de mesa en blanco.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;El presidente de mesa inicia el sistema de votar (que arranca automáticamente al bootearel CD), se identifica con sus credenciales que le permiten abrir la mesa que tiene asignada,y elige dentro del sistema la opción de apertura de mesa.Esto le grabará e imprimirá la boleta de apertura, que después va a poder utilizar paravolver a abrir la mesa en caso de reemplazo de la máquina o reinicio por cualquiermotivo (abajo explico un poco más esto de poder reemplazar la máquina o reiniciarla).Este acta impresa es el documento legal que el presidente de mesa requiere, y ademásel proceso de apertura le permite a la máquina saber qué opciones debe presentar alos votantes, ya que todos los livecds son iguales.&lt;/p&gt; &lt;p&gt;Abierta la mesa, elige la opción de poner la máquina en modo de votación, y ya está,tenemos una máquina preparada para que la gente comience a votar.&lt;/p&gt; &lt;p&gt;¿Y cómo votan las personas?&lt;/p&gt; &lt;p&gt;Pepe votante llega a la mesa, presenta su DNI. Normalmente a Pepe le habrían dado unsobre para que entre al cuarto oscuro. Pero en este caso le dan una boleta de voto (delas que les conté antes) que no tiene datos, y está en blanco en uno de los lados.Pepe se dirije a la máquina de votar, inserta su boleta en la máquina.&lt;/p&gt; &lt;p&gt;Vale aclarar en este punto: la boleta todavía está en blanco! en ningún momento la boletatiene datos sobre quién es Pepe. Y la máquina no tiene ningún tipo de conexión de red,aparte de que el presidente no tiene contacto con la máquina, por lo que el presidenteno puede decirle a la máquina de alguna manera &amp;quot;es Pepe el que está votando&amp;quot; (salvo queel presidente y la máquina hagan un curso acelerado de telepatía antes de empezar lavotación). Esto es crucial para que el voto sea anónimo.De hecho el presidente puede darle a Pepe cualquiera de las boletas que tiene, e inclusopodría darle a Pepe la opción de que elija la boleta que él prefiera.Y no está de más aclarar que la máquina también verifica que la boleta se encuentrevacía. En caso de no cumplirse esa condición, expulsa la boleta apenas se la ingresa&lt;/p&gt; &lt;p&gt;En la pantalla de la máquina aparecen las opciones para votar. Estas opciones van adepender de la votación, pero básicamente Pepe va a tocar la cara del candidato quequiera para cada cargo que se esté eligiendo (de cada candidato aparecen todos losdatos lógicos, como nombre, partido, etc.).&lt;/p&gt; &lt;p&gt;Importante: los candidatos aparecen todos del mismo tamaño, con los mismos datos, yen orden aleatorio cada vez que son mostrados, para no dar ningún tipo de ventaja.&lt;/p&gt; &lt;p&gt;Cuando Pepe ya ha elegido todo la máquina le pregunta si desea confirmar su voto. Pepepuede elegir no confirmarlo y volver a armar su voto, o confirmarlo. Al confirmarlo laboleta se imprime, y se guarda lo elegido por Pepe dentro del chip RFID.&lt;/p&gt; &lt;p&gt;Pepe debe cerciorarse de que lo que salió impreso en la boleta es lo que él queríavotar, ya que lo impreso es lo que cuenta. Y además puede verificar lo grabado en elchip pasando la boleta por el lector de la máquina, que le presenta por pantalla loque el chip contiene. Y puede hacer esto en cualquier máquina (que no poseen conexiónentre sí), con lo que en este punto tenemos una seguridad importante, una pieza enel rompecabezas que tenemos que acordarnos:&lt;/p&gt; &lt;p&gt;Hasta el momento del voto en sí incluido, es imposible que la máquina nos mienta, ya quelo que cuenta es lo que está en la boleta, y podemos ver lo impreso y el contenido delchip.&lt;/p&gt; &lt;p&gt;Sí, ya se, faltan cosas para estar seguros de todo el sistema. Sean pacientes :)&lt;/p&gt; &lt;p&gt;Finalmente, Pepe dobla su voto para que nadie vea lo impreso y lo deposita en unaurna de cartón, igual a las de las elecciones tradicionales (acá es donde empezamosa ver que este sistema es de boleta electrónica, pero &lt;em&gt;no&lt;/em&gt; de urna electrónica. Algo quees crucial para ayudar a que sea transparente).&lt;/p&gt; &lt;p&gt;Después de Pepe vendrá Luis, Juan, José, y todos los votantes de esa mesa.&lt;/p&gt; &lt;p&gt;Y en este punto viene otra aclaración crucial: la máquina NO VA CONTANDO LOS VOTOS QUEGRABA E IMPRIME! No, no los cuenta. NO, como dije, no los cuenta. ¿Y cómo se cuentanentonces los votos? Paciencia, un poco más abajo lo voy a explicar. Pero ahora loimportante es eso, que la máquina no va contando los votos.¿Y por qué es tan importante? Porque le puede pasar cualquier cosa a la máquina, que nova a afectar a la votación. Si se apaga, un psicópata la parte con un hacha, le cae unrayo o lo que sea que le impida seguir funcionando, basta con buscar otra máquina,volver a hacer la apertura (que se hace rápidamente con la boleta de acta ya grabada),y listo. Seguimos votando.&lt;/p&gt; &lt;p&gt;Incluso nos permite independizar a la mesa de la máquina. Los votantes de una mesapodrían votar en cualquier máquina, ya que la única tarea de la máquina es emitir lasboletas electrónicas, y &lt;em&gt;no&lt;/em&gt; ir llevando el recuento.Para los más técnicos: esto nos permite hasta aplicar un poco de teoría de colas ybalancear la carga entre las mesas.&lt;/p&gt; &lt;p&gt;Son las 6 de la tarde (o un poco más). Terminan de pasar todos los votantes, tenemos quecerrar la mesa y realizar el recuento.&lt;/p&gt; &lt;p&gt;El presidente de mesa sigue un procedimiento similar al de la apertura de la mesa consu credenciales y un acta de cierre en blanco, solo que en este caso elige laopción de cierre de mesa. Iniciado el proceso de cierre de la mesa llega el momento decontar los votos.Tradicionalmente se habría abierto la urna, contado a mano los votos contenidos en lossobres, y anotado el resultado en un acta en papel.En este sistema lo que hacemos es abrir la urna, sacar las boletas de voto, y pasarlasuna a una por el lector de la máquina, que va contando los votos y mostrándonos porpantalla lo que cuenta.Los fiscales también están presentes durante el recuento para fiscalizar el procedimiento,de la misma manera que podían hacerlo en el voto tradicional.Es importante recordar que las boletas tenían impreso el voto, y que el presidente esresponsable de observar que lo que dice la boleta es lo mismo que la máquina muestrapor pantalla al pasar el voto. Y en todo momento es posible ver el total de lo que lamáquina lleva contado.&lt;/p&gt; &lt;p&gt;Y otra cosa importante es que cada chip tiene un serial único (similar a una dirección mac),que le permite al sistema evitar contar dos veces el mismo voto. Esto mismo se puedecomprobar con tranquilidad al realizar el recuento, pasando dos veces una misma boleta.El sistema rechaza el segundo intento informando que ya ha sido contada anteriormente.Y esto no implica un riesgo para el anonimato del voto porque como ya vimos, no existemanera práctica de asociar a la boleta con la persona que la utilizó.&lt;/p&gt; &lt;p&gt;Cuando se han pasado todos los votos el presidente de mesa le indica a la máquina devoto que se ha terminado el recuento, y la misma le imprime el acta de cierre con elrecuento realizado (lista de partidos con votos para cada uno y demás). Esta informaciónse imprime y se guarda en el chip del acta, y se vuelve a imprimir y guardar en el chipde una segunda boleta: la de transmisión.&lt;/p&gt; &lt;p&gt;Aquí un segundo punto crítico de control: al estar el recuento impreso en las boletas ypor haber podido controlar todo el recuento viendo lo que los votos tenían impreso, lamáquina de voto tampoco puede mentirnos hasta este punto. A este punto llegamos conun acta cuyos datos impresos son completamente verificables, donde la máquina no tuvoposibilidad de alterar esos datos sin que nosotros nos demos cuenta.Tema aparte es lo que se vaya a transmitir, ya llegamos a eso, pero es importante quesepamos que esas actas no pueden ser &amp;quot;inventadas&amp;quot; y que son la evidencia física de loque la gente votó.&lt;br /&gt;¿Se dan cuenta de que hasta este punto siempre podemos controlar a la máquina? Adiferencia de la creencia de que es imposible estar seguro que lo que dice una máquinaes real, acá el proceso mismo nos permite tener esa seguridad. La clave está en el&lt;em&gt;proceso&lt;/em&gt;, y no en la tecnología en sí.&lt;/p&gt; &lt;p&gt;Bien, tenemos los recuentos de las mesas, verificables y seguros. Llegó el momento detransmitir estos datos al tribunal electoral para realizar el recuento global.&lt;/p&gt; &lt;p&gt;El presidente de mesa se dirige a la máquina de transmisión (una por escuela), donde seencuentra el técnico responsable de esa escuela.El técnico inicia la máquina con el sistema (livecd) de transmisión, y conecta estamáquina a internet (por ADSL, 3G o conexión satelital, dependiendo del caso ydisponibilidad). Se autentica con su credencial y certificados SSL.Para los lectores con conocimientos técnicos: se usa SSL para cifrar la transmisión,con certificados para autenticar &lt;em&gt;ambos&lt;/em&gt; lados, tanto al servidor como al cliente.&lt;/p&gt; &lt;p&gt;El técnico pasa la boleta de transmisión que trae el presidente (quien sigue a su lado)por el lector de la máquina. La máquina envía los datos al servidor, y el servidordevuelve una imágen con lo que debería tener impreso la boleta de transmisión (elrecuento).El técnico y el presidente de mesa verifican que el servidor reconstruyó un recuentoidéntico al impreso en la boleta de transmisión, y cuando ambos concuerdan en que escorrecto, vuelven a pasar la boleta por el lector y confirman la transmisión.&lt;/p&gt; &lt;p&gt;Del lado del servidor esa boleta se marca como ya recibida, y sus valores se agreganal recuento global de manera automática.Los más rápidos ya deben estar preguntando: ¿y qué pasa ahora con eso de que la máquinano puede mentir? ¿Los servidores no pueden manipular el recuento global?Bien simple: las actas de cierre y las urnas no se tiran a la basura, se guardan. Y portanto seguimos teniendo la evidencia física verificable, cierta, que las máquinas nopueden alterar. Tenemos las actas, que por el proceso sabemos que no tienen error. Esoevita que las computadoras puedan mentir.&lt;/p&gt; &lt;p&gt;Y aparte de esta seguridad, también se dispone de los mecanismos tradicionales deverificación: los partidos tienen dentro del tribunal electoral a sus fiscales, quepueden verificar que lo recibido se corresponde con lo que los fiscales en las mesasobservaron en el recuento.&lt;/p&gt; &lt;p&gt;Fin del proceso.&lt;/p&gt; &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-apQLh0T4FT4/TaypF_DJhiI/AAAAAAAASOY/6PbTCt4tNW8/s1600/20110408_001.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="240" width="320" src="http://3.bp.blogspot.com/-apQLh0T4FT4/TaypF_DJhiI/AAAAAAAASOY/6PbTCt4tNW8/s320/20110408_001.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;¿Y cómo se compara esto con la seguridad que todos tenemos sobre el sistema tradicional?Bueno, tendríamos que desmitificar un poco esa seguridad.&lt;/p&gt; &lt;p&gt;Comparemos por partes.&lt;/p&gt; &lt;p&gt;El sistema tradicional no nos otorga ninguna seguridad respecto a que los presidentesde mesa y fiscales realizan el recuento adecuadamente.En el sistema de voto electrónico expuesto, ellos también podrían alterar los valores,pero si analizamos bien vemos que les sería mucho más difícil, ya que elrecuento no es un simple papel escrito a mano, sino que se deben pasar votos reales poruna máquina. No podemos hacer que un voto para el candidato X cuente como un voto parael candidato Y, porque la máquina lee X y suma X. En papel tranquilamente el presidentepuede modificar esos valores (y hasta tiene boletas con las cuales rellenar las urnaspara que coincidan).Y si confían mucho en los presidentes de mesa y creen que estas cosas no pasan, entoncesmiren lo sucedido recientemente en Chubut, donde llegó a haber diferencia de 800 votosen un acta...Así que respecto al recuento en las mesas, el voto electrónico con el sistema planteadonos otorga más seguridad que el voto tradicional.&lt;/p&gt; &lt;p&gt;El sistema tradicional tampoco nos otorga ninguna seguridad respecto a la &amp;quot;transmisión&amp;quot;de los datos. Estoy seguro de que la gran mayoría de los que leen esto nunca antes sehabían preguntado &amp;quot;¿cómo se llevan las actas y las urnas para el recuento global?&amp;quot;. En elsistema tradicional eso es clave, y sin embargo no tenemos manera de verificar que quiense haga cargo de dicho transporte (correo, gendarmería, etc.) no altere el contenido,modificando las actas o las urnas.En el sistema que explicamos también podría suceder que se alteren los contenidos de lasurnas y las actas, pero se encontrarían con un problema: deberían hacer que coincidancon lo que se transmitió antes, lo que les sería imposible, ya que lo transmitido se leedesde el chip RFID que no puede ser modificado una vez grabado, y además no es escrituraa mano sino una impresión.En este punto entonces también ganamos seguridad mediante el sistema de voto electrónico.&lt;/p&gt; &lt;p&gt;Aparte de esos puntos, en el sistema tradicional también eran posibles muchas otrastrampas, como el robo/ocultación de boletas del cuarto oscuro, que la digitalización yunificación de la boleta ya no permiten (esto es una ventaja también en los sistemas devoto en papel con boleta única). Además de el hecho de que al mostrar todos los candidatosen órden aleatorio y no depender de cuántos fiscales y boletas pueda poner cada partidoen las mesas, se favorece la igualdad de condiciones para los partidos, no perjudicandoa los más chicos.&lt;/p&gt; &lt;p&gt;Comparando entonces con lo que explicamos antes, objetivamente podemos afirmar queel sistema de voto electrónico implementado en Salta nos otorga seguridades que el vototradicional, en papel, no nos otorgaba. Y sigue siendo verificable, no se convierte enuna caja negra que no podamos controlar.Por ello es importante antes de creer que el sistema de voto electrónico expuesto esinseguro, ver si las inseguridades que planteamos no existen también en el sistema devoto tradicional (papel). Porque la realidad es que como todo sistema lo que se utilizóen Salta no es perfecto, pero sí mucho más seguro y controlable que el sistematradicional.&lt;/p&gt; &lt;/div&gt; &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-mzShrn_a31s/TayqChretuI/AAAAAAAASOg/rGpiiVSAjUw/s1600/20110411_085.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="240" width="320" src="http://3.bp.blogspot.com/-mzShrn_a31s/TayqChretuI/AAAAAAAASOg/rGpiiVSAjUw/s320/20110411_085.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="section" id="algunas-preguntas-comunes-faq"&gt; &lt;h1&gt;Algunas preguntas comunes (FAQ)&lt;/h1&gt; &lt;ul&gt; &lt;li&gt;¿Pero X no es inseguro? Donde X es algún aspecto del proceso o sistema explicado.Antes de plantear una pregunta de este estilo, primero plantear si el mismo aspectoera o no seguro en el voto tradicional.Pongo esto primero, porque en muchos lugares las principales críticas que se le hacenal sistema son cosas que son igual o incluso menos seguras en el voto tradicional.Así que antes de plantear una pregunta de este tipo, &lt;em&gt;piensen&lt;/em&gt; en cuál sería larespuesta para el voto tradicional.&lt;/li&gt; &lt;li&gt;¿Confiar en los presidentes de mesa para el recuento o la transmisión no es inseguro?Perfecto ejemplo de lo que planteé antes.Respuesta: también se confía en los presidentes de mesa en el voto tradicional. Sino podemos confiar en los presidentes de mesa, ningún sistema (papel o electrónico)va a ser seguro... Y de hecho, este sistema de voto electrónico limita mucho más lascosas malas que un presidente de mesa puede hacer.&lt;/li&gt; &lt;li&gt;¿Cuál es la principal ventaja de cambiar de sistema?En mi opinión la principal ventaja son las seguridades que este nuevo sistema nos day que el sistema tradicional no nos daba, que comenté antes.Y además de ello está la velocidad de recuento. En Salta por ejemplo, a las 21:15 yase tenía el 100% del recuento de las mesas electrónicas. Solo 3 horas, y estamoshablando no de Capital, sino de una provincia con geografía compleja, donde algunasde las mesas estaban ubicadas en escuelas perdidas en los cerros. Y se trataba de másde 700 mesas, es decir, más de 200.000 personas. Y en 3 horas con un recuento exacto,no un aproximado o una estimación.Y no falta quien pregunta: ¿pero eso no es mucho tiempo? ¿por qué demora tanto si lascomputadoras suman de manera instantánea?Simple: recuerden que el recuento en las mesas se hace pasando a mano cada boleta porla máquina, eso es un proceso manual (y es así por seguridad), que lleva tiempo(muchas veces demorado por las mesas que cierran tarde porque llega un colectivo devotantes a las 17:45, las discusiones con los fiscales, etc.).&lt;/li&gt; &lt;li&gt;¿Qué tanto se gana en la velocidad del recuento?Respondido antes :)&lt;/li&gt; &lt;li&gt;¿Las actas y los votos impresos en algún momento se cuentan a mano para estar seguros?Esto es decisión de la autoridad electoral. En el caso de Salta, sí, se realizó elrecuento manual y es ese el que cuenta como definitivo, mientras que el recuentoelectrónico es considerado provisorio. Dependiendo del caso, el tribunal electoraldecide si se deben examinar manualmente todas o parte de las urnas, pero esto yaes decisión de ellos. Lo importante es que el sistema permite hacer este recuentomanual, cosa que no es posible en sistemas de urna electrónica.Y enganchada a esta pregunta: Pero si al final van a contar todo a mano, ¿paraqué hacer el voto electrónico?Por todas las ventajas de seguridad que vimos antes, que  por lo general el sistematradicional no nos garantiza.&lt;/li&gt; &lt;li&gt;Usan software libre para hacer el sistema (Ubuntu, Python, etc.) Pero, ¿el código delsistema desarrollado por MSA es abierto?Por el momento no. A mi personalmente me encantaría que lo sea, pero no soy quientoma esa decisión, y también hay razones válidas para no hacerlo. No es que la empresalo cierre por ser malvada y querer andar escondiendo cosas, es un poco infantil creerque una empresa es malvada por no abrir el código de lo que hace. El software librees algo genial, yo de hecho soy muy adepto a ello. Pero a la hora de abrir el códigode algo así de delicado hay muchas cosas a tener en cuenta.Igualmente es un tema que se habló en la empresa, la posibilidad existe e inclusohay buena predisposición al respecto. :)Y de todas maneras, por lo que vimos antes podemos darnos cuenta de que la seguridaddel sistema no depende de que se conozca el código, ya que son las boletas impresaslas que garantizan dicha seguridad.&lt;/li&gt; &lt;li&gt;¿El costo del sistema no es demasiado elevado en comparación al tradicional?En realidad no. Algo que la mayoría desconoce es que las máquinas son propiedad dela empresa, y el estado las alquila para la votación (algo considerablemente menoscostoso que comprarlas). Y además por lo general cuando realizan esta pregunta,desconocen mucho de toda la logística que requiere una elección tradicional, que noes menor, más la cantidad de boletas que deben imprimirse por persona (en el vototradicional recuerden que no basta con una boleta por persona. Para cubrir todaslas opciones se deben imprimir como mínimo tantas boletas como partidos haya porpersona).&lt;/li&gt; &lt;li&gt;¿No es inseguro que la transmisión se realice por internet?No gracias al cifrado por SSL y la autenticación de los dos extremos con suscertificados. Esto garantiza que los datos no van a ser alterados y que no pueden serespiados por alguien que escuche la conexión.&lt;/li&gt; &lt;li&gt;En países más avanzados, como Holanda, se prohibió el voto electrónico porque erainseguro. ¿Por qué ustedes creen que no lo es?Porque lo que se usó en esos países eran &lt;em&gt;urnas electrónicas&lt;/em&gt;, algo que es muydiferente a este sistema. Es como decir que no hay que comer peras porque en algúnlugar se descubrió que las bananas son tóxicas. Sencillamente no son lo mismo.El principal problema acá es que la frase &amp;quot;voto electrónico&amp;quot; se utiliza para muchascosas que son muy distintas entre si.(nota completamente fuera de tema: yo soy alérgico a las bananas, pero me encantanlas peras, así que si ese razonamiento es válido sería una pena para mi :P)&lt;/li&gt; &lt;li&gt;¿Alguien no podría leer lo que tiene el chip de la boleta de un votante a distancia,y así dejaría de ser secreto su voto?El chip tiene muy poco alcance (unos centímetros). Y aunque tuviese más alcance comopara que alguien a la distancia lea los datos, sería imposible por la cantidad deinterferencia que habría. Recuerden que alrededor del votante hay varioscientos de boletas dando vueltas. Ni hablar del diámetro que debería tener una antenaque lea a distancia (metros).&lt;/li&gt; &lt;li&gt;¿Y mediante un ataque de Van Eck no sería posible ver las pantallas de las máquinas devoto a distancia?Esto se soluciona sencillamente ubicando a las máquinas cercanas entre sí, de esa maneragenerando la interferencia suficiente para que el atacante no pueda distinguir entreuna máquina y otra.&lt;/li&gt; &lt;li&gt;¿Qué pasa si se corta la luz?Explicado en la primer parte, cuando hablaba del hardware (batería de emergencia +posibilidad de usar baterías de auto).&lt;/li&gt; &lt;li&gt;¿Y si se rompe una máquina?Explicado también, no pasa nada. Se busca otra, se realiza la apertura, y se sigue.&lt;/li&gt; &lt;li&gt;¿La impresora se puede quedar sin tinta?La impresora no usa tinta, es térmica (lo aclaro porque hay gente que ha preguntadoesto en capacitaciones).&lt;/li&gt; &lt;li&gt;Otra pregunta que no haya puesto yo acá:Posteala en los comentarios, si tengo idea respondo, y si no averiguo :)&lt;/li&gt; &lt;/ul&gt; &lt;/div&gt; &lt;div class="section" id="la-parte-subjetiva-lo-que-yo-opino"&gt; &lt;h1&gt;La parte subjetiva: lo que yo opino&lt;/h1&gt; &lt;p&gt;De lo explicado pueden sacarse un montón de conclusiones, pero creo que lo más evidentees que este sistema está lejos de ser &amp;quot;una computadora que uno no sabe como funciona yte puede mentir en lo que cuenta&amp;quot;. Las numerosas instancias de control nos permitengarantizar la legitimidad de los resultados de manera simple, incluso otorgándonos másseguridad que en una votación tradicional.¿Sistema perfecto? Seguramente no. Pero sin dudas un avance respecto al voto en papel.Un sistema que nos da un poco más seguridad respecto a la base de nuestra democracia,la votación.&lt;/p&gt; &lt;p&gt;Y no puedo dejar de mencionar otra cosa que me llega más de cerca. Como pythonero,ubuntero, y amante del software libre en general, es un orgullo que esto pueda lograrseen base a estas herramientas. Debería ser algo que tengamos como ejemplo de todo loque se puede lograr en base a software libre, de su potencial y bondades. Algo quees logro de personas que también son miembros activos de las comunidades de softwarelibre de Argentina, que muchas veces se nutren en dichas comunidades y que sabendevolver lo que aprenden en tantos aportes (dando charlas, colaborando o iniciandoproyectos, respondiendo en listas de correos, etc.).&lt;/p&gt; &lt;p&gt;En resúmen, buena tecnología al servicio de un proceso electoral más claro y seguro :)&lt;/p&gt; &lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-0CyRegRXbso/Tayo5MkZx3I/AAAAAAAASOQ/1N7qnYNr7VQ/s1600/20110411_026.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="240" width="320" src="http://4.bp.blogspot.com/-0CyRegRXbso/Tayo5MkZx3I/AAAAAAAASOQ/1N7qnYNr7VQ/s320/20110411_026.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-5006964311489127196?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/5006964311489127196/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2011/04/voto-electronico-con-python-y-ubuntu.html#comment-form' title='117 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/5006964311489127196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/5006964311489127196'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2011/04/voto-electronico-con-python-y-ubuntu.html' title='Voto electrónico con Python y Ubuntu'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-T00QQr60HGA/Tayqx1FkPXI/AAAAAAAASOo/SSGV3V6vEEo/s72-c/voto_electronico-1024x700.jpg' height='72' width='72'/><thr:total>117</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-433008929142426190</id><published>2011-04-09T08:43:00.002-03:00</published><updated>2011-04-09T08:43:30.057-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='software libre'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu 11.04</title><content type='html'>Ya se viene! Veremos si me adapto a unity o termino instalándole gnome normal.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ubuntu.com/"&gt;&lt;img src="http://www.ubuntu.com/countdown/banner1.png" border="0" width="180" height="150" alt="The next version of Ubuntu is coming soon"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-433008929142426190?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/433008929142426190/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2011/04/ubuntu-1104.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/433008929142426190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/433008929142426190'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2011/04/ubuntu-1104.html' title='Ubuntu 11.04'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-3737690778223147398</id><published>2011-01-26T18:34:00.001-03:00</published><updated>2011-01-26T18:38:51.364-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='alienware'/><category scheme='http://www.blogger.com/atom/ns#' term='opinion'/><category scheme='http://www.blogger.com/atom/ns#' term='review'/><category scheme='http://www.blogger.com/atom/ns#' term='m11x'/><title type='text'>Review Alienware M11X R2</title><content type='html'>&lt;p&gt;Ayer finalmente me llegó la máquina nueva: una Alienware M11X R2.&lt;br /&gt;No voy a hacer una super review detallada, ya hay unas cuantas en la web (que me leí antes de comprarla), sino que solo voy a poner mi visión resumida.&lt;/p&gt;&lt;p&gt;Pero antes, las especificaciones:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Micro:&lt;/strong&gt; Intel Core i7 640UM (quadcore, 2.26 Ghz)&lt;br /&gt;&lt;strong&gt;RAM:&lt;/strong&gt; 4GB DDR3 de 800Mhz (dual channel)&lt;br /&gt;&lt;strong&gt;Video:&lt;/strong&gt; Nvidia GeForce GT 335M (1GB de memoria)&lt;br /&gt;&lt;strong&gt;Disco:&lt;/strong&gt; 500GB SATA II de 7200rpm&lt;br /&gt;&lt;strong&gt;Pantalla:&lt;/strong&gt; WLED de 11', 720p&lt;br /&gt;&lt;strong&gt;Otros:&lt;/strong&gt; bluetooth, HDMI, display port, card reader, cámara, etc.&lt;br /&gt;&lt;/p&gt;&lt;p style="color: #11DD11;"&gt;Puntos a favor:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Potencia: vuela, así de simple. Corre el COD4 Modern Warfare 2 con todos los gráficos en máximo, y ni lo siente.&lt;/li&gt;&lt;li&gt;Tamaño: tiene el tamaño de una netbook de 12', entra perfecto en la mochila, es portable. No entiendo todavía cómo entran las cosas que tiene dentro de un espacio tan reducido.&lt;/li&gt;&lt;li&gt;Diseño: futurista, me gusta más que cuando lo veía en fotos. Se ve y se siente muy robusta.&lt;/li&gt;&lt;li&gt;Duración de batería: 6 horas con poca exigencia, 2 horas jugando, es bastante.&lt;/li&gt;&lt;li&gt;Chiches: Se pueden personalizar los colores de todas las luces, tiene un indicador de batería abajo para cuando está apagada, puede cargar energía a otros aparatos por USB estando apagada, etc.&lt;/li&gt;&lt;/ul&gt;&lt;p style="color: #DD1111;"&gt;Puntos en contra:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Peso: acostumbrado a una netbook de 1kg, los 2kg y algo que pesa me resultan no tan cómodos en la espalda.&lt;/li&gt;&lt;li&gt;Pantalla reflexiva: la pantalla refleja &lt;strong&gt;demasiado&lt;/strong&gt;, muy molesto usarla en ambientes bastante iluminados.&lt;/li&gt;&lt;li&gt;Soporte para Linux: desde Linux no puedo hacer varias cosas, como cambiar el color de las luces, o elegir qué aceleradora utilizar.&lt;/li&gt;&lt;li&gt;Puerto VGA: no tiene, tengo que conseguir un adaptador para poder usar mi monitor.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Fotos :)&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_WhgSMw0NcSs/TUCUJrGRmpI/AAAAAAAASGo/YdFQ7Uixmv4/s1600/20110126_002.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="240" width="320" src="http://2.bp.blogspot.com/_WhgSMw0NcSs/TUCUJrGRmpI/AAAAAAAASGo/YdFQ7Uixmv4/s320/20110126_002.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_WhgSMw0NcSs/TUCUVZPYwCI/AAAAAAAASGw/ADa4PalqiwA/s1600/20110126_003.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="240" width="320" src="http://4.bp.blogspot.com/_WhgSMw0NcSs/TUCUVZPYwCI/AAAAAAAASGw/ADa4PalqiwA/s320/20110126_003.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-3737690778223147398?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/3737690778223147398/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2011/01/review-alienware-m11x-r2.html#comment-form' title='9 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/3737690778223147398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/3737690778223147398'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2011/01/review-alienware-m11x-r2.html' title='Review Alienware M11X R2'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_WhgSMw0NcSs/TUCUJrGRmpI/AAAAAAAASGo/YdFQ7Uixmv4/s72-c/20110126_002.jpg' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-6020877092992420917</id><published>2010-12-23T15:26:00.000-03:00</published><updated>2010-12-23T15:26:53.619-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='opinion'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programacion'/><title type='text'>La magia existe</title><content type='html'>La magia existe. Los magos existen.&lt;br /&gt;&lt;br /&gt;Personas con poder para crear mundos enteros y manipular sus leyes para volar, hacerse invisibles, o cualquier cosa que sus mentes sean capaces de imaginar. Magia que construye, conoce, transforma o destruye.&lt;br /&gt;Magos que dedican sus vidas ocultas a perfeccionar sus habilidades mágicas, con largas horas de estudios y experimentos impensables. Que forman cofradías en las cuales comparten conocimientos, técnicas y descubrimientos. Cofradías donde los aprendices reciben el arte de manos de gurúes poderosos, y donde muchos combinan sus poderes para lograr cosas aún más increíbles.&lt;br /&gt;Tan increíbles que su magia ya está presente detrás de la vida cotidiana del mundo. Pero son solo los magos quienes conocen y comprenden su verdadero poder y lo continúan aprovechando para transformar la realidad a gusto, a veces para bien y otras no tanto. Al tiempo que para el resto, son solo personas con gustos extraños.&lt;br /&gt;No son quienes conocen solo un poco de magia, y esta se convierte en un simple medio para algún objetivo temporal. Los verdaderos magos descubren el placer en el solo hecho de conocer la magia, experimentar, descubrir. Crean y conjuran nuevos hechizos solo para llevar su poder al límite, y así cultivar su habilidad, expandir su entendimiento.&lt;br /&gt;&lt;br /&gt;La magia existe. Los magos existen. La gente los suele llamar "programadores".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-6020877092992420917?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/6020877092992420917/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/12/la-magia-existe.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/6020877092992420917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/6020877092992420917'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/12/la-magia-existe.html' title='La magia existe'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-3762270338728238025</id><published>2010-12-02T09:50:00.000-03:00</published><updated>2010-12-02T09:50:42.539-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='software libre'/><category scheme='http://www.blogger.com/atom/ns#' term='eventos'/><title type='text'>Charlas en las Jornadas de Software Libre de Junín</title><content type='html'>&lt;p&gt;Hace poco tuve la suerte de poder ir a las Jornadas de Software Libre que se organizan en Junín. El evento estuvo muy bueno, me sorprendió el nivel de la organización, y aprendí un montón en las charlas. Y de paso me invitaron a dar una charla de Django fuera de cronograma :)&lt;/p&gt;&lt;p&gt;Por suerte filmaron todas las charlas (algo que debería ser costumbre en este tipo de eventos), y hace unos días las subieron ya a blip.tv. Algunas de las charlas también se habían dado en PyConAr 2010, así que pueden aprovechar quienes se perdieron ese evento :)&lt;/p&gt;&lt;p&gt;Pueden ver todas las charlas aquí: &lt;a href="http://unnoba.blip.tv/posts?view=archive&amp;nsfw=dc"&gt;http://unnoba.blip.tv/posts?view=archive&amp;nsfw=dc&lt;/a&gt;&lt;/p&gt;&lt;p&gt;(y mi charla es &lt;a href="http://unnoba.blip.tv/file/4453909/"&gt;esta&lt;/a&gt;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-3762270338728238025?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/3762270338728238025/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/12/charlas-en-las-jornadas-de-software.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/3762270338728238025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/3762270338728238025'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/12/charlas-en-las-jornadas-de-software.html' title='Charlas en las Jornadas de Software Libre de Junín'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-7162845686210368404</id><published>2010-10-18T20:36:00.000-03:00</published><updated>2010-10-18T20:36:33.064-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pyconar2010'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pyconar'/><title type='text'>PyConAr 2010</title><content type='html'>Y pasó la PyConAr 2010!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La verdad que fue algo muy, muy bueno, desde varios puntos de vista:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_WhgSMw0NcSs/TLzZjw-0UXI/AAAAAAAAR9A/25cKyJgUsYk/s1600/5091946451_3f80aa8f22_b.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_WhgSMw0NcSs/TLzZjw-0UXI/AAAAAAAAR9A/25cKyJgUsYk/s320/5091946451_3f80aa8f22_b.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Por el lado técnico fué genial aprender muchas cosas de parte de personas que tienen tantos conocimientos. El capital intelectual desplegado en la conferencia fue impresionante.&lt;br /&gt;Desde profundizar en conceptos avanzados como los expuestos en la charla sobre tipado de Daniel Moisset, hasta comprender cosas que debería haber aprendido bastante antes, como unicode (Facu Batista).&lt;br /&gt;La lista de cosas aprendidas sigue con docutils, empaquetado para windows, pymaemo, pygtk, los módulos de roberto, y unas cuantas más.&lt;br /&gt;Y también me gustó y sirvió poder aportar mi pequeño grano de arena, con la charla de Django que espero haya salido bien :)&lt;br /&gt;&lt;br /&gt;La verdad que con solo eso la conferencia ya valía la pena.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_WhgSMw0NcSs/TLzYgm-2LNI/AAAAAAAAR8w/85L322bqKk4/s1600/DSCF7277.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="153" src="http://3.bp.blogspot.com/_WhgSMw0NcSs/TLzYgm-2LNI/AAAAAAAAR8w/85L322bqKk4/s320/DSCF7277.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Pero también está el lado "comunitario", y en eso se sintió muy bien ser parte de una movida fuerte como es la de PyAr.&lt;br /&gt;Esta bueno ver tanta gente comprometida por la difusión y evolución de una tecnología, al punto de regalar horas de trabajo, viajar desde lejos, compartir lo que conocen e incluso aportar económicamente a la causa, convencidos de que lo que tienen es algo que vale la pena difundir.&lt;br /&gt;Viniendo de un pasado no tan lejano de estar metido en otras tecnologías (Microsoft, .Net, etc), todavía me sorprende lo que se logra con una comunidad sin estructuras jerárquicas, títulos oficiales, ni empresas que la banquen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_WhgSMw0NcSs/TLzYv__7ePI/AAAAAAAAR80/lpJIVZB2Er8/s1600/5092423116_bb8b59171e_b.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_WhgSMw0NcSs/TLzYv__7ePI/AAAAAAAAR80/lpJIVZB2Er8/s320/5092423116_bb8b59171e_b.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Y finalmente esta lo humano, el contacto de uno a uno.&lt;br /&gt;Lo compartido en los momentos más informales, como el asado o la salida del sábado, es impagable. Conversaciones y debates con gente que además de ser profesionales tienen calidad humana. Gente que no tiene problemas en compartir una solución a un problema, conocimientos, consejos, junto con bromas, buena onda, y una cerveza de por medio :) (aunque yo no tome, igual me parece genial, jaja).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_WhgSMw0NcSs/TLzY74mIRDI/AAAAAAAAR84/AcjAInCHTr4/s1600/5092694330_370b623efd_b.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/_WhgSMw0NcSs/TLzY74mIRDI/AAAAAAAAR84/AcjAInCHTr4/s320/5092694330_370b623efd_b.jpg" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Así que gracias a todos los que de alguna manera ayudaron a hacer esta PyCon.&lt;br /&gt;Espero ya al próximo evento, y ahora de vuelta al trajín diario, que por suerte este tiempo tiene bastante de Python en el medio (en la facu, en el trabajo fijo, y en el trabajo freelance, weeee! tengo suerte).&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_WhgSMw0NcSs/TLzZHL6Bc6I/AAAAAAAAR88/ZSBBOD0P8Ts/s1600/20101017_001.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/_WhgSMw0NcSs/TLzZHL6Bc6I/AAAAAAAAR88/ZSBBOD0P8Ts/s320/20101017_001.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-7162845686210368404?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/7162845686210368404/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/10/pyconar-2010.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/7162845686210368404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/7162845686210368404'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/10/pyconar-2010.html' title='PyConAr 2010'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_WhgSMw0NcSs/TLzZjw-0UXI/AAAAAAAAR9A/25cKyJgUsYk/s72-c/5091946451_3f80aa8f22_b.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-8414409563241989705</id><published>2010-09-15T11:45:00.000-03:00</published><updated>2010-09-15T11:45:51.436-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Se viene Ubuntu 10.10</title><content type='html'>&lt;p&gt;Se viene se viene!&lt;/p&gt;&lt;br /&gt;&lt;a href="http://www.ubuntu.com/"&gt;&lt;img src="http://www.ubuntu.com/countdown/banner1.png" border="0" width="180" height="150" alt="The next version of Ubuntu is coming soon"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-8414409563241989705?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/8414409563241989705/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/09/se-viene-ubuntu-1010.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/8414409563241989705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/8414409563241989705'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/09/se-viene-ubuntu-1010.html' title='Se viene Ubuntu 10.10'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-7937336119638391415</id><published>2010-09-13T17:21:00.000-03:00</published><updated>2010-09-13T17:21:35.428-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='netbook'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Netbooks, "bajo rendimiento"?</title><content type='html'>Hoy pensando me di cuenta de algo que me sorprendió un poco.&lt;br /&gt;&lt;br /&gt;Para ubicarse:&lt;br /&gt;&lt;b&gt;Máquina&lt;/b&gt;: una netbook HP (modelo mini 1020) con un micro de 1.6 ghz, 2 gb de ram. Ni hablar que no tiene aceleradora de video ni nada por el estilo.&lt;br /&gt;&lt;b&gt;Sistema operativo&lt;/b&gt;: Ubuntu netbook edition 10.10, usando el escritorio de ubuntu normal, no el de netbook, con compiz fusion a full (muchos efectos activados).&lt;br /&gt;&lt;br /&gt;Ahora los números:&lt;br /&gt;Uso del procesador mientras...&lt;br /&gt;...giro los escritorios en el cubo en 3D, con las ventanas también en 3D flotando sobre el cubo: &lt;b&gt;10%&lt;/b&gt;&lt;br /&gt;...paso entre ventanas abiertas al estilo "albumes", en 3D: &lt;b&gt;10%&lt;/b&gt;&lt;br /&gt;...abro GIMP (programa de edición de imágenes, estilo Photoshop): &lt;b&gt;50%&lt;/b&gt;&lt;br /&gt;...instalo actualizaciones: &lt;b&gt;50%&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;¿Cómo puede ser que sobre tanta máquina si es una netbook, que en teoría es una máquina de "bajo rendimiento"?&lt;br /&gt;De hecho uso esa máquina para casi todo. Para lo único que no puedo usarla es para juegos (por la falta de aceleradora).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-7937336119638391415?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/7937336119638391415/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/09/netbooks-bajo-rendimiento.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/7937336119638391415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/7937336119638391415'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/09/netbooks-bajo-rendimiento.html' title='Netbooks, &quot;bajo rendimiento&quot;?'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-6563261815332440121</id><published>2010-07-20T14:45:00.000-03:00</published><updated>2010-07-20T14:45:05.533-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Mi configuracion de Vim</title><content type='html'>&lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt;&amp;nbsp;es un editor de texto muy bueno. Es algo bastante diferente a lo normal, para quienes vienen de editores de código gráficos, sea el block de notas, Eclipse, o cualquier otro. &lt;br /&gt;Se puede usar por línea de comandos y todas las cosas normalmente se hacen desde el teclado. Tiene un enfoque bien simplista, pero es super configurable y personalizable, hay cientos de plugins útiles.&lt;br /&gt;&lt;br /&gt;En el PyCamp 2010 me lo mostraron por primera vez (algo había visto antes, pero no en profundidad), y en poco tiempo se convirtió en mi editor de cabecera para cualquier lenguaje o tipo de archivo de texto.&lt;br /&gt;Con el tiempo aprendí a meterle mano y adaptarlo a mis gustos, y además de las 4 máquinas donde lo uso (incluyendo el celular), también algunos amigos estaban usando mi configuración. Así que me decidí a documentarla bien y subirla a algún lado, para ordenarla y para que si a otros les sirve también puedan aprovecharla.&lt;br /&gt;Incluye cosas interesantes como un muy buen debugger para Python, autocompletado mejorado, navegador de clases, etc.&lt;br /&gt;&lt;br /&gt;Info, descarga y demás yerbas aquí: &amp;nbsp;&lt;a href="http://code.google.com/p/fisa-vim-config/"&gt;fisa-vim-config&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_WhgSMw0NcSs/TEXgdhU8ZPI/AAAAAAAAR5M/YR2mwe7RiyQ/s1600/Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="364" src="http://4.bp.blogspot.com/_WhgSMw0NcSs/TEXgdhU8ZPI/AAAAAAAAR5M/YR2mwe7RiyQ/s640/Screenshot.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-6563261815332440121?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/6563261815332440121/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/07/mi-configuracion-de-vim.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/6563261815332440121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/6563261815332440121'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/07/mi-configuracion-de-vim.html' title='Mi configuracion de Vim'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_WhgSMw0NcSs/TEXgdhU8ZPI/AAAAAAAAR5M/YR2mwe7RiyQ/s72-c/Screenshot.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-2926681868624241540</id><published>2010-07-16T21:51:00.000-03:00</published><updated>2010-07-16T21:51:24.972-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='programacion'/><title type='text'>Programar programas que programan</title><content type='html'>Lisp es un lenguaje bastante particular (lleno de paréntesis, jeje). Entre las características que tiene hay una que hasta donde conozco, no poseen otros lenguajes: permite modificar la sintaxis del lenguaje mismo.&lt;br /&gt;Explicándolo sin entrar en demasiado detalle, uno puede escribir macros (que no son nada ni cercano a las macros de los otros lenguajes, solo el nombre tienen parecido), que son "programas que escriben programas". Lisp utilizará esas macros que escribamos para "leer" el código en la sintaxis que inventemos, y a partir de él "escribirá" código (programas) que finalmente serán los que se ejecuten.&lt;br /&gt;&lt;br /&gt;Algo así:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;inventamos una sintaxis&lt;/li&gt;&lt;li&gt;programamos una macro, que es una función que recibe código en esa sintaxis inventada, y genera código en la sintáxis normal&lt;/li&gt;&lt;li&gt;hacemos programas usando nuestra sintaxis inventada&lt;/li&gt;&lt;li&gt;lisp convierte nuestros programas con sintaxis inventada, en programas válidos, usando nuestra macro&lt;/li&gt;&lt;li&gt;lisp finalmente ejecuta los programas que se crearon en el paso anterior&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Cosas interesantes en eso:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La macro es una función, pero recibe código como parámetro! En Lisp, la diferencia entre código y datos es bastante borrosa, uno puede manejar código como si fuesen datos fácilmente. El código son en realidad listas, y podemos transformarlas como a cualquier lista normal.&lt;/li&gt;&lt;li&gt;Programamos programas que programan! O sea, hacemos un programa que es capaz de crear código y después ejecutar el código que creó.&lt;/li&gt;&lt;li&gt;Si trabajamos en una empresa donde nos pagan por cada línea que programamos... a quien le pagan las líneas que nuestros programas programan? a nuestros programas?? :)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;Con un poco de idea&amp;nbsp;nomás, uno ya puede hasta crear macros que permitan escribir código lisp invertido, y que se termine ejecutando como si estuviese bien escrito, jeje.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-2926681868624241540?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/2926681868624241540/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/07/programar-programas-que-programan.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/2926681868624241540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/2926681868624241540'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/07/programar-programas-que-programan.html' title='Programar programas que programan'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-7675894806725095885</id><published>2010-07-07T11:07:00.001-03:00</published><updated>2010-07-07T11:12:44.844-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apps'/><category scheme='http://www.blogger.com/atom/ns#' term='chrome'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Aplicaciones en Google Chrome</title><content type='html'>Gracias a Tavo Tell me entere de la buena noticia: ya se pueden probar las apps en Chrome!&lt;br /&gt;Es el esquema de aplicaciones que se va a usar en Chrome OS.&lt;br /&gt;&lt;br /&gt;Aquí el tutorial sobre como activarlas e instalar las tres primeras: gmail, gdocs y gcalendar.&lt;br /&gt;&lt;a href="http://bit.ly/aYhdTq"&gt;http://bit.ly/aYhdTq&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En la web encontré alguien que armó una app para greader:&lt;br /&gt;&lt;a href="http://bit.ly/bK90vp"&gt;http://bit.ly/bK90vp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Y yo armé una app para twitter:&lt;br /&gt;&lt;a href="http://bit.ly/bgKFUf"&gt;http://bit.ly/bgKFUf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(un detalle: si quieren bajar las aplicaciones y chrome les da un error de como deben ser servidas, o solo se les baja y no saben como instalarlas, entonces guarden el archivo, después cambien la extensión del archivo a zip, descompriman en una carpeta, e instalen desde la carpeta como instalaron las tres primeras)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_WhgSMw0NcSs/TDSLUD_TZaI/AAAAAAAAR3c/fgHlqjg1lYk/s1600/screen.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="500" src="http://3.bp.blogspot.com/_WhgSMw0NcSs/TDSLUD_TZaI/AAAAAAAAR3c/fgHlqjg1lYk/s640/screen.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-7675894806725095885?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/7675894806725095885/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/07/aplicaciones-en-google-chrome.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/7675894806725095885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/7675894806725095885'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/07/aplicaciones-en-google-chrome.html' title='Aplicaciones en Google Chrome'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDSLUD_TZaI/AAAAAAAAR3c/fgHlqjg1lYk/s72-c/screen.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-6976383017851689362</id><published>2010-06-29T17:56:00.000-03:00</published><updated>2010-06-29T17:56:35.745-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diseño'/><category scheme='http://www.blogger.com/atom/ns#' term='bpython'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Consola bpython</title><content type='html'>Para los que no la conocen, &lt;a href="http://bpython-interpreter.org/"&gt;bpython&lt;/a&gt; es una consola de python bastante interesante, con autocompletado, integración con servicios como pastebin, y otras cosas.&lt;br /&gt;&lt;br /&gt;Pero no me gustaban los colores que trae por defecto, jeje, así que me arme mi theme estilo vim:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_WhgSMw0NcSs/TCpdvPaWlmI/AAAAAAAAR24/xg2apvnfSqI/s1600/fisa.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="404" src="http://2.bp.blogspot.com/_WhgSMw0NcSs/TCpdvPaWlmI/AAAAAAAAR24/xg2apvnfSqI/s640/fisa.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;El archivo de tema es el siguiente:&lt;br /&gt;&lt;br /&gt;[syntax]&lt;br /&gt;keyword = y&lt;br /&gt;name = k&lt;br /&gt;comment = b&lt;br /&gt;string = r&lt;br /&gt;error = r&lt;br /&gt;number = r&lt;br /&gt;operator = k&lt;br /&gt;punctuation = k&lt;br /&gt;token = k&lt;br /&gt;paren = k&lt;br /&gt;&lt;br /&gt;[interface]&lt;br /&gt;background = d&lt;br /&gt;output = k&lt;br /&gt;main = k&lt;br /&gt;prompt = k&lt;br /&gt;prompt_more = k&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-6976383017851689362?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/6976383017851689362/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/06/consola-bpython.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/6976383017851689362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/6976383017851689362'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/06/consola-bpython.html' title='Consola bpython'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_WhgSMw0NcSs/TCpdvPaWlmI/AAAAAAAAR24/xg2apvnfSqI/s72-c/fisa.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-6785539016324869489</id><published>2010-06-13T18:08:00.000-03:00</published><updated>2010-06-13T18:08:46.713-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='gae'/><title type='text'>3 tools</title><content type='html'>&lt;br class="Apple-interchange-newline" /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;The 3 tools I'm using at work, on one picture :)&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;(Guido:&amp;nbsp;&lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt;, Guido's t-shirt:&amp;nbsp;&lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt;, Pony:&amp;nbsp;&lt;a href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt;)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_WhgSMw0NcSs/TBVHQ1gzB4I/AAAAAAAAR10/nadK-YASzXU/s1600/guidog.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/_WhgSMw0NcSs/TBVHQ1gzB4I/AAAAAAAAR10/nadK-YASzXU/s400/guidog.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-6785539016324869489?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/6785539016324869489/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/06/3-tools.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/6785539016324869489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/6785539016324869489'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/06/3-tools.html' title='3 tools'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_WhgSMw0NcSs/TBVHQ1gzB4I/AAAAAAAAR10/nadK-YASzXU/s72-c/guidog.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-5249317520503408074</id><published>2010-06-10T09:23:00.000-03:00</published><updated>2010-06-10T09:23:57.847-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPad'/><title type='text'>iPad news</title><content type='html'>This is a screenshot of my Google Reader today :)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_WhgSMw0NcSs/TBDZL6GJEUI/AAAAAAAAR1k/iN-sE2nqwY8/s1600/iPad.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="http://4.bp.blogspot.com/_WhgSMw0NcSs/TBDZL6GJEUI/AAAAAAAAR1k/iN-sE2nqwY8/s640/iPad.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-5249317520503408074?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/5249317520503408074/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/06/ipad-news.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/5249317520503408074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/5249317520503408074'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/06/ipad-news.html' title='iPad news'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_WhgSMw0NcSs/TBDZL6GJEUI/AAAAAAAAR1k/iN-sE2nqwY8/s72-c/iPad.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-2206318528503003127</id><published>2010-05-21T10:42:00.001-03:00</published><updated>2010-05-21T10:44:51.192-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='videos'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pyday'/><category scheme='http://www.blogger.com/atom/ns#' term='rafaela'/><title type='text'>Videos PyDay Rafaela 2010</title><content type='html'>Ya están disponibles los videos de las charlas del PyDay Rafaela 2010!&lt;br /&gt;&lt;br /&gt;Pueden disfrutarlos aquí:&lt;br /&gt;&lt;a href="http://pydayrafaela.blip.tv/"&gt;http://pydayrafaela.blip.tv/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-2206318528503003127?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/2206318528503003127/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/05/videos-pyday-rafaela-2010.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/2206318528503003127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/2206318528503003127'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/05/videos-pyday-rafaela-2010.html' title='Videos PyDay Rafaela 2010'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-4169850778257489235</id><published>2010-05-09T17:53:00.001-03:00</published><updated>2010-05-09T17:54:37.721-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pyday'/><category scheme='http://www.blogger.com/atom/ns#' term='rafaela'/><category scheme='http://www.blogger.com/atom/ns#' term='pyar'/><title type='text'>PyDay Rafaela 2010</title><content type='html'>Qué bueno que estuvo el PyDay Rafaela 2010!&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Las charlas salieron muy buenas, y asistió una cantidad de gente bastante alta (fuimos unos 92 en total). Agradezco mucho a la gente que viajó desde otros lugares del país para venir a dar las charlas, y a los que participaron o ayudaron en la organización. Todos se pasaron, y permitieron que este evento se haga realidad dando un paso muy importante para la difusión de Python en nuestra zona. Gracias!!!&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Por mi parte, tuve la suerte de poder dar una charla de Django. En estos días estamos organizando cómo subir el material y los videos de las charlas. Apenas tengamos las cosas subidas, posteo avisando.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Mientras tanto dejo una foto robada del blog de Juanjo :)&lt;div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_WhgSMw0NcSs/S-cgZhcdPFI/AAAAAAAARnc/I9kIOG-ewik/s1600/023.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://2.bp.blogspot.com/_WhgSMw0NcSs/S-cgZhcdPFI/AAAAAAAARnc/I9kIOG-ewik/s320/023.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-4169850778257489235?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/4169850778257489235/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/05/pyday-rafaela-2010_09.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/4169850778257489235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/4169850778257489235'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/05/pyday-rafaela-2010_09.html' title='PyDay Rafaela 2010'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_WhgSMw0NcSs/S-cgZhcdPFI/AAAAAAAARnc/I9kIOG-ewik/s72-c/023.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-2691991273783745321</id><published>2010-05-02T13:48:00.001-03:00</published><updated>2010-05-02T13:49:28.019-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pyday'/><category scheme='http://www.blogger.com/atom/ns#' term='rafaela'/><category scheme='http://www.blogger.com/atom/ns#' term='pyar'/><category scheme='http://www.blogger.com/atom/ns#' term='eventos'/><title type='text'>PyDay Rafaela 2010</title><content type='html'>El 8 de mayo en la UCSE de Rafaela, hacemos un PyDay!&lt;br /&gt;&lt;br /&gt;Es un evento donde se darán charlas sobre el lenguaje de programación Python. La entrada es gratuita, y quienes deseen participar pueden ya registrarse en el sitio del evento.&lt;br /&gt;Para información y registración, el sitio es: &lt;a href="http://www.pyday.com.ar/rafaela2010"&gt;http://www.pyday.com.ar/rafaela2010&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Python es un lenguaje de programación poderoso y fácil de aprender. Cuenta con estructuras de datos eficientes y de alto nivel y un enfoque simple pero efectivo a la programación orientada a objetos. La elegante sintaxis de Python y su tipado dinámico, junto con su naturaleza interpretada, hacen de éste un lenguaje ideal para scripting y desarrollo rápido de aplicaciones en diversas áreas y sobre la mayoría de las plataformas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-2691991273783745321?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/2691991273783745321/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/05/pyday-rafaela-2010.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/2691991273783745321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/2691991273783745321'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/05/pyday-rafaela-2010.html' title='PyDay Rafaela 2010'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-2973915770934480263</id><published>2010-04-12T16:32:00.000-03:00</published><updated>2010-04-12T16:32:04.426-03:00</updated><title type='text'>Si pudiese...</title><content type='html'>&lt;pre&gt;cd mundo&lt;br /&gt;hg up -r -365&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-2973915770934480263?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/2973915770934480263/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/04/si-pudiese.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/2973915770934480263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/2973915770934480263'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/04/si-pudiese.html' title='Si pudiese...'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-3039665762966016649</id><published>2010-03-27T17:39:00.001-03:00</published><updated>2010-03-27T17:39:41.736-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='worldst'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pyweek'/><category scheme='http://www.blogger.com/atom/ns#' term='pyar'/><title type='text'>El más juego más grande del más mundo!</title><content type='html'>Para quienes siempre quisieron participar en el desarrollo de un juego, esta es su oportunidad, y ni siquiera necesitan saber programar! :)&lt;br /&gt;Gente de PyAr (Python Argentina) va a participar de la PyWeek, una semana de competencia en la que el objetivo es desarrollar un juego. Pero lo interesante es que van a permitir que cualquier persona pueda aportar contenido al juego, diseñando tus propios mini-juegos dentro de él.&lt;br /&gt;Para enterarse de más y participar, entren a:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://the.most.biggest.gamest.in.the.worldst.com.ar/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="115" src="http://4.bp.blogspot.com/_WhgSMw0NcSs/S65sU7BcRxI/AAAAAAAARKY/Daqb6SWthCo/s320/worldst.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-3039665762966016649?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/3039665762966016649/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/03/el-mas-juego-mas-grande-del-mas-mundo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/3039665762966016649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/3039665762966016649'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/03/el-mas-juego-mas-grande-del-mas-mundo.html' title='El más juego más grande del más mundo!'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_WhgSMw0NcSs/S65sU7BcRxI/AAAAAAAARKY/Daqb6SWthCo/s72-c/worldst.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-3422892219840102250</id><published>2010-03-25T14:31:00.001-03:00</published><updated>2010-03-25T14:32:43.725-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='censura'/><category scheme='http://www.blogger.com/atom/ns#' term='prensa'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='china'/><title type='text'>La prensa en China</title><content type='html'>&lt;p&gt;Cómo la mayoría sabrá, Google cerró su sitio de China (www.google.cn) por no estar de acuerdo con la censura que el gobierno de ese país le obligaba a tener. El gobierno habló públicamente sobre la decisión, pero también envió las siguientes instrucciones a todos los medios de prensa del país, acerca de cómo deben informar sobre el asunto.&lt;br /&gt;Después de leerlas, siento pena por la población de China. Es una dictadura peor de lo que pensaba...&lt;/p&gt;&lt;p&gt;(sacado del Washington Post, lo traduje rápido para que lo puedan leer quienes no sepan inglés)&lt;/p&gt;&lt;p&gt;A todos los editores en jefe y administradores:&lt;br /&gt;Google ha oficialmente anunciado su retirada del mercado de China. Este es un incidente de alto impacto. Ha desatado discusiones de los usuarios de internet que no están limitadas al ámbito comercial. Por ende por favor presten estricta atención a los siguientes requerimientos para el contenido durante este período:&lt;br /&gt;&lt;br /&gt;A. Secciones de noticias:&lt;br /&gt;&lt;br /&gt;1. Solo utilicen el contenido del sitio web del Gobierno Central; no utilicen contenido de otras fuentes.&lt;br /&gt;&lt;br /&gt;2. Al hacer re-posting no deben cambiar el título. (n. del t.: re-posting = postear el contenido en otro sitio)&lt;br /&gt;&lt;br /&gt;3. Las recomendaciones de lectura deben apuntar al sitio principal de contenido del Gobierno Central.&lt;br /&gt;&lt;br /&gt;4. No produzcan páginas de tópico relevante; no creen sesiones de discusión; no lleven a cabo reportes de investigaciones relacionadas.&lt;br /&gt;&lt;br /&gt;5. Programas en linea con expertos y estudiantes sobre esta materia deben solicitar autorización por adelantado. Este tipo de producción de programas auto iniciada está estrictamente prohibido.&lt;br /&gt;&lt;br /&gt;6. Administren cuidadosamente los comentarios en los post de noticias.&lt;br /&gt;&lt;br /&gt;B. Foros, blogs, y otros tipos de secciones interactivas:&lt;br /&gt;&lt;br /&gt;1. No está permitido mantener discusiones o investigaciones sobre el tópico de Google.&lt;br /&gt;&lt;br /&gt;2. Las secciones interactivas no deben recomendar este tópico, no posicionen este tópico y comentarios relacionados al inicio.&lt;br /&gt;&lt;br /&gt;3. Todos los sitios por favor quiten todo texto, imagen y sonido y video que ataque al Partido, Estado, agencias del gobierno, políticas de Internet con la excusa de este evento.&lt;br /&gt;&lt;br /&gt;4. Todos los sitios por favor quiten todo texto, imagen y sonido y video que apoye a Google, dedique flores a Google, pida a Google quedarse, felicite a Google y otros que tengan un tono diferente al de la política del gobierno.&lt;br /&gt;&lt;br /&gt;5. En tópicos relacionados a Google, administren cuidadosamente los intercambios de información, comentarios y otras sesiones interactivas.&lt;br /&gt;&lt;br /&gt;6. Administradores en jefe de las diferentes regiones por favor asignen esfuerzo humano específico para monitorear la información relacionada a Google; si existen información acerca de incidentes en masa, por favor repórtenlos con el tiempo suficiente.&lt;br /&gt;&lt;br /&gt;Le solicitamos al Grupo de Monitoreo y Control un seguimiento inmediato del monitoreo y control de las acciones detalladas en las directivas anteriores; cuando cualquier problema sea descubierto, por favor ponganse en contacto con las respectivas sesiones con el tiempo suficiente.&lt;br /&gt;&lt;br /&gt;Lineamientos adicionales:&lt;br /&gt;&lt;br /&gt;-- No participen ni reporten en los comunicados de prensa/información de Google.&lt;br /&gt;&lt;br /&gt;-- No reporten acerca de Google ejerciendo presión en nuestro país por medio de personas o eventos.&lt;br /&gt;&lt;br /&gt;-- Los reportes relacionados deben poner nuestra historia/perspectiva/información en el centro, no provean a Google de materiales con los cuales atacar políticas relevantes de nuestro país.&lt;br /&gt;&lt;br /&gt;-- Utilicen los puntos de vista acerca de Google abandonando China publicados por los departamentos relevantes.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Fuente: &lt;a href="http://www.washingtonpost.com/wp-dyn/content/article/2010/03/24/AR2010032402511.html"&gt;artículo del Washington Post&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-3422892219840102250?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/3422892219840102250/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/03/la-prensa-en-china.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/3422892219840102250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/3422892219840102250'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/03/la-prensa-en-china.html' title='La prensa en China'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-7784794800091507968</id><published>2010-03-15T23:40:00.001-03:00</published><updated>2010-03-15T23:40:31.743-03:00</updated><title type='text'>n900</title><content type='html'>un detalle que vale mas que mil palabras: el n900 trae de fabrica una consola de linux instalada :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-7784794800091507968?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/7784794800091507968/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/03/n900.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/7784794800091507968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/7784794800091507968'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/03/n900.html' title='n900'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-7719818349711770441</id><published>2010-03-08T18:51:00.002-03:00</published><updated>2010-03-08T18:55:40.658-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pycamp'/><category scheme='http://www.blogger.com/atom/ns#' term='opencv'/><category scheme='http://www.blogger.com/atom/ns#' term='pyar'/><title type='text'>PyCamp 2010, día 4</title><content type='html'>&lt;p&gt;Bueno, ya estoy en Retiro, en un rato estoy saliendo para Rafaela. Así que posteo el resumen de hoy. Probablemente después haga un post más completo con mis conclusiones de lso 4 días.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Algo muy interesante de hoy fué el hacking con OpenCV. Se hizo un programita que detecta cuando hay una cara cerca del monitor, si no hay nadie pone solo el protector de pantalla, y si hay alguien lo saca. Está genial :).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Y a la tarde se hizo el cierre, donde se expuso brevemente las cosas que se habían logrado en cada uno de los proyectos, y se charlaron algunas ideas para el próximo PyCamp, y PyCon.&lt;br /&gt;&lt;p&gt;Estoy muerto, pero estuvo todo muy, muy bueno. Después haré el resumen. Saludos!!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-7719818349711770441?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/7719818349711770441/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/03/pycamp-2010-dia-4.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/7719818349711770441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/7719818349711770441'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/03/pycamp-2010-dia-4.html' title='PyCamp 2010, día 4'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-2596854781436584151</id><published>2010-03-07T20:39:00.003-03:00</published><updated>2010-03-07T20:49:38.509-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='pycamp'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='paquetes'/><category scheme='http://www.blogger.com/atom/ns#' term='pyar'/><title type='text'>Pycamp 2010, día 3</title><content type='html'>&lt;p&gt;Resumen de hoy :)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A la mañana me quedé medio dormido, jeje, porque anoche nos habíamos quedado hasta las 4 a.m.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A la siesta participé en un mini-cursito de empaquetado de aplicaciones Python para Debian. La verdad que era más complejo de lo que esperaba, pero nada que un programador no pueda hacer. Conclusión: tengo que aprender setuptools&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Más tarde participé en el Bug Day de Python: cada uno elegía algún bug de Python y trataba de mandar un parche con la corrección. No pude hacer ningún parche, pero aprendí un poco viendo código de cómo está hecho Python, lo que estuvo bueno.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Y ahora a la noche, después de comer empanadas y panqueques, vuelvo a programar un poco el juego que empezamos el sábado.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Saludos!!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;update!: me acabo de enganchar en una reunión de otro juego que se va a desarrollar para una competencia, veremos que onda :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-2596854781436584151?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/2596854781436584151/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/03/pycamp-2010-dia-3.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/2596854781436584151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/2596854781436584151'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/03/pycamp-2010-dia-3.html' title='Pycamp 2010, día 3'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-7873830243363863618</id><published>2010-03-07T18:32:00.000-03:00</published><updated>2010-03-07T18:33:30.178-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocos2d'/><category scheme='http://www.blogger.com/atom/ns#' term='pycamp'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pyar'/><title type='text'>PyCamp 2010, día 2</title><content type='html'>&lt;p&gt;Ayer no postee porque no tuve tiempo en todo el día, así que posteo ahora el resumen. Supongo que esta noche volveré a postear con el resumen de hoy&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Lo más interesante de ayer fue el sprint de Django. Sprint = gente que se junta a programar, Django = framework para hacer desarrollo web usando Python, el mejor que probé hasta ahora. O sea, los que querían se juntaron para sobre todo corregir bugs en Django, para la versión nueva que va a salir dentro de unos días. Sinceramente fui más que nada para ver y aprender, porque pensaba que estaba a un nivel en el que yo no podía aportar mucho. Pero para mi sorpresa, terminamos corrigiendo un bug de Django juntos con Javi :). Mi granito de arena para Django, así devuelvo algo de todo lo que me está sirviendo.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Por la tarde me enganché en el momento de cocos2d (el framework para juegos que nació en un PyCamp anterior, que estamos usando para el juego que empezamos el sábado). Me enganché medio tarde, pero estuvo bueno, me ayudó a entenderlo mejor.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Finalmente, a la noche tuvimos el "fogón", pero sin fuego porque no se consiguió leña. Se empezó hablando de los temas más comunitarios, objetivos, realidad de Python en Argentina, etc. Se habló también de PyCon Atlanta 2010 y PyCon Argentina 2010. Y después se terminó hablando de política, sociedad, valores, ideologías, etc. Discusiones acaloradas pero muy interesantes. Algo parecido a los threads de PyAr, jajaja.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Hoy viene siendo interesante también, pero esta noche hago el resumen. Saludos!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-7873830243363863618?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/7873830243363863618/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/03/pycamp-2010-dia-2.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/7873830243363863618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/7873830243363863618'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/03/pycamp-2010-dia-2.html' title='PyCamp 2010, día 2'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-6542739649365569488</id><published>2010-03-05T21:22:00.003-03:00</published><updated>2010-03-05T21:34:42.234-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocos2d'/><category scheme='http://www.blogger.com/atom/ns#' term='pycamp'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>PyCamp 2010, día 1</title><content type='html'>&lt;p&gt;No voy a hacer un post muy completo, eso lo dejo para cuando vuelva. Pero cada día voy a postear un breve resumen de como pasé/pasamos el día.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;El viaje fue largo... salí de Rafaela el jueves a las 11 de la noche, y recién llegamos al lugar hoy a las 13, justo para la comida :).&lt;br /&gt;El lugar muy bueno. Todavía no pude recorrer mucho, pero tiene hasta para hacer cayack (o como se escriba, jeje).&lt;br/&gt;&lt;br /&gt;Está todo super organizado el tema de wifi, hay cables y antenas atadas con cinta por las paredes, jeje. Y por suerte no se necesitó usar mi router (hubiese sido para renegar nomás).&lt;br/&gt;&lt;br /&gt;Lo primero que se hizo a la tarde fué presentar todos los proyectos, y anotar cuántos interesados había en cada uno. A partir de eso se organizó un cronograma, armado como para favorecer la participación el los proyectos más votados. Pero todos los proyectos quedaron en el cronograma, y cada uno elije en cuáles participar y cuáles no :).&lt;br/&gt;&lt;br /&gt;De hoy, el proyecto en el que más participé y me interesó fue el de desarrollo de un juego de tipo "Tower Defense", usando la librería para juegos en Python COCOS2D. Es una librería que se había empezado a desarrollar en un PyCamp anterior, jeje.&lt;br/&gt;&lt;br /&gt;La verdad que tenía miedo de no poder aportar mucho, pero en un rato nomás ya estaba a tono y codeando para modificar la lógica de disparo de las torres :D.&lt;br/&gt;&lt;br /&gt;Y ahora, a la noche, algunos seguimos codeando, mientras otros están con juegos de mesa, o más relajados.&lt;br/&gt;&lt;br /&gt;La gente hasta ahora genial!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-6542739649365569488?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/6542739649365569488/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/03/pycamp-2010-dia-1.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/6542739649365569488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/6542739649365569488'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/03/pycamp-2010-dia-1.html' title='PyCamp 2010, día 1'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-5206280320326333317</id><published>2010-03-04T15:38:00.005-03:00</published><updated>2010-03-04T15:45:57.541-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='patentes'/><category scheme='http://www.blogger.com/atom/ns#' term='htc'/><category scheme='http://www.blogger.com/atom/ns#' term='legal'/><category scheme='http://www.blogger.com/atom/ns#' term='fraude'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Apple vs HTC</title><content type='html'>&lt;p&gt;Alguien vio el detalle de las pantentes que Apple esta usando para demandar a HTC? Es un desastre, tienen patentadas cosas que existen desde hace 20 años, que existían mucho antes de cualquier iPhone. No se cómo les da la cara para hacer algo así...&lt;br /&gt;Una de las pantentes por ejemplo, es sobre tener objetos en memoria que se refieren a elementos en la pantalla. Cualquier programa con ventanas tiene eso! Existe desde hace décadas!!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Cualquiera que sabe de programación, viendo el detalle de las patentes &lt;a href="https://lwn.net/SubscriberLink/376793/10114a6d3effac11/"&gt;aquí&lt;/a&gt;, puede darse cuenta del fraude que esto es. La mayoría de las pantentes son sobre cosas que no inventó Apple, y que existían desde hacía años antes que el iPhone...&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Nunca me había gustado mucho Apple, pero después de esto, sinceramente la imagen que tenía de ellos cayó hasta lo más hondo. En lugar de competir haciendo mejores productos, están tratando de matar a la competencia con un fraude legal...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-5206280320326333317?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/5206280320326333317/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/03/apple-vs-htc.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/5206280320326333317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/5206280320326333317'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/03/apple-vs-htc.html' title='Apple vs HTC'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-6190731256978661079</id><published>2010-02-22T10:56:00.008-03:00</published><updated>2010-02-22T16:41:18.737-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Debian en G1 con Android 2.1</title><content type='html'>&lt;p&gt;Bueno, después de lo que anduve renegando, pude hacer andar Debian en una HTC Dream con Android 2.1.&lt;br /&gt;Anoche me senté un rato y armé tutoriales para que otros puedan hacerlo si les interesa, junto con los archivos necesarios.&lt;br /&gt;&lt;br /&gt;Es algo bastante raro y específico, a pocos les va a interesar, pero para esos pocos escribo :)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;En mi G1 estoy corriendo Android 2.1, con la ROM KiNgxKxlicK AOSP 2.1 versión 1.6.1&lt;br /&gt;&lt;br /&gt;&lt;a href="http://forum.xda-developers.com/showthread.php?t=622170"&gt;Aquí&lt;/a&gt; pueden bajarla, no voy a hacer un instructivo sobre cómo instalarla porque el tema de ROMs en Android es más que extenso, y hay muchos tutoriales dando vueltas por la web.&lt;br /&gt;&lt;br /&gt;Puede que los pasos que detallo en este tutorial no funcionen exactamente igual en otras ROMs y otros dispositivos, pero con probar no se pierde nada más que tiempo :).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lo que sí o sí es necesario, es que la ROM que estén usando sea rooteada (es decir, que tengan permisos de root).&lt;/b&gt; Si no es una ROM rooteada, no van a poder hacer andar ni el instalador, jeje.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Para hacer andar Debian en Android, me basé en el contenido de dos foros que hablaban sobre el tema, más algunas modificaciones de las que me di cuenta solo. Al final agrego los links a esos foros para quienes quieran profundizar o ver la info original. El verdadero mérito va para los autores de esos posts, ya que lo que yo hice fueron pequeñas modificaciones sobre su trabajo.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Finalmente, asumo que quien quiere correr Debian en su celular es porque conoce un mínimo de Linux. No me voy a detener a explicar cómo editar un archivo de texto por línea de comando, ni cosas por el estilo, jeje.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Qué tal anda?&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;La verdad que anda mucho mejor de lo que yo esperaba. Recordemos que se trata de un celular, un aparato con recursos muy limitados. Pero con esos recursos se puede llegar incluso a levantar una interfaz gráfica.&lt;br /&gt;&lt;br /&gt;Sin interfaz gráfica es un pájaro: vuela. Con la interfaz gráfica es un reptil: se arrastra, jeje.&lt;br /&gt;&lt;br /&gt;Además, al levantar la interfaz gráfica puede suceder que el equipo se quede sin memoria RAM y empiece a cerrar aplicaciones para liberar memoria. Y al cerrar aplicaciones, puede cerrarnos el Debian que está corriendo de fondo, lo que resulta muy molesto.&lt;br /&gt;&lt;br /&gt;Yo particularmente lo uso por linea de comandos, sin nada de interfaz gráfica, así que no tengo problemas.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Me puede romper el celular?&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;En los posts originales aclaran que lo que se hace no afecta al sistema operativo del celular (Android), por lo que no debería haber riesgos. Igual no me hago responsable por lo que a cada uno pueda pasarle en su celular por seguir los pasos que aquí detallo.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Tutorial&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;A) Instalar Debian&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;    &lt;li&gt;Bajar los archivos necesarios desde este link: &lt;a href="http://www.megaupload.com/?d=JU2200V1"&gt;debian_aosp21_fisadev.zip&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Conectar el celular a la PC en modo de almacenamiento, o sacarle la SD y conectarla a la PC con un adaptador o lector de tarjetas.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Crear en la memoria SD una carpeta con nombre "debian", y descomprimir dentro los archivos que contiene el zip.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Volver a colocar la SD en el celular, o desconectarlo de la PC.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Por seguridad, reiniciar el celular, ya que en algunas ocasiones el sistema de archivos queda como de solo lectura.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Desde un emulador de consola/terminal en el celular, ejecutar:&lt;br /&gt;&lt;pre&gt;su&lt;br /&gt;cd /sdcard/debian&lt;br /&gt;sh installer.sh&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;    &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;B) Iniciar Debian y configurar las cosas básicas&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Con lo hecho antes Debian ya está instalado, pero necesitamos levantarlo y hacer algunas configuraciones iniciales.&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;    &lt;li&gt;Desde un emulador de consola/terminal en el celular, ejecutar:&lt;br /&gt;        &lt;pre&gt;su&lt;br /&gt;cd /sdcard/debian&lt;br /&gt;sh bootdeb&lt;/pre&gt;&lt;br /&gt;    &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Esto va a iniciar Debian. Cuando haya terminado de iniciar (les deja el prompt para empezar a escribir), ejecutar:&lt;br /&gt;    &lt;pre&gt;sh /scripts/onetime.sh&lt;/pre&gt;&lt;br /&gt;    Esto nos va a pedir configurar una contraseña para el usuario root. Háganlo, es necesario.&lt;br /&gt;    &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Agregamos algunos repositorios básicos. Editamos el archivo &lt;b&gt;/etc/apt/sources.list&lt;/b&gt; agregándole al final:&lt;/li&gt;&lt;br /&gt;    &lt;pre&gt;deb http://ftp.debian.org/debian lenny main contrib non-free&lt;br /&gt;deb-src http://ftp.debian.org/debian lenny main contrib non-free&lt;/pre&gt;&lt;br /&gt;    &lt;li&gt;Agregamos la configuración básica para que pueda utilizar la conexión de internet wifi del celular. Editamos el archivo &lt;b&gt;/etc/network/interfaces&lt;/b&gt; y le agregamos al final:&lt;/li&gt;&lt;br /&gt;    &lt;pre&gt;auto tiwlan0&lt;br /&gt;iface tiwlan0 inet dhcp&lt;/pre&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Después de hacer esto, tenemos que salir de Debian ejecutando:&lt;br /&gt;&lt;pre&gt;exit&lt;/pre&gt;&lt;br /&gt;Ahora, cada vez que queramos levantar Debian, ejecutamos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;su&lt;br /&gt;cd /sdcard/debian&lt;br /&gt;sh bootdeb&lt;/pre&gt;&lt;br/&gt;&lt;br /&gt;Y siempre hay que salir usando "exit" (y no cerrando la aplicación así nomás)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Con esto ya es suficiente para tener un Debian desde línea de comandos. Los tutoriales que siguen son completamente opcionales.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;C) Aumentar el tamaño del sistema de archivos&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;El Debian que tenemos instalado corre sobre un sistema de archivos contenido en un archivo de imagen, el debian.img. Esa imagen puede resultar un poco chica si vamos a instalar un entorno gráfico, o muchas aplicaciones. Así que si necesitamos hacerla más grande, estos son los pasos:&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;    &lt;li&gt;&lt;b&gt;Prestar atención&lt;/b&gt; a dónde se debe ejecutar cada comando, si en el celular o en la PC!.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Conectar el celular a la PC en modo de almacenamiento, o sacarle la SD y conectarla a la PC con un adaptador o lector de tarjetas.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Copiar el archivo debian.img de la SD a una carpeta en la PC, que a partir de ahora llamaremos PATH_PC&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Desde la consola/terminal de la pc, ejecutar esto reemplazando TAMAÑO por el tamaño que queramos. Ejemplo: para 3.5 GB poner 3500999999:&lt;br /&gt;&lt;pre&gt;cd PATH_PC&lt;br /&gt;dd if=/dev/zero of=debian2.img seek=TAMAÑO bs=1 count=1 &lt;br /&gt;mke2fs -F debian2.img&lt;br /&gt;mkdir debian&lt;br /&gt;mkdir debian2&lt;br /&gt;mount -o loop debian.img debian&lt;br /&gt;mount -o loop debian2.img debian2&lt;br /&gt;cd PATH_PC/debian&lt;br /&gt;cp -R -f * PATH_PC/debian2&lt;br /&gt;umount debian&lt;br /&gt;umount debian2&lt;/pre&gt;&lt;br /&gt;(si no funciona reinicar la pc y volver a intentar)&lt;br /&gt;&lt;pre&gt;cd PATH_PC&lt;br /&gt;rm -r -f debian&lt;br /&gt;rm -r -f debian2&lt;br /&gt;rm debian.img&lt;br /&gt;mv debian2.img debian.img&lt;br /&gt;chmod a+x debian.img&lt;br /&gt;chmod 777 debian.img&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;    &lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Copiar el archivo debian.img de la PC a la carpeta debian de la SD.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Volver a colocar la SD en el celular, o desconectarlo de la PC.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Por seguridad, reiniciar el celular, ya que en algunas ocasiones el sistema de archivos queda como de solo lectura.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Desde un emulador de consola/terminal en el celular, ejecutar:&lt;br /&gt;&lt;pre&gt;su&lt;br /&gt;cd /sdcard/debian&lt;br /&gt;sh bootdeb&lt;/pre&gt;&lt;br /&gt;(eso nos inicia Debian, ya deberían saberlo, jeje)&lt;br /&gt;&lt;pre&gt;cd /var/lib/dpkg/updates&lt;br /&gt;rm -r -f *&lt;br /&gt;dpkg --configure -a&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;    &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Después de hacer esto, tenemos ya un Debian con mucho más tamaño para jugar :D&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;D) Instalar un entorno gráfico&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Para asombrar a nuestros linuxeros amigos, podemos instalar un entorno gráfico completo y jugar con nuestro Android como si fuese una PC de escritorio. Se arrastra de lento, y a veces se cierra solo por falta de memoria, pero anda al menos por los segundos necesarios para causar el efecto "waaaaah!" :)&lt;br/&gt;&lt;br /&gt;Recordemos que si queremos instalar un entorno gráfico, deberíamos aumentar el tamaño del sistema de archivos.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Como los pasos no cambiaron del tutorial original, les dejo directamente el link a ese tutorial (si en algún momento desaparece, tengo una copia local, pidanme y la subo):&lt;/p&gt;&lt;br /&gt;&lt;a href="http://www.androidfanatic.com/cms/community-forums.html?func=view&amp;catid=9&amp;id=1620#1615"&gt;Instalar entorno gráfico.&lt;/a&gt;&lt;br /&gt;&lt;p&gt;(Está en inglés, si alguien necesita traducción, pida nomás)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;E) Links originales&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://www.androidfanatic.com/cms/community-forums.html?func=view&amp;catid=9&amp;id=2248#2248"&gt;Instalar Debian en HTC Dream.&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://www.androidfanatic.com/cms/community-forums.html?func=view&amp;catid=9&amp;id=1610#1610"&gt;Cambiar el tamaño del sistema de archivos.&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://android.modaco.com/content/htc-hero-hero-modaco-com/292093/debian-lenny-now-running-on-hero/#entry1060825"&gt;Instalar Debian en HTC Hero.&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-6190731256978661079?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/6190731256978661079/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/02/bueno-despues-de-lo-que-anduve.html#comment-form' title='13 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/6190731256978661079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/6190731256978661079'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/02/bueno-despues-de-lo-que-anduve.html' title='Debian en G1 con Android 2.1'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-5677530882109583003</id><published>2010-02-19T10:42:00.002-03:00</published><updated>2010-02-19T10:46:17.888-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='consola'/><title type='text'>Windows PowerShell</title><content type='html'>&lt;p&gt;Alguien vió lo que es PowerShell? Es una uber-copia de la consola de Linux, pero para Windows y hecha por Microsoft. Y no digo que es copia porque los veo parecidos o porque sea fan de Linux. Lo digo porque pusieron hasta los mismos comandos! "ls", "ps", "diff", "more", "man", "cp", "mv"...&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Al menos no me siento tan "fuera de casa" en la maquina del trabajo, jeje...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-5677530882109583003?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/5677530882109583003/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/02/windows-powershell.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/5677530882109583003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/5677530882109583003'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/02/windows-powershell.html' title='Windows PowerShell'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-2935105018901549696</id><published>2010-02-16T01:27:00.011-03:00</published><updated>2010-02-16T01:38:39.005-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opinion'/><category scheme='http://www.blogger.com/atom/ns#' term='crackers'/><category scheme='http://www.blogger.com/atom/ns#' term='hackers'/><title type='text'>Hackers vs. Crackers</title><content type='html'>&lt;p&gt;En un post de Buzz recomendé un libro para "hackers", e inmediatamente (ni 5 minutos) alguien por chat me preguntó por qué lo recomendaba a "piratas". Me hizo acordar que la mayoría tiene una idea bastante errada de lo que significa la palabra "hacker", así que posteo esta lectura obligatoria para cualquiera que quiera usar esa palabra:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;(extracto de un escrito de Eric Raymond. El tipo no me cae bien, pero acá tiene razón)&lt;/p&gt;&lt;br /&gt;&lt;q&gt;&lt;p&gt;Existe una comunidad, una cultura compartida, de programadores expertos y magos de las redes, cuya historia se remonta décadas atrás a los tiempos de los primeros miniordenadores de tiempo compartido y los tempranos experimentos con ARPAnet. Los miembros de esta cultura crearon el término "hacker". Los hackers construyeron Internet. Los hackers hicieron de Unix el sistema operativo que es hoy día. Los hackers hacen andar Usenet. Los hackers hacen funcionar la WWW. Si eres parte de esta cultura, si has contribuido a ella y otras personas saben quién eres y te llaman hacker, entonces eres un hacker.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;(...)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Existe otro grupo de personas que se llaman a sí mismos hackers, pero que no lo son. Son personas (generalmente varones adolescentes) que se divierten irrumpiendo ilegalmente en ordenadores y haciendo "phreaking" en el sistema teléfonico. Los auténticos hackers tienen un nombre para esas personas: "crackers", y no quieren saber nada de ellos. Los auténticos hackers opinan que la mayoría de los crackers son perezosos, irresponsables y no muy brillantes, y fundamentan su crítica en que &lt;b&gt;ser capaz de romper la seguridad no le hace a uno un hacker, de la misma manera que ser capaz de arrancar un coche con un puente en la llave no le convierte en ingeniero de automotores&lt;/b&gt;. Desafortunadamente, muchos periodistas y escritores utilizan erróneamente la palabra "hacker" para describir a los crackers; esto causa enorme irritación a los auténticos hackers.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;La diferencia básica es esta: &lt;b&gt;los hackers construyen cosas; los crackers las destruyen&lt;/b&gt;.&lt;/p&gt;&lt;/q&gt;&lt;br /&gt;&lt;p&gt;Para el que le interese, &lt;a href="http://espora.org/biblioweb/hacker-como.html"&gt;este&lt;/a&gt; es el texto completo.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-2935105018901549696?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/2935105018901549696/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/02/hackers-vs-crackers.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/2935105018901549696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/2935105018901549696'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/02/hackers-vs-crackers.html' title='Hackers vs. Crackers'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-30895536866871144</id><published>2010-02-12T10:53:00.005-03:00</published><updated>2010-02-12T11:03:32.164-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='buzz'/><category scheme='http://www.blogger.com/atom/ns#' term='opinion'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Google Buzz</title><content type='html'>&lt;p&gt;Qué me gusta y qué no me gusta de Google Buzz:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li style="color:#307816;"&gt;Una buena excusa para no usar Facebook, así la gente deja de insistirme en que me una al "libro de caras".&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#307816;"&gt;Lindo reemplazo para Twitter, me es más cómodo tenerlo integrado en el correo que tener que loguearme en otro sitio nuevo.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#307816;"&gt;Mucha gente que conozco lo puede ver, no como me sucedía con Twitter (no es tan usado por estos lados).&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#307816;"&gt;Se integra bien con otras cosas que uso, como Blogspot, Google Reader y Picasa Web. De hecho este post es de mi blog, y aparece solo tambien en Buzz :D.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#307816;"&gt;Cómodo, simple, no sobrecargado. Bien a la "google way"&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#307816;"&gt;Se puede desactivar, aunque muchos no se den cuenta. Vean abajo de todo de Gmail.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#CC0000;"&gt;Se metió un poco a la fuerza, no daba muchas opciones para no probarlo, y el link para desactivarlo es casi invisible.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#CC0000;"&gt;Todas las cosas son públicas por defecto: posts, listas de seguidores, etc. A mi no me afecta, pero a mucha gente sí, y por ello no debería ser de esa forma.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#CC0000;"&gt;Me llegan los Buzz a la casilla de correo, odio eso. Por cada Buzz nuevo en una conversación que haya participado, me aparece un no leído en dos lugares diferentes: Buzz y Recibidos, y tengo que sí o sí archivarlo o eliminarlo desde Recibidos (si lo leo desde Buzz, el mail no leído sigue estando). Eso es MUY molesto.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#CC0000;"&gt;No es tan visualmente fácil darse cuenta de los Buzz no leídos.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-30895536866871144?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/30895536866871144/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/02/buzz.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/30895536866871144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/30895536866871144'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/02/buzz.html' title='Google Buzz'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-6123153209797487952</id><published>2010-01-29T10:07:00.004-03:00</published><updated>2010-01-29T10:10:07.316-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sitio'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='regular expressions'/><title type='text'>Python Regular Expressions</title><content type='html'>&lt;p&gt;Bueno, me complace anunciarles mi pequeño aporte a la comunidad pythónica:&lt;/p&gt;&lt;br /&gt;&lt;a href="http://pythonregex.appspot.com"&gt;Python Regular Expressions&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;El sitio aún es beta, revienta en unos cuantos lugares. Pero lo voy a seguir puliendo en mis ratos libres.&lt;br/&gt;&lt;br /&gt;Espero que les guste y les sea útil!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-6123153209797487952?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/6123153209797487952/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/01/python-regular-expressions.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/6123153209797487952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/6123153209797487952'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/01/python-regular-expressions.html' title='Python Regular Expressions'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-3179226437157951501</id><published>2010-01-27T08:54:00.004-03:00</published><updated>2010-01-28T09:14:12.820-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='templates'/><title type='text'>If en los templates de Django 1.2 (alpha)</title><content type='html'>&lt;p&gt;Una de las cosas que mencioné en el post anterior sobre frameworks web, fue que en Django el sistema de templates tenía algunas cosas que no me terminaban de convencer.&lt;br/&gt;&lt;br /&gt;Más específicamente, no me agradaba demasiado que sea bastante limitado (aunque sea intencionalmente), y que redefinía una sintaxis a veces rara para cosas que eran comunes, y que todos estamos acostumbrados a hacer de otra manera.&lt;br/&gt;&lt;br /&gt;Ejemplo: si queríamos hacer un If comparando si dos variables son iguales, en lugar de un clásico "if a == b", teníamos que escribir algo como "ifequals a b" (una sintaxis que me recuerda más a LISP que a Python, jeje).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;En estos días se liberó la versión &lt;a href="http://www.djangoproject.com/weblog/2010/jan/06/12-alpha-1/"&gt;1.2 alpha 1 de Django&lt;/a&gt;, y para mi felicidad, descubrí que el tag "if" de los templates está muy renovado. Ahora lo veo mucho más natural y Pythónico!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Entre otras cosas, permite hacer cosas como "if a == b", "if a &lt; b", o con cualquier otro operador de la lista normal de operadores de comparación.&lt;br/&gt;&lt;br /&gt;También permite mezclar ands y ors en la misma sentencia, algo que antes no se permitía y limitaba un poco.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://docs.djangoproject.com/en/dev/releases/1.2-alpha-1/"&gt;Notas de release de Django 1.2 alpha 1.&lt;/a&gt;&lt;br/&gt;&lt;br /&gt;&lt;a href="http://docs.djangoproject.com/en/dev/releases/1.2-alpha-1/#smart-if-tag"&gt;Link directo a la sección sobre el tag if.&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-3179226437157951501?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/3179226437157951501/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/01/if-en-los-templates-de-django-12-alpha.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/3179226437157951501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/3179226437157951501'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/01/if-en-los-templates-de-django-12-alpha.html' title='If en los templates de Django 1.2 (alpha)'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-7488355124161726244</id><published>2010-01-25T16:07:00.029-03:00</published><updated>2010-01-28T09:13:47.364-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='web2py'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Rails, Django, Web2py</title><content type='html'>&lt;p&gt;&lt;b&gt;No voy a hacer una comparación objetiva&lt;/b&gt;. Lo aclaro desde el principio.&lt;br/&gt;&lt;br /&gt;Lo que quiero escribir en este post es simplemente un breve resumen de mi &lt;b&gt;opinión&lt;/b&gt; sobre los tres frameworks basado en mi propia experiencia. Es super subjetiva, y estoy abierto a que me cuenten los demás qué opinan.&lt;/p&gt; &lt;br /&gt;&lt;p&gt;No quiero con esto convencer a nadie de usar uno u otro framework. Creo que lo mejor es que cada uno experimente y decida por sí mismo.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Por razones de longitud, no voy a incluir las cosas buenas o malas que son comunes a los tres frameworks. Ya todos sabemos que plantean metodologías avanzadas, agilizan el desarrollo, etc. Voy a destacar solo lo que en mi experiencia, diferenció (para bien o para mal) a cada uno.&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Rails&lt;/h3&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li style="color:#307816;"&gt;Fue mi puerta de entrada al mundo del desarrollo web, tengo que reconocerle eso. Si no fuese por Rails nunca me hubiese agradado ese mundo.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#307816;"&gt;Tiene algunas utilidades que para un novato pueden ayudar mucho, aunque después no se usen tanto. Ej: scaffolds.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#307816;"&gt;Posee una comunidad muy activa y abierta, que lo hace conocer y avanzar mucho. Y además es una comunidad muy distendida, agradable.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#307816;"&gt;Su documentación es muy buena, detallada y con ejemplos útiles. Realmente ayuda a aprenderlo.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#CC0000;"&gt;Me obligaba a hacer las cosas de una determinada manera, cuando a veces prefería hacerlas de otra. No me dejaba demasiada libertad para elegir cómo hacer las cosas.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#CC0000;"&gt;En algunos aspectos suele ser complicado innecesariamente (IMHO). En especial, las migrations y la estructura de archivos, que opino pueden simplificarse enormemente sin perder funcionalidad.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h3&gt;Django&lt;/h3&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li style="color:#307816;"&gt;Muy flexible. Propone una manera de hacer las cosas pero deja casi total libertad para hacerlas como uno considere mejor, y sin tener que "romper" nada o meterse en código extraño.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#307816;"&gt;Enfoque más simplista, pero sin dejar de ser explícito y potente. (me gusta que sea explícito porque me ayuda a entender lo que sucede, y no tener que confiar en la "magia")&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#307816;"&gt;Aprovecha mucho el dinamismo de Python. Los CRUD de la aplicación de administración son un excelente ejemplo: detectan la estructura de los modelos y arman los forms y listados de forma dinámica.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#307816;"&gt;Comunidad activa, abierta y agradable como la de Rails, y a veces bastante &lt;a href="http://djangopony.com/"&gt;delirante&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#307816;"&gt;Exelente documentación e información. El &lt;a href="http://www.djangobook.com/"&gt;Django Book&lt;/a&gt; y la documentación oficiales son muy buenos.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#CC0000;"&gt;No me termina de cerrar el sistema de templates. Entiendo el argumento de los diseñadores y la separación de lógica de presentación, pero creo que se le podría dar más potencia. Aunque me gusta muchísimo el sistema de bloques, da mucha flexibilidad.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Web2py&lt;/h3&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li style="color:#307816;"&gt;Muy, muy sencillo de instalar y poner en marcha por primera vez. En eso es ideal para novatos. Django y Rails están lejos en este aspecto.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#307816;"&gt;También es muy sencillo de aprender y utilizar, a veces bastante más que Django o Rails.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#307816;"&gt;Me gustó mucho la idea de poder editar los archivos del sitio, desde el sitio mismo. En tiempo de desarrollo resulta muy útil.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#CC0000;"&gt;Pero su simplicidad se logra ocultando al desarrollador muchas de las cosas que suceden. Cuando surge un problema, no siempre se llega a comprender lo que está pasando.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#CC0000;"&gt;Similar a lo que sucedía con Rails, suele obligar a hacer las cosas de una determinada manera y dificulta hacerlas de otra forma.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#CC0000;"&gt;Prefiero mucho más un ORM como ActiveRecord o el ORM de Django, antes que la DAL que provee web2py.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#CC0000;"&gt;Su desarrollo es cerrado. Todos pueden aportar ideas o parches, pero hay una única persona que es dueña del proyecto y que decide su destino, y el destino del aporte de cada uno.&lt;/li&gt;&lt;br /&gt;&lt;li style="color:#CC0000;"&gt;Poca documentación. El libro oficial solo puede verse gratuitamente en scribd (muy molesto), y si se quiere el PDF hay que pagarlo.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-7488355124161726244?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/7488355124161726244/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2010/01/rails-django-web2py.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/7488355124161726244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/7488355124161726244'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2010/01/rails-django-web2py.html' title='Rails, Django, Web2py'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-1251471373752561731</id><published>2009-12-18T01:53:00.011-03:00</published><updated>2009-12-20T22:10:20.673-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogs'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pygments'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Coloreando Python en blogs y html</title><content type='html'>&lt;p&gt;Algo que me hizo renegar bastante hace poco, fueron mis ganas de que el código de ejemplo en python que posteaba en el blog tuviese coloreo de sintaxis.&lt;br/&gt;&lt;br /&gt;Pasé por varias opciones, y por lejos esta fue la que me resultó más práctica para usar en blogspot o cualquier otro sistema de blogs que permita editar el html del blog. Su practicidad se debe sobre todo a que no necesito hostear archivos extras en ningún lado.&lt;/p&gt;&lt;p&gt;Armé un instructivo bastante sencillo de cómo lograrlo:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;1) Instalar Pygments&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Vamos a generar un html localmente a partir de un archivo de python, usando el paquete Pygments. Para instalarlo, podemos hacerlo con easy_install (paquete "pygments"), buscándolo y bajándolo de PyPi, o bajando sus fuentes (más info &lt;a href="http://pygments.org/download/"&gt;aquí&lt;/a&gt;):&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;2) Generar el HTML con Pygments&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Teniendo instalado Pygments, podemos usarlo para generar un HTML coloreado a partir de un archivo de código python. No voy a explicar todas las alternativas, solo la que a mí me resulta práctica (para más info, vean &lt;a href="http://pygments.org/docs/quickstart/"&gt;aquí&lt;/a&gt;):&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;$ pygmentize -O noclasses -o pagina.html codigo.py &lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Nos copiamos el contenido del html generado, lo ponemos dentro de nuestro post, y voila! Python coloreado en nuestro blog :D. Les dejo un ejemplito:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: #008000; font-weight: bold"&gt;import&lt;/span&gt; &lt;span style="color: #0000FF; font-weight: bold"&gt;antigravity&lt;/span&gt; &lt;br /&gt; &lt;br /&gt;&lt;span style="color: #008000; font-weight: bold"&gt;print&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;wee, python!&amp;quot;&lt;/span&gt; &lt;br /&gt; &lt;br /&gt;&lt;span style="color: #008000; font-weight: bold"&gt;class&lt;/span&gt; &lt;span style="color: #0000FF; font-weight: bold"&gt;Foo&lt;/span&gt;:&lt;br /&gt;    &lt;span style="color: #BA2121; font-style: italic"&gt;&amp;quot;&amp;quot;&amp;quot;Foo fighters&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: #008000; font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #0000FF"&gt;__init__&lt;/span&gt;(&lt;span style="color: #008000"&gt;self&lt;/span&gt;):&lt;br /&gt;        &lt;span style="color: #008000"&gt;self&lt;/span&gt;&lt;span style="color: #666666"&gt;.&lt;/span&gt;bar &lt;span style="color: #666666"&gt;=&lt;/span&gt; &lt;span style="color: #BA2121"&gt;&amp;quot;donde sirven cerveza&amp;quot;&lt;/span&gt; &lt;br /&gt;        &lt;br /&gt;    &lt;span style="color: #008000; font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #0000FF"&gt;baz&lt;/span&gt;(&lt;span style="color: #008000"&gt;self&lt;/span&gt;):&lt;br /&gt;        &lt;span style="color: #BA2121; font-style: italic"&gt;&amp;quot;&amp;quot;&amp;quot;Vamos al bazaar&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt; &lt;br /&gt;        &lt;span style="color: #008000; font-weight: bold"&gt;print&lt;/span&gt; &lt;span style="color: #008000"&gt;self&lt;/span&gt;&lt;span style="color: #666666"&gt;.&lt;/span&gt;bar&lt;br /&gt;    &lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Espero que les haya sido útil!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-1251471373752561731?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/1251471373752561731/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2009/12/coloreando-python-en-blogs-y-html.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/1251471373752561731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/1251471373752561731'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2009/12/coloreando-python-en-blogs-y-html.html' title='Coloreando Python en blogs y html'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-4374115858548999486</id><published>2009-12-17T12:08:00.005-03:00</published><updated>2009-12-17T12:16:37.843-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='opinion'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>De Windows Mobile a Android</title><content type='html'>&lt;div&gt;Desde hace años que soy usuario de celulares con Windows Mobile. Los conocí por el trabajo (hacemos aplicaciones para ese tipo de aparatos), y rápidamente me entusiasmaron.&lt;br/&gt;&lt;br /&gt;Lo que más me atraía era la idea de tener una computadora en el bolsillo. Y tengo que admitir que en gran parte es así con Windows Mobile: las aplicaciones, la manera de administrar los archivos, la interface, etc., siempre se sentía cierta similitud con el mundo desktop. Y me gustaba.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Pero a la mayoría de los usuarios comunes eso mismo les complicaba la existencia: no esperan eso de un celular, sino que buscan que sea mucho más simple y práctico que una pc.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Y se ve que esto es algo que quienes diseñaron Android conocían muy bien.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Hace poco más de un mes, decidí mudarme al mundo Android: me compré una HTC G1.&lt;br/&gt;&lt;br /&gt;Al empezar a usarla el cambio se sintió. Era evidente que el objetivo del sistema operativo no era replicar una PC en el bolsillo, sino otra cosa diferente. Y por eso los primeros días me sentí "raro", como incómodo.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Pero esa sensación duró poco más de un día. Hoy ya no puedo imaginarme volver a Windows Mobile.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Comento un poco las principales cosas que me hacen pensar así, desde el punto de vista de usuario (no de desarrollador para la plataforma):&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;1) Verdaderamente táctil&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Todo en Android está pensado para usar con los dedos. De hecho, la G1 ni siquiera trae stylus! (el "palito", jeje). Y no para dedos de aguja, todo lo contrario: tenés que usar las cosas con el dedo gordo, es la manera más cómoda y a la que mejor responde.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;En Windows Mobile la interface del sistema operativo ni por casualidad es usable con los dedos. Hay interfaces de terceros más adaptadas para ello, como PointUI, o Touch Flo 3D, pero ninguna se acerca al nivel de usabilidad de Android. Siempre terminás sacando el stylus para realizar algunas tareas.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Parecería un tema superficial, pero de verdad es un aspecto central en un dispositivo móvil, es determinante en su facilidad de uso. No se puede, por ejemplo, caminar por la vereda mientras se está escribiendo con un palito sobre una pantalla de 3 pulgadas (al menos no sin correr el riesgo de chocarse un poste). Pero sí es posible hacerlo con una interfaz como la de Android, escribiendo con los dedos como lo hacemos con cualquier otro celular no táctil.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;2) Practicidad:&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Aparte del aspecto táctil, la otra gran ventaja de la interface de Android es su facilidad de uso, su practicidad.&lt;br/&gt;&lt;br /&gt;Las funciones casi siempre están visibles, fácilmente accesibles. En comparación a Windows Mobile se usan poco los menúes y se aprovecha más la pantalla para mostrar botones grandes (y ni hablar que más lindos gráficamente :D).&lt;br/&gt;&lt;br /&gt;Y donde hay menúes, también son grandes y con íconos (en Windows Mobile casi siempre son listas de textos a las que es difícil acertar si no es con el stylus).&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Y la configuración de la mayoría de las cosas, en mi opinión, resulta bastante más sencilla. No hay opciones que uno vea y piense "y esto qué hará??", como pasaba en Windows Mobile (ejemplos: las opciones de "autenticación PAP o cHAP" para la línea de celular, o el tilde de "Funcionalidad de Red Avanzada" en la configuración de la conexión usb, ...).&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;3) Velocidad:&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Windows Mobile pone tanto énfasis en la velocidad como el resto de los productos de Microsoft (Windows vista, Visual Studio, ...). Yo me había acostumbrado a esperar para cosas básicas, como abrir los mensajes.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Android no será tan rápido como iPhone, pero está bien por encima de Windows Mobile. Y eso es algo que se siente mucho en el uso diario del aparato.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;4) Organización de la información:&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;En Windows Mobile estaba muy acostumbrado a manejar mis archivos en estructuras de carpetas, de igual manera que en mi pc de escritorio.&lt;br/&gt;&lt;br /&gt;Cuando me mudé a Android me di cuenta de que, por más que podía hacerlo con aplicaciones de terceros, Android en sí mismo no me mostraba en ninguna parte un árbol de carpetas y archivos.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Primero me hizo sentir que de alguna forma me "restringía". Pero después entendí que es mucho más cómoda la manera en que Android me presenta la información: una idea más cercana a la de bibliotecas. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;Para abrir una foto no tengo que navegar por carpetas hasta el lugar donde se haya guardado. En su lugar, entro a la aplicación Galería, que me presenta todo lo que es multimedia agrupado por tipos de elementos: videos, fotos, fotos sacadas con la cámara, etc. No necesito recordar dónde estaba almacenada :D.&lt;br/&gt;&lt;br /&gt;(sí, tengo que admitir que la galería de HTC Touch Flo 3D era así. Pero eso es algo que no es parte de Windows Mobile, es una aplicación de HTC, un tercero).&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;5) Integración con herramientas web&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Me encanta que todo lo que tengo en el celular esté perfectamente sincronizado con mi cuenta de correo en internet: contactos, calendario y correo.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;(no tengamos en cuenta a Exchange, estamos hablando de usuarios finales)&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Ya sé, en Windows Mobile también se puede sincronizar todo. Pero en Windows Mobile si quería mantener esas tres cosas tenía que tener el correo y los contactos sincronizados con Hotmail, y el calendario sincronizado con MyPhone.&lt;br/&gt;&lt;br /&gt;Recordemos que Hotmail también tiene calendario... ¿será que en Microsoft creen que las personas viven dos vidas en simultaneo?, una planificada con el calendario de Hotmail, y otra planificada con el calendario del Celular (sincronizado con MyPhone).&lt;br/&gt;&lt;br /&gt;En lugar de desarrollar MyPhone, ¿por qué simplemente no permiten sincronizar el calendario de Windows Mobile con el de Hotmail?&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Conclusión&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Esas son las cosas que como usuario me transformaron en partidario de Android. No hablo como desarrollador, por más que lo soy, sino como usuario diario de los celulares.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Ustedes que opinan?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-4374115858548999486?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/4374115858548999486/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2009/12/de-windows-mobile-android.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/4374115858548999486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/4374115858548999486'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2009/12/de-windows-mobile-android.html' title='De Windows Mobile a Android'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-693397354655292989</id><published>2009-12-10T11:38:00.005-03:00</published><updated>2009-12-10T11:46:52.589-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programacion'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Frameworks web y lenguajes</title><content type='html'>&lt;div&gt;Hace poco en la lista de correos de Ruby Argentina, alguien dijo una frase que me quedó picando en la mente: "Usar rails es la peor forma de aprender ruby :)".&lt;/div&gt;&lt;div&gt;Para quien no los conoce, Ruby es un lenguaje de programación muy interesante, y Ruby on Rails (o directamente Rails) es un framework para hacer aplicaciones web con Ruby (fué el que disparó a la fama al lenguaje).&lt;/div&gt;&lt;div&gt;(mas info sobre ruby &lt;a href="http://www.ruby-lang.org/es/"&gt;aquí&lt;/a&gt;, y sobre Rails &lt;a href="http://rubyonrails.org/"&gt;aquí&lt;/a&gt;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;No voy a debatir sobre las opiniones que salieron en la lista, y no voy a detenerme en qué habrá querido expresar la persona que lo dijo. &lt;b&gt;Solo voy a comentar las cosas que a mí me hizo pensar.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Voy a generalizar un poco más, y "meter en la bolsa" a Django, un framework para aplicaciones web con Python bastante similar a Rails (info de Django &lt;a href="http://www.djangoproject.com/"&gt;aquí&lt;/a&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Me detengo solo en esos dos porque son los que usé para desarrollos reales, a los demás los conozco de vista/probar solamente.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;La fiebre de la web (casi como la del oro)&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La web es un terreno del desarrollo de software que está avanzando a velocidad imparable, no hace falta ser muy observador para darse cuenta (Google Docs, cloud computing, y muchas otras palabras de moda). Y por ello puede resultar tentador para alguien que nunca desarrolló web, pasarse a ese nuevo mundo de moda y con futuro.&lt;/div&gt;&lt;div&gt;Pero cuando la gente se pasa a una nueva tecnología esperando obtener beneficios de ella, y no solo por "amor al arte", generalmente espera resultados rápidos. Pocos estarían dispuestos a esperar un año hasta tener conocimientos como para poder hacer su primer sitio web.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ahí es donde estos frameworks se ponen tentadores: una de las principales ventajas que ofrecen es el desarrollo rápido de aplicaciones. Rails tiene su famoso video de "un blog en 15 minutos", por ejemplo.&lt;/div&gt;&lt;div&gt;Y es verdad, comparados con otras tecnologías agilizan enormemente el desarrollo web. Traen resueltas un montón de problemáticas comunes. La aplicación de administración de Django es un ejemplo excelente: toda la administración del sitio ya resuelta "de fábrica" (autenticación, usuarios, permisos, ABMs de entidades, etc.).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Los caminos se separan&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En este punto es donde nos encontramos con dos situaciones muy diferentes:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) El desarrollador desktop de Python/Ruby, que aprovechando su conocimiento del lenguaje elije un framework web del mismo.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2) El desarrollador de otros lenguajes, que atraído por las ventajas de alguno de estos frameworks decide comenzar a desarrollar con él, lo que le implicará aprender también el nuevo lenguaje.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;No hace falta decir que el camino para el desarrollador de la situación 1) es bastante simple. Además tengamos en cuenta que estos frameworks suelen seguir muy al pie de la letra la filosofía del lenguaje, por lo que se sentirá "como en casa".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lo que preocupa es el camino del segundo desarrollador.&lt;/div&gt;&lt;div&gt;¿Por qué? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Aprendiendo a correr sin saber caminar&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En primer lugar, estos frameworks asumen que uno posee conocimientos del lenguaje. Un tutorial de Django no va a explicar el manejo de listas de Python, por ejemplo.&lt;/div&gt;&lt;div&gt;Entonces va a ser una situación bastante normal la de encontrarse con partes de los tutoriales que no se lleguen a comprender del todo, porque al ver el código no "salta a la vista" tan fácil lo que está haciendo.&lt;/div&gt;&lt;div&gt;Y para empeorar la situación, muchas veces esto va a llevar a escribir código "porque estaba así en el tutorial", pero sin tener la menor idea de lo que hace. No es necesario mencionar los problemas de mantenimiento que una aplicación así puede tener...&lt;/div&gt;&lt;div&gt;Esa razón sola debería bastar para tener que aprender primero el lenguaje.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Y aunque logre entender dicho código, seguramente no va a conocer muchísimas cosas más que podría aprovechar del lenguaje para el desarrollo de su aplicación. Sus herramientas se van a limitar a lo que se muestra normalmente con el framework, probablemente desconociendo muchas otras facilidades que el lenguaje le brinda.&lt;/div&gt;&lt;div&gt;(&lt;a href="http://fisadev.blogspot.com/2009/12/python-dinamismo-aplicado.html"&gt;mi post anterior&lt;/a&gt; habla sobre algo relacionado)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Como antes recordamos, estos frameworks también suelen seguir muy bien la filosofía de sus lenguajes respectivos. Por ende, alguien que no conoce esa filosofía tendrá un trabajo extra para "acomodarse" a la nueva manera de hacer las cosas.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Además, los frameworks toman muchas decisiones de diseño, y adoptan convenciones (muy fuertes sobre todo en Rails), que son buenas para el framework pero no necesariamente son buenas para otros entornos. El problema es que el programador que aprende el lenguaje desde dichas convenciones, seguramente asumirá que no existen otras maneras de hacer las cosas, o que si existen no son las correctas.&lt;/div&gt;&lt;div&gt;Este "vicio" no va a tener consecuencias directas en su etapa de desarrollador sobre ese framework, pero sí las va a tener cuando intente probar otros frameworks del mismo lenguaje, ya que no necesariamente el que aprendió es el mejor framework para todos los casos.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Conclusión&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Por estas razones es que opino que antes de aprender uno de estos frameworks, es muy, muy saludable dedicar un tiempo a aprender el lenguaje a secas, sin web, como vino al mundo :D&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;De hecho, pude comprobarlo en mi experiencia personal:&lt;/div&gt;&lt;div&gt;- Intenté aprender Ruby on Rails directamente, sin conocer Ruby. Pude, pero seguramente no llegué a ver todo lo que es Ruby y a comprenderlo bien. Y me solía pasar de tener la sensación de que no sabía cómo funcionaban las cosas.&lt;/div&gt;&lt;div&gt;- Con Python me tomé el tiempo para aprender bien el lenguaje, y recién después comencé con Django. El pasaje fue natural, y me siento con mucho más control de lo que hago. Siento que lo entiendo y que puedo "sacarle bien el jugo".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;¿Que opinan?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-693397354655292989?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/693397354655292989/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2009/12/frameworks-web-y-lenguajes.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/693397354655292989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/693397354655292989'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2009/12/frameworks-web-y-lenguajes.html' title='Frameworks web y lenguajes'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-7188972577143570854</id><published>2009-12-09T13:39:00.020-03:00</published><updated>2009-12-10T00:20:34.984-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opinion'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programacion'/><title type='text'>Python: Dinamismo aplicado</title><content type='html'>Me suele pasar que cuando comento alguna característica superior de un lenguaje a otra persona que no lo conoce, la persona reaccione con frases del estilo "y eso cuando lo vas a usar en la realidad?", o "todo muy lindo, pero eso es para la teoría, en la práctica no sirve", etc...&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Es normal, ya que al no estar acostumbrado a pensar de una manera distinta, no va a ver tan fácilmente la utilidad de dicha característica.&lt;/div&gt;&lt;div&gt;Estas no son grandes iluminaciones mías, jeje, son ideas que Paul Graham explicó muy bien en &lt;a href="http://paulgraham.com/avg.html"&gt;este&lt;/a&gt; artículo (recomendado).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pero lo que sí puedo aportar desde mi humilde experiencia, es un buen ejemplo de cómo una característica puede sonar "muy rara", pero cuando es bien aprovechada, puede resultar "muy práctica".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Puede haber cientos de cosas equivocadas en lo que estoy por decir, estaría bueno que me hagan conocer al menos algunas :D&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;La característica "extraña"&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ahora es donde hace su entrada la característica "extraña" que tiene Python. Va a sonar "extraña" para quien no esté acostumbrado a cosas por el estilo, se entiende.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La característica es la función getattr: llamándola podemos obtener un atributo o método de un objeto.&lt;/div&gt;&lt;div&gt;Este ejemplo es bien ilustrativo:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="n"&gt;yo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;juan pedro&amp;quot;&lt;/span&gt; &lt;br /&gt;&lt;span class="n"&gt;met&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;upper&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;br /&gt;&lt;span class="n"&gt;met&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;   &lt;span class="c"&gt;#esto nos devuelve &amp;quot;JUAN PEDRO&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Para explicarlo un poquito: &lt;/div&gt;&lt;div&gt;Con getattr(yo, "upper") obtuvimos el método upper del objeto yo.&lt;/div&gt;&lt;div&gt;Atención! Dije "obtuvimos el método", no "el resultado de llamar al método". Son cosas bien diferentes.&lt;/div&gt;&lt;div&gt;Obtener el método es como darle un nuevo nombre con el cual después podemos llamarlo, como hicimos en "met()". Met es un nuevo nombre para llamar a ese método en particular, el método upper de yo.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Es destacable que usar una variable (met en este caso) es algo que hice solo para que sea más entendible a primera vista. Pero lo anterior perfectamente puede escribirse como:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="n"&gt;yo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;juan pedro&amp;quot;&lt;/span&gt; &lt;br /&gt;&lt;span class="nb"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;upper&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)()&lt;/span&gt;   &lt;span class="c"&gt;#esto nos devuelve &amp;quot;JUAN PEDRO&amp;quot;&lt;/span&gt; &lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;No guardamos el método en una variable, simplemente lo llamamos en ese momento. Lo obtenemos y lo llamamos en una misma línea.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;El problema&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tenemos una clase Foo. Esta clase Foo define 5 acciones diferentes, que se representan con 5 métodos: accion1, accion2, accion3, accion4, accion5.&lt;/div&gt;&lt;div&gt;La complicación se da en el hecho de que cada una de estas acciones es realizada comunicándose con un servicio, y hay 4 servicios completamente diferentes en los cuales se pueden realizar las acciones: A, B, C y D.&lt;/div&gt;&lt;div&gt;Ejemplo:&lt;/div&gt;&lt;div&gt;"Hacer acción 1 en el servicio B"&lt;/div&gt;&lt;div&gt;"Hacer acción 3 en el servicio D"&lt;/div&gt;&lt;div&gt;etc...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En la implementación, cada servicio cambia por completo el código que se tiene que ejecutar para realizar una acción. Es decir, el código de la acción 1 para el servicio A es completamente diferente al código de la acción 1 para el servicio B, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La clase Foo necesita recibir el nombre del servicio como un parámetro de cada acción, para saber en qué servicio ejecutarla. De forma que después se utilice de la siguiente manera:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="n"&gt;miFoo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;    &lt;span class="c"&gt;#creamos un nuevo objeto foo&lt;/span&gt; &lt;br /&gt;&lt;span class="n"&gt;miFoo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accion1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;A&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c"&gt;#llamamos a la accion 1 en el servicio A&lt;/span&gt; &lt;br /&gt;&lt;span class="n"&gt;miFoo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accion1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c"&gt;#llamamos a la accion 1 en el servicio C&lt;/span&gt; &lt;br /&gt;&lt;span class="n"&gt;miFoo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accion3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;B&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c"&gt;#llamamos a la accion 3 en el servicio B&lt;/span&gt; &lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Primer solución "no dinámica"&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Para muchos de los que lean esto, la primera solución que les vendrá a la mente será que cada método (accionX...) tenga dentro de sí un gran if, para cada servicio. Algo así:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;br /&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;accion1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;servicio&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;br /&gt;      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;servicio&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;A&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;br /&gt;          &lt;span class="c"&gt;#codigo de la accion 1 en el servicio A&lt;/span&gt; &lt;br /&gt;      &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;servicio&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;B&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;br /&gt;          &lt;span class="c"&gt;#codigo de la accion 1 en el servicio B&lt;/span&gt; &lt;br /&gt;      &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;servicio&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;br /&gt;          &lt;span class="c"&gt;#codigo de la accion 1 en el servicio C&lt;/span&gt; &lt;br /&gt;      &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;servicio&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;D&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;br /&gt;          &lt;span class="c"&gt;#codigo de la accion 1 en el servicio D&lt;/span&gt; &lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Esto va a funcionar, eso no lo voy a negar. ¿Pero qué es lo que no me gusta de esta opción? No me gustan estas cosas:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) Este if va a estar repetido en cada una de las acciones, que son 5. Cuando se agreguen o modifiquen servicios, tengo que mantener actualizado el mismo if en los 5 métodos "accionX".&lt;/div&gt;&lt;div&gt;2) El código rápidamente se hace ilegible cuando es mucho código por acción.&lt;/div&gt;&lt;div&gt;3) Da la sensación de que estamos "amontonando" peras con manzanas, que esto podría separarse un poco para ordenarse mejor.&lt;/div&gt;&lt;div&gt;4) Estos if son 2 lineas por cada acción y servicio, con lo que para 5 acciones en 4 servicios, son 40 líneas de código solamente en los if, no incluyendo el código de las acciones mismas. Son 40 líneas de código que no hacen lo que queremos hacer, y que las necesitamos solo para decidir qué código ejecutar.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Mejorando la solución "no dinámica"&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Para el problema del amontonamiento y el orden, a más de uno ya se le debe haber ocurrido la solución. Algo así:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;br /&gt;   &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;accion1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;servicio&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;br /&gt;       &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;servicio&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;A&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;br /&gt;           &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accion1_en_A&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;br /&gt;       &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;servicio&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;B&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;br /&gt;           &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accion1_en_B&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;br /&gt;       &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;servicio&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;br /&gt;           &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accion1_en_C&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;br /&gt;       &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;servicio&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;D&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;br /&gt;           &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accion1_en_D&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;br /&gt; &lt;br /&gt;   &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;accion1_en_A&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;br /&gt;           &lt;span class="c"&gt;#codigo de la accion 1 en el servicio A&lt;/span&gt; &lt;br /&gt; &lt;br /&gt;   &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;accion1_en_B&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;br /&gt;           &lt;span class="c"&gt;#codigo de la accion 1 en el servicio B&lt;/span&gt; &lt;br /&gt; &lt;br /&gt;   &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;accion1_en_C&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;br /&gt;           &lt;span class="c"&gt;#codigo de la accion 1 en el servicio C&lt;/span&gt; &lt;br /&gt; &lt;br /&gt;   &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;accion1_en_D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;br /&gt;           &lt;span class="c"&gt;#codigo de la accion 1 en el servicio D&lt;/span&gt; &lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;No puedo negarlo, la separación en varios métodos ayuda un poco a la legibilidad y mantenibilidad. Consideremos esa parte como resuelta y correcta, nos olvidamos de los métodos "accionX_en_Y".&lt;/div&gt;&lt;div&gt;Pero tenemos todavía esto:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;accion1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;servicio&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;br /&gt;   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;servicio&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;A&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;br /&gt;       &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accion1_en_A&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;br /&gt;   &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;servicio&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;B&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;br /&gt;       &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accion1_en_B&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;br /&gt;   &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;servicio&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;br /&gt;       &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accion1_en_C&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;br /&gt;   &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;servicio&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;D&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;br /&gt;       &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accion1_en_D&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Esto es lo que sigue sin gustarme. ¿Por qué?&lt;/div&gt;&lt;div&gt;Porque seguimos teniendo el problema de los ifs horribles desparramados por todos lados.&lt;/div&gt;&lt;div&gt;Seguimos teniendo que mantener esas 40 líneas de código que solo sirven para elegir el código a ejecutar.&lt;/div&gt;&lt;div&gt;Mi opinión es que debería poder hacerse de otra forma.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;La rareza viene al rescate: La solución dinámica&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bien, en teoría la cosa rara debería ahora ayudarnos con nuestro problema. ¿Y cómo nos va a ayudar esa cosa rara de Python?. &lt;/div&gt;&lt;div&gt;Recordemos que nos habíamos olvidado del código de los métodos "accionX_en_Y", esos estaban aprobados :). Lo feo era el código que elegía cuál método ejecutar según el servicio.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Veamos entonces la versión "rara" de ese código:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;accion1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;servicio&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;br /&gt;   &lt;span class="nb"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;accion1_en_&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;servicio&lt;/span&gt;&lt;span class="p"&gt;)()&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Se nota lo que falta?? Ya no tenemos al if!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Antes teníamos esas 40 líneas de ifs, 8 líneas por cada acción que solo decidían qué código ejecutar. Ahora esa decisión se toma con 1 línea en cada acción, con lo que nos quedan (con 5 acciones) un total de.... 5 lineas!&lt;/div&gt;&lt;div&gt;5 líneas contra 40 es un ahorro del 87% menos de código.&lt;/div&gt;&lt;div&gt;Cuidado. La cuestión no es "tener pocas líneas porque es más lindo". En este caso, la ventaja es no tener que mantener código repetitivo e innecesario.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Y no solo eso, ganamos también otra ventaja muy importante: Si mañana agregamos o sacamos servicios, no es necesario tocar nada del código que elige el método a ejecutar. Solo agregamos las implementaciones (métodos accionX_en_Y), y la clase sabrá por si sola llamarlos, sin que tengamos que decirle nada extra. Así de práctico.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Conclusión&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En un ejemplo bastante simple, se ve cómo una característica "extraña", bien usada puede transformarse en una característica "práctica".&lt;/div&gt;&lt;div&gt;Y cuidado, porque cuando se empiezan a aprovechar estas características, resulta bastante molesto volver a los lenguajes que no las tienen... Es adictivo, jeje.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;PD: crédito a C.B. que me mostró el artículo de Paul Graham :D&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-7188972577143570854?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/7188972577143570854/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2009/12/python-dinamismo-aplicado.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/7188972577143570854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/7188972577143570854'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2009/12/python-dinamismo-aplicado.html' title='Python: Dinamismo aplicado'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-5427342025178786930</id><published>2009-12-09T12:47:00.002-03:00</published><updated>2009-12-09T17:21:47.416-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='moviles'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Aplicaciones favoritas de Android</title><content type='html'>Otro día comentaré más de mi experiencia de haberme comprado un Android (les adelanto que no lo cambiaría por nada, jeje).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hoy solo dejo un listado que me armé de mis aplicaciones preferidas. Podrán ver que me pasé un buen rato probando cosas :D&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://docs.google.com/Doc?docid=0AZcCDhynqkqDZGRmZzhxaDlfMTAxZ2J2azl3aGc&amp;amp;hl=es"&gt;Mis Android Apps favoritas&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-5427342025178786930?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/5427342025178786930/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2009/12/aplicaciones-favoritas-de-android.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/5427342025178786930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/5427342025178786930'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2009/12/aplicaciones-favoritas-de-android.html' title='Aplicaciones favoritas de Android'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-4103599733570134410</id><published>2009-12-09T12:24:00.003-03:00</published><updated>2009-12-09T17:22:03.120-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programacion'/><title type='text'>Charla Python</title><content type='html'>Desde hace rato ya que me "pythonisé". Viniendo del mundo .Net, en Python descubrí muchísimas cosas que me agradan y me hacen sentir más "comodo" (tipado dinámico, simplicidad, dry, etc.). Pero ahora no vienen al caso, otro día las comento más en detalle :D&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lo que sí viene al caso es que, por lo que me gustó Python, vengo no solo aprendiendo, sino que siempre les comento a mis compañeros de trabajo sobre las cosas que voy descubriendo. Y como en la empresa hace poco resurgió un proyecto de que demos charlas a la comunidad, entonces me propusieron dar una sobre Python (ya que les hinchaba tanto... jeje).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Así que el miércoles 2 de diciembre dí esta charla, que salió bastante bien. Poca gente, pero creo que les sirvió a ellos y a mí.&lt;/div&gt;&lt;div&gt;Para darla preparé una presentación, orientada más que nada a quienes vienen de .Net (no hace una comparación explícita, pero sí ordena los temas para que les resulten más familiares).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Aquí les dejo el link a la presentación:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://docs.google.com/present/view?id=ddfg8qh9_92c6996nhh"&gt;http://docs.google.com/present/view?id=ddfg8qh9_92c6996nhh&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Y también les dejo un link al sitio de PyAr, a la sección Charlas, de donde saqué mucho material para armar la mía. Gracias PyAr!!!:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://python.org.ar/pyar/Charlas"&gt;http://python.org.ar/pyar/Charlas&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-4103599733570134410?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/4103599733570134410/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2009/12/charla-python.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/4103599733570134410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/4103599733570134410'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2009/12/charla-python.html' title='Charla Python'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-2143775097069338607</id><published>2009-12-09T12:20:00.005-03:00</published><updated>2009-12-09T17:22:30.938-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programacion'/><category scheme='http://www.blogger.com/atom/ns#' term='software libre'/><title type='text'>Mi segunda aplicación libre: Cuoty</title><content type='html'>Bueno, como verán sigo con el impulso de liberar software. :D&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En este caso estoy migrando una aplicación que antes había desarrollado a pedido de una parroquia, para la gestión de los aportantes (cuotas, cobradores, etc.).&lt;/div&gt;&lt;div&gt;En ese momento la había desarrollado con .Net, pero en este momento la estoy migrando a Python+Django, y al mismo tiempo haciéndola libre.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pueden sumarse al proyecto, seguirlo, o realizar comentarios en:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://code.google.com/p/cuoty"&gt;http://code.google.com/p/cuoty&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-2143775097069338607?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/2143775097069338607/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2009/12/mi-segunda-aplicacion-libre-cuoty.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/2143775097069338607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/2143775097069338607'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2009/12/mi-segunda-aplicacion-libre-cuoty.html' title='Mi segunda aplicación libre: Cuoty'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-1826623318541381518</id><published>2009-10-03T17:33:00.004-03:00</published><updated>2009-12-09T17:22:48.462-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programacion'/><category scheme='http://www.blogger.com/atom/ns#' term='software libre'/><title type='text'>Mi primer aplicacion libre: Wozo</title><content type='html'>Bueno, con felicidad comento que acabo de liberar mi primer aplicación de Software Libre: Wozo.&lt;div&gt;Es un gestor de menues de comida, para empresas u organizaciones donde la gente pide comida para comer en el lugar.&lt;/div&gt;&lt;div&gt;La idea central es permitir administrar los pedidos de manera sencilla.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Está desarrollada con Python y Django.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Para quienes quieran usarla o participar en el desarrollo, la aplicación está en Google Code:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://code.google.com/p/wozo/"&gt;http://code.google.com/p/wozo/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-1826623318541381518?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/1826623318541381518/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2009/10/mi-primer-aplicacion-libre-wozo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/1826623318541381518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/1826623318541381518'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2009/10/mi-primer-aplicacion-libre-wozo.html' title='Mi primer aplicacion libre: Wozo'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-4970127719218368286</id><published>2009-07-08T09:55:00.002-03:00</published><updated>2009-12-09T17:23:06.309-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='programacion'/><title type='text'>Instalar Emacs on Rails en Windows</title><content type='html'>&lt;div&gt;Instalar Emacs con los plugins para Ruby on Rails en Windows no resulta tan complejo una vez que se entendió bien todo, pero lleva una serie de pasos que hay que seguir bien al pie de la letra.&lt;/div&gt;&lt;div&gt;Algunas cosas podrían hacerse diferente, pero yo explico la manera en la cual a mi me pareció mejor hacerlo, y no explico las otras porque el tutorial se haría interminable :D (convención sobre configuración, jeje).&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;1)&lt;/b&gt; Bajar la última versión de Emacs, los binarios completos para Windows. Al momento de hacer este tutorial, la versión era la 22.3, así que si hay nuevas versiones habría que validar nuevamente el tutorial.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;2)&lt;/b&gt; Descomprimirlos en la carpeta que más nos guste.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;3)&lt;/b&gt; La carpeta HOME&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;En Linux/Mac, cada usuario tiene una carpeta Home donde se almacena su información. Emacs utiliza esta carpeta para almacenar su configuración, y para buscar librerías y plugins extras. El problema es que en Windows esta carpeta no existe. Por lo tanto tenemos que decirle de alguna manera a Emacs, cuál será la carpeta que utilizaremos como Home.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Como hacerlo: con una variable de entorno de Windows.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;- Click derecho en Mi PC,"Propiedades"&lt;/div&gt;&lt;div&gt;- Pestaña "Opciones Avanzadas"&lt;/div&gt;&lt;div&gt;- Botón "Variables de Entorno"&lt;/div&gt;&lt;div&gt;- En la sección de "Variables del Sistema", hacemos click en "Nueva".&lt;/div&gt;&lt;div&gt;Nombre: HOME&lt;/div&gt;&lt;div&gt;(respetar mayúsculas)&lt;/div&gt;&lt;div&gt;Valor: ruta de la carpeta que queramos usar como home&lt;/div&gt;&lt;div&gt;Ejemplo de Valor: C:\emacs_home\&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;4)&lt;/b&gt; Seguimos con la carpeta HOME:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Ya tenemos creada la Home, pero ahora hay que darle un poco de forma.&lt;/div&gt;&lt;div&gt;Creamos primero una carpeta que se llame ".emacs.d" . Nótese los puntos, la carpeta se llama PUNTO EMACS PUNTO DE. Esto genera un problema: el explorador de Windows no deja crear carpetas que empiecen con un punto.&lt;/div&gt;&lt;div&gt;Solución: lo hacemos desde la consola: abrimos la consola, nos posicionamos en la carpeta Home, y ejecutamos "mkdir .emacs.d"&lt;/div&gt;&lt;div&gt;(ver en el paso 6, como queda el árbol de directorios y archivos en la Home)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Además de esta carpeta, hace falta agregar un archivo de texto donde emacs leerá la configuración de los plugins: ".emacs". Una vez más, nótese los puntos, el archivo se llama PUNTO EMACS. Podemos crear el archivo con el block de notas, y ponerle otro nombre cualquiera. Después lo renombramos a ".emacs". Otra vez, Windows no deja nombrar archivos que empiecen con un punto. Una vez más, la solución está en la consola: vamos a la consola, nos posicionamos en el directorio Home, y ejecutamos "move nombre_anterior .emacs"&lt;/div&gt;&lt;div&gt;(ver en el paso 6, como queda el árbol de directorios y archivos en la Home)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;5)&lt;/b&gt; Rellenar el directorio .emacs.d&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Dentro de esta carpeta incluiremos todos los plugins y librerías que vamos a usar. En este caso, el plugin principal va a ser Emacs on Rails. Pero además, este necesita de otros plugins y librerías para funcionar. La lista completa, y como agregar cada uno al directorio de librerías:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;- CEDET&lt;/div&gt;&lt;div&gt;Descarga: &lt;a id="r3ri" href="http://cedet.sourceforge.net/" title="http://cedet.sourceforge.net/"&gt;http://cedet.sourceforge.net/&lt;/a&gt; (sección Downloads)&lt;/div&gt;&lt;div&gt;Versión: yo utilicé la 1.0pre6, porque la 1.4 es beta aún en el momento de hacer el tutorial&lt;/div&gt;&lt;div&gt;Instalación: descomprimir, y mover la carpeta "cedet-1.0pre6" dentro de ".emacs.d"&lt;/div&gt;&lt;div&gt;(ver en el paso 6, como queda el árbol de directorios y archivos en la Home)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;- ECB&lt;/div&gt;&lt;div&gt;Descarga: &lt;a id="q99g" href="http://ecb.sourceforge.net/" title="http://ecb.sourceforge.net/"&gt;http://ecb.sourceforge.net/&lt;/a&gt; (sección Downloads)&lt;/div&gt;&lt;div&gt;Versión: yo usé la 2.40, la última al momento de hacer el tutorial&lt;/div&gt;&lt;div&gt;Instalación: descomprimir, y mover la carpeta "ecb-2.40" dentro de ".emacs.d"&lt;/div&gt;&lt;div&gt;(ver en el paso 6, como queda el árbol de directorios y archivos en la Home)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;- snippet.el&lt;/div&gt;&lt;div&gt;Descarga: &lt;a id="kap." href="http://www.kazmier.com/computer/snippet.el" title="http://www.kazmier.com/computer/snippet.el"&gt;http://www.kazmier.com/computer/snippet.el&lt;/a&gt; (con esta url se accede directamente al contenido del archivo)&lt;/div&gt;&lt;div&gt;Instalación: crear un archivo con nombre "snippet.el", llenarlo con ese contenido, y mover el archivo a la carpeta ".emacs.d"&lt;/div&gt;&lt;div&gt;(ver en el paso 5, como queda el árbol de directorios y archivos en la Home)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;- find-recursive.el&lt;/div&gt;&lt;div&gt;Descarga: &lt;a id="gdvs" href="http://www.webweavertech.com/ovidiu/emacs/find-recursive.txt" title="http://www.webweavertech.com/ovidiu/emacs/find-recursive.txt"&gt;http://www.webweavertech.com/ovidiu/emacs/find-recursive.txt&lt;/a&gt; (con esta url se accede directamente al contenido del archivo)&lt;/div&gt;&lt;div&gt;Instalación: crear un archivo con nombre "find-recursive.el", llenarlo con ese contenido, y mover el archivo a la carpeta ".emacs.d"&lt;/div&gt;&lt;div&gt;(ver en el paso 6, como queda el árbol de directorios y archivos en la Home)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;- inf-ruby.el&lt;/div&gt;&lt;div&gt;Descarga: &lt;a id="fr4y" href="http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/misc/inf-ruby.el?view=co" title="http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/misc/inf-ruby.el?view=co"&gt;http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/misc/inf-ruby.el?view=co&lt;/a&gt; (con esta url se accede directamente al contenido del archivo)&lt;/div&gt;&lt;div&gt;Instalación: crear un archivo con nombre "inf-ruby.el", llenarlo con ese contenido, y mover el archivo a la carpeta ".emacs.d"&lt;/div&gt;&lt;div&gt;(ver en el paso 6, como queda el árbol de directorios y archivos en la Home)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;- ruby-mode.el&lt;/div&gt;&lt;div&gt;Descarga: &lt;a id="iu31" href="http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/misc/ruby-mode.el?view=co" title="http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/misc/ruby-mode.el?view=co"&gt;http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/misc/ruby-mode.el?view=co&lt;/a&gt; (con esta url se accede directamente al contenido del archivo)&lt;/div&gt;&lt;div&gt;Instalación: crear un archivo con nombre "ruby-mode.el", llenarlo con ese contenido, y mover el archivo a la carpeta ".emacs.d"&lt;/div&gt;&lt;div&gt;(ver en el paso 6, como queda el árbol de directorios y archivos en la Home)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;- ruby-electric.el&lt;/div&gt;&lt;div&gt;Descarga: &lt;a id="uakc" href="http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/misc/ruby-electric.el?view=co" title="http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/misc/ruby-electric.el?view=co"&gt;http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/misc/ruby-electric.el?view=co&lt;/a&gt; (con esta url se accede directamente al contenido del archivo)&lt;/div&gt;&lt;div&gt;Instalación: crear un archivo con nombre "ruby-electric.el", llenarlo con ese contenido, y mover el archivo a la carpeta ".emacs.d"&lt;/div&gt;&lt;div&gt;(ver en el paso 6, como queda el árbol de directorios y archivos en la Home)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;- emacs-rails&lt;/div&gt;&lt;div&gt;Descarga: &lt;a id="xv3l" href="http://rubyforge.org/projects/emacs-rails" title="http://rubyforge.org/projects/emacs-rails"&gt;http://rubyforge.org/projects/emacs-rails&lt;/a&gt; (sección Downloads)&lt;/div&gt;&lt;div&gt;Versión: yo usé la 0.5.99.5, la última al momento de hacer el tutorial&lt;/div&gt;&lt;div&gt;Instalación: descomprimir, y mover la carpeta "emacs-rails" dentro de ".emacs.d"&lt;/div&gt;&lt;div&gt;(ver en el paso 6, como queda el árbol de directorios y archivos en la Home)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;6)&lt;/b&gt; Resumen: cómo quedó el árbol de directorios&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Si hicimos todo bien, debería habernos quedado algo de esta manera:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;home_configurada\.emacs (archivo)&lt;/div&gt;&lt;div&gt;home_configurada\.emacs.d\ (directorio)&lt;/div&gt;&lt;div&gt;home_configurada\.emacs.d\cedet-1.0pre6 (directorio, dentro debería contener los directorios "semantic", "eieio", "speedbar", "commons", y otras cosas )&lt;/div&gt;&lt;div&gt;home_configurada\.emacs.d\ecb-2.40 (directorio, dentro debería contener muchos directorios y archivos)&lt;/div&gt;&lt;div&gt;home_configurada\.emacs.d\emacs-rails (directorio, dentro debería contener muchos archivos)&lt;/div&gt;&lt;div&gt;home_configurada\.emacs.d\find-recursive.el (archivo)&lt;/div&gt;&lt;div&gt;home_configurada\.emacs.d\inf-ruby.el (archivo)&lt;/div&gt;&lt;div&gt;home_configurada\.emacs.d\ruby-electric.el (archivo)&lt;/div&gt;&lt;div&gt;home_configurada\.emacs.d\ruby-mode.el (archivo)&lt;/div&gt;&lt;div&gt;home_configurada\.emacs.d\snippet.el (archivo)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;7)&lt;/b&gt; Rellenar el .emacs&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;El archivo .emacs dijimos que va a definir que plugins cargar, entre otras cosas. Para eso tenemos que rellenarlo con el siguiente contenido (el contenido se explica a si mismo, con comentarios):&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;;; rutas de las librerias previas&lt;/div&gt;&lt;div&gt;(add-to-list 'load-path "~/.emacs.d")&lt;/div&gt;&lt;div&gt;(load-file "~/.emacs.d/cedet-1.0pre6/common/cedet.el")&lt;/div&gt;&lt;div&gt;(add-to-list 'load-path "~/.emacs.d/ecb-2.40")&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;;; carga de ECB&lt;/div&gt;&lt;div&gt;(require 'ecb)&lt;/div&gt;&lt;div&gt;(require 'ecb-autoloads)&lt;/div&gt;&lt;div&gt;;; desactivar Tip of the Day de ECB&lt;/div&gt;&lt;div&gt;(setq ecb-tip-of-the-day nil)&lt;/div&gt;&lt;div&gt;;; activar abrir los archivos con click del mouse en ECB&lt;/div&gt;&lt;div&gt;(setq ecb-primary-secondary-mouse-buttons (quote mouse-1--mouse-2))&lt;/div&gt;&lt;div&gt;;; carga automatica de ECB&lt;/div&gt;&lt;div&gt;(ecb-activate)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;;; activar semantic&lt;/div&gt;&lt;div&gt;(setq semantic-load-turn-everything-on t)&lt;/div&gt;&lt;div&gt;(require 'semantic-load)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;;; activar rails mode&lt;/div&gt;&lt;div&gt;(add-to-list 'load-path "~/.emacs.d/emacs-rails")&lt;/div&gt;&lt;div&gt;(require 'rails)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;;; activar resaltado de sintaxis en ruby mode&lt;/div&gt;&lt;div&gt;(add-hook 'ruby-mode-hook 'turn-on-font-lock)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;;; activar autocompletar (ruby electric)&lt;/div&gt;&lt;div&gt;(defun try-complete-abbrev (old)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;(if (expand-abbrev) t nil))&lt;/div&gt;&lt;div&gt;(setq hippie-expand-try-functions-list&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; '(try-complete-abbrev&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; try-complete-file-name&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; try-expand-dabbrev))&lt;/div&gt;&lt;div&gt;(add-hook 'ruby-mode-hook&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (lambda()&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (add-hook 'local-write-file-hooks&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; '(lambda()&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(save-excursion&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(untabify (point-min) (point-max))&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(delete-trailing-whitespace)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)))&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (set (make-local-variable 'indent-tabs-mode) 'nil)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (set (make-local-variable 'tab-width) 2)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (imenu-add-to-menubar "IMENU")&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (require 'ruby-electric)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (ruby-electric-mode t)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ))&lt;/div&gt;&lt;div&gt;(custom-set-variables&lt;/div&gt;&lt;div&gt;&amp;nbsp;'(ecb-options-version "2.40"))&lt;/div&gt;&lt;div&gt;(custom-set-faces&lt;/div&gt;&lt;div&gt;&amp;nbsp;)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;8)&lt;/b&gt; Listo! ahora a usar Emacs&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Para ejecutar Emacs, volvamos a la carpeta donde lo habíamos descomprimido. Dentro de ella, tiene que haber una carpeta "bin", y dentro de bin, un archivo "runemacs.exe".&lt;/div&gt;&lt;div&gt;Este es el archivo que hay que abrir para ejecutar Emacs bajo Windows.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Cualquier problema, revisar el tutorial (en especial el árbol de directorios en el paso 6), y el contenido del .emacs del paso 7.&lt;/div&gt;&lt;div&gt;Si eso no lo soluciona, o hay dudas, respondo por mail a fisadev@gmail.com&lt;/div&gt;&lt;div&gt;No soy un experto, pero puedo hacer mi mejor esfuerzo :)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Y no puedo dejar de agradecer a &lt;b&gt;Gabriel Arellano&lt;/b&gt;, quien armó en el 2007 un tutorial para esto, que hoy me sirvió en gran medida para hacer funcionar todo, y para armar mi tutorial (el contenido del .emacs es en gran parte de su autoría, modificado solo por mí para adaptarse a las nuevas versiones).&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Saludos&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-4970127719218368286?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/4970127719218368286/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2009/07/instalar-emacs-on-rails-en-windows.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/4970127719218368286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/4970127719218368286'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2009/07/instalar-emacs-on-rails-en-windows.html' title='Instalar Emacs on Rails en Windows'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4759448024504207667.post-8636560753741055151</id><published>2009-07-08T09:51:00.002-03:00</published><updated>2009-12-09T17:23:18.056-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='programacion'/><title type='text'>Instalar Ruby en Windows</title><content type='html'>&lt;div&gt;&lt;p&gt;Bueno, la instalación de Ruby en Windows no es muy compleja si usamos la versión 1.8.6, que tiene un instalador que hace todo por nosotros.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;Pero si queremos usar la &lt;b&gt;1.8.7&lt;/b&gt; ya no es tan sencillo, ya que no hay un one-click installer de esta versión.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Luego de leer bastante para no hacer cualquier cosa, este es el pequeño tutorial que terminé armando sobre como instalar Ruby 1.8.7 en Windows:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;1)&lt;/b&gt; Descargar los binarios de la maquina virtual de ruby, y extraerlos en alguna carpeta. Recomendable hacerlo en C:\ruby\&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;2)&lt;/b&gt; Agregar [carpeta_de_ruby]\bin a la variable de entorno PATH&lt;/div&gt;&lt;div&gt;Ejemplo: si ubicamos la maquina virtual de ruby en C:\ruby, a PATH tenemos que agregarle C:\ruby\bin&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Para quien no sabe agregar rutas a PATH, se hace de esta manera:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;- Click derecho en Mi PC,"Propiedades"&lt;/div&gt;&lt;div&gt;- Pestaña "Opciones Avanzadas"&lt;/div&gt;&lt;div&gt;- Botón "Variables de Entorno"&lt;/div&gt;&lt;div&gt;- En la sección de "Variables del Sistema", buscamos la que se llama "Path".&lt;/div&gt;&lt;div&gt;- La modificamos, agregando el directorio [carpeta de ruby]\bin al final, separado por ";".&lt;/div&gt;&lt;div&gt;Ejemplo:&lt;/div&gt;&lt;div&gt;Si Path contenía:&lt;/div&gt;&lt;div&gt;"C:\Archivos de programa\Microsoft SQL Server\80\Tools\Binn\;C:\Archivos de programa\IDM Computer Solutions\UltraEdit-32;C:\ruby\bin"&lt;/div&gt;&lt;div&gt;Ahora contendrá:&lt;/div&gt;&lt;div&gt;"C:\Archivos de programa\Microsoft SQL Server\80\Tools\Binn\;C:\Archivos de programa\IDM Computer Solutions\UltraEdit-32;C:\ruby\bin;C:\ruby\bin"&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;3)&lt;/b&gt; Librerias necesarias:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Para que ruby funcione correctamente, van a ser necesarias algunas librerias que en Windows no tenemos por defecto.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Algunas librerías no tienen un instalador, y es necesario copiarlas manualmente. En muchos sitios recomiendan colocar dichas librerías en la carpeta [carpeta_de_windows]\System32. Pero según los mas experimentados, no es una buena práctica. Lo recomendable es colocar estas librerías en la carpeta [carpeta_de_ruby]\bin.&lt;/div&gt;&lt;div&gt;Si poseen instalador, entonces logicamente hay que usar el instalador.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Estas son algunas de las librerías que seguramente se van a necesitar en cualquier máquina. Me tomé el trabajo de colocar los links para conseguir las últimas versiones:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;- ssleay32.dll, libeay32.dll&lt;/div&gt;&lt;div&gt;&lt;a id="uuhz" href="http://www.slproweb.com/products/Win32OpenSSL.html" title="http://www.slproweb.com/products/Win32OpenSSL.html"&gt;http://www.slproweb.com/products/Win32OpenSSL.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;- zlib.dll&lt;/div&gt;&lt;div&gt;&lt;a id="k-5o" href="http://www.zlib.net/zlib123-dll.zip" title="http://www.zlib.net/zlib123-dll.zip"&gt;http://www.zlib.net/zlib123-dll.zip&lt;/a&gt;&lt;/div&gt;&lt;div&gt;(renombrar zlib1.dll a zlib.dll)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;- iconv.dll&lt;/div&gt;&lt;div&gt;&lt;a id="p5dk" href="http://sourceforge.net/project/showfiles.php?group_id=25167&amp;amp;package_id=51458" title="http://sourceforge.net/project/showfiles.php?group_id=25167&amp;amp;package_id=51458"&gt;http://sourceforge.net/project/showfiles.php?group_id=25167&amp;amp;package_id=51458&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;- readline.dll&lt;/div&gt;&lt;div&gt;la versión que paso está hecha en Ruby, y me enteré de que existía gracias a la lista de Ruby Argentina :D&lt;/div&gt;&lt;div&gt;&lt;a id="syhc" href="http://github.com/luislavena/rb-readline/downloads" title="http://github.com/luislavena/rb-readline/downloads"&gt;http://github.com/luislavena/rb-readline/downloads&lt;/a&gt;&lt;/div&gt;&lt;div&gt;(se instala ejecutando "ruby setup.rb" desde consola, estando en el directorio donde descomprimimos el archivo bajado)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;- sqlite3.dll&lt;/div&gt;&lt;div&gt;&lt;a id="k4ox" href="http://www.sqlite.org/" title="http://www.sqlite.org/"&gt;http://www.sqlite.org/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;4)&lt;/b&gt; Luego debemos instalar Gems, para poder utilizar el sistema de paquetes.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;- Bajar la ultima version de gems desde &lt;a id="eleq" href="http://rubyforge.org/frs/?group_id=126" title="http://rubyforge.org/frs/?group_id=126"&gt;http://rubyforge.org/frs/?group_id=126&lt;/a&gt;&lt;/div&gt;&lt;div&gt;- Descomprimirla en algún directorio&lt;/div&gt;&lt;div&gt;- Estando en el directorio desde la consola, ejecutar "ruby setup.rb"&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Extra: Instalar Rails&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Despues de instalar ruby y gem, se puede instalar rails como todos saben, haciendo:&lt;/div&gt;&lt;div&gt;"gem install rails"&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Pero un detalle a tener en cuenta es que hay problemas con la versión 1.2.4 de sqlite3 en Windows, así que es conveniente instalar la 1.2.3:&lt;/div&gt;&lt;div&gt;"gem install sqlite3-ruby -v 1.2.3"&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4759448024504207667-8636560753741055151?l=fisadev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fisadev.blogspot.com/feeds/8636560753741055151/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://fisadev.blogspot.com/2009/07/instalar-ruby-en-windows.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/8636560753741055151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4759448024504207667/posts/default/8636560753741055151'/><link rel='alternate' type='text/html' href='http://fisadev.blogspot.com/2009/07/instalar-ruby-en-windows.html' title='Instalar Ruby en Windows'/><author><name>Fisa</name><uri>http://www.blogger.com/profile/07759999921639819363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_WhgSMw0NcSs/TDe1aOs5DzI/AAAAAAAAR4A/x70iHnOf_0I/S220/fisa_elfico.png'/></author><thr:total>4</thr:total></entry></feed>
