Tal y como nos comentó un compañero del CUSL-3, Andreu Correa Casablanca, tenemos que rectificar la documentación debido a que JAI no está optimizada para todas las plataformas. En concreto no está optimizada para Mac, pero si para linux, windows y sun, incluso para unas plataformas presenta mejor optimización que para otras.
Pero al documentarnos nos dimos cuenta que nosotros no estabamos usando la versión de JAI apropiada, por lo que optamos por instalar la versión optimizada para Windows. La opción elegida ha sido la instalación de JAI con el CLASSPATH por no encontrar una solución aceptable con la instalación de JAI en el JRE o en el JDK.
Tanto al instalar JAI en el JRE como en el JDK, nos encontramos con el problema que al ejecutar la aplicación no encuentra las bibliotecas JAI, obteniendo un error del tipo “java.lang.NoClassDefFoundError” hemos intentando buscar información al respecto y probado diferentes soluciones, pero la información recopilada no ha sido suficiente para conseguir que funcionase la integración con Eclipse.
Según hemos encontrado y hemos entendido, esto se puede deber a que la máquina virtual no encuentra donde se encuentran las bibliotecas, por lo que hay que añadir en el PATH la localización de las bibliotecas, pero ni cambiando el PATH hemos conseguido que todo funcione.
Además de probar estas dos opciones, intentamos instalar JAI con el CLASSPATH, al principio conseguimos que funcionase al linkar las bibliotecas que forman parte de JAI (jai_core, jai_codec, mlibwrapper_jai) pero estas funcionaban dando un error donde no podía cargar la aceleración nativa (Error: Could not load mediaLib accelerator wrapper classes…). Al final esto se ha solucionado cambiando la variable PATH del sistema para que encuentre las bibliotecas .dll, las cuales están optimizadas para Windows (en este caso concreto).
Al final hemos conseguido que todo funcione correctamente, pero la solución tomada no ha sido la más óptima, pensamos que es mejor que nuestra aplicación funcione tomando directamente las bibliotecas desde el JRE porque esta solución es más elegante.
En esta actualización hago referencia a alguna de las muchas páginas donde se pueden adquirir módulos de X10, aunque basta con hacer una simple búsqueda en google. Pongo las que me han parecido mas significactivas.
En español:
http://www.domodesk.com/
http://www.superinventos.com/modulosx10.htm
http://www.securimport.com/
http://wondertienda.com/tiendaonline/
En inglés:
http://www.x10.com
http://www.smarthome.com/
http://www.getautomated.co.uk/
Viendo estas páginas podemos observar lo que ya os comentaba en unos post atras sobre la diferencia de precios [...]
Por lo que hace poco me comentó un amigo que probó la versión nueva (la 0.3), ha surgido un nuevo problema. Su cuenta de correo tiene bastantes mensajes, y la búsqueda de mensajes se le quedó bloqueada cuando iba al 4%.
En los próximos días intentaré cambiar la búsqueda para que esto no pase nunca más. Seguramente se deba a problemas de conexión, por lo que me replantearé los “stay alive” y puede que los sustituya por reconexiones al servidor. En cualquier caso, buscaré posibles soluciones y las iré probando.
Debido a esto, los cambios para la versión 0.4 no serán las mejoras mencionadas en el penúltimo artículo, sino la solución a este problema. Dichas mejoras las dejaré para la versión 0.5, ya que no son prioritarias para mí.
La verdad es que la aparición de este problema me ha desmotivado un poco, aunque tampoco va a hacer que me rinda, claro. En fin, ya os contaré como va la cosa.
Este post podría llamarse perfectamente “In the meanwhile 2″, ya que el nuevo sistema de plugins aun no esta listo.
La capacidad guardar los links del GUI es algo que me han pedido varios usuarios ultimamente, así que aprovechando la facilidad que he obtenido recientemente con los archivos de configuración en python he decidido implementarla.
Una sesión esta definida por el estado actual de los paquetes de Tucan, de esta forma al salvar la sesión solo se salvaran los archivos de los paquetes que no se hayan descargado aun.
Una vez salvada alguna sesión, al cargarla Tucan volverá al mismo estado que cuando se salvo, de manera transparente para el usuario.
También he añadido soporte para copiar links desde el menú contextual del GUI.
PD: Todos estos cambios estan en la versión 0.2.2.
Feliz navidad, Crak.
En la forja de RedIRIS hay un apartado que me parece muy útil, aunque un poco desierto: Recortes de código. He añadido el módulo Algoritmos a esa sección.
El módulo Algoritmos es el lugar donde se almacenan algoritmos de propósito general, implementados como funciones de orden superior. Por el momento contiene un algoritmo voraz (que de momento no se ha usado en Principia) y un algoritmo de vuelta atrás.
Las funciones de orden superior son las que tienen como parámetros otras funciones; por ejemplo, el algoritmos de vuelta atrás lo escribo como una sola función así:
vueltaAtras :: (a->Bool) -> (a->[a]) -> (a->Bool) -> a -> [a]
vueltaAtras valido hijos condicionesDePoda ensayo
| valido ensayo = [ensayo]
| otherwise = [nodo| hijo<-hijos ensayo, condicionesDePoda hijo, nodo<-vA hijo]
where
vA = vueltaAtras valido hijos condicionesDePoda
Voy a aprovechar éste código para comentar algunas cosillas de Haskell.
Línea 1
Indica de qué tipo es la función; su signatura. No es obligatorio escribirlo, pero evita errores. El tipo de cada parámetro está separado de los demás por una flecha; salvo la última de ellas, que separa los parámetros de la salida. Un ejemplo más simple sería:
f :: a -> Bool
donde se está indicando que “f” es una función que, dado un parámetro de cualquier tipo, devuelve un valor booleano. “a” representa a cualquier tipo, por lo que podría considerarse una variable cuyos valores son tipos. Así se indica el polimorfismo.
En el caso de vueltaAtras, el parámetro “válido” es una función del mismo tipo que f; así, con los paréntesis en la signatura, se expresa que vueltaAtras es una función de orden superior.
Líneas 3 y 4
Según si el ensayo es válido o no, la función se define de forma distinta. El valor absoluto de un número podría definirse como:
valorAbsoluto x
| x >= 0 = x
| otherwise = -x
Línea 4
Aparece una lista comprensiva, un formato muy práctico para definirlas. La notación es muy parecida a la usada en matemáticas para conjuntos. Por ejemplo, los números pares podrían expresarse como,
todosLosPares = [n| n<-[1..], even n]
o incluso como,
todosLosPares' = [2*n| n<-[1..]]
Los conjuntos equivalentes habrían sido {n|n<-[1..infinito), n par} y {2*n|n<-[1..infinito)}. Como es evidente, [1..] representa todos los números enteros del 1 en adelante. Se trata de listas infinitas, pero están permitidas en Haskell, y en ocasiones es muy cómodo tener esa posibilidad.
Para saber más sobre Haskell, un manual muy bueno que hay desde hace poco y con licencia Creative Commons es Real World Haskell, aunque para nosotros tiene la pega de estar en inglés.
En este último mes me he dedicado a terminar la página web y a pulir ciertos aspectos del proyecto para lanzar oficialmente las primeras versiones públicas de LongoMatch, que actualmente se encuentra en la 0.10. LongoMatch está teniendo un éxito asombroso para su juventud, y en menos de dos semanas ha alcanzado casi las 400 descargas y está empezando a darse a conocer de forma discreta como aquí y aquí.
Aún queda mucho trabajo por delante pero se presenta un futuro prometedor si consigo seguir con el mismo ritmo de trabajo.
En las próximas semanas empezaré a ir introduciendo los aspectos técnicos de la implementación, entre los cuales destaca el haber conseguido escribir un backend multimedia basado en GStreamer multiplataforma y el haber conseguido compilar GStreamer satisfactoriamente para Windows con soporte para casi todo tipo de archivo multimedia
En este tiempo de dedicación a “otras cosas”, que luego se han incluido en el proyecto por razones de la casualidad, se ha publicado otra versión de symfony. He probado un poco a instalarla y el método de trabajo me gusta un poco más que la anterior. El sistema de instalación, sin estar basado en sandbox, permite una libertad real de tener diferentes versiones de symfony corriendo en un mismo sistema. Así que mientras hago todo lo posible por sacar adelante el proyecto de fin de carrera y terminar alguna paginilla web que me ha encargado un colega, intentaré aprender las bondades de este nuevo symfony.
Terminado el programa de inscripciones de la San Silvestre Segoviana 08 me dedico en cuerpo y alma a Gesport. Como este programa gestiona inscripciones en un evento deportivo he decidido, tras pertinentes cambios en algunos detalles, incluirlo dentro de gesport para ejemplificar como las gestiones más variopintas que atañen a un club se pueden incluir facilmente con la base de Symfony.
Los cambios realizados sobre la versión original ya están reflejados en el SVN del proyecto y son el poder hacer múltiples competiciones (en vez de ser un programa para una determinada, como era el caso del Blume). Algunas cosas que se podrán añadir son módulos de medios de pago diferente tan solo con redireccinar en determinado momento del proceso al banco, página de pago electrónico, o fin de proceso ( si la forma de pago elegido lo permite).
En esta versión que presento se realizan los pagos a una cuenta única que no se refleja en los ficheros de configuración ni queda en el programa. Tendrá que salir de la manera que está puesta cuando se alcance una gestión económica básica del club. Pero como eso es harina de otro costal y en esta parte del proyecto que corresponde al concurso y al proyecto de fin de carrera se trata de hacer funcionar la parte que interesa a entrenadores y atletas, pues lo dejaremos para más adelante.