sábado, 31 de mayo de 2008

Ruby-debug wn Windows

Ayer, para echar una mano con una aplicación RoR, me tuve que instalar la gema ruby-debug. Una vez instalada junto con linecache y alguna otra, al arrancar el serviddor obtenía el siguiente mensaje.

c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require': no such file to load -- c:/ruby/
lib/ruby/gems/1.8/gems/linecache-0.42-x86-mswin32/lib/../ext/trace_nums (LoadError)
 from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
 from c:/ruby/lib/ruby/gems/1.8/gems/linecache-0.42-x86-mswin32/lib/tracelines.rb:8
 from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require'
 from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
 from c:/ruby/lib/ruby/gems/1.8/gems/linecache-0.42-x86-mswin32/lib/linecache.rb:63
 from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require'
 ...

Para no predicar con el ejemplo, decidí preguntarle a Google antes de mirar nada. Y aquí encontré la respuesta.

Cambiando

require File.join(@@SRCDIR, '..', 'ext', 'tracenums')

por

require File.join(@@SRC_DIR, '..', 'ext', 'extconf.rb')

en c:\ruby\...\1.8\gems\linecache-0.42-x86-mswin32\lib\tracelines.rb, todo arreglado.

Gracias Matt. Tómate algo.

lunes, 26 de mayo de 2008

MySQL cambiando el nombre a una tabla

Acabo de cambiar el nombre a una tabla en una base de datos MySQL. El caso es que lo he intentado hacer de memoria y no he sido capaz. Gañanismo congénito.

Weno, pues aquí dejo apuntadas un par de posibilidades que he encontrado:

ALTER TABLE <tbl_name> RENAME TO <new_tbl_name>

y

RENAME TABLE <tbl_name> TO <new_tbl_name>

Me pongo una tira negra en los ojos y reconozco que ignoraba la existencia del comando RENAME como renombrador de tablas.

Salud y mucho rocanrol!

martes, 20 de mayo de 2008

Web Services: mensaje con formato

N veces he tenido que desarrollar conectores contra un web service utilizando las clases SOAP de Ruby y las N he necesitado ver los mensajes que se envían con un formato decente. Lo mejor que se me ha ocurrido ha sido sacar una traza desde soap/rpc/proxy.rb.

En envío lo realiza el método route

conn_data = @streamhandler.send(@endpoint_url, conn_data, reqopt[:soapaction])

Justo antes pondremos la traza, por ejemplo, por consola

puts conn_data.send_string

Salud y rocanrol!

jueves, 15 de mayo de 2008

Internet Explorer: versiones viejunas

En este post se comentan posibles formas de probar las versiones antiguas de Internet Explorer. Yo he optado por la tercera: actualizar a Internet Explorer 7 e instalar Multiple IE.

Al arrancar las versiones antiguas de Internet Explorer se produce algún que otro error y también casca espúreamente el javascript de las páginas, pero para ver cómo se comportan es más que sufuciente.

He dicho alguna vez que Internet Explorer 6 es el peor navegador de la historia con diferencia? Nunca escribo palabras feas y hablando de IE6 tengo que contenerme.

Como siempre, salud y rocanrol!

miércoles, 7 de mayo de 2008

La caché (I) - revisited

Comenta mi amigo Xavi a mi anterior post que las peticiones Ajax, como cualquier otra petición http realizada desde un navegador pueden ser tanto POST como GET. Y no le falta razón.

Tirando del hilo llegamos a prototype.js donde el objeto básico para las peticiones Ajax tiene un parámetro de configuración donde indicarle con qué método se hace la petición (por defecto, POST):

Ajax.Base = Class.create({
 initialize: function(options) {
  this.options = {
   method: 'post',
   asynchronous: true,
   contentType: 'application/x-www-form-urlencoded',
   encoding: 'UTF-8',
   parameters: '',
   evalJSON: true,
   evalJS: true
  }; ...

El parámetro termina llegándole al objeto Ajax.Request que es el en cargado de hacer las peticiones en función del método, el navegador, etc.

Esta vez he sido yo el que ha caído en el assume.

Malditos roedores!!!

martes, 6 de mayo de 2008

La caché (I)

Llevo algunos días viendo cosillas básicas de la caché de Rails. En concreto, he estado intentando cachear el resultado de una acción solicitada por Ajax cuyo resultado es renderizado por un archivo rjs. Y no ha habido manera. Hasta que recordando los tiempos en los que el 90% de mi tiempo lo dedicaba a depurar código Java sobre la plataforma Banksphere (todos tenemos un pasado oscuro) me metí un poquito en el código y llegué a caching.rb.

 private
  def caching_allowed
   request.get? && response.headers['Status'].to_i == 200
  end

Así que, por defecto, si una petición no se hace por GET no se cachea. Y las peticiones Ajax son POST de tó la vida.

Confiando un poquito más en el programador podemos cambiar la condición de cacheo por

 (request.get? || request.xhr?) && response.headers['Status'].to_i == 200

de forma que las peticiones Ajax, aún no siendo GET puedan cachearse.

Otro funcionamiento que no me convence es que el archivo cacheado se genera siempre y con extensión HTML. Entiendo que, una vez enganchado el resultado del cacheo (esto se podrá decir en castellano de algún modo mejor, no?) el hecho de que se genere siempre el archivo será irrelevante, pero se puede escribir una condición extra al método cache_page para que si el archivo existe no lo escriba:

  return if File.exists?(page_cache_path(path))

Respecto a que el archivo cacheado tenga extensión HTML creo recordar que se puede solucionar en la configuración de Apache, indicándole que el contenido de ciertos directorios se sirva como javascript, pero esto tengo que verlo.

Salud y rocanrol!