miércoles, 10 de diciembre de 2008

Mi última adquisición

Como últimamente no estoy muy inspirado para escribir sobre código, os voy a enseñar mi última adquisición.



'Y qué coj@#€¬~@ es eso', os preguntaréis?

Pues resulta que, si te sientas en el sofá, le das la vuelta al asunto y apoyas la parte acolchada en tus rodillas, puedes poner el portátil encima y picar cómodamente.

Si acaso, le veo una mejora: dos soportes laterales, uno para una cervecita y otro para unas aceitunas.

Salud y rocanrol!!!

En su tumba hay latas de cerveza.
Txus no bebas tanto, no pierdas la cabeza.
Txus no bebas tanto, no pierdas la cabeza.
No pierdas la cabeza, no pierdas la cabezaaaa!!!!.

jueves, 20 de noviembre de 2008

Conferencia Rails 2008 re-visited

He tardado varios días en pensar qué escribir acerca de la conferencia porque el viernes, cuando terminó y me fui a casa, estaba muy enfadado. Estaba menos enfadado que el jueves, pero enfadado al fin y al cabo. Mi pensamiento principal era me han tanga'o. Tal cual.

Está claro que me equivoqué en mis deseos para este año. Estuve conectado la mitad del tiempo que pasé en las conferencias, las charlas que vi sobre casos de éxito fueron desastrosas salvo la excepción de Fernando Echevarrieta presentando ideas4all y el corporativismo, como era de esperar estuvo en cada esquina de la facultad de teleco.

Y esto, EN MI OPINIÓN no fue lo peor. Hubo dos conferencias en las que estuve a punto de dormir y vi gente cuyos párpados superiores no resistieron la acción de la gravedad. Cierto es, que la baja luz que se utilizó en el Aula Magna no ayudó en nada y que en la parte superior del Salón de Actos te cocías vivo cual pulpo a feira. Pero esto no disculpa la baja calidad y preparación de algunas conferencias ni la intrascendencia en cuanto a contenidos de más de la mitad de ellas (recordemos, EN MI OPINIÓN). Incluso llegué a pensar que, para algunos ponentes, lo importante era aparecer en la foto y no otra cosa (insisto, EN MI OPINIÓN).

Pero no todo fue malo. La keynote de Xavi estuvo llena de datos interesantes. Las charlas de Sergio y Javi nos mantuvieron vivos la tarde del jueves. La keynote de la universidad, aún con pocos asistentes, me pareció interesante. Creo que Joaquín Salvachúa puede hacer interesante cualquier conferencia. Ya salvó del naufragio la del año pasado acerca de REST. Creo que Francesc debería de haber tenido algo más de tiempo para explicar su Typus. Finalmente, los chicos de BeBanjo mantuvieron el tipo y la keynote final de Obie Fernández nos hizo pensar un poco.

Seguro que me perdí cosas muy interesantes y el hecho de que yo no comparta todo el mensaje de esto es la ostia, semos los mejores, viva españa, via el rails igual me hace ser un poco más crítico. Pero pienso que la organización de la conferencia debería ser más selectiva a la hora de elegir qué conferencias se van a ofrecer. O a lo mejor es que no damos para más (el primero YO que no he presentado jamás una ponencia).

Salud y rocanrol!!!!

Sale a la calle una vez más con su rutina y su ansiedad.
Siempre actúa por inercia; ya no piensa en el porqué.
Con cara de lamento y sin haber dormido bien,
se presenta ante la ficha, su temido juez.
Reo del sistema a cambio de seguridad.
Cumple la condena del horario laboral.
Sigue soñando, esperando que algún día cambiará
su futuro con ese boleto escogido al azar.
Buscando, mirando, rodando por el suelo.
Buscando, mirando, rodando por el suelo.


martes, 11 de noviembre de 2008

Are you ready to rock?

La Conferencia Rails 2008 está al caer. Veremos qué se cuentan Javi en Rails Hot or Not, Jacobo en Harder, Better, Faster, Stronger y Obi & Xavi en sus keynotes.

