lunes, octubre 10, 2011

Dart el nuevo lenguaje Google

Google acaba de lanzar hace unas horas su nuevo lenguaje de programación, pues al parecer no estaban muy satisfechos con javascript, así que se han hecho un lenguaje a la medida de sus necesidades.

El lenguaje tiene tipos graduales y se supone que se podrá evolucionar desde un simple prototipo dinámico hasta aplicaciones complejas y modulares.

Por ahora lo que he visto del lenguaje luce bien, el modelo de procesamiento es similar al de Erlang, pero sin embargo no se dice nada sobre la optimización de llamadas terminales (tail call optimization), y tiene algunas peculiaridades que parecieran ser problemáticas, pero eso es solo una opinión después de un vistazo muy rápido de la especificación, espero que solo sea una impresión inicial y que el lenguaje sea más útil que "go", aunque me parece irreal que vaya a desplazar a javascript en el corto plazo.

Por ahora parece un clon de Java o C# con "gradual typing" y algo de programación funcional.

jueves, marzo 31, 2011

Confesiones de un converso

Cuando ingresé en mi nuevo empleo me tocó hacerme cargo del proyecto de inteligencia de negocios de la organización, en aquel momento pensaba ¿por qué me tenia que tocar a mi la penuria de encargarme de una solución donde lo único que no era Java, eran los productos propietarios de inteligencia de negocios? sobre todo cuando yo no sabía casi nada del tema.

Hoy aprecio que gracias a una plataforma como Java, con su lenguaje simple pero de altísimo nivel, sin el cual, sería inconcebible el desarrollo de aplicaciones de categoría enterprise, excepto por la plataforma .Net, que no se compara en portabilidad.

Aprendí que las aplicaciones por naturaleza son una amalgama de datos "inteligentes", por ello los datos deben llevar con ellos su inteligencia, es decir todas las operaciones que sobre ellos actúan, por lo cual la orientación a objetos es la única manera de modelar las aplicaciones, eso es tan obvio que incluso existen lenguajes universales de modelado basados no solamente en los objetos, sino hechos a la medida de lenguajes empresariales como Java y C#.

Antes solía apreciar la belleza de lenguajes como Perl y Lisp, pero esta claro que sin tipos de datos estrictos como los Java, la programación es solo una actividad informal en la que las personas se divierten probando código, sin realmente estar seguros de que funcionará, es claro que son lenguajes de hackers, y de más esta advertir que esos tíos son peligrosos.

Después de algunas mesas de trabajo para evaluar nuevos ambientes de desarrollo, lenguajes como Haskell y Ocaml afortunadamente fueron descartados, porque son funcionales y las verificaciones de tipos son tan estrictas que es prácticamente imposible lograr que compile el código, a menos que esté prácticamente correcto, lo cual es muy difícil lograr, por ello no pueden competir con el dinamismo de un lenguaje como Java.

En otro orden de ideas no hay forma de que una basecita de datos de software libre como PostgreSQL pueda competir con bases de datos comerciales de calidad enterprise, sobre todo cuando se trata de trabajo serio de negocios con un alto grado de especialización, que en nuestro caso es un Data Wharehouse.

La suite de inteligencia de negocios que estamos utilizando es lo máximo, tal vez una de las mejores cosas que me conseguí cuando llegué, al principio no me dí cuenta, pero después de ver productos como el ETL, que con solo arrastrar, soltar figurillas y unos cuantos clicks extraen, transforman y cargan datos con una mágica facilidad, me han hecho reflexionar sobre la pérdida de tiempo que ha sido utilizar Perl, cuando existen herramientas como esta a solo unos miles de dólares de distancia.

A todos los que me conocen como un apasionado defensor del software libre solo me queda saludarlos y desearles con todo mi corazón que pasen un feliz 1ro de Abril.

lunes, enero 03, 2011

Popularidad versus tecnología

Me conseguí un artículo que confirma algunas de las cosas que siempre digo sobre el desarrollo de software, en particular, insisto en que Java es una gran pérdida de tiempo y dinero para la sociedad, sobre todo cuando desde hace mucho tiempo hay mejores lenguajes y plataformas.

En el artículo se cuenta la historia de éxitos que se lograron utilizando Lisp en el JPL de la NASA, como el reparar una nave espacial que se encontraba a más de 100 millones de millas de la tierra, debido justamente a las características del lenguaje y su plataforma de ejecución.

Hoy en día tal vez suene raro eso de usar Lisp, debido a la percepción (tal vez debería decir el prejuicio) de que es anticuado, o incluso arcaico, sin embargo después de jugar un rato con SBCL uno se puede dar cuenta de lo fácil y dinámico que es el ambiente, es como trabajar con Perl o Python. Lisp resuta ser tan divertido que incluso estoy usando Emacs (sorry Vim, el ambiente SLIME de Emacs es la merma para trabajar con Lisp).

Siendo SBCL un ambiente tan dinámico como Perl o Python, con uno de los mejores y más flexibles sistemas de OOP, que sirvió de inspiración para desarrollar Moose en Perl, extraña que pueda competir con Java en poder de procesamiento, pero consumiendo mucho menos  memoria que este. Además con una semántica bien definida y conocida, producto de: su fundamento matemático, un estándar formal, y una tradición que tiene más de 5 décadas.

Un benchmark demuestra que aún después de casi dos décadas de echarle dinero al pote de Java, todavía ambientes como SBCL (mantenidos únicamente por una comunidad de voluntarios), son más eficientes, y eso no es una casualidad, es una característica de su diseño.

Sin embargo, preferimos un producto corporativo, porque nos vendieron sus grandes innovaciones, tales como: el manejo automático de la memoria y la portabilidad, características que Lisp tiene desde finales de los años 50, unos 30 años antes que Java.

