<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><!-- generator="wordpress/2.1.3" --><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Roberto M. Oliva</title>
	<link>http://www.robertooliva.com</link>
	<description>The Gold Bug</description>
	<pubDate>Fri, 10 Oct 2008 12:42:27 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.1.3</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/RobertoOliva" type="application/rss+xml" /><feedburner:browserFriendly></feedburner:browserFriendly><item>
		<title>Hook_theme en Drupal 6</title>
		<link>http://www.robertooliva.com/2008/10/10/hook_theme-en-drupal-6/</link>
		<comments>http://www.robertooliva.com/2008/10/10/hook_theme-en-drupal-6/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 12:42:27 +0000</pubDate>
		<dc:creator>Roberto M. Oliva</dc:creator>
		
		<category><![CDATA[Drupal]]></category>

		<guid isPermaLink="false">http://www.robertooliva.com/2008/10/10/hook_theme-en-drupal-6/</guid>
		<description><![CDATA[Estamos empezando el desarrollo de una serie de sitios basados en Drupal 6, por lo que nos hemos puesto a crear temas nuevos y nos hemos encontrado con cosas curiosas. Aquí voy a explicar la que me ha dado más dolores de cabeza en estos días que llevo con Drupal 6 y, si bien, al [...]]]></description>
			<content:encoded><![CDATA[<p>Estamos empezando el desarrollo de una serie de sitios basados en Drupal 6, por lo que nos hemos puesto a crear temas nuevos y nos hemos encontrado con cosas curiosas. Aquí voy a explicar la que me ha dado más dolores de cabeza en estos días que llevo con Drupal 6 y, si bien, al final es algo bastante sencillo, hay que aprenderlo.</p>
<p>Todo parte de la necesidad de renderizar los <em>Primary Links</em> con una plantilla que no sea la estándar. Se puede renderizar con la plantilla <em>links</em>:</p>
<p><code>< ?php  print theme('links', $primary_links ); ?></code></p>
<p>O como menu_tree:</p>
<p><code>< ?php print menu_tree($menu_name = 'primary-links'); ?></code></p>
<p>Y luego trabajar con el CSS, pero queremos ir un poco más allá: queremos definir exactamente el HTML que nos de la gana. Nuestra llamada va a ser:</p>
<p><code>< ?php  print theme('primary_links', $primary_links ); ?></code></p>
<p>Y, aparte, tener definido un fichero de plantilla: <strong>primary_links.tpl.php</strong> donde especificamos el comportamiento de la renderización del array de enlaces.</p>
<p>En Drupal 5 la manera de descubrir plantillas de temas es automática, nos hubiera bastado con tener algo de lo siguiente definido, por orden de importancia:<br />
- Fichero de plantilla (<strong>primary_links.tpl.php</strong>) para que lo hubiera utilizado.<br />
- Funcion propia de tema (<strong>nombretema_primary_links.tpl.php</strong>) dentro del template.php.<br />
- Funcion propia del motor del tema (<strong>phptemplate_primary_links.tpl.php</strong>) dentro del template.php.</p>
<p>En Drupal 6 no es automático. Hay que indicárselo al motor, el cual cacheará las llamadas para hacer el proceso más eficiente.<br />
Habría que implementar la funcion <em>hook_theme</em> dentro del tema (dentro de <em>template.php</em>) o dentro del módulo que necesite el template. Esta funcion debe devolver un array que defina como se comportan cada uno de los temas. Por ejemplo:</p>
<p><code>function nombretema_theme() {<br />
  return array(<br />
    'primary_links' => array(<br />
      'arguments' => array(<br />
        'links' => NULL<br />
      ),<br />
	  'template' => 'primary_links'<br />
    ),<br />
  );<br />
}<br />
</code></p>
<p>Hace básicamente lo que buscamos: Relacionar <em>theme(hook, &#8230;)</em> con el fichero: <em>hook.tml.php</em>.<br />
Pero también podemos definir como queremos que se comporte ese hook, por ejemplo renderizando como una función del tema (comportamiento por defecto):</p>
<p><code><br />
/**<br />
* Implementation of hook_theme().<br />
*/<br />
function maristas_silvia_theme() {<br />
  return array(<br />
    'primary_links' => array(<br />
      'arguments' => array(<br />
        'links' => NULL<br />
      ),<br />
    ),<br />
  );<br />
}</p>
<p>function nombretema_primary_links($links = array()) {<br />
	return "Renderizamos los enlaces primarios"; // Salida de ejemplo<br />
}<br />
</code></p>
<p>En el ejemplo anterior la renderización encargada del hook la realizará una función del <em>template.php</em>.</p>
<p>Por nomenclatura se suele traducir los guiones bajos del nombre del hook (primary_links) a guiones simples al nombre del template asociado (primary-links.tpl.php).</p>
<p>Si se cambia la estructura de los hooks, hay que reiniciar la cache, esto se puede hacer con cualquiera de los siguientes métodos:<br />
- En la página &#8220;Administer > Site configuration > Performance&#8221; hacer click en el botón: &#8220;Clear cached data&#8221;.<br />
- Con el módulo <a href="http://drupal.org/project/devel">devel</a>, hacer clieck en el enlace: &#8220;Empty cache&#8221; link.<br />
- Con la función: <a href="http://api.drupal.org/api/function/drupal_rebuild_theme_registry/6">drupal_rebuild_theme_registry</a> de la API.</p>
<p>Más información en:</p>
<p>- <a href="http://api.drupal.org/api/function/hook_theme/6">hook_theme : Drupal 6 API</a><br />
- <a href="http://drupal.org/theme-guide">Theme guide (Drupal 6)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertooliva.com/2008/10/10/hook_theme-en-drupal-6/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Flex: Atendiendo a la finalizacion de comandos</title>
		<link>http://www.robertooliva.com/2008/07/22/flex-atendiendo-a-la-finalizacion-de-comandos/</link>
		<comments>http://www.robertooliva.com/2008/07/22/flex-atendiendo-a-la-finalizacion-de-comandos/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 13:24:46 +0000</pubDate>
		<dc:creator>Roberto M. Oliva</dc:creator>
		
		<category><![CDATA[Flex]]></category>

		<category><![CDATA[Cairngorm]]></category>

		<guid isPermaLink="false">http://www.robertooliva.com/2008/07/22/flex-atendiendo-a-la-finalizacion-de-comandos/</guid>
		<description><![CDATA[Una dificultad en el desarrollo de clientes en Flex es su carecter totalmente asíncrono.
Nosotros utilizamos Cairngorm  para el desarrollo en Flex y nos suponía un problema añadido el que no hay control sobre la finalización de un comando asíncrono. Hay veces que es necesario realizar una operación concreta nada más haber recibido una serie [...]]]></description>
			<content:encoded><![CDATA[<p>Una dificultad en el desarrollo de clientes en Flex es su carecter totalmente asíncrono.<br />
Nosotros utilizamos <a href="http://www.google.es/url?sa=t&#038;ct=res&#038;cd=3&#038;url=http%3A%2F%2Flabs.adobe.com%2Fwiki%2Findex.php%2FCairngorm&#038;ei=cd2FSKXqJom00gT3i9nhBA&#038;usg=AFQjCNEvKWilkRZ2ICxY1G7-JRNGqvDGqg&#038;sig2=DMkCQt6NHuNBxRTz7qXGxw">Cairngorm</a>  para el desarrollo en Flex y nos suponía un problema añadido el que no hay control sobre la finalización de un comando asíncrono. Hay veces que es necesario realizar una operación concreta nada más haber recibido una serie de datos, por ejemplo. </p>
<p>Esto, dentro de Cairngorm, puede hacerse en la función result del Comando (implementa la interfaz <em>IResponder</em>) que ha lanzado la petición. El problema de esta técnica estriba en que el comando, que es parte del Controlador, no conoce nada acerca de la Vista ni del Modelo. En realidad debería de poder acceder al Modelo, según el patrón MVC.</p>
<p>También se puede hacer utilizando observers que controlan cuando los datos pedidos han sido recibidos y por tanto se puede realizar la operación subsiguiente. Pero complica bastante el código y lo hace muy frágil.</p>
<p>Al final, estamos utilizando una técnica que parece bastante lógica y flexible y, gracias a Dios, es fácil de implementar. La inspiración ha venido a raíz del siguiente enlace: <a href="http://www.thomasburleson.biz/2007/06/cairngorm_view_notifications.html">Cairngorm View Notifications</a>.</p>
<p>Simplemente se basa en pasar al evento un parámetro adicional con la función que será llamada cuando el evento finalice.</p>
<p>La función result pasaría a ser algo así:</p>
<p><code><br />
override public function result(event:Object) : void {<br />
  var eventR : ResultEvent = event as ResultEvent;<br />
  if (_event.function_result != null)<br />
    _event.function_result.call(this, eventR);<br />
}<br />
</code></p>
<p>Me encantan las pequeñas ideas que ofrecen grandes soluciones.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertooliva.com/2008/07/22/flex-atendiendo-a-la-finalizacion-de-comandos/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Desplegando Rails</title>
		<link>http://www.robertooliva.com/2008/04/16/desplegando-rails/</link>
		<comments>http://www.robertooliva.com/2008/04/16/desplegando-rails/#comments</comments>
		<pubDate>Wed, 16 Apr 2008 14:27:21 +0000</pubDate>
		<dc:creator>Roberto M. Oliva</dc:creator>
		
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.robertooliva.com/2008/04/16/desplegando-rails/</guid>
		<description><![CDATA[Llevamos  más de año y medio metidos en un mega-proyecto basado en Ruby On Rails. Después de tanto tiempo tenemos una visión muy clara de las ventajas e inconvenientes de utilizar esta plataforma. Ya hay muchos sitios en los que se habla de estas consideraciones y de muchas otras, pero yo quiero exponer aquí [...]]]></description>
			<content:encoded><![CDATA[<p>Llevamos  más de año y medio metidos en un mega-proyecto basado en Ruby On Rails. Después de tanto tiempo tenemos una visión muy clara de las ventajas e inconvenientes de utilizar esta plataforma. Ya hay muchos sitios en los que se habla de estas consideraciones y de muchas otras, pero yo quiero exponer aquí el que probablemente haya sido el mayor problema con el que nos hemos encontrado: El despliegue.</p>
<p>Siguiendo en paralelo esta <a href="http://codemonkey.ravelry.com/2008/03/10/load-balancing/">entrada</a>  hemos pasado por todos las arquitecturas posibles de aplicaciones Rails, bueno nos saltamos el FastCGI:</p>
<ul>
<li>Apache con mod_balancer</li>
<li>Nginx con fair</li>
<li>Mongrel</li>
<li>Thin</li>
</ul>
<p>Muchas, muchas horas invertidas con problemas de estabilidad, rendimiento, conexión a la base de datos defectuosa, etc, etc.<br />
No hemos llegado todavia al paso de implementar HAProxy, aunque todo de andará. Pero con un nginx con fair, un stack de 10 thines y una buena máquina sirviendo el MySql, parece que nos hemos ganado un poco de tranquilidad.</p>
<p>Tenemos en plan crear dos máquinas virtualizadas con un stack de mongreles en cada una y el nginx que balancee a ambas. Esta arquitectura tiene que escalar hasta dos máquinas con cuatro stack de thines virtualizados cada una, lo que nos dará 80 thines dispuestos en paralelo, mejor balanceo de carga y una mayor tolerancia a fallos. Posiblemente tendremos que replicar la base de datos porque seguramente pasaremos el cuello de botella a ese extremo.</p>
<p>Por si sirven los siguientes datos, sacados de varios sitios web, entre ellos el de: <a href="http://brainspl.at/">Ezra Zygmuntowicz</a>. Teniendo en cuenta:<br />
- reqs: Request per second. Son el número de peticiones que se harán por segundo.<br />
- tm: Tiempo medio de respuesta de cada petición.</p>
<p>El número de mongreles necesarios serán: reqs * tm. A su vez, se recomienda 8 mongreles por núcleo de CPU, con esto también nos permite obtener cuantos servidores necesitamos.<br />
Por ejemplo: Si necesitamos servir 100 request por segundo y cada request toma una media de 0,5 segundos en ser enviada, necesitaríamos 50 mongreles. Una máquina QuadCore podría tener 32 mongreles, con lo que necesitaríamos 2 máquinas. Esto sin contar con el consumo de memoria RAM de la máquina. Si un mongrel consume unos 60Mb de RAM, para 32 mongreles necesitaríamos algo menos de 2Gb de RAM en la máquina.</p>
<p>Después de toda esta disquisición, voy a comentar en este y en sucesivos posts un nuevo chico en la ciudad (como se suele decir en inglés), se denomina: <a href="http://www.modrails.com/">Phusion Passenger</a>. Como todos los que comienzan promete todo: Gran velocidad, estabilidad, mucha documentación. Pero esta solución promete algo mejor y es virtual hosting de Rails con configuración cero.</p>
<p>Para desplegar un sitio Rails, aparte de saber programar ;), había que saber desplegar toda la arquitectura, vamos, lo que he comentado antes (nginx, mongreles, etc). Con modrail esto se acaba: Subes los ficheros de la aplicación Rails al directorio que atiende el virtual host y ya está funcionando. </p>
<p>He estado instalándolo en un servidor en el que tenemos varias aplicaciones Rails. La instalación ha sido bastante fácil: Una gema, un script de configuración y unas variables en el <em>apache2.conf</em>. Después de esto y, como por arte de magia, tenemos una aplicación rails corriendo en un virtual host sin tener que preouparnos por los mongreles ni por los balanceos de carga.</p>
<p>Cuando viene algo nuevo, suelo ser bastante excépctico. Todavía queda mucho camino por recorrer: A Ruby (<a href="http://rubini.us/">Rubinius</a> por ejemplo), a Rails y, en este caso, a modrails.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertooliva.com/2008/04/16/desplegando-rails/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Retomando…</title>
		<link>http://www.robertooliva.com/2008/04/01/retomando/</link>
		<comments>http://www.robertooliva.com/2008/04/01/retomando/#comments</comments>
		<pubDate>Tue, 01 Apr 2008 13:16:20 +0000</pubDate>
		<dc:creator>Roberto M. Oliva</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.robertooliva.com/2008/04/01/retomando/</guid>
		<description><![CDATA[Llevo más tiempo sin escribir aquí del que pensaba. Estoy dispuesto a ponerme las pilas de nuevo, porque quiero comprometerme a mantener este blog lo más actualizado posible.
No obstante todo ha sido por un motivo, el de siempre: El trabajo (no me importaría que fuese otro). Pero también he de decir que este blog se [...]]]></description>
			<content:encoded><![CDATA[<p>Llevo más tiempo sin escribir aquí del que pensaba. Estoy dispuesto a ponerme las pilas de nuevo, porque quiero comprometerme a mantener este blog lo más actualizado posible.<br />
No obstante todo ha sido por un motivo, el de siempre: El trabajo (no me importaría que fuese otro). Pero también he de decir que este blog se alimenta del mismo trabajo. Y durante este lapso de tiempo he trabajado mucho y muy intensamente. Sirva de introducción esta entrada de blog a las tecnologías en las que he estado profundamente involucrado estos últimos meses y de las que tengo que dar más cumplida cuenta por aquí:</p>
<p>Por supuesto:<br />
- <a href="http://www.rubyonrails.org/">Ruby on Rails<br />
</a>- <a href="http://www.adobe.com/products/flex/">Adobe Flex</a></p>
<p>Entran en la lista:<br />
- <a href="http://www.drupal.org">Drupal</a>. He montado un gran portal social sobre esta plataforma, lo que me ha dado una gran oportunidad para aprender y valorar sus grandes virtudes, que son muchas.<br />
- <a href="http://extjs.com/">Ext Js. </a>. Mi fuerte no es el javascript, lo reconozco, pero esta librería permite desarrollar interfaces de usuario web muy potentes.<br />
- <a href="http://wiki.codemongers.com/Main">Nginx</a>. Un servidor web ruso, muy liviano y muy rápido.<br />
- <a href="http://code.macournoyer.com/thin/">Thin</a>. Un nuevo servidor de aplicaciones para Ruby on Rails, con bastante mejor respuesta que el Mongrel, pero con la estabilidad como duda.<br />
- <a href="http://en.wikipedia.org/wiki/Memcached">Memcached</a>. Un servidor de cache en memoria.<br />
- <a href="http://www.ja-sig.org/products/cas/">CAS</a>. Una propuesta de Single Sign On.<br />
- <a href="http://openid.net/">OpenID</a>. Un nuevo sistema de autentificación web.<br />
- <a href="http://www.citrixxenserver.com/Pages/default.aspx">Xen</a>. Sistema de virtualización para sistemas Linux.<br />
- <a href="http://www.tildeslash.com/monit/">Monit</a>. Software de monitorización de servicios y recursos sobre Linux.<br />
- <a href="http://en.wikipedia.org/wiki/Action_Message_Format">AMF</a>. Protocolo de intercambio de información entre un servidor y una aplicación ActionScript.<br />
- <a href="http://merbivore.com/">Merb</a>. Un framework de desarrollo web, similar a Rails, pero más orientado a rendimiento.<br />
- <a href="http://www.microsoft.com/sharepoint/default.mspx">Microsoft Sharepoint</a>. Hay que reconocer que es el mejor software para Intranet disponible actualmente.</p>
<p>Fuera del trabajo:<br />
- <a href="http://mediatomb.cc/">Mediatomb</a></p>
<p>Por ahora las listo, para que me sirva de una guía de temas de los que tengo ganas de hablar por si alguien puede estar interesado en escucharme&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertooliva.com/2008/04/01/retomando/feed/</wfw:commentRss>
		</item>
		<item>
		<title>La importancia del testing</title>
		<link>http://www.robertooliva.com/2007/11/26/la-importancia-del-testing/</link>
		<comments>http://www.robertooliva.com/2007/11/26/la-importancia-del-testing/#comments</comments>
		<pubDate>Mon, 26 Nov 2007 19:42:28 +0000</pubDate>
		<dc:creator>Roberto M. Oliva</dc:creator>
		
		<category><![CDATA[Metodologías]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.robertooliva.com/2007/11/26/la-importancia-del-testing/</guid>
		<description><![CDATA[El jueves pasado estuve en la Conferencia de Rails en Madrid y me llamó mucho la atención, dentro de toda la controversia que creo el uso del testing en aplicaciones, lo poco que se implantaba y la poca importancia que se le daba.
Dentro de toda la polémica que suscitó había gente que dudaba de uso [...]]]></description>
			<content:encoded><![CDATA[<p>El jueves pasado estuve en la <a href="http://www.conferenciarails.org/">Conferencia de Rails</a> en Madrid y me llamó mucho la atención, dentro de toda la controversia que creo el uso del testing en aplicaciones, lo poco que se implantaba y la poca importancia que se le daba.</p>
<p>Dentro de toda la polémica que suscitó había gente que dudaba de uso durante las fases de desarrollo. Lo de siempre: Falta de tiempo, desconocimiento de uso, etc. Hacen que se le de muy poca importancia.</p>
<p>Mi experiencia me ha mostrado que el testing es una de las piedras angulares del desarrollo ágil actual porque afecta a todas las fases del desarrollo de un proyecto:<br />
- <strong>Diseño</strong>: Con <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a> (Test driven developement) se desarrollan los tests antes de implementar la funcionalidad. Esto nos define claramente como ha de funcionar dicho código. Nos ayuda a pararnos a definir el comportamiento externo de la pieza de código que vamos a escribir después del testeo.<br />
- <strong>Codificación</strong>: Con el testeo en <em>la mano</em> podemos dedicarnos a refactorizar o pulir nuestro código hasta que se ejecute de una manera limpia y eficaz facilitando, entre otras cosas, la mantenibilidad del código entre otros desarrolladores.<br />
- <strong>Integración en grupo</strong>: Si el proyecto se desarrolla en grupo nos es más fácil detectar aquellas cosas que estamos modificando en nuestro código y que afectan al resto. Nos facilita centrarnos en nuestra parte del código porque los testeos nos van a avisar qué espara el resto de desarrolladores de nuestra parte codificada y como se comporta el resto de las piezas de código no desarrolladas por nosotros.<br />
- <strong>Evolución del proyecto</strong>: Este es un aspecto crítico del desarrollo ágil. Nuestro proyecto va evolucionando en iteraciones cortas y totalmente funcionales. En vez de hacer un <em>megaproyecto</em> para el cliente, evolucionamos poco a poco el proyecto en la dirección en la que éste dicta según va revisando el funcionamiento del mismo. En cada iteración el cliente va obteniendo una versión parcial del proyecto, pero totalmente funcional. Con esta filosofía, si metemos nuevas funcionalidades los testeos nos van a decir claramente cuales son las partes del proyecto que hay que modificar para incorporar lo nuevo, y lo que es evidente: Cuando lo hayamos hecho nos va a decir si todo vuelve a funcionar correctamente.</p>
<p>Bajo mi punto de vista el desarrollo bajo el <em>paraguas</em> del testeo me parece, no algo ineludible, sino totalmente incuestionable. De las tres patas del desarrollo ágil (junto con Integración continua y Pair programing) es la única no negociable en ningún tipo de proyecto.</p>
<p>Además no sirve para nada la típica excusa de que, como hay que &#8220;desarrollar el doble&#8221;, con la presión de tiempo es imposible hacer testing. Más bien se podría decir al contrario: A la larga se reduce drásticamente el tiempo total empleado en el proyecto. Lo malo es la frase con la que se empieza: &#8220;A la larga&#8221; y también que para hacer buen testing, como todo en la vida, hay que aprender.</p>
<p>Según nos comentó <a href="http://ponencias.conferenciarails.org/autores/#49">Obie Fernandez</a> fuera de España el 90% de los desarrolladores de informática utiliza testing en el desarrollo de sus aplicaciones. Por lo visto en la pasada conferencia de Rails, en España, apenas se llegaba al 10%.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertooliva.com/2007/11/26/la-importancia-del-testing/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Flex: Mostrar imágen desde un servicio XML</title>
		<link>http://www.robertooliva.com/2007/07/30/flex-mostrar-imagen-desde-un-servicio-xml/</link>
		<comments>http://www.robertooliva.com/2007/07/30/flex-mostrar-imagen-desde-un-servicio-xml/#comments</comments>
		<pubDate>Mon, 30 Jul 2007 11:31:04 +0000</pubDate>
		<dc:creator>Roberto M. Oliva</dc:creator>
		
		<category><![CDATA[Flex]]></category>

		<category><![CDATA[Cairngorm]]></category>

		<guid isPermaLink="false">http://www.robertooliva.com/2007/07/30/flex-mostrar-imagen-desde-un-servicio-xml/</guid>
		<description><![CDATA[Pongo esta entrada porque me han pedido desde el grupo de Madeinflex más información de como mostrar una imágen desde un servicio XML. 
La idea es que tenemos una imágen almacenada en un servidor tal cual o embebida en una base de datos. Programamos un servicio que devuelva dicha imágen en formato Base64. No voy [...]]]></description>
			<content:encoded><![CDATA[<p>Pongo esta entrada porque me han pedido desde el grupo de <a href="http://groups.google.com/group/madeinflex">Madeinflex</a> más información de como mostrar una imágen desde un servicio XML. </p>
<p>La idea es que tenemos una imágen almacenada en un servidor tal cual o embebida en una base de datos. Programamos un servicio que devuelva dicha imágen en formato <a href="http://es.wikipedia.org/wiki/Base64">Base64</a>. No voy a entrar en como desarrollar este servicio, ya que dependerá de la tecnología utilizada: Rails, ASP.NET, PHP, Coldfusion, etc. Pero la idea es que dicho servicio cargue la foto desde la base de datos o desde el fichero físico y la codifique en Base64 para enviarla dentro de un XML al cliente Flex. Si os sirve de ayuda, nosotros lo hacemos así porque almacenamos la foto, tal cual en formato Base64, en un campo de tipo <em>Text</em> dentro de la base de datos. Este servicio, devolverá un XML similar al siguiente que, como se puede ver, es fácil diseñarlo para poder enviar varias fotos de golpe:</p>
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="400" height="380" id="ftf_wp" align="middle">
<param name="movie" value="http://www.robertooliva.com/wp-content/plugins/ftf/ftf_wp.swf" />
<param name="quality" value="high" />
<param name="scale" value="noscale" />
<param name="bgcolor" value="#ffffff" />
<param name="flashvars" value="w=400&#038;h=380&#038;file=http://www.robertooliva.com/wp-content/uploads/2007/04/xml1.xml&#038;ftf=true&#038;no=0&#038;def=http://www.robertooliva.com/wp-content/plugins/ftf/definitions/as2.xml&#038;auto=true&#038;" />
<embed src="http://www.robertooliva.com/wp-content/plugins/ftf/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="400" height="150" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=400&#038;h=150&#038;file=http://www.robertooliva.com/wp-content/uploads/2007/04/xml1.xml&#038;ftf=true&#038;no=0&#038;def=http://www.robertooliva.com/wp-content/plugins/ftf/definitions/as2.xml&#038;auto=true&#038;" /><br />
</object>
</p>
<p>En Flex, tendremos un <em>Command</em> (programamos utilizando <a href="http://labs.adobe.com/wiki/index.php/Cairngorm">Cairngorm</a>), que, apoyándose en un <em>Bussiness Delgate</em>, se descarga el XML en un objeto del ModelLocator accesible por la aplicación.</p>
<p>En el formulario de visualización de la foto, ponemos un campo imágen:</p>
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="400" height="380" id="ftf_wp" align="middle">
<param name="movie" value="http://www.robertooliva.com/wp-content/plugins/ftf/ftf_wp.swf" />
<param name="quality" value="high" />
<param name="scale" value="noscale" />
<param name="bgcolor" value="#ffffff" />
<param name="flashvars" value="w=400&#038;h=100&#038;file=http://www.robertooliva.com/wp-content/uploads/2007/04/flex2.xml&#038;ftf=true&#038;no=0&#038;def=http://www.robertooliva.com/wp-content/plugins/ftf/definitions/as2.xml&#038;auto=true&#038;" />
<embed src="http://www.robertooliva.com/wp-content/plugins/ftf/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="400" height="100" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=400&#038;h=200&#038;file=http://www.robertooliva.com/wp-content/uploads/2007/04/flex2.xml&#038;ftf=true&#038;no=0&#038;def=http://www.robertooliva.com/wp-content/plugins/ftf/definitions/as2.xml&#038;auto=true&#038;" /><br />
</object>
</p>
<p>Y luego un script que permita interpretar el objeto XML descargado anteriormente para asignárselo al source de la imágen:</p>
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="400" height="380" id="ftf_wp" align="middle">
<param name="movie" value="http://www.robertooliva.com/wp-content/plugins/ftf/ftf_wp.swf" />
<param name="quality" value="high" />
<param name="scale" value="noscale" />
<param name="bgcolor" value="#ffffff" />
<param name="flashvars" value="w=400&#038;h=380&#038;file=http://www.robertooliva.com/wp-content/uploads/2007/04/flex3.xml&#038;ftf=true&#038;no=0&#038;def=http://www.robertooliva.com/wp-content/plugins/ftf/definitions/as2.xml&#038;auto=true&#038;" />
<embed src="http://www.robertooliva.com/wp-content/plugins/ftf/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="400" height="380" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=400&#038;h=200&#038;file=http://www.robertooliva.com/wp-content/uploads/2007/04/flex3.xml&#038;ftf=true&#038;no=0&#038;def=http://www.robertooliva.com/wp-content/plugins/ftf/definitions/as2.xml&#038;auto=true&#038;" /><br />
</object>
</p>
<p>Resumiendo:<br />
- Cargamos en un XML los datos del servicio.<br />
- Llamamos a la funcion: <em>loadImage,</em> para que lea dicho XML y se lo asigne a un control de tipo: <em>Image</em>.</p>
<p><strong>He desarrollado un proyecto que contiene un ejemplo completo de lo aquí expuesto: <a href="http://www.robertooliva.com/images/LoadImage.rar">LoadImage.rar</a>. Es importante leer el fichero <em>README.TXT</em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertooliva.com/2007/07/30/flex-mostrar-imagen-desde-un-servicio-xml/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Apuntes para RJS</title>
		<link>http://www.robertooliva.com/2007/07/30/apuntes-para-rjs/</link>
		<comments>http://www.robertooliva.com/2007/07/30/apuntes-para-rjs/#comments</comments>
		<pubDate>Mon, 30 Jul 2007 09:32:56 +0000</pubDate>
		<dc:creator>Roberto M. Oliva</dc:creator>
		
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.robertooliva.com/2007/07/30/apuntes-para-rjs/</guid>
		<description><![CDATA[Estos son trozos de código de RJS que pongo aquí porque creo que son muy interesantes y porque me va a ayudar el guardarlos aquí:
Como mostrar un mensaje de alerta al pulsar en un enlace, con indicador de funcionamiento y llamando a un servicio web:
En el cliente (rhtml):

< %= link_to_remote "Alert without RJS",
   [...]]]></description>
			<content:encoded><![CDATA[<p>Estos son trozos de código de RJS que pongo aquí porque creo que son muy interesantes y porque me va a ayudar el guardarlos aquí:</p>
<p>Como mostrar un mensaje de alerta al pulsar en un enlace, con indicador de funcionamiento y llamando a un servicio web:</p>
<p>En el cliente (rhtml):</p>
<p><code></p>
<p>< %= link_to_remote "Alert without RJS",<br />
       :url => { :action => &#8220;alert_without_rjs&#8221; }</p>
<p>    <span id="indicator" style="display: none;">Loading&#8230;</span><br />
</code></p>
<p>En el servidor (rb):</p>
<p><code><br />
  def alert_without_rjs<br />
    render :text => "alert('Hello without RJS')",<br />
         :content_type => "text/javascript"<br />
  end<br />
</code></p>
<p>También se puede hacer renderizando una plantilla, con el mismo código rhtml:</p>
<p>En el servidor </p>
<p><code><br />
  def alert_without_rjs<br />
  end<br />
</code></p>
<p>Una plantilla: <em>alert_without_rjs.rjs</em>:</p>
<p><code><br />
page.alert "Hello with RJS"<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertooliva.com/2007/07/30/apuntes-para-rjs/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Este camino se acabará algún día?</title>
		<link>http://www.robertooliva.com/2007/06/29/esta-camino-se-acabara-algun-dia/</link>
		<comments>http://www.robertooliva.com/2007/06/29/esta-camino-se-acabara-algun-dia/#comments</comments>
		<pubDate>Fri, 29 Jun 2007 11:54:42 +0000</pubDate>
		<dc:creator>Roberto M. Oliva</dc:creator>
		
		<category><![CDATA[Ruby on Rails]]></category>

		<category><![CDATA[Flex]]></category>

		<category><![CDATA[Cairngorm]]></category>

		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.robertooliva.com/2007/06/29/esta-camino-se-acabara-algun-dia/</guid>
		<description><![CDATA[Por un lado me gustaría, pero por otro lado no, ya que me aburriría terriblemente.
Sigo con mis investigaciones de nuevas tecnologías para Rails y para Flex.
Me encontré el siguiente tutorial para implementar REST en Rails: Tutorial de desarrollo REST con Ruby on Rails
No está mal el sistema que utilizamos para comunicar los servicios web desarrollados [...]]]></description>
			<content:encoded><![CDATA[<p>Por un lado me gustaría, pero por otro lado no, ya que me aburriría terriblemente.<br />
Sigo con mis investigaciones de nuevas tecnologías para <a href="http://www.google.es/url?sa=t&#038;ct=res&#038;cd=1&#038;url=http%3A%2F%2Fwww.rubyonrails.org%2F&#038;ei=FvKERqCbFJKywAGxgb0V&#038;usg=AFQjCNGcMOt6Nx2BNpsE0CqG8sfjmajxyg&#038;sig2=b825BFl3ylqw1DbP7mPU4A">Rails</a> y para <a href="http://www.adobe.com/flex">Flex.</a></p>
<p>Me encontré el siguiente tutorial para implementar <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer">REST</a> en Rails: <a href="http://mephisto.sobrerailes.com/articles/2007/6/20/tutorial-desarrollo-rest-con-ruby-on-rails/">Tutorial de desarrollo REST con Ruby on Rails</a></p>
<p>No está mal el sistema que utilizamos para comunicar los servicios web desarrollados con Rails y las aplicaciones cliente desarrolladas con Flex. Funciona bastante bien y con poca carga en la red, pero es poco flexible. Cualquier cambio supone un problema y esto va en contra de la naturaleza del desarrollo ágil. Esto es lo que me hace seguir investigando (y, bueno, que no tengo ganas de aburrirme).</p>
<p>Ahora estoy buscando la manera de integrar Flex con REST. Sería la manera más natural de utilizar los ValueObjects de <a href="http://labs.adobe.com/wiki/index.php/Cairngorm">Cairgorm</a>. Los cuales hemos dejado de utilizar totalmente con nuestra manera de trabajar.<br />
De todas formas, dentro de este camino de investigación constante en el que estoy sumido, deprime un poco ver enlaces como el siguiente: <a href="http://www.fngtps.com/2007/06/flex-can-t-do-rest">Flex can&#8217;t do REST</a>. No pienso desfallecer.</p>
<p>Esto en cuanto al camino del desarrollo, pero también estoy siguiendo el camino de los sistemas. Ya he aprendido mucho de Linux, cuando me he topado con <a href="http://www.cl.cam.ac.uk/research/srg/netos/xen/">Xen</a>. Aunque, también hay que <a href="http://www.kriptopolis.org/seguridad-de-maquinas-virtualizadas">tomárselo con cuidado</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertooliva.com/2007/06/29/esta-camino-se-acabara-algun-dia/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ayuda a la depuración</title>
		<link>http://www.robertooliva.com/2007/06/11/ayuda-a-la-depuracion/</link>
		<comments>http://www.robertooliva.com/2007/06/11/ayuda-a-la-depuracion/#comments</comments>
		<pubDate>Mon, 11 Jun 2007 18:02:36 +0000</pubDate>
		<dc:creator>Roberto M. Oliva</dc:creator>
		
		<category><![CDATA[Metodologías]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Drupal]]></category>

		<guid isPermaLink="false">http://www.robertooliva.com/2007/06/11/ayuda-a-la-depuracion/</guid>
		<description><![CDATA[Esto que voy a contar no es nada nuevo, lo que pasa es que lo estoy utilizando intensivamente y con ello estoy desarrollando más fácilmente. Son técnicas para depurar aplicaciones:
Ruby On Rails:
Lo que más me está ayudando es correr la aplicación en un mongrel sobre Linux y ejecutar en una consola lo siguiente (cambiando RAILS_ROOT [...]]]></description>
			<content:encoded><![CDATA[<p>Esto que voy a contar no es nada nuevo, lo que pasa es que lo estoy utilizando intensivamente y con ello estoy desarrollando más fácilmente. Son técnicas para depurar aplicaciones:</p>
<p><strong>Ruby On Rails:</strong></p>
<p>Lo que más me está ayudando es correr la aplicación en un mongrel sobre Linux y ejecutar en una consola lo siguiente (cambiando RAILS_ROOT por el directorio donde esté la apliación:</p>
<p><code>tail -f {RAILS_ROOT}/log/devlopment.log</code></p>
<p>E incluir el siguiente código, cuando quiera notificar algo para verlo en el log:</p>
<p><code>logger.debug ( "Texto de depuración")</code></p>
<p>Esto me permite que, mientras estoy ejecutando la aplicación voy viendo, en tiempo real, el resultado de la ejecución de dicha aplicación.</p>
<p><strong>Drupal</strong></p>
<p>Drupal está desarrollado en PHP, por lo que cualquier técnica de depuración válida en PHP lo será para Drupal. Lo que ocurre es que hay una serie de herramientas muy útiles a la hora de depurar. La primera es un módulo denominado <a href="http://drupal.org/project/devel">Devel</a>, con él podremos ver fácilmente las llamadas a la base de datos, ciertos parámetros de los formularios, etc. Lo más interesante de este módulo es una función denominada: <code>dpr</code>. Es similar a <code>print_r</code>, con la ventaja de que formatea la salida, indentando los arrays, haciendo más fácil su lectura.</p>
<p>El otro grave inconveniente de la depuración de código de Drupal es el sistema de hooks para implementar llamadas. Este sistema permite implementar una función personal que será llamada en vez de la habitual del <em>core</em> de Drupal. Esto facilita mucho el adaptar Drupal a necesidades particulares en aquellos elementos que se quieran retocar, dejando el resto a su implementación por defecto.<br />
El problema, es que las llamadas a funciones no tienen porque coincidir con el nombre de la función, siendo muy difícil, con una simple búsqueda al código, saber qué función llamó a cual otra. Para solventar este problema y saber cual es el proceso de llamadas hasta una determinada función, yo recomiendo utilizar la función PHP: <code>debug_backtrace()</code> que devuelve un Array con la información de las llamadas a funciones anteriores.<br />
Esta función, unida a la anteriormente mencionada:</p>
<p><code>dpr(debug_backtrace());</code></p>
<p>Facilita mucho el seguimiento de ejecución de las funciones en Drupal.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertooliva.com/2007/06/11/ayuda-a-la-depuracion/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Microsoft Silverlight</title>
		<link>http://www.robertooliva.com/2007/05/08/microsoft-silverlight/</link>
		<comments>http://www.robertooliva.com/2007/05/08/microsoft-silverlight/#comments</comments>
		<pubDate>Tue, 08 May 2007 10:36:34 +0000</pubDate>
		<dc:creator>Roberto M. Oliva</dc:creator>
		
		<category><![CDATA[.NET Framework]]></category>

		<category><![CDATA[Personal]]></category>

		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.robertooliva.com/2007/05/08/microsoft-silverlight/</guid>
		<description><![CDATA[Parece bastante obvio que Microsoft tiene actualmente dos competidores muy fuertes: Adobe y Google. 
El primero tiene copado el mercado de reproductores multimedia para navegadores web multiplataforma con Flash. Podría apostar a que hay más reproductores Flash instalados que ordenadores con sistema operativo Windows. También tiene controlado el mercado de los documentos electrónicos con el [...]]]></description>
			<content:encoded><![CDATA[<p>Parece bastante obvio que Microsoft tiene actualmente dos competidores muy fuertes: <a href="http://www.adobe.com/">Adobe</a> y <a href="http://www.google.es">Google.</a> </p>
<p>El primero tiene copado el mercado de reproductores multimedia para navegadores web multiplataforma con Flash. Podría apostar a que hay más reproductores Flash instalados que ordenadores con sistema operativo Windows. También tiene controlado el mercado de los documentos electrónicos con el Acrobat.<br />
El segundo, Google, esta reinventando el término de Sistema Operativo. Y su expansión de productos está siendo al revés de lo que en su día hizo Microsoft. No creo que quede mucho para que Google presente su S. O. propio. Eso si: corriendo en un navegador Web.</p>
<p>La estrategia de Microsoft para hacer frente a Adobe pasa por dos productos: </p>
<ul>
<li>
Silverlight: Es un reproductor de aplicaciones RIA (Rich Internet Application) multiplataforma (bueno, Windows y Mac) y multinavegador. Convirtiéndose en el equivalente de Adobe Flash. Mientras que las aplicaciones Flash se programan con Flex, las de Silverlight se programarán con .NET.
</li>
<li>
Metro: Es un formato para documentos electrónicos. En su momento dijeron que Vista incluiría un lector y que se podría crar contenido en este formato de manera gratuita.
</li>
</ul>
<p>Esto es una guerra continua. Parece que las empresas dominantes del sector se dedican exclusivamente a utilizar su poder para copiar lo que otros se han currado con imaginación y buen hacer. Y no lo digo por Microsoft solamente, en su tiempo Bill Gates se vio amenazado por el poder de IBM&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertooliva.com/2007/05/08/microsoft-silverlight/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