Este año espero tres cosas de la conferencia:
  • Espero que los casos de éxito no se conviertan en charlas de venta de producto. Este año abundan y se haría demasiado pesado.
  • Espero que se metan menos cuñitas personales de los patrocinadores, que el año pasado terminaron por cansar.
  • Espero que los contenidos sean interesantes y que no tenga ganas de abrir el portátil en los dos días de la conferencia.
Salud y rocanrol!

I got girls that can cook. I got girls that can clean.
I got girls that can do anything in between.
I got to get ready, make everything right.
Because all my rowdy friends are coming over tonight.


jueves, 9 de octubre de 2008

Esas pequeñas cosas

Ayer fue un día muy muy triste. Murió un amigo de mi hermano con sólo 29 años. Aunque no estaba muy muy unido a él, era una persona a la que apreciaba. Solíamos vernos en las fiestas de sanse, en los encierros que se organizan para niños cuando llevo a mi pequeño. Él empujaba un carretón. A pesar de ser un punky, moderado por la edad y por su chica, un encanto como pocos, el Buty era apreciado por todo el mundo. Eso lo dice todo, por lo poco habitual.

Éstas cosas activan el lado romántico-filosófico-melancólico de la vida lo cual, en cabezas como la mía (imparable cuando le da por sacarse temas a sí misma sin parar), es una fuente de ideas impredecible. Y entre idea e idea me dio por pensar en esas pequeñas cosas que nos hacen la vida un poquito más cómoda y feliz y que, sin embargo, pasamos por delante de ellas y no le damos importancia. Y como tengo entre manos un proyecto de los que cuesta desconectar, se mezcló todo en el córtex y se convirtió en un manifiesto por los operadores que nos ahorran trabajo:
  • a += b
  • condicion ? expresion1 : espresion2
  • render :partial => "user", :collection => @users

Si no existieran, no pasaría nada, pero esto que hacemos sería menos agradable. Así, por ejemplo, echo de menos los comentarios multilínea, aunque pueda vivir sin ellos.

Hoy, más que nunca, salud y rocanrol!

Yo ya tengo novia, ya encontre mi amor.
La otra noche la besé en un callejón.
Es alta y morena, siempre está en mi mente.
Su nombre me volvio loco. Su nombre es la muerte.


jueves, 18 de septiembre de 2008

La madre de todos los corderos no es una oveja, es un 'underscore'

Lo que me ha ocurrido hoy es, como diría mi abuela, pa ' mear y no echar gota.

Resulta que hemos terminado de desarrollar una una aplicación y la hemos instalado en una máquina compartiendo IP con otras aplicaciones. En local, todo funcionaba de lujo pero en producción el login funcionaba bien en Firefox pero en Internet Explorer no. Y como las trazas en producción son tan significativas...

En fin, que no había narices a logarse. Menos mal que el de siempre, el que nunca falla, el que todo lo sabe estaba ahí para darnos la respuesta:

En IE, las cookies fallan cuando el dominio contiene un underscore. Aquí lo dicen los amigos de Bill.

Salud y rocanrol, que buena falta nos hace.

Y tú, tormenta de truenos y luz,
eres símbolo de libertad.
Yo nunca podría vivir,
sin tus cuerdas de acero tocar.


jueves, 11 de septiembre de 2008

ASPGems y Gemma

En ASPGems necesitamos incorporar un par de personas que nos echen una mano. Aquí lo publica Agustín. Si el post no os convence, yo lo haré.

Por otra parte, Avinash Kaushik, el master of the wrold de la analítica web, publica una foto de mis peques y mi chica con su libro 'Web analytics - An hour a day'.

Salud y rocanrol!

If I get stoned and sing all night long, it's a family tradition!

jueves, 4 de septiembre de 2008

OCUPADO

Hoy, al arrancar una aplicación en mi máquina (sí, sobre Windows XP), he obtenido la siguiente traza de error:

C:\rails_apps\danimata>ruby script/server
=> Booting Mongrel (use 'script/server webrick' to force WEBrick)
=> Rails application starting on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
** Starting Mongrel listening at 0.0.0.0:3000
Exiting
c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.5-x86-mswin32-60/lib/mongrel/tcphack.rb:12:in
`initialize_without_backlog': Bad file descriptor - bind(2) (Errno::EBADF)   from c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.5-x86-mswin32-60/lib/mongrel/tcphack.rb:12:in `initialize'   from c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.5-x86-mswin32-60/lib/mongrel.rb:93:in `new'   from c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.5-x86-mswin32-60/lib/mongrel.rb:93:in `initialize'   from c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.5-x86-mswin32-60/lib/mongrel/configurator.rb:139:in `new'   from c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.5-x86-mswin32-60/lib/mongrel/configurator.rb:139:in `listener'   from c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.5-x86-mswin32-60/bin/mongrel_rails:99:in `cloaker_'   from c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.5-x86-mswin32-60/lib/mongrel/configurator.rb:50:in `call'   from c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.5-x86-mswin32-60/lib/mongrel/configurator.rb:50:in `initialize'    ... 14 levels...
  from C:/rails_apps/berggi/vendor/rails/railties/lib/commands/server.rb:39   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 script/server:3
Pues toda esta mandanga, traducida al cristiano viejo quiere decir que en el puerto 3000 ya corre otra aplicación.

Salud y rocanrol

Si la tocas otra vez, te prometo que esta noche yo nunca la olvidaré. Si la tocas otra vez, te prometo que esta noche yo no puedo parar los pies.

martes, 5 de agosto de 2008

A tiro hecho (III)

Hoy he utilizado render para pintar N partials a partir de los elemntos de un Array. Lo típico:

<%= render :partial => 'user', :collection => @users, :locals => {:my_local_var => 'xxx'} %>

Y he tenido que buscar cómo se llama la variable mágica que se genera dentro del partial en cada iteración y que contiene el índice del elemento al que se aplica el partial en cada momento: [nombre_del_partial]_counter

Por ejemplo, en _user.rhtml

<%= user_counter %> - <%= user.login %>

Debo estar bajo de fósforo. Salud, aire fresco y rocanrol!!!

lunes, 4 de agosto de 2008

TOG news

Acaban de publicar en el blog de Linked lo bien que llevan el desarrollo de su plataforma para redes sociales: TOG. Creo que hay que tenerla en el radar porque pinta muy bien.

Recientemente he estado evaluando el plugin community_engine también diseñado para la creación de redes sociales y recomendado por mi amigo Javi. Como punto de partida me ha parecido bastante razonable, sobre todo porque tiene de todo lo que se espera en una red social genérica.

Y como dice un amiguete: me huele el culo a playa (vaya he dicho culo).

Salud y rocanrol...nos vemos en Benidorm.

martes, 22 de julio de 2008

Lección magistral

Chisthophe Porteneuve en A List Apart le da ésta vuelta de tuerca a los problemas de binding (enlace?, enlazamiento?) en javascript.

El artículo merece ser leído al completo y me permito traducir el resumen final a mi castellano:
  • Los accesos a miembros(atributos, métodos) deben de hacerse siempre a través del objeto al que pertenecen, aún cuando éste sea this.
  • Las referencias a cualquier función pierden su binding original, esto es, desconocen el objeto sobre el que se aplica en origen.
  • JavaScript 1.3 ofrece dos métodos para explicitar el binding de una función al invocarla: apply y call.
  • La solución a los problemas de binding son costosos, por lo que en ocasiones hay alternativas más baratas soportadas por el lenguaje.

Insisto, merece la pena leer el artículo.

Salud y rocanrol!!!

miércoles, 16 de julio de 2008

Diseño para dispositivos móviles

Mare mía qué abandonado tengo esto!!!

En fin, en este post del blog de design-logix comentan algunos factores a tener en cuenta a la hora de diseñar para dispositivos móviles y tres posibles manears de enfocar la implementación.

Entre los factores importantes hablan de
  • el tiempo de carga, muy mejorado en los dispositivos 3G
  • la gran variedad de dispositivos y de browsers
  • las limitaciones del usuario para interactuar en las páginas, tanto en la visualización de las mismas debido al tamaño de las pantallas como en su manejo, al no disponer de teclado ni ratón, como en un PC

Proponen tres maneras de mejorar la implementación que yo resumiría en una única: adaptar el site. Desde utilizar HTML ligero, a crear un site específico para cliente móvil, pasando por analizar qué aspectos y funcionalidades son básicas e indispensables y sólo implementar estas (less is more, always on my mind).

