Mostrando entradas con la etiqueta ruby. Mostrar todas las entradas
Mostrando entradas con la etiqueta ruby. Mostrar todas las entradas

jueves, 25 de agosto de 2011

Borrando imágenes no usadas en un proyecto Rails

Para acabar el rediseño de un proyecto, estoy en la fase final de limpieza de código y me he encontrado que habían muchísimas imágenes antiguas que ya no se utilizan

En lugar de ir buscando una por una si se usaba, que me iba a llevar demasiado tiempo, he hecho un script en ruby que busca las imágenes no usadas y las borra de subversión:


images = Dir.glob('public/images/*')

images.each do |image|
  unless File.directory?(image)
    puts "Checking #{image}..."
    if IO.popen("ack-grep -1 -G '(app|public)' --ruby --html --css #{File.basename(image)}").eof?
      IO.popen("svn delete #{image}")
      puts " Deleted"
    end
  end
end

Es tan simple como buscar todas las imágenes del directorio images y aplicar sobre cada una de ellas un ack-grep que me busca en ficheros de ruby (.rb, .erb), html y css de los directorios app y public. El párametro -1 hace que al encontrar el primer resultado deje de buscar, con lo que conseguimos que vaya un poco más rápido.

Luego, sobre cada una de las imágenes no usadas hace un svn delete y ya solo nos queda revisar la lista de borrados para asegurarnos de todo ha ido bien y un commit al repo.

La modificación para que busque tambien en subdirectorios de images sería  usar 'public/images/**' como parametro en Dir.glob y igual de simple sería cambiarlo para que use git, cambiando la llamada del segundo IO.popen

Pues nada, aquí dejo el gist con el script para quien le pueda ser de utilidad.



jueves, 3 de junio de 2010

Euruko 2010


Para no perder la costumbre, como cada vez que voy a una conferencia, unas notas sobre la European Ruby Conference de este año, que ha sido en Cracovia.


En cuanto a las charlas, por citar unas cuantas, son destacables:
- El keynote tardío de Matz
- Jose Valim con una charla algo filosófica sobre cuando usar DSL
- Karel Minařík, hablando sobre como enseñar a programar usando ruby
- Sven Fuchs explicando las novedades de i18n en Ruby
- Jason Goecke y su presentación de Tropo, para añadir voz a las aplicaciones
- Piotr Szotkowski y profiling en Ruby 1.9
- Florian Hanke que está desarrollando un buscador en ruby
- Florian Glicher contando como funciona el Character encoding in Ruby 1.9

(tengo que añadir links a todas las charlas, los añadiré en breve...)  Los vídeos de las charlas están publicados en Vimeo


La representación española estuvo en las lightning talks, a cargo de javi, que nos contó como documentar usando las plantillas de las rails guides y anunció que la Conferencia Rails de este año será en inglés, invitando a participar a los asistentes y de fernando guillén, con una de las presentaciones más aplaudidas y divertidas de toda la conferencia hablando de un juego que hizo con gosu

Y de las que no vi, que fueron pocas, me supo mal perderme la de Tomasz, que dio una gran charla el año pasado

He encontrado estas notas de @cypher sobre el primer y segundo día donde hay un resumen bastante completo de las conferencias



Y comparando con Euruko 2009, me han gustado menos las charlas, el año pasado fueron mucho más variadas y tocaron muchos temas. En cambio, en las de este año, en casi todas tenía la impresión de que aunque ninguna hablaba de rails, casi todo era aplicable a rails, por lo que me llevo la sensación de que ha sido más monotemática, aunque no lo parezca por los contenidos.

Tampoco me gustó que no se publicará ninguna información sobre las charlas aparte del título, aunque sólo había un track y no se podía elegir charlas, siempre es interesante saber de que van a ir...

En cambio, las actividades 'extraescolares' fueron bastante mejores, con zumos, bebida y comida disponibles prácticamente durante todo el día, las conferencias en el centro de la ciudad de forma que nos pudimos mover a pie durante todo el fin de semana y un gran ambiente nocturno, donde el triunfador absoluto fue el Jazz Rock Cafe

Nos vemos en Berlin el año que viene en la Euruko 2011

lunes, 11 de mayo de 2009

Euruko 2009

Este fin de semana, junto a otros 250 desarrolladores he estado en la EuRuKo en Barcelona.

Hasta ahora mi relación con Ruby ha sido siempre en desarrollo web y asociado a Rails. Lo que más me ha gustado es ver como Ruby es mucho más que eso. Prácticamente ni se ha nombrado a Rails en toda la conferencia y hemos visto otras interesantes aplicaciones.

Con ruby se pueden hacer juegos con Gosu y Chipmunk como explico Javi en una de las conferencia más aplaudidas, se pueden procesar imágenes, hacer aplicaciones de telefonía con Adhearsion, desarrollos multiplataforma para móviles con Rhodes, hacer música de esa que yo nunca escucharía con Aarchaeopteryx, ....

Además tuvimos la keynote de Matz, una introducción a Cucumber por el padre de la criatura que me ha venido muy bien porque voy a empezar a usarlo en breve, y como broche final una impresionante y metálica introducción a D y a RuDy por Tomasz Stacheviwz , sin olvidarnos de las Lighting Talks.

