Thinking on hiring me?

Please read

Fernando Guillén

a Freelance Web Developer

cabecera decorativa

software development as an artistic expression

Archive for the ‘ruby’ Category

Lunes, Junio 29th, 2009

Show me where am I

puts lambda {}
Domingo, Junio 28th, 2009

Show me what is inside you

puts class << self; self; end
Miércoles, 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!

Lunes, 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.

Jueves, Enero 29th, 2009

Ruby: El operador ‘~>’ y el Gem::Requirement

En un hilo de ror-es con título: ‘Problema con carga de rubygem en App rails al hacer rake db:create && rake db:migrate‘, Andrés Gutierrez se debatía con las versiones de las gemas solicitadas por un proyecto Rails que esta intentando arrancar.

La configuración del proyecto le requería tener instalada una gema y para indicarle la versión se utilizaba el operador ‘~>‘.. no el ‘==’, el ‘>’, el ‘>=’.. no, tenía el simbolito raro ese de la ñ.

En concreto la especificación de la gema requerida es tal que así:

config.gem 'mislav-will_paginate', :version => '~> 2.2.3', :lib => 'will_paginate', :source => 'http://gems.github.com'

Su duda venía de que él tenía instalada la versión 2.3.6 de la gema en concreto y no entendía porque no cumplía los requisitos.

El caso es que me piqué y al más puro ‘estilo Daniel R. Troitiño‘ ahí que fui a las tripas del código a ver que demonios hacía el operador ése..

Si miramos el fichero:

 $ mate rubygems/requirement.rb

Tenemos la lista de operadores y lo que se hace con cada uno:

 OPS = {
   "="  =>  lambda { |v, r| v == r },
   "!=" =>  lambda { |v, r| v != r },
   ">"  =>  lambda { |v, r| v > r },
   "<"  =>  lambda { |v, r| v < r },
   ">=" =>  lambda { |v, r| v >= r },
   "<=" =>  lambda { |v, r| v <= r },
   "~>" =>  lambda { |v, r| v >= r && v < r.bump }
 }

Donde ‘v‘ parece ser la versión disponible y ‘r‘ la requerida
Lo raro del operador ~> es que a la versión requerida le hace un bump
y el código de esto está en otro fichero:

 $ mate rubygems/version.rb

Aquí lo pego:

 # Return a new version object where the next to the last revision
 # number is one greater. (e.g.  5.3.1 => 5.4)
 def bump
   ints = build_array_from_version_string
   ints.pop if ints.size > 1
   ints[-1] += 1
   self.class.new(ints.join("."))
 end

Al parecer a la versión requerida en la aplicación, en este caso ‘2.2.6‘, le hace un bump y la deja en ‘2.3‘ y por lo tanto la
condición:

 '2.3.6' < '2.3'

No se cumple .. como podemos comprobar aquí:

irb>
>> req = Gem::Requirement.create("~> 2.2.3")
>> req.satisfied_by?( Gem::Version.new('2.3.6') )
=> false
>> req.satisfied_by?( Gem::Version.new('2.2.6') )
=> true
>> req.satisfied_by?( Gem::Version.new('2.1.6') )
=> false

Lo que parece que quiere el operador ~> es que la gema disponible esté
en la misma familia X.X que la gema requerida.

Hasta aquí he llegado. Si por favor conoces la documentación oficial donde se explica pásame el link para darme bien de tollejas.

Sábado, Enero 10th, 2009

Monsters of Ruby!!!

No estaban todos los que eran ni eran todos los que estábamos pero si es cierto que se logró reunir a un buen grupo de Monstruos del Ruby.

Sábado 13 de Diciembre de 2008, 14horas, una convocatoria vía email logró reunir a rubistas de todo el estado en una sola habitación para enfrentarse a un reto por equipos.

Se trataba de enfrentarse a un fast-code de una aplicación web usando para el desarrollo de cada una de las capas herramientas que empiezan a emerger y de las que carecíamos de ningún dominio.

