Friday, February 02, 2007

Aprendiendo remoting con Mono

Hola,

Hace ya más de un mes que no publico nada por falta de tiempo. Pero ahora creo que voy hacer una pequeña importante contribución a la causa de aprender .Net, sobre todo usando mono.

En esta dirección podeis encontrar un fichero comprimido que contiene dos programas y que serán una de las bases de Palantir.Net. Se trata de un cliente y un servidor chat en modo texto, muy sencillos para poder aprender de ellos pero alta y facilmente ampliables, que hacen uso de las tecnicas de Remoting que incluye Mono. Intentaré explicar las clases que tiene cada programa y como funciona.

El Servidor


En el servidor podemos encontrar 2 clases principales y 3 espacios de nombres:

  • Clases:


    • MainInit: Esta clase será la que contiene el metodo main del servidor y sirve para inicializar el servidor chat y crear el objeto compartido Login.

    • MainServer: Esta clase mantendrá la información y el objeto Server.


  • Espacio de nombres:


    • DatafromDB: Unos cuantos ejemplos de como acceder a una base de datos MySql. Ahora están desabilitados pero en un futuro se usará para que el servidor almacene toda la información de estado en vivo del chat para que sea accesible por ejemplo mediante una interfaz web.

    • Objects: Contiene las clases que funcionan en "modo local", es decir, estas clases solo funcionan en el servidor y no pueden ser enviadas a los clientes.

    • RemoteObjects: Estas clases sí son MarshalByRefObject en su mayoria y heredan de Interfaces que están definidas en la seccion Common.




Funcionamiento del servidor

Cuando ejecutamos el servidor ocorren los siguientes pasos:

  1. Se ejecuta el MainInit que crea un MainServer que mantiene un objeto Server. Con esto podemos tener varios servidores ejecutandose al mismo tiempo. A continuación comparte por http un objeto Login:


    HttpChannel channel = new HttpChannel(8085);

    ChannelServices.RegisterChannel(channel);

    RemotingConfiguration.ApplicationName = "Server Conference";
    RemotingConfiguration.RegisterWellKnownServiceType(typeof(Login),"Login.soap",
    WellKnownObjectMode.Singleton);



  2. Cuando creamos un objeto Server este contendrá una lista de canales que hay disponibles en el servidor. Por defecto estará vacia.

  3. La clase Login será la encargada de gestionar si un cliente tiene acceso al servidor o no.

  4. Apartir de aquí el servidor se pondría en espera.



Supongamos que un cliente quiere conectarse:

  1. El cliente obtiene la clase Login y si consigue realizar con exito un loginUser puede solicitar un ServerHandler.

  2. Una vez que se tiene un ServerHandler se pueden solicitar canales y unirse a los mismos. Si solicitamos un findChannel obtendremos un ChannelHandler.

  3. Con este ChannelHandler podemos hacer un loginUser para unirnos al canal.



Diferentes aspectos técnicos a tener en cuenta:

  • Server mantiene una lista con todos los canales disponibles.




El proceso de envio recepción de un mensaje tiene lugar principalmente en las clases pertenecientes al servidor:

  1. El cliente ya tiene un objeto ChannelHandler de un canal determinado, para enviar un mensaje invoca el método sendMessageChannel(string message). En el servidor se ejecutará el siguiente código:



  2. public override void sendMessageChannel(string message)
    {
    MessageChannelArgs msgarg = new MessageChannelArgs(message,_idChannel,_user.Name);
    OnMessageChannel(this, msgarg);

    }


    Como podéis leer lo que ocurre es que se llama al evento OnMessageChannel. Conectado a este evento está el correspondiente Channel. Cuando se creo el ChannelHandler se produjo esta conexión.

  3. Al producirse OnMessageChannel se ejecuta el método sendMessageChannel de la clase Channel. Dentro de este método podemos escribir todo lo que queremos que se haga cuando ocurre un mensaje, por ejemplo hacer log del mismo.

  4. Dentro de este método se produce una llamada al evento OnReceiveMessageChannel(null, msgarg) al que todos los ChannelHandlers pertenecientes a ese Channel están conectados. Creo que este es un buen método para evitar hacer el uso de bucles for y al almacenamiento en listas de los ChannelHandler.

  5. Tras esto en los ChannelHandler se ejecuta el metodo receiveMessageChannel(object channel, MessageChannelArgs args) que en su interior contiene una llamada al evento OnReceiveMessageChannel al cual el UserHandler fue conectado cuando hizo loginUser para poder recibir el mensaje.

  6. A continuación en el objeto UserHandler se ejecutará receiveMessageChannel que llama al eventoOnReceiveMessageChannel(channel, msgarg) al cual el cliente deberá haber conectado un delegado para poder recibir finalmente los mensajes.


