Dagi3d v4

Convertir ficheros m4a a mp3 con ruby

Buscando cómo convertir  los ficheros de audio en formato m4a a mp3 bajo linux, vi que la solución más común era realizar un script en bash que se encargase de llamar a los programas mplayer y lame.
El problema es que si bien las soluciones que proponían eran totalmente funcionales, los scripts en bash siempre me han parecido un tanto crípticos, así que me decidí a implementar uno en ruby(el próximo paso será utilizar wxRuby para seguir trasteando y añadirle una interfaz al frontend):
#!/usr/bin/env ruby

if ARGV.length < 2
puts "usage: #{File.basename(__FILE__)} <source dir> <target dir>"
exit(1)
end

src = ARGV[0]
target = ARGV[1]

if !File.exist?(src) || !File.readable?(src) || !File.directory?(src)
puts "#{src} access denied"
exit(1)
end

if !File.exist?(target) || !File.writable?(target) || !File.directory?(target)
puts "#{target} access denied"
exit(1)
end

src_dir = Dir.new(src)

src_dir.entries.each do |entry|

src_file = File.join(src, entry)

if File.extname(src_file).downcase == ".m4a"

target_file = File.join(target, File.basename(src_file).gsub(/\.m4a$/i, ""))
puts "Converting #{src_file}"

%x(mplayer -ao pcm:file="#{target_file}.wav" "#{src_file}")
%x(lame -h -b 192 "#{target_file}.wav" "#{target_file}.mp3")
File.delete("#{target_file}.wav")
end

end
Tan sólo hay que indicarle al script en el primer parámetro el directorio origen que contiene los ficheros m4a, y como segundo parámetro dónde queremos que se generen los ficheros mp3.

Según Google, las matemáticas son peligrosas

Buscando a través de Google la definición de 'rango de una función'  para mi clase de álgebra encontré una página que parecía tener la solución(se trataba del primer resultado que mostraba). Hasta ahí todo normal si no fuese porque Google me advertía que visitar dicha página podría dañar mi equipo:

google badware


Lo raro es que dicha página no contenía nada que pudiese sugerir un intento por colarme bichitos en mi equipo ya que no había nada de javascript ni ningún applet de java  ni nada extraño. Supongo que Google entendió que el álgebra lineal puede ser peligroso, así que andaos con mucho ojo.  face-smile.png
 

Clases abstractas en ruby

Mientras seguía trasteando con ruby me percaté de que no existen determinadas características de la programación orientada a objetos que sí ofrece Java como son las clases abstractas. Así que como siempre, para seguir aprendiendo me puse a picar un poco de código para poder utilizar dicha funcionalidad en mis clases.

Como quería poder definir cualquier clase como abstracta de manera más o menos transparente, lo único que tenía que hacer era añadir un poco de código extra a la clase Class que aportase las siguientes funciones:
- Poder marcar una clase como abstracta.
- Poder definir dentro de la clase qué métodos serán abstractos.
- Lanzar una excepción en caso de instanciar una clase abstracta.
- Lanzar una excepción si se implementó un método abstracto dentro de la clase abstracta.
- Lanzar una excepción si no se implementaron los métodos abstractos heredados de la clase abstracta.

Y esta es la solución a la que llegúe: http://svn.dagi3d.net/rails/abstract_class/trunk/lib/abstract_class.rb

Para marcar una clase como abstracta, basta con llamar al método abstract_class y para definir un método como abstracto, a abstract_method :método:

class Foo
abstract_class
abstract_method :foo
end

# clase concreta
class Bar < Foo
def foo
end
end

Por si a alguien le interesa, el código está disponible en un repositorio de subversion en http://svn.dagi3d.net/rails/abstract_class/trunk/ y una gema ya preparada para instalar en http://dagi3d.net/temp/abstract_class-0.1.0.gem