attachment_fu s3 uploads with backgroundjob

Publicado por jorge

Thanks to Jon Guymon for his article bj-makes-attachment_fu-happy that really help me solve a problem I was having with mongrel.

Attachment_fu + s3 sometimes do very weird things that makes mongrel to freeze. After a lot of googling I realize that the best solution to avoid problems was to do the uploads to S3 in a background proccess apart from mongrel.

I started with Jon Guymon approach and it worked well but i needed to create thumbnails and the local files to be deleted after the uploading to S3 was finished.

Just changing the part of attachment_fu that actually uploads the file to S3 do the trick.

Open vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/backends/s3_backend.rb and change the method save_to_storage to background the uploads.

This is the original method:

def save_to_storage
   if save_attachment?
     S3Object.store(
     full_filename,
     (temp_path ? File.open(temp_path) : temp_data),
     bucket_name,
     :content_type => content_type,
     :access => attachment_options[:s3_access]
     )
     @old_filename = nil
     true
   end
end

In my version I copy the file to a temporary directory in tmp/s3uploads (just to make sure the file does not disappear) then I add the upload task to the background queue

def save_to_storage
   if save_attachment?
    my_temp_file = RAILS_ROOT+'/tmp/s3uploading/'+"#{rand Time.now.to_i}#{filename || 'attachment'}"

     if temp_path
     File.open(my_temp_file,"w+") do |tmp|
     tmp.close
     FileUtils.cp temp_path, tmp.path
     end
     else
     File.open(my_temp_file, "w+") do |tmp|
     tmp.binmode
     tmp.write temp_data
     tmp.close
     end
     fichero = RAILS_ROOT+'/tmp/s3uploading/' + "#{rand Time.now.to_i}#{filename || 'attachment'}"
     end
    
     Bj.submit("./script/runner ./jobs/s3_uploader.rb " +
     full_filename + " " +
     my_temp_file + " " +
     bucket_name + " " +
     content_type + " " +
     attachment_options[:s3_access].to_s
     )
     end

     @old_filename = nil
     true
  end
end

This way attachment_fu will spawn a task for every file it creates.

Now edit the file Jon Guymon created to handle the upload (jobs/s3_uploader.rb)

This is how my file looks like

Base.establish_connection!(:access_key_id => ACCESS_KEY,
:secret_access_key => SECRET_KEY)

S3Object.store(ARGV[0],
File.open(ARGV[1]),
ARGV[2],
:content_type => ARGV[3],
:access => ARGV[4]
)

File.delete(ARGV[1])

A simple upload to S3 and after finishing it I delete the temporary file created in tmp/s3uploads/

So far mongrel is doing its job with no more hangs and as a side effect users can uploads their files faster.

There are a lot of pages about backgrounding tasks and a good recipe in Rails recipes 2

Si la montaña no viene a Mahoma 2

Publicado por jorge

La función rand que incluye Firebird no funciona del todo bien y me devuelve resultados que distan mucho de ser aleatorios por lo que para ordenar los resultados de una consulta no me sirve:

select * from tabla order by rand()

Solución: dejar que la base de datos haga lo que mejor sabe hacer, devolver registros en el menor tiempo posible y emplear ruby para el orden.

resultados = find(:all, :limit => 10)
resultados.sort_by { rand }

ruby on rails firebird y problemas con insert

Publicado por jorge

He descargado la última versión del firebird-adapter desde gems.rubyonrails.org y cuando voy a insertar un registro me da un error diciendo que "insert is an abstract method".

Trasteando he visto que active-record-firebird-adapter-1.0.0 no tiene definido el método insert y lógicamente al heredar de abstract-record que si lo tiene pues se queja.

Realmente no se si es correcto que esto sea así pero yo lo he añadido de la siguiente forma:

def insert(sql, name = nil, pk = nil, id_value = nill, sequence_name = nill)
execute sql, name
end

Desde entonces los insert funcionan correctamente.

No estoy seguro al 100% de que esta forma sea la correcta y además me parece muy sospechoso que se hayan olvidado del método insert.. pero lo que es seguro es que haciendo esto todo funciona.

Si alguien tiene una explicación mejor que me la diga.

Css, javascript, rails y Kathy Sierra

Publicado por jorge

Comencemos con algunos enlaces interesantes:

Y por último un interesante artículo de Kathy Sierra.
Realmente todos sus artículos son muy interesantes y recomendables pero este me ha gustado especialmente. Habla sobre como nos tratan las compañías antes y después de comprar sus productos.

