Do it right! – Manejo de dependencias

March 9th, 2009 | by | general, gnu+linux, programación

Mar
09

En estos días he tenido varias discusiones sobre algunas prácticas muy acostumbradas en varios proyectos, que a mi parecer están muy lejos de lo útil. Es por eso que decidí escribir un par de artículos denominados “Do it right!” (hazlo bien!, si mi inglés no es tan malo como pienso :D ). En esta primer entrega voy a tratar el tema de manejo de dependencias.

Escenario

Muchas veces uno se encuentra con un software que necesita y le es útil. Vamos a suponer de entrada que no tiene paquete para su distribución y/o sistema operativo favorito. En al leer el README vemos que depende de muchas cosas : alguna biblioteca de procesamiento de imágenes, algún captcha system o lo que sea.

Mirando mejor nos encontramos con una realidad muy fea : todas las dependencias están incluidas en el archivo que nos bajamos originalmente, y alguna veces se cargan por métodos poco ortodoxos.

Cualquiera que haya bajado cosas en PHP o Java seguramente se ha encontrado con esto : Clases bajadas de phpclasses.org o miles de archivos JAR en un directorio lib de la aplicación Java que se cargan en el classpath. También lo he visto en varios proyectos Rails últimamente.

La excusa que siempre escucho es “Because it makes the app more self contained“, si, si, BWTF. Pero la pregunta es : ¿es la forma correcta?. Si respondes que si, estás muy lejos de la realidad y seguramente tu sysadmin te odia mucho, pero mucho :) .

El Problema

Entonces, ¿cuál es el problema con esto?. En principio parece una maravilla, nos facilita todo, descomprimimos y ya está!, el sysadmin (nosotros) agradecido, pero si el sysdamin es otra persona y se respeta los va a putear mucho, pero muuuuuucho.

Uno de los problemas con empaquetar todas las dependencias es la facilidad de solucionar problemas a futuro. El mejor ejemplo que he vivido es el típico cambio de time zone en nuestro país. PHP, por ejemplo, tiene su propia DB de timezones, y si actualizamos el tzdata de nuestro servidor, maravillosamente PHP ni se entera. Está bien que en este caso como programadores no podemos hacer mucho, es el lenguaje el que está mal, pero el ejemplo ilustra mi punto.

Un software con el que tuve que trabajar, vBulletin, va aún más allá. Tiene su propia DB de timezones por arriba de la que tiene PHP!, hardcodeada en un array!. ¿La excusa? Que la de PHP no anda bien en Windows y es mejor de esta manera.

Otro ejemplo que puedo dar es el otro día cuando migré unos sitios en el trabajo. Uno de los admines se quejó que dejó de andar porque usaba la función “dl” de PHP para cargar extensiones en tiempo de ejecución! (es decir, cualquier script PHP puede cargar un .so que extiende PHP de cualquier manera, incluso para saltearse otras medidas de seguridad), lo que no solo es una chanchada, sino que es un potencial problema de seguridad.

Tener el manejo de dependencias con la aplicación además nos prohíbe actualizar fácilmente un bug de seguridad, usabilidad o lo que sea de esa dependencia. No podemos en muchos casos hacer un upgrade de ese paquete que está embebido dentro de un todo llamado “aplicación”.

En rails he visto ya muchos que acostumbran a usar “rake gems:unpack” para meter las gemas de las que dependen en el directorio vendors/gems, así no las tienen que instalar aparte. Rubygems disgusta en muchos ambientes, no voy a entrar en eso hoy :) . Si uno depende  de una versión específica la forma correcta sería especificar en el environment.rb la versión, y luego que el que hace el deploy haga un “rake gems:install” para asegurar que se cumplan las dependencias. Con Capistrano es una papa hacer esta tarea automáticamente ;) .

Entonces, ¿nunca más lo hago?

No me gustan los extremos y creo que estas malas prácticas que se ven hoy tiene usos muy específicos.

Supongamos que el proyecto X usa la lib Y, pero tal cual la provee upstreem no me sirve. Lo lógico es hacer un patch para upstream solucionando el problema o agregando la característica.

Mientras upstream acepta el patch y realiza un nuevo release, ahí si tiene sentido tal vez, y de forma temporal tener esa dependencia embebida.

Un ejemplo donde yo lo estoy haciendo es con el uso de la gema contacts, que depende de la gema json. En una aplicación con Rails 1.2.6 no hay ningún problema, pero en otra que usa Rails 2.1 si, porque este último integra un parser de JSON y conflictua con la gema del mismo nombre. La opción lógica sería migrar la aplicación 1.2.6 a una nueva versión de Rails, cosa que no siempre es fácil y se necesita el tiempo. Como no se pudo, es más fácil meter en uno de los proyectos la gema de manera que no moleste al resto de los proyectos en el transcurso de la actualzación.

