miércoles, 6 de agosto de 2008

Escalado proporcional de imágenes con attachment_fu

Por defecto attachment_fu (y su predecesor acts_as_attachment), no escalan las imagenes proporcionalmente al pasarles el parámetro :resize_to, sino que simplemente cambian el ancho y alto a los valores del parámetro.

En attachment_fu, para que escale es tan simple como usar un 'geometry string'. En este test se pueden ver varios ejemplos de escalado

http://github.com/technoweenie/attachment_fu/tree/master/test/geometry_test.rb

así que si queremos tener un tamaño máximo de 200 x 200 pondremos

has_attachment :resize_to => "200x200>"


En el caso de acts_as_attachment, no tenemos esa posibilidad, pero el cambio para que escale es muy simple. En el fichero

vendor/plugins/acts_as_attachment/lib/technoweenie/acts_as_attachment/instance_methods.rb

Dentro del método attachment_data cambiamos

thumbnail_for_image(img, attachment_options[:resize_to])

por

size = attachment_options[:resize_to]
if size.is_a?(Array)
size_ratio = size[0].to_f / size[1].to_f
ratio = img.columns.to_f / img.rows.to_f rescue 0
large_width = (ratio > size_ratio or ratio == 0) ? size[0] : size[1]*ratio
large_height = (ratio < size_ratio or ratio == 0) ? size[1] : size[0]/ratio
size = [large_width, large_height]
end
thumbnail_for_image(img, size)

Y ya escala proporcionalmente. Este trozo de código podría ser más elegante, tal y como esta hecho en

http://github.com/technoweenie/attachment_fu/tree/master/lib/geometry.rb

Pero bueno, ese código lo tengo hecho hace tiempo y funciona :-)

miércoles, 30 de julio de 2008

foreign key migrations

Hoy acabo de darme cuenta por n-esima vez, y no escarmiento, de que a veces es importante leer antes de ponerse a hacer las cosas.

Me he instalado el plugin Foreign Key Migrations y me daba este error en el db:migrate

rake aborted!
undefined method 'name' for #
C:/projects/f2f/community/vendor/plugins/foreign_key_migrations/lib/red_hill_consulting/foreign_key_migrations/active_record/connection_adapters/table_definition.rb:16:in 'column'
C:/projects/f2f/community/vendor/plugins/foreign_key_migrations/lib/red_hill_consulting/foreign_key_migrations/active_record/connection_adapters/table_definition.rb:11:in 'primary_key'
C:/projects/f2f/community/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb:96:in 'create_table'


Al principio he pensado que era culpa de que era cosa de que lo he instalado en Rails 2.1.0 y después de perder un buen rato depurando y buscando donde estaba definido el metodo name de TableDefinition, la solución era tan simple como leerse la página del plugin:

Dependencies

  • RedHill on Rails Core (redhillonrails_core).

Y efectivamente, despues de instalar RedHill on Rails Core ya funciona.... que penita....

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.

martes, 8 de julio de 2008

Tag Cloud Widget

No me gusta nada como se muestran por defecto los tags, simplemente en un listado, me gustá más la opción de mostrar un Tag Cloud

Y en Compender he encontrado la solución que ya he puesto en este blog :-)

http://www.compender.com/2007/12/simple-tag-cloud.html

viernes, 27 de junio de 2008

Error 501 Syntactically invalid HELO argument(s) en envío de mails

Enviando una newsletter me he encontrado con que un servidor rechazaba los mails con el mensaje de error:

Error 501 Syntactically invalid HELO argument(s) en envío de mails

Investigando un poco parece ser que el problema es que el nombre de servidor que tenía definido en /etc/hosts tenía un _ y tal y como cuentan aquí no cumple el estandar RFC2821

To promote interoperability and consistent with long-standing
guidance about conservative use of the DNS in naming and applications
(e.g., see section 2.3.1 of the base DNS document, RFC1035 [22]),
characters outside the set of alphas, digits, and hyphen MUST NOT
appear in domain name labels for SMTP clients or servers. In
particular, the underscore character is not permitted. SMTP servers
that receive a command in which invalid character codes have been
employed, and for which there are no other reasons for rejection,
MUST reject that command with a 501 response.


Lo curioso es que practicamente ningún servidor hace esa comprobación, ya que sólo me ha pasado con un dominio.

Y para acabar una demostración del problema:

telnet mailin.blueyonder.co.uk 25
Trying 195.188.53.99...
Connected to mailin.blueyonder.co.uk.
Escape character is '^]'.
220 exim9.blueyonder.co.uk ESMTP Exim 4.68 Tue, 17 Jun 2008 07:54:52 +0100
helo prueba_1
501 Syntactically invalid HELO argument(s)
8 Tue, 17 Jun 2008 07:46:24 +0100
helo prueba
250 exim13.blueyonder.co.uk Hello prueba