Entrando en el software privado

Aunque he hecho varios programas para mi empresa, estos siempre han sido sistemas internos; pero ahora me ha llegado una oferta, que he aceptado sin pensarlo dos veces, para trabajar en un sistema que sí es comercial, y que es privativo. La verdad es que no me dolió nada, y creo que debería, tanto como soy defensor del software libre, como forma de compartir el conocimiento, y pienso que la programación de codigo cerrado realmente limita el conocimiento además de que se limita a sí misma; no obstante, repito, acepté el trabajo y además me siento contento y con ganas de empezar. Y todo porque el trabajo en sí me interesa, la programación que hay que hacer, las cosas nuevas que tengo que aprender, todo eso arrincona y vence a los remilgos ideológicos.
Según me dice mi empleador no podré divulgar nada de lo que vea del código de la empresa, de hecho me van a hacer firmar un documento que me compromete a no hacerlo, y lo firmaré, pues en definitiva es su código y lo tratan como les de la gana, lo firmaré aunque me duela, y me morderé la lengua antes de decirles que quizas sea buena idea liberar el código, pues ellos tienen su modelo, y parece que les va bien.
Por otra parte, y esto es lo que no consideran mucho en los debates ideológicos, pagan bien, sí, soy un vendido, o quizás no tanto, mas bien un alquilado.
Hago mal? Me estoy prostituyendo?
No creo, eso sería un extremismo, quizás me niegue a acusarme de ninguna manera debido a esta alegría que siento por comenzar es proyecto, un proyecto que al fin me saca de los sistemas de gestión, un proyecto que me obliga a usar herramientas de microsoft, que me obliga a dejar mi amado linux por un tiempo; pero un proyecto que me hará regresar a las aréas de la programación que luego de mi tesis no pensé regresar.

Hasta que punto estamos dispuestos a sacrificar nuestro presente, nuestra satisfacción por unos ideales? Y no hablo del futuro, que para eso sí están los ideales.

La programación y la literatura

Lo primero fue un niño frente a una cumputadora en una feria tecnológica, la madre lo había llevado y a la entrada de la feria había una sala con computadoras y cada una tenía un programa gráfico, en el cual un mapa de la feria le decía al asombrado niño el nombre de cada salón que él señalaba. Luego fue el interés intinerante por las computadoras de los diferentes trabajos de la madre, siempre escribiendo tonterías en wordperfect, con tal de usar la maquina, luego fue un tablero MSX Basic y andanzas por el código simple de aquellos juguetes. Pero luego fue la beca, inicialmente un año programando con pascal para MS-DOS, pero después la música, los amigos de la farándula, la literatura. Me olvidé del ordenado desorden de la programación y me sumergí en el caos de la creación artística.

Varios años, varios exitos moderados, y al final de mi carrera (intrascendente sobre qué) una tesis sobre la optimización de paredes refracatarias, un programa que implicó la aplicación de complejos algoritmos, una aplicación que me recordó la facinación de programar, desde entonces la informática he regresado y me ha atormentado.

Pero no he podido olvidar mi pasado literario, y mi presente, que leer aun me facina, y por tanto no puedo evitar ver los paralelismos entre programar y escribir ficción, veamos:(No pienso llevar un paralelismo explícito los que programen que vean como les cuadra en su cotidianiendad.)