Posiblmente se podría haber hecho mejor, y por eso acepto todo tipo de sugerencias, pero creo que no es una mala forma de resolver el problema.

El Cliente


El funcionamiento del cliente es muy sencillo.

  1. Obtner el objeto login del servidor.



  2. HttpChannel channel = new HttpChannel();

    ChannelServices.RegisterChannel(channel);

    ILogin login = (ILogin)Activator.GetObject(
    typeof(ILogin),"http://localhost:8085/Login.soap");


  3. Creamos un objeto UserHandler con la información del usuario.

  4. Si el login tuvo exito obtendremos un ServerHandler y ya podemos pasar a crear canales y unirnos a ellos.

  5. Para obtner un canal llamamos al metodo findChannel(string idcanal) que nos devuelve el correspondiente ChannelHandler si la busqueda tuvo exito.

  6. En caso contrario podemos crear un nuevo canal:



  7. chn =(IChannelHandler) srvhandler.findChannel(message.Remove(0,6));

    //If it fails you can create the channel
    if(chn==null)
    {
    Console.WriteLine("Creating channel.");
    srvhandler.createChannel(message.Remove(0,5));
    //After createChannel you have to search the channel again.
    chn =(IChannelHandler) srvhandler.findChannel(message.Remove(0,6));
    }


  8. Tenemos que conectar un delegado al evento onReceiveMessage del UserHandler:



  9. usuario.OnReceiveMessageChannel += new UserHandler.MessageChannelHandler(DisplayMessage);



El código que se puede ver acontinación en el fichero del cliente es un simple manejador de comandos para hacer unas basicas tareas.

Network Multimedia Middleware

Hola,

Este articulo lo voy a escrbir en castellano pues información en ingles hay mucha en el propio sitio de NMM. Por la tanto esta será una introducción a estas fantasticas librerias multimedia y a sus principales programas.


¿Qué es NMM?



Principalmente son unas librerias que nos sirven para hacer cosas de multimedia: reproducir videos, ver la televisión, dvd, captura de sonído, conversión de formatos, etc. Bajo esta perspectiva simplemente parecerian unas librerias más pero tienen una particularidad muy importante: la red es transparente. Con esto quiero decir que da igual donde tengamos cada componente que forma parte de la tarea multimedia pues estas librerias se encargan de manajar la red y hacerla invisble de cara al usuario.

De lo más facil a lo complicado


La instalación


Por desgracia actualmente, o al menos eso creo, no existen rpm ni deb para las distribuciones actuales. Pero no todo está perdido, los desarrolladores (no he hablado de ellos más, adelante lo haré) han habilitado varios medios para poder instalar NMM.

Desde precompilado en tar.gz


Esta es la opción más sencilla. Primero tenemos que descargar la versión 0.7, hay dos ficheros:
  • Compilada con gcc version 2.95: aquí
  • Compilada con gcc version 3.X: aquí

Tambien podemos encontrar las nightly builds de Sourceforge aquí pero como siempre estas son version de test aunque suelen funcionar.
Ya tenemos el fichero acontinuación lo descomprimimos:

elessar@minastirith$ cd /home/elessar
elessar@minastirith:/home/elessar/$ tar zxvf nmm-0.7.0-binaries-gcc3-i686.tar.gz

Ahora definimos la variable de entorno que utilizará NMM para saber donde está instalado y indicamos el directorio de las librerias para el linker:

elessar@minastirith:/home/elessar$ export NMM_DEV_DIR=/home/elessar/nmm-0.7.0
elessar@minastirith:/home/elessar$
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/elessar/nmm-0.7.0/lib

Ahora tenemos que ejecutar el programa serverregistry para generar el fichero con los recursos multimedia que están disponibles en nuestro ordenador:

elessar@minastirith:/home/elessar$ cd nmm-0.7.0/bin
elessar@minastirith:/home/elessar/nmm-0.7.0/bin$ ./serverregistry -s

Y esperamos a que termine su ejecución. Ahora realizaremos una simple prueba para comprobar si funciona correctamente:

elessar@minastirith:/home/elessar/nmm-0.7.0/bin$ ./helloworld1 fichero.mp3

El programa helloworld1 es un programa de demostración y aprendizaje muy simple y cuyo código fuente puede encontrarse en las fuentes de NMM. Si todo va bien deberiamos escuchar el fichero.mp3. Y con esto ya podemos pasar a hacer cosas mucho más interesantes.

Desde el código fuente


El fichero es la versión 0.7 y puede encontrase aquí. En este caso tras la liberación del fichero sacaron un patch para poder usar las FFMpeg. La información sobre como aplicar el patch puede encontrarse aquí.

elessar@minastirith$ cd /home/elessar
elessar@minastirith:/home/elessar/$ tar zxvf nmm-0.7.0.tar.gz

Aunque podemos compilar NMM contra las librerias (recuerdo que hacer falta los paguetes -devel) que tengamos instaladas yo recomiendo no hacerlo pues NMM es bastante follonero con los numeros de versión y al final resulta mucho más facil y cómodo descargarse los dos siguientes ficheros:
nmm-0.7.0-external-libs.tar.gz
nmm-0.7.0-external-includes.tar.gz
Los descomprimimos:

elessar@minastirith:/home/elessar/$ tar zxvf nmm-0.7.0-external-libs.tar.gz
elessar@minastirith:/home/elessar/$ tar zxvf nmm-0.7.0-external-includes.tar.gz

Y si tenemos la versión del gcc 3.X:

elessar@minastirith:/home/elessar/$ cd nmm-0.7.0-external-libs
elessar@minastirith:/home/elessar/nmm-0.7.0-external-libs$ ./make_gcc3_libs

O si tenemos la version 2.95:

elessar@minastirith:/home/elessar/$ cd nmm-0.7.0-external-libs
elessar@minastirith:/home/elessar/nmm-0.7.0-external-libs$ make

Bien a continuación definimos las variables de entorno:

elessar@minastirith:/home/elessar/$ cd /home/elessar/nmm-0.7.0
elessar@minastirith:/home/elessar/nmm-0.7.0$ export NMM_DEV_DIR=/home/elessar/nmm-0.7.0
elessar@minastirith:/home/elessar/nmm-0.7.0$
export LD_LIBRARY_PATH=/home/elessar/nmm-0.7.0-external-libs:$LD_LIBRARY_PATH

Acontinuación pasamos a configurar y compilar:

elessar@minastirith:/home/elessar/nmm-0.7.0$
./configure --with-extra-libs=/home/elessar/nmm-0.7.0-external-libs --with-extra-includes=/home/elessar/nmm-0.7.0-external-includes
elessar@minastirith:/home/elessar/nmm-0.7.0$ make

Tras esto nos queda esperar pues tardará un rato en compilarlo todo. Una vez finalizada la compilación podemos realizar el mismo test de antes para comprobar que funciona correctamente.

Lo interesante: quiero multimedia distribuida


Vamos a dejarnos de vueltas y vamos a lo importante pues ya lo tenemos instalado. Hay 2 programas principales:

serverregistry


Este programa es el que se encarga de gestionar los recursos y realizar las conexiones oportunas entre las diferentes máquinas. Por ello tendremos que tener ejecutando en una consola diferente a la que usamos para ejecutar clic.

clic


Este programa es el que podriamos llamar el "reproductor". Tiene 2 maneras diferentes de funcionar:

  • Usando ficheros .gd: Asi tendremos toda la potencia de NMM

  • Usando Graph Builder: Para cosas más sencillas o típicas


Ficheros .gd


Tienen una sintaxis bastante sencilla que veremos a base de ejemplos.
Reproducir un fichero .mp3: mp3.gd

% This graph description realizes a simple MP3 player.
% Use the -i option of clic to specify the MP3 file

MP3ReadNode ! MPEGAudioDecodeNode ! PlaybackNode

Y para ejecutarlo:

elessar@minastirith:/home/elessar/nmm-0.7.0/bin/$
./clic mp3.gd -i /home/elessar/audio/song.mp3