Nos mostraron como especificación una aplicación hecha en Rails llamada Frankenstein, para cuyo desarrollo emplearon un par de horas y otro poco para otorgarle un sugerente diseño.

Nos dividimos por equipos atendiendo a la suerta y también por sorteo se fueron repartiendo las herramientas (librerías) que cada equipo podía emplear.

A nuestro monstruoso equipo (los nosferatu) nos tocó:

Pero hubo combinaciones mucho más dolorosas.. :) que ahora no logro recordar.

Nuestro resultado lo podéis encontrar aquí: Nosferatu, pero está totalmente incompleto y dudo que logréis hacerlo funcionar sin nuestras explicaciones. El resto de  grupos y resultados los tenéis en el grupo monstersofruby de github.

A mi parecer no se puede entender lo logrado en esta reunión viendo el código generado. Lo que se ha conseguido va mucho más lejos del código, para mí ha sido una apertura de mente hacia las tecnologías que desconozco pues me da una pereza horrible enfrentarme a la primera línea de código, pero esta experiencia me ha demostrado que no es tan complicado y que hay muchas estrellas en el cielo por conocer.

Además también ha sido otra demostración más de la amigabilidad, sociabilidad, apertura y deseo de compartir que embriaga a toda esta peña entusiasmada con la programación.

Muchas gracias a todos.. ¡hasta la próxima! .. qué por cierto ya se está cociendo.

Martes, Enero 6th, 2009

Looking for _why

La gente que estamos intentando que se haga realidad la Euruko 2009 y entre todos ellos especialmente Marze y yo, nos gustaría mucho traer a _why a Barcelona a alegrar con sus excentricidades y genialidades alguna de las sesiones.

El caso es que no está resultando nada fácil dar con él, no nos quiere contestar a los mails. Incluso hemos contactado con DrNic a ver si él es capaz de hacerle llegar alguno de nuestros mensajes.

La mejor idea la ha tenido Marze que se ha currado una carta al más estilo un-plugged para intentar llamar su atención:

looking for _why

Si por favor ves a _why por algún ricón de la red dile que la gente de la SRUG le estamos buscando.

Jueves, Septiembre 4th, 2008

Ruby, sustituyendo matches de una regex en un String con matches de la misma regex

Madre mía que título bueno me ha quedado :)

Esto es una nota mental y puede que si no sabes de que hablo no te interese y si sabes de que hablo ya lo sepas.

Intento sustituir una parte de un String por otra parte que se encuentra en el mismo String.

Es decir, tengo esto “me gusta el heavy y no me gusta el country” y quiero obtener esto otro “me gusta el country y no me gusta el heavy”.

Se puede hacer así:

>> "me gusta el heavy y no me gusta el country".gsub( /me gusta (.*) y no me gusta el (.*)/, 'me gusta \2 y no me gusta el \1' )
=> "me gusta country y no me gusta el el heavy"

Donde \1 y \2 son las ocurrencias de los (.*).

El ejemplo puede parecer un poco tonto, pero esta utilidad me ha venido muy bien para quedarme con el contenido de una etiqueta html:

>> "<body>contenido</body>".gsub( /.*<body[^>]*>(.*)<\/body>.*/mix, '\1' ).strip
=> "contenido"

Que se puede solucionar de muchas otras maneras pero esta me ha parecido la más sencilla.

Escribo esta nota mental por lo poco intuitivo que es el uso de ‘\1′ como cadena sustitutiva pues se supone que las cadenas entre comillas simples no se interpretan…

Otra cosa es que google siempre me llevaba a soluciones como esta:

>> "me gusta el heavy y no me gusta el country".gsub( /me gusta (.*) y no me gusta el (.*)/, "me gusta #{$2} y no me gusta el #{$1}" )
=> "me gusta country y no me gusta el el heavy"

Y aunque parece que funciona no es así porque los contenidos de $1 y $2 los ha cogido del gsub anterior y no de éste:

>> "me gusta el musical y no me gusta el flamenco".gsub( /me gusta (.*) y no me gusta el (.*)/, "me gusta #{$2} y no me gusta el #{$1}" )
=> "me gusta country y no me gusta el el heavy"
>> "me gusta el musical y no me gusta el flamenco".gsub( /me gusta (.*) y no me gusta el (.*)/, "me gusta #{$2} y no me gusta el #{$1}" )
=> "me gusta flamenco y no me gusta el el musical"
Sábado, Agosto 30th, 2008

Ruby, sanitizando tus títulos en 2 líneas.

Ayer me acosté super contento, había conseguido escribir una función para sanitizar strings, o como dicen por ahí: crear un SLUG (que todavía no he encontrado la definición exacta).

Si no sabes de que hablo se trata de convertir un “Hola mundo!, qué tal?” en un “hola-mundo-que-tal” para las URLS bonitas y todo eso.

No había sido fácil pues Ruby se lleva mal con los caracteres no-ASCII y el castellano tiene muchos, había que hacer un pequeño malabarismo con la gema Unicode.

Al final mi función se veía así:

require 'unicode'
def to_slug( sentence, length = 64 )
  return if sentence.blank?
 
  wrong = ['á','é','í','ó','ú','ä','ë','ï','ö','ü','à','è','ì','ò','ù','ñ','ç','º','ª','_']
  right = ['a','e','i','o','u','a','e','i','o','u','a','e','i','o','u','n','s','o','a','-']
 
  sentence = sentence[0..length-1]
  sentence = Unicode.downcase( sentence )
 
  for i in 0..wrong.size-1
    sentence.gsub!( wrong[i], right[i] )
  end
 
  sentence.gsub!( /[^a-z0-9-]/, '-' ) # not letters of numbers
  sentence.gsub!( /-{2,}/, '-' )      # 2 or more '-' together becoming 1 '-'
  sentence.gsub!( /^-|-$/, '' ) unless sentence.size == 1 # '-' at begging or at end
  sentence
end

Estaba super orgulloso hasta que me despierto por la mañana y cambiando la pregunta a Google me encuentro con un… ‘inombrable’ que me hace esto:

require 'unicode'
def to_slug
  str = Unicode.normalize_KD(self).gsub(/[^\x00-\x7F]/n,'')
  str = str.gsub(/\W+/, '-').gsub(/^-+/,'').gsub(/-+$/,'').downcase
end

Exactamente (casi) lo que yo tenía pero en 2 líneas.

¡Así es Ruby!

Al final he hecho algún cambio y cogido lo bueno de uno y de otro y le he añadido soporte para STOPWORDS:

STOPWORDS = [
  'de','a','que','no','tiene','en','para',
  'por','le','la','lo','las','los','el',
  'una','un'
]
 
def to_slug( length = 64, drop_stopwords = false )
  return "" if self.length == 0
 
  str = Unicode.normalize_KD(self).gsub(/[^\x00-\x7F]/n,'').downcase
 
  # stopwords
  if drop_stopwords
    STOPWORDS.each do |stopword|
      str.gsub!( /\s#{stopword}\s|^#{stopword}\s/, ' ' )
    end
  end
 
  str = str.gsub(/[^A-Za-z0-9]/, '-').gsub(/^-+/,'').gsub(/-+$/,'').downcase
  str = str[0..length-1]
end

Por su puesto que se recomienda completar la lista de STOPWORDS con las que quieras.

Jueves, Agosto 28th, 2008

Ruby, el ‘print’ necesita que hagas un flush del $stdout

No conseguía hacer un indicador progresivo de un proceso, o lo que es lo mismo: el típtico ‘punto… punto… punto…‘ para indicar que el proceso sigue en marcha.

Si utilizada puts o p se me generaba un salto de carro al final de cada ‘punto‘. Y si utilizaba ‘print‘ simplemente no salía nada hasta que cancelaba el proceso… o terminaba.

Estaba claro que ‘print‘ estaba insertando los ‘puntos‘ en un bufer y había que ‘flusearlo‘.

La solución:

print '.'; $stdout.flush

Mira aquí y aquí.

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.