Cuando se escribe ficción, generalmente cuando ya se tiene algo de experiencia, lo mejor es plantear el "diseño" del relato, algo así como las metas a mediano plazo a las que se debe llegar, o como dice Thomas Mann en Doktor Faustus, refiriéndose a la manera de crear de Adrian Leverkuhn (en este caso música), que concebía la creación como una suceción de problemas.
Todos sabemos que los lenguajes de programación son lenguajes formales, es decir, lo que se quiere decir es lo que se dice, no hay ambiguedades ni contextos. Cuando intentamos escribir un relato, nuestras frases estan llenas de sentidos asumidos, que deben interpretarse debidamente gracias a los referentes que los lectores tenemos de nuestra cultura, por eso es que mientras más antigua sea una obra más notas al pie hay que leer. Pues bien, acercarnos a esa formalidad del lenguaje, a no necesitar referentes, o a necesitarlos lo menos posible, es lo que sería el santo grial de la literatura.
Un escritor está atado a reglas que intentan lograr lo de arriba, en general todas las técnicas literarias existen para que la experiencia lector-obra sea lo más íntima posible, aunque hay algunas para que lo sea lo menos posible, pero en definitiva cada escritor, por muy rebelde que sea, se amarra a unas reglas y en ese acotamiento debe crear y debe comunicarse con el lector.
Los escritores tenemos nuestros idolos, nuestras pautas, nuestros microsoft(aunque divido en las miles de editoriales que promueven la literatura fácil).
Cuando uno se inicia como escritor, escribe solo por inspiración y para la inspiración, con una idea inical generalmente débil y el unico placer que reconocemos es el de generar las palabras, sentir como se enlazan e incluso como forman ideas que nunca imaginamos, llega a ser bastante adictivo la verdad, pero cuando pasa el tiempo y nos damos cuenta que solo tenemos un inmenso portafolio lleno de ideas comenzadas y sin futuro, que nos hemos convertido en generadores de recortes... comenzamos a pensar antes de escribir, y los más dedicados logran armar el cuento o novela antes de escribir una letra y, luego, tenemos la libertad de movernos en los límites que hemos inmpuesto. Con el pasar del tiempo descubrimos que el "diseño" del relato es tan divertido como generar las palabras, o a veces más.
Quizás para muchos esto no es más que varias sandeces seguidas, pero les digo más, un cuento nunca termina, simplemente lo dejamos de arreglar, un programa nunca tiene una última versión. Los lectores siempre nos encontrarán defectos, siempre habrá quien nos idolatre, quien nos haga la guerra como amenaza para el software, para la moral, para la literatura, para el mundo empresarial. Quien llore junto a nuestras palabras, quien disfrute las nuevas facilidades de la ultima versión; siempre nos irritaremos por una crítica, nos desilusionará una alabanza. No admitiremos contribución ajena, odiaremos a quien no nos quizo ayudar, nos emocionará que un Alguien grande nos responda con una sugerencia o crítica a un trabajo o pregunta que le mandamos. O recibiremos un día la carta o correo electrónico o llamada telefónica que estábamos esperando, aunque no sabías quien la iba a hacer, o sobre qué iba a tratar, con la oferta que imaginamos será la que finalmente nos permita dedicarnos a hacer lo que más nos gusta, o recibiremos esa llamada, como la recibí yo cuando andaba por las lides de la creación literaria, y sentirán pena, porque ya la llamada que esperan cambió, ahora no debería ser una voz argentina diciendome que sí, fuiste adminitido en el Cardoso, ahora queremos otra cosa, no sabemos exactamente qué, pero sabemos soñar e imaginamos mil variantes de lo mismo, nosotros sentados frente a una computadora, programando en el mejor lenguaje y más poderoso, en un proyecto, el que sea, pero que nos emocione y facine, y de ser posible, que nos paguen bien.

Otras maneras de ver la libertad del software

Me encanta la filosofía del software libre, siento que es lo más parecido al modelo de la ciencia teórica, en la que los descubrimientos son de todos (ojo no me refiero a una vacuna o a una metodología de fundir un acero para que tu auto sea más competente) bueno, quizas esté siendo un poco idealista, quizás la ciencia teórica no sea tan libre que digamos, quizás solo las matemáticas, quizas aquellas ramas de la física que no implican utilidades obvias, quizás solo hable de la ciencia del siglo XIX. En definitiva hablo de un conocimiento generado por todos y utilizado por todos (amen de las pequeñas miserias humanas de las que no se libra nadie, por muy genio que se sea).

Pero entonces, llamándome a conciencia, me puse a buscar un lenguaje que cumpliera estas condiciones, no debería parecer muy dificil, está c y c++ (hablo del compilador de gnu), está python, está perl y hay muchos más, pero ojo, que hay un lío con esto de la libertad legal, sí, son libres, pero, y en lo que a mi respecta hay un inmenso pero, o peor, varios.
Antes veamos lo que hemos aceptado por software libre:
según la pagina de gnu en español
"Software Libre" se refiere a la libertad de los usuarios para ejecutar, copiar, distribuir, estudiar, cambiar y mejorar el software. De modo más preciso, se refiere a cuatro libertades de los usuarios del software:

