attachment_fu s3 uploads with backgroundjob
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
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
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
Comencemos con algunos enlaces interesantes:
- Una chuleta con las propiedades de CSS: css cheat sheet
- Un editor inline en javascript: Edit Regions
- Una colección de efectos con Ajax: MiniAjax
- Los scripts que todo administrador de máquinas con rails neceista: Helpful Railsmachine Scripts
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
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
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
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...
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!!.
Instalar Mongrel en Ubunto 6.06
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
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