Y como siempre, después de terminar mas o menos el invento y buscando mas información para hacer un driver para lcdproc que directamente me escriba un fichero con el formato que necesito (el driver de texto solo usa ASCII y por tanto no es capaz de representar caracteres definidos por el usuario) me he dado cuenta de que el otro programa superviviente para LCDs en Linux, el LCD4Linux, tiene un driver que se llama ‘raster’ que te crea directamente una imagen PNG o PPM emulando al LCD y la coloca donde le digas. Vamos que sirve para casi lo mismo que yo quería hacer, salvo que mi Flash se actualiza automaticamente y se puede reescalar, mientras que este PNG tiene un tamaño fijo aunque eso si, carga mucho menos la CPU que mi Flash.
Parece que el desarrollo del LCD4Linux no está tan estancado como el del lcdproc, al menos eso se deduce de las información de sourceforge. Están trabajando en una nueva versión completamente remodelada pero la última release aún funciona.
El LCD4Linux es igual de complicado de instalar que el lcdproc aunque al no ser de arquitectura cliente servidor es mas fácil de poner en marcha.
No lo estaba usando por que el LCD4Linux NO tiene control por software del backlight de un LCD como el mio, compatible con el HD44780, con el esquema de conexiones compatible winamp y el control de backlight por la patilla 17 (Selectin). El lcdproc si lo soporta. He tenido que hacer un apaño hardware (un hilo soldado desde los +5V a la entrada del transistor) para mantenerlo siempre encendido y poder ver algo en el LCD.
Para instalar el LCD4Linux primero hay que descargarse el tarball y descomprimirlo. Hacemos un configure usando el parametro
–with-drivers=
seguido de los drivers que vamos a usar, en mi caso el Hitachi, que es el chip de mi LCD comprado en
CrystalFontz y el PNG.
make clean
./configure –with-drivers=HD44780,PNG
por supuesto, como no podia ser de otro modo, esto da un warning a mitad de configuración diciendo que no tengo instaladas las librerias gd. Es mentira, falso, me engaña… ¿como se cree si no que estoy sacando desde php estos bonitos titulares en mi blog?
Pero en fin, despues de buscar durante un buen rato la manera de contarle al configure donde se encontraban los .h y .so del gd, me di por vencido y lo instalé de nuevo.
Ale, a descargar otro tarball, otro ./configure, otro make install y a reanudar la recompilación del LCD4Linux
make clean
./configure –with-drivers=HD44780,PNG
make
make install
Ahora si, ejecuto el LCD4Linux con esta configuracion en el fichero /etc/lcd4linux.conf:
Display PNG
Size 20×4
font 5×8
pixel 2+1
gap 2×2
border 10
foreground #A8EC09
halfground #1432BE
background #1B3CD5
Los colores son los de un LCD azul, iguales que los que he usado en el Flash, pero se pueden cambiar. Los tamaños están elegidos para que el LCD virtual sea lo mas pequeño
posible respetando las proporciones entre pixeles y espacios. Aún así es bastante grande para mi gusto, pero no se pueden dividir los pixels de una pantalla.
Sale perfectamente, salvo por el hecho de que los iconos definidos por el usuario no se ven, que sigo teniendo problemas con la caché y obviamente, la imagen no se actualiza sola.
Me gustaría poder escribir un driver para el LCD4linux que se comunicase con mi Flash mediante un socket XML para hacerlo realmente real-time, pero me da muuuucha pereza ponerme a investigar el codigo fuente del LCD4Linux y la forma en la que se programan los
drivers, mas aun despues de darme cuenta de lo ‘oxidado’ que tengo la programación en C… si es que lo de la programación orientada a objetos es mucho mejor!!!
En fin, si saco fuerzas de flaqueza pondre a pelearme con el CVS y a estudiarme los fuentes.
Una vez construido el Flash mis sospechas se hicieron realidad. En efecto, como la mayor parte del tiempo el fichero se encuentra abierto para escritura, el 90% de las veces que se pide está vacio. Para solucionarlo he implementado una version chapucera de la técnica del doble buffer. Escribo la pantalla en un fichero auxiliar y cuando cierro el mismo lo muevo al archivo definitivo mediante un comando del shell.
Aqui está el código fuente del pequeño programa.
El rudimento ha funcionado bastante bien, y ahora solo me queda lidiar con la detestable caché del navegador que hace que cada vez que el Flash pide el archivo con los datos, el navegador devuelva el cacheado y por lo tanto no se actualiza la pantalla. Para solucionarlo he añadido a la petición un parametro fantasma
“?foo=contador”
donde contador es un número que se incrementa con cada petición. De esta forma las llamadas son siempre distintas y evito la caché.
Este no ha sido el único dolor de cabeza que me ha proporcionado el Flash. Como no he encontrado una fuente que sea gratuita y que emule las letras de un LCD (la SB Liquid Open lo hace, pero es de pago) me he construido los caracteres mediante una matríz de clips cuadrados de 5×8 puntos y he tenido que definir un mapa de caracteres completo para poder representarlos en dicha matriz mediante un vector de 5 bytes por caracter. De esta forma me puedo construir todos los símbolos que me apetezca, iconos e incluso animaciones. Lo que ocurre es que el driver de texto del lcdproc no me proporciona la definición de los iconos que pudiesen estar mostrandose en pantalla por lo que de momento no he implementado animaciones de caracteres en el Flash.
Para poner un ejemplo, la letra M, cuyo código ASCII es el 77 va contenida en la posicion 77 del array de caracteres y sus 5 bytes indican el mapa de bits que se enciende en cada una de las 5 columnas de la definición del caracter
this.charset[77] = new Array(0×7F,0×20,0×18,0×20,0×7F); // M
Este es el resultado final, con la conexión activa en el que podeis ver el estado actual de mi servidor a través de varias de las pantallas de información que proporciona el lcdproc. Para encenderlo hay que pulsar sobre el, si quieres apagarlo por que te consuma demasiados recursos, vuelve a pulsar sobre el.
He creado varios esquemas de color que se pueden pasar como parámetro al flash (parametro colorscheme) para obtener los 4 tipos de LCD diferentes que comercializa crystalfontz, el azul, el verde, el ambar y el rojo.
Pero esto no es todo, pronto volveré con mas información respecto al LCD virtual.
Estoy intentando hacer un LCD virtual que muestre en una página web la misma información que el LCD físico que tengo conentado a mi servidor para así monitorizarlo remotamente. Mi servidor es un Linux y estoy usando lcdproc para alimentar al LCD actualmente como ya comenté en mi post Gran Azul.
El LCDproc posee un driver que saca texto plano y que está pensado para tareas de debug principalmente.
Yo lo he usado como fuente para hacer el lcd virtual. He redirigido esa salida de texto hacia un programa que escribe un fichero que queda disponible por http ya sea para cargarlo desde un flash y representarlo en el, bien para mediante php y el generador de imagenes, construir un GIF con el contenido, o ambas opciones.
Lo primero es compilar de nuevo el lcdproc por que no tenia activado el driver de texto, para lo cual uso la orden
make clean
./configure –prefix=/usr/local/ –enable-drivers=hd44780,text
make
make install
El hd44780 es el driver para mi LCD físico, un CFAH2004A-TMI-JP de crystalfontz conectado por el puerto paralelo con el cableado estilo winamp y con control para apagar el backlight por software siguiendo este esquema.
El make clean es necesario para eliminar los restos de la anterior compilación que metian errores en el make.
Ahora ya tengo un LCDd (el daemon del LCD que actua de servidor) al que puedo invocar de esta forma:
LCDd -d text -f -a 127.0.0.1 > textoutput
para obtener las primeras pruebas de funcionamiento, que son medio exitosas.
El fichero ‘textooutput’ se llena de pantallitas del LCDd, pero unas detras de otras, y yo solo quiero que aparezca una en el fichero, la mas reciente.
Para conseguir una sola pantalla por fichero he tenido que programar un pequeño programa en C que a partir de la
entrada estandar, stdin, reconoce cuando empieza y termina una pantalla (‘
+———————+
‘ muy sencillo ) y escribe una y otra vez el fichero que se le pasa por parametro con la pantalla que le va llegando. De este modo, redireccionando la salida del LCDd mediante un pipe la envio a mi programa que va generando un fichero con una sola pantalla, siempre la última.
LCDd -d text -f -a 127.0.0.1 | lcdtool textoutput
El único problema que veo es que la creación y destrucción del fichero generado por lcdtool sea tan frecuente que cuando se haga la petición de este fichero por http el apache no pueda servirlo por que esté a medio escribir o simplemente vacio por que acaba de volver a ser creado.
Esto lo probaré en cuanto tenga listo el Flash que mediante un loadVariables va a pedir dicho fichero y lo va a presentar como si fuera un LCD virtual.
Por fin me decidí a pasar de la obsoleta version 0.72 a la 1.2, y mis recelos no eran infundados. Estos softwares tan útiles y abiertos pero tan poco profesionales tienen esos problemas, el primero es que tienes que encontrar algun sitio donde te digan que existe upgrade.php en el WP 1.2, luego tienes que recomponer todas aquellas páginas que tocaste en su dia para recuperar el aspecto original del blog y que ya apenas recuerdas cuales son y convertir los hacks en plugins ya que estamos puestos. Traduce de nuevo el locale.php y peleate con la codificacion de los caracteres especiales de nuestra lengua, que si UTF-8, que si ISO-8859-1, en fin, me ha llevado un par de dias completarlo.
Aprovecharé seguramente para añadir algun detalle mas y pulir un poco los comentarios.
El hack para presentar las canciones de Audioscrobbler que hice lo he convertido en un plugin, y ha sido muy fácil.. aunque lo que me costó fue averiguar que lo unico que necesitaba era añadir un comentario al inicio del php con los campos :
Plugin Name
Plugin URI
Description
Version
Author
Author URI
Está comentado en Inglés y no es mas que una simple extensión de lo que hizo David Hunt y que ya comenté en mi post sobre el audioscrobbler.
Lo podeis encontrar aquí, aunque necesitareis MagpieRSS para que funcione.
Desde que las Parties se convirtieron en LAN Parties y dejaron de ser Demo Parties ya no he seguido interesandome por ellas. Ahora una Euskal Party, una Xuventude o la Campus Party de este verano que tanta cobertura mediatica ha tenido, no son mas que reuniones de jugones y copiadores compulsivos, aderezados con alguna que otra actividad didáctica y presentación marketiniana de algun producto novedoso o no tan novedoso. No digo que no sean divertidas, pero ya no son tan interesantes.
Estaba tan descolgado de este tema que ni me habia enterado que este fin de semana pasado ha tenido lugar la Assembly 2004, la abuela de las Parties con 13 ediciones a sus espaldas.
Afortunadamente esta cita anual goza de muy buena salud y ha sabido mantener el espiritu de las Demo Parties. Apesar de incluir competiciones de varios juegos, incluido el primer torneo del mundo de Quake 3, que aun no está a la venta, mantiene las competiciones de Demos, de música y gráficos que tanto me impresionaban cuando comencé a conocerlas hace 12 años.
La gente que no sabe que es una demo se queda indiferente ante lo que les parece un mal proyecto de 3DStudio Max, mal renderizado y mal animado… lo que no saben es que no son videos, son programas que en tiempo real crean esos efectos, renderizan esas mallas y las dan textura e iluminación. Los programadores de demos son los futuros (en algunos casos los actuales) programadores de motores gráficos de videojuegos… y eso ya impresiona un poco mas.
Una de las mejores demos de aquella época fué Unreal (1992), del mítico grupo Future Crew, que ahora parecerá un chiste al que la vea (el que pueda, por que solo funcionan bien en ordenadores 386), pero para aquella época resultó visualmente impresionante y musicalmente una obra de arte. Unreal Vodoo es el nombre del grupo de demos finlandés (como no podía ser de otro modo) que este año ha ganado la competición mas importante de la party, la de demos. La demo es una delicia, por que ya no solo se trata de mostrar lo que se puede hacer con una mente de programador talentoso y una cuadrilla de artistas magníficos, sino que ahora se cuentan historias. La demo no es gran cosa técnicamente hablando, los puristas no se explican de hecho como ha podido ganar, pero esta historia llega al alma de todos los que nos gustan las demos. Se te pone la piel de gallina cuando ves al modelo 3D teclear sobre un perfecto Comodore 64 el código en Basic necesario para hacer un starfield, un wormhole, un shaded cube, un gouraud… y como va evolucionando pasando a un amiga y programando en ensamblador efectos que todos conocemos de verlos en las demos. Hay que verlo. La demo se llama Obsoleet.
Lo malo es que solo funciona si tienes una ATI, lo bueno es que yo tengo una ATI.
Hay versión windows y Linux… esto si que no pasaba antes .
Si alguien tiene curiosidad, aqui estan los resultados completos de todas las competiciones de la Assembly 2004.
No es nada nuevo, pero yo acabo de descubrirlo gracias a Zootropo el incansable posteador.
Se trata de un sencillo y curioso sistema para crear un perfil musical propio. Mediante un plugin en tu reproductor de audio favorito se envian a la página de audioscrobbler todos los títulos y autores de las canciones que vas escuchando a diario, y se va creando una estadística de que grupos y canciones escuchas mas amenudo.
¿Por que me resulta esto interesante? Por que permite descubrir musicas que no conoces y que coinciden mas o menos con tus gustos, simplemente mirando los perfiles de otros usuarios que escuchan música parecida a la tuya.
Por fin veo que no soy el único que escucha Ayreon, Spock’s Beard, Kazzer o Elwood.
Hay gente que esto le huele a chamusquina, por que saben demasiado de lo que escuchas, y supongo que saben si son CDA, MP3, OGG o cualquier otro. Pero para mi la ventaja de descubrir nuevos horizontes musicales merece la pena el riesgo.
Técnicamente hablando, el plugin envía las canciones cuando llevas escuchandolas al menos la mitad de su longitud o 240 segundos, para no enviar aquellas que solo estas preescuchando o pasando por encima. En tu perfil de usuario dentro de su web, darse de alta es gratuito y no es necesario dar muchos datos, aparece la canción que estas escuchando en ese momento, aunque la base de datos de artistas y canciones no se actualiza de inmediato, sino que lo hace cada cierto tiempo, y te presenta unas gráficas con estadísticas por autores y temas.
Cuanto mas tiempo llevas enviando datos mas completo y útil es tu perfil para los demás.
Además proporciona una descripcion en RDF con los nombres de los últimos temas escuchados, con lo que se podrían añadir también a tu propia página y no tener que usar de este modo otro plugin distinto como hago ahora para mostrar la información de las canciones que estoy escuchando.
Voy a intentar usar MagpieRSS para crearme esa lista y sustituir lo que tengo ahora, que todo sea dicho, no funciona demasiado bien.
El sistema Glicko es un metodo para medir la potencia de juego de un determinado jugador en un juego en concreto. Es similar, de hecho es una evolución de el, al sistema Elo que se usa ampliamente por las federaciones de ajedrez de todo el mundo y que fue creado en los 60 por Arpad Elo.
El sistema Elo categoriza a los jugadores mediante un número que indica la potencia de juego, es decir, un jugador con un Elo mayor que otro se supone que es mejor jugador.
Este sistema calcula el nuevo Elo tras cada partida balanceando el resultado, es decir, si un jugador con Elo 1700 gana a otro con el mismo valor, se le suman 16 puntos al Elo del ganador y se le restan al del perdedor.
Parece un sistema justo y fiable, pero para juegos on-line, como el WorldCap o el ya antiguo y desaparecido Mus que hice para Teknoland hace 5 años, no lo es tanto. La razón es que cuando un jugador entra nuevo o cuando un jugador hace mucho que no juega, su valor de potencia de juego puede estar desfasado o ser completamente incierto.
Para solventar estos problemas, el profesor Mark Glickman, de la universidad de Boston y presidente del comite de rankings de la federación estadounidense de ajedrez, creó en 1995 el sistema Glicko. Este sistema añade un valor a la potencia de juego, la llamada desviación o índice de incertidumbre, que informa sobre lo exacto o inexacto que resulta ese valor.
La desviación puede valer entre 1 y 350 y cuanto mas cerca de 1 esté mas cierto es el valor. Podemos decir que si por ejemplo yo tengo una potencia de juego de 2100 y una desviación de 30, aparte de que sería un auténtico campeón por tener valores tan altos, existen unas probabilidades del 95% de que mi potencia real este entre 2160 y 2040.
La desviación disminuye cada vez que juego una partida y aumenta cuando paso mucho tiempo sin jugar.
De este modo perder o ganar contra jugadores nuevos o que juegan poco tiene menos repercusión sobre nuestro ranking que jugar con jugadores con una desviación muy pequeña, ya que estamos mucho mas seguros de cual es su potencia de juego real.
Otro efecto positivo de la desviación es que incita a la gente a jugar mucho, para que les baje.
Podeis leer la descripción del sistema Glicko de manos del propio autor, donde explica tambien las formulas que se usan para calcular los nuevos valores de Glicko después de cada partida, aunque son mejores y mas orientadas al programador las que se encuentran en las páginas del FICS. Son las que hemos usado para crean nuestra clase de java que utilizamos en todos los proyectos de juegos que funcionan con ranking.
En la práctica el sistema es muy bueno para saber quien entre dos jugadores es mejor, pero es muy difícil crear un ranking oficial, es decir, una lista ordenada por potencias de juego, ya que los valores de glicko nunca son definitivos ni ciertos hasta que no se llega a desviación cero, y hay muy pocos jugadores que lo consiguen.
En el Mus se ordenaba por potencia de juego directamente, y no era una buena solución. En el Worldcap hemos optado por dividir a los jugadores en categorías análogas a las del futbol real y en cada categoría hemos metido a los que tienen una desviación parecida. Dentro de cada categoría se ordena por potencia de juego. De esta forma es mas fácil comparar ya que al menos la incertidumbre de todos los rankings de los jugadores que se encuentran en una misma categoría es similar.