el blog de cHagHi

(el rejunte on-line de todo aquello que deseo compartir)

 

ISO votó en contra del reconocimiento de Open XML como estándar internacional

A Microsoft se le viene complicando desde hace rato, sobretodo en Europa, el tema de sus formatos "opacos" de datos para documentos.

Hace varios años atrás, con el respaldo de Oasis, se definió un estándar internacional: OpenDocument.

Mientras tanto, Microsoft diseñó un nuevo formato, basado en XML, que se llama "Open XML". Sí, es XML. Sí, es texto. Sí, el nombre tiene el substring "open", pero muchas personas que analizaron a fondo la especificación notaron que:

  • Es INSANAMENTE grande (más de 6000 páginas (no, no le pifié a un cero));
  • Deja un montón de puertas abiertas para que, por más que sea un XML, se siga dependiendo de herramientas propietarias de Microsoft para trabajar con los archivos;

Microsoft alega que OpenDocument es insuficiente y tiene falencias... pero bueno, en lugar de trabajar para mejorar ese estándar, siguió impulsando OpenXML. Pero resulta que entonces apareció otro problema: OpenDocument está considerado un estándar internacional, y ha sido recomendado por más de un organismo gubernamental (de nuevo, en Europa, donde el marketing es un poquito menos descarnado...). Y OpenXML no. Así que Microsoft decidió pedirle a ISO que considere OpenXML como un estándar...

... pero siguiendo lo que se denomina "fast-track", que básicamente significa, no miremos en detalle la especificación (recuerden: más de 6000 páginas), primero definamos que es un estándar, y DESPUES, veamos que hay que arreglar. Mágicamente, varios países y organismos miembros de ISO que NO tenían poder de voto en esta decisión, solicitaron a último momento el "upgrade" de su status dentro de ISO para poder votar (¿lobby?). Así y todo, ganó la cordura. Por ahora, OpenXML no es un estándar.

Más info sobre la votación, en Ars Technica

Alguien podría decir, y con razón, "y quien sos vos para opinar, ¿acaso leíste las especificaciones?" No, claro que no. Ni siquiera la de OpenDocument, que es mucho más chica. Pero lo que yo digo es: NO necesitamos DOS estándares para documentos. Necesitamos UNO, y que sea bueno y completo. Entonces, si OpenDocument no sirve del todo, MEJOREMOS eso. Pero no hagamos otro.

Y por sobretodas las cosas: No hagamos otro que es CERRADO bajo la mentira de que es abierto, solo porque es un XML, y una empresa muy poderosa dice que es abierto.

 

SQLAlchemy: Un ORM que sabe de álgebra relacional

Hace algunas semanas que estoy leyendo la doc y haciendo algunos experimentos "caseros" (descolgados, sin ningún propósito concreto de momento) con SQLAlchemy.

SQLAlchemy es, al mismo tiempo, un set de herramientas de acceso a SQL  y un ORM. Y resalto el "y". Es la primera herramienta de estas características que veo que implementa este concepto de separar claramente, e incluso como cosas usables de manera independiente, las dos caras de la moneda: El "lidiar" con SQL desde una aplicación (sobretodo para consultas), y el mapear un modelo de objetos a una base de datos.

Traducción libre de la página principal del sitio:

Las bases de datos SQL se alejan más del comportamiento de una colección de objetos a medida que la performance y el tamaño de la base de datos se vuelve más importante; las colecciones de objetos se alejan más de conceptos como tablas y filas conforme la abstracción se vuelve más importante. SQLAlchemy intenta acomodar simultáneamente estos principios.

SQLAlchemy no ve a las bases de datos sólo como una colección de tablas; las ve como motores de álgebra relacional. Su ORM permite mapear clases contra una base de datos de varias formas distintas. Las sentencias SQL no solamente consultan tablas—es posible realizar consultas de joins, subqueries y uniones. Así, las relaciones de la base de datos y el modelo de objetos se desacoplan desde el principio, permitiendo que los dos conceptos se exploten a su máximo potencial.

