Archivo de la categoría: Técnico

Miniproyecto – Valenbisi.mobi, geolocalización del servicio de bicicletas de Valencia para móviles y sms

Como supongo que la mayoría no sabréis de qué hablo, empezaré por el principio.

Valenbisi es el servicio urbano de alquiler de bicicletas de Valencia a semejanza del que existe en muchas otras ciudades españolas y europeas. La idea es fomentar su utilización para desplazamientos cortos ya que el abono anual (20 euros) permite alquilar gratuitamente la bicicleta la primera media hora de cada día. Hay varias estaciones a lo largo de la ciudad y simplemente coges la bici en una y la dejas en la que mejor te venga. Valencia creo que es una de las ciudades que más se prestan a un servicio de este tipo por dos razones básicas, la climatología y la falta de cuestas. Al parecer el éxito ha sido espectacular tras el verano hasta tal punto que el servicio de abonos está saturado de solicitudes, el nuestro tardó alrededor de un mes en llegarnos.

El sábado pasado mi pareja y yo decidimos acercarnos a la playa y darnos un paseo en bici, hacía un día fenomenal y el calorcito invitaba a pasear. El plan era coger la bicicleta al principio de la playa y dejarla al final para regresar a pie. Pues bien, el problema fue que a la hora de regresar no había ningún puesto libre donde dejar las bicis en las 3 estaciones por las que pasamos, tuvimos que volver al punto de inicio donde tuvimos la suerte de encontrar los dos que necesitábamos. Dos chicas que llegaron justos detrás nuestra no tuvieron la misma suerte :P. Esto nos planteó el problema que puede ser una situación de este tipo al tener que buscar otra estación que tenga enganches libres, puedes ir a la siguiente pero tampoco sabes si habrá puestos, con lo que te tocará ir a la siguiente y así indefinidamente. Si además del tiempo perdido tenemos en cuenta el dinero que pagas por el tiempo que pasa, no cabe duda que puede ser un serio inconveniente para el servicio. ¿Qué pasará cuando llegue el verano y todos los usuarios quieran bajar con sus bicis a la playa? Pues que no habrá donde dejarlas desde primera hora de la mañana. Estos días, siguiendo el problema, he visto que ocurre algo similar con las estaciones del centro de la ciudad en horario laboral, a las 10 de la mañana están casi todas completas. ¿Cómo sabes entonces dónde dejar tu bici?

Pues aquí llego yo a medio solucionar el problema :P. Una aplicación para el móvil que te dice las estaciones más cercanas con puestos libres o bicis disponibles, ya que el problema puede ser el contrario, que vayas a por una bicicleta y estén todas ocupadas. La diferencia con otras aplicaciones por el estilo es que no me he atado a Iphone o Android como casi siempre sucede en estos casos, he hecho algo que funcionará en la mayoría de terminales de los usuarios “normales”, otra cosa es que quieran utilizarlo. Para acompañarlo, he hecho una interfaz por SMS :P, que es más sencillo para la gente, pero sin la mayoría de opciones.

Como funciona el servicio

Muy sencillo. Entras en http://valenbisi.mobi, le dices donde estás, que puede ser tu dirección o el número de estación de Valenbisi, y automáticamente te indicará el estado de las estaciones que tienes a tu alrededor, es decir, bicis y huecos libres que tienen. Además, si las que tienes cerca no tuviesen bicis o puntos libres, te permite buscar las más cercanas con disponibilidad. Todo ello acompañado de imágenes con mapas con las estaciones indicadas posicionadas y rutas para llegar.

Detalles técnicos

La implementación del sistema no me habrá llevado más de 10 horas incluidas las pruebas. Gracias a todos los que me habéis ayudado con ellas y a vuestras sugerencias :).

Para desarrollarlo he utilizado:

  • API de Valenbisi, si se puede llamar así. Aporta la información de la localización de las estaciones y el estado de las mismas.
  • Google Geocoding API para obtener las coordenadas de una dirección y viceversa.
  • Google Directions API para obtener la ruta entre dos puntos.
  • Google Static Maps API para obtener imágenes de mapas.
  • Geolocation API Specification para aquellos navegadores que lo soporten, así el usuario no tiene que indicar su dirección, el GPS del dispositivo lo hace todo. Actualmente lo soportan, que yo sepa, Iphone, Android y las últimas Blackberry.
  • Wurfl, para obtener las características de su teléfono.

No voy a explicar cómo se utilizan las API’s ya que están bien documentadas y son muy sencillas, todas basadas en peticiones HTTP que devuelven XML o json.

Cuando el usuario accede a http://valenbisi.mobi, si su navegador soporta localización, le saltará el aviso de que la página quiere usar esa información y automáticamente posicionará al usuario. Si no lo soporta, la mayoría de los casos, el usuario debe introducir su dirección o el número de la estación Valenbisi que le interesa. Con esos datos averiguamos donde está. Si es una dirección a través de Google Geodecoding API y si es un número simplemente con el API de Valenbisi. De un modo o de otro ya sabemos donde está el usuario.

Ahora simplemente debemos buscar las estaciones que tiene alrededor. Yo lo he hecho de dos formas. La primera es mostrar las estaciones que tiene a su alrededor a partir del mapa. Esta es una de las primeras cosas curiosas que he hecho. Para obtener el mapa de la posición del usuario, le pido a Google Static Maps API una imagen del mismo tamaño que la pantalla del teléfono del usuario, así verá todo lo máximo que le permita su dispositivo. Esto significa que cada usuario verá un mapa de distinto tamaño. Ahora tengo que averiguar las estaciones que aparecen dentro del mapa. Podríamos pensar en pasarle todas al API y que éste pinte las que aparecen en nuestra imagen y pase de las otras, pero la idea no funciona ya que Static Maps tiene un tamaño máximo de url, que por cierto no es muy grande, rebasado el cual la imagen da error. Así que lo que hice fue calcular cuanto espacio geográfico cabe en la imagen. Le pedí una imagen posicionando marcas cada 0,001 puntos de longitud y latitud. A partir de esa imagen calcule a cuantos píxeles correspondía cada salto. Con esta información, y manteniendo el zoom fijo, sabremos en cada momento qué coordenadas se van a ver en la imagen que le pida a Google ya que conozco el ancho y el alto que le voy a pedir, conozco las coordenadas del centro (la posición del usuario) y sé cuánto me puedo desplazar a lo largo de la imagen. No es 100% fiable pero nos sirve para lo que necesitamos. Ahora simplemente recorro todas las estaciones y si sus coordenadas están entre los límites de la imagen que voy a mostrar, añado la marca. A medida que el usuario se mueve por el mapa con las flechas, voy actualizando las estaciones que se ven en el mismo con este procedimiento.