Como siempre, mucha salud y y un poquito de rocanrol.

miércoles, 4 de junio de 2008

Plugin para IE

Le leído en este post que existe un plugin para IE parecido a Firebug.

Me lo he instalado y mejora en Web Developer Toolbar, sobre todo por la consola javascript. Pero le falta poder ver todo el árbol de atributos css de cada elemento que, para mí, es lo mejor de Firebug.

Si lo queréis probar, podéis descargarlo de aquí.

Salud y rocanrol!

Run, live to fly, fly to live, do or die
Run, live to fly, fly to live. aces high


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!

martes, 29 de abril de 2008

A tiro hecho (II)

Hoy he tenido que trastear un poquito con active_scaffold después de algún tiempo y he comprobado lo volátil que se ha vuelto mi memoria. Así que he decidido dejarme aquí la url de los parámetros de configuración de los listados.

Hoy buscaba el parámetro para cambiar el número de registros mostrados en un listado:

config.list.per_page

Salud y rocanrol!

miércoles, 23 de abril de 2008

IE6 y sus pérdidas

Una de mis aplicaciones Rails va lenta. Pero no siempre; sólo cuando navegas un buen rato. Revisé los procesos y ví que los navegadores pierden memoria. En Firefox el problema es bastante conocido. En IE6 también, pero menos.

Sin embargo, mi amiga Ana ha encontrado un par de links interesantes en la web de Microsoft:

Esta segunda es la que mejor ha funcionado. IE6 es como es, pero así no pierde memoria.

Salud y rocanrol!

martes, 8 de abril de 2008

Formularios de registro? No, gracias.

En este artículo publicado en A list apart se comenta la estrategia de intentar atraer usuarios a un servicio web dejando que éstos utilicen plenamente su funcionalidad como primera experiencia de uso y dejando el registro como algo posterior e incluso opcional. Se muestran tres ejemplos, Jumpcut, Geni y Tripit. Finalmente, el autor del artículo da cuatro recomendaciones para acercarnos a esta solución de compromiso gradual.

Salud y rocanrol.

lunes, 7 de abril de 2008

Protección contra los gérmenes

Me preguntaba hoy un amigo qué trae Rails de serie que proteja las aplicaciones contra algún mamonazo que intente enviar código malintencionado, sobre todo sql injection y html injection. Es de estas preguntas que sabes que tiene respuesta fácil, que la usas y que te deja balbuceando, pidiendo tiempo muerto para contestarla.

Contra sql injection, acceder por Active Record, como mandan los cánones o si se trata de una de esas veces en que no se puede, tener cuidado con el manejo de los parámetros.

Contra html injection, escapar cualquier información que haya entrado a través de un formulario con la función h().

Y nada más. Y nada menos.

Salud y rocanrol. Por cierto, pedazo concierto dieron los barones.

miércoles, 2 de abril de 2008

Rails es perfecto para esto

Hace un mes, un amigo me pidió ayuda para montar una web lo más rápidamente posible para gestionar los vídeos de un certámen de videoclips y sacarlos a intenet para que pudieran ser votados. El resultado es éste.

Creo que en total hemos echado menos de 30 horas de desarrollo. Hemos tirado de lo conocido: Rails 1.2.3, acts_as_autheticated, simple_captcha, control_tabs y poco más.

Por detrás hay una pequeña gestión, muy simple y que asume que el que la usa sabe lo que hace.

Para esto Rails es perfecto: aplicación pequeña, sobre la marcha, con un horizonte temporal corto y pocos recursos. Y el resultado, bajo mi punto de vista, más que razonable.

Como siempre, salud y rocanrol.

PD: hablando de rocanrol, mañana toca Barón Rojo en un garito de Tres Cantos, y yo estaré allí.,

Rotar logs en Windows

En Windows, rotar los logs de una aplicación Rails que corre bajo mongrel y mongrel_service no es trivial. Mongrel bloquea el archivo por lo que una rotación por código, asignando a RAILS_DEFAULT_LOGGER una rotación por espacio o por tiempo desemboca en un error de sistema.

La mejor opción que he encontrado ha sido la fuerza bruta, el viejo método PRR: Parar, Rotar, Rearrancar. Para parar los servicios