La diferencia que existe, por ejemplo, entre un catálogo donde se nos vende un producto (atractivo, colorido, seductor, interesante) y el manual de usuario que obtenemos una vez que lo hemos comprado (Confuso, aburrido, poco interesante).

La mayoría de empresas siguen a rajatabla este modelo: Ahora me vienen a la menta todas las compañías de telefonía que hay en España. Para captar usuarios todo son facilidades, atención preferente y buenas palabras. Una vez que has firmado el contrato con ellos todo son problemas, atención al usuario muy deficiente y dificultades.

Sin embargo existen compañías que deciden apostar por una forma diferente de hacer las cosas y darle a los usuarios la importancia que tienen: toda ya que una empresa vive de ellos.
Citaré las dos que a mi juicio mejor lo hacen y en diferentes áreas: Apple y 37Signals.

Comprar cualquier producto de Apple es una experiencia muy agradable en todos sus pasos. Antes y después de comprarlo. Desde el folleto de venta hasta la apariencia del producto final y su uso. Cualquier detalle del producto es tenido en cuenta incluso el embalaje está pensado para que sea bonito, efectivo y sencillo de embalar/desembalar.

37 Signals tiene una serie de herramientas web que buscan que sus usuarios estén cómodos y satisfechos con ellas no solo al contratarlas sino durante todo su uso. Todo son facilidades para los usuarios: por ejemplo antes de comprar el producto se puede probar gratuitamente. Las condiciones alta y baja son sencillas, con un simple click puedes dar te de baja si no te interesa seguir empleando sus productos. Una vez que te has suscrito tienes a tu disposición diferentes formas de ayuda (videos explicativos, foros, email) para que puedas sacarle el máximo rendimiento a sus herramientas. Nosotros vamos a lanzar una herramienta para que las agencias inmobiliarias puedan crear sus propias webs y publicar sus inmuebles gratis y os aseguro que desde el primer momento hemos tenido como referente del buen hacer a 37Signals.

Accesibilidad, Tractis y rails

Publicado por jorge

Hoy doble ración de enlaces sobre accesibilidad:
Las normas que el gobierno de Holanda exige a todas sus webs me parecen lo mínimo que se debería exigir. ¿Para cuando aquí?.

Dos post de Digital web magazine con el título 7 errores de accesibilidad parte 1 y 7 errores de accesibilidad parte 2, aunque en mi opinión se mezclan conceptos de accesibilidad y usabilidad indistintamente.

Ahora hablo, otra vez, de Tractis y lo bien que en mi opinión están llevando adelante una iniciativa tan complicada como la suya.
No solo lo hacen bien sino que encima comparten su experiencia y conocimiento con los demás.

Y para acabar tres enlaces interesantes a revisar sobre rails:
SimplyPresentable
Rails/Informix
gettext_localize

Microformatos, empleo, portales inmobiliarios y Bill Gates

Publicado por jorge

A través de la web de Anieto2k llego a un artículo sobre la forma de dar estilo a nuestras hcards. Las hcards son una manera de emplear los microformatos para mostrar información. Si te preguntas que son los microformatos te diré que son una manera de aprovechar el xhtml existente para proporcionar más información a los visitantes de una página web. Mediante hcards podemos mostrar información sobre personas y lugares, con hCalendar sobre eventos y citas, etc...

En 37 Signals hablan sobre contratar a teletrabajadores. Se preguntan, y con razón, porqué vas a dejar de contratar a un buen candidato solo por el hecho de que no viva en tu cuidad o no pueda venir a trabajar a tus oficinas. Para mi es una de las grandes ventajas de nuestro tipo de actividad, poder contratar a gente basándote en el talento y no en la proximidad geográfica. Nosotros tenemos gente trabajando para nosotros en San sebastián, en Holanda y en Argentina. Diferentes horarios, diferentes idiomas incluso, pero nos comunicamos de maravilla y nos funciona estupendamente.

Reportaje sobre los portales inmobiliarios en España en el blog de Jesús Encinar.

Mike Arrington de Techcrunch habla sobre un encuentro de unos pocos bloggers con Bill Gates y comenta las impresiones del (le queda poco) jefazo de Microsoft sobre el futuro del DRM (Gestor de derechos de autor). Esas protecciones que se ponen a archivos de audio y video para limitar nuestros derechos. Me gusta sobre todo el comentario de que todos los invitados al encuentro llevaban portátiles Mac.