Vosotros direis: Esto esta muy bien pero para hacer esto uso el amarok que está más chulo. Y teneis razón así que vamos a complicarlo un poquito. Supongamos que tenemos los ordenadores minastirith y minasmorgul (ambos deben estar nombrados en el fichero /etc/hosts o ser resolubles por dns ya que de momento las IP no están soportadas) y en ambos tengo instalado NMM y serverregistry se está ejecutando. Yo tengo el fichero en minastirith pero lo quiero escuchar en minasmorgul. Pues creamos el siguiente fichero: mp3remote.gd

% This graph description describes a simple MP3 player where the MPEGAudioDecodeNode
% is running on host "minasmorgul". The serverregistry on host "minasmorgul"
% is listening on port 22801.
% Use the -i option of clic to specify the MP3 file

MP3ReadNode !
MPEGAudioDecodeNode # setLocation("minasmorgul") !
PlaybackNode # setLocation("minasmorgul")

Y lo ejecutamos en minastirith con:

elessar@minastirith:/home/elessar/nmm-0.7.0/bin/$
./clic mp3remote.gd -i /home/elessar/audio/song.mp3

Y deberiamos escuchar el fichero en minasmorgul. Esto ahora si que está mucho más interesante.
Pero esto es un ejemplo muy sencillo podemos hacer mucho más. Supongamos que tenemos una lectora de dvd en minastirith y que minasmorgul no tiene. Pues podemos usar NMM para ver nuestros videos más facilmente pero esto lo explicaré usando Graph Builder.

Graph Builder


Aunque el ejemplo puesto en el apartado anterior era un simple reproductor de mp3 solo hay coger la documentación disponible para extender las capacidades mucho más allá. Pero para cosas más cotidianas la gente de NMM han habilitado un método más sencillo: los Graph Builder.
Reproductor DVD: Como hemos dicho anteriormente queremos ver el DVD en minasmorgul pero este no dispone de unidad lectora. Pues es así de sencillo:

elessar@minasmorgul:/home/reybrujo/nmm-0.7.0/bin/$
./clic -u dvd://minastirith/dev/dvd?title=1&chapter=4&angle=1"

Así de simple. La sintaxis completa de este comando es:

dvd://<hostname>/<path to dvd device>?title=<number>&
chapter=<number>&angle=<number>

Hay otros Graph Builder disponibles como pueden ser:

file://<hostname>/<path and filename>
audiocd://<path to audio cdrom device>?track=<track number>
tv://<hostname>/<path to video device>
dvbtv://<hostname>/<path to video device>
ivtv://<hostname>/<path to video device>
mpegtv://<hostname>/<path to video device>

Podeis encontrar más información aquí.

Terminando


Para terminar esta introducción diré varias cosas que puede en entradas posteriores amplie. Este programa lo está desarrollando principalmente un grupo de personas de la universidad alemana Computer Graphics Lab - University of Saarbrücken. Son gente maja y estan haciendo un gran software. Yo por mi parte he realizado un plugin para captura de video usando V4L2 y que puede encontrarse en el CVS en la sección contrib (esto es para subirme un poco el ego ;-) ).

Tienen tambien desarrollado un plugin para poder usar NMM con Amarok.

La sección de documentación es bastante buena y en ella podemos encontrar un listado con los plugins que tiene y una breve descripción de para que sirven.

Bueno quizas me dejo algo en el tintero pero ya hablaremos más de NMM más tarde.

Un saludo.

Monday, June 26, 2006

GUADEC 2006


Ha comenzado la GUADEC 2006. Este evento es la reunión de desarrolladores de Gnome, uno de los escritorios para Linux.

Como siempre hay conferencias muy interesantes y para los que no estamos allí podemos seguirlas en directo desde la siguiente dirección:

- Live

O en diferido desde la siguiente:

- Videos

El programa en el siguiente:

- Horario

Nos vemos.

Monday, May 29, 2006

Problemilla con el aMule/mlDonkey y los routers


Pues resulta que tenia un problemilla, bueno más bien un problema, cuando activa cualquier programa de la red edonkey. El problema era que automaticamente dejaba de navegar e incluso el propio programa no conseguia subir y descargar ningun archivo.

Así que este fin de semana me he puesto a averiguar que pasaba. La configuración de mi red casera es la siguiente:

- Como modem router a la adsl tengo un Linksys wrt354g.
- Conectado a este tengo un Linksys wrt54g con un firmware dd-wrt, última versión.
- Tras este tengo mi servidor, donde ejecuto todos los programas: web, ssh, amule, ...

Con el wrt54g monto un QoS usando filtrado de capa 7, (Netfilter L7 para el dd-wrt).

