La Coctelera

Resumiendo los últimos dos meses: HackDay, Carrera

Hola a todos,

Los últimos meses están siendo muy intensos con el trabajo, finiquitando el papeleo de la carrera y recuperando mi vida social tras mi vuelta de Helsinki :)

En un intento por retomar esto, voy a hacer un pequeño resumen de lo acontecido en este mes y medio que llevo desaparecido.

El HackDay

Tal y como estaba planeado fui al HackDay. Allí tuve la oportunidad de conocer en persona a gente que sólo conocía con el monitor de por medio: Luismi y Blat. Además conocí a un montón de gente interesante y simpática (no hago una lista para evitar dejarme a nadie fuera xD). Un auténtico placer estar con todos ellos compartiendo el fin de semana.

Por si a alguno le interesa lo que hackeamos allí, Luismi y yo montamos Flickr Captcha: Un sistema de captchas basado en imágenes obtenidas a través de la API de flickr. No descarto escribir un post hablando más de la idea y la implementación, pero no sé si le interesará a alguien xDD

Tengo un pequeño set de flickr del HackDay, por si queréis ver alguna fotillo :)

La Carrera

EXTRACTO DEL EXPEDIENTE ACADÉMICO A FECHA 20/07/2007

Proyecto Final de carrera superado el: 19/07/07
Calificación: 9

Créditos establecidos para obtener la titulación:
TRONCAL: 120.00
OBLIG.: 48.00
OPT.: 34.50
L.E.: 22.50
TOTAL: 225.00

Créditos obtenidos:
TRONCAL: 120.00
OBLIG.: 48.00
OPT.: 34.50
L.E.: 22.50
TOTAL: 225.00

NOTA MEDIA PONDERADA: 7,87

Ya tengo oficialmente todos los créditos de la carrera y el lunes me paso por la UPV a pagar el título de Ingeniero Técnico en Informática de Sistemas :D

Hosting nuevo y deprec

Desde hace unas semanas tengo un VPS de Slicehost. Dreamhost está bien para tener un servidor baúl: mucho espacio, mucho bandwith y un uptime aceptable . Pero estaba un poco cansado del suplicio que era poner una aplicación rails y lo mal que iban, así que contraté slicehost para probarlo y definitivamente me quedo :)

Si os echa para atrás el tema de administrar una distribución linux recién instalada y tener que montar todo el stack, deciros que existe deprec. Deprec proporciona un conjunto de recetas de capistrano con las que podrás convertir una ubuntu recién instalada en un servidor con: apache 2, cluster de mongrels, mysql, subversion e incluso un trac... con 10 comandos de terminal!. Si te parece poco te diré que con esos menos de 10 comandos también habrá configurado todos los servidores, importado tu aplicación rails en subversion, desplegado la aplicación, configurado los vhosts de apache...

Si pensáis que debe ser un lío, aquí tenéis lo que escribiréis en la terminal de vuestra máquina local:

deprec --apply-to . --name flickrcaptcha --domain captcha.ernesto-jimenez.com
cap setup_admin_account_as_root
cap setup_ssh_keys
cap install_rails_stack svn_install trac_install
cap svn_setup
cap trac_setup
cap trac_start
cap deprec_setup
cap deploy_with_migrations
cap restart_apache

¿complicado? ^_^

Podéis ver un HowTo muy bueno en el wiki de slicehost

La Campus Party

El lunes voy a la Campus Party una semanita. De momento es seguro que participaré en los talleres y conferencias de Google y ua competición de programación rápida de RIAs en 72 horas en la que participaré con Belén.

Eso es todo por hoy, a ver si logro publicar con algo más de frecuencia en el blog y no lo dejo abandonado tanto tiempo :)

Happy Hacking!

En España no sabemos inglés

Que en nuestro país el nivel de inglés que se adquiere en la enseñanza obligatorio es lamentable no es ningún secreto. La verdad es que, para lo que enseñan, podrían emplear mejor todas las horas que tiran los niños "aprendiendo" una lengua extranjera...

Lo que sí que me escandaliza de verdad es que en mi Universidad me den el siguiente formulario para que lo cumplimenten en Helsinki:

Name of the host Institution: ____________________________________________

IT IS HEREBY CERTIFIED THAT:

Mr./Ms. __________________________________________________________________
fom the __________________________________________________________________
(name of the home Institution)

has been an SOCRATES/ERASMUS student at our Institution:
between _____, _________________, _______ and _____, ______________, _______

in the Departament(s)/ Faculty of: ________________________________________

Date Stamp and Signature