* La libertad de usar el programa, con cualquier propósito (libertad 0).
* La libertad de estudiar el funcionamiento del programa, y adaptarlo a las necesidades (libertad 1). El acceso al código fuente es una condición previa para esto.
* La libertad de distribuir copias, con lo que puede ayudar a otros (libertad 2).
* La libertad de mejorar el programa y hacer públicas las mejoras, de modo que toda la comunidad se beneficie. (libertad 3). De igual forma que la libertad 1 el acceso al código fuente es un requisito previo.


Inmejorable no es cierto? No se me ocurre una letra que agregar, entonces, de qué me quejo? Pues de lo siguiente:
c : Dennis Ritchie, ANSI
c++ : Bjarne Stroustrup, ANSI
perl : Larry Wall
python: Guido van Rossum
java (si al final la licencian con GPL) : JCP, Sun , James Gosling, ya ni sé.

Y cual es el problema? No sé hasta que punto Ritchie sigue con c, pues su ultimo libro es del 78, y no sé hasta que punto c se sigue desarrollando. Así que de c no hablo.
Entonces c++, me consta que Stroustrup sigue con el desarrollo de c++, me imagino que se apoyará en la comunidad, pero en definitiva él es la locomotora que nos llevará a la futura versión
Larry Wall y Guido van Rossum están en activo en sus lenguajes, muchas noticias sobre perl y python estan dadas en primera persona, algo así como que ellos son los que halan el carro.
De java ni hablar, aunque es el lenguaje que me paga los frijoles, aunque lo licencien con GPL, ya tienen sobre sí la batuta del mundo empresarial, la comunidad se limita a sugerir y crear infinidad de bibliotecas, pero el lenguaje en sí lo lleva la Sun.
Entienden de lo que hablo? A lo mejor estoy siendo exagerado, pero todos estos lenguajes tienen atrás a una persona o a una empresa. Son libres pero que pasa si Guido se muere? python seguirá, es posible, pero durante cuanto tiempo? con qué impetu? y perl? y c++?
Pero indepedientemente de todo esto, que pienso que no es determinante, usar estos lenguajes me suena como a seguir la filosofía de alguien, no de usar avances de la ciencia sino simples herramientas de la tecnología.
La cosa es que intento ver a los lenguajes de computación como lenguajes formales, intento ver la computación como parte de la metemática, que lo es, pero que no se usa de esa manera.
Todos estos lenguajes son soluciones a un nicho de problemas específico, sí, son lenguajes de proposito general, pero cada uno fue concebido para algo particular en su momento. Ninguno fue creado solo para ser un lenguaje basado, exclusivamente, en una teoría matemática.

Ya voy acabando, como muchos habrán imaginado, toda sta perorata tiene como objetivo defender a algun lenguaje,así es, a haskell y a smalltalk.

Smalltalk
Segun wikipedia
Los orígenes de Smalltalk se encuentran en las investigaciones realizadas por Alan Kay, Dan Ingalls, Ted Kaehler, Adele Goldberg y otros durante los años setenta en el Palo Alto Research Institute de Xerox (conocido como Xerox Parc)...
Ah, carajo! pero aquí tambien hay autores, es que el conocimiento humano no nace por generación espontánea, la clave es lo que sigue diciendo la wiki:

...para la creación de un sistema informático orientado a la educación. El objetivo era crear un sistema que permitiese expandir la creatividad de sus usuarios, proporcionando un entorno para la experimentación, creación e investigación.
Pues sí, smalltalk se inventó exclusivamente para la investigación y educación, lo cual implicó que se sintieran libres de hacer un lenguaje sin compromisos con la industria, es decir, buscaron la pureza de la POO.

Squeak
Home page
Pero de aquel smalltalk a la fecha ha llovido mucho y han surgido una gran cantidad de dialectos, de los cuales lo más parecido a mi idea inicial es el Squeak, del cual sé que Alan Kay es un gran impulsor, pero aún cuando también estuviera bajo la influencia de una persona, tiene una gran comunidad que lo apoya(sí como los lenguajes anteriores), pero en definitiva es smalltalk, y a mi entender cumple con lo de ser un lenguje que busca la pureza de la forma.

Haskell
Otra vez la wiki
En los años 1980 se constituyó un comité cuyo objetivo era crear un lenguaje funcional que reuniera las características de los múltiples lenguajes funcionales de la época, como Miranda, y resolviera la confusión creada por los múltiples lenguajes que seguían este paradigma.
Bien, ya esto suena mucho mejor, un comité, y ajustarse a la pureza de la forma, esta vez siguiendo el paradigma funcional. Y ya termino, no creo que haya más que decir, o más bien hay tanto que prefiero parar ahora, haré un análisis más profundo luego que experimente más con haskell y smalltalk.