La primera opción fue pensar que el QoS no era capaz de tanta carga como genera un aMule. Desactivo el QoS pero todo sigue igual. En un principio pensaba esto pues cuando reiniciaba este router wifi el problema se arreglaba momentaneamente o totalmene si previamente desactivaba el aMule.

La segunda opción fue bajarle al aMule todos sus requerimientos de red: numero de conexiones simultaneas, velocidad de descarga/subida, ... Pero el asunto seguía fallando.

El tercer intento fue conectar directamente el servidor al modem/router. Previamente a este intento, como tenía que modificar la configuración del modem/router entre los cambios que realicé fue desactivar algunos servicios del dispositivo como: el log y el firewall. Desactivar el firewall no me importa pues en el servidor ya implemento uno.

En este intento la cosa mejora el aMule ya funciona correctamente y puedo navegar algo simultaneamente. Tras esto lo lógico es pensar que el problema está en el router wifi. Pero no me combence la respuesta. Así vuelvo a poner el servidor tras el router wifi y activo el QoS del mismo. Y la cosa parece que funciona muy bien: el aMule consigue velocidades de descarga decentes y puedo navegar comodamente.

Esto me hace concluir que el problema era que el modem/router va un poco corto de procesador si tengo activado el log y el firewall. Aunque al principio pareciese que el problema estaba en el router wifi pues al reiniciarlo se arreglaba el asunto esto no era correcto pues era una cuestión de un problema en cascada.

Espero que esto os sirva de ayuda algún dia.

Sunday, May 14, 2006

NjbMediaDevice añadido a Amarok


Este viernes envie mi MediaDevice a los desarrolladores de Amarok y ya ha sido añadido al repositorio.

No entrará para le versión 1.4.0 pues esta congelada para poder lanzar la versión estable, así que la gente tendrá que esperar hasta la versión 1.4.1 para poder disfrutar de él.

Esto es bueno pues me da más tiempo para testear y añadirle más características.


Friday, May 12, 2006

OpenSuSE 10.1 Publicada


Ayer se publicó la versión 10.1 de OpenSuSE. Ha fecha de hoy solo se han publicado la versión en 5 cds para varias plataformas de procesador: x86, ppc, 64bits y creo que alguna más.

Todavía Novell no ha publicado su versión comercial, habrá que esperar un poco. Yo por mi parte estoy interesado en la versión de DVD para así llevarlo todo en un solo disco.

Para los impacientes hay archivos .torrent para poder tener una descarga bastante rápida.

Más información en: OpenSuSE

Sunday, May 07, 2006

NjbMediaDevice

Este fin de semana he avanzado en el desarrollo de NjbMediaDevice para Amarok. Ya está practicamente listo para enviarlo a la lista de desarrollo de Amarok para ver si quieren incluirlo.

Las carácteristicas actuales són:

- Se muestra el listado de canciones
- Borrar canciones
- Copiar canciones del ordenador al reproductor
- Copiar canciones del reproductor al ordenador

Con esto se obtiene la funcionalidad necesaria. El manejo de listas de reproducción lo voy a dejar para lo último porque como no las uso no me corre prisa ;-).

Antes voy a programar el manipulado de ficheros no mp3 para así poder subir y bajar ficheros de datos al reproductor usando Amarok. Para esto realmente sería más interesante usar kionjb pero creo que no me será muy dificultoso añadirselo a mi desarrollo.

Espero que para mañana haberlo mandado a la lista.

Un saludo.

Saturday, April 29, 2006

Calidad de los enlaces WDS

Solo un pequeño apunte sobre la calidad de los enlaces WDS. He leído en el libro del que hablé en otro post que este tipo de enlaces funcionan, que tontería por mi parte hablar sobre esta obviedad, pero reducen mucho la velocidad pues introducen mucho tráfico adicional en el espectro radioeléctrico con lo que la cantidad de errores aumenta.

Lógicamente el rendimiento es peor cuanto más clientes hay conectados al router. Esto es así porque por una parte tenemos el tráfico que va del cliente al router A (con destino al B) el envío del tráfico del A al B, la respuesta del B al A y su correspondiente envío del A al cliente. Es decir que estamos doblando el tráfico que hay en el aire.

Con lo cual esto puede estar muy bien para montarlo en casa por si alguna habitación o zona nos queda lejos de donde tenemos el router wifi principal con el accesso a internet para así aumentar el alcance. Pero en entornos más serios o profesionales hay que manejarlo o estudiarlo con mucho más detenimiento.