Realmente esto no es marketing, cuando uno empieza a usar la herramienta y analizar los ejemplos en la documentación, se ve claramente que esta filosofía se aplica... y da frutos. De todos los ORM existentes para Python, creo que SQLAlchemy es el único considerado "de verdad", es decir, que podría usarse en escenarios más complejos de la simple aplicación web con 3 o 4 ABMs que normalmente se desarrollan con Django o TurboGears. Es a su vez uno de los más nuevos, pero ha tomado la comunidad "por asalto", y me atrevo a especular que es por lejos el que más rápidamente ha avanzado (y continúa avanzando...)

SQLAlchemy escala hacia arriba... y hacia abajo. Por ejemplo, está creciendo bastante también un proyecto, Elixir, que implementa una capa "declarativa" sobre SQLAlchemy que resuelve de una manera sencilla e intuitiva (muy al estilo del Active Record de Ruby on Rails) los casos más comunes.

Por último (y esto no es exclusivo de SQLAlchemy, sino extensivo a todos los otros ORMs para Python): Cuánto más "lindo" es un ORM con un lenguaje dinámico. Cuando hay que acercar los mundos de SQL y OOP en Java o C#, se nota mucho el overhead de jerarquías de clases y abstracciones e interfaces que se "apilan" para lograr algo extensible y robusto... y que adhiera a las restricciones del tipado estático. Con Python (o Ruby), se puede crear el puente, igualmente extensible y robusto, de una manera mucho más directa. Gracias a Dios Darío en el laburo tenemos un excelente generador de código que nos resuelve automágicamente toda la parafernalia de código extra... si no lo tuviéramos, calculo que estaría pidiendo a gritos que laburemos con otra cosa... jeje.

 

Y ya que estamos, un año antes escribía: Kernel.ORG FAQ

VirtualBox 1.5 - Seamless windows

¿Notan una mezcla rara en este screenshot?

VirtualBox 1.5 Seamless windows

:)

Es un nuevo chiche de la versión 1.5 de VirtualBox. La llaman "Seamless windows", y lo que hace VB en este modo es ocultar el escritorio del sistema operativo guest (Windows XP Home en este caso), para lograr una mayor integración con el host.

Por ahora, únicamente funciona para Windows como "guest", y no al revés, y requiere que sí o sí el sistema operativo virtualizado tenga instaladas las "guest additions".

Ya había visto (aunque no probado) experimentos similares usando QEMU, y también pruebas sobre VirtualBox, pero en ambos casos usando un feature de Windows Terminal 6 (o superior) que permite que el cliente en lugar de recibir el escritorio completo de Windows pueda recibir solamente la ventana activa. Entonces, el truco era correr Windows virtualizado en background, y luego abrir alguna aplicación mediante el cliente Terminal Server de Linux. Pero esto tiene varios drawbacks:

  • Es bastante complejo de configurar / administrar
  • Funciona únicamente para Windows, y solamente versiones de windows que tengan implementado el RDP (Remote Desktop Protocol), lo cual te limita a versiones Professional o Enterprise (no Home) de Windows XP o superior.
  • Por una limitación de RDP, solo se puede trabajar con una aplicación simultánea (aunque creo que algunas versiones de Windows, o con configuraciones especiales, esta limitación podía salvarse).

El approach que eligió VirtualBox me gusta más. Si bien por ahora funciona solo con Windows, funciona en CUALQUIER Windows en el que sean instalables las Guest Additions. No depende de ninguna configuración de networking entre host y guest. Puedo abrir todas las ventanas y aplicaciones que quiera. Y calculo que a futuro implementarán esto también en las guest additions de Linux y MacOS. Mi impresión personal es que arrancaron con Windows porque hay más usuarios que corren Windows sobre Linux que al revés.

Y lo más lindo: Funciona out of the box. No tuve que hacer nada más que actualizar VirtualBox, arrancar la virtual machine que tiene instalado Windows, actualizar las Guest Additions también a 1.5... y listo. Con CTRL-L conmuto entre el modo seamless y el normal.

 