En consola de sistema o un archivo batch, para parar un servicio

sc stop my_service_name

Si no se puede parar por cualquier razón, se pinta un código de error por pantalla, pero no lo devuelve en ninguna variable de entorno. Pero se puede comprobar de la siguiente manera:

sc query my_service_name | find "STOPPED"
if errorlevel 1 goto :non_stopped_service


y hacer lo sea necesario en la etiqueta :non_stopped_service

Para renombrar por batch el archivo de log y añadirle, por ejemplo, la fecha

set datestr=%DATE%
set timestr=%TIME%
set timestampstr=%datestr:~6,4%%datestr:~3,2%%datestr:~0,2%%timestr:~0,2%%timestr:~3,2%
ren e:\rails_apps\my_app\log\development.log development_%timestampstr%.log

Finalmente, para arrancar un servicio

sc start my_service_name

Para comprobar el estado en que quedan los servicios, sólo hay que jugar con el comando sc.

Salud y roncanrol¡

sábado, 15 de marzo de 2008

Cómo mola

El iJam, que mola bastante más que el iPhone. No os perdáis la visita guiada porque es de lo mejor que he visto en mucho tiempo.

Salud y rocanrol¡

viernes, 14 de marzo de 2008

Más hacks CSS

He encontrado este articulillo que cuenta algunos hacks para que las CSS funcionen mejor en todos los navegadores. Son todos más o menos conocidos pero vienen bien explicados y con algún matiz interesante.

Salud y rocanrol¡

martes, 11 de marzo de 2008

SQLServer

Un par de cosillas para trabajar con Rails y SQLServer:
  • Como ya comenté en posts anteriores, lo mejor es utilizar conexión ODBC.
  • En las migrations, la creación de tablas no debe tener referencias típicas de MySQL como
  • :options => 'ENGINE=InnoDB DEFAULT CHARSET=UTF8'
  • SQLServer no habla UTF-8 lo que hace que una migración de datos de MySQL a SQLServer pueda convertirse en un dolor si no se tiene en cuenta este hecho.
  • Finalmente, SQLServer implementa vistas indexadas lo que puede agilizar algunos accesos a base de datos. Éste es un buen link al respecto.
Salud y rocanrol¡

Me vuelvo a caer del guindo

Estaba trabajando con Rails 1.2.3 bajo Windows y actualizé mis gemas con

gem update --system

Lo primero que ocurrió es que Mongrel dejó de funcionar y tuve que actualizarlo también.

Hoy me encuentro con que no puedo congelar Rails. Si yo digo...

rake rails:freeze:gems

El sistema dice...

uninitialized constant Gem::GemRunner

Menos mal que Google es un campeón y me ha dejado la solución a un click. Gracias Miles.

Salud y rocanrol¡

sábado, 1 de marzo de 2008

Control Tabs

Control Tabs es una librería javascript basada en Prototype.js que permite crear de forma sencilla navegación con solapas. Sólo es necesaria una lista de enlaces que apunten a cualquier elemento de la página que tenga id, típicamente un elemento div.

En mi opinión, es perfecta para dividir formularios grandes en otros más pequeños o para separar funcionalidades que actúan sobre un mismo elemento o lista de elementos sin relizar llamadas a servidor.

Con la versión 1.5 de Prototype.js funciona sin problemas, pero con la versión 1.6 es necesario hacer un pequeño ajuste: cambiar cualquier acceso a los elementos de la Hash containers. Por ejemplo

this.containers[link.key]

por

this.containers.get(link.key)

Ale, a jugar con Control Tabs.

Salud y rocanrol¡

viernes, 22 de febrero de 2008

Assume vs Assure

En ocasiones nos encontramos con que te instalas algo que siempre ha funcionado bien pero que cuando le cambias un poco el entorno, le tiemblan las canillas.

Por ejemplo, para una nueva aplicación instalamos l10n-simplified para menejar los mensajes de la aplicación porque siempre ha funcionado. Y todo va bien, correcto, sin complicacines. Pero me llevo la aplicación a su entorno real, corriendo en un servidor Windows y atacando SQL Server 2005 a través de un conector ODBC y me encuentro con que algo o alguien ejecuta constantemente

SET NAMES 'UTF8'

