Thinking on hiring me?

Please read

Fernando Guillén

a Freelance Web Developer

cabecera decorativa

software development as an artistic expression

Junio 29th, 2009

Show me where am I

puts lambda {}
Junio 28th, 2009

Show me what is inside you

puts class << self; self; end
Mayo 6th, 2009

Ruby: EuRuKo 2009, new dose of inspiration.

This weekend is the EuRuKo 2009, a very concentrate juice of Ruby programmers. 230 tickets were sold withing 3 days almost two months ago.

I am one of the big bunch of people that is on charge of the organization of this edition, I am helping on whatever is in my hand, I am very proud of have been the developer of the registration application, with the help of very big mind people. You can download and use the code on the github repository.

I also sent a design proposal for the t-shirt conquest. Of course Marze was there for putting me on my place :)

EuRuKo 2009 t-shirt proposal

Of course I’ll be there this weekend, I love to attend such events. It’s not because I like the talks, or because I learn a lot.. it’s not that. I love and need the energy that flutters there. It’s some kind of battery recharger. A new dose of inspiration. Company, Cooperation, … Pride of Craftsman.

See you there people!

Abril 15th, 2009

Satanizando Java

(Esto lo tenía por ahí desde hace tiempo… )

Últimamente está muy de moda eso de satanizar los grandes lenguajes corporativos en pro de los lenguajes de juguete.

Llevo 5 años trabajando con Java y sabéis qué os digo: que me uno a ellos, vine aquí para divertirme y creo que para eso se necesitan juguetes.

Abril 6th, 2009

Ruby on Rails, Scotland on Rails 2009

Un fin de semana en Edimburgo rodeado de amantes, curiosos y rock-stars de Ruby on Rails, además de un montón de colegas de profesión y pasión, no me lo podía perder: Scotland on Rails.

Gueto español en SoR 2009

El fin de semana comenzó el jueves con un curso de un montón de horas de lo que se esperaba fuera un acercamiento a RoR y se convirtió en curso avanzado de Ruby a base de demostraciones malabaristas de lo que con este lenguaje se puede hacer.

Allí estábamos Raul, Flype, Ray y yo mismo con la cabeza apunto de explotar. Todo el día en una especie de destripamiento de carnicero de las entrañas de Ruby.

Acabé con agujetas de tener la boca abierta.. bueno espera que la cierre para escribir estas otras 2 líneas. Nos acaban de mostrar una especie de trigers o callbacs que se disparan cada vez que incluyes un módulo o incluso cada vez que declaras un método de una clase. Pueden funcionar como filtros también.

OMG.. ahora nos acaban de mostrar una clase que inspecciona Ruby en sí mismo: ObjectSpace.

Todos los ejercicios que vimos están en un proyecto de github:

Los posteriores días transcurrieron entre interesantísimas charlas, otras no tanto, alguna otra en la que no me enteré de nada, chistes, gueto español, cenas, desayunos, paseos, cervezas.. una delicia vaya.

Unas de las partes de la conferencia con menos expectativas pero que resultó ser super interesante fueron las Lightning Talks. En ellas se hablaron de unas cuantas idas de olla, de varios generadores de back y de una gran premier: la presentación de RedCar, un editor TexMate-style para Linux desarrollado por un chaval que no aparentaba ni 20 años.

Los posteriores días post-conferencia fueron aún más dulces, acompañado de un ángel fui a visitar a un amigo en Glasgow que nos llevó de paseo por las highlands.

… Feliz de mi profesión.

PD: por cierto, terminé la conferencia siendo premiado en el sorteo de 250 libras en libros de O’Reilly :) .. que repartí gustoso con mis compañeros de gueto por mi imposibilidad de leérmelos todos antes de que se quedasen anticuados.

Marzo 11th, 2009

La importancia del ‘estilo’ al programar

Codifica como si el que fuera a mantener tu código fuese un maníaco asesino que sabe donde vives.

Andrés Panitsch en ‘des desarrollo de software‘.

Marzo 5th, 2009

En la búsqueda de la felicidad

No me mal interpretes siempre me he sentido feliz. Me gusta programar, lo he disfrutado y lo disfruto cada día.

Picaba código de la microhobby pero no conseguía descifrar la magia de esos conjuros.

Conseguí hacer mis primeros videojuegos en BASIC pero necesitaba más potencia y velocidad de respuesta.