Deprecando mi casilla de e-mail de Sion

Me costó tomar la decisión, porque es, por lejos, mi dirección de e-mail mas antigua. Es histórica. Toda mi historia de e-mails personales está prácticamente en un 100% vinculado a esa casilla.

Pero, el servicio tiene cada vez más incovenientes. Quizás hace un tiempo atrás no se notaba, pero hoy, la verdad, es una basura:

La interfaz del webmail que me dan para accederla, es MALISIMA. Es una pila de bugs. No es que tiene "algunos" bugs, o "algunos" problemas de usabilidad. Es que en el uso NORMAL del webmail, uno se choca todo el tiempo con errores. Errores de este tipo: Estoy leyendo un mail. Lo quiero borrar. No puedo. Mientras estoy en el contexto de un mail, no puedo! Tengo que volver a la lista de mensajes, marcarlo, y ahí sí, apretar borrar. Se borra. Voy a otra carpeta. Miro otro mail. Vuelvo al inbox. El mail que acabo de borrar, aparece otra vez. En realidad está borrado, pero hasta que no cierro la sesión de webmail y vuelvo a abrirla, aleatoriamente aparece / desaparece del inbox. Podría hacer una lista de no menos de 10 bugs de este tipo... pero no tiene sentido.

Me dan solamente 50 MB de almacenamiento. NADA! A esta altura del partido, no es NADA. Cualquier proveedor gratuito está en estos momentos dando como mínimo 10 veces más almacenamiento que eso.

El SPAM es inmanejable. Sí, SION tiene un Antispam, y uno muy bueno, SpamAssassin. Pero... el cráneo que ideó la configuración, no previó NINGUN mecanismo para que yo pueda "entrenar" al filtro Bayesiano. Un antispam que no funciona en base a filtros estadísticos NO SIRVE. Y un filtro estadístico que no puedo entrenar, tampoco. Yo puedo configurar el nivel de "severidad" del filtro (ser más agresivo o no en el filtrado), pero cuando el filtro se equivoca, no puedo corregirlo. No tengo forma de darle feedback al sistema para decirle "te equivocaste. Esto que marcaste como spam no es spam", o al reves "me dejaste pasar este mail, y en realidad es basura". Entonces no sirve. Porque sigo recibiendo spam en mi inbox, y lo que es peor, tengo todos los días que ponerme a mirar el spam retenido en el servidor (con una interfaz web aún más pedorra que la del webmail, y eso es mucho decir...), para ver qué cosas el filtro marcó como spam y en realidad no lo son.

Conclusión: La casilla de correo que ofrece Sion actualmente con el servicio de Banda Ancha, no sirve ni para espiar. Hasta que no den un espacio de almacenamiento razonable, tengan una interfaz de webmail decente, libre de errores, y usable, y no tengan un método de control de spam como corresponde (en lugar de una mentira de marketing...), usar esa casilla es permanentemente un dolor de cabeza.

Así que deshabilité el filtro antispam, configuré mi cuenta de GMail para que me recupere los mails de Sion (el filtro antispam de GMail es EXCELENTE!), y le avisé a todos mis contactos que estoy deprecando mi casilla de Sion en favor de la de GMail.

La casilla de Sion la voy a chequear algunas semanas / meses más. Cuando vea que todo lo que llega ahí es basura... dejaré de mirarla, y que se pudra en el olvido.

 

Y ya que estamos, un año antes escribía: Finde de cine, chiches nuevos y otras yerbas

Potpurri: Chocolate, Cosmos, Python, AJAX, 15 años no es nada...

Pongámonos al día. Lamento si el título del post confunde a los web spiders... but so be it :)