Un saludo.

Enlace WDS

Hoy he montado un puente WiFi, comúnmente llamado WDS, utilizando dos routers Linksys wrt54g. Para ser más exactos uno es un WRT54G y otro un WRT54GS. La terminación GS indica que soporta la tecnología SpeedBooster de Linksys, es decir más velocidad.

La verdad es que ha sido mucho más sencillo de lo esperado. Para empezar he cambiado el firmware original de ambos routers por un DD-WRT versión 23 que es la última. En el caso del WRT54GS primeramente utilicé la versión mini pues estaba actualizando desde un firmware de FON, promete volverlo a su estado original cuando le devuelva el router al amigo que me lo ha prestado ;-), utilizando TFTP para la carga. Las instrucciones para hacer esta tarea podéis encontrarlas en el siguiente enlace.

Pongo a continuación un pequeño resumen por si alguna vez el enlace de arriba desaparece. Basado en la guia de Damian Vila:

1º Nos aseguramos de que el router tiene activada la opción de Boot Wait. Esta opción sirve para que cuando el router se está iniciando durante los tres primeros segundos de arranque espere la copia de un nuevo firmware usando TFTP.

2º Durante esos tres segundos el router tiene la ip 192.168.1.1 por lo que el ordenador desde el que vamos a realizar la carga tiene que tener una ip de ese rango y estableces su puerta de enlace en la 192.168.1.1.

3º Ejecutamos lo siguiente con el tftp:

tftp 192.168.1.1
tftp> binary
tftp> rexmt 1
tftp> timeout 60
tftp> trace
Packet tracing on.
tftp> put dd-wrt.v23_mini_wrt54gs.bin

Donde dd-wrt.v23_mini_wrt54gs.bin es la imagen que queremos cargar. Lógicamente tenemos que estar en el directorio donde se encuentra la imagen. Tras pulsar [enter] en el último comando tenemos que pulsar el botón reset del router con lo que al poco tiempo el fichero empezará a transmitirse. A mi me ha costado un par de intentos de pulsar reset y activar la transferencia pero al final funcionó. Posteriormente volví actualizar el firmware a la versión con soporte para VoIP.

Ya tenia los dos routers listos para configurar el WDS. Para ello primeramente desactive el cifrado WPA2-Preshared key en ambos routers. A continuación establecí la misma configuración wifi en ambos routers, para mi caso:


  • ssid: territoriodunedain

  • canal: 6

  • mode: mixed


Ahora toca dirigirse a la página de configuración de WDS. En esta página lo único que hay que hacer es en la lista de routers que forman parte del WDS añadir la MAC del router contrario seleccionando como modo la opción LAN. Pulsamos en guardar los cambios en ambos routers y ya deberíamos tener nuestro WDS funcionando. Para comprobarlo solo tenemos que ir a la página de Status | Wireless y observaremos en el listado de WDS el router contrario y el nivel / calidad de señal del enlace.

Si todo ha ido correcto podemos activar en ambos routers el WPA2 y así aseguraremos nuestras comunicaciones.

Para terminar lo único que tenemos que hacer es asegurarnos que ambos routers tienen su IP local en la misma red. En mi caso uno de los routers solo actúa de puente con lo que hay que establecer como GATEWAY la IP del router contrario del enlace y desactivar su opción de enlace de internet.

Ha sido sencillo. Ahora escribo estas palabras desde mi portatil conectado al router wifi que enlaza con el contrario para lleva mi red. De hecho mi configuración en mi portátil tiene como GATEWAY la 192.168.10.254 pero estoy conectado al router con IP 192.168.10.253 con lo que se demuestra que el enlace funciona.

Bueno espero que esta pequeña reseña os sea útil y de interés.

Un saludo.

Monday, April 24, 2006

Redes Wireless 802.11

Este es el título de un libro que me compré hace poco. Su autor es Matthew S. Gast y ha sido publicado en España por la editorial Anaya con permiso de O'Reilly.

Es un libro muy interesante y muy completo orientado a profesionales donde se explica con profundidad muchos de los aspectos de las redes sin cables. Protocolos, nivel físico, tipos de señales, configuración en diversos sistemas operativos, administración de redes domesticas y de redes empresariales y un largo etc.

Un libro muy recomendable.