Ahora el daño está hecho, se ha invertido una gran cantidad de tiempo, esfuerzo y dinero en Java, hay que ver que se hace con el monstruo, no puedo estar más de acuerdo con el autor del artículo sobre Lisp en el JPL:
Es muy frustrante ver que todo esto ocurra. Mi trabajo hoy (trabajando en la verificación y validación del software) es resolver problemas que se remontan directamente a la uso de lenguajes puramente imperativos con semántica mal definida como C y C++ (la situación es un poco mejor con Java, pero no mucho). Pero, por supuesto, la solución obvia -- utilizar lenguajes no imperativos con semántica bien definida, como Lisp -- no es una opción. Ni siquiera puedo decir la palabra Lisp sin afianzar mi reputación como un loco que piensa que Lisp es la respuesta a todo. Así que decidí mantener la boca cerrada (la mayor parte del tiempo) y ver con impotencia cómo se gastan millones de dólares de los impuestos.

Por eso es que no escribo demasiado sobre el tema, sin embargo de vez en cuando es bueno revivir la discusión a ver si alguien escucha y se puede corregir el error.

Este es un tiempo interesante, la tecnología funcional se ha reconocido como la única vía para explotar la potencia de las nuevas arquitectura del hardware, por ello Microsoft promueve F#, mientras aparecen lenguajes como Clojure que funcionan sobre la JVM, y es pertinente avisar que hay lenguajes como Haskell, que son mejores que F#, y otros como Lisp y Scheme que son mejores que Cojure.

Para todos los que fans del software corporativo: que dirían si les vendiera el lenguaje BigLisp con las siguientes características:
  • sano
  • seguro
  • con manejo automático de la memoria
  • alto rendimiento
  • bajo consumo de recursos
cuyos programas pueden ejecutarse sin modificación en cualquier plataforma Unix y Windows que tenga un compilador de C, en la máquina virtual de Java, en el ambiente .NET y también en Mono, pero con la capacidad de explotar lo mejor de cada una de estas plataformas y utilizar sus librerías y servicios directamente a cambio de pérdida de la portabilidad.

¿ Me lo comprarían ?

Y si les dijera que lo que aprendan utilizando ese lenguaje, les servirá para toda una familia de lenguajes similares, que van desde herramientas grandes y complejas como los verificadores de teoremas, hasta librerías de scripting de menos de 300kB (no es un error son 300 kilobytes) que podrían simplificar y extender con facilidad programas de C y C++.

¿ Me lo comprarían ?

Seguro que no, incluso habría gente que me diría que eso es vaporware o ciencia ficción, sin embargo llega una empresa como Sun vendiendo la basura de Java y todo el mundo lo compra sin ni siquiera navegar por internet a ver si existe algo mejor.

En realidad BigLisp no existe, sin embargo hay una versión de Scheme llamada Bigloo que tiene casi todas las características que antes mencioné pero que casi nadie usa, porque quien lo hace no es una corporación multinacional, sino un centro de investigación que además hace otro lenguaje espectacular llamado OCaml, que tampoco tiene demasiados usuarios.

Por otra parte los conocimientos de Lisp adquiridos al aprender Scheme, serán útiles para aprender a utilizar herramientas como ACL2 o para extender los programas C, como lo hicieron con Gimp al agregarle ScriptFu, que no es mas que TinyScheme embebido.

Aún así estoy seguro de que muy poca gente me va a comprar eso, mientras no este en las noticias, y nada de eso va a ser noticia porque es casi tan viejo como las primeras computadoras, así que no es noticia, como tampoco es noticia la tecnología de la electricidad, aunque sin ella estaríamos todavía en el siglo XVII.

Mi esperanza es que se comiencen a usar plataformas modernas, que tienen ventajas comparables a las de Lisp, con comunidades que están llegando al punto de masa crítica, y cuyas plataformas avanzan cada vez más rápido, como por ejemplo: Haskell.

domingo, agosto 15, 2010

La nueva trampa de Java

La demanda iniciada por ORACLE contra Google donde se argumenta que el sistema operativo Android viola patentes propiedad de ORACLE, muestra una debilidad de lo que usualmente muchos en la comunidad (incluyendome) consideramos software libre.

Desde que Sun Microsystems liberó la mayor parte del código de la plataforma Java, este asunto ha pasado por debajo de la mesa, pues las implementaciones que se utilizan son: la original, y alguna que otra licenciada directamente del propietario.

En un debate ocurrido hace un lustro, sobre El uso de Java en el Plan Nacional de Migración a Software Libre, Simon Phipps argumentaba que Sun Microsystems era una compañía amigable, que había prometido liberar el código y que estaba trabajando para ello.

En aquel momento mi argumento fue que las corporaciones no tienen alma, sentimientos o lealdad, que son básicamente actores de guerras que solo obedecen a motivos económicos y que verlas de cualquier otra manera era un riesgo que que el Estado no debería correr.

Después de un lustro y luego de la desaparición Sun, al ser adquirida por ORACLE, quedó demostrado que Simon Phipps probablemente tenía razón, Sun finalmente liberó lo que pudo de Java y nunca aplicó tarifas al licenciamiento de la plataforma, sin embargo yo también tenía razón: las corporaciones no tienen alma y ahora que Sun fue tragada por ORACLE se lanza al ataque en contra de quien pueda rendirle beneficios.

Este ataque es hoy posible gracias a un arma secreta que Sun mantenía en su arsenal: "Patentes de Software", para evitar suspicacias como las que siempre han rodeado a Mono, Sun emitió una liberación de uso de dichas patentes para cualquier implementación de  Java, siempre y cuando la implementación incluyera todas las características y servicios de la plataforma y no se incluyera ninguna característica o servicio adicional, es decir que para evitar una demanda de propiedad intelectual por patentes el distribuidor debía asegurarse de:

implementar toda la plataforma y solo la plataforma

Aquí es donde Google cayó en la trampa porque al parecer no incluyó AWT y Swing que son parte integral de la especificación.

Sin embargo lo peligroso de todo este asunto no es la demanda de ORACLE a Google, que puede presentar una buena pelea judicial al estilo SCO, Novel e IBM, sino que la trampa ahora es mucho más sutil (pero no menos potente), ya no basta que un código sea GPL versión 2 para que sea realmente libre.

En los términos establecidos por la liberación de derechos de uso de las patentes de Sun se coarta la libertad 3, que da el derecho a modificar el código y redistribuir el resultado de la modificación, porque Oracle va a demandar por violación de patente al quedar fuera de la protección de la liberación de derechos de uso de patentes, independientemente de lo que diga la GPLv2.