Conocí ensamblador y sentí el poder en mis dedos parcheando interrupciones. Aquí lanzo una flecha de agradecimiento a Paco, ese viejo dinosaurio de la informática que le pagaba 500 pesetas por hora de clase.. (que luego se las gastaba en mi bar a base de cubatas).

Conocí C y me derretí al ver como con una línea de código solucionaba todo un día de trabajo en ensamblador.

Conocí Java y me derretía de satisfacción con la cantidad de librerías y documentación que te proporcionaba.

Me empezaron a llamar la atención los conceptos de la eXtreme-Programming que hundían un poco en lo profundo los grandes análisis y documentación, así como defendían técnicas como la pair-programming que siempre me ha encantado incluso antes de saber que tenía nombre. Recuerdo muchas noches en vela jugando a programar aplicaciones con uno de mis mentores en Java.

Conocí los patrones de desarrollo de software que te guiaban en la resolución de problemas contra los que ya no tenías que luchar solo. Implementé varios de ellos a golpe de pico y pala: un motor de persistencia, un MVC, …

Conocí Struts e Hibernate y solucionaban un problema grande pero empecé a sentir que la solución empezaba a formar una pendiente, que ya no volaba tan ligero…

Bajé a iBatis y sentí que remontaba el vuelo, la potencia de Hibernate no justificaba los dolores de cabeza que me dio y me sigue dando con insistentes poltergeist.

Comprendí la importancia de los patrones KISS y “menos es más” antes de conocerlos.

Ahora bajo un poco más y me alejo de la gran pista de los tanques, me estaba perdiendo, las grandes herramientas pesan demasiado y mis pies se hundían en el barro, me sentía empantanado.

Quiero divertirme, quiero ser feliz, quiero sentirme ligero, mis proyectos y mis herramientas deben ser también ligeras.

Marzo 5th, 2009

¿Cómo no se es uno mismo?

¿Cómo no se es uno mismo?

Extrañas coincidencias (1991) David O. Russell y Jeff Baena.

Febrero 5th, 2009

Ruby on Rails, Agujero de seguridad en mi API xml

En uno de los pet-projects en los que ando he intentado construir todo un poco académicamente rollo RESTfull (o casi full :) ) y tal.

Pero lo que nos acomete ahora es que he intentado soportar en todas las acciones de controlador en formato .xml.. ¿para qué?.. pues no sé.. pero ahí que lo he dejado.. sin testear ni nada, por si acaso.

Resulta que el otro día me levanté inquieto por la mañana con el pensamiento de que las si se hacía una petición a una acción con el formato .xml la respuesta que le iba a llegar al cliente no me iba a gustar nada.. pero luego se me pasaba y me olvidaba.

Bueno pues la acabo de hacer, acabo de hacer la petición con el formato .xml y, confirmando mis miedos, la respuesta no me ha gustado nada.

http://127.0.0.1:3000/people/103-fernando-guillen.xml (no clckes.. no te va a funcionar :))

<user>
<activated-at type="datetime">2009-02-02T01:01:22+01:00</activated-at>
<activation-code nil="true"></activation-code>
<company-name>Mi company</company-name>
<company-url>http://micompany.com</company-url>
<created-at type="datetime">2009-02-02T01:01:10+01:00</created-at>
<crypted-password>8e2434d3e574c95f4cfd0f457b20c8959ecbf04b</crypted-password>
<iail>xxxx@xxx.com</iail>
<id type="integer">103</id>
<login>fguillen</login>
<name>Fernando Guillen</name>
<password-reset-code>fcc786cd2137679f1055976989f5469607c9d663</password-reset-code>
<permalink>fernando-guillen</permalink>
<personal-web-name>mi web</personal-web-name>
<personal-web-url>http://google.es</personal-web-url>
<public-profile type="boolean">true</public-profile>
<remember-token nil="true">
<remember-token-expires-at type="datetime" nil="true">
<role>User</role>
<salt>5c26f52452d00dbd997f8c6998f5c3de1e4f53f3</salt>
−
<text>
Vaya texto guapo que pongo aquí:
 
Con varias líneas
 
y alert("hola");
</text>
<updated-at type="datetime">2009-02-04T18:52:21+01:00</updated-at>
</remember-token-expires-at>
</remember-token></user>

En la respuesta están todos los datos del usuario 103.. ¡todos! hasta la password, aunque está cifrada.. y ¡¡el email!!.. y si hacemos:

http://127.0.0.1:3000/people.xml

Entonces es cuando casi me desmayo..

Alguien podría descargarse toda la base de datos de mi aplicación a base de peticiones .xml o usando ActiveResource.. ¿qué hago ahora?…

  • …¿Eliminar por completo el soporte .xml?
  • …¿Crear vistas .xml para sólo devolver los atributos públicos?
  • …¿Alguna manera de decirle al modelo o al controlador qué atributos quieres que aparezcan en el formato .xml?

Antes de liarme a postear de manera alarmista en éste mi blog, sin solución alguna que ofrecer, comenté estas inquietudes en la sagrada lista ror-es y aparecieron el señor Blat y Pablo Formoso al rescate con un buen par de links y sugerencias:

Estos dos links te enseñan a pasarle parámetros a las invocaciones del método .to_xml de tus modelos de tal modo que puedes poner en tus controladores cosas como esta:

format.xml  { render :xml => user.to_xml( :except => [:email, :crypted_password] ) }

Y así empecé pero no me acabó de convencer pues tengo miedo de olvidarme algún controlador y decido pasar la seguridad al modelo y sobrescribir el método .to_xml de la clase User. Pero los métodos para hacer esto que se sugieren por ahí son un poco tediosas con llamadas a Builder::XmlMarkup y vamos.. un rollo. Lo suyo sería trasladar la facilidad del :except y el :only a la sobrescritura del .to_xml y en los comentarios de este post tenemos una solución bien ingeniosa:

  alias_method :ar_to_xml, :to_xml
  def to_xml(options = {})
    default_except = [
      :activated_at,
      :activation_code,
      :email,
      :login,
      :password_reset_code,
      :permalink,
      :public_profile,
      :role,
      :crypted_password,
      :salt,
      :remember_token,
      :remember_token_expires_at,
      :created_at,
      :updated_at
    ]
    options[:except] = (options[:except] ? options[:except] + default_except : default_except)
    self.ar_to_xml( options )
  end

Sobre todo fíjate en el truqui del alias_method para seguir permitiendo llamadas al comportamiento original del to_xml.

Si sigues los comentarios del hilo que te he indicado verás que las propuestas continúan hasta formar un solución polivalente que bien se puede convertir en un buen parche para Rails.

Febrero 1st, 2009

Ruby on Rails, Paperclip y validaciones de dimensiones

Me he picado una extensión de Paperclip para porveer de validaciones de dimensiones para las imágenes adjuntas aquí la comparto contigo por si te resulta útil.

No he hecho un parche para Paperclip pues eso supone un gran esfuerzo en tests y demás y eso tendrá que esperar un poco.

Lo he organizado todo para que copies y pegues el código en un fichero en /lib y lo requieras desde el environment.rb con eso debería valer pero úsalo bajo tu entera responsabilidad :)

La extensión provee de dos nuevos validates:

  • validates_attachment_width
  • validates_attachment_height

Que se pueden usar con toda la convinación de opciones que el nativo ‘validates_attachment_size‘.

Por ejemplo:

validates_attachment_width :photo, :greater_than => 576, :less_than => 1000
validates_attachment_height :photo, :greater_than => 150, :less_than => 300
 
validates_attachment_width :photo, :in => 576..1000
validates_attachment_height :photo, :in => 150..300, :message => "file height must be between :min and :max pixels."

Tenemos por ejemplo la validación del ancho:

    def validates_attachment_width name, options = {}
      min     = options[:greater_than] || (options[:in] && options[:in].first) || 0
      max     = options[:less_than]    || (options[:in] && options[:in].last)  || (1.0/0)
      range   = (min..max)
      message = options[:message] || "file width must be between :min and :max pixels."
 
      attachment_definitions[name][:validations][:width] = lambda do |attachment, instance|
        if attachment.file? && !range.include?( Geometry.from_file(attachment.queued_for_write[:original]).width.to_i )
          message.gsub(/:min/, min.to_s).gsub(/:max/, max.to_s)
        end
      end
    end

El código completo lo tienes aquí:  paperclip_validations_extended.rb.

Un ejemplo de tests y usos lo tienes aquí: paperclip_validations_extended_test.rb.

A mi me está funcionando.. y a tí?

a Freelance Web Developer is proudly powered by WordPress
Entries (RSS) and Comments (RSS).

Creative Commons License
Fernando Guillen's blog by Fernando Guillen is licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License.