La segunda manera de buscar estaciones que he utilizado es mostrar las estaciones más cercanas que cumplan uno de los posibles requisitos, que tengan bicis o que tengan huecos libres. Aquí el usuario no puede navegar por el mapa, simplemente le muestro a las que puede acudir. Para localizar las estaciones más cercanas, la opción más clara es consultar Google Directions Api entre la posición del usuario y todas y cada una de las estaciones y obtener las que están más cerca (uno de los parámetros que devuelve es la distancia), pero esto implicaría más de 100 llamadas al API por consulta, con lo cual no es viable. Aplicando conceptos básicos de trigonometría y coordenadas cartesianas, sabemos que, en un plano, la distancia (en línea recta) entre dos puntos es:

Simplemente con los datos de la localización de estaciones y la posición del usuario y aplicando algunas operaciones matemáticas puedo averiguar aquellas estaciones que, siempre en línea recta y cumpliendo los requisitos de disponibilidad, están más cerca del cliente. Ordeno las distancias resultantes de menor a mayor y con las cinco primeras, ahora sí, consulto Google Directions API para que me de una distancia real entre el usuario y esas estaciones. Las vuelvo a ordenar por distancia y ya tengo aquellas más cercanas al usuario. Solo queda pedirle a Google Static Maps la imagen del mapa donde aparecen estas estaciones, ahora sin zoom para que lo ajuste automáticamente. Mucho más eficiente que consultar la distancia de las más de 100 estaciones.

Solo nos queda averiguar la ruta para ir desde la localización del usuario hasta la estación seleccionada. Static Maps no hace rutas, solo líneas rectas, pero podemos indicarle todos los puntos intermedios necesarios y que nos pinte las líneas entre ellos, con lo que si supiéramos los pasos que tiene que dar el usuario, podríamos pintar la ruta. Y para esto tenemos de nuevo Google Directions API, nos dirá los puntos entre el usuario y la estación. Solo tenemos que pasar estos puntos a Static Maps y tendremos la imagen de nuestra ruta.

Eso es todo, uniendo todas las piezas entre sí adecuadamente tendremos el sistema que os presento :). El último toque fue añadir las opciones de idioma, para que los turistas puedan utilizar el servicio :P.

Finalmente vinieron las pruebas con algunos conocidos y los ajustes para los terminales más antiguos (en los nuevos se ve todo fenomenal :P) .

Aquí van algunas capturas en distintos terminales:

Nokia X6

Nokia N95

Nokia N73

Nokia N70

Iphone

BlackBerry 9000

Android

Interfaz SMS

Cuando ya lo tenía terminado se me ocurrió, ¿y por qué no hacer también una interfaz SMS para los usuarios que no tienen Internet en el móvil? Ya tenía todas las piezas y dado que profesionalmente me dedico a eso… 10 minutos 🙂

Envía BICI númeroDeEstación al 215000 25325 y te devuelvo el estado de esa estación y las más próximas con sus direcciones. Por ejemplo:

BICI 146

Est. 165:12 bicis,8 libres.OTRAS:164,8 bicis,9 libres (C. PAVIA (OPUESTO Nº 15-17) )-167,17 bic 0,35Eur Alvento Soluciones S.A.n.atn.clte:902887786 alvento.es

Todo lo que quepa en los 160 caracteres permitidos, que no es mucho. Coste del SMS 0,35 euros, igual que un SMS normal 🙂. Si usas habitualmente la misma estación puedes saber con antelación si tendrás bici o hueco. Información legal del servicio: 0,35Eur.Alvento Soluciones S.A.n.atn.clte. 902887786 alvento.es

Más no se puede pedir en tan poco tiempo. Os invito a probarlo. Se aceptan críticas, mejoras de usabilidad, nuevas funciones, etc…

Actualización:

Sintiéndolo mucho he tenido que cambiar el número corto del servicio ya que el que había dicho inicialmente sólo funciona en Vodafone. El número actual, el 25325 es el más barato de los posibles, lo siento, ya sé que así se limita mucho su utilidad… quedará como ejemplo de lo que se podría hacer 😛 a no ser que alguien quiera hacerse cargo del servicio.

Team Foundation Server – Reutilizar un workspace creado en otra máquina

Es sin duda uno de los mayores inconvenientes de TFS, una vez creas un workspace no puedes utilizarlo más que en la máquina donde lo creaste, aunque sea el mismo usuario, ya que queda asociado también al nombre del equipo, no solo al usuario.

Esto es un problema si cambias de ordenador o si simplemente, como fue mi caso, se cambia el nombre del equipo (tuvimos que cambiar de dominio y en el nuevo los nombres eran diferentes). Pese a que hagas copia de seguridad y tengas todos los archivos, no puedes reutilizar el workspace porque está asociado a otra máquina y es en el workspace donde se almacena la información de los archivos que tienes descargados, las versiones, archivos que tienes bloqueados, etc. Está bien que se guarde esta información en el servidor pero si no puedo utilizarla desde otra máquina no le veo mucha utilidad.

Me costó bastante encontrar como solucionarlo, y es que TFS trae un cliente en línea de comandos desde el que se pueden hacer hacer virguerías. En mi caso, que lo utilizamos desde Eclipse con el plugin de Microsoft (originariamente de Teamprise), no tengo instalado el cliente de Visual Studio, así que le pedí algunos archivos a uno de mis compañeros. Con estos será suficiente:

  • TF.exe
  • Microsoft.TeamFoundation.Client.dll
  • Microsoft.TeamFoundation.Common.dll
  • Microsoft.TeamFoundation.VersionControl.Client.dll
  • Microsoft.TeamFoundation.VersionControl.Common.dll