Así que en realidad aunque la mayoría del código de la plataforma Java sea libre por derecho, de hecho no es libre porque ORACLE puede utilizar otros instrumentos para ejercer coacción sobre cualquiera que intente modificar la plataforma, y por lo tanto no cumple con el espíritu del decreto 3390, por ello debe prohibirse nuevamente el uso de esta plataforma en el Estado hasta que se aclare esta situación o se libere Java bajo la licencia GPL versión 3 que incluye protección legal contra las patentes.

Finalmente en un tono más personal deberíamos hacer un esfuerzo coordinado por dejar de consumir productos ORACLE para que la corporación aprenda por la única vía posible: su cuenta bancaria, que jugar con la libertad puede resultar peligroso y dañino.

Dejar de consumir productos de esta infame comañía no es difícil, casi cualquier cosa que se esté haciendo con su manejador de base de datos, se puede hacer con PostgerSQL y todo el resto de sus productos son bastante malos, incluyendo el lenguaje de programación Java (no la plataforma) así que en general, dejar de usar productos ORACLE se puede considerar de entrada como una ventaja competitiva.

lunes, enero 11, 2010

Nuevo lenguaje concurrente

Si creen que les voy a hablar de GO, se equivocan, ya todo el mundo habla de esto hasta el aburrimiento, y la verdad es que lo mas sensacional de GO es que lo lanzó google.

Pero hoy mientras navegaba por ahí me encontré con con ANI, este lenguaje me pareció interesante y tengo pendiente revisarlo más a fondo, de la descripción del compilador llamado anic:

anic es una implementación de referencia para el lenguaje de programación experimental ANI, con las siguientes características de alto rendimiento, estáticamente verificado, con total paralelismo implícito, orientado a objetos, de propósito general.

Se supone que ANI es tan facil como sh y tan eficiente como C, hay que verlo.

viernes, septiembre 25, 2009

El santo grial de la depuración es inminente

Hay algunas situaciones difíciles de depurar, por ejemplo cuando se pierde el control de un puntero que destruye la mitad de la memoria antes de causar una violación de segmento.
Si nunca han pasado por esto hay dos alternativas, o nunca han trabajado en C o son mucho más inteligentes que yo.
Lo cierto es que ese problema sería fácil de depurar con solo permitir que nuestro depurador nos deje ejecutar el programa en reverso, así solo ejecutamos el programa hacia atrás mientras vamos recuperando toda nuestra memoria, hasta el punto donde el puntero se desboca, y seguramente estaremos viendo porque se desbocó.
El problema siempre ha sido que eso es mucho más fácil de pensar que de implementar, porque lo que se requiere es prácticamente una máquina del tiempo para lograrlo.
Pues aunque Ud. no lo crea, se supone que la versión 7 de GDB permitirá la ejecución en reversa.  Lo mejor es que esta versión está prometida para este mes, por lo que asumo que es inminente su distribución, no tengo idea del precio a pagar por esta funcionalidad, pero de seguro no será barata, claro que podremos ejecutar los programas desde el final hasta el comienzo.
Filosofando un poco: un programa que se ejecuta hacia atrás se alimenta de soluciones y genera problemas, así que es mejor no dedicarle muchos recursos a esta tecnología.
Ahora en serio, si esta característica algún día fuera barata podríamos resolver algunos problemas clásicos de sistemas operativos con mucha facilidad, por ejemplo ya no nos preocuparíamos por los deadlocks, porque solamente hay que retroceder el programa adecuado un poquito hasta que se libere el recurso que causa la tranca.

martes, septiembre 22, 2009

Migrando de Subversion a Git

Este es tal vez la mejor receta que he encontrado para migrar repositorios de Subversion a Git:

  http://blog.woobling.org/2009/06/git-svn-abandon.html

Para que todo vaya bien hay que tener un archivo authors.txt que se usa en uno de los comando, mosca con eso.  Por lo demás esto parece dejar el repositorio casi como si fuera originalmente hecho en Git.

martes, septiembre 08, 2009

Popularidad de los navegadores

Viendo los reportes de Google Analytics sobre mis blogs noté algo interesante, y es que al menos la gente interesada en los tópicos que se tratan aquí usan mayormente Mozilla:
1.
Firefox
55.17%
2.
Internet Explorer
24.63%
3.
Mozilla
12.32%
4.
Chrome
3.94%
5.
Opera
2.46%
6.
Safari
0.99%
7.
Konqueror
0.49%
Una relación de 67% en Mozilla contra 25% de IE.
Las estadísticas de Perliscopio, son mucho más abrumadoras, aunque el blog es nuevo y no tiene tantas visitas, pero la relación allí es de 75% para Mozilla y 7% para IE. La conclusión evidente es que perlero no usa IE, ni que use Windows.

sábado, septiembre 05, 2009

El renacimiento de Perl

En el año 2006 estaba coordinando 2 proyectos, uno de ellos era una aplicación web (obviamente en Catalyst), y parte de mi trabajo es buscar mejores herramientas para facilitar la labor de los programadores, así fue como me topé por primera vez con Moose, que aunque incipiente, captó mi atención de inmediato, así seguí los enlaces hacia Class::MOP, donde me hablaban del Meta Object Protocol, y por terminé aprendiendo algo de Common Lisp y particularmente CLOS.
Más o menos al mismo tiempo estaba coordinando el desarrollo de un sistema distribuido para Linux (en C++ por requerimiento del cliente), y también estaba en la búsqueda de alguna herramienta que aliviara el dolor de que nos causaba ese desarrollo, conocí Erlang y redescubrí la programación funcional, que me llevaron finalmente a OCaml, Haskell y Scheme.
[artículo completo]

lunes, agosto 31, 2009

La magia de Perl

Una de las características que hacen de perl una navaja suiza (por cierto afilada) son las construcciones mágicas del lenguaje, que permiten escribir micro programas rápida y fácilmente, y es una de las razones por las cuales el lenguaje tiene fama de incomprensible.
Aunque el uso de estas construcciones están contraindicadas en la programación de sistemas, son de gran utilidad en el día a día de los administradores de sistemas y programadores, por ello voy a explicar las más comunes, para que puedas apreciar su potencia y entender los scripts que se crucen en tu camino.
[artículo completo]