contra la base de datos y ésta responde que va a ser que no.

Jodo¡ En un mundo sin sorpresas, la primera en la frente. Rebuscando y con ayuda de Javi encontramos que en localization_simplified.rb es donde se ejecuta esta sentencia. Después de blasfemar leemos el comentario

# Currently this modifies MySQL. Please add other databases you find necessary

que por una parte me hace pensar en todas las librerías que uso sin molestarme en mirar qué tienen y por otra en que quizás un plugin no deba asumir nada respecto a qué base de datos se utiliza.

En fin, solucionado. Pero hay objetos que no se borran, casualmente todos los que están configurados como acts_as_list.

Vuelvo a blasfemar (parezco Gurb). Y veo que de nuevo alguien o algo está poniendo position = NULL en el registro a borrar justo antes de destruirlo para siempre. Tengo por costumbre poner los campos position como not NULL para las tablas que contienen registros configurados como acts_as_list. Porque si son una lista el campo siempre debe contener un valor.

Y en otro orden de cosas, para qué se pone a NULL? Para avisarle de que vas a borrarlo? Los registros, hasta la fecha, no tienen sentimientos. No hay que avisarles de nada. Se crean, se borran, se modifican... y punto¡¡¡

Y porqué MySql traga con ello y SQL Server no? Pues no lo sé y la verdad, después de todo qué más me da? Si yo lo que quiero es irme a comer a mi casa¡¡¡ Comento la línea enferma y listo.

Salud y rocanrol¡

jueves, 21 de febrero de 2008

CSS en Sitepoint

En Sitepoint acaban de sacar esta referencia que parece bastante completa. Hay un listado alfabético de propiedades para ir a tiro hecho y hasta una página de hacks que nostá mal como comienzo.

En otro orden de cosas y perdón por la expresión, me cago aquí y ahora en los puñeteros charsets. Luego mexplico.

Salud¡

jueves, 14 de febrero de 2008

Más SEO

En su newsletter para empresas, Microsoft también ofrece una serie de indicaciones para que tu site le guste más a los buscadores. Más de lo mismo, explicado en detalle: que si enlaces bien puestos, que si urls únicas, que nada de popups ni frames... en fin, un poquito de sentido común más una pizca de conocimiento.

Salud¡

miércoles, 13 de febrero de 2008

Mongrel service

Levantar un servidor mongrel como servicio de Windows es un dolor hasta que leyendo leyendo... llegamos aquí. Con mongrel_service es prácticamente trivial:
  • instalamos la gema (que por cierto depende de win32-service)
  • gem install mongrel_service
  • y creamos el servicio
  • mongrel_rails service::install -N app3000 -c c:\rails_apps\app -p 3000 -e production
En la URL original se indica cómo arrancarlo, cómo pararlo, cómo eliminarlo y cómo cambiar sus propiedades (dependencias, tipo de servicio...).

Si además instalamos algún servidor web que permita balancear carga, como Apache con mod_proxy, podemos levantar tantos servicios como deseemos y dejarlos enganchados al servidor web de manera sencilla. Pero eso, otro día.

Salud¡

SEO - resumen

Antier (que diría mi abuela) publicaron en este blog un resumen de cosillas a tener en cuenta para que tu web se posicione razonablemente en los buscadores más usados. Lo de siempre: sitemap.xml, herramientas propias de cada buscador para dar a conocer tus páginas y, sobre todo, sentido común.

Salud¡

sábado, 9 de febrero de 2008

Otro lapsus: Güindous Libre¡

Está disponible hace años pero desconocía WinLibre. Es una aplicación libre para descargar todo tipo de programas libres para güindous(que no es libre).

Vale, la mayor parte de las aplicaciones que ofrece son las que todos conocemos, pero está bien tenerlas todas a mano y que te puedas olvidar de estar pendiente de actualizaciones. Habrá que echarle un ojo, no?

Salud¡

jueves, 7 de febrero de 2008

Lapsus

No entiendo como en 12 años no he visto esto en ningún sitio. Primero picaba una css por cada navegador y por javascript cargábamos la que se ajustase mejor. Luego decidí que eso de ajustar al pixel las páginas para todos los navegadores es una idiotez y que basta con que su aspecto sea razonable (mi listón está bastante alto, aviso). Y ahora veo esto.