Name of the signatory: ________________________________________
Funtion: ______________________________________________________

To be sent to:
(adress of the home Institution)

Al leerlo te encuentras con perlas como departament, funtion y adress.

A mí se me cae la cara de vergüenza cuando me dan un papel oficial así para que me lo tramiten en un país en el que casi todo el mundo sabe un mínimo de cuatro idiomas...

Ya ni siquiera se molestan en pasar el corrector ortográfico del word.

Implementaciones de (in)seguridad

Estaba yo el código HTML de la web de la Campus Party 2007 cuando me di cuenta de que el desarrollador de la web, muy concienciado con con la seguridad de sus usuarios, había insertado el siguiente código para la autenticación de los usuarios (enviar usuario y contraseña, vamos ;):

 <script>
 function seguridad()
 {
 document.getElementById("pass_public_key").value =Math.random();
 document.getElementById("pass").value = calcMD5c(document.getElementById("pass_public_key").value + calcMD5c(document.getElementById("pass_tmp").value));
 }
 </script>
 [...]
 <A href="#" ONCLICK="seguridad();theF=document.getElementById('loginForm');theF.submit();return false;" class="transparentLink" style="font-size:15px;">Entrar</a>
 

Dejando de un lado lo bonito que pueda ser el código, vemos que el desarrollador ha decidido que la contraseña de sus usuarios es muy importante y no debería viajar sin cifrar por la red. Me parece bastante razonable ya que durante el evento la gente accede a la web, y cualquiera podría enchufar un sniffer y cazar la contraseña por el camino (no sería la primera vez). Además es tan cuidadoso que ni siquiera manda el Hash de la contraseña, sino que manda el Hash de un número aleatorio concatenado el Hash de la contraseña:

MD5(random() || MD5(PASSWORD))

De esta forma, el navegador en lugar de enviar nuestra cotraseña en texto plano de forma que cualquiera podría leerla por el camino, envía el Hash que hemos indicado en la fórmula y el número aleatorio para poder calcular el Hash en el servidor y comprobar si ambos hashes (el calculado en el cliente y el calculado en el servidor) son iguales.

En fin, hasta aquí todo es muy correcto, y son todo muy buenas intenciones, hasta que repasas un poco más el código fuente y te das cuenta de lo siguiente (limpio un poco el código para hacerlo más legible):

 <form method="POST" id="loginForm">
   <input type="hidden" name="login" value="1">
   <input type="text" name="dni" value="DNI" onclick="this.value=''">
   <div>
     <input type="password" name="pass_tmp" id="pass_tmp">
     <input type="hidden" name="pass_public_key" id="pass_public_key" value="">
     <input type="hidden" name="pass" id="pass" value="">
   </div>
 
   <A href="#" ONCLICK="seguridad();theF=document.getElementById('loginForm');theF.submit();return false;">Entrar</a>
   <A href="" onClick="[...]">Recordar contrase&ntilde;a</a><br>
 </form>
 

El desarrollador ha metido el campo donde el usuario introduce la contraseña en texto plano en el formulario que envía al servidor y no lo ha borrado por javascript. Como consecuencia, además del bonito Hash que envía al servidor, también envía siempre la contraseña en texto plano.

En definitiva, la intención era buena, pero la implementación es inútil.

Yo también voy al HackDay

Yo también he sido invitado al HackDay, así que si no surge nada inesperado, allí estaré :)

Hack Day: London, June 16/17 2007

Si alguien que pase por aquí va a ir también, que me deje un comentario ^_^

CruiseControl.rb via twitter

Bueno, como me hizo gracia el comentario de Blat sobre publicar un plugin por semana aquí viene el de esta. Esta vez no es para RoR exactamente, sino para una aplicación hecha en RoR: CruiseControl.rb :)

El plugin este ya lo tenía hecho, pero como estoy de exámenes mejor recuperar algo ya hecho y hacer un post rápido que no postear ^_^

¿Qué es eso de CruiseControl.rb?

Traduciendo directamente de su página:

CruiseContro.rb es una herramienta de integración continua. Su básico propósito en la vida es alertar a los miembros de un proyecto de software cuando uno de ellos añade algo al sistema de control de versiones que rompe el build.

CC.rb es fácil de instalar, agradable de usar y simple de hackear. Está esrita en Ruby.

Básicamente, lo que hace es monitorizar subversion y cuando hay una nueva versión le pasa los test y alerta a los desarrolladores si los tests no pasan correctamente. Yo diría que es una herramienta obligatoria para cualquier proyecto en Rails (cocteleros de la ruby room, si no lo tenéis, ya estáis tardando ^_^)