martes, agosto 25, 2009

Perl arcaico

Hace un par de dias me tocó atender un proveedor que vino a ofrecer sus servicios para el desarrollo de una aplicación web.
Como alguno de los participantes de la organización tuvo que manejar un imprevisto aproveché para iniciar un pequeña investigación durante la charla informal: "¿Que herramientas de desarrollo utilizan en su empresa?".
En un mundo ideal la respuesta hubiera sido: "Perl", pero me informaron que ellos trabajan principalmente en Python, aunque pueden trabajar en otros ambientes, incluyendo Perl.
Después de informarles que en la organización preferimos Perl para el desarrollo de nuestras aplicaciones, y después de un micro debate religioso, uno de ellos (Juan) concluyó:

En definitiva cualquier cosa que se puede hacer en un lenguaje se puede hacer en el otro, solo que en Perl la programación es más arcaica
en aquel momento casi me altero, pero en vista de que llegó el que faltaba y que lo importante era la reunión, me quedé tranquilo.
Ahora en retrospectiva me pregunto: ¿a qué se refería con eso de que Perl es arcaico? ...
 [artículo completo]

Reunificando Scheme

Menos de dos años han pasado desde la polémica 6ta revisión del lenguaje Scheme (R6RS), que causó una ruptura de la comunidad. El lenguaje siempre se caracterizó por ser puro y minimalista hasta que este nuevo estándar duplicó el tamaño de la especificación.
En el proceso de ruptura apareció un movimiento para mejorar R5RS, pero manteniendo el lenguaje fiel a sus principios, así nació ERR5RS.
Scheme nunca se convirtió en un lenguaje práctico para el despliegue de aplicaciones, debido a que muchos aspectos de la implementación no eran parte del estándar, dificultando la interoperación del código entre las diversas implementaciones del lenguaje, así que la comunidad de scheme siempre ha estado de una u otra forma dividida, sin embargo R6RS causó una gran fractura, con la mayoría de los fabricantes quedándose en R5RS o migrando a ERR5RS, mientras las implementaciones grandes se fueron por la vía de R6RS.
Esto es una lástima porque los fundamentos matemáticos sobre los que se basa Scheme son muy formales, de hecho toda la semántica del lenguaje está definida matemáticamente a usando semántica denotacional.
Hace unos días para mi sorpresa se activó nuevamente la lista de discusión de R6RS, y la discusiones que vi fueron sobre la división del lenguaje en dos versiones y los posibles nombres que se le darían cada versión!
En un esfuerzo por reunificar la comunidad se piensa en que la próxima versión de Scheme (R7RS?), tendrá una versión light que permita implementaciones pequeñas y mantener a los puristas contentos, mientras la versión pro sería más pragmática, con énfasis en la implementación y desarrollo de sistemas y en interoperabilidad entre las versiones de los diversos fabricantes de compiladores, esta versión profesional podría incluir  un sistema de módulos y una librería estándar.
Ojala este nuevo esfuerzo pueda reunificar nuevamente a la comunidad sin convertir Scheme en un nuevo Common Lisp.

domingo, agosto 23, 2009

El Ironman de Perl



La Organización de Perl Iluminado (enlightened perl organisation), está promoviendo un maratón de blogging en perl para de motivar a los miembros de la comunidad a promover el uso de este lenguaje.
Las reglas son simples:
  • Se puede escribir cualquier cosa sobre Perl, desde información básica hasta avanzada incluso chistes (lo que brinda incluso oportunidad a los detractores del lenguaje).
  • Los artículos pueden ser cortos o largos, así que se pueden escribir recomendaciones simples, trucos, etc.
  • Los artículos no tienen que ser necesariamente en inglés, asi que podemos hacer artículos en castellano!
  • Hay que publicar al menos 4 artículos cada 32 dias, y ningún artículo puede tener más de 10 días de separación.
Si estás interesado puedes enviar un mensaje a ironman@shadowcat.co.uk con los detalles del blog, luego inscribe el feed y tu blog será agregado en http://ironman.enlightenedperl.org/.
Yo por mi parte estoy comenzando un nuevo blog: Perliscopio a ver si logro mantener el ritmo ;-)

miércoles, mayo 21, 2008

Microsoft no entiende a los gobiernos.

Recientemente me conseguí este artículo que ilustra la estupidez de los sudafricanos, que luego se extiende a los asiáticos, latinoamericanos y que finalmente llega incluso a parte de los europeos, por pensar que el software libre es una mejor opción para los gobiernos de sus respectivos países.

El señor Matusow parece estar consternado por el hecho de que Sur África ha decidido utilizar software libre cuando no haya ninguna ventaja extraordinaria ofrecida por software propietario, la idea del gobierno de Sur África es simple:
El criterio principal para seleccionar soluciones de software permanecerá siendo la mejora de la eficiencia, efectividad y economía de los servicios ofrecidos por el gobierno a sus ciudadanos
Lo cual, debería ser uno de los objetivos principales de cualquier gobierno del mundo para cualquier solución en cualquier área, así que no debería haber mayor problema, sin embargo el documento sigue:
El software libre ofrece ventajas significativas ventajas indirectas. Donde las ventajas y desventajas directas de productos libres y propietarios sean igualmente fuertes y si las circunstancias en una situación específica no lo hacen inadecuado, el software libre será preferible
Que en mi opinión es una postura bastante moderada, sin embargo el señor Matusow entra en crisis y emite opiniones como:
Yo estoy en contra de los mandatos en tecnología, y este no es diferente.

Peor aún, obliga a los jefes de tecnología a tomar decisiones que no quieren hacer - esencialmente tomando ambientes que funcionan y representan grandes inversiones para migrarlos a soluciones no probadas y más caras.

Será que el señor Matusow aún trabajando para Microsoft no está al tanto de que su compañía hace exactamente esto todo el tiempo, la última cita es perfectamente válida en el contexto de Windows Vista, donde a pesar de las súplicas de los usuarios, Microsoft los obligará a tomar una decisión que obviamente no quieren tomar, para migrar a una solución más cara en dinero y en recursos.

