MSNCP, finalmente...

Saturday, May 14. 2011

Hace casi 4 años mariconeaba en este blog al respecto de un release de emergencia que había hecho del MSNCP después de casi 2 años de inactividad.

Finalmente, anoche, hice el primer release con features nuevas después de 5 años y monedas de abandono del proyecto. ¿La razón principal?, lo que primero fue un anuncio de deprecated y luego un warning de código obsoleto, finalmente se transformó en un error sintáctico con el correr de los años y las versiones de Python.

El fixing de eso fue bastante sistemático, pero ya que estaba resolví otro temita producto del paso del tiempo. Cuando empecé el desarrollo todavía era el default de los sistemas operativos los encodings de 8-bits, y el soporte multibyte de NCurses parecía ser una cosa lejana. Hoy un soporte decente multibyte de la interfaz de NCurses en Python aún parece ser una cosa lejana, pero los sistemas operativos con tablas de 8-bits parecen ser cosa del pasado y, honestamente, ya tenía las pelotas llenas de chatear sin poder utilizar ningún ASCII extendido... así que la mayor deuda pendiente solucionada por el release fue el soporte de entrada/salida en Unicode.


Habiendo actualizado el MSNCP y migrado de BitchX a irssi con menos de un mes en el medio, me doy cuenta de lo mucho que sufrí estos varios años condenado a chatear en ASCII plano por causa de mi dejadez.

Glumly

Tuesday, September 21. 2010

Si bien no soy para nada amante del alto nivel y sus prácticas, la vez pasada necesitaba representar unas entidades en un paper, creí que era copado hacerlo en un lenguaje universal, y me vi ante la necesidad de hacer mi primer diagrama UML.

Por una cuestión de presentación, necesitaba que el diagrama fuera elegante, y de ser posible en algún formato vectorial, para embeberlo en LaTeX. Con este objetivo, hice una pequeña búsqueda en las aplicaciones que encontré en el repositorio de paquetes de mis distros, y un rato más tarde me convencí de que no había nada que mínimamente me satisfaciera. O herramientas pensadas para generación de código automático, o herramientas de diagramas con nulo aporte estilístico...

Googleando, llegué a yUML y realmente me parecieron bastante copados los gráficos que generaba. Para el volumen de mi problema no necesitaba mucho más que eso. Ahora bien, los gráficos que genera son rasterizados, y por otro lado, tampoco parecía muy práctico estar desarrollando contra una aplicación web. Lamentablemente, yUML es privativo, por lo que tampoco había mucha forma de meter mano como para enmendar una u otra cosa.

Pregunté en el IRC del LUGFI por el tema, y Albertito me recomendó usar Graphviz para armar los diagramas, que si bien tenía un poco de overhead de sintaxis servía. Miré un poco por encima Graphviz y me convenció, así que le di para adelante. Si bien los gráficos que sacaba Graphviz pelado creo que ya eran ampliamente superiores a los que se podían sacar con Dia, googleé un poco y encontré hojas de estilos para maquillar un poco y hacer un poco más vistozos los SVGs de Graphviz, con lo que además de simple, la solución generaba gráficos bonitos.

Luego de delineado el fuente en DOT del primer UML, decidí que iba a ser el último y escribí un generador de DOT orientado a lo que necesitaba, sencillísimo, menos de 10 líneas de código. Ya que estaba, agregué tipos de dependencias que mi proyecto no necesitaba pero completaban los diagramas de clases UML, y terminé cerrando una miniaplicación.

Curiosamente (o no tanto), con un poco de googleo y un par de modestas líneas de código, desarrollé un proceso que si no es con el que está implementado yUML, le pega en el poste. Y dentro del contexto de la falencia de una aplicación sencilla para hacer ese tipo de cosas y de la licencia restrictiva de yUML, un script que hubiera dejado tirado en mi disco hoy lo estoy publicando para beneficio de otros.