Para terminar aclararé algo, cuando hablo de los autores no me refiero a garantizar la continuidad del lenguaje, pienso que si un lenguaje (siempre hablo de las especificaciones, no de las implementaciones) es libre, su perpetuidad está casi asegurada, así que no es eso.
Me refiero al hecho de estar atados a la visión inicial de alguien y no al común acuerdo de los interesados. Como es inevitable que toda creación humana se inicie por la visión de su o sus creadores, entonces lo ideal para mí es que esa creación esté basada, en el caso de los lenguajes de programación, en fundamentos matemáticos generales y no en las necesidades de un nicho de problemas.
Esa es la liberdad de la que hablo, de que los lenguajes se ciñan al conociminto, y si hay que hacer alguna innovación, pues hacerla, pero no a tontas y a locas, no utilizando la intuición, sino bien fundamentada en lo que es correcto, en lo que es científicamente correcto.

Java es gpl, pero y nosotros?

Cuando le hice el cuento de la liberación de java a un amigo, bastante pragmático él, me respondió con un demoledor: "Y a nosotros en que nos beneficia esto?"
Bueno, veamos.
Casi nadie de la inmensa mayoría de los que usamos java para ganarnos la vida nos meteremos a personalizar la jvm, o las bibliotecas, hasta hace poco el jdk igual era gratis y el jre se podía distribuir con nuestras aplicaciones sin ningún problema, entonces qué?
Cuando le respondí que por lo menos pondríamos descargar el jdk de otro lugar que no fuera la sun (hasta hoy no podemos desde acá en Cuba), tuve un:"Oye pero cuba no es el mundo, y siempre estará la mula". Vaya tipo, obviamente con estos truenos hablarle de la necesidad de la libertad y esas cosas estaría de más, desafortunadamente la concexión se le cayó y no pudimos seguir conversando, entonces decidí reflexionar un poco por acá, un poco como a gritos, un poco como si escribiera ideas en una pared que muchos ven al pasar.
Con java libre puede ser que muchas empresas, individuos, asociaciones de individuos, modifiquen la maquina virtual y/o las bibliotecas para optimizarlas en algún nicho de problemas, puede ser que aumente la comunidad de usuarios para los que el hecho de que java sea libre es muy relevante, puede ser que los desarrolladores de las implementaciones libres se enriquezcan(hablo del conocimiento) del jdk y la jvm de la sun.
Pero todo esto, en definitiva va a ser a la larga, por tanto, qué nos importa a nosotros los programadores cotidianos, para los que lo que ya está hecho es todo un océano y que además no le dedicamos demasiado tiempo a java fuera del trabajo, y que el horario laboral es para programar con urgencia, pues no tenemos la suerte de estar en una empresa innovadora, qué nos importa a nosotros la inmensas potecialidades que implica la liberación de java.
Recuerden, estamos buscando razones técnicas:
Pues nada, luego de un rato pensando no se me ocurre ninguna buena razón para alegrarnos sinceramente de que java sea libre, y no importa, el hecho de que java sea gpl implica que salió del control de la sun, es decir, la palabra java es de ellos, la taza de café igual, pero eso no es tan importante, lo que importa es que la Sun no puede llavarse java a la tumba, lo importante es que ya pertence a todos nosotros, para bien o para mal, para forks o para pasividad. No creo que sea amor al lenguaje lo que hizo que Sun hiciera esta movida, ellos son una empresa y a las empresas lo que le interesa es ganar dinero, no asegurar la posteridad de un artilugio tecnológico, pero para nosotros sí, y me refiero incluso a aquellos que no les gusta java, incluso a aquellos que no les gusta programar. Java a pasado al conocimiento humano...
Buen discurso? puede ser, buen arrobamiento, incluso me lo creí yo mismo... así que java pasó ahora al conocimiento social solo porque le firmaron un papel que lo dice así? Qué diría el principito, que tontos somos los adultos no?
Java, c++ e incluso

