Java7 Closures

Al votar hoy en la encuesta de JavaHispano.org acerca de los closures en Java 7 pude ver que los resultados reflejaban que una gran cantidad de personas registradas en este sitio no conocen los closures. La verdad es que cualquier programador que haya trabajado con otros lenguajes como Lisp, JavaScript o Ruby conocerá los closures decerca. Incluso Groovy, tiene closures.

Funciones-objeto y closures

Lo primero que hay que entender es la diferencia entre funciones como objetos y closures. Una función puede ser anónima o definida, pero también pueden ser objetos en si mismas. Esto nos permite utilizar funciones como argumentos, ser devueltas por otras funciones o ser almacenadas en estructuras de datos. Vamos, son objetos de primera clase o de primer orden.
Un closure es una función más su entorno y estos pueden ser de igual forma tratados como objetos de primera clase, pero al contener un entorno, podemos acceder a variables (o funciones) de este entorno incluso cuando el mismo no este activo. Existen lenguajes que soportan funciones-objetos o closures o ambos, y muchos de los lenguajes funcionales en su mayoria utilizan funciones y funciones-closure.
Entonces, un closure, por ejemplo, nos permite definir una función que tiene acceso a una variable, así que podemos almacenar esta funcion en un objeto y acceder a ella. El contexto de la función no se limita sólo a los objetos a los que tiene acceso directo, pero también a las variables que obtiene vía el entorno.

¿Cómo encaja esto dentro de Java? 