Se copian todos en una carpeta y, desde la línea de comandos en esa carpeta, ya podemos jugar. Aquí tenéis una buena lista de opciones del cliente en línea de comandos.

Primero le preguntamos por los workspaces asociados a nuestra nueva máquina:

C:tfs>tf workspaces -server:http://tfs.tudominio.com:8080/
No workspace matching *;osus on computer NOMBREEQUIPO found in Team Foundation Server http://tfs.tudominio.com:8080/.

Como veis nos dice que no hay ninguno. Ahora le pedimos que cambie nuestro workspace de la máquina vieja a la nueva. Lógicamente tendremos que conocer el nombre del workspace y el de la máquina antigua. Es importante tener en cuenta que hay que hacerlo obligatoriamente desde la máquina nueva que vamos a utilizar, no sirve hacerlo desde la de otro compañero ya que asocia automáticamente el workspace a la máquina donde se lanza el comando.

C:tfs>tf workspaces -login:posus@DOMINIO -server:http://tfs.tudominio.com:8080/ -updateComputerName:NOMBREMAQUINAVIEJA NOMBREWORKSPACE
Collection: http://tfs.tudominio.com:8080/
Workspace	Owner		Computer     	Comment
--------- 	----------	------------ 	---------------------------------------------
NOMBREWORKSPACE	osus		NOMBREEQUIPO

Para hacer el cambio te pedirá que te autentifiques con tus credenciales y, si todo ha ido bien, nos dirá que lo ha cambiado correctamente.

Si hacemos de nuevo la primera consulta:

C:tfs>tf workspaces -server:http://tfs.tudominio.com:8080/
Collection: http://tfs.tudominio.com:8080/
Workspace	Owner      Computer     Comment
---------	---------- ------------ ---------------------------------------------
NOMBREWORKSPACE osus       NOMBREEQUIPO

Ahora ya podemos utilizar nuestro workspace en el nuevo equipo. Recuerda, eso sí, que si cambias de máquina (no es sólo un cambio de nombre) deberás copiar los archivos que ya tenías en la misma ruta original, se mantendrá todo como en la otra máquina, incluidos los archivos que estabas modificando.

Integra Imagenio o cualquier IPTV y la guía de programas en Media Center con Dvblink

Como ya sabéis tengo un ordenador como HTPC que utilizo como centro multimedia con una tarjeta de TV con doble sintonizador, con lo que accedo a todos los canales de TDT incluidos los nuevos HD sin ningún problema, y todo ello integrado en Windows Media Center (WMC) de Windows 7.

Además tengo una línea ADSL de Movistar con el paquete Trio, llamadas + Internet + televisión Imagenio por un módico precio.

Hoy procedemos a rizar el rizo y vamos a integrar también los canales de televisión de Imagenio para aprovechar la infraestructura que ya nos aporta WMC, tanto el control con el mando a distancia como las posibilidades de grabación y timeshift que ofrece el HTPC. Este tutorial será válido para cualquier servicio de televisión IP, solo necesitáis conocer las url’s de los canales que quieres añadir y la configuración de red del decodificador.

Os diré que mi decodificador de Imagenio está en un cajón desde hace más de un año, no he tenido que utilizarlo para nada ya que el HTPC me proporciona muchas más prestaciones.

Estos son los pasos que seguiremos para montar nuestro sistema:

  1. Configuración de red para ver Imagenio en un PC.
  2. Configuración de XMLTV para obtener la guía de los canales que no tenemos.
  3. Configuración de Dvblink.
  4. Configuración del WMC.
  5. Actualización automática de la guía de canales.
  6. Resultado final y últimos ajustes.

La base de este artículo es Dvblink, un software fabricado por Dvblogic que permite que accedamos a los canales de Imagenio desde el Media Center como si llegasen a través de una tarjeta sintonizadora. Hace unos días, al actualizar la versión de este software, me encontré con que la clave que había comprado hace un año ya no era válida para esta nueva versión. Ni corto ni perezoso me puse en contacto con Dvblogic explicándoles la situación y al momento me respondieron que me enviaban un nuevo número de serie. Un diez para ellos, no todos harían lo mismo :). Pero la verdadera sorpresa estaba en la nueva versión de Dvblink, mucho más sencilla de configurar, amigable y clara y potente que la anterior.

Manos a la obra.

1) Configuración de red para ver Imagenio en el PC

Ante todo debo deciros que para que todo funcione bien, sin cortes y fluidamente, la conexión del HTPC al router debe ser cableada, no inalámbrica. Así que supondremos que ya has conectado el ordenador con cable.

Lo primero que debemos hacer será obtener la configuración de Imagenio bien desde el decodificador o bien desde el router. En el primer caso, normalmente se desenchufa el decodificador se vuelve a enchufar y cuando arranque se mantiene pulsada la tecla “menú” del mando a distancia hasta que aparezca la pantalla de configuración. Si tienes acceso al router puedes ver también la configuración LAN del mismo. Necesitaremos la IP del gateway, la que tiene el router, del rango 10.x.x.x y la que tiene el decoder. Apuntaremos además la máscara de red. Tendremos por tanto los datos:

  • IP decoder: 10.x.y.z
  • IP router: 10.x.y.n
  • Máscara de red: 255.a.b.c

Normalmente cada instalación de Imagenio reserva las dos IP’s siguientes a la del router para los clientes, con lo que si la del router es la 10.x.y.n, la del decoder será la 10.x.y.n+1 y la n+2 podremos utilizarla también. Para configurar nuestro HTPC podemos utilizar inicialmente la misma que tiene el decoder para asegurarnos que no hay ningún fallo y, posteriormente, podremos cambiarla, aunque si no vamos a utilizar el decodificador no sería imprescindible.

En el HTPC nos vamos a:

Inicio -> Panel de control -> Centro de redes y recursos compartidos -> Cambiar configuración del adaptador

Y en nuestra interfaz de red local damos botón derecho y propiedades y ahí seleccionamos “Protocolo de Internet versión 4” y propiedades..

Y añadimos los datos que hemos obtenido, la IP del decoder (o la siguiente), la máscara y la IP del router. Aceptamos la configuración y si todo va bien ya podremos ver Imagenio en el ordenador. Para comprobarlo, nos descargamos VideoLan y lo instalamos.

Ahora necesitaremos la lista de canales de Imagenio que tenéis aquí. Como podéis comprobar es una lista de reproducción típica con las url’s de acceso a cada uno de los canales. Ahora procedemos a abrirla con VideoLAN en Medio -> Abrir archivo. Si todo va bien se abrirá la reproducción del canal promocional de Imagenio. Si no ves la lista de canales ve a View -> Playlist. Verás esto:

Cambiando de canal desde la lista irás viendo cada uno de los canales. En este punto ya podrías ver Imagenio en tu ordenador, pero queremos además tener la guía de programas e  integrarlo todo con WMC.

Si queréis además utilizar la misma tarjeta de red para la red local, cosa bastante lógica, podéis buscar en Google, hay mucha documentación sobre cómo configurar una misma interfaz para dos subredes.

2) Configuración de XMLTV para la guía de canales

Inicialmente intentaremos aprovechar la guía de programas que el propio Media Center trae incorporada, pero ni están todos los canales ni todos los que están tienen correctamente la programación. Para solucionarlo importaremos la guía de los canales que nos interese a través de xmltv, un sistema para compartir programaciones de televisión basado en archivos XML.

Comenzaremos descargando la última versión de este software para sistemas Windows desde aquí. Lo descomprimimos y lo dejamos en una ruta de nuestro disco duro, supondremos que lo hemos dejado en c:xmltv.

Configuremos ahora la fuente para nuestra guía. Abrimos el símbolo del sistema y tecleamos:

cd c:xmltv
xmltv tv_grab_es_laguiatv --configure

Esto lanzará un asistente donde nos preguntará primero si queremos descargar las descripciones de los programas y, a continuación, qué canales queremos descargar. Conviene seleccionar solamente aquellos que vamos a utilizar y no todos ya que el proceso de sincronización es bastante lento. Piensa que prácticamente todos los canales generalistas están ya en la guía del Media Center con lo que no los necesitarás, añade solo los que vayas a necesitar de verdad. Este proceso puedes alterarlo más adelante ejecutando de nuevo el asistente.

Finalmente lanzamos el proceso que descargará la guía según la configuración indicada:

xmltv tv_grab_es_laguiatv > guiaxmltv.xml

Insisto en que es un procedimiento bastante lento, cuantos más canales hayas seleccionado más tardará, cuando termine tendrás en la ruta c:xmltvguiaxmltv.xml tu archivo con la guía de los canales.

3) Configuración de Dvblink

Dvblink es el centro de este artículo, sin este software sería imposible ver Imagenio en el Media Center. La teoría es realmente sencilla, crea una tarjeta de televisión por satélite virtual que Media Center reconoce como tal y a través de ella transmite nuestros canales IP, es decir, la sintonizadora virtual hace de puente entre Media Center y el servidor de Imagenio.

Nuestro producto es Dvblink for IPTV, y cuesta sólamente 21 euros, creedme, vale la pena. Puedes usarlo gratis durante 20 días para probarlo :).  Descargamos, por tanto, la versión de prueba (21mb) y procedemos a instalarlo, primero el servidor, DVBLinkServer.msi, y después DVBLinkForIPTV.msi. Cuando termina la segunda instalación se abre automáticamente para que comencemos a configurarlo. Vamos a ello.

Añadimos primero la fuente de nuestra guía xmltv. Según la imagen de abajo, seleccionamos a la izquierda XMLTV y lo añadimos en la flecha, pasos etiquetados como (1) y (2), lo que nos abrirá la ventana que veis en la imagen para que le demos un nombre. En cuanto aceptamos se nos abre otra ventana (3) para que seleccionemos nuestro archivo de xmltv, el que creamos en al punto anterior, c:xmltvguiaxmltv.xml.


A continuación añadimos los canales de Imagenio. Para ello seleccionamos el flujo IPTV (1), lo agregamos a la configuración (2) y le damos nuevamente un nombre (3).

Igual que al configurar xmltv, se nos abre una ventana para que seleccionemos la lista de canales. Dvblink trae su propia lista de Imagenio, puedes probarla, yo he utilizado la mía propia en la que había eliminado los canales que no tengo contratados. En el primer paso os indicaba el archivo que yo utilizo, es el archivo completo de canales de Imagenio, puedes quitar aquellos que no utilices o utilizarla entera ya que posteriormente le indicaremos qué canales queremos.

El siguiente paso es indicarle a Dvblink a través de qué interfaz de red se comunica con Imagenio. Para eso hacemos click en los “…” de la fuente de televisión tal como se indica en la siguiente imagen.

Y en la ventana que se abre indicamos cual es la que se debe utilizar.

El siguiente paso es indicar qué canales queremos y de donde se obtendrá la guía de programas. Para ello, en la siguiente imagen, vamos a “Configuración del servidor” (1). Ahí vamos seleccionando en (2) los canales que queremos y los vamos añadiendo en (3). Si seleccionamos el grupo completo se añadirán todos. Aquí debéis seleccionar sólo aquellos que tenéis contratados o, incluso, solo los que no tenéis ya en TDT. En mi caso, por ejemplo, como ya tengo doble sintonizador de TDT, puedo grabar dos programas simultáneamente, así que no necesito añadir todos los canales de Imagenio, me limito solo a aquellos que no tengo por TDT. A continuación nos vamos a la siguiente imagen, “Fuentes de EPG” (1) y vamos indicándole de donde sacaremos la guía para cada uno de los canales que seleccionamos anteriormente. Marcamos cada canal a la izquierda (2) y hacemos doble click en el canal que nos proporcionará la guía a la derecha (3).  En el punto marcado como (4) seleccionamos los distintos tipos de fuente de guía de canales.El primer combo tiene los orígenes, XMLTV o la guía del Media Center.