Adicionalmente el artículo nos habla de las amargas experiencias del autor en la que toda discusión sobre software libre termina en un debate Linux contra Windows, y que los pobres ignorantes de los gobiernos no se dan cuenta de que la libertad en Linux no les servirá para nada cuando la solución final sea montar algo como SAP en Linux.

Tal vez este señor no sea capaz de visualizar que se pueden implementar soluciones 100% libres para resolver el 99% de las necesidades de automatización de oficina, gestión gubernamental y servicios al ciudadano. Seguramente existen casos específicos en los cuales ningún software libre ofrezca todas las opciones requeridas, sin embargo cuando se trata de soberanía y seguridad nacional, creo que es más rentable a largo plazo, desarrollar las funcionalidades requeridas que permanecer como una nación subordinada a las decisiones de una fábrica de software.

Después nos hacen un análisis de lo que los gobiernos buscan en el software libre:
  1. Ahorrar dinero
  2. Desarrollo tecnológico
  3. Soluciones adaptadas a las necesidades locales
  4. Eficiencia operativa y financiera
  5. Oportunidades para vendedores e integradores locales
  6. etc.
Sin verguenza alguna, se explica que no hay ninguna oportunidad de que el desarrollo del sistema operativo suceda en Sur África - aseveración por demás interesante tratandose justamente del país donde se creó la distribución de Linux más exitosa de todos los tiempos (Ubuntu) - que el modelo de software libre debe aplicarse al desarrollo de aplicaciones y dejar el sistema opearativo en paz.

Sin embargo el "etc." incluye algunas cosas que convenientemente se omiten en la lista, probablemente por que son de menor importancia (para el autor):
  1. Independencia
  2. Soberanía
  3. Seguridad Nacional
Desde mi punto de vista este señor es totalmente ignorante sobre las prioridades de un Estado, o se hace la vista gorda, sobre todo cuando vive en un país que es capaz de gastar enormes cantidades de recursos, e incluso iniciar guerras o invasiones con frecuencia en nombre de algunas de esas premisas.

Pero nuestro articulista nos dice que es irreal pensar en que los estudiantes de las universidades se sumergirán en las profundidades del funcionamiento interno de Linux, por lo que asumo que está muy consciente al menos de los asuntos de independencia y soberanía tecnológica. Lo cierto es que aún cuando sea poco probable que los estudiantes se metan de lleno en el funcionamiento interno de Linux, esto es completamente posible, mientras en Windows es absolutamente imposible por su naturaleza propietaria.

Finalmente Matusow nos ilustra la ignorancia de los países en desarrollo, donde el software libre se asume como software gratuito, aunque el desarrollo de las soluciones tecnológicas es igual o más costoso utilizando software libre. Claro está que él no se da cuenta de los costos intangibles de la lista anterior, por supuesto el vive de los abusos de su empleador cuando obliga a un Estado a migrar de Windows XP a Windows Vista, sin importarle que además de los costos de licencias - de los que él se beneficia, además obliga a los gobiernos a renovar toda la plataforma tecnológica de una nación.

Es sumamente triste que a estas alturas del año 2008, después de que una gran cantidad de gobiernos en todos los continentes han analizado los beneficios del software libre desde infinidad de perspectivas, todavía existan personajes como este, que supongo serán pagados para escribir este tipo de ridiculeces.

miércoles, febrero 06, 2008

Autocompletación en VIM

Por si acaso alguien todavía no lo sabe: vim autocompleta. Y debido que lo puedo usar desde terminales remotos, en un editor que arranca en un segundo, no necesito cosas como Eclipse, donde necesito un ambiente gráfico y 5 minutos para comenzar a editar cualquier cosa.

Para autocompletar por contexto edite un archivo y agregue:
sub factorial {
my $n = shift;
return 1 if $n <= 1; return f
y mientras el cursor está todavía al lado de la f (en modo de inserción), pulse CTRL-N y vim completará el la palabra, Vim busca en el archivo actual por palabras que comienzan con el prefijo indicado, y si hay mas de una, abre una persiana de selección.

Con la sintaxis activada (:syntax on) y en modo Perl también busca palabras para autocompletar en todos los módulos que se han usado, supongo que hará lo mismo con python, ruby, etc.

Si quiere autocompletación sobre el lenguaje, puede agregar a su .vimrc, las funciones correspondientes para el lenguaje, a mi me resulta cómoda la ayuda para CSS:
  autocmd FileType css set omnifunc=csscomplete#CompleteCSS
Luego en un archivo CSS, al tipear:
.miclase {
text
seguido inmediatamente de CTRL-X CTRL-O, mostrará las opciones correspondientes, que se pueden seleccionar con las flechas de dirección.

Hay toda una variedad de lenguajes en los que podemos autocompletar:
  autocmd FileType python set omnifunc=pythoncomplete#Complete
autocmd FileType c set omnifunc=ccomplete#Complete
autocmd FileType cpp set omnifunc=ccomplete#Complete
autocmd FileType python set omnifunc=pythoncomplete#Complete
autocmd FileType perl setlocal expandtab ts=4
autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS
autocmd FileType php set omnifunc=phpcomplete#CompletePHP
autocmd FileType xml set omnifunc=xmlcomplete#CompleteTags
autocmd FileType html set omnifunc=htmlcomplete#CompleteTags
autocmd FileType sgml set omnifunc=xmlcomplete#CompleteTags

Esos son los que vienen de cajita en Debian, pero como todo en vim, eso es programable, si necesitan un lenguaje nuevo se pueden hacer la definición, que debe ser similar al archivo que define las palabras de perl.

viernes, noviembre 30, 2007

Amazon apuesta a Erlang

Amazon acaba de lanzar SimpleDB, un nuevo servicio de almacenamiento estructurado, con las características de alta disponibilidad y concurrencia de S3. Este es el segundo servicio basado en Erlang que lanza Amazon al mercado, el otro es el servicio de colas (Simple Queue Service), y es emocionante ver el rendimiento de la plataforma Erlang para la implementación de sistemas que deben operar confiablemente 24x7 y además proveer escalabilidad infinita, tanto en rendimiento como en capacidad.

Amazon, con su plataforma basada en Perl, Linux, Xen, y ahora Erlang, realmente le está sacando punta al software libre.

Pero veamos de que se trata este nuevo servicio que es el sueño mojado de los desarrolladores de la web 2.0.

SimpleDB no funciona como una base de datos relacional, no se necesita definir un esquema, en este sentido parece seguir la tendencia a la desaparición de las bases de datos relacionales, que mencioné en un artículo anterior.

Las características que más me gustan de este servicio:
  • Manipulación de conjuntos de datos realmente grandes (10GB por dominio y hasta 100 dominios por usuario)
  • Muy rápido (espero que se mantenga así)
  • Modelo de computación por demanda (solo se paga por lo que se usa)
  • Modelo de datos similar al utilizado por los lenguajes de scripts (Perl, Python, etc.), sin necesidad de definir esquemas.
  • Interfaz REST y también SOAP.
  • Fácil de usar, como los hashes en Perl :-)
  • Hecho en Erlang, me pregunto si usaron CouchDB ;-)