Y para finalizar los deberes del fin de semana: Leer el artículo de Rick Olson sobre ActiveResource, ahora que Rails 1.2 está a la vuelta de la esquina.

Tractis, tipografias, rails y herramientas

Publicado por jorge

Empezamos anunciando que Tractis acaba de lanzar su versión 2.0 Beta. Por si no los conoces Tractis es un gestor de contratos bien pensado, ideado y realizado. Me gusta mucho como han desarrollado su idea de negocio. Esto me demuestra que, incluso en el complicado mundo de las aplicaciones web, si tienes un buen producto y haces las cosas bien puedes salir adelante aunque residas en España (estoy seguro que si estuvieran en EEUU ya habrían recibido fuertes inversiones).

Un tutorial para añadir fuentes tipográficas de Windows a nuestro Ubuntu

Dos plugins para Rails:
Uno para fechas que nos permite comprobar cosas como "hoy", "ayer" y "mañana".
Este plugin nos crea unas tareas rake que nos permitirán automatizar crear/borrar/backup/restaurar una base de datos mysql

.

Publicidad, aplicaciones web, móviles...

Publicado por jorge

Una web que ofrece trabajos para diseñadores y programadores. Hay empleos a tiempo completo y en plan freelance.

Una gran extensión para Firefox, que una vez instalas ya no puedes vivir sin ella, está a punto de llegar a su versión 1.0. Descarga Firebug ya!.

Una idea útil: un conversor de mensajes de voz a texto. LLamas a un número y dejas un mensaje para uno o varios destinatarios. El sistema convierte tu mensaje a texto y envía un mensaje a los destinatarios (que si lo desean pueden elegir entre oír el mensaje o recibir el texto).

Nuevas utilidades para Google Earth. Ahora se integra con la Wikipedia y con Panoramio (una empresa española, por cierto) para presentar una mayor información sobre las zonas que visitas.
También, de la mano de Google nos llega una nueva característica de GMail: Poder leer cuentas de correo de otros operadores. Todas tus cuentas integradas en un único lector de correo.

En Ojobuscador publican unas gráficas del uso de buscadores en Europa. Domino aplastante de Google, Por un lado es un dato preocupante ya que todos sabemos lo malo que es el monopolio pero por otro lado si Google es quien mejor productos y servicios ofrece es lógico que sea el que más usuarios tiene.

¿Trabajas con Rails? Cuentaselo al mundo. También puedes mostrar tus aplicaciones hechas con Rails
Y para los que quieran descubrir o perfeccionar la forma de programar en Ruby no deben perdense The Rails Way (aunque debería llamarse The Ruby Way). Programar puede ser divertido y elegante!!.

Guerra de titanes: Publicidad en el sector de automóvil

Instalar Mongrel en Ubunto 6.06

Publicado por jorge

Instalar Mongrel en una Ubuntu 6.06 no es tan sencillo como teclear:
sudo gem install mongrel.
Si al escribir esto recibes un mensaje del tipo:
Building native extensions. This could take a while... extconf.rb:1:in `require': no such file to load -- mkmf (LoadError) from extconf.rb:1
Es que te falta el paquete ruby1.8-dev… vaya manía la de debian (y Ubuntu) de fragmentar ruby en tantos paquetes, siempre falta alguno cuando lo necesitas.
Para solucionarlo escribe esto:
sudo apt-get install ruby1.8-dev
Y a disfrutar.

Por cierto existe un artículo más completo que este mio (en inglés).

Webs ¿Líquidas o fijas? 1

Publicado por jorge

Cameron Moll habla en 2 artículos sobre la mejor forma de optimizar una web para distintas resoluciones de pantalla.

Resolver grandes problemas prestando atención a los pequeños

La continuación de un buen artículo: Las reglas del compromiso es la segunda parte de Porque el 50% no es lo suficientemente bueno. Los dos artículos hablan sobre porqué es más conveniente destinar esfuerzos de tiempo y dinero hacia tu comunidad de interés en lugar de gastarlo en publicidad y Page Rank.

Hoy hablan de eyeOS en Techcrunch. Hacía tiempo que no visitaba su web y me han recordado que es un proyecto muy interesante y muy bien concebido, no hay que perderlos de vista.

Termino con una revisión del plugin acts_as_taggable que añade utilidades como test, asignación de tags más eficiente y cálculo automático de nubes.

Más artículos: 1 2