martes, 16 de junio de 2009

Quiero logarme usando open ID

Lo primero es instalar la gema ruby-openid y el plugin open_id_authentication. Intenté usar directamente el plugin restful_open_id_authentication pero ya tenía montada una autenticación de tó la vida y preferí añadir únicamente la parte de open ID.

Ahora sólo queda seguir las instrucciones que encontramos en los links, pero con un par de matices:

  • Generamos las tablas que necesita el plugin

    > ruby script/generate open_id_authentication_tables MigrationName

    Esto generará una migration con las tablas open_id_authentication_associations y open_id_authentication_nonces, asi que...

    > rake db:migrate

    Si el modelo User aún no tiene un campo para almacenar el openid, tenemos que crearlo, claro está.

  • En el archivo de rutas nos aseguramos de que exista una ruta root y permitimos el acceso al método create del controlador sessions mediante GET

    map.open_id_complete 'session', :controller => "sessions", :action => "create", :requirements => {:method => :get }

  • En la vista correspondiente al login de la aplicación, añadimos un campo que contenga el openid del usuario.

    <%= text_field_tag 'identity_url' %>

  • Adaptamos sessions_controller para que ejecute el login contra openID cuando sea necesario. Basta con seguir las instrucciones que nos proporcionan los creadores del plugin, juntarlo con el código que tengamos para autenticar (en este caso, restful_authentication) y retocar un par de cosas.

    En el controller sessions_controller.rb

    def create
     if !params[:identity_url].blank? || request.get?
      open_id_authentication(params[:identity_url])
     else
      password_authentication
     end
    end

    protected
     def password_authentication
      self.current_user = User.authenticate(params[:login], params[:password])
      if logged_in?
       if params[:remember_me] == "1"
        current_user.remember_me unless current_user.remember_token?
        cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }
       end
       successful_login "Logged in successfully"
      else
       failed_login "User and password do not match"
      end
     end

     def open_id_authentication(identity_url)
      authenticate_with_open_id(identity_url) do |status, identity_url|
       unless status.successful?
        failed_login status.message
       else
        if @current_user = User.find_by_identity_url(identity_url)
         successful_login
        else
         failed_login "Sorry, no user by that identity URL exists"
        end
       end
      end
     end

    y en el plugin, en open_id_authentication.rb

    def successful?
     @code == :successful
    end

Y a correr.

Salud y rocanrol. (hoy no hay ánimo para canciones, sorry)

domingo, 7 de junio de 2009

Mensajes de error enviando mails

He encontrado este artículo que explica bastante bien los mensjaes de error más comunes que recibimos al enviar un email de forma errónea.

Divide los mensajes en tres grupos: provocados por errores en el dominio, por errores en el mailbox o por filtros antispam. Para más detalles lo mejor es leer el artículo.

Ha sido corto, pero intenso. Salud y rocanrol!

I've got friends in low places
Where the whiskey drowns
And the beer chases my blues away
And I'll be okay
I'm not big on social graces
Think I'll slip on down to the oasis
Oh, I've got friends in low places

martes, 12 de mayo de 2009

Un nuevo site

La semana pasada puse en producción el site del restaurante de unos amigos: La Lumbre del Cacique. Es mi segunda experiencia con el diseño y cualquier feedback es bienvenido.

Ha sido breve, pero intenso. Salud y rocanrol.

Sea tan amable y diga qué le debo.
Yo suelo pagar lo que como y lo que bebo.
He comido un pincho de tortilla,
dos bocadillos de morcilla.
He acabado un queso de tetilla
y me niego a fregar la vajilla.


lunes, 11 de mayo de 2009

Estar actualizado

El viernes pasado, camino de la Euruko2009, iba en el AVE intentando ver porqué no me funcionaban unos modelos que unas horas antes sí lo hacían. Era obvio que habían dejado de funcionar al añadirles el comportamiento acts_as_versioned que en otros proyectos me había funcionado la mar de bien.

Ahí estaba mi error. Mi profesor de carpintería en Estados Unidos me lo advirtió hace 22 años:
there's a big differece between assure and ass U're
Las versiones antiguas de acts_as_versioned mantenían los atributos que cambian de un objeto en un array llamado changed_attibutes, el mismo nombre que tiene un array parecido que se utiliza en Rails 2.3 para ver cuando un objeto que hereda de ActiveRecord está dirty.