.net, hace rato que forman parte de ese conocimiento,cada lenguaje de programación, cada nueva metodología, forman parte inmediatamente del conocimiento humano, que unos idiotas le amarren un papel que limite su uso y que hoy todos nosotros nos dejemos guiar por ese papel es otra cosa, de todas formas somos un momento en la historia, pero las ideas de estos lenguajes son libres, y llegará un momento en que estas consideraciones de libertad legal solo servirán para explicar parte de las razones por las que una tecnología avanzó o se estancó.
Que a nadie se le ocurra mencionar las patentes por aquello de que las ideas son libres, las patentes son solo otro papel, y como tal sujeto a un momento histórico, en estas circunstancias esos papeles son válidos, pero ni los gobiernos son eternos ni la formas de las ideas son eternas.
No estoy pensando que java vaya a superar a nuestra forma de vida, no soy tan pretencioso, pero si que los avances o retrocesos que implica su existencia serán aprovechados por nosotros los humanos de alguna manera, y que los papeles que hoy la atan/liberan en realidad son superfluos.
Pero, pragmáticamente, alegremonos de que java sea libre, alegremonos de que podamos engañar un poquito a la historia y creamos en el cuento de los papeles, java es libre, pero nosotros no, estamos encerrados en nuestra forma de vida, no importa, con dos que se quieran con uno que sea libre basta ;)

Husmear con grep

Hace poco mi jefe (que no es informático) me mandó a que le buscara todos los correos que recibieron y enviaron algunos usuarios.
Inicialmente la petición me escandalizó, pero luego pensé que en definitiva el correo de la empresa es para la empresa y no para que chicho le mande a chicha un powerpoint de lo más chulo. No obstante me alegra irme de este trabajo.
En fin, lo importante es como lo resolvimos.

Inicialmente puse a una muchacha a abrir el webmin (uso postfix) y buscando en el íntringulis de los log buscar uno a uno los usuarios... trabajo infernal la verdad.

Luego pensando un poco me imaginé que usando grep podría ahorrarle este trabajo a la sufrida muchacha... pero de expresiones regulares no sé nada, ni de perl y solo un poco de python... luego de romperme la cabeza y leer de aqui y de aqui llegue a esta conclusión:

root@PC/var/log/#grep "^Mes.*[from|to]=<unusuario@.*" mail.log | grep -o ":[ ].*:[ ]" > ids && grep -f ids mail.log | grep ".*[from|to]=.*" | less

je... ahora explico:

como ven hay varios grep's, vamos uno por uno:

grep "^Mes.*[from|to]=<unusuario@.*" mail.log

Esto al español se traduce: Muestra(grep) todas la lineas que comiencen por Mes(^Mes) y cualquier cosa (.*) hasta que encuentre un from o un to ([from|to]) seguido por =<unusuario@ y el resto da igual (.*), todo esto lo sacamos del mail.log.

El objetivo de esto es extrer todos las lineas en las que aparezca el usuario unusuario para entonces, con esto hacer lo siguiente(para enlazar el resultado del grep anterior con el siguiente usamos |):

grep -o ":[ ].*:[ ]" > ids

aqui buscamos el patron :[ ].*:[ ] y sacamos solo lo que coincide con él, es decir, si en el grep anterior obtenemos todas las lineas que se acomodan al patron aqui sacamos la parte de las lineas que se ajustan al nuevo patron, que en este caso coincide con la manera en que postfix pone los id de los correos, para esto es la opción -o. es patrón es de la siguiente manera: primero dos puntos (:) luego un espacio ([ ]) luego lo que sea (.*), luego dos puntos más (:) y finalmente otro espacio. El resultado de esto lo colocamos en un fichero llamado ids (> ids).

Si esta operación tiene exito pasamos al proximo grep mediante (&&).

grep -f ids mail.log

Lo que sigue es más sencillo, ahora usamos el fichero ids para buscar en todo el mail.log las lineas que contengan los id de los correos, que serán los que necesitamos, para ello le indicamos a grep que el parametro que le pasamos (ids) es un fichero, y no un literal, para ello se utiliza el -f.

La salida de este ultimo grep la volvemos a filtrar de una manera similar al primero y el (| less) es para poder ver el resultado en pantalla, podríamos sustituirlo por >correos_de_unusuario_mes_Mes.txt y tendríamos ya esa información guardada para lo que haya que hacer con ella.

Repito que no me hace ninguna gracia este trabajo, me parece una barbaridad, solo publico esto porque me resultó interesante resolverlo, aunque quizás a alguien se le ocurra una idea mejor.