Veamos un ejemplo clásico de sort con un método anónimo:
  1. anArray.sort(new Comparator() {
  2.     public int compare(MyClass a, MyClass b) {
  3.         return a.myProperty().compareTo(b.myProperty();
  4.     }
  5. });
Con closures haríamos esto:



  1. anArray.sort( (a, b) => a.myProperty().compareTo(b.myProperty() );
Es algo muy usual realizar operaciones sobre cada objeto de una lista, por ejemplo:

  1. public List squareIntegers( List iList) {
  2.     List result = new ArrayList(iList.size());
  3.     for (Integer i : iList){
  4.        result.add(i*i);
  5.     }
  6.     return result;
  7. }
  8. iList = squareIntegers(iList);
Con un closure:

  1. iList = iList.map( { Integer i => i*i } );
Pero estas son realmente funciones-objetos que son pasadas como argumentos a otras funciones. Así que una
definición teórica de closure, es decir, un método que puede obtener o hacer "close over" sobre el contexto del código al que pertenece sería:

  1. public Collection getSpanishDvd( Collection dvds ){
  2.     return select( dvds, { Dvd aDvd => dvd.isSpanish() } );
  3. }

  4. public static Collection select(Collection source, {T=>Boolean} predicate) {
  5.     Collection result = new ArrayList();
  6.     for (T o : source) {
  7.         if (predicate.invoke(o)) result.add(o);
  8.     }
  9. }

¿Son utiles los closures?

En lenguajes como Python llevan mucho tiempo discutiendo sobre la necesidad de lambda y la verdad es que IMO no son algo necesario, pero que es bueno tener a mano para cuando las circunstancias lo precisen. Este tema es parecido al de los for-each con Java6 donde muchas personas desconfiaban de la implementación de estos y de su utilidad. Como sucede con cualquier herramienta, es mejor entenderla antes de utilizarla para no terminar con código spaghetti que dificulte la lectura y el mantenimiento.

Os recomiendo leer el libro SICP para comprender los closures en su totalidad y además un poco de Lisp.

DVD Rip en Ubuntu 9.10

Estos dias me he puesto a hacer copias de seguridad de toda la filmoteca de DVDs que tenemos para los niños y es un arduo trabajo. Por suerte he empezado a utilizar una herramienta que viene con Ubuntu Karmic Koala llamada Thoggen que hace un gran trabajo al simplificar todo el proceso.
Lo primero que me gusto fue lo sencillo de su interfaz y que automaticamente selecciona los capitulos que piensa pueden ser los importantes, por lo que no hace falta adivinar cuales son. Dado que sólo codifica en OGG Vorbis, sólo tenemos que seleccionar el tamaño y el idioma.



Que sólo permita utilizar OGG tambien puede ser un problema si vamos a reproducir estos videos en black-box-appliances como lo son los reproductores de DIVx de toda la vida. Es muy raro encontrar alguno con soporte para OGG Vorbis, pero esto tampoco es un problema gracias a mencoder.

Con el siguiente comando, podreis convertir vuestros videos a MPEG-4 que cualquier reproductor en el mercado será capaz de reproducir. Además, junta todos nuestros capitulos en un único fichero:

$mencoder -oac mp3lame -ovc xvid -xvidencopts vhq=1:bitrate=2200:nopacked:nogmc:noqpel:nocartoon:bvhq=0:max_bframes=2:quant_type=mpeg ficheros_entrada.* -o fichero_salida.avi

Espero os sea util.

Monocaffe Connections Manager 0.8

Ya está disponible la nueva versión de MCM para ser descargada desde el sitio habitual.

http://launchpad.net/mcm/

Para esta nueva versión se han arreglado gran variedad de fallos y se han añadido algunos cambios que mejoran la interfaz.


Ubuntu Karmic Koala 9.10 amd64

Bah! Esto no es una review, sólo quiero dejar claro los cambios más importantes que he encontrado en ésta nueva versión de Ubuntu. La verdad, no había actualizado porque me sentía bastante cómodo con 8.10 Intrepid Ibex, que es una de las mejores versiones que he utilizado.
Empathy
El nuevo cliente de mensajería está muy logrado aunque algunas cosillas faltan por arreglar, sólo espero que no empiecen con las mismas luchas internas que hicierón que Pidgin se separase.
Centro de Software de Ubuntu
Me gusta su facilidad y que vaya instalando las aplicaciones y puedas continuar añadiéndolas a una cola que va instalando según va terminando.
Firefox 3.5
Aunque llevo mucho tiempo utilizando Shiretoko, se nota la diferencia con la versión estable de FF3.5.
Temas
Me gusta el nuevo tema por defecto con tonos marrones y grises. Muy sobrio y sencillos, que no molestan.
Ubuntu One
Solía utilizar Dropbox, pero Ubuntu One se muestra como un gran competidor, espero que no me de los problemas de sincronía que me dio Dropbox.
General
Como siempre la re-instalación del sistema ha sido cuestión de una hora, como mucho, sin hacer un respaldo de mis datos en /home. Al terminar GNOME ha cogido la configuración de 8.10 sin problemas y ha cargado los widgets, fondo de pantalla y tema sin quejarse. Los nuevos "globos de aviso" o como se llamen, parecen un poco desfasados ya que aparecen en un sitio extraño, pero tengo entendido que esto es a propósito (Not a Bug, a feature), así que a probarlo. Tampoco es que como si aparecieran cada 5 minutos como en otros OS's.
Conclusión
Estoy muy contento con la nueva versión que no me ha dado ningún problema y veo que Canonical está siguiendo un buen camino.

Monocaffe Connections Manage 0.7.5

Nueva versión de Monocaffe Connections Manager puede ser descargada desde el sitio habitual:
mcm-0.7.5.tar.gz

Esta nueva version arregla algunos fallos y añade ciertas mejoras como:
  • Menu auxiliar de las consolas para:
    • Copiar/Pegar desde/a una consola.
    • Buscar en google a partir de la selección.
    • Cambiar el titulo de las pestañas.

Eso es todo por ahora, aun queda algo de trabajo pero en curso para la release 0.8.

Screenshot!!!


Karmic 64

Hace unos días recibimos en la oficina PC's nuevos que son unos monstruos. El problema fue al intentar instalar las versión amd64 de Ubuntu o de Fedora 12. Ninguna de las versiones Live o Desktop llegaban a arrancar del todo. La solución es tan sencilla como utilizar la versión alternate de Ubuntu. Aunque no nos ofrezca una instalación gráfica y tarde un poco más, funciona.

Manifiesto: En defensa de los derechos fundamentales en Internet

Ante la inclusión en el Anteproyecto de Ley de Economía sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresión, información y el derecho de acceso a la cultura a través de Internet, los periodistas, bloggers, usuarios, profesionales y creadores de internet manifestamos nuestra firme oposición al proyecto, y declaramos que… 



1.- Los derechos de autor no pueden situarse por encima de los derechos fundamentales de los ciudadanos, como el derecho a la privacidad, a la seguridad, a la presunción de inocencia, a la tutela judicial efectiva y a la libertad de expresión. 


2.- La suspensión de derechos fundamentales es y debe seguir siendo competencia exclusiva del poder judicial. Ni un cierre sin sentencia. Este anteproyecto, en contra de lo establecido en el artículo 20.5 de la Constitución, pone en manos de un órgano no judicial -un organismo dependiente del ministerio de Cultura-, la potestad de impedir a los ciudadanos españoles el acceso a cualquier página web. 


3.- La nueva legislación creará inseguridad jurídica en todo el sector tecnológico español, perjudicando uno de los pocos campos de desarrollo y futuro de nuestra economía, entorpeciendo la creación de empresas, introduciendo trabas a la libre competencia y ralentizando su proyección internacional. 


4.- La nueva legislación propuesta amenaza a los nuevos creadores y entorpece la creación cultural. Con Internet y los sucesivos avances tecnológicos se ha democratizado extraordinariamente la creación y emisión de contenidos de todo tipo, que ya no provienen prevalentemente de las industrias culturales tradicionales, sino de multitud de fuentes diferentes. 


5.- Los autores, como todos los trabajadores, tienen derecho a vivir de su trabajo con nuevas ideas creativas, modelos de negocio y actividades asociadas a sus creaciones. Intentar sostener con cambios legislativos a una industria obsoleta que no sabe adaptarse a este nuevo entorno no es ni justo ni realista. Si su modelo de negocio se basaba en el control de las copias de las obras y en Internet no es posible sin vulnerar derechos fundamentales, deberían buscar otro modelo. 


6.- Consideramos que las industrias culturales necesitan para sobrevivir alternativas modernas, eficaces, creíbles y asequibles y que se adecuen a los nuevos usos sociales, en lugar de limitaciones tan desproporcionadas como ineficaces para el fin que dicen perseguir. 


7.- Internet debe funcionar de forma libre y sin interferencias políticas auspiciadas por sectores que pretenden perpetuar obsoletos modelos de negocio e imposibilitar que el saber humano siga siendo libre. 


8.- Exigimos que el Gobierno garantice por ley la neutralidad de la Red en España, ante cualquier presión que pueda producirse, como marco para el desarrollo de una economía sostenible y realista de cara al futuro. 


9.- Proponemos una verdadera reforma del derecho de propiedad intelectual orientada a su fin: devolver a la sociedad el conocimiento, promover el dominio público y limitar los abusos de las entidades gestoras. 


10.- En democracia las leyes y sus modificaciones deben aprobarse tras el oportuno debate público y habiendo consultado previamente a todas las partes implicadas. No es de recibo que se realicen cambios legislativos que afectan a derechos fundamentales en una ley no orgánica y que versa sobre otra materia. 


Este manifiesto, elaborado de forma conjunta por varios autores, es de todos y de ninguno. Si quieres sumarte a él, difúndelo por Internet.

#Manifiesto
@iescolar