Salí al paso cambiando el nombre al array en el plugin y hoy he actualizado el código.

Nota mental: stay updated regularly.

Salud y rocanrol

Sabes que si me dejas, muy triste me quedaré.
Tú sabes que si me abandonas, tal vez me pueda perder.
Cuando con cualquier otro chico, tu te burlas de mí
me hallaras en casa sentado
en el suelo hablando con la pared
Por eso no es extraño que tu estés loca por mí.
No es extraño que tu estés loca por mí.


lunes, 20 de abril de 2009

Cuatro URLs donde enviar sitemaps

A estas URLs se puede enviar el sitemap de cualquier site para que los buscadores te incluyan en su índice:

  • ASK:
  • http://submissions.ask.com/ping?sitemap=http://www.danimata.com/sitemap.xml
  • YAHOO:
  • http://search.yahooapis.com/SiteExplorerService/V1/ping?sitemap=http://www.danimata.com/sitemap.xml
  • MSN:
  • http://api.moreover.com/ping?u=http://www.danimata.com/sitemap.xml
  • GOOGLE
  • http://www.google.com/webmasters/sitemaps/ping?sitemap=http://www.danimata.com/sitemap.xml

Para ver el formato de un archivo sitemap, la url es la habitual: http://www.sitemaps.org/.

Ha sido corto, pero intenso. Salud y rocanrol!!!

Ni se paga con dinero ni se vende libertad,
ganas me dan de hartarme de reír.
Que animal! No me extraña que te sientas infeliz.
Ser el rey del hormiguero no es motivo de envidiar,
como si fuera el guarda del redil.
Ven p'acá, que parece que te has vuelto a confundir.

sábado, 11 de abril de 2009

Una razón más para cambiar

Llevo una temporada leyendo The Railsway de Obie Fernández y estoy interiorizando muchas cosas que antes me costaba bastante aceptar incluso entender. Creo que es por el enfoque directo que le da al libro, el punto de vista práctico del que parte y el lenguaje humano que utiliza. También porque es mucho más fácil entender cosas que ya has puesto en práctica y con las que has luchado a vida o muerte y contrareloj.

Ha coincidido mi comprensión definitiva de las rutas y de la aplicación de los principios REST con la formación de dos personas en Rails. Una de ellas lynuxera, phpera, joven y de mente abierta. La otra, windowsera, javera, joomlera, menos joven y con bastantes manías y estereotipos arrastrados de su larga experiencia. Mezclado todo ello con la presión de un proyecto importante, la situación se me estaba yendo de las manos y no estaba consiguiendo hacer las cosas bien.

Decidí sacar mi chuleta de los 4 verbos, las 7 acciones, la facilidad de extender éstas y lo fácil que resulta hacer todo siempre que se puede de la misma manera... et voilà. El caos se transformó en claridad, la deriva en control y las dudas en seguridad.

En dos patadas creé un proyecto con autenticación y administración sobre el que trabajar y añadir funcionalidad fácilmente. La ordenación de datos, la paginación, los métodos del controlador salían sólos y, trabajando juntos sobre el código, la velocidad de aprendizaje se incrementó considerablemente. Y lo mejor de todo, el arranque de un proyecto real con dos personas neoraileras fue bastante más controlada de lo habitual.

Vamos a ver qué ocurre a la hora de integrar con diseño. Algo nos inventaremos.

Como siempre, salud y mucho rocanrol!!!

Esperando en el metro
a que salga el Sol.
En la calle, chaval,
hace frío y es de noche.
Y se escuchan sirenas al pasar.


martes, 17 de marzo de 2009

Apoyando a los colegas

Mi compi, Dani Cabrera, presenta Freelancit en el BBVA Open Talent. Desde aquí le apoyo e invito a los que leáis esto a que también lo hagáis. Sin duda, el proyecto lo merece.

Freelancit es una comunidad online para profesionales freelance y está, cómo no, desarrollada en Ruby on Rails por ASPgems



Salud y rocanrol¡

Carry on, my sons forever
Carry on, when I am gone
Carry on, when the day is long
Forever carry on
For as long as were together
Then, forever carry on


lunes, 9 de marzo de 2009

No es lo mío , pero bueno...

Ayer desplegué www.procesosmadrid.es, el site de la empresa de mi amiga Julia. Se dedican a control de plagas y ahora también a evitar que los rayos te caigan encima.