El viernes pasado cumplimos con Facu el viejo "proyecto" de ir a tomar chocolate con churros a La Giralda. El día no podría haber estado mejor: Frío, lluvioso... especial para un "chocolate espeso con churros", la especialidad de la casa. Fuimos ahí porque es como un clásico, y está este mito urbano de que "el" lugar para tomar chocolate con churros en Baires es La Giralda. ¿Estuvo bueno? Si. ¿Es para cortarse las venas? No. El lugar es pintoresco... tanto como tantas otras viejas confiterías y bares de Bs. As. que aún están en pie, y mantienen su mobiliario y decoración original. Hay mucha gente, la atención es buena, el servicio rápido, y los precios razonables. Pero el chocolate hecho por mi vieja, mi tía, mi abuela (en mi familia hay cierto rito por ejemplo de tomar chocolate el domingo de Pascuas) no tiene NADA que envidiarle. Y los churros están buenos, sí, pero no espectaculares. Podrían haber estado más frescos, por ejemplo. El churro es algo que hay que hacer y comer relativamente en el momento. La masa no se lleva bien con la humedad, Baires es húmedo, y el viernes el día era un pegote. Mala combinación si vas a tener los churros preparados de antemano.

Después vimos un par de capítulos de Cosmos. Sí, aquella serie "Cosmos" de Carl Sagan hecha para TV, que se corresponde con el libro homónimo. Resulta que hace ya una pila de tiempo que tengo los DVDs, pero cuesta hacerse el tiempo para verlos. Ya llevamos 4 episodios (¿o 5?), y si no subimos el ritmo (hasta ahora, un pobre dos por año), nos vamos a jubilar antes de llegar al 13.

Aprovechamos para hablar un poco de Python. Básicamente porque quiero engancharme en algún proyecto con Python, y no termino de definir cual, si sumarme a algo, si arrancar algo por mi cuenta... tengo el tiempo y la motivación. Quiero volver a tener el hobby de meterme en un proyecto en el que programar sea divertido, y no tengas todo el tiempo que luchar contra imposiciones y complejidades de una tecnología (y/o lenguaje) que todo el tiempo se mete en medio de lo que querés lograr, o te hace perder el 50% del tiempo de desarrollo compilando, debuggeando, esperando al IDE, etc. Y el único lenguaje que conozco que cumple esa premisa hasta ahora es Python :)

Tengo ganas de hacer algo web, para meterme más en TurboGears, o Django, o Pylons, pero no tiene mucho sentido hacer algo web si uno luego no va a dar un servicio. Tampoco quiero meterme en un proyecto demasiado grande... me gustaría poder ver resultados más rápido, y no quisiera lidiar con un codebase enorme, viejo, parchado (sí, en Python también se pueden hacer chanchadas...). Veremos que sale de todo esto.

Parte de la motivación de hacer algo web tiene que ver con que últimamente estoy usando bastante Netvibes y RememberTheMilk. Cada uno en lo suyo los dos sites tienen muchas cosas interesantísimas de usabilidad en una aplicación web que me parece muy piola extrapolar a otros escenarios. Así que básicamente tenía ganas de hacer algo en lo que pueda ver hasta donde se puede lograr este tipo de cosas con muuuuuucho AJAX usando, por ejemplo, Django.

Para terminar este "catch up", el sábado mi prima Agus festejó sus 15. Puf...! Ratazo que no iba a una fiesta de 15. Creo que la última fue la de Flor, su hermana... y de eso hace ya bastante tiempo. Nos divertimos mucho, me puse al día con los usos y costumbres (que siempre van cambiando). Por ejemplo: Ahora se usa que las amigas más íntimas de la cumpleañera le armen un baile, una coreografía, con vestuario y todo, sobre algún tema musical. Y no voy a comentar más, porque después van a decir que soy un depravado. :) Además, vino especialmente de Yankeelandia Fede para estar presente en calidad de hermano mayor en el evento, así que de paso nos pusimos al día.

