<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>el blog de cHagHi (Publicaciones sobre Software)</title><link>https://chaghi.com.ar/</link><description></description><atom:link href="https://chaghi.com.ar/tags/software.xml" type="application/rss+xml" rel="self"></atom:link><language>es</language><lastBuildDate>Thu, 13 Jul 2017 23:53:07 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Buscando con DuckDuckGo</title><link>https://chaghi.com.ar/blog/buscando-con-duck-duck-go/</link><dc:creator>cHagHi</dc:creator><description>&lt;div&gt;&lt;div class="figure align-left"&gt;
&lt;a class="reference external image-reference" href="https://duckduckgo.com/"&gt;&lt;img alt="DuckDuckGo logo" class="islink" src="https://duckduckgo.com/assets/logo_homepage.normal.v101.png"&gt;&lt;/a&gt;
&lt;p class="caption"&gt;DuckDuckGo logo&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Desde hace una semana estoy usando &lt;a class="reference external" href="http://duckduckgo.com/"&gt;DuckDuckGo&lt;/a&gt;
como reemplazo de Google para buscar.&lt;/p&gt;
&lt;p&gt;No es un servicio nuevo, pero en su momento no le había dado mucha bola.
Pero resulta que Google de a poco fue perdiendo la magia. Se nota cada
vez más que lo único que quieren es enrostrarte un anuncio publicitario.
Ojo, &lt;em&gt;siempre&lt;/em&gt; ese fue su objetivo principal, pero había una época en
que lo disimulaban, en que te la ponían sin que te dieras cuenta, casi.&lt;/p&gt;
&lt;p&gt;Ahora es más evidente. Cada vez hay más resultados esponsoreados. Los
resultados de búsqueda están cada vez más sucios de metadata de otros
servicios, todo entreverado. Google cambió sus políticas de privacidad y
si bien es cierto que son más simples, es como que ahora tienen piedra
libre para usar todo lo que saben de vos para influenciar en como te
muestran un resultado de búsqueda. Tal vez lo hicieron siempre, por
atrás, pero ahora es explícito.&lt;/p&gt;
&lt;p&gt;Google se caracterizaba por una página de resultados limpia, pristina,
simple, minimalista. En los últimos tiempos han ido agregando iconitos y
previews y colores, y +1's y paneles y barras y... está empezando a
suckear.&lt;/p&gt;
&lt;p&gt;Así que decidí probar DuckDuckGo, un poco por capricho. El diseño
recuerda mucho al de Google de los primeros tiempos. ¿Los resultados son
buenos? Mirá, lo vengo usando hace solo una semana, y te diría que para
el 99% de las búsquedas, sí. No se si es mejor o peor que Google, pero
me sirve, me funciona.&lt;/p&gt;
&lt;p&gt;En cuanto a privacidad tiene cosas muy piolas, les recomiendo &lt;a class="reference external" href="https://duckduckgo.com/privacy.html"&gt;leer&lt;/a&gt; al
respecto, pero dos cosas que me parecieron fantásticas son la
posibilidad de configurar DuckDuckGo para que no le informe al sitio de
destino que lo visitás de parte de él, y la posibilidad de usar su
sintaxis "bang" para especificar un proxy directamente en la búsqueda,
haciendo que el tipo pase por ese proxy, anonimizando (en parte) lo que
estás haciendo.&lt;/p&gt;
&lt;p&gt;¿Y que es eso de la sintaxis "bang"? Algo que está más bueno que el
dulce de leche, que es re-natural y re-útil. Es básicamente una forma de
decirle a DuckDuckGo "buscá acá", o "buscá este tipo de información",
etc. Ejemplos:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Buscame The Lord Of The Rings en IMDb:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="literal-block"&gt;
!imdb the lord of the rings
&lt;/pre&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Buscame un torrent con la imagen de ubuntu 11.10:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="literal-block"&gt;
!torrent ubuntu 11.10
&lt;/pre&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Buscame posts taggeados "Caminito" en Tumblr:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="literal-block"&gt;
!tumblr caminito
&lt;/pre&gt;
&lt;p&gt;... y así. Y esa sintaxis también funciona para cosas como !convert,
!translate, y otros verbos. &lt;a class="reference external" href="http://duckduckgo.com/bang.html"&gt;Hay cientos de términos "bang"&lt;/a&gt; para usar,
en las categorías y temas que quieras, ciencia, lenguajes de
programación, multimedia, noticias. ¿Y lo mejor? ¡Qué son obvios! O sea,
no es que tenés que estudiar la lista. A mi me viene pasando que de
pronto digo "¿si le mando !flickr buscará en Flickr?" Y resulta que sí,
y tal vez con Flickr es obvio, pero encontré intuitivo, natural,
pergarle a cosas más específicas.&lt;/p&gt;
&lt;p&gt;Y eso no es todo, la sintaxis !bang es solo uno de los &lt;a class="reference external" href="http://duckduckgo.com/goodies.html"&gt;goodies&lt;/a&gt; que
ofrecen; podés escribir queries con cálculos, con conversiones, con
temas relacionados con geografía, fecha y hora, etc., etc.&lt;/p&gt;
&lt;p&gt;Una semana es poco tiempo para evaluar algo tan importante como un
servicio de búsqueda en internet, pero la verdad que por ahora se queda,
y como primera opción. Ya agregué el &lt;a class="reference external" href="https://addons.mozilla.org/en-US/firefox/addon/duckduckgo-ssl/"&gt;Search Plugin de DuckDuckGo&lt;/a&gt; a
Firefox para tenerlo en la barra de búsqueda, y lo puse como opción
predeterminada.&lt;/p&gt;&lt;/div&gt;</description><category>duckduckgo</category><category>google</category><category>privacy</category><category>search</category><category>Software</category><guid>https://chaghi.com.ar/blog/buscando-con-duck-duck-go/</guid><pubDate>Thu, 22 Mar 2012 01:58:13 GMT</pubDate></item><item><title>Enviar un artículo a Read It Later desde Google Reader</title><link>https://chaghi.com.ar/blog/enviar-un-articulo-a-read-it-later-desde-google-reader/</link><dc:creator>cHagHi</dc:creator><description>&lt;div&gt;&lt;p&gt;Mi servicio preferido para llevar un registro de "cosas que encontré en
la web y que me quiero acordar de leer" es &lt;a class="reference external" href="http://readitlaterlist.com"&gt;Read It Later&lt;/a&gt;. Antes usaba
Instapaper, pero más que nada por un tema de soporte oficial en
celulares con Android, hace unos meses me cambié a Read It Later.&lt;/p&gt;
&lt;p&gt;Hace rato que tengo configurado en la barra de marcadores de Firefox un
&lt;a class="reference external" href="http://readitlaterlist.com/bookmarklets"&gt;bookmarklet&lt;/a&gt; que me permite enviar a Read It Later la página que estoy
leyendo, y en general es lo que uso. El tema es que cuando estoy leyendo
un artículo en Google Reader, tengo que abrir el artículo en una
solapa/ventana nueva (para ir a la fuente original), y de ahí hacer el
envío.&lt;/p&gt;
&lt;p&gt;Si bien Google hizo muchas cagadas con el rediseño de Reader de hace
unas semanas, hasta que le encuentre un reemplazo, lo sigo usando. Y
resulta que han hecho algunas cosas buenas. Por ejemplo: al pie de cada
artículo hay una opción de "Send to" que permite enviar la nota a
diferentes servicios. Desde la configuración de Google Reader se pueden
habilitar y deshabilitar que servicios queremos ver. Están los clásicos:
Twitter, Facebook, Tumblr, Digg... hasta está Instapaper, pero no está
Read It Later.&lt;/p&gt;
&lt;p&gt;Si miran en la configuración al pie de los servicios disponibles, verán
que no todo está perdido. Google previó crear "sitios personalizados",
con lo cual es posible definir nuevos servicios. Y resulta que la gente
de Read It Later ya documentó como hacer para agregar su servicio a la
lista.&lt;/p&gt;
&lt;p&gt;Hay que crear un enlace personalizado con la siguiente información:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Name: Read It Later

URL: https://readitlaterlist.com/save?url=${url}&amp;amp;title=${title}

