<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Alejandro Pirola</title>
	<atom:link href="http://apirola.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://apirola.wordpress.com</link>
	<description>Just another monkey, coding for fun</description>
	<lastBuildDate>Wed, 25 Jan 2012 02:15:59 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='apirola.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Alejandro Pirola</title>
		<link>http://apirola.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://apirola.wordpress.com/osd.xml" title="Alejandro Pirola" />
	<atom:link rel='hub' href='http://apirola.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Sobre NoSQL, escalabilidad y otras yerbas</title>
		<link>http://apirola.wordpress.com/2011/10/24/sobre-nosql-y-otras-yerbas/</link>
		<comments>http://apirola.wordpress.com/2011/10/24/sobre-nosql-y-otras-yerbas/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 04:48:11 +0000</pubDate>
		<dc:creator>alejamp</dc:creator>
				<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[RavenDB]]></category>
		<category><![CDATA[Redis]]></category>
		<category><![CDATA[Riak]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[Cassandra]]></category>
		<category><![CDATA[escalabilidad]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[ravendb]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://apirola.wordpress.com/?p=198</guid>
		<description><![CDATA[Creo que todos quienes hemos trabajado en desarrollo de sistemas, sobre todo en empresas, pensamos que existe solo un tipo de base datos y todas tienen en común que son SQL. La vieja guardia es una amplia lista de implementaciones de bases relacionales que utilizan SQL para la definición y consulta de los datos. Estas implementaciones del modelo relacional [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=198&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Creo que todos quienes hemos trabajado en desarrollo de sistemas, sobre todo en empresas, pensamos que existe solo un tipo de base datos y todas tienen en común que son SQL.</p>
<p>La vieja guardia es una amplia lista de implementaciones de bases relacionales que utilizan SQL para la definición y consulta de los datos. Estas implementaciones del modelo relacional de Codd han monopolizado el mercado de las bases de datos desde 1970.  40 y tantos anios de hegemonía lo hacen hoy el standard de base de datos mas aceptado, utilizado y probado del mundo.</p>
<p><img title="Más..." src="http://apirola.wordpress.com/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /></p>
<p>Pero la tecnología cambia, y hoy las redes y los servicios en la nube imponen nuevos desafíos, y nuevas tecnologías comienzan a demostrar que la vieja guardia no puede adaptarse.</p>
<p>Los nuevos desafios son:</p>
<h3>Escalabilidad lineal</h3>
<p>Se entiende por escalabilidad a la habilidad de una aplicación de crecer para satisfacer la demanda, sin cambiar el codigo cumpliendo con los parámetros de aceptabilidad del usuario. Una vez de acuerdo en el significado de escalabilidad, decimos que la escalabilidad lineal es la capacidad de crecer tanto como se necesite a un precio fijo por unidad de capacidad de procesamiento adicional.</p>
<h3>Escalabilidad elástica</h3>
<p>Si ser escalable significa solo crecer para adaptarse a la demanda, ser elástico implica también reducirse. Puede parecer algo trivial pero un sistema que escala no siempre logra reducirse y disminuir su costo de mantenimiento ante una baja en la demanda. En resumen se trata de la capacidad de un sistema de adaptarse a la demanda variable.</p>
<p>Llevar a la practica este concepto necesita mucho mas que la elección correcta de una base datos. Implica que la arquitectura del sistema sea acorde, pero no es el punto de este articulo. Para mas info leer <a href="http://www.gigaspaces.com/wiki/download/attachments/1835009/FromDeadEndToOpenRoad.pdf?version=1" target="_blank">The Scalability Revolution: From Dead End to Open Road </a>.</p>
<h3>Tolerante a fallos</h3>
<p>Es la capacidad de una base de seguir funcionando (proporcionando acceso r/w a los datos) a pesar de que uno de sus nodos/instancias haya dejado de funcionar. Normalmente esto se resuelve con replicacion pero en los sistemas de base de datos de la vieja guardia esto requiere algun tipo de centralización y por consiguiente genera a la larga un <a href="http://en.wikipedia.org/wiki/Single_point_of_failure" target="_blank">SPOF </a>(Single Point of Failure).</p>
<h3>Descentralizada</h3>
<p>Que cada nodo en el cluster sea idéntico y no exista un SPOF o cuello de botella de red.</p>
<h2></h2>
<h2>Bemoles</h2>
<p>Todas estas cualidades no existen si no se hacen algunas concesiones. Existe un principio o un teorema sobre computacion distribuido conocido como CAP. Que dice que es imposible para un sistema distribuido garantizar que estas tres cualidades se cumplan al mismo tiempo:</p>
<ol>
<li>Consistencia: todos los nodos ven la misma información todo el tiempo.</li>
<li>Disponibilidad: todos los requests tienen una respuesta siempre.</li>
<li>Tolerante a partición: el sistema continua operando a pesar de perdida de datos.</li>
</ol>
<p>El teorema dice que solo dos de estas cualidades, a la vez, puede ser satisfechas por el sistema, pero no las tres. En la mayoría de los casos 2 y 3 son garantizadas por las bases NoSQL,  y la 1 es algo que pasa a ser una responsabilidad de la aplicación.</p>
<p>Otra complicación a tener en cuenta es que al ser key-value, sobre todo en las distribuidas, tareas como paginar, buscar o sumarizar  que pueden parecer triviales en en los clásicos SQL, son un verdadero dolor de cabeza en las NoSQL. Lo cual es natural si tenemos en cuenta que los objetos se encuentran replicados en los nodos que componen el cluster. Riak por ejemplo ha incorporando en su versión 1.0 un motor de full-text search Raik Search pero a la hora de una simple paginacion tenemos que recurrir a estructuras complejas que nos permitan simularlo.</p>
<h2>Bases de datos NoSQL</h2>
<p>Esta una lista de las mas importantes. De las cuales he trabajado con Redis, RavenDB y Riak:</p>
<ul>
<li><a href="http://hbase.apache.org/" target="_blank">HBase</a></li>
<li><a href="http://www.mongodb.org/" target="_blank">MongoDB</a></li>
<li><a href="http://wiki.basho.com/Riak.html" target="_blank">Riak</a></li>
<li><a href="http://project-voldemort.com/" target="_blank">Voldemort</a></li>
<li><a href="http://neo4j.org/" target="_blank">Neo4J</a></li>
<li><a href="http://cassandra.apache.org/" target="_blank">Cassandra</a></li>
<li><a href="http://hypertable.org/" target="_blank">Hypertable</a></li>
<li><a href="http://www.kobrix.com/hgdb.jsp" target="_blank">HyperGraphDB</a></li>
<li><a href="http://memcached.org/" target="_blank">Memcached</a></li>
<li><a href="http://redis.io/" target="_blank">Redis</a></li>
<li><a href="http://couchdb.apache.org/" target="_blank">CouchDB</a></li>
<li><a href="http://ravendb.net/" target="_blank">RavenDB</a></li>
</ul>
<h2></h2>
<h2>Un paseo por alguna de ellas</h2>
<h3>RavenDB</h3>
<p>Base datos key-value codificada en C#. La misma provee soporte de:</p>
<ul>
<li>Map Reduce</li>
<li>Indexing</li>
<li>Full-text search</li>
<li>Replication (master-slave ok, master-master aun no lo he probado)</li>
<li>Key expiration</li>
<li>Transactions</li>
<li>Slice queries (facil de paginar)</li>
<li>Silverlight/HTML  Administration Console.</li>
</ul>
<div>Pero aun no soporta:</div>
<div>
<ul>
<li>Sharding: si bien el codigo del cliente soporta sharding de una manera similar a como lo hace NHibernate, aun falta mucho para que sea aceptable. Hay una serie de bugs reportados y no resueltos con los queries sin indices, y aun no provee soporte de Linq sobre los queries al sharding. Y esta aun lejos de hacerlo dado que debe falta mucho trabajo antes de que RavenDB pueda hacer un query slice, o un map reduce sobre los shards. Si bien permite distribuir el contenido en shard por medio de una estrategia definida por el usuario, una vez implementado se pierden habilidades de consulta claves.</li>
<li>Fault tolerant: se que implementa un mecanismo desde el cliente, que aun no he podido probar, pero se basa en la existencia de otras instancias interconectadas por replicacion master-master o master-slave con opción de promover el slave en caso de que el master caiga.</li>
</ul>
<div>En resumen RavenDB hoy por hoy no es escalable linealmente, el sharding es una mera intención, que en palabras de su creador aun no ha sido probado y por experiencia personal con el codigo fuente de RavenDB dista de estar siquiera en alfa.</div>
</div>
<h3></h3>
<h3>Redis</h3>
<p>Luego de mi paso por RavenDB, Redis me dio muchas mas satisfacciones pero trajo sus problemas. Hay que reconocer que es realmente veloz pero esta mas cerca de una cache &#8220;distribuida&#8221; con opción a persistencia que de una base de datos.</p>
<p>Hay que pensar a Redis como una cache con opcion a persistencia y que provee una serie de estructuras de datos sobre el formato key-value como:</p>
<ul>
<li>Hashes</li>
<li>Lists</li>
<li>Sets</li>
<li>Sorted Sets</li>
<li>Pub/Sub</li>
<li>Transactions</li>
</ul>
<div>Lo mas interesante es que la API provee comandos atómicos para modificar estas estructuras para garantizar completo soporte de concurrencia. Es muy facil implementar sobre Redis, por ejemplo, una queue dado que las Listas tienen comando LPOP, RPOP, LPUSH, LINSERT, etc. Incluso podemos implementar un rudimentaro sistema de notificaciones para esta queue sobre el servicio Pub/Sub de Redis.</div>
<div>Pub/Sub nos permite hacer broadcast de mensajes por medio de canales a los cuales podemos subscribirnos o publicar mensajes (una cadena de texto plana o un objeto JSON). Sin duda un feature que la distingue del resto.</div>
<div>Algunas librerias que dan soporte de Queues:</div>
<div>
<ul>
<li>C# <a href="https://github.com/alejamp/Resques.net" target="_blank">Resques.Net</a>:
<ul>
<li>soporta New Item Notification using Pub/Sub</li>
<li>Capped collections</li>
<li>Stacks</li>
<li>Queues</li>
</ul>
</li>
<li>Python <a href="https://github.com/tnm/qr" target="_blank">QR</a></li>
<li><a href="http://www.restmq.com/" target="_blank">RestMQ</a></li>
</ul>
<div>Como contras, Redis no posee Indices, ni MapReduce, las búsquedas sobre un un dato de los objetos almacenados se debe efectuar uno por uno o en su defecto contemplando el problema en la aplicación desde un comienzo.</div>
<div>En cuanto a escalabilidad, se encuentra planificado <a href="http://www.restmq.com/" target="_blank">Redis Cluster</a> e incluso creo que se puede ser probado una versión alfa, pero actualmente lo único que permite Redis es la replicacion  master-slave.</div>
<div>Para proporcionar Faul-tolerance sobre esta estructura hay que adicionar a nuestra aplicación código para que promueva un slave en caso de error en el master.  Algo realmente poco practico.</div>
<div>En Conclusion, Redis no escalable linealmente. Pero esta efectuando al parecer un intento bastante serio de querer serlo en el futuro. Espero que para 2012 pueda competir con los grandes.</div>
</div>
<h3>Riak</h3>
<p>Actualmente me encuentro probando Riak con un cliente <a href="http://nodejs.org/" target="_blank">NodeJS</a> llamado <a href="http://riakjs.org/" target="_blank">riak-js</a>. Riak es una base inspirada en <a href="http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html" target="_blank">Dynamo</a> y que provee una verdadera arquitectura distribuida. Y lo que es mas importante permite escalabilidad elastica ya que proporciona comandos para atachar nodos al cluster y removerlos sin perdida de datos.</p>
<p>También proporciona Map Reduce e Indices Secundarios y Links (feature muy interesante).  Pero como contra no podemos hacer query slices (escensiales en la paginacion) y ordenamientos. Cada query retorna los datos en un orden diferente ya que depende de como los entreguen los nodos. <a href="http://wiki.basho.com/Links-and-Link-Walking.html" target="_blank">Link walking</a> y <a href="http://basho.com/blog/technical/2011/09/14/Secondary-Indexes-in-Riak/" target="_blank">Secondary Indexes</a> son features muy interesantes para tener en cuenta.</p>
<p>En conclusión Riak promete ser escalable linealmente y elástica voy a seguir trabajando con Riak, para entender mejor como resolver problemas básicos como un query slice.</p>
<h3></h3>
<h3>Cassandra</h3>
<p>Pronto. Durante el próximo mes me he propuesto instalar y probar esta base de datos que promete, dado su amplia utilización, ser muy completa.</p>
<div>Algunos links de interés:</div>
<p><a href="http://www.elasticvapor.com/">http://www.elasticvapor.com/</a></p>
<p><a href="http://www.spotcloud.com/">http://www.spotcloud.com/</a></p>
<pre><a href="http://www.gigaspaces.com/wiki/download/attachments/1835009/FromDeadEndToOpenRoad.pdf?version=1">The Scalability Revolution: From Dead End to Open Road </a>
An SBA Concept Paper
By Nati Shalom, CTO  |  February 2007</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apirola.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apirola.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apirola.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apirola.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apirola.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apirola.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apirola.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apirola.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apirola.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apirola.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apirola.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apirola.wordpress.com/198/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apirola.wordpress.com/198/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apirola.wordpress.com/198/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=198&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apirola.wordpress.com/2011/10/24/sobre-nosql-y-otras-yerbas/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1b00c5591200fc85743b34dbdaf792b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alejamp</media:title>
		</media:content>

		<media:content url="http://apirola.wordpress.com/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" medium="image">
			<media:title type="html">Más...</media:title>
		</media:content>
	</item>
		<item>
		<title>R.I.P. Silverlight y Flash</title>
		<link>http://apirola.wordpress.com/2011/10/06/r-i-p-silverlight-y-flash/</link>
		<comments>http://apirola.wordpress.com/2011/10/06/r-i-p-silverlight-y-flash/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 03:19:24 +0000</pubDate>
		<dc:creator>alejamp</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://apirola.wordpress.com/?p=191</guid>
		<description><![CDATA[Creo que lo que el difunto Steve Jobs alguna vez vaticino sobre Flash se cumple. HTML5 crece junto con el segmento mobile y la necesidad de unificar un standard de codificación independiente de la plataforma y que por supuesto no este basada en mágicos generadores de código. Los frameworks que aprovechan todas las facilidades de HTML5 + CSS3 + JavaScript [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=191&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="RIP" src="http://www.lifelan.com/blog/wp-content/uploads/silverlight-flash-html5.jpg" alt="RIP" width="180" height="108" /> Creo que lo que el difunto Steve Jobs alguna vez vaticino sobre Flash se cumple. HTML5 crece junto con el segmento mobile y la necesidad de unificar un standard de codificación independiente de la plataforma y que por supuesto no este basada en mágicos generadores de código.</p>
<p>Los frameworks que aprovechan todas las facilidades de HTML5 + CSS3 + JavaScript compiten con aplicaciones nativas en algunos casos mano a mano. Hoy  en dia claramente si buscamos fluides en el UI, velocidad de procesamiento, acceso a  recursos de hardware no podes escapar a utilizar codigo nativo de la plataforma. Pero donde esta necesidad no prima encontramos mayores facilidades en un entorno HTML5.</p>
<p>Ese es el hoy, pero el futuro plantea un escenario en donde las ventajas del codigo nativo no seran tales y las GUI seran tan fluidas en HTML5 como lo son las nativas.</p>
<p>Hoy hay que entender que las plataformas que permiten la utilizacion de HTML5 frameworks son aquellas que poseen navegadores basados en <a href="http://es.wikipedia.org/wiki/WebKit" target="_blank">webkit</a> y no son muchas pero si las mas importantes:</p>
<ul>
<li>Apple Safari en su linea Mac OSX, iPad,  iPhone, iPod Touch.</li>
<li>Android</li>
<li>Chrome</li>
<li>etc.</li>
</ul>
<div>Quienes quedan fuera del juego:</div>
<div>
<ul>
<li>Windows Mobile</li>
<li>Windows Phone 7</li>
<li>Windows 8?</li>
<li>RIM (todos sus equipos no touch anteriores al o.s. ver6)</li>
</ul>
<div>Para cada uno de estos podemos encontrar ad-hoc scripts y HTML pero ninguno cumplimenta el<a href="http://dev.w3.org/html5/spec/Overview.html" target="_blank"> standard HTML5</a>. Algunos de los features que HTML5 provee son:</div>
</div>
<div>
<ul>
<li>OFFLINE STORAGE</li>
<li>DEVICE ACCESS</li>
<li>CONNECTIVITY / REALTIME</li>
<li>PERFORMANCE &amp; INTEGRATION</li>
<li>MULTIMEDIA</li>
<li>SEMANTICS</li>
<li>GRAPHICS, 3D &amp; EFFECTS</li>
<li>CSS3 / STYLING</li>
</ul>
</div>
<div>Al margen, una serie de compras y modificaciones marcan el camino a una unificacion sobre HTML5.</div>
<div>
<ol>
<li><strong><a href="http://www.phonegap.com/" target="_blank">Phonegap </a>fue comprado por Adobe</strong>. Para los que no lo conocen Phonegap es un framework de apps. HTML5 que le permite a los desarrolladores un acceso común a las <a href="http://docs.phonegap.com/en/1.1.0/index.html" target="_blank">funciones nativas de cada dispositivo</a>: acelerometros, cámara, captura de imágenes, compás digital, conexión, gps, media, notificaciones,  almacenamiento, etc. Como todos sabemos Adobe en su momento habia adquirido Macromedia quien era el creador de Flash y sobre esto baso su tecnologia Air. Con lo cual esto seria un paso decidido de Adobe hacia HTML5. Notas relacionadas:<a href="http://www.tutorialesadobe.conectatutoriales.com/blog/noticias-y-articulos/126"> Adobe adquiere Nitobi</a>.</li>
<li><strong>Windows Phone 7</strong> ha anunciado <strong><a href="http://www.winrumors.com/microsoft-benchmarks-windows-phone-browser-against-iphone-4-and-android-wins/" target="_blank">compatibilidad webkit</a></strong> y soporte completo de HMTL5 en sus futuras actualizaciones de Windows Phone 7 que vendrian con IE9. (también incluye en el anuncio la inclusión de soporte para Silverlight, pero no creo que eso haya impactado como lo primero).</li>
<li><strong><a href="http://ripple.tinyhippos.com/" target="_blank">Ripple </a>fue comprada por RIM</strong>. Si si, el lento y pesado elefante moribundo del mundo mobile, resiste. Ha comprado una empresa cuyo principal producto es un conjunto de herramientas HTML5 y JS que forman una suerte de IDE (siendo muy generoso) que permite emular un dispositivo móvil. Pero no estamos hablando de un simulador iOS o Andriod, sino de un emulador de webkit (en definitiva un iframe en un navegador Chrome) que nos permite jugar con los diferentes tamanos de pantallas, inclinar el dispositivo, actualizar el gps, etc. Todo esto es realizado utilizando Phonegap y alternativas. Con lo cual no estamos hablando de un framework de desarrollo propiamente dicho sino de un entorno o set de herramientas que junto con el debugger de Chrome es una suerte de IDE.</li>
<li>Microsoft apuesta ahora a las Metro Apps para su plataforma Windows 8. Alguien dijo Silverlight? no&#8230; de hecho quieren que Windows 8 corra bien en una core i7 como en una tablet con ARM, donde no hay lugar para Flash o Silverlight.</li>
<li><a href="http://techpinions.com/rip-flash-and-silverlight-too/2630" target="_blank">Para Microsoft es oficial</a>:</li>
</ol>
</div>
<blockquote>
<div> &#8221;In a post to the Building Windows 8 blog, Internet Explorer development chief Dean Hachamovich made clear the IE 10 browser in Windows 8 will not support plug-ins. That means that neither flash nor Silverlight will run in IE (though other apps, including other browsers, may support the Flash and Silverlight players.) Instead, Microsoft will follow Apple’s lead and rely on native HTML 5 for rich web applications and media play.&#8221;</div>
</blockquote>
<div>Microsoft, Apple, Google, Android y ahora Adobe están en la carrera del por el calis sagrado: un framework HTML5 CSS3 JS multiplataforma. Solo espero que en el medio respeten los standards.</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apirola.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apirola.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apirola.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apirola.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apirola.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apirola.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apirola.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apirola.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apirola.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apirola.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apirola.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apirola.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apirola.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apirola.wordpress.com/191/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=191&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apirola.wordpress.com/2011/10/06/r-i-p-silverlight-y-flash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1b00c5591200fc85743b34dbdaf792b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alejamp</media:title>
		</media:content>

		<media:content url="http://www.lifelan.com/blog/wp-content/uploads/silverlight-flash-html5.jpg" medium="image">
			<media:title type="html">RIP</media:title>
		</media:content>
	</item>
		<item>
		<title>Appcelerator Titanium Editors</title>
		<link>http://apirola.wordpress.com/2010/11/20/appcelerator-titanium-ides/</link>
		<comments>http://apirola.wordpress.com/2010/11/20/appcelerator-titanium-ides/#comments</comments>
		<pubDate>Sat, 20 Nov 2010 06:54:00 +0000</pubDate>
		<dc:creator>alejamp</dc:creator>
				<category><![CDATA[AppCelerator]]></category>
		<category><![CDATA[Aptana]]></category>
		<category><![CDATA[Titanium]]></category>
		<category><![CDATA[appcelerator]]></category>
		<category><![CDATA[aptana]]></category>
		<category><![CDATA[notepad++]]></category>
		<category><![CDATA[scite]]></category>
		<category><![CDATA[titanium]]></category>

		<guid isPermaLink="false">http://apirola.wordpress.com/2010/11/20/appcelerator-titanium-ides/</guid>
		<description><![CDATA[Titanium es un framework que por el momento carece de un IDE oficial, en cambio hay diferentes intentos por parte de la comunidad de dotar al mismo de un editor que al menos provea highlighthing e intellisense. Estos aportes son: Aptana4Titanium (+syntax highlighting y +intellisense) Scite4Titanium (+syntax highlighting y +intellisense) NotePad++4Titanium (+syntax highlighting y +intellisense)<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=168&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Titanium es un framework que por el momento carece de un IDE oficial, en cambio hay diferentes intentos por parte de la comunidad de dotar al mismo de un editor que al menos provea highlighthing e intellisense.</p>
<p>Estos aportes son:</p>
<ul>
<li><a href="http://apirola.wordpress.com/2010/11/11/appcelerator-titanium-aptana-intellisense/" target="_blank">Aptana4Titanium</a> (+syntax highlighting y +intellisense)</li>
<li><a href="http://groups.google.com/group/appcelerator-titanium/browse_thread/thread/7b66ea59e94dfca2/868c3cfa9bf39238" target="_blank">Scite4Titanium</a> (+syntax highlighting y +intellisense)</li>
<li><a href="http://groups.google.com/group/appcelerator-titanium/browse_thread/thread/7b66ea59e94dfca2/868c3cfa9bf39238" target="_blank">NotePad++4Titanium</a> (+syntax highlighting y +intellisense)</li>
</ul>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=d5b7cf2a-3955-8933-8dd1-6acb97bb2f13" alt="" /></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apirola.wordpress.com/168/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apirola.wordpress.com/168/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apirola.wordpress.com/168/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apirola.wordpress.com/168/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apirola.wordpress.com/168/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apirola.wordpress.com/168/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apirola.wordpress.com/168/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apirola.wordpress.com/168/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apirola.wordpress.com/168/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apirola.wordpress.com/168/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apirola.wordpress.com/168/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apirola.wordpress.com/168/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apirola.wordpress.com/168/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apirola.wordpress.com/168/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=168&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apirola.wordpress.com/2010/11/20/appcelerator-titanium-ides/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1b00c5591200fc85743b34dbdaf792b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alejamp</media:title>
		</media:content>

		<media:content url="http://img.zemanta.com/pixy.gif?x-id=d5b7cf2a-3955-8933-8dd1-6acb97bb2f13" medium="image" />
	</item>
		<item>
		<title>Como desinstalar XCode e iOS SDK</title>
		<link>http://apirola.wordpress.com/2010/11/15/como-desinstalar-xcode-e-ios-sdk/</link>
		<comments>http://apirola.wordpress.com/2010/11/15/como-desinstalar-xcode-e-ios-sdk/#comments</comments>
		<pubDate>Mon, 15 Nov 2010 10:34:45 +0000</pubDate>
		<dc:creator>alejamp</dc:creator>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPhone SDK]]></category>
		<category><![CDATA[XCode]]></category>
		<category><![CDATA[uninstall]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">https://apirola.wordpress.com/?p=154</guid>
		<description><![CDATA[Para desinstalar rapidamente abrir un terminal y ejecutar: sudo /Developer/Library/uninstall-devtools -mode=all Esto toma su tiempo, una vez terminado si deseamos reinstalar Xcode y el iOS SDK perimero hay que reiniciar Mac OSX.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=154&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Para desinstalar rapidamente abrir un terminal y ejecutar:</p>
<blockquote><p>sudo /Developer/Library/uninstall-devtools -mode=all</p></blockquote>
<p>Esto toma su tiempo, una vez terminado si deseamos reinstalar Xcode y el iOS SDK perimero hay que reiniciar Mac OSX. </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apirola.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apirola.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apirola.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apirola.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apirola.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apirola.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apirola.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apirola.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apirola.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apirola.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apirola.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apirola.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apirola.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apirola.wordpress.com/154/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=154&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apirola.wordpress.com/2010/11/15/como-desinstalar-xcode-e-ios-sdk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1b00c5591200fc85743b34dbdaf792b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alejamp</media:title>
		</media:content>
	</item>
		<item>
		<title>Appcelerator Titanium</title>
		<link>http://apirola.wordpress.com/2010/11/15/appcelerator-titanium/</link>
		<comments>http://apirola.wordpress.com/2010/11/15/appcelerator-titanium/#comments</comments>
		<pubDate>Mon, 15 Nov 2010 10:09:00 +0000</pubDate>
		<dc:creator>alejamp</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[appcelerator]]></category>
		<category><![CDATA[arquitectura]]></category>
		<category><![CDATA[introduccion]]></category>
		<category><![CDATA[titanium]]></category>

		<guid isPermaLink="false">https://apirola.wordpress.com/?p=142</guid>
		<description><![CDATA[Introducción Segun la version oficial: Titanium es un Open Source Framework, para construir aplicaciones Desktop y Mobile nativas utilizando tecnologias web abiertas como JavaScript, HTML5 y CSS. Titanium permite desarrollar sobre una API JavaScript y portar el proyecto fácilmente a iPhone, iPad, Android y en poco tiempo BlackBerry. Sin duda a simple vista suena excelente [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=142&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="clear:both;"><big>Introducción</big></p>
<p style="clear:both;">Segun la version oficial:</p>
<blockquote>
<p style="clear:both;"><span style="font-style:italic;">Titanium es un Open Source Framework, para construir aplicaciones Desktop y Mobile nativas utilizando tecnologias web abiertas como JavaScript, HTML5 y CSS.</span></p>
</blockquote>
<p><a href="http://www.appcelerator.com/" target="_blank"></a><a href="http://www.appcelerator.com/" target="_blank">Titanium</a> permite desarrollar sobre una API JavaScript y portar el proyecto fácilmente a iPhone, iPad, Android y en poco tiempo BlackBerry. Sin duda a simple vista suena excelente pero como todo tiene sus <a href="http://developer.appcelerator.com/question/76751/bye-bye-appcelerator" target="_blank">bemoles</a>.</p>
<p>Algunos contra que podemos encontrar son:</p>
<ul>
<li> Lack de documentacion</li>
<li>Lack de IDE</li>
<li>Lack de Debugger</li>
<li>No convierte el codigo JS a nativo. Sino que es solo precompilado y ejecutado en un runtime JS que hace un mapeo directo a las funciones nativas del OS.</li>
<li>Los controles no se comportan 100% igual de una plataforma a otra, pequeñas diferencias de render.</li>
</ul>
<ul></ul>
<p>Algunos puntos a favor pueden ser:</p>
<ul>
<li> Open Source. apache 2.0 License</li>
<li>Comunidad en constante crecimiento</li>
<li>Baja curva de induccion para desarrolladores que tengan conocimiento en JavaScript y HTML/CSS</li>
<li>Compatibilidad con iPad, iPhone, Andriod, y pronto BlackBerry en beta</li>
<li>Extensible, por medio de Titanium+Plus Modules</li>
<li>Acceso a la comunidad Open Source JavaScript</li>
<li>Las aplicaciones corren de manera fluida como cualquier otra nativa</li>
<li>Reduce los costos de desarrollo</li>
</ul>
<ul></ul>
<p style="clear:both;">En realidad no se trata de un compilador Cross-plataforma sino de un runtime que ejecuta linea por linea nuestro JavaScript que ejecuta nuestro código y provee de un puente común para ejecutar codigo nativas de cada OS Mobile. Lo positivo es que permite utilizar HTML5 y CSS e insertar con una baja curva de inducción desarrolladores web a la plataforma Mobile.</p>
<p style="clear:both;">Toda nuestra aplicación puede ser desarrollada en JavaScript y HTML5/CSS, pero como en todos los frameworks de este estilo el gran problema se plantea cuando se requiere alguna funcionalidad o control out of the box.</p>
<p style="clear:both;">Dado que provee un puente que permite ejecutar código nativo por detrás, si deseamos un control especifico que solo puede ser implementado en código nativo Objective-C o Android, debemos utilizar lo que ellos denominan desarrollo de Titanium+Plus Modules que son extensiones para poder invocar código nativo propio.</p>
<p style="clear:both;">En el caso de que necesiten saber mas sobre <a href="http://assets.appcelerator.com.s3.amazonaws.com/docs/Module_Developers_Guide_iOS.pdf" target="_blank">Titanium+Plus Modules para iPhone</a> sigan el link. Luego de buscar, encontre una guia para Andriod en <a href="http://developer.appcelerator.com/doc/mobile/android/module_sdk" target="_blank">Titanium+Plus Modules para Android</a>.</p>
<p>Un buen punto de entrada es comenzar leyendo las <a href="http://developer.appcelerator.com/doc/mobile/get_started" target="_blank">Started Guides</a>. Si aun no tenemos la plataforma instalada hay buena informacion de como hacerlo en Mac, Windows y Linux en <a href="http://developer.appcelerator.com/get_started" target="_blank">Get Started</a>. Luego Titanium provee otros puntos de encuentro para la comunidad como un el blog <a href="http://www.appcelerant.com/" target="_blank">Appcelerant</a>, twiter, irc, etc. Por mi parte lo que más me ayudo a tirar algo de codigo en esta plataforma fueron las <a href="http://developer.appcelerator.com/doc/mobile/guides">Programming Guides</a>.</p>
<p>Mi sugerencia es hacer la instalacion directamente en Mac OSX donde podremos ver el potencial real de Titanium al poder ver nuestra aplicacion corriendo en iPhone y Andriod al mismo tiempo.</p>
<p>Si quieren agregarle al ambiente Titanium un IDE con un minimo de auto completar visiten <a href="http://apirola.wordpress.com/2010/11/11/appcelerator-titanium-aptana-intellisense/" target="_blank">Appcelerator + Aptana + Intellisense</a>.</p>
<p><big>Plataforma</big></p>
<p>Nuestra aplicacion sera desarrollada principalmente en JavaScript, utilizando la API que Titanium provee en comun para las plataformas mobiles. Titanium precompila el JS y lo empaqueta junto con un runtime y las  clases nativas iPhone o Andriod.</p>
<p>El runtime  ejecutara nuestro codigo linea por linea y cada invocacion JS a la API de Titanium deriva en una llamada a codigo nativo.</p>
<p><img style="max-width:800px;" src="http://apirola.files.wordpress.com/2010/11/screen-shot-2010-11-16-at-2-07-25-am.png?w=490" alt="" /></p>
<p>Teniendo una vision simplicada de este framework, diria que es como tener macros de alto nivel JS que terminan invocando por detras codigo de nativo. Hay que tener en claro que el compilador de titanium precompila el JS para una ejecucion rapida y empaqueta el proyecto, pero NO convierte nuestro codigo en codigo nativo al momento de la compilacion, esto solo sucede durante la ejecucion y por medio del bridge.</p>
<p>Continuara&#8230;</p>
<p><br class="final-break" style="clear:both;" />Usuarios avanzados</p>
<p>Dado la demora en algunos releases de Titanium SDK 1.5.0, estoy comenzando a probar las &#8220;continuous builds&#8221; estas se pueden conseguir en <a href="http://builds.appcelerator.com.s3.amazonaws.com/index.html" target="_blank">http://builds.appcelerator.com.s3.amazonaws.com/index.html</a>.</p>
<p>Para poder utilizar las nuevas funciones de +Plus Modules for Andriod necesitamos el Titanium Mobile SDK 1.5 el cual solo puede ser encontrado entre las continouos builds. Esta version se encuentra actualmente en QA y esperamos un release para este mes o diciembre.</p>
<p>Appcelerator Issue Tracker, podemos dejar nuestros issues registrados y seguirlos en <a href="https://appcelerator.lighthouseapp.com/dashboard" target="_blank">https://appcelerator.lighthouseapp.com/dashboard</a></p>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=3fcd823f-9292-8a1d-b4e2-7e18923f0ade" alt="" /></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apirola.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apirola.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apirola.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apirola.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apirola.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apirola.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apirola.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apirola.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apirola.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apirola.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apirola.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apirola.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apirola.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apirola.wordpress.com/142/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=142&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apirola.wordpress.com/2010/11/15/appcelerator-titanium/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1b00c5591200fc85743b34dbdaf792b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alejamp</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2010/11/screen-shot-2010-11-16-at-2-07-25-am.png" medium="image" />

		<media:content url="http://img.zemanta.com/pixy.gif?x-id=3fcd823f-9292-8a1d-b4e2-7e18923f0ade" medium="image" />
	</item>
		<item>
		<title>AppCelerator Titanium + Aptana + IntelliSense</title>
		<link>http://apirola.wordpress.com/2010/11/11/appcelerator-titanium-aptana-intellisense/</link>
		<comments>http://apirola.wordpress.com/2010/11/11/appcelerator-titanium-aptana-intellisense/#comments</comments>
		<pubDate>Thu, 11 Nov 2010 05:14:06 +0000</pubDate>
		<dc:creator>alejamp</dc:creator>
				<category><![CDATA[AppCelerator]]></category>
		<category><![CDATA[Aptana]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[appcelerator]]></category>
		<category><![CDATA[aptana]]></category>
		<category><![CDATA[autocomplete]]></category>
		<category><![CDATA[editor]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[intelisense]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[titanium]]></category>

		<guid isPermaLink="false">https://apirola.wordpress.com/2010/11/11/appcelerator-titanium-aptana-intellisense/</guid>
		<description><![CDATA[Seguramente como la mayoría de los que empezamos con AppCelerator Titanium, y además venimos de C# o Java, quería un IDE con IntelliSense o Autcompletar. Sobre todo porque Titanium no tiene compilación en línea y los errores no pueden detectarse hasta la compilación final el código. James David nos proporciona una solución por medio de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=116&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Seguramente como la mayoría de los que empezamos con AppCelerator Titanium, y además venimos de C# o Java, quería un IDE con IntelliSense o Autcompletar. Sobre todo porque Titanium no tiene compilación en línea y los errores no pueden detectarse hasta la compilación final el código.<br />
<span id="more-116"></span><br />
<a href="http://jameslow.com/2010/05/31/titanium-autocomplete-eclipse/" target="_blank">James David</a> nos proporciona una solución por medio de un archivo ScriptDoc.</p>
<p>Este post solo extiende el video de James, para que incluya todos los pasos.</p>
<p>Esta es la solución:</p>
<ol>
<li>Instalar Aptana: si ya tenemos Eclipse es posible hacerlo como plug-in o a mi gusto mas limpio descargar el <a href="http://www.aptana.org/" target="_blank">Aptana Studio 2.0</a>, la instalación es rápida y sin complicaciones, solo pesa 95 mb.</li>
<li>Asociar archivos JavaScript .js con el Editor Aptana.</li>
<li>Agregar <a href="http://jamesdlow.googlecode.com/svn/trunk/Eclipse/Aptana/Titanium/com2.appcelerator.titanium.mobile/support/timobile.js" target="_blank">timobile.js</a> como referencia.</li>
</ol>
<p>&nbsp;</p>
<p><object width="490" height="393"><param name="movie" value="http://www.youtube.com/v/BXUGFDzUpdg?fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/BXUGFDzUpdg?fs=1" type="application/x-shockwave-flash" width="490" height="393" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Si quieren información mas detallada sobre como generar el archivo timobile.js visiten el blog: <a href="http://jameslow.com/2010/05/31/titanium-autocomplete-eclipse/" target="_blank">James David</a>.<em></em></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apirola.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apirola.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apirola.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apirola.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apirola.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apirola.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apirola.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apirola.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apirola.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apirola.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apirola.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apirola.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apirola.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apirola.wordpress.com/116/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=116&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apirola.wordpress.com/2010/11/11/appcelerator-titanium-aptana-intellisense/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1b00c5591200fc85743b34dbdaf792b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alejamp</media:title>
		</media:content>
	</item>
		<item>
		<title>Buscando hosting de SVN</title>
		<link>http://apirola.wordpress.com/2008/10/05/svn-hosting/</link>
		<comments>http://apirola.wordpress.com/2008/10/05/svn-hosting/#comments</comments>
		<pubDate>Sun, 05 Oct 2008 03:45:27 +0000</pubDate>
		<dc:creator>alejamp</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Hosting]]></category>
		<category><![CDATA[SVN]]></category>

		<guid isPermaLink="false">http://apirola.wordpress.com/?p=79</guid>
		<description><![CDATA[En a busqueda de un hosting SVN que que sea rapido, gratuito, y que permita versionar proyectos que no son Open Source (no por ser propietario sino por verguenza de que cualquiera ver menudo mamarracho) bueno he aqui un excelente indice, con una tabla comparativa de los hosting disponibles y filtros a gusto. http://www.svnhostingcomparison.com/<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=79&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>En a busqueda de un hosting SVN que que sea rapido, gratuito, y que permita versionar proyectos que no son Open Source (no por ser propietario sino por verguenza de que cualquiera ver menudo mamarracho) bueno he aqui un excelente indice, con una tabla comparativa de los hosting disponibles y filtros a gusto. <a href="http://www.svnhostingcomparison.com/">http://www.svnhostingcomparison.com/</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apirola.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apirola.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apirola.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apirola.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apirola.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apirola.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apirola.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apirola.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apirola.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apirola.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apirola.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apirola.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apirola.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apirola.wordpress.com/79/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=79&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apirola.wordpress.com/2008/10/05/svn-hosting/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1b00c5591200fc85743b34dbdaf792b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alejamp</media:title>
		</media:content>
	</item>
		<item>
		<title>Python&#8230; por donde empezar?</title>
		<link>http://apirola.wordpress.com/2008/09/28/python-por-donde-empezar/</link>
		<comments>http://apirola.wordpress.com/2008/09/28/python-por-donde-empezar/#comments</comments>
		<pubDate>Sun, 28 Sep 2008 06:49:18 +0000</pubDate>
		<dc:creator>alejamp</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[PyDEV]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://apirola.wordpress.com/?p=69</guid>
		<description><![CDATA[Bueno para los que como yo vienen de otros lenguajes de programacion y estan interesados en comenzar con Python creo que conseguir informacion no es lo dificil sino saber elegir. IDE En el campo de IDEs y editores de código gratuitos PyDEV (http://pydev.sourceforge.net/) se alza como cabeza de serie. PyDEV es un plu-gin para Eclipse [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=69&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Bueno para los que como yo vienen de otros lenguajes de programacion y estan interesados en comenzar con Python creo que conseguir informacion no es lo dificil sino saber elegir.</p>
<p><span id="more-69"></span></p>
<p><strong>IDE</strong></p>
<blockquote>
<p style="text-align:left;">En el campo de IDEs y editores de código gratuitos <a title="PyDEV" href="http://pydev.sourceforge.net/"><strong>PyDEV</strong></a> (http://pydev.sourceforge.net/) se alza como cabeza de serie. PyDEV es un plu-gin para Eclipse que permite utilizar este IDE multiplataforma para programar en Python. Cuenta con autocompletado de código (con información sobre cada elemento), resaltado de sintaxis, un depurador gráfico, resaltado de errores, explorador de clases, formateo del código,<br />
refactorización, etc. Sin duda es la opción más completa, sobre todo si instalamos las extensiones comerciales, aunque necesita de una canti-dad importante de memoria y no es del todo estable.<br />
Otras opciones gratuitas a considerar son <strong>SPE</strong> o Stani’s Python Editor (http://sourceforge.net/projects/spe/), Eric (http://die-offenbachs.de/eric/), <strong>BOA Constructor </strong>(http://boa-constructor.sourceforge.net/) o incluso<br />
emacs o vim.</p>
<p style="text-align:left;">Si no te importa desembolsar algo de dinero, Komodo (http://www.activestate.com/komodo_ide/) y <strong>Wing IDE</strong> (http://www.wingware.com/) son también muy buenas opciones, con montones de características interesantes, como PyDEV, pero mucho más estables y robustos. Además, si desarrollas software libre no comercial puedes contactar con Wing Ware y obtener, con un poco de suerte, una licencia gratuita para Wing IDE Professional.</p>
<p style="text-align:left;">Fuente &#8220;Python para todos&#8221; de<strong> Raul Gonzalez Duque</strong>.<br />
<a href="http://mundogeek.net/tutorial-python/">http://mundogeek.net/tutorial-python/</a></p>
</blockquote>
<p style="text-align:left;">Por mi lado, tomando la sugerencia de nuestro amigo Raul,  y dado que estoy familiarizado con Eclipse, creo que la mejor eleccion es<strong> PyDEV.</strong></p>
<p style="text-align:left;">&nbsp;</p>
<p style="text-align:left;"><strong>Instalacion de PyDEV</strong></p>
<p style="text-align:left;"><strong>Linux &#8211; Ubuntu, </strong>en el caso de que tengan Ubuntu 8.04 esto es muy facil. Utilizando Synaptic Packet Manager, pueden descargar el paquete pyDev y automaticamente se instalara el IDE Eclipse y el SDK de Eclipse con todas las dependencias y plugins necesarios para pyDev. O desde consola:</p>
<blockquote>
<p style="text-align:left;"><em>sudo aptitude install eclipse-pydev</em></p>
</blockquote>
<p style="text-align:left;">En cuanto al interprete, en el caso de Ubuntu 8.04 creo que viene por defecto. De no ser asi lo bajan de la misma manera:</p>
<blockquote>
<p style="text-align:left;"><em>sudo aptitude install python2.5</em></p>
</blockquote>
<p style="text-align:left;">Para otras formas de instalacion pueden ir a <a href="http://begnu.wordpress.com/2007/09/26/pydev-python-eclipse/">http://begnu.wordpress.com/2007/09/26/pydev-python-eclipse/</a></p>
<p style="text-align:left;">&nbsp;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apirola.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apirola.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apirola.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apirola.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apirola.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apirola.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apirola.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apirola.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apirola.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apirola.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apirola.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apirola.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apirola.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apirola.wordpress.com/69/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=69&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apirola.wordpress.com/2008/09/28/python-por-donde-empezar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1b00c5591200fc85743b34dbdaf792b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alejamp</media:title>
		</media:content>
	</item>
		<item>
		<title>Deskew, enderezando una imagen</title>
		<link>http://apirola.wordpress.com/2008/08/24/deskew-enderezando-una-imagen/</link>
		<comments>http://apirola.wordpress.com/2008/08/24/deskew-enderezando-una-imagen/#comments</comments>
		<pubDate>Sun, 24 Aug 2008 07:56:31 +0000</pubDate>
		<dc:creator>alejamp</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[OCR]]></category>
		<category><![CDATA[Computer Vision]]></category>
		<category><![CDATA[Deskew]]></category>
		<category><![CDATA[Hough]]></category>
		<category><![CDATA[Images]]></category>

		<guid isPermaLink="false">http://apirola.wordpress.com/2008/08/24/deskew-enderezando-una-imagen/</guid>
		<description><![CDATA[Download:DeskewDemo Introduccion Cuando trabajamos con imagenes, sobre todo con documentos digitalizados, una de las distorciones habituales es la rotacion. En el caso de los las imagenes que contienen texto impreso o figuras rectas (subrayado, cuadros, renglones, etc.) que permitan detectar el grado de inclinacion, es posible rectificar la misma utilizando algunos algoritmos de procesamiento de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=64&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h3>Download:<strong><a href="http://cid-238c4f8a6a8b9ffc.skydrive.live.com/self.aspx/SourceCode/DeskewDemo.rar">DeskewDemo</a></strong></h3>
<h3>Introduccion</h3>
<p>Cuando trabajamos con imagenes, sobre todo con documentos digitalizados, una de las distorciones habituales es la rotacion.</p>
<p>En el caso de los las imagenes que contienen texto impreso o figuras rectas (subrayado, cuadros, renglones, etc.) que permitan detectar el grado de inclinacion, es posible rectificar la misma utilizando algunos algoritmos de procesamiento de imagenes y deteccion de patrones.</p>
<p>Lo primero que deberiamos hacer es encontrar patrones de puntos colineales. Para esto podemos utilizar un algoritmo llamado <a href="http://en.wikipedia.org/wiki/Hough_transform">Hough Transformation</a>.</p>
<p><span id="more-64"></span></p>
<h3>Hough transformation</h3>
<p>A grandes rasgos este algoritmo detecta patrones de puntos colineales, co-circulares, o co-elipticos. En este caso en particular vamos a utilizarlo para detectar lineas.</p>
<p>Como pueden ver este algoritmo convierte un bitmap en un houghmap, un houghmap tiene al igual que el bitmap dos dimensiones. Una de las dimensiones es el angulo de la recta y la otra la distancia al origen.</p>
<p>Mi intencion no es explicar el algoritmo, para ampliar sobre este tema visiten wikipedia <a title="http://en.wikipedia.org/wiki/Hough_transform" href="http://en.wikipedia.org/wiki/Hough_transform">http://en.wikipedia.org/wiki/Hough_transform</a> o lean cualquier libro sobre Computer Vision como por ejemplo <em>&#8220;Hanbook of Computer Algorithms in Image Algebra&#8221;</em>, 2nd Edition by Gerhard, Ritter.</p>
<p>Para tener una idea de que hace una transformacion de Hough, veamos la siguiente imagen:</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image11.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb11.png?w=452&#038;h=379" border="0" alt="image" width="452" height="379" /></a></p>
<p>Luego de aplicar una transformacion de Hough y el houghmap queda de la siguiente manera:</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image12.png"><img src="http://apirola.files.wordpress.com/2008/08/image-thumb12.png?w=485&#038;h=142" border="0" alt="image" width="485" height="142" /></a></p>
<p>Cada punto en el houghmap representa el angulo de una recta  y su distancia al centro. Se pueden ver que hay dos maximo en la parte superior de la imagen y otros tantos cerca de la mitad. Cada maximo corresponde a una posible recta de la imagen original, en la siguiente figura se puede ver como se representa cada una:</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image13.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb13.png?w=522&#038;h=339" border="0" alt="image" width="522" height="339" /></a></p>
<p>Si quisieramos regresar esta imagen a la horizontalidad deberiamos tomar como referencia las lineas que provienen del texto y las dos rectas paralelas a este que se encuentran a la misma altura, es decir en el mismo angulo por ser paralelas.</p>
<p>Para entender mejor como se calcula el algulo de cada recta veamos el siguiente grafico de referencia:</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image14.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb14.png?w=512&#038;h=401" border="0" alt="image" width="512" height="401" /></a></p>
<p>La recta inferior se traslada con una linea perpendicular a la misma que pasa por origen y luego se mide el angulo que esta forma con el eje X. La distancia al centro se calcula sobre la recta punteada.  Es decir que si podemos calcular Tita podemos rotar la imagen 90 &#8211; tita grados (horario) para que la misma quede horizontal.</p>
<p>El problema con esta transformada es que tiene mucho costo computacional debido a que por cada punto calcula las N rectas posibles que pasan, cuando en realidad solo nos interesa una fraccion de las mismas y solo una parte de los puntos.</p>
<h3>Optimizacion de Hough para Deskew</h3>
<p>Es posible reducir mucho el tiempo de ejecucion restringiendo el angulo y los puntos admitidos bajo los siguientes criterios.</p>
<h2>Criterio de seleccion de puntos</h2>
<p>No todos lo puntos a la hora de hacer un Deskew son importantes, debemos utilizar solo aquellos que conforman la frontera inferior de las letras y no los que estan dentro o arriba de las mas mismas. En la siguiente imagen vemos que utilizando los pixeles inferiores podemos reducir enormemente el ruido en el mapa de hough dado que transformamos solo los puntos importantes:</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image15.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb15.png?w=424&#038;h=186" border="0" alt="image" width="424" height="186" /></a></p>
<p>De esta manera se optienen lineas mas nitidas y maximas mas claras en el mapa de hough. Para hacer esto antes de hacer la transformacion de un punto preguntamos si es opaco y si ademas el punto justo por debajo de este es nitidamente mas claro, si esto se cumple se procede a hacer la transformacion.</p>
<h2>Seleccion de angulo</h2>
<p>Como por lo general una imagen distorcionada por rotacion no suele estarlo por angulos superiores a 20 grados, podemos descartar del mapa hough angulos superiores a 20 e inferiores a -20 grados y el mapa se reduce de la siguiente manera:</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image16.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb16.png?w=498&#038;h=139" border="0" alt="image" width="498" height="139" /></a></p>
<p>El houghmap se reduce a casi 1/5 de su dimension en Y (angulo tita). Se ve claramente en esta imagen como esos dos puntos maximos (correspondientes a las dos lineas verticales) en la parte superior desaparecen.</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image17.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb17.png?w=210&#038;h=186" border="0" alt="image" width="210" height="186" align="left" /></a>En esta imagen podemos ver como queda un houghmap luego de realizar estas mejoras.</p>
<p>El mapa tiene menos ruido y los maximos son mas claros, se ha reducido notablemente  la cantidad de lineas incluidas en esta transformacion. Permitiendo una estimacion mas exacta del angulo de skew.</p>
<p>Una vez efectuada la transformacion promediamos los titas de estas rectas y rotamos la imagen segun este promedio.</p>
<h3>Solucion propuesta</h3>
<p>Para implementar estas mejoras he utilizado la libreria <a href="http://code.google.com/p/aforge/">AForge</a> de Adrew Kirillov. Que ya trae una clase para Hough Line Transformation la cual utilice como base para introducir estas mejoras. La nueva clase se llamada FastDeskew y realiza un Auto Deskew.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/apirola.wordpress.com/64/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/apirola.wordpress.com/64/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apirola.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apirola.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apirola.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apirola.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apirola.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apirola.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apirola.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apirola.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apirola.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apirola.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apirola.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apirola.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apirola.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apirola.wordpress.com/64/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=64&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apirola.wordpress.com/2008/08/24/deskew-enderezando-una-imagen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1b00c5591200fc85743b34dbdaf792b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alejamp</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb11.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb12.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb13.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb14.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb15.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb16.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb17.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Multilingual Controls in C#, easy!</title>
		<link>http://apirola.wordpress.com/2008/08/19/multilingual-controls-in-c-easy/</link>
		<comments>http://apirola.wordpress.com/2008/08/19/multilingual-controls-in-c-easy/#comments</comments>
		<pubDate>Tue, 19 Aug 2008 18:48:37 +0000</pubDate>
		<dc:creator>alejamp</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[CultureInfo]]></category>
		<category><![CDATA[Lenguages]]></category>
		<category><![CDATA[Multiples]]></category>
		<category><![CDATA[Resource]]></category>
		<category><![CDATA[ResourceManager]]></category>

		<guid isPermaLink="false">http://apirola.wordpress.com/2008/08/19/multilingual-controls-in-c-easy/</guid>
		<description><![CDATA[Download demo Multilingual Introduccion Una manera rapida de proporcionar aplicaciones en multiples idiomas en C# es utilizar Culture y Embedded Resources.  Pero aun mas facil con MultilingualForm y MultilingualUserControl. Es posible crear archivos .resx que contengan las definiciones para cada idioma y el neutral. Luego ResourceManager permite acceder a las entradas de un recurso para [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=33&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h3><span style="color:#004080;"> </span><strong><span style="color:#004080;">Download demo</span> </strong><a href="http://cid-238c4f8a6a8b9ffc.skydrive.live.com/self.aspx/SourceCode/Multilingual.rar" target="_blank"><strong><span style="font-size:large;">Multilingual</span></strong></a></h3>
<h3>Introduccion</h3>
<p>Una manera rapida de proporcionar aplicaciones en multiples idiomas en C# es utilizar Culture y Embedded Resources.  Pero aun mas facil con <strong>MultilingualForm </strong>y<strong> MultilingualUserControl.</strong></p>
<p>Es posible crear archivos .resx que contengan las definiciones para cada idioma y el neutral. Luego ResourceManager permite acceder a las entradas de un recurso para una determinada cultura de la siguiente manera:</p>
<pre class="code"><span style="color:teal;">CultureInfo </span>ci = <span style="color:teal;">Thread</span>.CurrentThread.CurrentCulture;
<span style="color:teal;">Assembly </span>ass = <span style="color:teal;">Assembly</span>.GetExecutingAssembly();
<span style="color:teal;">ResourceManager </span>rm = <span style="color:blue;">new </span><span style="color:teal;">ResourceManager</span>(<span style="color:blue;">this</span>.GetType().Namespace, ass);
<span style="color:blue;">string </span>res = rm.GetString(<span style="color:maroon;">"tt_hello"</span>, ci);</pre>
<p><span id="more-33"></span></p>
<h2>Que hace ResourceManager</h2>
<p>ResourceManager recupera el recurso indicando el Assembly ass (donde fue embebido) y un string que representa el namespace + el nombre del recurso. Aqui es importante tener en cuenta que existe una convencion respecto al nombre del recurso a fin de permitirle a ResourceManager ubicar el recurso adecuado a la cultura que se utiliza en <span style="color:blue;">string </span>res = rm.GetString(<span style="color:maroon;">&#8220;tt_hello&#8221;</span>, ci);</p>
<p>Internamente ResourceManager en cada invocacion de GetString llama a una funcion privada:</p>
<blockquote>
<pre>protected virtual string <a href="http://www.koders.com/">GetResourceFileName</a> (<a href="http://www.koders.com/">CultureInfo</a> <a href="http://www.koders.com/">culture</a>)</pre>
</blockquote>
<p>Esta funcion le proporciona entonces en base a la cultura enviada como parametro en GetString, el nombre/ruta correcto del recurso almacenado en el assembly, con esto obtiene el recurso llamando a <a href="http://www.koders.com/">Assembly</a>.<a href="http://www.koders.com/">GetManifestResourceStream</a>(<a href="http://www.koders.com/">filename</a>) y luego extrae el ResourceSet, necesario para buscar el valor <span style="color:maroon;">&#8220;tt_hello&#8221;.<br />
</span><br />
<a href="http://apirola.files.wordpress.com/2008/08/image10.png"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb10.png?w=444&#038;h=74" border="0" alt="image" width="444" height="74" /></a></p>
<p>Para comprender mejor que hace esta clase y la forma en que gestiona los recursos pueden ver el codigo fuente Ximian para Mono en <a title="http://www.koders.com/csharp/fid91F04E676D783C1D0FBADB4F18E62EB002099753.aspx" href="http://www.koders.com/csharp/fid91F04E676D783C1D0FBADB4F18E62EB002099753.aspx">htp://www.koders.com/csharp/fid91F04E676D783C1D0FBADB4F18E62EB002099753.aspx</a></p>
<p>Por ejemplo veamos para una la siguiente aplicacion llamada Multilingual como gestionar los recursos:</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image8.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb8.png?w=260&#038;h=312" border="0" alt="image" width="260" height="312" /></a></p>
<p>En el caso de este proyecto se agregaron tres archivos de recursos. Como se puede ver el nombre <strong>Res.en-US.resx</strong> es requerido para identificar que es un recurso para la cultura en-US. Es necesario tambien definir otro recurso llamado Res.resx que será luego el recurso correspondiente al lenguaje neutro.</p>
<p>Entonces para recalcar, un recurso debe tener un nombre que corresponda con el sisguiente esquema: aaaa.xx-XX.resx, siendo aaaa un nombre cualquiera, en este caso Res, y xx-XX la cultura a la cual responde el recurso.</p>
<p>Es importante destacar que ResourceManager carga un recurso especificamente del basename indicado y del assembly apuntado. Es decir si en Multilingual ejecuto la siguiente instruccion:</p>
<p>Assembly ass = Assembly.GetExecutingAssembly();<br />
<span style="color:teal;">ResourceManager</span>rm = <span style="color:blue;">new</span><span style="color:teal;">ResourceManager</span>(<span style="color:maroon;">&#8220;Multilingual.TestForm.Res&#8221;</span>, ass);</p>
<p>ResourceManager carga el recurso en la ruta &#8220;Multilingual.TestForm.Res&#8221; e ignora los que se encuentran en &#8220;Multilingual.Res&#8221;. Es decir que si utilizamos una arquitectura de plug-ins podemos incluir recursos dentro de la DLL de nuestro plug-in y de esta manera llevar un diccionario indipendiente de ser requerido.</p>
<p>Entonces una vez inicializado ResourceManager para poder traducir cada control de un Form o UserControl se debe tener en el metodo OnLoad todas las llamadas GetStrings necesarios para asignarles los valores extraidos de los recursos:</p>
<p><span style="color:blue;">btn_hello.Text</span> = rm.GetString(<span style="color:maroon;">&#8220;tt_hello&#8221;</span>, ci);</p>
<p>Esto resulta engorroso en formularios extensos y con profundidad.</p>
<h3>Como hacerlo mas facil</h3>
<p>Bien si tubieramos un par de clases que heredan de UserControl o de Form que obtenga en OnLoad el CultureInfo actual, luego recorra recursivamente el arbol completo de controles hijos que posee, identificando aquellos que tengan declarada la propiedad string Text, que verifique sea != String.Empty. y busque en el recurso cual es el valor para esa entrada de texto y cambiarlo si existiese.</p>
<p>Incluso porque no&#8230; manejar tanto recursos especificos del dominio como los superiores, dado el caso de que una definicion no exista en el local que la busque en  los del nivel superior.</p>
<p>Bueno esto es lo que hace la clase <strong>MultilingualForm</strong> y <strong>MultilingualUserControl</strong>. Las hice para no preocuparme por esta funcionoladidad y solo poner en tiempo de diseño los textos correctos en cada control por ejemplo:</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image9.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb9.png?w=371&#038;h=242" border="0" alt="image" width="371" height="242" /></a></p>
<p>Cada control traducido por el metodo <strong>DoTranslate</strong> será referenciado en una HashTable que lleva el control de los Text originales y de esta manera permite la traduccion inmediata sin necesidad de reinicializar los controles (para que recuperen sus textos anteriores).</p>
<p>Como pueden ver en el ejemplo solo se requiere llamar a DoTranslate para que todos los controles adopten los textos definidos en el recurso para la cultura seleccionada.</p>
<p>Un Form que hereda de MultilingualForm <strong>no necesita codigo extra</strong> para manejar la traduccion de sus controles.</p>
<p>Aquí se puede ver como MultilingualForm o MultilingualUserControl recorre el arbol de controles identificando controles candidatos:</p>
<div style="border:1px solid gray;overflow:auto;font-size:8pt;width:97.5%;cursor:text;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;max-height:200px;margin:20px 0 10px;padding:4px;">
<div style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;padding:0;">
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   1:</span> <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">void</span> TranslateControls(Control pc)</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   2:</span> {</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   3:</span>     <span style="color:#0000ff;">if</span> (<span style="color:#0000ff;">this</span>.resourceManager != <span style="color:#0000ff;">null</span>)</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   4:</span>     {</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   5:</span>         <span style="color:#0000ff;">foreach</span> (Control c <span style="color:#0000ff;">in</span> pc.Controls)</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   6:</span>         {</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   7:</span>             <span style="color:#0000ff;">if</span> (HasTextProperty(c))</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   8:</span>             {</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   9:</span>                 <span style="color:#0000ff;">if</span> (c.Text != <span style="color:#006080;">""</span>)</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  10:</span>                 {</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  11:</span>                     <span style="color:#0000ff;">if</span> (transTable.Contains(c))</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  12:</span>                     {</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  13:</span>                         <span style="color:#0000ff;">if</span> (<span style="color:#0000ff;">this</span>.resourceManager.GetString((<span style="color:#0000ff;">string</span>)transTable[c], Culture) != String.Empty)</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  14:</span>                         {</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  15:</span>                             c.Text = <span style="color:#0000ff;">this</span>.resourceManager.GetString((<span style="color:#0000ff;">string</span>)transTable[c], Culture);</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  16:</span>                         }</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  17:</span>                     }</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  18:</span>                     <span style="color:#0000ff;">else</span></pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  19:</span>                     {</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  20:</span>                         <span style="color:#0000ff;">if</span> (<span style="color:#0000ff;">this</span>.resourceManager.GetString(c.Text, Culture) != String.Empty)</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  21:</span>                         {</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  22:</span>                             transTable.Add(c, c.Text);</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  23:</span>                             c.Text = <span style="color:#0000ff;">this</span>.resourceManager.GetString(c.Text, Culture);</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  24:</span>                         }</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  25:</span>                     }</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  26:</span>                 }</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  27:</span>             }</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  28:</span>             <span style="color:#0000ff;">if</span> (c.Controls.Count &gt; 0) TranslateControls(c);</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  29:</span>         }</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  30:</span>     }</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  31:</span> }</pre>
</div>
</div>
<h2>A tener en cuenta</h2>
<p>Siempre utilizar recursos nombrado: Res.xx-XX.resx donde xx-XX es la cultura.</p>
<h3><strong>Download demo</strong></h3>
<blockquote>
<h2><span style="font-size:large;"><strong></strong></span><a href="http://cid-238c4f8a6a8b9ffc.skydrive.live.com/self.aspx/SourceCode/Multilingual.rar" target="_blank"><strong><span style="font-size:large;">Multilingual</span></strong></a></h2>
</blockquote>
<p>Saludos,<br />
Alejandro</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/apirola.wordpress.com/33/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/apirola.wordpress.com/33/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apirola.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apirola.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apirola.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apirola.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/apirola.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/apirola.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/apirola.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/apirola.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apirola.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apirola.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apirola.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apirola.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apirola.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apirola.wordpress.com/33/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&amp;blog=4535158&amp;post=33&amp;subd=apirola&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://apirola.wordpress.com/2008/08/19/multilingual-controls-in-c-easy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1b00c5591200fc85743b34dbdaf792b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alejamp</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb10.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb8.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb9.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
	</channel>
</rss>