En resumen, vuelvo con la sensación de que la conferencia ha valido la pena y con las pilas puestas para seguir aprendiendo y hacer las cosas un poco mejor día a día.

lunes, 29 de diciembre de 2008

Código duplicado en Ruby

En mi anterior trabajo, las raras veces que entre reunión y documento y reunión me dejaban trabajar un rato, una de las herramientas imprescindibles para mi en Netbeans era PMD, tanto para detectar errores como para intentar hacer mejor código.

Netbeans da algunas sugerencias de código en Ruby, subraya las variables no usadas, pone en negrita las variables/métodos no definidos,... pero todavía le falta para llegar al nivel de PMD en Java.

He estado buscando a ver si hay algo parecido para Ruby y dentro de PMD he encontrado que tiene un módulo para detectar código duplicado: Copy paste detector que se puede ejecutar desde linea de comando o usando Java Web Start.

Dependiendo del tamaño del bloque repetido a buscar a veces da un

java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.get(Unknown Source)
at net.sourceforge.pmd.cpd.SourceCode.getSlice(SourceCode.java:133)
at net.sourceforge.pmd.cpd.MatchAlgorithm.findMatches(MatchAlgorithm.java:84)


Pero jugando un poco con el tamaño funciona y he encontrado unos cuantos trozos de código a refactorizar :-)

Y como ejemplo, la salida que da al ejecutarlo sobre el directorio rails. Con un tamaño de chunk menor de 60 da la excepción anterior, pero con un tamaño mayor funciona bien, y sólo encuentra duplicados en los test y en ficheros de zonas horarias, así que parece que por lo que respecta a código duplicado, rails está bien hecho :-)


jueves, 11 de diciembre de 2008

Curioso comportamiento de nil.id

En un trozo de código similar a este:

user_id = User.find_by_email(email).id rescue nil
if user_id.nil?
....


Me he vuelto a encontrar otra vez con un curioso comportamiento. En desarrollo funciona bien, pero en producción devuelve un user_id incorrecto en lugar de un nulo cuando el usuario no existe.

Es debido la forma de acceder del objeto nil a su atributo id. En modo desarrollo devuelve una excepción, pero en cambio en modo producción, sólo da un warning

$ ruby script/console
Loading development environment (Rails 2.1.2)
>> nil.id
RuntimeError: Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id
from (irb):1
>> exit
$ ruby script/console production
Loading production environment (Rails 2.1.2)
>> nil.id
(irb):1: warning: Object#id will be deprecated; use Object#object_id
=> 4


La solución es muy simple, o acceder al objeto a traves de []

user_id = User.find_by_email(email)[:id] rescue nil
if user_id.nil?
....


o acceder al id despues de comprobar el nil

user = User.find_by_email(email)
if user.nil?

Es algo trivial, pero a ver si escribiéndolo no me vuelve a pasar... :-p

viernes, 18 de julio de 2008

Exportar a excel desde ruby

Normalmente, la exportación a Excel la resuelvo simplemente creando un fichero csv con FasterCSV

csv_string = FasterCSV.generate do |csv|
# Aquí la generación del csv
end
send_data csv_string, :filename => 'nombre.xls'


Pero me he encontrado en una aplicación que el cliente pide directamente un Excel para evitar la pantalla de importar CSV. He encontrado estas alternativas:

  • Librerias Win32OLE, pero esta opción no me vale ya que el servidor es Linux
  • La gema Spreadsheet-Excel , que genera formato Excel 95
  • Generar una tabla HTML y ponerle las cabeceras de excel
  • Generar un XML para Excel 2003 tal y como cuentan en la wiki de rubyonrails
Al final la solución que he elegido es la última, practicamente ha sido un copy-paste del ejemplo añadiéndole un nuevo estilo en negrita:

xml.Style 'ss:ID' => 'Header' do
xml.Font 'ss:Bold' => '1'
end

Y aplicar ese estilo a las celdas de la cabecera

xml.Cell 'ss:StyleID'=>'Header' do


El único problema que me he encontrado es que OpenOffice no reconoce un .xls en formato XML, así que para abrirlo con Calc, hay que renombrarlo a .xml. Con Office se abre sin problemas.

lunes, 9 de junio de 2008

indice TIOBE de lenguajes de programación

Hace un tiempo que todos los meses miro el indice TIOBE. El método que utilizan puede ser discutible, pero es una forma de saber las nuevas tendencias y ver hacia donde se mueven los lenguajes de programación.

Una conclusión clara es que los lenguajes dinámicos poco a poco van ganando terreno, entre ellos Ruby (que me da de comer actualmente) y Python, al que le echaré un vistazo en cuanto tenga tiempo...

También mirando este índice te enteras de lenguajes como Lua, que está subiendo con fuerza, sobre todo en el mundo de los juegos

Y finalmente como curiosidad han quitado ColdFusion de la lista desde el mes de Mayo, ya que no lo consideran un lenguaje, sino un framework asociado al lenguaje CFML /CFScript y se están planteando lanzar una lista similar basada en frameworks de desarrollo (ASP.NET, ColdFusion, Ruby on Rails, Django, Groovy...). Estaremos atentos a ver que sorpresas nos da esta nueva lista.