Icon Url: http://readitlaterlist.com/favicon.ico
&lt;/pre&gt;
&lt;p&gt;... y listo, con eso aparece Read It Later como "sitio destino" dentro
de Google Reader, y se pueden enviar los artículos sin necesidad de
abrir la fuente original primero.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Read It Later dentro de Google Reader" src="https://chaghi.com.ar/blog/wp-content/uploads/2011/11/readitlater-googlereader.png"&gt;Fuente: &lt;a class="reference external" href="http://readitlaterlist.com/blog/2009/08/add-read-it-later-to-google-readers-send-to-dropdown/"&gt;Add Read It Later to
Google Reader’s Send To Dropdown&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sí, ya se: hay una &lt;a class="reference external" href="http://readitlaterlist.com/firefox/"&gt;extensión oficial para Firefox&lt;/a&gt; que integra Read It
Later con el browser, pero, cuestión de gustos, personalmente prefiero
el bookmarklet antes que una extensión...&lt;/p&gt;&lt;/div&gt;</description><category>bookmarklet</category><category>firefox</category><category>google</category><category>google reader</category><category>read it later</category><category>Software</category><guid>https://chaghi.com.ar/blog/enviar-un-articulo-a-read-it-later-desde-google-reader/</guid><pubDate>Tue, 22 Nov 2011 22:58:37 GMT</pubDate></item><item><title>Luchando con la memoria interna del HTC Desire</title><link>https://chaghi.com.ar/blog/luchando-con-la-memoria-interna-del-htc-desire/</link><dc:creator>cHagHi</dc:creator><description>&lt;div&gt;&lt;p&gt;Hay dos cosas que no me gustan de &lt;a class="reference external" href="https://chaghi.com.ar/blog/un-par-de-meses-con-android"&gt;mi HTC Desire&lt;/a&gt;: una es la autonomía
de la batería, la otra, el espacio de almacenamiento interno.&lt;/p&gt;
&lt;p&gt;Bueno, hay tres cosas: La tercera es el GPS, pero no termino de decidir
si lo lento que es el GPS para obtener un lock, y la frecuencia con la
que se desengancha es un problema de software, de hardware, o que... y
no es tan de vida o muerte. Lo puteo &lt;strong&gt;*mucho*&lt;/strong&gt; cuando salgo a correr,
pero para lo demás, zafa.&lt;/p&gt;
&lt;p&gt;Volvamos a los dos temas originales:&lt;/p&gt;
&lt;p&gt;El tema de la batería más o menos quedó aceptablemente resuelto cuando
actualicé a Gingerbread. Estoy usando una ROM custom basada en el build
oficial de Gingerbread liberada por HTC para el Desire, específicamente
&lt;a class="reference external" href="http://forum.xda-developers.com/showthread.php?t=1200261"&gt;esta&lt;/a&gt;, que es del mismo desarrollador de la ROM que usaba de Froyo.&lt;/p&gt;
&lt;p&gt;Digamos que con esa ROM obtengo unas 8hs de uso intensivo, o unas 24 a
36hs de uso normal (que en mi caso tiende a ser de moderado a bajo). Si
bien está lejos de lo que me gustaría, sirve. Sí, en la práctica implica
que lo tengo que cargar todos los días, pero bueno... ahora con
Gingerbread puedo obtener esa autonomía estando conectado prácticamente
todo el día (con Froyo para lograr eso usaba permanentemente &lt;a class="reference external" href="https://market.android.com/details?id=org.gpo.greenpower"&gt;Green
Power&lt;/a&gt; para solo activar la conexión de datos durante 2' cada 30').&lt;/p&gt;
&lt;p&gt;Y todavía podría mejorarlo más, si flasheara el "Powersaving Mod" de
esta ROM y/o utilizara alguna aplicación que aprovecha el rooteo del
teléfono para hacer under-clocking cuando la CPU o la pantalla están
idle. Calculo que con eso mejoraría mucho, pero todavía no me puse a
jugar con eso. Y siempre puedo recurrir a Green Power (con Gingerbread
casi no lo estoy usando... pero la opción está). Como decía al
principio, la autonomía que tengo ahora no me vuela la peluca, pero me
alcanza. Es manejable.&lt;/p&gt;
&lt;p&gt;Pero queda un tema... y es el espacio de almacenamiento interno. Con
esta ROM que estoy usando, instalé también A2SD+, que básicamente usa
una partición extendida en la SD card, y mueve ahí las aplicaciones y el
caché Dalvik, pero &lt;strong&gt;*no*&lt;/strong&gt; los datos de las apps. Eso mejora
&lt;strong&gt;*mucho*&lt;/strong&gt; la cuestión, pero no alcanza. Hay dos cosas que con el
correr de los días se van descontrolando:&lt;/p&gt;
&lt;div class="section" id="cache"&gt;
&lt;h3&gt;Cache&lt;/h3&gt;
&lt;p&gt;El caché de algunas aplicaciones crece mucho. Algunas apps tienen el
cache en la memoria interna, otras en la externa, otras en ambas.
Depende. Pero hay ciertas apps que tienen una tendencia a entrar a comer
megas y megas de cache en la memoria interna: Google Reader, Internet,
Facebook, Market, Google Maps.&lt;/p&gt;
&lt;p&gt;Para resolver esto, instalé &lt;a class="reference external" href="https://market.android.com/details?id=org.lsartory.cachecleaner.ng"&gt;CacheCleaner NG&lt;/a&gt; (requiere root para ser
realmente útil...) Lo que tiene de bueno esta app es que permite ver el
caché usado aplicación por aplicación, interno y externo, y configurar
individualmente cual quiero que borre y cual no, también aplicación por
aplicación. Cada N días, le pego una mirada, y libero unos cuantos megas
(con una semana típica de uso suelo estar con entre 10 y 15MB usados
para cache, que obviamente sigue creciendo si lo dejo). CacheCleaner NG
puede configurarse para iniciarse automáticamente y limpiar con cierta
frecuencia, pero por ahora, lo estoy haciendo manualmente.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="anr-history-txt"&gt;
&lt;h3&gt;ANR_history.txt&lt;/h3&gt;
&lt;p&gt;Esto es un misterio. Intrigado por saber que otra cosa iba comiendo
espacio sin parar, día a día, casi que hora a hora, sin prisa pero sin
pausa, empecé a prestarle más atención a la info que da &lt;a class="reference external" href="https://market.android.com/details?id=com.google.android.diskusage"&gt;DiskUsage&lt;/a&gt;. Lo
venía usando hace bastante, pero no me había percatado que, si soy root,
puedo usarlo para analizar la carpeta /data/data, que es donde están los
datos de las aplicaciones. Y ahí me encontré con este señor archivo:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
/data/data/com.android.htcprofile/anr_history.txt
&lt;/pre&gt;
&lt;p&gt;Google no me ayudó mucho, pero aparentemente es una especie de log de
errores. De hecho, es un archivo de texto, que tiene stack traces de
aplicaciones con problemas. Aparentemente, "anr" es "application not
responding". Tiene sentido... historial de aplicaciones que no
responden. Lo estuve mirando un poco, y hay errores de java de todo
tipo, de prácticamente todas las aplicaciones. No tengo idea que tiene
que ver con HTC Profile; tampoco tengo muy claro que es HTC Profile. Lo
que si tengo claro, es que si no lo blanqueo cada tanto, crece sin
parar, mal. Y también estoy casi seguro que esto empezó a pasar con la
ROM basada en Gingerbread. ¿Será un bug de la ROM que liberó HTC? ¿Hay
forma de apagar ese log de errores? Como les decía, Google no me fue de
ayuda. Sí encontré un par de foros en los que aclaran que no conviene
borrarlo directamente, porque luego podría tener algún problema de
permisos (¿tal vez alguna aplicación o librería de HTC luego no lo
encuentra y falla?). No comprobé lo de los permisos, pero por las dudas,
no lo borro, lo trunco. Me abro una consola local con &lt;a class="reference external" href="https://market.android.com/details?id=org.connectbot"&gt;ConnectBot&lt;/a&gt;, y
hago esto:&lt;/p&gt;
&lt;pre class="code console"&gt;&lt;a name="rest_code_4e297126bd884b42a57f4a84ee40d5b6-1"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$&lt;/span&gt; su
&lt;a name="rest_code_4e297126bd884b42a57f4a84ee40d5b6-2"&gt;&lt;/a&gt;
&lt;a name="rest_code_4e297126bd884b42a57f4a84ee40d5b6-3"&gt;&lt;/a&gt;&lt;span class="gp"&gt;#&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &amp;gt; /data/data/com.android.htcprofile/anr_history.txt
&lt;/pre&gt;&lt;p&gt;... y santo remedio. Por algunos días / semanas.&lt;/p&gt;
&lt;p&gt;Odio tener semejante teléfono que me salió unos buenos mangos y tener
que estar haciendo este tipo de chanchadas. Ya decidí que mi próximo
teléfono (si tiene Android) va a tener que tener espacio de
almacenamiento interno de verdad (y no los 140MB que tiene el HTC
Desire, que son un chiste de mal gusto).&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;</description><category>android</category><category>cache</category><category>gingerbread</category><category>htc</category><category>Software</category><guid>https://chaghi.com.ar/blog/luchando-con-la-memoria-interna-del-htc-desire/</guid><pubDate>Tue, 25 Oct 2011 11:30:41 GMT</pubDate></item><item><title>GMail + OfflineIMAP + Evolution</title><link>https://chaghi.com.ar/blog/gmail_offlineimap_evolution/</link><dc:creator>cHagHi</dc:creator><description>&lt;div&gt;&lt;p&gt;Finalmente, después de bastantes experimentos, creo que logré una
configuración de manejo de correo electrónico en la laptop que me
satisface. Y no te dejes engañar por el "Evolution" del título: En
realidad, bastante de la experiencia aplica a cualquier MUA, o a
cualquiera que quiera independizarse del MUA (ver "Bonus track" final),
o simplemente a cualquiera que quiera tener un backup del correo de
GMail local accesible incluso off-line.&lt;/p&gt;
&lt;div class="section" id="background"&gt;
&lt;h3&gt;Background&lt;/h3&gt;
&lt;p&gt;Mi cuenta de correo principal, la que más uso, está en GMail. La
aplicación web está excelente, y ahora que me estoy acostumbrando a los
"atajos de teclado" (¿por qué tardé literalmente &lt;em&gt;años&lt;/em&gt; en tratar de
aprenderlos e incorporarlos a mis dedos?), aún mejor. Pero así y todo,
me gusta sentir que no dependo de una conexión a internet para acceder
al correo histórico, y me gusta tener un backup, con lo cual necesito
que el correo esté bajado en mi disco, para poder accederelo con algún
MUA.&lt;/p&gt;
&lt;p&gt;Hasta hace unas semanas, accedía a GMail con Evolution usando POP3.
Desde que empecé a usar GMail que hacía esto. Y tenía múltiples filtros
de correo entrante y saliente que redistribuían los mensajes en N
carpetas de Evolution que, más o menos, equivalen a una etiqueta en
GMail. Por otro lado, tenía (tengo) años de historia de correo
electrónico que no es de GMail, principalmente, de mi vieja, querida y
deprecada cuenta de Sion. Entonces por ejemplo en la carpeta "Amigos",
tengo todo el correo de mis amigos, no solo el de los últimos 3 años en
GMail, sino también el histórico.&lt;/p&gt;
&lt;p&gt;El tema es que a medida que empecé a usar más y más GMail, y
especialmente, desde que empecé a usarlo desde distintas computadoras,
en distintos ámbitos, y con diferentes clientes, me choqué contra lo
obvio: POP3... #noescala (chiste interno para los twitteros... je). Leer
una cantidad de correos durante el día, etiquetarlos, acomodarlos, y a
la noche prender la laptop y volver a bajarlos como correo "no leído",
es una porquería. Muchas veces me pasaba que "leer" correo en la laptop
en realidad era ir carpeta por carpeta en Evolution marcando los
mensajes como leídos, sin siquiera abrirlos.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="boludo-usa-imap"&gt;
&lt;h3&gt;Boludo, ¡usá IMAP!&lt;/h3&gt;
&lt;p&gt;Hace bastante GMail habilitó IMAP. Cualquiera diría que es la solución.
Pero... siempre hay un pero (en este caso, varios)&lt;/p&gt;
&lt;p&gt;La implementación de IMAP de GMail suckea un poco. Lo de exponer los
labels como folders tiene el inconveniente de que los correos que tienen
N etiquetas, los bajás N veces (¿tantos recursos le sobran a Google que
fue por este camino, en lugar de mapear las etiquetas a IMAP keywords, y
dejar que las carpetas las manejes vos?). Por otro, la filosofía de "no
borres el correo, archivalo", sumado a lo de las etiquetas, hace que
cuando accedés a GMail con IMAP desde un cliente, algunas operaciones no
sean obvias, o no hagan lo que vos pensás que deberían hacer. Aún hoy
estoy tratando de &lt;a class="reference external" href="http://mail.google.com/support/bin/answer.py?hl=en&amp;amp;answer=77657"&gt;incorporar algunas de estas cosas&lt;/a&gt; de manera
definitiva en mi cerebro.&lt;/p&gt;
&lt;p&gt;Así y todo, decidí sacrificar mi estructura histórica de carpetas,
reemplazarla por la estructura "plana" que me da GMail (sí, ya se, si
usara etiquetas con "/" en medio, automáticamente en la interfaz IMAP se
traducen en una jerarquía de carpetas, pero no me gusta), y acceder vía
IMAP.&lt;/p&gt;
&lt;p&gt;Ahora, ¿qué hacía con las carpetas con el correo histórico? Vieron que
los MUA en general cuando configuran una cuenta IMAP, como que crean una
sub-estructura de carpetas nuevas, con su propia bandeja de entrada,
papelera, correo enviado, borradores, más las carpetas de esa cuenta.
Así que en cuanto hice el switch, el primer escollo es que en Evolution
pasé a tener 2 grandes nodos: Correo viejo bajado por POP3, de GMail, de
SION y otras cuentas, y el correo nuevo que iba entrando por IMAP. Y
además, había una superposición: Todo el correo de GMail que había
bajado durante años via POP3 estaba también accesible vía IMAP
(repetido).&lt;/p&gt;
&lt;p&gt;Para resolver eso, me tuve que embarrar las manos. Una solución hubiera
sido escribir un script que leyera las carpetas en formato mbox de Evo y
analizando los headers de los correos los copiara en las carpetas
IMAP... pero no tengo experiencia manipulando correo a bajo nivel, y
tampoco tengo TANTAS carpetas (ni tanto correo, apenas unos cientos de
MBs), así que lo fui haciendo a mano: En cada carpeta de Evo, seteaba un
filtro que básicamente era "mostrame el correo que entre los remitentes
o destintatarios tenga a mi cuenta de sion o la cuenta de mi ex laburo y
no tenga mi cuenta de GMail", y al correo resultante lo arrastraba a la
carpeta (label) correspondiente en la cuenta de GMail.&lt;/p&gt;
&lt;p&gt;Esto efectivamente "sube" (o importa) el correo en GMail, así que estuve
un bueeeen rato haciendo esto. Y después me topé con &lt;a class="reference external" href="http://mail.google.com/support/bin/answer.py?answer=82365&amp;amp;topic=12922"&gt;este bug de
GMail&lt;/a&gt;: El correo importado desde IMAP queda con la fecha incorrecta
(con la fecha del día que lo importaste) en la interfaz web. Así que
ahora tengo miles de correos en GMail que si los accedo desde la web, o
si los busco, tienen la fecha en que los importé. Como internamente la
fecha está bien (desde cualquier otro cliente se ve la fecha correcta, e
incluso dentro de la interfaz web de GMail, en la vista de
conversaciones se ven bien), supongo que algún día Google lo arreglará
(aunque el tema es un known issue desde hace más de un año...)&lt;/p&gt;
&lt;p&gt;Bueno, pero entonces, listo, pasaste a IMAP, y fuiste feliz, ¿no?&lt;/p&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="imap-en-evolution-sucks"&gt;
&lt;h3&gt;IMAP en Evolution sucks&lt;/h3&gt;
&lt;p&gt;Y por lo que leí, IMAP en Thunderbird también, y hasta IMAP en mutt
suckea en algunos aspectos, así que malo por malo, me quedo con el malo
que conozco, que encima es el MUA oficial de Gnome, y por lo menos tiene
resuelta la integración con el desktop de manera decente.&lt;/p&gt;
&lt;p&gt;Evo por default baja solo las cabeceras de los mensajes. Así que navegar
por las carpetas se vuelve lentísimo, porque se tiene que conectar al
server a bajar el mensaje. Obvio si el mensaje no está completo, no
tengo un backup en disco. Y tampoco puedo hacer búsquedas locales, ni
acceder al correo viejo si no tengo internet. Se le puede decir a Evo
que baje todo el correo. Y lo hice. Lo dejé una noche haciéndolo. Pero
resulta que el tipo así y todo ¡¡¡NO baja los attachments!!!. E igual,
aunque tenga el correo cacheado en disco, cuando te parás encima del
mensaje el tipo "dialoga" con el server IMAP para ver si el mensaje
sigue existiendo, si le cambió algún flag, etc., o para bajar el
attachment que no bajó. Es &lt;em&gt;lento&lt;/em&gt;. Navegar por las carpetas de Evo se
vuelve una tortura, y eso que no tengo cientos de miles de correos en
cada carpeta, ni mucho menos.&lt;/p&gt;
&lt;p&gt;La única manera de leer correo sin que sea leeeeeeeento, es decirle a
Evolution que labure "off line". Entonces el tipo se desconecta, no
habla más con el server IMAP, y se deja de joder. Pero... no tengo los
attachments. Y si entra nuevo correo, no me entero. Y si hago cambios
localmente en el correo (los borro, los muevo, etc), no se impactan en
el server hasta que no vuelvo a decirle a Evo que labure on line. Sucks.
Sucks &lt;em&gt;big time&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Después de considerar momentáneamente cambiar de MUA, decidí que ese no
era el camino. En múltiples foros me encontré con que Thunderbird tiene
issues también. Y no iba a volver a Thunderbird, cuya integración con
Gnome es &lt;em&gt;pésima&lt;/em&gt;, para sufrir más o menos lo mismo. Y no iba a
pasarme a un MUA geek de terminal, como &lt;a class="reference external" href="http://www.mutt.org/"&gt;mutt&lt;/a&gt; o &lt;a class="reference external" href="http://sup.rubyforge.org/"&gt;SUP&lt;/a&gt;, no gracias. No
soy &lt;em&gt;tan&lt;/em&gt; geek. Encima SUP está escrito en Ruby (yikes!).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="enter-offlineimap"&gt;
&lt;h3&gt;Enter OfflineIMAP&lt;/h3&gt;
&lt;p&gt;Resulta que hay un programita, hecho en Python (¡Python rocks!), llamado
&lt;a class="reference external" href="http://software.complete.org/software/wiki/32"&gt;OfflineIMAP&lt;/a&gt;, que básicamente sirve para sincronizar una cuenta IMAP
con un repositorio local en formato &lt;a class="reference external" href="http://es.wikipedia.org/wiki/Maildir"&gt;Maildir&lt;/a&gt;. Puede hacer unas cuantas
cosas más, como sincronizar múltiples cuentas, o sincronizar un IMAP con
otro, y así, pero en esencia, el tipo es eso: un algo que lee un
repositorio remoto (IMAP), y lo sincroniza contra uno local (Maildir u
otro IMAP), y en el medio, podés poner reglas (esto sí, esto no, lo de
esta carpeta pasalo a esta), y esas reglas muchas veces son expresiones
de Python, o invocaciones a funciones de Python que realizan la
conversión :)&lt;/p&gt;
&lt;p&gt;Y todos sabemos que &lt;em&gt;manejar tu correo con Python gives you a warm and
fuzzy feeling&lt;/em&gt; :)&lt;/p&gt;
&lt;p&gt;Así que hice eso: Configuré OfflineIMAP, y luego apunté a Evo a la
carpeta raíz de la estructura Maildir, y voilá. &lt;em&gt;It flies&lt;/em&gt;. Y encima,
el formato Maildir es mucho más robusto que un mbox: tengo un archivo
por correo, así que si por puta se corrompe un archivo, se pierde UN
correo, no mil.&lt;/p&gt;
&lt;p&gt;No voy a exponer acá un tutorial detallado de como configurar
OfflineIMAP (hay &lt;em&gt;mil&lt;/em&gt; recetas en la web), pero si voy a dar algunos
tips que me resultaron interesantes, o que descubrí a fuerza de darme
algún palo:&lt;/p&gt;
&lt;p&gt;Muchos tutoriales te dicen que para configurar OfflineIMAP para GMail y
luego accederlo con Evo tenés que mover ciertas carpetas a un nodo
"root", porque si no Evo no entiende bien la estructura Maildir. Esto es
parcialmente falso. La única carpeta problemática es el INBOX, que tiene
que ser la raíz de la estructura Maildir, y GMail la expone como
"/INBOX", no como "/". Esto se resuelve así en tu .offlineimaprc:&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_988a7d0ae6ff44bfa8ed6722b94485dc-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;nametrans&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;foldername&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'^INBOX'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;foldername&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;Puede que NO quieras bajar la carpeta "Spam" de GMail, ni la carpeta
"All Mail". La última es un tema... en mi caso, como soy bastante
histérico con el etiquetado de correo en GMail, es raro que un mensaje
quede sin etiquetar. Si está etiquetado, lo tengo en por lo menos una
carpeta IMAP (y si tiene N etiquetas, en las N carpetas); si no está
etiquetado, en general no es importante. Anyway, la forma de exluir una
o más carpetas de la sincronización es la siguiente:&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_9c07fc13df704f9ab2f4ea2e89b63a0a-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;folderfilter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;foldername&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;foldername&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'[Gmail]/Spam'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'[Gmail]/All Mail'&lt;/span&gt;&lt;span class="p"&gt;,]&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;Dejarlas afuera tiene los siguientes caveats:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;No hay forma de reportar un correo como SPAM desde tu estructura
Maildir. La forma de decirle a GMail desde IMAP que un correo es Spam
es moverlo a dicha carpeta, pero como no la estás sincronizando...&lt;/li&gt;
&lt;li&gt;No hay forma de "desetiquetar" por completo un mensaje. La forma de
hacerlo es mover el mensaje a la carpeta "All Mail", pero como no la
estás sincronizando...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;De nuevo, eso último es personal. A mi, me sirve así.&lt;/p&gt;
&lt;p&gt;Ya que hablamos de carpetas, &lt;a class="reference external" href="http://mail.google.com/support/bin/answer.py?answer=78892&amp;amp;cbid=-1d485khlyyj17&amp;amp;src=cb&amp;amp;lev=answer"&gt;no dejen de leer estos tips de Google&lt;/a&gt;.
Básicamente:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;No&lt;/strong&gt; mapeen la carpeta "Correo enviado" de su MUA a la carpeta
Sent. Google copia automáticamente los mensajes que salen por su SMTP
a la carpeta Sent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No&lt;/strong&gt; mapeen la "Papelera" de su MUA con la carpeta Trash de GMail,
a menos que quieran efectivamente &lt;em&gt;borrar&lt;/em&gt; el mensaje en lugar de
archivarlo. Google recomienda lo último (archivar). La manera de
borrar sería arrastrar el correo a la carpeta trash. Si atan la
papelera de su cliente con el Trash de Gmail, no tienen forma de
hacer el equivalente al "Archive" de GMail desde el cliente... a
menos que también estén sincronizando la carpeta "All Mail", en cuyo
caso, el Archive sería mover el correo a la carpeta All Mail.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sí&lt;/strong&gt; mapeen la carpeta "Borradores" de su MUA con la Draft de
GMail, así los tienen sincronizados.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Por último, un detalle: No me gustaba mucho tener la clave de GMail
volcada textualmente en un archivo de configuración. Pero resulta que
OfflineIMAP puede invocar a una función de Python que le devuelva
algunos settings, entre ellos, la password y el usuario de la cuenta
IMAP (o de GMail). Así que pensé, ¿no podré tener la password en el
keyring de Gnome, hacer un script de Python que lo recupere, y decirle a
OfflineIMAP que use eso? Si, puedo. Y alguien ya lo había hecho :)
&lt;a class="reference external" href="http://www.clasohm.com/blog/one-entry?entry_id=90957"&gt;Miren acá&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="bonus-track"&gt;
&lt;h3&gt;Bonus track&lt;/h3&gt;
&lt;p&gt;Lo bueno de tener a OfflineIMAP en el medio volcando tu correo en un
Maildir estándar, es que ahora mi copia local del correo es
independiente del MUA :)&lt;/p&gt;
&lt;p&gt;Si mañana me canso de Evolution, solo tengo que poner el MUA que quiera
apuntando a mi repo local, y ya está. Y si quiero probar un MUA nuevo,
no necesito hacer NADA. Hasta puedo usar diferentes MUAs
simultáneamente.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;</description><category>Software</category><guid>https://chaghi.com.ar/blog/gmail_offlineimap_evolution/</guid><pubDate>Sun, 27 Dec 2009 14:22:38 GMT</pubDate></item><item><title>Ubuntu 9.04 - Jaunty Jackalope</title><link>https://chaghi.com.ar/blog/ubuntu_9-04_-_jaunty_jackalope/</link><dc:creator>cHagHi</dc:creator><description>&lt;div&gt;&lt;p&gt;Terminé de migrar a &lt;a class="reference external" href="http://www.ubuntu.com/products/whatisubuntu/904features/"&gt;Jaunty&lt;/a&gt;. Esta vez, fue una experiencia diferente.
Tenía intenciones de hacer un clean-install, manteniendo mi $HOME y mi
/opt, que están en particiones independientes. Siempre termino usando el
CD "alternativo", porque mis particiones están sobre &lt;a class="reference external" href="http://es.wikipedia.org/wiki/LVM"&gt;LVM2&lt;/a&gt;, y
&lt;a class="reference external" href="https://launchpad.net/ubiquity"&gt;Ubiquity&lt;/a&gt;, el instalador de la versión Desktop no lo soporta.&lt;/p&gt;
&lt;p&gt;Resulta que anoche iba a quemar el .iso... y me encuentro con que no
tenía ni un CD virgen. Últimamente estoy volviendo a micro-blogguear
bastante en &lt;a class="reference external" href="http://twitter.com/chaghi"&gt;Twitter&lt;/a&gt;, y desde hace poquito también en &lt;a class="reference external" href="http://identi.ca/chaghi/all"&gt;Identi.ca&lt;/a&gt;, y
cuando postié "&lt;a class="reference external" href="http://identi.ca/notice/3689643"&gt;Iba a aprovechar el release de Jaunty para hacer un
clean install, y me acabo de dar cuenta que no tengo ni un CD para
quemar el .iso&lt;/a&gt;", bugabundo, alguien que ni conozco y que no es un
follower directo mío en identi.ca me respondió "&lt;a class="reference external" href="http://identi.ca/notice/3689660"&gt;@chaghi do you have a
USB stick? you can use that!&lt;/a&gt;".&lt;/p&gt;
&lt;p&gt;Eso motivó un par de intercambios en identi.ca con este flaco, con un
poco de google en paralelo, y un ratito después había aprendido lo
siguiente:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Hay &lt;em&gt;algo&lt;/em&gt; en identi.ca que evidentemente permite que pongas en tu
"radar" determinadas keywords o tags o algo y eso hace que te enteres
de determinados posts aunque no seas suscriptor del usuario. Hay todo
un manejo de tags y grupos en identi.ca sobre el que tengo que
investigar un toque;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;La herramienta Sistema -&amp;gt; Administración -&amp;gt; Creador de discos de
arranque USB&lt;/em&gt; que Ubuntu tiene desde hace un par de versiones te
automatiza el proceso de hacer booteable un USB, y meterle el
contenido de un .iso (normalmente, correspondiente al CD de
instalación de Ubuntu) para poder arrancar, instalar, o probar desde
ahí. Es automágico, no es destructivo (i.e., no te borra lo que ya
tengas en el pendrive), y hasta te sugiere reservar una especie de
micro-partición en el USB para hacer persistentes los cambios, onda
que luego si arrancás con el pendrive, y guardas un archivo en tu
Escritorio, por ejemplo, lo estás persistiendo en el USB, y no en RAM
como sucede normalmente con el LiveCD.&lt;/li&gt;
&lt;li&gt;El Desktop CD tiene &lt;em&gt;algo&lt;/em&gt; de soporte para LVM. En particular, la
herramienta de particionado manual de Ubiquity NO puede crear
volumenes LVM nuevos, ni te deja tocarlos mucho, pero si está
preparada para reconocer a los que existan, y usarlos en la
instalación.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Así que por primera vez en la vida, decidí bajar el Desktop CD en lugar
del Alternativo, e instalar con Ubiquity. En mi caso, y por este tema de
tener LVM en el medio, hay dos detalles a tener en cuenta:&lt;/p&gt;
&lt;p&gt;No puedo arrancar el instalador directo desde el menú de arranque. Tengo
que bootear la version Live de Ubuntu, instalar lvm2 (¿que les costará
meterlo por defecto en el CD?), activar mis volumenes LVM, lanzar
Ubiquity, instalar seleccionando particionado manual, y a lo último NO
REINICIAR. Antes, debo hacer un chroot a la instalación en disco, e
instalar lvm2 también ahí, ya que Ubiquity NO lo instala.&lt;/p&gt;
&lt;p&gt;Es un poco tricky, no es algo que le recomendaría a mi madre, pero
digamos que si estoy usando LVM2 es porque no soy precisamente un
newbie, así que el workarround tampoco es terrible.&lt;/p&gt;
&lt;p&gt;Después de todo eso, llegué a las siguientes conclusiones:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Realmente no tiene sentido hacer el "Upgrade" de una versión a otra.
El Upgrade tarda muchísimo más que una instalación limpia, aún
tomando los paquetes base desde el CD. Mucho más. Un Upgrade es un
proceso de un par de horas, a veces más, mientras que instalar Ubuntu
con Ubiquity lleva algo así como 20'/30'. Nada que ver. Ok, parte del
tiempo del upgrade es tiempo que con un clean install perdés después
bajando soft adicional (más sobre esto luego)... pero igual.&lt;/li&gt;
&lt;li&gt;El Upgrade tiene la ventaja de que preserva los datos, pero teniendo
particiones independientes... es lo mismo. Usás la misma partición
para tu $HOME, le decís al instalador que no la formatee, y ya. La
otra ventaja del Upgrade es que tiene cierta heurística de migración
que hace que si algún default cambió, y vos tenés todavía el default
anterior (y no un setting custom), te pone el nuevo default. Al hacer
un clean-install eso no lo tenés, y a veces tenés que luego jugar un
poco con las configuraciones para activar un feature nuevo que de
otro modo no ves porque está "tapado" por una configuración legacy,
digamos, pre-existente en tu $HOME.&lt;/li&gt;
&lt;li&gt;El Upgrade no solo preserva datos en tu $HOME, sino system-wide, con
lo cual cualquier cosa que hayas toqueteado en por ejemplo /etc,
también se mantiene. Pero hacer un backup de /etc es trivial, y pisar
luego en la instalación nueva los 2, 3 o 4 archivos que al menos en
mi caso podés llegar a tener con configuraciones extra, es también
trivial. Si fuera un server sería más complejo, obvio, pero al menos
en la laptop... hacer rato que me vengo apegando a las
configuraciones por defecto, y de última a centralizar cualquier cosa
custom dentro de mi $HOME, y no como algo global.&lt;/li&gt;
&lt;li&gt;Por último, el Upgrade preserva todo tu software extra, y te lo
actualiza, mientras que si hacés un clean-install, todo lo que no
provee el CD y tenías instalado, tenés que volver a bajarlo. Pero no
me jode. El tiempo de downloading a la larga es el mismo, y a su vez
ayuda a cada 6 meses PENSAR si vale la pena volver a instalar ese
programa que habías instalado para probar algo, y lo ejecutaste solo
una vez ese día y nunca más...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;¿Conclusión? Dudo mucho que vuelva a usar el Update Manager de Ubuntu
para hacer una actualización completa de la distribución. Me parece que
me acabo de hacer fan de los clean-installs.&lt;/p&gt;
&lt;p&gt;Ahora, respecto a Jaunty:&lt;/p&gt;
&lt;p&gt;Arranca notablemente más rápido que Intrepid y las versiones anteriores.
Parece un sistema operativo del siglo XXI corriendo en hardware
medianamente nuevo y todo :) ¡Bien ahí! Parece una boludez, pero una de
las cosas que más me estaba hinchando las pelotas de Intrepid es que el
arranque se tomaba un minuto o más hasta el login screen, y luego otro
tanto para levantar Gnome. Ahora en menos de un minuto ya estoy
laburando.&lt;/p&gt;
&lt;p&gt;Tengo una relación de amor-odio con el nuevo Notify-OSD. Si, es sleek.
Se ve re-lindo. Pero las notificaciones desaparecen rapidísimo, a veces
te las perdés, no todo el soft está usando ese esquema.&lt;/p&gt;
&lt;p&gt;El OS en general se nota mejor en performance, excepto en la parte de
video, por ciertas regresiones en los drivers de Intel. La verdad se
notan. Hay algunos workarrounds experimentales para eso (como habilitar
UXA), pero dicen que es a costa de estabilidad... así que ni probé.&lt;/p&gt;
&lt;p&gt;El look-and-feel de Ubuntu la verdad ya me aburrió. Los community-themes
que ahora se incluyen como alternativas (Dust, Dust-Sand, etc) están
buenos, pero tienen muchos detalles. Cositas acá y allá que no se ven
bien, o aplicaciones a las que no les gusta y cosas así. Y sí, hay BOCHA
de themes para Gnome, pero la verdad... todos tienen detalles, y encima,
todos tienden a copiar a Vista, o a copiar a OS X. A la larga, el más
pulido es el default, así que volví a Human. Pero estoy aburrido de
Human. Espero que para Karmic hagan algo piola y DIFERENTE. Realmente
espero que Canonical le pague a un grupo de designers profesionales para
que hagan algo lindo, usable, pulido, pero que a su vez se vea como
Ubuntu, tenga identidad propia, y no parezca un clon barato de Vista u
OS X.&lt;/p&gt;
&lt;p&gt;Jaunty ya tiene soporte para ext4. Aún no es el filesystem por defecto,
pero ya que estaba reformateando la partición root, esta quedó en ext4.
Cero problema. Y quizás eso esté contribuyendo en parte a las mejoras en
el booteo.&lt;/p&gt;
&lt;p&gt;El tiempo de inicialización de Gnome se arregló. No se que tenía mi
profile, que tardaba un montón. Y si me logueaba con otro usuario con un
$HOME "limpio", era mucho más rápido. Por un lado le sospechaba a la
encripción; por otro, a algún software adicional. Pero el tema es que no
toqué mi $HOME, reinstalé básicamente el mismo soft que tenía (al menos
en cuanto a los que están colgados del inicio de sesión de Gnome), y
mantuve exactamente la encripción, y sin embargo los 30"/45" que después
del login se perdían con el disco andando a full haciendo vaya uno a
saber que cosa que nunca pude identificar, hasta que aparecían los
paneles, se fue. ¡Bien!&lt;/p&gt;
&lt;p&gt;All in all, so far I'm a happy Jaunty Jackalope user.&lt;/p&gt;&lt;/div&gt;</description><category>GNU/Linux</category><category>review</category><category>Software</category><category>ubuntu</category><guid>https://chaghi.com.ar/blog/ubuntu_9-04_-_jaunty_jackalope/</guid><pubDate>Sat, 25 Apr 2009 18:56:28 GMT</pubDate></item><item><title>Synergy</title><link>https://chaghi.com.ar/blog/synergy/</link><dc:creator>cHagHi</dc:creator><description>&lt;div&gt;&lt;p&gt;¿A veces en el laburo tenés la PC, y una laptop al lado?&lt;/p&gt;
&lt;p&gt;¿A veces tenés que trabajar con dos o más equipos al mismo tiempo?&lt;/p&gt;
&lt;p&gt;¿Esos N equipos están en red?&lt;/p&gt;
&lt;p&gt;Enter &lt;a class="reference external" href="http://synergy2.sourceforge.net/"&gt;Synergy&lt;/a&gt;. Es un pequeño soft para compartir un teclado y un
mouse de manera transparente a través de la red, con varios equipos.
Básicamente configuran uno de los equipos como "server" (el que va a
compartir su teclado/mouse), y los demás como clientes. Configuran las
relaciones entre ellos, diciéndole al soft "la PC tal está a la
izquierda de cual, la PC foo está a la derecha de la PC bar", y listo.&lt;/p&gt;
&lt;p&gt;Cuando mueven el mouse hacia el extremo de la pantalla, el puntero
"pasa" al otro equipo, junto con el control del teclado.&lt;/p&gt;
&lt;p&gt;Y lo mejor, está disponible para Linux, OS X y Windows.&lt;/p&gt;
&lt;p&gt;Para Windows, tienen un instalador que incluye una GUI para configurar
todo (de manera bastante poco amigable, let me tell you...)&lt;/p&gt;
&lt;p&gt;Para Linux / OS X, tienen por un lado un paquete que es la librería más
los daemons (cliente y servidor), que pueden configurar mediante un par
de archivitos de texto, y por otro lado, pueden bajarse &lt;a class="reference external" href="http://quicksynergy.sourceforge.net/"&gt;QuickSynergy&lt;/a&gt;,
que los provee de una linda y sencilla GUI (bastante más intuitiva que
la de Windows).&lt;/p&gt;
&lt;p&gt;Si usan Ubuntu, tienen synergy y quicksynergy en Universe.&lt;/p&gt;
&lt;p&gt;No voy a explicar acá como se configura... Google is your friend, y hay
bocha de gente que ya se dedicó a eso en sus blogs.&lt;/p&gt;
&lt;p&gt;Yo lo estoy usando estos días en el laburo, para manejar la PC (Windows
XP) y mi laptop (Ubuntu 8.10), y anda joya!&lt;/p&gt;&lt;/div&gt;</description><category>review</category><category>Software</category><guid>https://chaghi.com.ar/blog/synergy/</guid><pubDate>Tue, 14 Apr 2009 02:13:51 GMT</pubDate></item><item><title>Hay tabla</title><link>https://chaghi.com.ar/blog/hay_tabla/</link><dc:creator>cHagHi</dc:creator><description>&lt;div&gt;&lt;div class="figure align-right"&gt;
&lt;img alt="Hay tabla" src="https://chaghi.com.ar/images/tabla.jpg"&gt;
&lt;p class="caption"&gt;Hay tabla&lt;/p&gt;
&lt;/div&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Si programan sin hacer testing, hay tabla.&lt;/li&gt;
&lt;li&gt;Si no comentan el código, hay tabla.&lt;/li&gt;
&lt;li&gt;Si no respetan los estándares, hay tabla.&lt;/li&gt;
&lt;li&gt;Si se quejan de la performance, hay tabla.&lt;/li&gt;
&lt;li&gt;Si preguntan boludeces, hay tabla.&lt;/li&gt;
&lt;li&gt;Si cuelgan el servidor con un loop infinito, hay tabla.&lt;/li&gt;
&lt;li&gt;Si reportan el mismo error dos veces, hay tabla.&lt;/li&gt;
&lt;li&gt;Si me hacen laburar un fin de semana, hay tabla.&lt;/li&gt;
&lt;li&gt;Si los casos de uso no están bien escritos, hay tabla.&lt;/li&gt;
&lt;li&gt;Si no versionan, hay tabla.&lt;/li&gt;
&lt;li&gt;Y si preguntan por esto, hay tabla.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gracias Seba por el original!&lt;/p&gt;
&lt;p&gt;BTW, habría que hacer una gigantografía, y colgarla en un par de
lugares...&lt;/p&gt;&lt;/div&gt;</description><category>Software</category><guid>https://chaghi.com.ar/blog/hay_tabla/</guid><pubDate>Mon, 06 Apr 2009 14:46:30 GMT</pubDate></item><item><title>Configurando Wake on LAN</title><link>https://chaghi.com.ar/blog/configurando_wake_on_lan/</link><dc:creator>cHagHi</dc:creator><description>&lt;div&gt;&lt;p&gt;En breve me voy por trabajo una temporada a MDQ, y entre todas las cosas
que tengo que hacer, tengo que decidir que cosas dejo operativas en el
depto, y cuales no. La idea es viajar a Baires regularmente (calculo que
cada 20 días), con lo cual no tengo intenciones de hacer un shutdown
&lt;em&gt;full&lt;/em&gt; de mi casa.&lt;/p&gt;
&lt;p&gt;¿Qué hago con la PC? Es un tema. Si bien es normal que esté varios días
encendida, haciendo de file-server o alguna otra huevada, no me gusta
mucho la idea de que esté encendida y desatendida tantos días seguidos.
No le tengo confianza a la fuente, ni a los coolers (ya me pasó una vez
llegar a casa, encontrar la PC apagada, la fuente quemada, y ese
olorcito a "algún aparato se quemó"). Una cosa es que este encendida
permanentemente dejándola sola a lo sumo un par de días, y otra dejarla
encendida sin saber a ciencia cierta cuantas semanas pasarán hasta que
alguien le eche un ojo al depto. La realidad es que hace mucho tiempo
tengo pendiente invertir en una PC más nueva, y de paso prestarle
atención a la alimentación, la refrigeración, el ruido, y el cablerío
infernal que es hoy el escritorio en donde está. Pero eso sigue sin
resolverse, y ya no tengo tiempo de resolverlo antes de la partida.&lt;/p&gt;
&lt;p&gt;Mi equipo principal de trabajo hoy es la laptop, no la PC, pero la
verdad me gustaría saber que estando en MDQ puedo contar con la PC. Por
ejemplo, para mantener sincronizados y backupeados regularmente los
datos de la laptop. Para tirar algún proceso largo. Para bajarme algún
album de mi colección de MP3. Whatever. Entonces, no quiero dejar la PC
encendida... pero me gustaría irme a MDQ sabiendo que puedo prenderla en
forma remota si la necesito unas horas.&lt;/p&gt;
&lt;p&gt;Así que me propuse volver a la carga para intentar configurar "WOL", o
Wake-On-LAN, que no es otra cosa que un feature que tiene que estar
soportado por el BIOS, la placa de red, el mother y la fuente, y que
permite mandar un "magic packet" por la red para prender el equipo.&lt;/p&gt;
&lt;p&gt;Alguna vez había intentado configurar esto, sin éxito, pero tampoco le
dediqué tiempo. Ahora tenía un motivo para investigar más a fondo, así
que me puse manos a la obra. El desafío tenía 3 partes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;dejar de usar la placa de red 3com, y pasar a la nVidia&lt;/li&gt;
&lt;li&gt;hacer que WOL funcione desde la LAN, o sea, lograr encender la compu
desde otro equipo que es parte de la red local&lt;/li&gt;
&lt;li&gt;hacer que WOL funcione desde la WAN (algunos llaman a esto WOW), o
sea, lograr encender la compu desde internet&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="cambiando-3com-por-nvidia"&gt;
&lt;h3&gt;Cambiando 3com por nVidia&lt;/h3&gt;
&lt;p&gt;Mi mother tiene 2 placas de red integradas. La primaria es una placa
nVidia con chipset Realtek, la secundaria es una placa 3com con un
chipset Broadcom. Resulta que había una época, hace muuuuuchos años,
cuando compré la PC, en que el driver "forcedeth" de Linux (el que se
usa para nVidia) no andaba ni pa'tras. Así que hacía rato que usaba la
placa 3com. También había una época en que NetworkManager era bastante
choto en cuanto a configurar una IP fija y/o a levantar la conexión
ANTES de loguearte, así que medio tenía by-passeado a NetworkManager,
con una configuración medio mirame-y-no-me-toques que nunca entendí del
todo, y tampoco quería tocar porque... bueno, para que tocar lo que
anda, ¿no?&lt;/p&gt;
&lt;p&gt;Pero resulta que de las dos placas, la que soporta WOL es la nVidia.
Fuck. Así que por eso el primer desafío era cambiar de placa de red. De
paso, si quieren investigar que cosas soporta cierta placa, se lo pueden
preguntar a ethtool:&lt;/p&gt;
&lt;pre class="code console"&gt;&lt;a name="rest_code_16555074ae154c41828c548be3bab1e3-1"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$&lt;/span&gt; sudo ethtool eth0
&lt;a name="rest_code_16555074ae154c41828c548be3bab1e3-2"&gt;&lt;/a&gt;&lt;span class="go"&gt;Settings for eth0:...  Supports Wake-on: gWake-on: g...&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;ethtool les va a decir varias cosas. En el ejemplo de arriba dejé solo
las salidas relevantes. &lt;em&gt;Supports Wake-on:...&lt;/em&gt; está seguido de una
seriede flags (letras), indicando todas las opciones de wake up
soportadas por la placa. En mi caso, solo soporta "g", que es WOL usando
un "Magic Packet" (más sobre esto, luego). La línea &lt;em&gt;Wake-on:...&lt;/em&gt; nos
muestra, dentro de las opciones soportadas, cuales están efectivamente
activas.&lt;/p&gt;
&lt;p&gt;Bueno, el tema es que hace una semana hice el cambiazo, y empecé a usar
la placa nVidia. Hice este cambio con tiempo para poder testear que todo
ande bien. La buena noticia es que los años que pasaron desde la última
vez no han sido en vano, y aparentemente el driver forcedeth just works.
Y NetworkManager sigue teniendo sus no pocas mañas, pero al menos ahora
se puede configurar una IP fija y cambiar de una configuración a otra
sin tener que encomendarte a ningún espíritu para que funcione.&lt;/p&gt;
&lt;p&gt;So far, so good.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="configurando-wol"&gt;
&lt;h3&gt;Configurando WOL&lt;/h3&gt;
&lt;p&gt;Además de tener una placa que soporte WOL, esta configuración tiene que
estar soportada por el mother y activada en la BIOS. Por defecto, no lo
está. El nombre con el que aparece puede ser bastante críptico, en mi
caso, la configuración está dentro de Power Management, y la opción que
hay que habilitar es "Power Up on PCI Device". Por otro lado, esto tiene
que estar soportado por tu fuente... pero a menos que estemos hablando
de una XT no debería ser problema, ya que me parece que alcanza con que
la fuente sea ATX.&lt;/p&gt;
&lt;p&gt;Por último, si la placa de red no está integrada (i.e., no es parte del
motherboard, y es una placa PCI aparte), es muy probable que en algún
lado tenga un conectorsito específico de WOL en el cual habrá que
chantar un cable que en el otro extremo termina en el conectorsito WOL
del motherboard. En mi caso todo esto no existe porque la placa está
integrada al mother.&lt;/p&gt;
&lt;p&gt;Hasta ahí estamos con el hardware y la BIOS... el siguiente paso, es
configurar el sistema operativo.&lt;/p&gt;
&lt;p&gt;Primer problema: El soporte WOL no está activo por defecto. Si tiráramos
el comando que mostraba más arriba, veríamos el soporte para WOL "g",
pero no lo veríamos activo. Hay que activarlo, y que yo sepa, no hay
otra que hacerlo vía ethtool:&lt;/p&gt;
&lt;pre class="code console"&gt;&lt;a name="rest_code_25f53204b1b449d782a4911198dfeaca-1"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$&lt;/span&gt; sudo ethtool -s eth0 wol g
&lt;/pre&gt;&lt;p&gt;(reemplazando eth0 por el dispositivo de red que se desea configurar si
fuera otro)&lt;/p&gt;
&lt;p&gt;Segundo problema: La activación no es persistente. Cada vez que se
reinicia la PC, y el kernel reinicializa el hardware, esa configuración
se pierde. Al menos es así con forcedeth. Así que tuve que crearme un
pequeño servicio para que active WOL en la placa de red cada vez que se
enciende el equipo.&lt;/p&gt;
&lt;p&gt;Idealmente, debería haber &lt;em&gt;algo&lt;/em&gt; en la infraestructura de networking
de Linux para configurar esto, y de manera permanente, y los DEs (por
ejemplo, Gnome) deberían brindar alguna GUI para hacer la
configuración... pero por ahora hay que ensuciarse las manos :(&lt;/p&gt;
&lt;p&gt;¿Y ahora? Si los planetas están alineados, y apagamos la PC normalmente,
y desde otro equipo dentro de la LAN enviamos un Magic Packet, la PC
debería encenderse.&lt;/p&gt;
&lt;p&gt;¿Y qué es eso de un "Magic Packet"? Si quieren detalles pueden leer por
ejemplo &lt;a class="reference external" href="http://en.wikipedia.org/wiki/Wake_on_LAN"&gt;acá&lt;/a&gt;, o googlear sobre WOL, pero básicamente un Magic Packet
es un datagrama UDP de 102 bytes (pueden ser más si se configura un
password), en el que se envía el byte 0xFF 6 veces, seguido de la MAC
address de la placa de red de destino repetida 16 veces (seguido
opcionalmente de un password). Hay múltiples utilidades para generar ese
tipo de paquetes. Yo me bajé un script en Perl que se llama, en un
derroche de originalidad, "wakeonlan" :p, porque es lo que tenía más a
mano (está en los repos de Ubuntu).&lt;/p&gt;
&lt;p&gt;Y este script, en su forma más simple, se usa así:&lt;/p&gt;
&lt;pre class="code console"&gt;&lt;a name="rest_code_b8dfed2f542843ecaa90ee2d65434a76-1"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$&lt;/span&gt; wakeonlan xx:xx:xx:xx:xx:xx
&lt;/pre&gt;&lt;p&gt;donde &lt;tt class="docutils literal"&gt;xx:xx:xx:xx:xx:xx&lt;/tt&gt; es la MAC de la placa de red.&lt;/p&gt;
&lt;p&gt;Pero resulta que no andaba, no andaba, y no andaba. Después de MUCHO
googlear (no quiero ni sacar la cuenta de las horas que perdí en
esto...), y gracias a un comentario reciente en &lt;a class="reference external" href="http://www.nvnews.net/vbulletin/showthread.php?t=70384"&gt;este post&lt;/a&gt; de hace mil
años de un foro de nVidia, descubrí que forcedeth tenía un bug que hacía
que la MAC se interprete al reves. Supuestamente lo arreglaron, pero
aparentemente en algún punto se rompió otra vez. Así que si tu placa de
red es nVidia, usas forcedeth y un kernel reciente, y tu MAC es
01:02:03:04:05:06, tenés que generar el Magic Packet como si fuera para
la MAC 06:05:04:03:02:01. ¿No era OBVIO? :(&lt;/p&gt;
&lt;p&gt;La buena noticia es que... ANDA!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="configurando-wow"&gt;
&lt;h3&gt;Configurando WOW&lt;/h3&gt;
&lt;p&gt;Hasta acá, &lt;em&gt;debería&lt;/em&gt; ser fácil. Si tu hardware lo soporta, si tu BIOS
está bien configurada, si los drivers de la placa de red del operativo
no fueran una mierda, y si tu SO te facilitara la configuración de esto
(en Windows, por ejemplo, al configuración está un poco escondida, pero
ESTA, y es persistente), deberían ser un par de clics.&lt;/p&gt;
&lt;p&gt;Ahora, querer que esto ande desde internet... es otra historia. Porque
ahí tenés que pasar por al menos un router (el tuyo), y si el mismo no
es más o menos "de verdad" y no tiene soporte nativo para WOL, vas a
tener que recurrir a algún "hack" para convencer al router de que cuando
reciba el Magic Packet, se lo pase a la PC.&lt;/p&gt;
&lt;p&gt;Mi router es un D-Link DI-524, y es bastante pedorro. No tiene soporte
para WOL. Así que hay que empezar a probar trucos. ¿Dónde está la
complejidad? WOL funciona haciendo un broadcast. Dentro de una LAN eso
está bárbaro, pero desde una WAN, obviamente uno no puede hacer un
broadcast al universo. Básicamente tenés que mandar el Magic Packet a tu
IP pública. A menos que tengas un servicio con IP fija, primero tenés
que resolver como saber en un momento dado que IP te asignó tu ISP. Esa
es una historia que tengo resuelta desde hace rato con &lt;a class="reference external" href="http://www.dyndns.com/"&gt;DynDNS&lt;/a&gt;, así
que hasta ahí, todo OK.&lt;/p&gt;
&lt;p&gt;Ahora, el tema es como hacer para que el router retransmita el Magic
Packet, y lo haga llegar a la placa de red de destino. Si el mismo no te
da ninguna solución nativa entre las opciones de configuración, la
solución pasa por configurar un virtual server, y hacer que por ejemplo
los paquetes UDP sobre el puerto 9 (que ese el que se suele usar para
WOL) los envíe a la IP-tal, donde IP-tal es la IP de tu PC. Y acá es
donde las cosas se empiezan a complicar...&lt;/p&gt;
&lt;p&gt;Obviamente, el primer paso es que tu PC tenga siempre la misma IP
interna. En mi caso, tengo esto configurado así desde hace rato, así que
vamos bien, pero el tema es que la PC va a estar apagada. Mandamos el
Magic Packet a la IP pública. El router lo recibe. Como está en el
puerto 9, y hay un Virtual Server definido para ese puerto, se encuentra
con que tiene que mandar el paquete a la IP-tal de la LAN. Entonces
manda un request ARP preguntando "¿quién tiene la IP tal?". Y resulta
que la PC está apagada para contestarle :(  Normalmente el router cachea
esta información, así que si uno apaga la PC e intenta un WOL a los
pocos minutos, &lt;em&gt;puede&lt;/em&gt; que ande. Pero después de un (normalmente) corto
tiempo, ya no.&lt;/p&gt;
&lt;p&gt;Si el router fuera más o menos bueno, uno podría cargarle un registro
estático en su tabla ARP, diciéndole que a la IP-tal le corresponde la
MAC-tal, y listo. El router ya no necesita hacer un request ARP para esa
IP. Pero mi router no permite manipular la tabla ARP, así que no es una
opción.&lt;/p&gt;
&lt;p&gt;En estos casos, lo que uno puede hacer es configurar el Virtual Server
para que use como IP privada la IP de broadcast de la LAN, entonces,
cuando el router recibe el Magic Packet, lo termina broadcasteando hacia
adentro. Pero... no siempre el router te deja definir como IP privada de
una regla de virtual server a la IP de broadcast. En mi caso, me dejaba
definirla, pero cuando recibía el paquete, se colgaba !!!&lt;/p&gt;
&lt;p&gt;A todo esto: Yo no sabía absolutamente NADA de IP broadcasting, tablas
ARP y demás conceptos de ruteo, así que fui sorteando cada nuevo
obstáculo con la ayuda de google y muchos golpes contra la pared. En
particular, &lt;a class="reference external" href="http://forums.whirlpool.net.au/forum-replies-archive.cfm/833973.html"&gt;este hilo en este foro&lt;/a&gt; está BUENISIMO. Fue gracias a ese
hilo que aprendí un montón de cosas, y que fui dando con las soluciones.
Gracias a la experiencia de otro usuario con mi mismo router, llegué a
la conclusión de que &lt;em&gt;tal vez&lt;/em&gt; si actualizaba el firmware del router iba
a solucionar el tema del cuelgue del mismo al recibir el paquete.&lt;/p&gt;
&lt;p&gt;Generalmente no soy NADA amigo de actualizar el firmware de ningún
equipo, a menos que tenga un problema que sí o sí necesito resolver, y
esté seguro que la nueva versión de firmware lo arregla (y cierta
garantía de que no rompe otras cosas en el proceso...). En este caso, si
bien dejar funcionando WOL no era de vida o muerte, y la única
"evidencia" de que con un firmware más nuevo lo podía arreglar era la
experiencia de UN usuario en UN post de UN foro encotrado al azar en
internet... decidí tirarme a la pileta. Más que nada, por calentura.&lt;/p&gt;
&lt;p&gt;Así que algunos minutos después, estaba rebooteando el router con
firmware nuevito. Así y todo... WOL desde internet seguía sin andar. El
avance fue que ya el router no se colgaba (bien!), pero la PC, ni se
inmutaba. Seguía apagadita apagadita. Lo parió.&lt;/p&gt;
&lt;p&gt;Después de un rato más de Google y paseo por diversos foros, y cuando ya
casi estaba por mandar todo a la reputamadrequelopario, encontré en
&lt;a class="reference external" href="http://ubuntuforums.org/showthread.php?t=913590&amp;amp;page=2"&gt;Ubuntu Forums&lt;/a&gt; un flaco que hablaba de &lt;a class="reference external" href="http://code.google.com/p/microwow/"&gt;microWOW&lt;/a&gt;, un MIDlet para
celulares que permite generar paquetes WOW. No le tenía mucha fe, ya que
había probado UN MONTON de servicios web para generar paquetes (además
del script 'wakeonlan' que me había bajado, y además de varias pruebas
armando paquetes "a pedal" con Python), pero perdido por perdido, decidí
probarlo.&lt;/p&gt;
&lt;p&gt;Y funcionó! Aún no se por qué, pero so far es la &lt;strong&gt;*única*&lt;/strong&gt; alternativa
que me anda fuera de mi LAN.&lt;/p&gt;
&lt;p&gt;El por qué es un misterio. Me bajé los fuentes, y constaté que no hace
ninguna magia rara. Es más, me armé una pequeña aplicación de consola en
Java usando el código ese como base, y no me anduvo. Constaté que lo que
hace ese MIDlet aparentemente es lo mismo que hace el script en Perl que
había bajado, y lo mismo que hice con diversos experimentos con Python,
pero la realidad es que TODOS los intentos por generar un Magic Packet
desde internet no me funcionan, excepto si lo genero desde el celular
con microWOW (por otro lado, TODOS los experimentos que hice SI
funcionan desde adentro de la LAN).&lt;/p&gt;
&lt;p&gt;Misterio.&lt;/p&gt;
&lt;p&gt;Lo bueno es que tengo una alternativa... lo malo es que con tanto tanto
tanto tiempo invertido, me encantaría saber a que le estoy pifiando
cuando genero el Magic Packet con otra herramienta, porque TIENE que ser
una boludez, tiene que ser &lt;em&gt;algo&lt;/em&gt; que evidentemente Java Micro Edition
hace por default con los sockets, que es diferente de lo que Java
Standard Edition hace, y es diferente de lo que yo hago desde Python, y
lo que wakeonlan hace con Perl.&lt;/p&gt;
&lt;p&gt;En un momento se me ocurrió que el problema tal vez era que en
definitiva con mis experimentos el paquete se estaba generando desde
dentro de la LAN, mientras que con microWOW se estaba generando posta
desde afuera (con el celular), pero hice la prueba de mandar un paquete
conectándome vía SSH con otro server fuera de mi LAN, y tampoco anduvo.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="conclusiones"&gt;
&lt;h3&gt;Conclusiones&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;mientras tenga mi celular a mano y servicio GPRS, puedo encender la
compu de casa en cualquier momento&lt;/li&gt;
&lt;li&gt;configurar WOL no es trivial, hay muchas variables en juego&lt;/li&gt;
&lt;li&gt;el soporte para WOL en Linux al día de hoy es bastante pedorro, y hay
que hacer todo a mano y desde una consola&lt;/li&gt;
&lt;li&gt;configurar WOW es muy complejo a menos que tengas un router de
verdad, y no uno de los juguetes que uno suele comprarse para la casa&lt;/li&gt;
&lt;li&gt;aprendí bastante sobre enrutamiento y broadcasting de paquetes...&lt;/li&gt;
&lt;li&gt;... pero no lo suficiente como para entender por que el único
generador de paquetes que me anduvo es microWOW&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si este no es a la fecha el post más largo en este blog (a excepción de
los relatos de viajes), le pega en el palo...&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;</description><category>GNU/Linux</category><category>Software</category><guid>https://chaghi.com.ar/blog/configurando_wake_on_lan/</guid><pubDate>Sun, 22 Mar 2009 01:50:24 GMT</pubDate></item><item><title>IronPython pyc</title><link>https://chaghi.com.ar/blog/ironpython_pyc/</link><dc:creator>cHagHi</dc:creator><description>&lt;div&gt;&lt;p&gt;Estuve investigando el supuesto camino de pre-compilar módulos para ver
si lograba resolver los problemas de performance que &lt;a class="reference external" href="https://chaghi.com.ar/blog/probando_ironpython_2"&gt;mencioné hace unos
días&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Resulta que la punta del iceberg estaba escondida en el pack de
&lt;a class="reference external" href="http://ironpython.codeplex.com/Wiki/View.aspx?title=Samples"&gt;ejemplos&lt;/a&gt; de IronPython, que se descarga aparte. En ese paquete está,
entre otras cosas, el famoso pyc.py, parte de cuyo README nos cuenta:&lt;/p&gt;
&lt;blockquote&gt;
This sample demonstrates the use of the Python Hosting APIs to
compile Python files into .NET executables.  The behavior of the
generated files is actually quite similar to that of CPython files
with the ".pyc" file extension.&lt;/blockquote&gt;
&lt;p&gt;Bueno, ni tanto. El script de ejemplo solo es un programita de consola
para compilar en bloque una serie de módulos, y generar un assembly.
Básicamente, es una interfaz al nuevo método CompileModules del CLR, y
hay una explicación bastante detallada de como funciona todo esto
&lt;a class="reference external" href="http://blogs.msdn.com/srivatsn/archive/2008/08/06/static-compilation-of-ironpython-scripts.aspx"&gt;acá&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A menos que me esté perdiendo de algo, sinceramente no entiendo de donde
sacan que el funcionamiento de todo esto es "similar al de los archivos
CPython de extensión .pyc".&lt;/p&gt;
&lt;p&gt;Veamos por que:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Explícitamente tengo que compilar los módulos. En CPython, esto es
transparente.&lt;/li&gt;
&lt;li&gt;Explícitamente tengo que indicar cual es el módulo que actuará como
"entry point". En CPython, esto no es necesario.&lt;/li&gt;
&lt;li&gt;Si compilo varios módulos, termino con un único assembly con todo. En
CPython, cada .py genera su propio .pyc.&lt;/li&gt;
&lt;li&gt;Pero lo más importante: Para usar el módulo compilado, tengo que
cambiar los fuentes que lo consumen (importan). En CPython, el uso de
los .pyc por parte del intérprete es completamente transparente.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El último punto es re-importante, y es la diferencia más grave. En
CPython, si tengo un módulo foo, en el archivo foo.py, lo importo así:&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_0dedfc61ed914f92aaaff77ad254c001-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;foo&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;... y resulta que si ese módulo está pre-compilado en foo.pyc, es lo
mismo. Para mí no cambia nada. El intérprete agarra el .pyc. Y es más:
El intérprete se ocupa de determinar si el .py cambió (es decir, si el
.pyc ya no es válido).&lt;/p&gt;
&lt;p&gt;En IronPython, al usar la compilación de módulos, y asumiendo que ya me
haya tomado el trabajo de generar foo.dll (lo que me están vendiendo
como "equivalente a un .pyc", para usar el assembly tengo que hacer
esto:&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_5713829923dc48bab4acf76a8ca8d61c-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;clr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"foo.dll"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_5713829923dc48bab4acf76a8ca8d61c-2"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;foo&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;Y eso tiene varios problemas:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;El código dejó de ser compatible con CPython (por el uso de clr)&lt;/li&gt;
&lt;li&gt;Si alguien borra el assembly, el código pincha&lt;/li&gt;
&lt;li&gt;Si foo.py sufre algún cambio, y nadie lo recompila, sigo levantando
la foo.dll con el código viejo, y capaz ni me entero&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Todo es más o menos workarroundeable: Podría tener un módulo clr "dummy"
que no haga nada en CPython, podría meter el AddReference en un
try/catch, podría crearme un modulito genérico que generalice toda esta
magia, e incluso se ocupe de verificar si el assembly debe ser
recompilado... pero no es el punto. Esto NO es lo mismo que un .pyc.&lt;/p&gt;
&lt;p&gt;Anyway, estuve jugando con el esquema. Aplicarlo a algo como Cheetah es
muy complejo, porque está compuesto por muchísimos módulos. ¿Cuáles
compilo? ¿Todos? ¿Algunos? ¿Genero un solo assembly? ¿Genero un assembly
por cada módulo? ¿Cuál es la diferencia? La documentación oficial sobre
todo lo que tenga que ver con la compilación estática de scripts es
sumamente escasa, por no decir inexistente.&lt;/p&gt;
&lt;p&gt;Lamentablemente, no llegué a ningún resultado útil. Si compilo Cheetah,
igual sigue tardando una bocha en importarse, y lo que es peor: ¡Después
no anda! Se importa aparentemente ok (tardando...), pero luego al usarlo
empiezan a producirse errores extraños, inesperados.&lt;/p&gt;
&lt;p&gt;También noté que si compilo un programa de consola, tengo problemas por
ejemplo con sys.argv. En la versión compilada, pierdo los parámetros
(sys.argv es siempre ['']).&lt;/p&gt;
&lt;p&gt;Conclusión: El esquema de compilación estática no es transparente, no
funciona igual que los .pyc de CPython, es más engorroso de usar, obliga
a cambiar el código fuente, no acelera la importación, e introduce
side-effects y errores inesperados.&lt;/p&gt;
&lt;p&gt;Me parece que el equipo de desarrollo de IronPython debería volver a
leer el Zen de Python...&lt;/p&gt;
&lt;p&gt;Mientras tanto, este esquema a nosotros no nos sirve. No solo no nos
resuelve la performance, sino que nos obliga a armar toda una magia para
implementarlo, y encima, después funciona a medias, o directamente no
funciona.&lt;/p&gt;&lt;/div&gt;</description><category>ironpython</category><category>net</category><category>Python</category><category>Software</category><guid>https://chaghi.com.ar/blog/ironpython_pyc/</guid><pubDate>Sun, 08 Mar 2009 21:21:47 GMT</pubDate></item><item><title>Probando IronPython 2</title><link>https://chaghi.com.ar/blog/probando_ironpython_2/</link><dc:creator>cHagHi</dc:creator><description>&lt;div&gt;&lt;p&gt;Hace un tiempo vengo haciendo diversas pruebas con IronPython 2,
principalmente por sus mejoras en compatibilidad con CPython, y sus
mejores opciones de integración con VS (en particular VS 2008).&lt;/p&gt;
&lt;p&gt;A partir de aquel &lt;a class="reference external" href="https://chaghi.com.ar/blog/exoditus_en_python"&gt;experimento que alguna vez comenté&lt;/a&gt;, en el laburo
decidimos usar &lt;a class="reference external" href="http://www.cheetahtemplate.org/"&gt;Cheetah&lt;/a&gt; e &lt;a class="reference external" href="http://www.codeplex.com/IronPython"&gt;IronPython&lt;/a&gt; como núcleo de nuestro
generador de código. Hace un tiempo había empezado a experimentar con
IronPython 2, y me dí contra la pared cuando descubrí que Cheetah (en su
momento el único &lt;em&gt;template engine&lt;/em&gt; que encontré que andaba con
IronPython) ya no funcionaba del todo bien, y que además, era
&lt;em&gt;lentísimo&lt;/em&gt;. Oportunamente reporté esto en &lt;a class="reference external" href="http://ironpython.codeplex.com/WorkItem/View.aspx?WorkItemId=17753"&gt;CodePlex&lt;/a&gt;, pero
básicamente parecía haber quedado en el olvido.&lt;/p&gt;
&lt;p&gt;Los problemas de Cheetah en el peor de los casos podían salvarse con un
par de workarounds, pero implicaba tocar bastante código de nuestro
lado, y además caer en cosas no recomendadas por la doc de Cheetah. Así
que no era lindo. Pero además, lo de la performance era... intolerable.
Simplemente intolerable.&lt;/p&gt;
&lt;p&gt;Así que seguimos usando IPy 1.1.&lt;/p&gt;
&lt;p&gt;En los últimos días me hice de algo de tiempo para probar IPy 2.0.1, la
última release estable de IronPython. Y me encontré con 2 gratas
sorpresas:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Cheetah funciona otra vez &lt;em&gt;as expected&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;parte&lt;/em&gt; de los problemas de performance están resueltos;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eso último, parcialmente: Lo que encontré es que usando IPy 2.0.1, el
generador de código funciona perfecto, y descontando la inicialización
de Cheetah, incluso es por lo menos un 30% más rápido que IPy 1.1. ¿Lo
malo? La inicialización de Cheetah es PATETICAMENTE lenta.&lt;/p&gt;
&lt;p&gt;¿A qué le llamo "inicializar Cheetah"? A un simple&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_39b31e698c094660a901bb14e95bfce9-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;Cheetah.Template&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Template&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;Eso en CPython es &lt;em&gt;instantáneo&lt;/em&gt;. En IPy 1.1 tarda &lt;em&gt;segundos&lt;/em&gt; (más de 5",
y a veces hasta 10"), y en IPy 2.0.1 tarda el triple que en IPy 1.1 :(&lt;/p&gt;
&lt;p&gt;¿Es un problema de Cheetah? No. Es un issue conocido en IronPython que
los module imports son lentísimos, y que a veces muchas de las mejoras
de performance de IronPython sobre CPython a nivel runtime se pierden
porque de pronto en medio de tu código tenés un inocente import que se
lleva el 80% del tiempo de ejecución. Una reverenda cagada. Mal.&lt;/p&gt;
&lt;p&gt;IPy 1.1 tenía una opción &lt;em&gt;SaveAssemblies&lt;/em&gt; que permitía guardar las DLL
que generaba el intérprete. Eso ayudaba un poco, aunque no mucho en el
caso de los imports. El tema es que esa opción no existe más en IPy 2.x.
Supuestamente, para IPy 2.x se estuvo trabajando en una precompilación
similar a la de CPython (algo parecido a la generación de .pyc), y por
más que el tema está mencionado en las release notes y todo, no logro
encontrar como cuerno se activa y/o usa y/o implementa eso. De todos
modos no tengo muchas esperanzas, porque leí en varios lugares que de
nuevo, en el caso de los imports, esta precompilación no aporta mucho,
pero en nuestro caso algo es algo, y me gustaría probarlo.&lt;/p&gt;
&lt;p&gt;Dear lazy web, does anybody know how to test the "precompile" feature of
IronPython 2.x?&lt;/p&gt;&lt;/div&gt;</description><category>ironpython</category><category>net</category><category>Python</category><category>Software</category><guid>https://chaghi.com.ar/blog/probando_ironpython_2/</guid><pubDate>Sun, 01 Mar 2009 16:11:08 GMT</pubDate></item></channel></rss>