Algo que me llamó la atención fue la música: Es básicamente *la misma* que se escuchaba "en mi época" (Dios! me siento un viejo choto diciendo eso...). Más o menos remixada, con algún ritmo cambiado, cantada por otro intérprete/banda, pero la misma. La excepción es alguna que otra cumbia. Pero nada más. Raro. Uno espera escuchar la misma música en los casamientos de mis amigos, por ejemplo, porque bueno, compartimos una generación. Pero no en un cumpleaños de 15. Creo que eso demuestra lo pobre que está el escenario musical hoy en día: O te vas a la cumbia (por goleada, el ritmo más fructífero de los últimos años), o te vas a la música electrónica (que en una fiesta así, heterogénea, es insoportable, y supongo que por eso no se pasa), o tenés que caer en los clásicos (y no tanto) de hace 10, 15, 20 o más años. Es que en lo que respecta a Pop / Rock... el terreno tiene cada vez más vacantes.

 

ActionMonkey == Python y Ruby en Firefox

Acabo de enterarme de un proyecto de Mozilla, ActionMonkey, que cuenta con el apoyo de Adobe, que es la fusión de otros dos proyectos que no sabía que estaban en danza: Tamarin y SpiderMonkey. ¿Y para qué tantos proyectos y siglas? Para lograr que en un futuro, se pueda usar IronPython e IronRuby (las implementaciones .NET de Python y Ruby), de la misma forma que hoy se usa JavaScript.

Es buenísimo. Imaginen poder hacer algo como <script lang="text/python">

Y además, la idea es que esto NO requerirá que el cliente tenga instalado el runtime de .NET (ni el de Mono, para el caso), ya que se pretende mapear (traducir) el bytecode de IronPython / IronRuby en el bytecode de Tamarin.

Tamarin es el plato fuerte de esta ensalada: Es el componente de Firefox que se encarga de ejecutar el JavaScript, por ejemplo. A futuro, la idea es transformarlo en una implementación open source de alta performance de ECMAScript 4. Actualmente los usuarios de Firefox estamos usando una versión de Tamarin que soporta ECMAScript 3. La siguiente versión, incorporaría la última especificación de Adobe (que fue "donada" a Mozilla), y abriría la puerta a hacer esta "traducción" en tiempo de ejecución de CIL a Tamarin.

Acá hay bastante más información al respecto:

Ja! Esto le agrega algo más de significado a aquel slogan inicial de Firefox que decía "Rediscover the web"... ;)

 

Instalando un servidor XMPP en Windows

Hoy hice la prueba de buscar e instalar un servidor XMPP / Jabber sobre Windows. La motivación fue usarlo en un contexto donde N personas tenemos que colaborar, y si bien estamos cerca (podemos hablar), es cómodo poder tener mensajería instanánea entre nosotros, y tenemos una red muy restringida desde la cual no podemos usar ninguno de los servicos de IM normales.

Investigando un poco en Jabber.org, terminé instalando ejabberd. Fantástico. Click - Click - Siguiente - Siguiente, y listo. Teníamos servidor Jabber. Recomendable, porque se baja e instala en 5'. No necesita configuración (ojo, no la necesita asumiendo que lo vas a instalar localmente, temporalmente para uso en una LAN en un grupo de personas de confianza...), y me parece que es una alternativa válida cuando de repente se junta un grupo de N personas a codear o algo, y a lo mejor no querés colgarte de un canal de IRC, y no querés conectarte a una red de IM pública para evitar que te distraigan. O, como en nuestro caso, para al menos poder usar la herramienta en un grupo de trabajo local cuando tenés bloqueadas otras alternativas.

ejabberd es multiplataforma. Por ahora, lo probé solo en Windows.

Bonus Track: También necesitábamos un cliente. Terminamos probando Pandion. Solo soporta Jabber, y funciona solo en Windows. Pero cumple su promesa de foco en usabilidad y sencillez. Y es muy liviano.

 

No más dual-boot en mi laptop (chau Windows!)

Hace unas semanas atrás comentaba que estaba experimentando con herramientas de virtualización, y que si todo iba bien probablemente eliminaría la partición física de Windows XP Home, para usarlo solamente en una máquina virtual. Hoy completé esa movida.