El segundo combo tiene los distintos servicios que provee.

Simplemente asocia cada canal con la guía que quieres usar. Como os comenté anteriormente, que aparezca un canal en la guía del Media Center no quiere decir que tenga programación, a mi me venía vacía en algunos con lo que al final los configuré también con XMLTV. Es cuestión de probar. Una vez lo tengas todo configurado puedes cambiar los canales y sus guías en cualquier momento.

Guardamos la configuración y salimos de Dvblink, ya hemos terminado con él.

3) Configuración del Media Center

Ahora debemos configurar adecuadamente Windows Media Center. Como os comentaba, el funcionamiento se basa en hacerle creer a WMC que tenemos una sintonizadora satélite, así que eso es lo que haremos, buscar sintonizadoras satélite. Vamos a:

Tareas -> Configuración -> TV -> Señal de TV -> Configurar señal de TV

Y seguimos los pasos que nos va presentando hasta que llegamos a una pantalla como la siguiente en la que indicamos que queremos configurar la señal satélite.

Ahora nos habrá detectado varias sintonizadoras satélite que no existen físicamente, las que virtualiza Dvblink. Las seleccionamos todas.

En la configuración del satélite dejamos cualquiera, no se va a utilizar.

Y el tipo LNB lo dejamos en universal.

Aceptamos la configuración y volvemos a la pantalla de inicio de Media Center. Ahora vamos a:

Extras -> Biblioteca de extras

Donde nos aparecerá una nueva opción “Dvblink” que seleccionaremos.

A continuación daremos en “Sincronizar canales” y por arte de magia nos dirá que ha sincronizado aquellos canales que habíamos configurado anteriormente. En la imagen de abajo nos indica que ya estaban todos actualizados porque yo ya los había configurado :P.

6) Actualización automática de la guía de canales.

Ya casi hemos terminado, solo nos queda un detalle. La guía de xmltv no se actualizará sola :P. Debemos crear una tarea programada de Windows que la ejecute periódicamente.

Comenzamos abriendo el bloc de notas y creamos un nuevo documento con el siguiente contenido:

cd c:xmltv
xmltv tv_grab_es_laguiatv > guiaxmltv.xml

Y lo guardamos como c:xmltvguiaxmltv.bat. Probamos a ejecutarlo con doble click para confirmar que funciona. Si todo va bien lanzará el proceso de actualización que vimos en el primer punto. Ahora vamos a:

Inicio -> Todos los programas -> Accesorios -> Herramientas del sistema -> Task Scheduler

Y creamos una nueva tarea programada.

En el primer paso le damos un nombre.

En la pestaña “Descadenadores” le indicamos que la ejecute diariamente y la hora. Yo la tengo a las 5 de la madrugada que es cuando menos molesta :P.

En la pestaña “Acciones” indicamos “Iniciar un programa” y seleccionamos el archivo c:xmltvguiaxmltv.bat que acabamos de crear.

Aceptamos y guardamos todo. Ya hemos terminado. Si todo va bien la guía de nuestros canales se actualizará automáticamente a la hora indicada.

6) Resultado final y últimos ajustes.

Así queda todo finalmente, nuestros canales Imagenio integrados en la guía del Media Center, lo que nos permite verlos, programar grabaciones, ver la información de los programas, etc…

Como último paso suelo configurar la guía de canales de WMC creando distintos grupos: canales favoritos, HD, Imagenio, radio, etc… así tengo accesos más directos a determinados canales sin tener que recorrerlos todos.

Como resumen diré que Dvblink me parece indispensable para los que tenemos un HTPC y televisión IP.

Mi pequeña biblioteca técnica

Hoy voy a mostraros la pequeña colección de libros técnicos que he ido acumulando durante los últimos diez años. A tiempo pasado me he dado cuenta de que una gran mayoría de ellos no pintan nada ya en la estantería ya que son tecnologías desfasadas o superadas por nuevas versiones, tal es el caso, por ejemplo, de Visual Basic 6.0, Windows NT, Oracle 8i… Otros pueden servir aún como introducción general (Java2, SQL Server, MySQL, etc.), pero nunca serán un referente en sí mismos ya que están también “anticuados“. Bien es verdad, y considero importante puntualizarlo, que el grueso de mi biblioteca data del periodo 2000-2005, los últimos años apenas he comprado nada, Internet es, sin lugar a dudas, la biblioteca particular de todos nosotros. Mis últimas adquisiciones tratan temas más relacionados con la gestión (de proyectos, personas y negocios) que con la tecnología en sí misma, y es que estos últimos no pierden su capacidad de enseñanza, con los años siguen ahí para quien quiera consultarlos.