Con estos estilos

.ie .example {background-color: yellow}
.ie7 .example {background-color: orange}
.gecko .example {background-color: gray}
.win.gecko .example {background-color: red}
.linux.gecko .example {background-color: pink}
.opera .example {background-color: green}


conseguimos ajustar las propiedades para cada navegador.

La referencia completa está aquí.

Vivir para ver, Liborio¡ Vivir para ver¡

miércoles, 6 de febrero de 2008

Tócala otra vez, Sam

... y va Sam (songerize.com) y la toca.

Con un campo para meter cuatro palabras de la letra que te suenan de la canción que no te acuerdas, sería la booooooomba¡

lunes, 4 de febrero de 2008

GRUFF: una pega

Trasteando con GRUFF me he encontrado pintando 4 ó 5 gráficas y teniendo que acortar las leyendas de cada una de ellas para que no se me salieran de la imagen. Y es que no está muy bien resuelto este tema.

Como solución intermedia e inmediata, por una parte le he pasado las leyendas con saltos de línea '\n' y por otra he cambiado un par de líneas de la librería, para que se dé cuenta que a un string cuando le pones saltos pierde anchura.

base.rb versión 0.2.9

cambiamos

698 metrics = @d.get_type_metrics(@base_image, @legend_labels.join(''))

por

698 temp_legend_labels = @legend_labels.map{|l| l.split('\n').sort {|x,y| y.size <=> x.size }[0]}
699 metrics = @d.get_type_metrics(@base_image, temp_legend_labels.join(''))


y

738 metrics = @d.get_type_metrics(@base_image, temp_legend_labels[index].to_s)

por

738 metrics = @d.get_type_metrics(@base_image, legend_label.to_s)

Y listo para jugar.

viernes, 25 de enero de 2008

CURL

A un ventanero como yo, siempre le cuesta un poquito más terminar de instalar todo este tipo de aplicaciones, librerías y programas opensource. Claro que... igual soy yo¡

Hoy he tenido que instalarme CURL para poder probar una aplicación que ofrece servicios al estilo REST vía HTTP. Y, no es que haya sido difícil, pero sí que es cierto que no se hace en un paso, si no en dos.

Lo primero es instalar CURL de aquí. Eliges lo que más te convenga y listo. Pero con eso no basta. Hay que instalar también las librerías de OpenSSL, por ejemplo, de aquí o de aquí si prefieres tener los fuentes.

Y ya.

lunes, 7 de enero de 2008

De momento, GRUFF

He estado mirando por ahí con qué pintar las gráficas de una de mis aplicaciones y no he enconrado nada que mejore GRUFF.

  • Es fácil de instalar puesto que sólo necesita RMagick (también ImageMagick si eres ventanero como yo (sí, ventanero, que pasa?))
  • Es fácil de usar, como se ve en el ejemplo original

    require 'rubygems'
    require 'gruff'

    g = Gruff::Line.new
    g.title = "My Graph"
    g.data("Apples", [1, 2, 3, 4, 4, 3])
    g.data("Oranges", [4, 8, 7, 9, 8, 9])
    g.labels = {0 => '2003', 2 => '2004', 4 => '2005'}
    g.write('my_fruity_graph.png')


  • Y el fácil de tunear, por ejemplo

    #tamaño de gráfico
    g = Gruff::Line.new ('450x250')

    #colores y fuentes
    g.theme = {
      :colors => ['#638AA5', '#E9C904', '#000066', '#B4B4B4'],
      :font_color => '#000000',
      :font_size => 12,
      :marker_color => '#dddddd',
      :background_colors => ['#ffffff', '#ffffff'],
    }
    g.font = File.expand_path('artwork/fonts/VeraBd.ttf', RAILS_ROOT)
    g.legend_font_size = 13
    g.marker_font_size = 13
    g.legend_box_size = 13

    #qué se ve y qué no
    g.hide_title = true
    g.hide_legend = true

    #enviar el grafico online
    send_data(g.to_blob, :disposition => 'inline', :type => 'image/png', :filename => "gruff.png")
    ....
Sigo mirando en Rubyforge por si acaso...