Finalmente, me decidí por VirtualBox. Está andando muy bien; probé varias herramientas pesadas (SQL Server Express, Visual Studio Express, ...) y no tuve ningún problema. Alguna que otra vez la VM abortó, por ejemplo, luego de mirar algún trailer en formato QuickTime de los del sitio de Apple usando Firefox. Pero han sido casos aislados... si bien la VM no debería abortar así de feo, me ha pasado colgar Windows "nativo" esporádicamente también, así que no se hasta que punto la falla es en la VM, o Windows se va al cuerno, y la VM no llega ni a dar un mensaje de error y aborta. Anyway, no fue motivo suficiente para no migrar.

Realmente esta configuración es más útil. De hecho, desde que estoy usando Windows así, lo booteo un poquitín más seguido. Es como que la barrera de dejar mi entorno de trabajo para iniciar otro OS desaparece... puedo curiosear algo en Windows, y mientras tanto sigo usando Ubuntu. E incluso los puedo tener en red, como si fueran dos equipos. Así que incluso es más fácil compartir recursos entre ambos. ¿Qué pierdo? La aceleración 3D dentro de Windows. Pero como no uso aplicaciones 3D en Windows, no me afecta. Y es algo en lo que todos los productos de virtualización están trabajando (de hecho, algunas versiones de VMWare y Parallels la soportan en ciertas condiciones/plataformas), así que quien sabe... de acá a que lo necesite (si es que llego a necesitarlo), quizás esté resuelto y todo. Por lo que veo, es la única cosa que impide que el tema de la virtualización despegue del todo fuera del mundo server, sobretodo por los gamers. Porque por todo lo demás, es mucho más conveniente que un esquema de dual-boot.

La movida terminó implicando comprar más RAM para la laptop. Si bien no era imprescindible (con la RAM que tenía las cosas andaban), se notaba que le estaba robando 512M de memoria al OS para correr otro... y como la inversión en más RAM es algo que había quedado pendiente, y de todos modos pensaba hacerla tarde o temprano, aproveché la "excusa". Después de pedir un presupuesto a Dell (que básicamente me pasó un precio absolutamente traído de los pelos), evaluar la posibilidad de comprar a través de internet en el exterior, averiguar un poco en MercadoLibre, y googlear otro tanto, dí con Vulcano (aka "Notebook Outlet"). La experiencia de compra con esta gente resultó EXCELENTE: todo por internet/e-mail, rápido, automatizado... un lujo. Recomendable. Y (dentro de Argentina) resultó la alternativa con mejor precio.

Hoy dí el último paso, que fue borrar Windows, y reorganizar las particiones en disco para que queden más prolijas. Ya había quedado "rara", producto de que el esquema de particionado de Dell es raro, y yo lo "manosié" para instalar Ubuntu. Además, con el agregado de RAM me había quedado corto con la swap (y si bien con 2GB de RAM no swapeo nunca, es importante para suspender el equipo). Así que me puse a reorganizar.

El esquema que tenía, es este:

  • Partición primaria de DellUtility (47M)
  • Partición primaria de Windows XP (20G)
  • Partición Extendida (~55G)
    • Partición boot de Ubuntu (100M)
    • Swap de Ubuntu (1G)
    • Volúmen LVM, conteniendo mis filesystems "/", "/home" y "/opt" (54G)

... y lo llevé a este:

  • Partición primaria de DellUtility (47M)
  • Partición primaria de boot de Ubuntu (200M)
  • Partición Extendida (~74G)
    • Swap de Ubuntu (2G)
    • Volúmen LVM, conteniendo mis filesystems "/", "/home y "/opt" (57G)
    • Algo de espacio libre no asignado...  para pruebas y demás (15G)