Sin embargo, hay que considerar algunos detalles operacionales:
  • Al igual que el servicio S3, los objetos almacenados no están disponibles inmediatamente, hasta que están replicados y se puede garantizar la disponibilidad de los mismos, de este modo Amazon se olvida de la C en ACID, para garantizar la durabilidad.
  • Todo es texto, las consultas se hacen lexicográficamente, así que los números deben formatearse apropiadamente, las fechas deben almacenarse en ISO-8601 (pero todos ustedes ya hacen esto, no?).
El modelo de datos es sencillamente espectacular y hace honor a su nombre, los datos se organizan en dominios, donde se pueden almacenar colecciones de atributos, donde cada atributo tener uno o más valores. Las colecciones de atributos pueden ser diferentes para cada objeto del dominio.

Para todos aquellos acostumbrados a lenguajes como Perl, Ruby, Python, etc. pueden imaginarse la estructura de datos como un arreglo que contiene hashes cuyos valores pueden ser escalares o listas.

El lenguaje de búsqueda provee los operadores: =, !=, <, >, <=, >=, STARTS-WITH, AND, OR, NOT, INTERSECTION AND UNION, pero las consultas están limitadas a un máximo de 5 segundos (aunque ninguna consulta de las que pude probar en las 8 horas que tiene el servicio, tardo más de algunos milisegundos).

Hay que mencionar que los costos de almacenamiento son muy superiores a los de S3, mientras que en este último almacenar un 1GB cuesta $0.15, en SimpleDB cuesta $1.50, es decir 10 veces más caro, aunque se puede transferir datos gratuitamente entre S3 y SimpleDB.

jueves, noviembre 08, 2007

Un lenguaje de ciencia ficción

Desde hace algún tiempo vengo trabajando cada vez más con Erlang, un lenguaje de programación de propósito general diseñado específicamente para la implementación de sistemas robustos, distribuidos y masivamente paralelos.

Erlang es un lenguaje funcional de evaluación estricta con tipos dinámicos y asignación única. En términos más prácticos, esto significa que no existe la asignación destructiva, las variables se declaran con un valor y no pueden cambiar (como en las matemáticas), así que se parecen más a las constantes de otros lenguajes, tampoco tiene estructuras de control de ciclos, ya que son inútiles en ausencia de la asignación destructiva.

Si piensa que un lenguaje así es prácticamente inútil, verifique si en su lenguaje favorito puede expresar el factorial de manera más concisa que en Erlang:

1 factorial(0) -> 1;
2 factorial(N) -> N * factorial(N-1).

El paradigma funcional, utilizando recursión, en conjunto con el reconocimiento de patrones (pattern matching), permiten expresar los algoritmos de manera clara y concisa, haciendo de la asignación un mal del pasado.

El ambiente de ejecución del lenguaje denominado: Open Telecom Platform (OTP), similar en funciones al JRE en Java, provee servicios de concurrencia, distribución, tolerancia a fallas, compilación, carga y reemplazo incremental de código a tiempo de ejecución, que en conjunto con los tipos dinámicos propician un ambiente para el desarrollo rápido de aplicaciones, compitiendo directamente con lenguajes como Perl y Ruby.

En el pasado se consideraba a los lenguajes funcionales como una curiosidad académica, se argumentaba que el paradigma funcional no escalaba como para implementar los sistemas complejos requeridos por la industria y el comercio.

Erlang/OTP demolió este mito, cuando Ericsson desarrolló el switch ATM: AXD-301, cuyo software contiene 1.7 millones de líneas en Erlang, adicionalmente Ericsson ha desarrollado otros sistemas de hasta 3.5 millones de líneas, que funcionan confiablemente desde hace años.

El lenguaje fue diseñado por Ericsson hace unos 20 años, para limitar la complejidad y mejorar la productividad del software desarrollado internamente, particularmente las centrales telefónicas, que además de ser masivamente paralelas, deben ser sistemas escalables y tolerar casi cualquier tipo de falla.

El resultado de todo esto es un plataforma de ejecución madura, cuyo lema es:
Evitar la programación defensiva
es decir, no maneje los errores, deje que alguien más lo haga.

En los demás lenguajes de programación se consume una cantidad considerable de recursos de diseño intentando manejar las anomalías durante la ejecución del programa, cuando en realidad se pueden presentar fallas que ni siquiera imaginamos, y que inútilmente intentamos manejar acomodando ligeramente los datos y delegando el problema.

En consecuencia obtenemos un montón de código de verificación de errores, que obscurece los algoritmos, complicando el mantenimiento del software y creando una pesadilla en la depuración, si el problema delegado finalmente causa un error, pues generalmente es difícil de relacionar con el evento original.

Erlang sigue el principio de diseño que expresa:
Si se va a fallar, se debe fallar rápido y ruidosamente

Facilitando la determinación del origen de la falla. Por ello los programas se diseñan para manejar el caso general, asumiendo que todo va a salir bien, abortando inmediatamente ante cualquier falla.