Seguro hay algún otro caso, ahora no se me ocurre alguno que realmente lo justifique.

3 Comments »

Flash Player 10 para Linux

November 21st, 2008 | by | general

Nov
21

Esta semana hice un update de mi Ubuntu Intrepid ya que tenía varias cosas en espera de actualización. Uno de los paquetes que entró fue el Flash Player (nonfree) 10 de Adobe. Como me pasa siempre que aparece una nueva versión del player para Linux, mi estado de ánimo fue pasando de “contento” a “frustrado” :) .

Flash parece que se va a quedar un rato largo, es una realidad innegable. También es una realidad que debemos evitar que se propague a donde el contenido importa, pero no veo mal que si alguien quiere hacer una campaña de marketing se haga un mega sitio en Flash, es problema de esa empresa (y al final tal vez me pagan por hacerlo, así que está doblemente bien :P ). Otro nicho de Flash son los juegos casuales. Yo, como ex “hardcore gamer”, migré a kongregate.com hace rato :) .

Lo que más molesta es lo poco que hacen avanzar el plugin en cada release. En este caso se nota que lo único que agregaron es el soporte de los nuevos chiches (que dicho sea de paso el soporte de Bones para animar está muy groso para hacer videojuegos), pero no arreglaron ninguno de los problemas ni dan soporte a los “viejos chiches”. Un ejemplo, todavía no hay soporte de V4L para poder usar las webcams desde Linux, es muy frustrante, sobre todo cuando hay Webcam Games que para pasar el rato son entretenidos.

Los problemas de performance también siguen, es imposible usar el “Pantalla Completa”, sigue consumiendo mucho CPU, a veces el Firefox explota, etc. Historia conocida.

2 Comments »

Programando Rails con GEdit

January 29th, 2008 | by | programación

Jan
29

Luego de buscar y buscar opciones para hacer el día a día programando en Ruby on Rails decidí quedarme con GEdit, por sobre mis otras opciones : Aptana Studio, vim+rails.vim, jedit.

Tanto jEdit como Aptana están escritos en Java, por lo que tienen todo lo malo de la JVM corriendo atrás y la verdad que molestaban más de lo que ayudaban. Aptana es un lindo plugin para Eclipse, pero no pienso actualizar la PC solo para poder sacarle el juego :) .

Por el lado de vim, por primera vez que yo recuerde, queda chico. Esta muy bien para tocar 3 o 4 boludeces de vez en cuando. Pero para desarrollar a diario se me hace un martirio. El auto-complete de helpers, por decir algo, es super incomodo y yo lo quiero con un simple Tab :) . No encontré si tiene la opción de Code Snippets.

Tengo que admitir que mi primer reacción fue : Quiero TextMate en Linux!. Quienes hayan usado TextMate lo entenderán, quienes nunca lo usaron, es como aquellos que no entiende como con un solo botón alcanza para hacer todo :) . No vale la pena explicarlo.

No tuve que buscar demasiado la verdad y encontré varias fuentes para configurar GEdit de manera que quede suficientemente cómodo (como estaba acostumbrado con TextMate) para trabajar todos los días. El resultado :

GEdit en modo TextMate

GEdit es una de esas cosas que siempre fue “el editor pedorro ese que viene con GNOME”. Me sorprendió que se porte tan bien con varios plugins andando. Esperemos que a la larga no termine siendo un fracaso :) .

5 Comments »

Plot window otra vez

January 7th, 2006 | by | oregano

Jan
07

Ya parece un tema recurrente en mi intento diario por hacer una ventana de ploteo que me guste. Este vez me cansé de mi intento frustrado de plot widget y me puse a buscar algo que ande de verdad :-)

Lo que mejor se adapta a lo que necesitamos y que encontré fue GtkDataBox , aunque hay algunas cosas que todavía no me cierran del todo.

Vieja ventana de ploteo Nueva ventana de ploteo

El widget nuevo se nota que funciona mejor. El zoom anda bien, la velocidad de dibujo mejora y cuando el volumen de funciones es alto (más de 10 funciones) es notable la diferencia.

En fin, será cuestión de seguir trabajando y ver si algunas de las cosas que no he sabido hacer salen a la luz. Por si alguien quiere probar que onda, dejo el parche en el post. Solo he probado la versión 0.4.0 de GtkDataBox.

No Comments »