A veces hay gente que me dice que tener LVM en un desktop o laptop es demasiado... bueno, no. En situaciones como ésta, se paga solo el haber transitado la (pequeña) curva de aprendizaje de saber manejarlo, y tener mis datos en volúmenes LVM. Mover el boot y el swap de un Linux es relativamente sencillo: Solo basta arrancar con algún LiveCD, reacomodar, reconfigurar el gestor de arranque y listo. Pero mover de acá-para-allá particiones con datos NO es tan trivial... salvo cuando usás LVM :)

Si bien el cambio lo tuve que hacer en 4 o 5 etapas, moví TODO sin perder los datos, sin tener que reinstalar, y sin tener que pasar los datos transitoriamente a otro disco mientras "reacomodaba" las particiones.  

Corolario: No más dual-boot, mi Windows XP Home corre virtualizado dentro de Ubuntu, y ahora tengo suficiente RAM para jugar más cómodo con esto de la virtualización. Por ejemplo, para cumplir el proyecto largamente postergado de empezar a probar más temprano en el ciclo de desarrollo las versiones alfa de Ubuntu, e involucrarme más en la comunidad.

 

A veces no hay nada mejor que un editor "de verdad", como Vim

(Emacs fans: ya sé que Emacs es también un editor de verdad... pero el punto de este post no es Vim vs Emacs)

Desarrollar en ASP.NET con C# sin Visual Studio .NET es complicado. O al menos Microsoft se esfuerza bastante en que así sea. Y cuando uno tiene que trabajar en equipo, es complicado si cada uno usa su propia herramienta... así que en el laburo todos usamos VS. Como todo super IDE, tiene cosas buenísimas, cosas más o menos, y cosas malas. Como editor de texto... está bastante bien mientras uno hace cosas estándares. Pero no es la primera vez que me pasa que para hacer una edición "de verdad", no queda otra que recurrir al viejo y querido Vim (que es mi editor de elección en otras plataformas / proyectos personales / lenguajes).

Imagínense que tienen una clase que expone unas 200 propiedades de este estilo:

///  
/// Kms Extendidos para Traslados
///
public int KmsExtendidosTraslados
{
get
{
return ((int)_sesionInfraestructura.ValorParametro("KmsExtendidosTraslados", "Cantidad de Kms a partir de la cual se considera Extendido", "GEN", "E", "50"));
}
}

... y tienen que transformarlas a TODAS, siguiendo este estilo:

/// 
/// Kms Extendidos para Traslados
///
private int? _kmsExtendidosTraslados = null;
public int KmsExtendidosTraslados
{
get
{
if (!_kmsExtendidosTraslados.HasValue)
_kmsExtendidosTraslados = (int)_sesionInfraestructura.ValorParametro("KmsExtendidosTraslados", "Cantidad de Kms a partir de la cual se considera Extendido", "GEN", "E", "50");
return _kmsExtendidosTraslados.Value;
}
}

En este momento, no importa demasiado que hace ese código, ni el por qué del cambio (aunque creo que para más de uno puede ser bastante obvio, aún fuera de todo contexto...). Lo imporante, es que hay unos cuantos "desafíos":

  • hay que declarar una variable privada del mismo tipo, pero nullable, e inicializada en null;
  • la variable se llama igual que la property, pero en minúscula, y con un "_" delante;
  • la invocación al recupero del parámetro queda dentro de un if, que controla si el nullable tiene o no valor;
  • la invocación al recupero del parámetro no es más parte del return, sino que se asigna a la variable privada;
  • el return devuelve el valor del nullable;

Y todo esto, teniendo en cuenta que:

  • no todas las properties son del mismo tipo de datos;
  • obviamente todas se llaman diferente;

Digamos que no era un trabajo para "copy & paste". Se puede perder buena parte de un día de trabajo haciendo eso (y lo triste, es que a veces, se hace!)

¿Solución?

Enter Vim

Me llevó unos 15' minutos, haciendo un par de pruebas, grabar una macro tal que parado en la línea donde arranca la property (el "public int ..."), se re-escribía automagicamente la property al nuevo formato. Y hacía rato que no hacía estas cosas en Vim, así que no menos de la mitad de ese tiempo se fué googleando para recordar ciertos comandos de selección y movimiento relativo.

