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.
viernes, 25 de enero de 2008
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")
....
viernes, 14 de diciembre de 2007
IE no cachea los background-image's
He desarrollado dos widgets a partir de datepicker: un menu contextual y un tooltip. No han costado demasiado pero, como siempre, ejecutando las aplicaciones contra localhost todo es simple y bonito y al llevarlo a un servidor de verdad te das cuenta de cosillas.
En este caso, volviendo a caer de mi propio guindo, las imágenes declaradas como background-image en una CSS no son cacheadas por IE. Y también en este caso, como en la mayoría de casos, preguntando a Google se llega a Roma.
Teniendo cargado prototype.js
if(Prototype.Browser.IE) document.execCommand("BackgroundImageCache", false, true);
Lo puede hacer, pero no lo hace. A veces me cuesta defender mi principio de no primacía de nungún navegador.
En este caso, volviendo a caer de mi propio guindo, las imágenes declaradas como background-image en una CSS no son cacheadas por IE. Y también en este caso, como en la mayoría de casos, preguntando a Google se llega a Roma.
Teniendo cargado prototype.js
if(Prototype.Browser.IE) document.execCommand("BackgroundImageCache", false, true);
Lo puede hacer, pero no lo hace. A veces me cuesta defender mi principio de no primacía de nungún navegador.
jueves, 13 de diciembre de 2007
Tuneando acts_as_list
Tengo un modelo de datos con dos tablas as y bs. Por tanto, tengo los modelos a.rb y b.rb donde
class A < ActiveRecord::Base
has_many :bs, :dependent => :destroy
end
class B < ActiveRecord::Base
belongs_to :a
acts_as_tree :order => 'position'
acts_as_list :scope => a
end
Es decir, la tabla bs contiene los campos a_id, position y parent_id de forma que los registros de bs relacionados con un mismo registro de as se comporten como una lista.
Ahora bien, he de cambiar esto. Necesito que los registros de bs relacionados con un mismo registro de as y con parent_id = null se comporten como una lista independiente.
acts_as_list :scope => 'a_id = #{a_id} and parent_id is null'
Finalmente, necesito que los registros de bs con un mismo parent_id y relacionados a un mismo registro de as también se comporten como una lista independiente.
acts_as_list :scope => 'a_id = #{a_id} and parent_id #{parent.nil? ? \'is null\' : \'= \' + parent_id.to_s }'
Como se dice en la documentación, acerca de :scope
class A < ActiveRecord::Base
has_many :bs, :dependent => :destroy
end
class B < ActiveRecord::Base
belongs_to :a
acts_as_tree :order => 'position'
acts_as_list :scope => a
end
Es decir, la tabla bs contiene los campos a_id, position y parent_id de forma que los registros de bs relacionados con un mismo registro de as se comporten como una lista.
Ahora bien, he de cambiar esto. Necesito que los registros de bs relacionados con un mismo registro de as y con parent_id = null se comporten como una lista independiente.
acts_as_list :scope => 'a_id = #{a_id} and parent_id is null'
Finalmente, necesito que los registros de bs con un mismo parent_id y relacionados a un mismo registro de as también se comporten como una lista independiente.
acts_as_list :scope => 'a_id = #{a_id} and parent_id #{parent.nil? ? \'is null\' : \'= \' + parent_id.to_s }'
Como se dice en la documentación, acerca de :scope
It‘s also possible to give it an entire string that is interpolated if you need a tighter scope than just a foreign key....y eso hemos hecho.
jueves, 29 de noviembre de 2007
Curiosidad javascript o de cómo darte cuenta de que no lo haces bien
Dos de la mañana y descubro que mi script, en determinadas ocasiones no va. Manejando strings con fechas y parseando el año, el mes y el día. Por alguna razón cuando mezclo el 8 con números inferiores la cosa no va. DEF CON DOS¡¡ Forro mi script de alerts y descubro que lo que yo creía que era un 8 en realidad no lo es.
Viva Google¡¡¡
parseInt('01') = 1Después de cagarme en todo lo cagable (laico, santo, real, imaginario...) descubro que no estoy sólo y que hay que hacer las cosas como mandan los cánones... Y me voy a dormir más feliz que un regaliz (con un blog más en mi lista de favoritos).
parseInt('02') = 2
...
parseInt('07') = 7
parseInt('08') = 0 (ein?)
parseInt('09') = 0 (comor?)
Viva Google¡¡¡
sábado, 24 de noviembre de 2007
Conferencia Rails II: reacciones
Me pareció bastante infantil la reacción que algunas personas tuvieron ante las palabras de los representantes de SUN y Microsoft tanto en el debate sobre frameworks como en la mesa de empresas.
El mensaje principal de ambas empresas fue bastante claro: estamos haciendo esfuerzos porque las aplicaciones Ruby corran en nuestros entornos. Es cierto que cuando los ejecutivos de estas empresas utilizan el nosotros, parecen representar a un dios único y todopoderoso cuya razón es indiscutible. Y también es cierto que, sobre todo Microsoft, tiene siempre ese tufillo a te quiero vender una moto inseparable de sus productos. Pero, no por ello, todo lo que huele a empresa grande y mundo corporativo tiene que ser malo.
La primera reacción fue de rechazo. ¿Qué pintan SUN y Microsoft aquí? se preguntaban. Este rechazo resulta incomprensible a mi modo de ver. Igual parece un poco maquiavélico pero cuantos más entornos permitan instalar mis aplicaciones RoR, más clientes potenciales tendré, más podré desarrollar mi actividad y más oportunidades hallaré de mostrar las bondades de esta tecnología.
La segunda reacción fue de temor a la invasión. ¡¡No nos moverán!! le faltó gritar a alguno. Pensar que el desarrollo de RoR va a venir marcado por lo que necesiten SUN para JRuby o Microsoft para IronRuby es un poco inocente cuanto menos.
El buen hacer está en la humildad y en el orgulllo, en la experiencia y en el talento, en la fusión y en la pureza, todo ello en su justa medida.
El mensaje principal de ambas empresas fue bastante claro: estamos haciendo esfuerzos porque las aplicaciones Ruby corran en nuestros entornos. Es cierto que cuando los ejecutivos de estas empresas utilizan el nosotros, parecen representar a un dios único y todopoderoso cuya razón es indiscutible. Y también es cierto que, sobre todo Microsoft, tiene siempre ese tufillo a te quiero vender una moto inseparable de sus productos. Pero, no por ello, todo lo que huele a empresa grande y mundo corporativo tiene que ser malo.
La primera reacción fue de rechazo. ¿Qué pintan SUN y Microsoft aquí? se preguntaban. Este rechazo resulta incomprensible a mi modo de ver. Igual parece un poco maquiavélico pero cuantos más entornos permitan instalar mis aplicaciones RoR, más clientes potenciales tendré, más podré desarrollar mi actividad y más oportunidades hallaré de mostrar las bondades de esta tecnología.
La segunda reacción fue de temor a la invasión. ¡¡No nos moverán!! le faltó gritar a alguno. Pensar que el desarrollo de RoR va a venir marcado por lo que necesiten SUN para JRuby o Microsoft para IronRuby es un poco inocente cuanto menos.
El buen hacer está en la humildad y en el orgulllo, en la experiencia y en el talento, en la fusión y en la pureza, todo ello en su justa medida.
Conferencia Rails I: tengo una noticia buena y otra mala
El viernes pasado, según llegué a casa de la Conferencia Rails 2007, me preguntó mi chica que cómo había ido la cosa. Al mismo tiempo me pasó a mi hijo pequeño con un pañal limpio y un biberón para que me reincorporase a mis labores de hogar, con lo que intenté resumir.
'Ha habido cosas buenas y cosas no tan buenas', le dije. 'Primero las no tan buenas', dijo ella.
Las menos buenas fueron, en mi opinión, la falta de autocrítica, por una parte, y la falta de experiencia, por otra. La primera provocó que incluso cuando Obie Fernández dijo que no creía en grupos de más de cuatro personas porque es imposible juntar 4 buenos programadores de Rails (idea que suscribo a pies juntillas), algunas personas se sientieran ofendidas. La segunda, obvia, en un entorno con tan corta edad es normal que (como dijo José Cabrera) los nativos en el entorno tengan experiencias cortas. Además yo no estoy particularmente de acuerdo en aquello de que un joven que lleva picando desde los 13 por puro interés a los 23 tenga 10 años de experiencia. Para programar for the hell of it (que se dice en Texas) sí; para hacer aplicaciones que se venden, sinceramente, no.
Las buenas, muchas y variadas: mucho talento, muchas ideas, expansión en USA, aplicaciones impensables.
Jorge Valdano decía que
La expansión en USA la comento Obie mientra lo llevaba a la cena en mi coche . Comentó que allí es más fácil hacer de Rails un trabajo y que Rails está en la corriente principal del desarrollo web de aquel país.
Finalmente, resalto fuera de todos los temas en boga sobre Ruby y sobre Rails, dos nuevas ideas que vi en funcionamiento: RoR aplicado a la inteligencia artificial en el marketing y RoR para voz IP. Seguro que de aquellas dos demos salen cosas interesantes.
Salud y buenos alimentos¡
'Ha habido cosas buenas y cosas no tan buenas', le dije. 'Primero las no tan buenas', dijo ella.
Las menos buenas fueron, en mi opinión, la falta de autocrítica, por una parte, y la falta de experiencia, por otra. La primera provocó que incluso cuando Obie Fernández dijo que no creía en grupos de más de cuatro personas porque es imposible juntar 4 buenos programadores de Rails (idea que suscribo a pies juntillas), algunas personas se sientieran ofendidas. La segunda, obvia, en un entorno con tan corta edad es normal que (como dijo José Cabrera) los nativos en el entorno tengan experiencias cortas. Además yo no estoy particularmente de acuerdo en aquello de que un joven que lleva picando desde los 13 por puro interés a los 23 tenga 10 años de experiencia. Para programar for the hell of it (que se dice en Texas) sí; para hacer aplicaciones que se venden, sinceramente, no.
Las buenas, muchas y variadas: mucho talento, muchas ideas, expansión en USA, aplicaciones impensables.
Jorge Valdano decía que
Un buen líder ha de apostar por el talento, y no puedo estar más de acuerdo con él. Pero también decía que
El talento necesita su lugar. Hay que ubicar a la las personas en el lugar preciso para aprovechar las virtudes y esconder sus defectos. De este modo llegaremos a la excelenciay tampoco creo que esté equivocado en esto.
La expansión en USA la comento Obie mientra lo llevaba a la cena en mi coche . Comentó que allí es más fácil hacer de Rails un trabajo y que Rails está en la corriente principal del desarrollo web de aquel país.
Finalmente, resalto fuera de todos los temas en boga sobre Ruby y sobre Rails, dos nuevas ideas que vi en funcionamiento: RoR aplicado a la inteligencia artificial en el marketing y RoR para voz IP. Seguro que de aquellas dos demos salen cosas interesantes.
Salud y buenos alimentos¡
martes, 13 de noviembre de 2007
Cycle
Hasta ayer, sólo había visto la llamada a cycle que hace ajax-scaffold para alternar el color de las filas de una tabla. Sin embargo, cuando necesité alternar dos tipos de elementos y resetear los dos ciclos independientemente, tuve que leer la documentación de TextHelper
En resumen: podemos llamar a la helper pasando como último parámetro una Hash donde damos un nombre al objeto Cycle que internamente crea.
cycle("rowBlue1", "rowBlue2", {:name => 'tr'})
cycle("cellText1", "cellText2", {:name => 'td'})
De esta forma, podemos resetear cada uno de ellos de forma independiente:
reset_cycle('tr') reset_cycle('td')
Rápido, sencillo, eficaz.
En resumen: podemos llamar a la helper pasando como último parámetro una Hash donde damos un nombre al objeto Cycle que internamente crea.
cycle("rowBlue1", "rowBlue2", {:name => 'tr'})
cycle("cellText1", "cellText2", {:name => 'td'})
De esta forma, podemos resetear cada uno de ellos de forma independiente:
reset_cycle('tr') reset_cycle('td')
Rápido, sencillo, eficaz.
jueves, 8 de noviembre de 2007
Ruby on Rails en el SIMO?
Ayer me comentó mi amigo Javi que había participado en esta conferencia dentro de las conferencias del SIMO 2007. En ella se habló de distintos frameworks de desarrollo sobre distintos lenguajes y entornos (Drupal, Zend, RoR, .NET...). Por lo que me ha contado, poca chicha y poca limoná.
También ayer hubo un monográfico sobre Ruby on Rails en el que participó Agustín. Veremos qué cuenta al respecto.
Por otro lado, hay que ir pensando en pagar la Conferencia Rails, no?
Salud¡
También ayer hubo un monográfico sobre Ruby on Rails en el que participó Agustín. Veremos qué cuenta al respecto.
Por otro lado, hay que ir pensando en pagar la Conferencia Rails, no?
Salud¡
viernes, 2 de noviembre de 2007
Un poco más de SOAP - cabecera de seguridad
En un acceso por Web Service he tenido que utilizar una cabecera de seguridad. Para crear los nodos previstos por el estándar WSSE he tenido que hacer lo siguiente:
driver = ClassThatXtendsSOAPRPCDriver.new
sh = SOAP::SOAPHeader.new
sec = SOAP::SOAPElement.new('wsse:Security')
sec.add(SOAP::SOAPElement.new('wsse:UsernameToken'))
sec['wsse:UsernameToken'].add(SOAP::SOAPElement.new('wsse:Username', 'Iamtheman'))
sec['wsse:UsernameToken'].add(SOAP::SOAPElement.new('wsse:Password', 'Iamthelaw'))
sec.extraattr['mustUnderstand'] = '1'
sec.extraattr['xmlns:wsse'] = 'url_for_wssecurity_xsd'
sh.add('wsse:Security', sec)
sb = SOAP::SOAPBody.new
sb.add('OTA_HotelAvailRQ', SOAP::SOAPElement.new('my_node'))
...
my_response = driver.invoke(sh, sb)
He tenido que trabajar de esta forma porque con soap4r no he podido generar un driver adecuado a mis necesidades. Con la versión 1.5.7 hay nodos dentro de los ficheros XSD que no sabe interpretar y por ello no genera bien los tipos de datos que utiliza el driver. Parece que esto se arregla en la 1.5.8. Tendremos que probarlo.
Salud¡
driver = ClassThatXtendsSOAPRPCDriver.new
sh = SOAP::SOAPHeader.new
sec = SOAP::SOAPElement.new('wsse:Security')
sec.add(SOAP::SOAPElement.new('wsse:UsernameToken'))
sec['wsse:UsernameToken'].add(SOAP::SOAPElement.new('wsse:Username', 'Iamtheman'))
sec['wsse:UsernameToken'].add(SOAP::SOAPElement.new('wsse:Password', 'Iamthelaw'))
sec.extraattr['mustUnderstand'] = '1'
sec.extraattr['xmlns:wsse'] = 'url_for_wssecurity_xsd'
sh.add('wsse:Security', sec)
sb = SOAP::SOAPBody.new
sb.add('OTA_HotelAvailRQ', SOAP::SOAPElement.new('my_node'))
...
my_response = driver.invoke(sh, sb)
He tenido que trabajar de esta forma porque con soap4r no he podido generar un driver adecuado a mis necesidades. Con la versión 1.5.7 hay nodos dentro de los ficheros XSD que no sabe interpretar y por ello no genera bien los tipos de datos que utiliza el driver. Parece que esto se arregla en la 1.5.8. Tendremos que probarlo.
Salud¡
Suscribirse a:
Entradas (Atom)