Show me where am I
puts lambda {}
software development as an artistic expression
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 :)
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!
(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.
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.
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.
Codifica como si el que fuera a mantener tu código fuese un manÃaco asesino que sabe donde vives.
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.
¿Cómo no se es uno mismo?
Extrañas coincidencias (1991) David O. Russell y Jeff Baena.
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/
<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.
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?…
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.
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:
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).
Fernando Guillen's blog by Fernando Guillen is licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License.