Estos son mis libros, agrupados, más o menos, por temática. Indico entre paréntesis el/los autor/es y la editorial, a continuación el año en que lo compré y una pequeña reseña del mismo.

  • Sistemas Operativos:
    • Guía completa de Microsoft Windows NT Server 4.0 (Russel y Crawlord, Mc Graw Hill), 2000. Con este y los dos siguientes aprendí todo lo relacionado con redes Windows, controladores de dominio, usuarios, etc. En su momento me fueron de muchísima utilidad e incluso gracias a ellos llegué a impartir formación sobre Windows NT, ha pasado mucho tiempo ya.
    • Windows NT 4.0 Server, instalación y gestión (J.M. Martínez y M. Martínez, Prentice Hall), 2000.
    • Windows NT Server 4.0 (Anaya Multimedia), 2000.
    • Linux Máxima Seguridad (Anónimo, Sams), 2002. En su momento me pareció una joya y me sirvió para profundizar y mejorar considerablemente mis conocimientos en temas de seguridad, auditoría e IDS en sistemas Linux. Aún sigo haciendo alguna consulta de vez en cuando.
    • El Libro Oficial de Red Hat Linux – Firewalls (Bill McCarty, Anaya Multimedia), 2003. Fundamental junto al anterior en mi formación sobre sistemas de red avanzados bajo Linux. También sigo echándole un ojo de vez en cuando aunque en Internet esté toda la información más que explicada.
  • Programación y lenguajes:
    • Teach yourself Java2 in 21 Days Second Edition (Lemay & Cadenhead), 2001. Un clásico. Con la primera edición aprendí Java allá por 1996. Con este libro recuperé mi formación en Java, importante en aquel momento.
    • Core Servlets and Java Server Pages (Marty Hall), 2002. Tras mejorar mis conocimientos de java con el anterior y junto al siguiente, aprendí todo lo relacionado con aplicaciones web en Java. En su momento me parecieron un par de libros fundamentales.
    • More Servlets and Java Server Pages (Marty Hall), 2002.
    • Creación de sitios web con XML y Java (Maruyama, Tamura y Uramoto, Prentice Hall), 2002. Lo compré a raíz de los anteriores, supongo que lo habría visto recomendado en algún lado, pero no recuerdo que me pareciese un libro impactante.
    • Learning Perl 3rd Edition (Schwartz & Phoenix, O’Reilly), 2002. Necesitaba algo de formación en Perl pero nunca llegué a leérmelo entero, más que nada porque nunca llegué a necesitar un nivel avanzado en Perl.
    • ActionScript con FlashMX Edición Especial (Prentice Hall), 2003. Sin duda otro libro básico en mi formación. Gracias a él aprendí todo lo relacionado con ActionScript, algo que me ayudó enormemente a dar el paso a Flex algún tiempo después.
    • Desarrollo de juegos con J2ME (Manuel J. Prieto, Ra-Ma), 2005. Un proyecto fracasado :P, en aquel momento tenía algunas ideas en la cabeza pero nunca llegué a leerme este libro.
    • Visual C#.NET (Fco. Charte Ojeda, Anaya Multimedia), 2004. No lo compré, llegó a mis manos por casualidad y tampoco hice nada con él.
    • Enciclopedia de Microsoft Visual Basic 6.0 (Fco. Javier Ceballos, Ra-Ma), 2000. Sin lugar a dudas fue básico en mi formación inicial allá por el año 2000. Hoy está completamente desfasado gracias a la tecnología .NET, pero en aquel momento era imprescindible. Creo que fue el primero de todos.
    • Programación de Active Server Pages (Hillier & Mezick, Mc Graw Hill), 2000. Gracias a este libro conseguí mi primer trabajo de programador web. Corría el año 2000 y comenzaba mi carrera profesional. Junto al anterior, fueron mis primeros libros.
    • XML (Óscar González, Anaya Multimedia), 2001. Cuando estaba aprendiendo Java, no recuerdo por qué, necesitaba conocimientos avanzados en XML y este pequeño libro de bolsillo me dio lo que buscaba.
    • WebServices (Joan Ribas Lequerica, Anaya Multimedia), 2003. Lo mismo que el anterior pero para WebServices, va al meollo del asunto sin complicaciones.
    • La Biblia ASP.Net (Mridula Parihar, Anaya Multimedia), 2009. Mi última adquisición. Por cuestiones profesionales he de ponerme las pilas con .NET, ahí lo tengo esperando :P.
    • The Pragmatic Programmer – From Journeyman to Master (Andrew Hunt & David Thomas, Addison Wesley), 2006. Fundamental para cualquier programador, todo lo que cuenta es completamente lógico y de cajón, tanto que muchas veces lo olvidamos todo.
    • The Unified Modelling LAnguage User Guide Second Edition (Booch, Rumbaugh & Jacobson, Addison Wesley), 2007. La biblia del UML.
    • UML y Patrones Segunda Edición (Craig Larman, Pearson – Prentice Hall), 2005. Empieza bien, pero me lo dejé a mitad, es bastante espeso. Espero retomarlo pronto.
    • The Zen of CSS Design (Dave Shea & Molly E. Holzschlag, New Riders), 2005. Éste y el siguiente me ayudaron considerablemente a entrar en el mundo del CSS, hay miles de recursos en Internet, pero no está de más tener algo de ayuda “a mano“.
    • Stylin’ with CSS – A Designer’s guide (Charles Wyke-Smith, New Riders), 2005.
    • Usabilidad – Diseño de sitios web (Jakob Nielsen, Prentice Hall), 2002. Completamente imprescindible. Recuerdo cómo me impactó su lectura y cómo me abrió los ojos hacia el desconocido campo de la usabilidad en un momento donde no estaba tan de moda como ahora. Todos los que trabajamos en diseño de software deberíamos leerlo, no es que aporte nada concreto, lo importante es la visión global que te hace tener sobre cómo deben pensarse las cosas que fabricas teniendo en cuenta en quién las utilizará.
  • Bases de datos:
    • Oracle 8i Guía de aprendizaje (Abbey, Corey y Abramson, Oracle Press), 2001. Este libro me permitió salir airoso de una tarea que me habían encomendado por aquella época, gracias a él conseguí aprender los conceptos básicos de Oracle.
    • Oracle 9i – Servidor de aplicaciones, red y programación (Cesa Pérez, Ra-Ma), 2003. La idea era prolongar los conocimientos que había alcanzado con el anterior, pero al final todo se quedó en nada ya que profesionalmente me aparté de Oracle.
    • MySQL  Edición Especial (Paul DuBois, Prentice Hall), 2001. La lectura de este libro fue fundamental para mi en aquel momento, con él aprendí a tunear y optimizar un sistema con una elevada carga. En 2001 no había tanta literatura al respecto en Internet como hay hoy en día.
    • Microsoft SQL Server a Fondo (Soukup, Mc Graw Hill), 2001. Mi primera toma de contacto con la base de datos de Microsoft.
  • Management y gestión de proyectos:
  • Negocios y emprendedurismo:
    • El Manifiesto Cultrain (Levine, Locke, Searls & Weinberger, Deusto), 2008. Un clásico sobre la gestión de negocios en Internet orientado hacia el trato con el cliente, la apertura de información en ambos sentidos, etc.
    • El Arte de Empezar (Guy Kawasaki, Ilustrae), 2007.  Otro clásico. Kawasaki expone su experiencia en la creación y desarrollo de startups.
    • El libro negro del emprendedor (Fernando Trías de Bes, Empresa Activa), 2008. Sería el equivalente en  español al de Guy Kawasaki. Muy recomendables los tres en todo caso.
  • Multimedia:
    • Premiere 6.5 (Antonio Paniagua Navarro, Anaya Multimedia) 2002. Con este pequeño manual dí mis primeros pasos en la edición de vídeo digital.
    • Adobe AfterEfeects 5 (Anaya Multimedia), 2002. Y con este otro profundicé un poco en ellos :).
    • Photoshop 5.5 para Windows (Miguel Angel Casanova González & Azucena González Ajenjo, Anaya Multimedia), 2001. Nunca llegué a leerlo, ni ganas de hacerlo :P.