Les presento Glumly (grep uml /usr/share/dict/*), una pseudo implementación libre de yUML, que me salió de casualidad.

Acá está el gráfico de ejemplo que colgué en la web (el cual está "inspirado" en el ejemplo más avanzado de la web de yUML):



P.D.: Al respecto de mi problema original, como era obvio esto me sirvió parcialmente... la única aplicación para postprocesar SVGs es el Inkscape y si bien para todos los demás formatos anda joya, los SVGs que genera este script rompen a Cairo, por lo que la exportación a PDF o a EPS anda para atrás. Por fuera de eso, el proceso funciona automagicamente para PNGs y otros formatos raster. Si alguien necesita sacar salida vectorial del Inkscape, comento cómo lo solucioné, pero ya es otro tema. Al respecto de la extensión para que LaTeX procese DOT, también me anduvo para atrás, si bien probablemente podria haber andado dedicándole más tiempo.
P.D.2: Al respecto de referenciar todo lo que menciono, me da paja; si quieren links, la homepage de Glumly tiene todos los que hacen falta.

minimalCMS@Apuntes

Wednesday, March 19. 2008

Finalmente hoy le llegó al minimalCMS su bautismo de fuego al ser "puesto en producción" como software del proyecto Apuntes.

¿Qué es el proyecto Apuntes?; es una iniciativa de la SHyME del CEI, conducida por el MLI; la cual consiste en un portal web que contiene online para la descarga directa todos los apuntes oficiales de FIUBA (ya, prometo que este es el último acrónimo que meto) y que en tiempos pasados editara el CEI en su desaparecida imprenta.

La iniciativa del proyecto pareció copada, y le dimos el espacio desde Foros-FIUBA para su difusión. Yo me encargué de escribir el sitio desde cero y, como no podía ser de otra forma, le encajé el minimalCMS.

La concreción total de un proyecto, con cada uno de sus detalles para llegar a cerrar un lanzamiento, me sirvió un montón para pulir y terminar de escribir ciertas features... también para que saltaran en evidencia lo que tengo que hacer sí o sí en los próximos refactorings de código. El sitio completo es una fusión del CMS (uh, mentí) base para la gestión de contenidos, más un módulo escrito a medida para el manejo de los archivos; por lo que salieron a la luz muchos detalles para la inclusión no traumática de componentes agregados.

Si bien es siempre un dolor de cabeza integrar un proyecto completo sobre una plataforma que se encuentra aún en estado alpha, creo que siempre es lo más sano para poner a prueba lo que uno hasta el momento testeó tan sólo jugando. Hay que ver cuánto me dura la paciencia de upgradear esto cada vez que modifique tantas partes, agregue otra y reescriba tantas otras.

De momento estoy feliz. Varios meses de trabajo salen a la luz con un proyecto que me parece muy positivo; y pude ser parte de eso (, y pude encajarle el minimalCMS a algo).

minimalCMS

Friday, December 7. 2007

(Sí, ya sé; no hacía falta otro CMS más, pero bueh, es lo que hay.)

Motivación y desarrollo


La historia es así. Corría noviembre de 2006; un amigo me dice que necesitaba instalar algo que le permitiera mandar postales electrónicas desde su sitio, pensaba hacer el lanzamiento antes de las fiestas. Me puse a investigar los softwares de e-cards que habían y no me convenció ninguno; ¿solución?, escribir uno desde cero.

Entre idas y vueltas mías, de mi amigo, del hosting, su conexión a internet (con un océano de distancia no tener internet complica un poco la comunicación...), y más cosas, las fiestas del 2006 se pasaron. Yo dejé el proyecto a "casi terminar", y de vez en cuando lo agarraba de vuelta, le daba vueltas a alguna cosa un par de veces, y lo volvía a colgar.

Para mitad de este año creo que ya había redondeado la aplicación... una capa de datos y negocios bastante encapsulada, y un sistema de templates con recortes que juntaba toda la magia. Aplicación modesta que servía especificamente para mandar postalitas, nada más, pero lo hacía sencillo y con un sistema de templates basado en HTML cortado, fácil de integrar para alguien que no programara.

Cuando empecé a escribir el panel de control empezó el delirio... empecé a escribir un panel con un script monolítico de acciones donde un par de formularios le posteaban y a poco de empezarlo lo colgué. Varias veces más quise agarrar eso, y siempre el mismo embole, no me gusta hacer formularios, y no me gusta el código chorizo... ¿en qué terminé?; empecé a hacer un panel de control modular, usando el mismo sistema de templates que para el sitio, agregándole funcionalidades a la clase de negocios.

Llegamos a octubre; más o menos estaba redondeado... empieza la batalla por pensar un nombre un poco más buscable que "ecards" para la publicación. Para mitad del mes, registro el proyecto en SF bajo el horrendo (pero original, eso sí) nombre de PHPsdraCe; creo que la descripción era algo de la onda de "a PHP eCards engine with a versatile template system".

Culo inquieto; mientras pulía lo que había hecho para dejarlo cerrado, empecé a limpiar el código y de a poco me iba convenciendo de que tenía poco sentido dejar eso como un programa de postales y que daba para un poco más. En base a las cosas que tenía escritas, empecé a mover código para un lado y para el otro, y empecé a encaminar la idea de un CMS, cosa en la que estuve trabajando en los pocos ratos libres que tuve este último mes. PHPsdraCe se transformó, finalmente, en minimalCMS, "A simple and light content manager system, written in PHP.".

Diseño


La aplicación está escrita en PHP 4.2, con MySQL como motor, y pensando en Apache como servidor (estos últimos dos, de momento). ¿Por qué este combo?; porque era lo que tenía el hosting para el cual lo empecé... reconozco que el desarrollo tiene un par de soluciones ad-hoc que hubieran sido evitables usando PHP 5 (u otro lenguaje), pero no es algo que me quite el sueño; si bien no es un lenguaje que ame, me siento cómodo desarrollando PHP.

La característica principal que tiene (y si bien es lógico por lo verde del proyecto que sea así, mi idea es seguir trabajándolo sin perder eso de vista) es la de trabajar con una estructura pequeña de datos básica para operar; dependiendo del tipo de contenido a generar, el mismo suele resolverse con un par de consultas a bases de datos y haciendo un uso mínimo de importación de scripts.

Los objetos básicos del CMS son categorías e items (si bien es probable que a futuro fusione las dos cosas como una para optimizar búsquedas); como es de esperar, una categoría contiene categorías o items, y un item es sólo contenido. Los ítems y categorías viven en la base de datos, y cada uno tiene asociado un tipo (en caso de ser extensiones de los objetos base) y un template. La resolución de los objetos se hace siempre con semantic URLs, utilizando mod_rewrite, sobre la categoría. Por ejemplo, si se pide /hola/mundo/que/tal.html primero se busca una categoría de nombre que hija de hola y mundo; si ella no existiera, se busca a mundo hija de hola y así hasta llegar a la categoría root (la cual siempre existe). Cuando se encuentra el primer nombre que coincide con una categoría, se instancia la misma (según su tipo) y se le pasa como argumento la porción de URL que quedara sin reconocer; si en el ejemplo existiera la categoría que<-mundo<-hola, la misma se instanciaría con tal.html de argumento. Suponiendo que esta fuera una categoría de comportamiento base, entonces, con ese parámetro, intentaría encontrar un ítem llamado tal contenido en ella. Si los argumentos de la categoría no llegaran a ser resolvibles, el pedido podría terminar en un error 404.

Dado este diseño; es posible tener árboles completos dentro de la estructura de directorios virtuales que emula el CMS, que tengan su comportamiento totalmente controlado por una categoría base en la jerarquía (por ejemplo, un módulo que implementé, genera una categoría que sirve, emulando al Autoindex de Apache, un directorio del servidor); lo cual permite la integración de practicamente cualquier cosa, simplemente instanciándola como una categoría y procesando sus argumentos.

El proyecto actual permite construir muy rapidamente contenidos utilizando una plantilla y las categorías e ítems base. Dado que cada categoría y cada ítem contiene dos títulos, descripción, contenido, imagen y thumbnail asociados; es posible, sin necesidad de extensiones, crear diferentes tipos de contenido cambiando nomás el template. Si bien el sistema de templates aún no está cerrado; el mismo permite acceder a propiedades y métodos de los objetos, pasarle parámetros, establecer fondos de repetición discriminados por contexto (¿es la categoría actual?, ¿es una categoría padre de la actual?, etc), establecer sentencias condicionales sencillas, etc.. En paralelo al sistema de templates hay un par de utilidades de base las cuales hacen, entre otras cosas, resizeos y cacheos de imágenes según parámetros del template, enlazar e instanciar diferentes objetos, etc..

minimalCMS funcionando


De momento el minimalCMS puede verse funcionando en su página de SourceForge aunque, debido a las falencias y errores permanentes que tiene dicho servidor, recomiendo acceder a la versión que está corriendo en mi servidor.

Pueden descargarse los fuentes del repositorio SVN que está en SF; pero, sinceramente, creo que hay poco que ver (por supuesto, de hacer andar lo publicado, ni lo sueñen :)).

El proyecto para mí


Más allá de la justificación desde la inercia, ¿por qué escribí un CMS?

En primer lugar; si bien este es el primer CMS OpenSource que escribo y publico, fui coautor y autor de, al menos, tres proyectos similares previos. Habiendo recorrido un camino de diseño y desarrollo con otros tiempos y exigencias un par de veces; es para mí una experiencia nueva el poder hacer desde cero un desarrollo, solo, tranquilo, sin nadie arriba, andando y desandando caminos para concluir una aplicación a gusto propio y como una distensión... ya lo saben todos, a veces considero muy productivo reinventar alguna que otra rueda para llegar a lo mismo que habían llegado otros.

En segundo lugar; hice suficientes búsquedas infructuosas para instalar y usar CMSs y desde hace bastante que estoy convencido de que (a) no hay uno que se adapte a lo que suelo necesitar para proyectos modestos, (b) que encontrarlo me vaya a insumir menos tiempo que hacerlo desde cero, y (c) que una vez encontrado vaya a quedarme tranquilo sin tener que reescribirlo en parte. Bueno o malo, este es un software escrito a mi capricho, y seguramente va a ser el core del que echaré mano para varios proyectos que dejé colgados por disgregarme al no poder definir un buen software de base.

Si bien lo estoy publicando y actualizaré las cosas que vaya puliendo, dudo que a alguien le importe o le sirva; este es un CMS más en la inmensa lista de otros que ya hay, seguramente mucho más inmaduro, mal diseñado e inutil que muchos otros que andan dando vueltas.

Está claro; lo escribí para mí... y claaaaro, para mi amigo; ¿ya mencioné que todo lo referente al envío de postales quedó desmantelado?

MSNCP 0.7.1-beta release.

Tuesday, October 30. 2007

Después de mucho mariconear con que tenía que retomar el desarrollo del MSNCP, para terminar un gran refactoring de código que había dejado colgado, agregarle cosas nuevas, llenar muchos baches, que me iba a hacer un rato para eso, que este cuatrimestre, sí, que este cuatrimestre de verdad arrancaba... al final me dispersé con otros proyectos y éste me quedó totalmente colgado.

Aun así, hoy hice un release. El 0.7.1-beta; primero en un año y tres cuartos. ¿Por qué hice un release?; porque desde el domingo que el servidor de Messenger rechazaba sistematicamente todo login proveniente de la msnlib... un cambio en una querystring y todo solucionado; pero sin ese cambio el cliente había quedado inservible.

Totalmente desmoralizante el finalmente haber hecho un release por un capricho del servidor, un bugfix de 5 caracteres, después de casi dos años de inactividad; más cuando para las primeras 7 versiones mantenía de promedio un release por mes. Pero bueno, así salió. Ahora para que sea menos vergonzoso debería sacar una versión 0.8 un poco más pulenta...

¡Eso!, ¡mañana mismo retomo el desarrollo...!