A primera vista esta estrategia no parece muy efectiva para lograr sistemas que deben operar continuamente tolerando cualquier tipo de fallas, pero lo hace, debido a una combinación de características del lenguaje y su plataforma de ejecución.

En Erlang el código de las aplicaciones se divide en procesos, definidos como unidades de ejecución autónomas, independientes y aisladas, que no comparten memoria, ni pueden afectarse entre sí. Por eso la falla de algunos no causa problemas a los demás, convirtiéndolos en un excelente mecanismo para contener los efectos de una falla.

Utilizando inteligentemente estas propiedades, se puede ingeniar un sistema donde además de procesos trabajadores, existan procesos supervisores, atentos a reparar las posibles fallas de otros procesos, OTP provee un sistema completo de supervisión de tareas, que permite la reactivación de procesos abortados e incluso cambiar el código de la aplicación o partes de ella, en caliente, es decir sin detener la ejecución de la misma. ¿Alguna vez su teléfono dejó de funcionar durante una actualización de software de la central telefónica?

Los supervisores se aseguran de registrar los eventos de falla y reiniciar a sus supervisados, según las políticas programadas, si alguno de los trabajadores muere con una frecuencia superior a la permitida, el supervisor mata al resto de sus trabajadores y aborta, escalando el problema al supervisor padre. Así se establece una jerarquía o árbol de supervisión, donde el máximo supervisor es parte de OTP, está muy bien depurado y maneja graciosamente casi cualquier tipo de falla. Garantizando que las aplicaciones diseñadas según la filosofía Erlang/OTP no fallan, aunque partes de la aplicación pueden fallar.

¿Será que esto es eficiente?

Si, considerando el paradigma, OTP es un sistema operativo completo que funciona dentro de un sistema operativo anfitrión como Linux, de hecho todo OTP es un solo proceso del S.O. anfitrión, aun cuando el kernel de OTP gestione muchos micro procesos internamente.

A diferencia de la semántica de protección de los sistemas operativos POSIX, los procesos de OTP están aislados automáticamente por la semántica de Erlang, carente de estado global y mutabilidad, permitiendo la implementación eficiente de los mismos, por ejemplo en mi laptop (un Centrino 1.7GHz, con 1GB RAM):

OperaciónErlangLinux
Cambiar de proceso400 ns2 us (5 veces más)
Arrancar un proceso5 us500 us (100 veces más)
Enviar un mensaje2 us800 us (400 veces más)

Adicionalmente un proceso recién creado consume solo unos 1500 bytes, que en las máquinas de hoy es prácticamente nada, otros sistemas como pthreads suelen consumir mucho más memoria, aún para programas de demostración sin utilidad práctica (pthreads en linux por defecto usa como 10MB! de RAM, aunque esto se puede ajustar cuando se crea un thread).

Dado que los procesos no pueden afectarse entre si, ni compartir memoria es pertinente la pregunta: ¿cómo cooperan?.

Erlang utiliza el modelo de actores, donde cada proceso es un actor que intercambia mensajes con los demás actores del sistema, el mecanismo de intercambio de mensajes está eficientemente implementado en el kernel de OTP y plenamente integrado con el lenguaje, mediante un operador y una estructura de control. Por ejemplo: si la variable Pid contiene una referencia a un proceso, podremos enviarle un mensaje con la expresión:

1 Pid ! "Este es un mensaje en un string"

En realidad cualquier término de datos del lenguaje puede enviarse en un mensaje, así que se puede intercambiar cualquier estructura arbitrariamente compleja, en este caso una tupla que contiene el átomo "dibujar" y una lista de otras 2 tuplas, etc.:

1 Mensaje = { dibujar, [ {elipse,1,1,4,6},
2 {cuadro,4,8,7,9} ] },
3 Proceso ! Mensaje

Este mensaje puede ser recibido por el Proceso referido, utilizando la instrucción receive:

1 receive
2 Msg -> procesar_mensaje(Msg)
3 end

Utilizando el reconocimiento de patrones, receive puede discriminar con facilidad entre diversos tipos de mensajes, para tomar las acciones correspondientes:

1 receive
2 {dibujar, Lista} ->
3 dibujar_elementos(Lista);
4 X when is_string(X) ->
5 dibujar_string(X);
6 X ->
7 alerta("Mensaje no identificado", X)
8 end

Si ningún patrón coincide, receive lanza una excepción que de no ser capturada, abortará la ejecución del proceso.

Al modularizar una aplicación como un conjunto de procesos que intercambian mensajes, se obtiene una aplicación dividida en celdas que contienen la propagación de los efectos de las fallas, pero además estos procesos podrían efectuar muchas de las operaciones concurrentemente, beneficiándose automáticamente de las arquitecturas de procesamiento paralelas existentes hoy en día.

OTP permite la operación distribuida, donde varias instancias forman una comunidad de nodos que se ejecutan en máquinas posiblemente separadas y se ofrece un servicio de páginas amarillas que permite el registro y ubicación de procesos por nombre. Una vez obtenida una referencia a un proceso mediante las páginas amarillas, no se diferencia entre las referencias a procesos remotos y a procesos locales, brindando un sistema de comunicación totalmente transparente.

OTP enruta, serializa y deserializa eficientemente los datos contenidos en cualquier mensaje. El protocolo de comunicación entre estos nodos es adaptable y puede ser reemplazado para aplicaciones específicas (si esta dispuesto a programar código de esa complejidad en C), la plataforma soporta TCP/IP por defecto, pero hay implementaciones para algunos otros protocolos.

Una aplicación diseñada para aprovechar el modo distribuido de Erlang, puede funcionar en una máquina de un procesador o escalar a varias máquinas con múltiples procesadores, sin cambiar una sola línea de código. La ausencia de estado global y mutabilidad permite que procesos diseñados bajo ciertos parámetros sencillos, sean reemplazados por nuevas versiones de código, mientras se ejecutan, sin perder la secuencia o estado de ejecución de los mismos!

