Archive for the ‘Ruby’ Category

Comunidad

Viernes, Junio 12th, 2009

Es empezar con un nuevo lenguaje, framework,… cualquier cuestión vale y una super “L” de novato aparece en nuestra cara, en todo lo que escribimos o preguntamos. Pero durante este aprendizaje tenemos la suerte de poder tomar prestados shorcuts que nos ofrece la desinteresada comunidad y que han hecho nuestros novicios desarrollos bastante más llevaderos.

Por ello, ahora que la experiencia empieza a ser un grado, me he propuesto devolver dicho préstamo con la misma moneda: con tutoriales, screencasts y plugins. Esperemos estar a la altura, el reto no es sencillo =)

Usa << en lugar de +=

Miércoles, Marzo 25th, 2009

Si no lo veo no creo, me dije.

$ time ruby -e 'a = "A"; 100000.times { a << "A" }'

real	0m0.097s
user	0m0.068s
sys	0m0.004s
$ time ruby -e 'a = "A"; 100000.times { a += "A" }'

real	0m10.123s
user	0m3.273s
sys	0m6.534s

Leido en un tweet y en esta entrada en profundidad.

Ruby vs Nordri: Dirs

Lunes, Mayo 19th, 2008

Ahí va mi pequeña aportación al reto de nordri. Pronto el script-peliculero..

require 'pathname'
require 'fileutils'

PATH = "/tmp/mnt"
TARGET = "/tmp/target"

def listado(path)
  Pathname.new(path).find do |x|
    file = "#{TARGET}#{x.to_s.split(path)[-1]}" # Obtengo el path relativo
    FileUtils.mkdir(file) if x.directory? && file != TARGET
    FileUtils.touch(file) if x.file?
  end
end

FileUtils.rm_rf(TARGET) if FileTest.exists?(TARGET)
FileUtils.mkpath(TARGET)

listado(PATH)

Nota: Tengo que meter un coloreador de código.

Actualización: Script-Peliculero

He envidiado Python que parece que el metodo isdir  identifica los directorios “.” y “..” como non-directorios reales. Por lo demás, no me he complicado nada la vida traduciendo tan solo el código original de nordri, del que voy sacando alguna conclusión: Ruby y Python son muuuuy parecidos (cosa que ya habia oido 1001 veces).

Empezando con Ruby: Core Classes

Domingo, Mayo 18th, 2008

Como explico en el blog menos pretencioso de la historia empiezo con nueva sección, que parte de la iniciativa de Jordan Fowler y del que iré tomando las ideas (a igual que con las novedades de Rails). Vamos allá.

Antes de nada, instalarnos Ruby es lo que toca, aunque también existe la opción interprete online para trastear un ratín. En fin, que si todo ha ido bien deberíamos tener disponible un maravilloso interprete (IRB) donde probar nuestras primeras sentencias Ruby.

$ irb
irb(main):001:0> puts "Hola mundo!"
Hola mundo!
=> nil

Si sois capaces de sacar por pantalla esto, ya no hay más historias. Acceder ya a la documentacion oficial RDoc Documentation for Core Classes será el pan de cada día, aunque a muchos de los que nos conozco les sale ulticaria cuando ven el sistema de ordenación que genera RDoc. Suelen optar por opciones más usables, como gotapi o noobkit. Por último, también podemos acceder a la documentación desde nuestra terminal:

$ ri Array
$ ri Array#select

Primera incursión…

 Object.constants.select { |c| Object.const_get(c).is_a?(Class) }.sort

… que paso a explicar. La clase Object, como en otros lenguajes, es la clase raiz en Ruby de la que todo surge. Utilizando Object.constants obtenemos una Array con todas las clases, modulos, constante,… que cuelgan de dicha clase. Para poder obtener solo las clases deberemos obtener instancias de las cadenas que hemos obtenido; el metodo const_get nos ayudará con dicha tarea..

irb(main):001:0> Object.const_get("Array").new
=> []

Guay, no? Hemos podido crear un Array con la cadena “Array”. Siguiendo con la sentencia original, lo unico que nos queda es filtrar las constantes que son del tipo Class y asi obtener las 65 core classes de las que dispone la clase Object en Ruby.

=> [“ArgumentError”, “Array”, “Bignum”, “Binding”, “Class”, “ConditionVariable”, “Continuation”, “Data”, “Dir”, “EOFError”, “Exception”, “FalseClass”, “File”, “Fixnum”, “Float”, “FloatDomainError”, “Hash”, “IO”, “IOError”, “IndexError”, “Integer”, “Interrupt”, “LoadError”, “LocalJumpError”, “MatchData”, “MatchingData”, “Method”, “ModelProxy”, “Module”, “Mutex”, “NameError”, “NilClass”, “NoMemoryError”, “NoMethodError”, “NotImplementedError”, “Numeric”, “Object”, “Proc”, “Queue”, “Range”, “RangeError”, “Regexp”, “RegexpError”, “RubyLex”, “RuntimeError”, “SLex”, “ScriptError”, “SecurityError”, “SignalException”, “SizedQueue”, “StandardError”, “String”, “Struct”, “Symbol”, “SyntaxError”, “SystemCallError”, “SystemExit”, “SystemStackError”, “Thread”, “ThreadError”, “ThreadGroup”, “Time”, “TrueClass”, “TypeError”, “UnboundMethod”, “ZeroDivisionError”

Pronto más.