twitter_notifier.rb

Por defecto CC.rb ya lleva (entre otros) plugins de notificación via: mail, jabber y Growl.

Yo hice uno para notificar via twitter cuando el build se rompe o arregla. Lo podéis encontrar en el bug tracker del proyecto ya que está pendiente de ver si lo incorporan de serie como plugin disponible.

Podéis encontrar otra versión posterior que notifica de todas las nuevas versiones en mi subversion. Con esto os enteraréis de todos los commits que se hagan y de si los tests pasan correctamente.

Instalación y configuración

Para instalarlo no tenéis más que copiar el plugin en la carpeta builder_plugins/installed/ de vuestra instalación de CC.rb

La configuración es algo tan sencillo como esto:

Project.configure do |project|
   ...
   project.twitter_notifier.email = 'your_email@twitter.com'
   project.twitter_notifier.password = 'twitter_password'
   ...
 end

simple_text_fields plugin

Cuando ideamos el modelo de nuestra aplicación pensamos qué datos queremos y qué forma han de tener, por eso Rails proporciona validates_format_of y compañía. Yo en ocasiones sé que determinados campos de texto no han de admitir etiquetas HTML, mucha gente con este tipo de campos guardaría el texto independientemente de si tiene etiquetas HTML, y luego quitaría las etiquetas en las vistas.

Desde mi punto de vista, lo ideal es quitar las etiquetas antes de guardar los datos en la base de datos, así que he hecho este mini-plugin que te permite definir campos de texto simple (sin etiquetas HTML), y modificará el modelo para usar el helper strip_tags sobre esos campos.

Este plugin también se usa con dos simples pasos:

  1. Instala el plugin:
    script/plugin install http://i.justcodeit.net/plugins/simple_text_fields/

  2. Sácale partido
    class Post < ActiveRecord::Base
       validates_presence_of :title
       simple_text_fields :only => :title
     end
     

Al igual que acts_without_scripts, simple_text_fields por defecto se aplica a todos los campos de texto del modelo, pero dispones de :only y :except para restringir su aplicación.

Un paso menos para acabar la carrera

No quiero meter mucho tema personal en este blog, pero ayer ya terminamos y presentamos el que ha sido mi Proyecto de Fin de Carrera :D

La experiencia ha sido interesante, trabajar con gente del MIT y RISD, y además me vuelvo a España con un 9 en el proyecto, que no del todo está mal.

Plugins de mi propia cosecha

Para demostrar que sigo vivo, aquí va la presentación de dos plugins para Rails míos :)

Testea siempre tus fixtures

test_fixtures no es más que un plugin sacado a partir del post "Fernando Blat lo decía: TESTEA TUS FIXTURES! (y se DRY)". Instala el plugin, añade una línea a tu test/test_helpers.rb, y ya lo tendrás todo hecho

Ya no tienes excusa para no testear tus fixtures

Para usarlo son sólo dos pasos:

  1. Instala el plugin:
    script/plugin install http://i.justcodeit.net/plugins/test_fixtures/

  2. Ponlo en marcha editando el archivo test/test_helpers.rb
    class Test::Unit::TestCase
       include TestFixtures
       # The rest of your helpers
     end
     

Evita javascript chungo en tu base de datos

¿Controlas lo que los usuarios meten en tu base de datos? ¿Te aseguras de quitar javascript del contenido que envían? No son cosas que se hayan de descuidar ya que si no lo haces puedes comprometer la privacidad e incluso la seguridad de tus otros usuarios y tu web.

Siguiendo con mi obsesión por ser DRY y basándome en la idea del plugin acts_naked he creado acts_without_scripts. Este plugin te permite filtrar con el helper sanitize el texto que va a tu base de datos automáticamente. Por defecto filtrará todos los campos de texto del modelo que declaremos acts_without_scripts, pero dispone de opciones para especificar qué campos en concreto queremos filtrar y el callback que queremos emplear para filtrarlos.

Ya puedes asegurar un poco más tu aplicación!

Para usarlo son otros dos pasos:

  1. Instala el plugin:
    script/plugin install http://i.justcodeit.net/plugins/acts_without_scripts/

  2. Añade en los modelos que quieras el acts_without_scripts
    class Post < ActiveRecord::Base
       validates_presence_of :title
       acts_without_scripts
     end
     

Critícame o felicítame

Para esto te basta con dejarme un comentario o enviarme un mail ;)

Espero que algo de esto le sea útil a alguien ^_^

[an error occurred while processing the directive]