El gestor de aplicaciones permite la especificación estática de un sistema distribuido, con capacidad de ejecutar las aplicaciones en un número fijo de nodos, con un sistema de supervisión que en segundos reconoce las fallas en un nodo, y arranca todos los actores desaparecidos durante la falla en otros nodos (failover), permitiendo la operación continua del sistema (con rendimiento degradado), además si el nodo original vuelve a funcionar, los procesos vuelven a su lugar como si nada hubiera pasado (takeover). Todo ello sucede automáticamente, sin necesidad de intervención del administrador.

Estas técnicas llevadas al extremo, combinadas con el uso del servicio de monitoreo de carga distribuido de OTP, permiten el diseño de sistemas con escalabilidad dinámica, en los cuales simplemente agregar un nodo a una comunidad causaría que los agentes en diversos nodos del sistema decidan mudarse para aprovechar el nuevo poder de procesamiento agregado a la comunidad. Esto es mucho más difícil de lograr que los failovers y takeovers, sin embargo, el que se pueda hacer, nos pone en el terreno de la ciencia ficción, muy cerca de historias como "Piso 13" o "La Matriz".

jueves, noviembre 01, 2007

Interés por el paralelismo

He notado a través del servicio de Feedjit que tengo a un lado del blog, que hay una buena cantidad de gente que llega a este blog mediante búsquedas en google, sobre tópicos sobre programación concurrente. Así que me voy a dedicar un poquito más a mostrar técnicas y código.

Por supuesto la probabilidad de que estas técnicas incluyan Java o C++ son bajas, aunque no nulas, porque por allí esta Hadoop una librería del proyecto apache hecha en Java por el proyecto apache, y que implementa el algoritmo Map/Reduce de google.

Aunque en realidad hacer algún ejercicio sobre Java me parece aburridisimo, Hadoop es una excelente alternativa para aprovechar el poder de computo de las nuevas nuves de computación elástica que están apareciendo por allí, liderizadas por la EC2 de Amazon.

Así que estén pendientes.

Trafico de influencias

En vista del giro de decisiones tomadas por Nigeria, evidenciadas en la carta abierta del presidente de Mandriva a Steve Ballmer (original en inglés), me impresiona como un país que asumo tiene un bajo nivel de vida como Nigeria, puede tomar la decisión de botar un producto que ya compró, para reemplazarlo por otro equivalente para sus fines, que deberá pagar nuevamente, sin haber siquiera probado el que ya compró. No me quejo de que cambien un producto libre por uno propietario, la desfachatez va mas allá, llegando al nivel de pagar dos veces por un producto.

El poder de lobby de las transnacionales es especialista en inyectar este tipo de corrupción, donde algún funcionario por meterse unos reales, causa graves daños a su nación, porque no solo es lo que se roba, sino que para robarselo debe hacer un gasto que seguramente es 5 veces mayor.

Adicionalmente estás transnacionales son mucho más eficientes en este juego en las naciones menos desarrolladas, donde la gente necesita más esos recursos, pero hay mucho menos capacidad de control de los mismos.

sábado, octubre 27, 2007

El principio del fin

El modelo de base de datos relacional siempre ha promovido la idea de que cualquier cosa se puede almacenar en una base de datos relacional, para muestra solo hay que ver algunos productos de Oracle. Sin embargo, son esos mismos productos, o mejor su gran fracaso, los que dejan entrever que en realidad los RDBMS no son una solución universal de almacenamiento.

En efecto investigaciones sobre sistemas de almacenamiento persistente y recuperación de información parecen apuntar a la desaparición de las bases de datos como las conocemos hoy.

Ciertamente se pueden almacenar documentos de texto, páginas web y hasta información jerárquica en un RDBMS, igual que se puede utilizar una llave de tubos para martillar un clavo y demoler paredes, sin embargo que se puedan utilizar, no significa que sean apropiadas para eso.

Por ello están apareciendo múltiples tipos de bases de datos especializadas para cubrir diversos campos de aplicaciones que necesitan persistencia, estas aplicaciones permiten estructurar la información mas compacta y eficientemente que su equivalente modelado en base al álgebra relacional, en áreas que van desde el almacenamiento de jerarquías hasta el de documentos, incluyendo aplicaciones como el Data Warehousing, lo que deja a los RDBMS confinados básicamente a un solo área: el procesamiento de transacciones en línea (OLTP).

Aun cuando pueda pensar que lo que digo es una insensatez, puede preguntarse que usa Google para implementar sus servicios y la respuesta es: que no usan RDBMS ni siquiera para la facturación que es una aplicación típica de OLTP. También puede preguntarse que utiliza Alexa, y la respuesta es otra vez: algo diferente de un RDBMS.

Pero además los últimos avances tecnológicos y particularmente la Ley de Moore, estan permitiendo reemplazar los RDBMS para sistemas OLTP, y además ganar 1 o 2 órdenes de magnitud en el rendimiento, sería como ponerle un turbo a su base de datos actual para que fuera 100 veces más eficiente.

100 VECES !!, ¿pero cómo?, fácil, metemos todos los datos en RAM, y al olvidarnos del disco, todo va mucho más rápido, pero además como no hay que mantener estructuras complejas como logs de transacciones, y algunas otras estructuras que solo existen para optimizar el número de accesos a disco en un RDBMS tradicional, los datos pueden almacenarse de manera más compacta, aumentando la posibilidad de almacenar sus datos en RAM.

Rápidamente surge la duda: ¿será que caben mis datos en RAM?, veamos; hoy son comunes los servidores con 64GB de RAM, el 95% de las bases de datos para OLTP caben en esa cantidad de memoria, el otro 5% son de negocios tan grandes que podrían comprar servidores con 256 GB de RAM, o esperar solo 3 años para que aparezcan servidores con 1TB de RAM.

Pero ¿y si la máquina que contiene los datos únicamente en RAM falla, cómo recupero las transacciones desde el último backup?, la respuesta es simple y además resuelve otro problema habitual: no se necesita recuperar ninguna transacción porque las réplicas siguen trabajando, apenas se resuelva el problema con la máquina fallida, esta vuelve a adquirir la base de datos desde alguna de las replicas, preferiblemente esparcidas por todo el mundo.

Si aún le parece una idea descabellada, puede leerse el paper The End of an Architectural Era (It’s Time for a Complete Rewrite)” donde los investigadores del M.I.T. dan una perspectiva mucho más técnica.