Como conclusión, lo que os comentaba anteriormente. La mayoría de libros decentes sobre lenguajes de programación son muy caros y su vida útil es, como mucho, un par de años, a no ser que sea algo más tradicional como C ó C++. Hoy en día en Internet hay literatura de sobra para aprender cualquier cosa, la única pega que teníamos era tener que pegarte al monitor para leer un pdf o imprimirlo. Por suerte, la bajada de precios de los ebooks hace que durante los próximos meses asistamos a una migración paulatina de lectura técnica hacia los libros electrónicos, y es que así ya puedes ojear tranquilamente ese pdf de Python que tienes pendiente ;).

Adobe AIR XIII – Copiar y pegar desde un DataGrid a Excel

Una de las típicas cosas que necesitamos siempre en una aplicación que presenta una lista de datos es la opción de exportar a Excel. En el caso del que hablamos hoy, necesitaba copiar los datos que se presentaban en un DataGrid de una aplicación AIR. La solución fácil habría sido lanzar una tarea de servidor que, con ayuda de alguna librería de conversión a formato Excel, devolviese el archivo xls. Pero no me gustaba la idea ya que implicaba una latencia absurda, si ya tengo los datos en mi aplicación, ¿por qué pedirlos de nuevo al servidor?

La solución que se me ocurrió es muy sencilla, copiar los datos del DataGrid al portapapeles de manera que se puedan pegar en un archivo Excel automáticamente, y que, por supuesto, mantenga el formato.

Lo complicado de todo esto no es copiar los datos sino mantener las columnas. En realidad no es que sea difícil, más bien hay que saber como generar la cadena de texto para que Excel la entienda. La solución es simplemente generar una cadena de valores separados por tabuladores y copiarla al portapapeles, automáticamente al pegar en Excel éste entenderá el formato de columnas y filas a la perfección.

Sabiendo la teoría, pasemos a la práctica. Lo que haremos será, para el DataGrid en cuestión, recorrer una a una todas sus columnas y recuperar el valor del DataProvider en ella. Tan sencillo como esto:

private function DataGridToExcel(dataGrid:DataGrid):String{
	var cadena:String = "";
	var valor:String = "";
	var saltodeLinea:String = "n";
	var data:Array;

	if (Capabilities.os.indexOf( "Mac" ) >= 0)
       	    saltodeLinea="r";

	for (var i:int = 0;i< dataGrid.columns.length-1)
            cadena+= '"' + dataGrid.columns[i].dataField+ '"';
            if (i < dataGrid.columns.length-1)
                cadena+= "t" ;
	}
	cadena+= saltodeLinea; 

	data= ArrayCollection( dataGrid.dataProvider ).source;

	for each (var item:Object in data){
		for(var k:int=0; k < dataGrid.columns.length; k++) {
			if (dataGrid.columns[k].labelFunction != undefined){
				valor= dataGrid.columns[k].labelFunction(item, dataGrid.columns[k]);
			}else{
				valor= item[ dataField ];
			}

			var pattern:RegExp;
			if (valor){
				pattern = /["]/g;
				valor= value.replace( pattern, "" );
				valor= '"' + valor+ '"';
			}else{
				valor= '""';
			}
			cadena+= valor;
			if (k < dataGrid.columns.length - 1){
				cadena+= "t";
			}
		}
		cadena+= saltodeLinea;
	}
	return cadena;
}

A mi me gusta añadir la opción como menú contextual del DataGrid, de manera que al hacer click con el botón derecho sobre el mismo se abra un menú con la entrada “Copiar a Excel“. Para hacerlo de manera reutilizable podemos hacer una llamada de este estilo en los DataGrid donde queremos utilizarlo:

private function addCopyEventDtg(dtg:DataGrid):void{
	var _contextMenu:NativeMenu=new NativeMenu();
	var _copyMenuItem:NativeMenuItem = _contextMenu.addItem(new NativeMenuItem("Copiar a Excel"));
	_copyMenuItem.addEventListener(Event.SELECT, function(event:Event):void {
		System.setClipboard( DataGridToExcel(dtg) );
	});
	dtg.contextMenu=_contextMenu;
}

Y lo lanzamos de la manera más obvia:

addCopyEventDtg(nombreDeTuDataGrid);

Este sería el resultado:

No se a vosotros, a mi me sirve :P, y queda muy aparente la cosa :).

Adobe Air XII – No se puede instalar la aplicación, este instalador no se ha configurado correctamente

Recientemente he tenido que modificar una aplicación AIR y, ya de paso, me dio por convertirla a Air2. Todo iba bien hasta que la subí al servidor para que a todos los usuarios les apareciese automáticamente la actualización pero una vez comenzaba la instalación salía el siguiente mensaje:

No se puede instalar la aplicación, este instalador no se ha configurado correctamente

Tras googlear un poco lo único que encontré es que normalmente se debe a que la has publicado con un certificado distinto al que tenía la versión anterior, pero no era mi caso. Y así, de repente, me acordé que para utilizar la instalación automática se necesitaba el publisherID y pensé, ¿no será algo de eso?.

Así es que revisé el descriptor de la aplicación Aplicacion-app.xml y me encontré con un nuevo nodo comentado:

<publisherID></publisherID>

Lo descomenté y le añadí mi publisherID que se obtiene de la versión anterior instalada en:

RUTA_DE_INSTALACION_DE_TU_APPMETA-INFAIRapplication.xml

Publicas de nuevo la aplicación y todo solucionado, se actualiza perfectamente :).

Desempaquetar varios archivos tar a la vez

Este es uno de esos problemas que cada vez que me pasa no recuerdo como lo solucioné la vez anterior.

Imaginemos la situación. Tenemos varios archivos tar (o tgz) en una carpeta y queremos desempaquetarlos todos del tirón. Como somos muy listos haremos algo tan sencillo como:

tar xvf *.tar

Vaya, no funciona… En efecto, no funciona porque tar no entiende esta sintaxis como nosotros.

Hay varias posibles soluciones, a mi me gusta la que considero más sencilla y fácil de recordar:

find . -name *.tar -exec tar xvf {} ;

Útil ¿no?

Importar datos a SQL Server directamente desde Excel

Otro de esos pequeños problemas cotidianos que pueden acabar por convertirse en una tarea pesada. Siempre que tengo que importar datos de una hoja Excel acabo dando mil vueltas exportando a csv por aquí, importando por allá, etc. cuando en realidad es extremadamente sencillo, copiar y pegar.

En el Excel, seleccionamos las celdas a copiar y… las copiamos :), Ctrl+C o click en el botón derecho y copiar.

En el cliente de Microsoft SQL Server, abrimos la tabla donde queremos importar los datos y seleccionamos todo haciendo click en la celda superior izquierda, la primera de todas.

Ahora simplemente debemos pegar las celdas que habíamos copiado anteriormente, (Ctrl+V o botón derecho y pegar). Ya está! Así de sencillo. Anda que no le he dado vueltas yo a estas cosas…

Debes prestar atención, eso sí, a las características de cada campo (autonuméricos, campos null, etc…).

Renombrar fotografías en orden cronológico de captura usando la información EXIF

Como sabéis, suelo hacer muchas, muchísimas fotos mensualmente. Además las suelo hacer con distintas cámaras, con lo que al sacarlas de las tarjetas de memoria y meterlas en la misma carpeta no quedan ordenadas cronológicamente. Muchas veces he tenido que pasarme horas renombrándolas para tenerlas bien ordenaditas, sobre todo cuando quiero hacer un libro de fotos.

Hoy estaba decidido a crearme un script propio en PHP usando la librería EXIF que leyese esta información y renombrase las fotos en base a ella cuando me he encontrado con Jhead, un pequeño programilla disponible para Linux, Windows y OSX que lo hace directamente y además tiene multitud de opciones.

Simplemente debes descargar el ejecutable y copiarlo en alguna ruta accesible (/usr/local/bin, c:windows…) y listo para utilizar.

Desde la línea de comandos, nos vamos a la carpeta donde tenemos las fotos mezcladas y ejecutamos:

jhead -n%Y-%m-%d_%H-%M-%S *.jpg

Eso es todo, automáticamente nuestras fotos quedarán ordenadas por nombre, algo como:

  • 2010-01-04_12-05-12.jpg
  • 2010-01-04_12-05-20.jpg
  • 2010-02-01_19-10-02-jpg
  • ….

Es decir: YYYY-MM-DD_HH-MM-SS.jpg.

Un trabajo menos :P.

Reempaquetar el rpm de Portsentry para que loguee en su propio archivo

Desde hace mucho tiempo utilizo como media preventiva de seguridad el paquete Portsentry en los servidores para detectar potenciales accesos maliciosos y bloquearlos directamente en el firewall. El problema es que por defecto Portsentry deja sus logs en el archivo principal del sistema, /var/log/messages, lo que genera tal cantidad de ruido que es imposible encontrar algo útil en el log. El archivo donde loguea Portsentry no es configurable sino que viene predefinido en tiempo de compilación, con lo que deberemos recompilarlo si queremos que sea otro. Podríamos compilar e instalar el fuente directamente, pero no quiero perder las ventajas que ofrece rpm, veamos como hacerlo para Centos5.5 (o RHEL5.5).

Lo primero que debemos hacer es descargar e instalar el rpm con los fuentes desde aquí.

#rpm -ivh portsentry-1.2-1.te.src.rpm

Ahora debemos modificar el archivo donde se configura dónde logueará:

#cd /usr/src/redhat/SOURCES
#tar xvfz portsentry-1.2.tar.gz
#cd portsentry_beta

Editamos el archivo portsentry_config.h cambiando la línea 32 para que quede así:

#define SYSLOG_FACILITY LOG_LOCAL6

Con esto simplemente le decimos que loguee al “facility” local6 en vez de al “daemon” por defecto.

Se guarda el archivo y se empaqueta de nuevo:

#tar cvfz portsentry-1.2.tar.gz portsentry_beta

Ya podemos reconstruir el rpm:

#cd /usr/src/redhat/SPECS
#rpmbuild -ba portsentry.spec

Si todo va bien tendremos el paquete generado:

#cd /usr/src/redhat/RPMS/x86_64

Y ahí estará nuestro portsentry-1.2-1.te.x86_64.rpm preparado para loguear donde queremos que lo haga. Sólo queda instalarlo. Si tu arquitectura es de 32bits lo encontrarás en /usr/src/redhat/RPMS/i386.

Nos queda un detalle, configurar syslog para que guarde donde nos interesa la facility local6. Para eso editamos /etc/syslog.conf. Añadimos al final de todo la línea:

local6.*   /var/log/portsentry.log

y al principio de todo veremos algo parecido a:

*.info;mail.none;authpriv.none;cron.none /var/log/messages

La cambiaremos por:

*.info;mail.none;authpriv.none;cron.none;local6.none    /var/log/messages

Es decir, le decimos que de local6 no loguee nada en /var/log/messages. Solo nos queda reiniciar los demonios:

#/sbin/service syslog restart
#/sbin/service portsentry start

A partir de ahora tendremos nuestro log general bien limpio y la información de se seguridad separada.