Una vez escrita la macro, el refactoring de toda esta clase con sus aproximadamente 200 propiedades no llevó más de 5 minutos (solo había que hacer un search de las líneas que arrancan con "public", y ejecutar la macro en cada una).

¿Vim es la única herramienta para hacer cosas así? No, imagino que no. Nobleza obliga, hay que reconocer que Ezequiel estuvo a un pelito de hacer algo parecido con Notepad++ (un editor "de verdad" para Windows, MUY recomendable si no quieren aprender Vim...)

Pero ciertamente es la clase de cosas para las cuales Visual Studio (y para el caso Sharp Develop, Eclipse, Mono Develop, y cualquier otro mega-IDE) sencillamente NO SIRVE.

Quizás podría haberse encarado esto mediante algún search&replace usando expresiones regulares... pero realmente hay que tenerla bastante clara en expresiones regulares para escribir una que realice ese laburo (y así y todo tengo mis reparos: hay casos en los que el parámetro es un string, y su valor por defecto (el último argumento del método ValorParametro) puede ser por ejemplo una URL, con sus correspondientes caracteres extraños). No es mi caso. Y si bien Vim tiene su barrera de entrada para los que no saben usarlo... me parece que es más fácil (y útil en muchos más escenarios) aprender a usar Vim, que hacer una maestría en expresiones regulares.

Me parece que en el toolbox de TODO programador que se precie, debería encontrarse el uso medianamente "avanzado" de algún editor de verdad. Si nunca te topás con este tipo de refactorings, es que nunca participaste de un proyecto de desarrollo grande. Y si te topaste y lo resolviste reescribiendo el código a mano durante todo un día... estás perdiendo tu preciado tiempo haciendo un laburo repetitivo, aburrido y horrible, con el correspondiente riesgo a introducir bugs en el camino, solo por no usar la herramienta correcta.

 

Implementamos!

Al fin. En realidad, hace una semana... pero no escribí antes un poco por falta de tiempo, otro poco por no cantar victoria prematuramente.

El fin de semana pasado pusimos en marcha el sistema que estuvimos desarrollando en los últimos meses para uno de nuestros principales clientes. Estas últimas semanas han sido duras, intensas, con muchísimo trabajo, pero hoy, mirando retrospectivamente, forman parte de una experiencia que en suma, ha sido muy positiva.

Sin entrar en detalles, digamos que algunas cosas podrían haber salido mejor (sobretodo en cuanto a las condiciones en las que tuvimos que salir a la cancha), pero a pesar de todo, seguimos de pie :) Aún quedan varias aristas por pulir, y este hito representa tan solo el fin de una primera gran etapa, así que en cierto modo esto recién empieza. Pero la base para lo que se viene ya está, y eso, sumado a la experiencia acumulada en estos meses, supongo que hará que las próximas etapas salgan aún mejor.

Estas han sido semanas de jornadas de 12 o 14 hs de laburo, fines de semana, feriados, comida chatarra, cambios de último momento, embrollos técnicos varios, peleas contra las quisquillosidades de Oracle, y una larga lista de etcéteras que conforman aquello que es olvidable.

Como contrapartida, implementamos un sistema de la hostia, 100% web, con todos los chiches tecnológicos (AJAX y demás buzz-words) que permiten crear interfaces con el usuario más ricas, y una larguísima lista de features que esperamos le hagan la vida más fácil a los usuarios, y brinden mejor información para la toma de decisiones. Un chiche, bah.

Javi, Eze, Seba, Diego, Darío, Juan Cruz: es un placer laburar con Uds. Ahora nos debemos los festejos (un par prometieron ponerse en pedo...), para arrancar la nueva etapa en la que, no canten victoria, pretendo seguir mi cruzada por más unit-tests y fachadas más flacas :) jeje.

Me voy a dormir. A ver si me acuerdo como era...