Plugin Amarok

Este fin de semana mi plugin ha progresado adecuadamente.

El estado actual de características programadas es:
- Transferencia de canciones Amarok -> Dispositivo
- Se muestra el progreso durante la transferencia
- Las canciones del dispositivo aparecen en Amarok ordenadas por Artista y Disco

Me falta por programar:
- Borrar ficheros del dispositivo (esta al 50%)
- Cargar y manipular las listas de reproducción (Playlist).
- Descargar canciones del dispositivo al ordenador
- Activar la reproducción de una canción en el dispositivo desde el Amarok.

Espero mañana tener tiempo y pondré una captura de pantalla.

Matando a la gallina de los huevos de oro

Pues sí. Este es un hecho más que indudable que el sector de la construcción esta matando a la gallina de los huevos de oro. Porque no lo neguemos el negocio de la construcción siempre ha sido rentable, puede que en mayor o menor medida pero rentable al final.

Yo creo que el problema de este sector es el mismo que lo que pasó con la bolsa hace no tantos años. Mucho aprendiz de especulador causa que el negocio, en aquel tiempo la bolsa y en este la vivienda, no siga las reglas normales de libre mercado y al final termine por reventar.

En mi ciudad ya hay casos más que evidentes de gente que va a tener "problemas" para vender la casa que compró para especular. Entrecomillo la palabra problemas porque en la gran mayoría de los casos no tienen prisa por vender la vivienda con lo que normalmente en un caso natural de libre mercado (aumento de la oferta) causaría una bajada de los precios esto no ocurre. Un ejemplo bastante claro es un edificio de nueva construcción que acaban de terminar, en una buena zona de mi ciudad, aproximadamente un 30% - 40% de las viviendas están en venta.

Seguramente me equivoque pero yo creo que cuando en un mercado entran a participar otro tipo de actores diferentes a los naturales (compradores y vendedores) como puedan ser los especuladores, el mercado no funciona.

Un saludo.

Wednesday, April 19, 2006

Html desde código fuente

Una forma para generar un vista html de un código fuente puede ser la siguiente:

- Editamos el fichero fuente con el vi de GNU/Linux
- Ejecutamos la siguiente instrucción:
:so $VIMRUNTIME/syntax/2html.vim <>
- Y guardamos el buffer resultante.

Ahora solo queda copiar el texto a la página web que querrámos.

Si alguien conoce un método para publicar código fuente en Blogger con resaltado que me lo diga.

Creative Nomad Jukebox Zen Touch en Linux

Hace unos meses me compré un reproductor de mp3. Para ser más exactos fue un Creative Nomad Jukebox Zen Touch, o Zen Touch para los amigos ;-). La verdad es que me lo compré un poco a lo loco pues no comprobé previamente si este reproductor funciona correctamente con mi GNU/Linux que utilizo como sistema operativo. No realicé esta comprobación porque como últimamente casi todos los reproductores funcionan como disco duro externo, di por sentado que este también.

Grave error. Este reproductor no funciona como disco duro externo, si no que utiliza unos drivers propios para realizar la comunicación. Por suerte no todo estaba perdido. Otra gente antes que yo se ha encontrado en la misma situación y ha desarrollado una biblioteca para poder acceder al dispositivo bajo GNU/Linux.

La biblioteca en cuestion se llama: libnjb y la verdad supone un adelanto. Programas para poder cargar y descargar archivos y canciones del reproductor hay varios pero yo ahora recomiendo el Gnomad2.




Pero como yo soy un usuario de KDE y el reproductor multimedia que uso se llama Amarok pues me he propuesto conseguir transferir y gestionar mi reproductor Zen Touch desde dicho programa.

Para ello estoy preparando un plugin basandome en los códigos de ejemplo de libnjb y en el KIOSlave kionjb. Si alguien está interesado en que le mande más información que se haga notar ;-).

De todas formas tengo intención de escribir algunos posts más sobre este asunto.

Tuesday, April 18, 2006

Declaración de intenciones

Aprovecharé este primer post para hacer una pequeña declaración de intenciones.

En este blog intentaré escribir con cierta regularidad sobre las cosas a las que me dedico dentro del mundo de la programación, informática y redes.

Escribiré sobre todo de Software Libre y mi opinión sobre diversos temas de actualidad.

Espero que mis palabras sean de vuestro interés y que compartamos buenas conversaciones.

Un saludo.