Yo no soy diseñador, pero bueno, algo ha mejorado el site. Hemos aprovechado para darlo de alta en Google Analytics para aprender un poco de analítica web.

Visitas, visitas, queremos visitas¡¡¡

Salud y rocanrol

Porque sé que es un baile salvaje
combate a mala cara
veo todo en blanco y negro, blanco y negro...
Sólo quiero ser más rápido que ellos
y echar todo a perder, un día trás otro
y un buen rato después saber llegar a casa
antes de que el sol me diga que es de día.


jueves, 5 de marzo de 2009

El principio de la mínima sorpresa

Me dice un amigo que tiene un problema con el plugin acts_as_feeder. Tiene un modelo en el que ha incluido ese comportamiento y a la hora de lanzar la carga sobre una de sus instancias el sistema canta por soleares.

Escarbando, escarbando llegamos a que el casque ocurre al ejecutar el método open pasándole como parámetro un StringIO. Ese parámetro es el resultado de ejecutar también open pasándole la URL de un feed.

Ponemos trazas y vemos que al primer open le llega un String, como esperábamos; pero al segundo le llega unas veces un Tempfile y otras un StringIO. El primer caso funciona pero el segundo no y, además, lo que ocurre no tiene sentido.

Pues sí lo tiene. Sólo nos queda mirar qué hace el método open de open-uri y observamos este pedazo de código:

217 StringMax = 10240
218 def <<(str)
219 @io << str
220 @size += str.length
221 if StringIO === @io && StringMax < @size
222 require 'tempfile'
223 io = Tempfile.new('open-uri')
224 io.binmode
225 Meta.init io, @io if Meta === @io
226 io << @io.string
227 @io = io
228 end
229 end


Ahí la llevas. Si se trae más de 10Kb te lo mete en un Tempfile; si no, te devuelve un StringIO.

Y claro, esto ha dejado de funcionar al meter un blog nuevo en la BD. Por eso el proceso que lee no trae casi nada y de ahí todo el problema.

¿Me sorprende? No. El principio de la mínima sorpresa vuelve a triunfar.

Salud y rocanrol.

Navega, velero mío,
sin temor, que ni enemigo navío,
ni tormenta, ni bonanza
tu rumbo a torcer alcanza,
ni a sujetar tu valor.

Veinte presas hemos hecho
a despecho del inglés,
y han rendido sus pendones
cien naciones a mis pies.

Que es mi barco mi tesoro,
que es mi dios la libertad,
mi ley, la fuerza y el viento,
mi única patria, la mar.


jueves, 19 de febrero de 2009

Google Analytics: la polémica

Sólo quiero dejar clara mi postura en este tema.

Todo viene de un post del CEO de toprural acerca de cómo Google Analytics recoje sus datos y de cómo un parámetro de configuración que muy poca gente conoce puede alterar sensiblemente los resultados que se obtienen.

Las opiniones que se han dejado ver en la red son de todo tipo y color, pero se pueden agrupar en dos, como bien se explica en fansgao:
  • la expresada en loogic, 'Un ejemplo más de lo que ocurre cuando construimos un negocio sobre los cimientos de una empresa que a la que al final del día lo que más le importa es reportar buenos resultados a sus accionistas'
  • la expresada en web-analytics, 'Un ejemplo más de lo que ocurre cuando contruimos un negocio sobre los cimientos de una herramienta que no sabemos cómo funciona'
Y yo, claramente, con Pere Rovira y los que como él opinan que la culpa no es sólo de la herramienta sino de aquellos que hasta ahora han optado por utilizar google porque es gratis, sin saber como funciona. Es muy fácil confiar tus datos y tus decisiones a terceros y desentenderte de la herramienta elegida y de la analítica en sí misma, para luego no tener ni el más mínimo sentido de la autocrítica.

Salud y rocanrol

Bien oculto en tu disfraz en mis sueños siempre estás.
No lo puedo remediar, te deseo cada vez más.
Al principio todo era paz y contigo llego la maldad.
Surgiste de las tinieblas con fuego arrasador.
Has escrito la historia de la humanidad.
Haces siempre lo que quieres sin tener piedad.
Dios eterno todo lo haces a tu voluntad.

Maldito maldito sea tu nombre!
Maldito maldito sea tu nombre!