<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>I’m a 24 years old Electronics Engineering Student, Developer and Gamer.

I work for Admios as a RIA/Flex developer, I founded Pixmat where we mainly do web development and I developed Panagamers, the biggest and most important gaming community in Panama.</description><title>Demóstenes García G.</title><generator>Tumblr (3.0; @demogar)</generator><link>http://blog.demogar.com/</link><item><title>Flex Builder 3 + Perforce plugin</title><description>&lt;p&gt;Hoy tuve que trabajar en un proyecto utilizando &lt;strong&gt;Flex 3&lt;/strong&gt; (argh), para ello debía trabajar sobre Flex Builder 3. El proyecto utiliza &lt;strong&gt;Perforce&lt;/strong&gt; como SCM (Source Code Management).&lt;/p&gt;
&lt;p&gt;Una mala combinación, ¿no?. En fin, es lo que hay.&lt;/p&gt;
&lt;p&gt;Para hacerlo funcionar teníamos que buscar una versión específica del plugin de Perforce que funcionara con &lt;strong&gt;Eclipse 3.3.1&lt;/strong&gt;. Curiosamente si era para Eclipse 3.3&amp;#160;o para Eclipse 3.4 no funcionaba, así que tenía que haber una que funcionara perfecto para 3.3.1. Luego de 30 minutos leyendo encontré que la &lt;a href="http://www.perforce.com/perforce/doc.073/user/p4wsadnotes.txt"&gt;versión 07.3&lt;/a&gt; funciona perfecto con esta versión de Eclipse (y por ende con Flex Builder 3).&lt;/p&gt;
&lt;p&gt;&lt;!-- more --&gt;&lt;/p&gt;
&lt;p&gt;Lo único que tenemos que hacer es descargar la &lt;a href="ftp://ftp.perforce.com/perforce/r07.3/bin.java/p4wsad.zip"&gt;versión 07.3&lt;/a&gt;, descomprimirla y tirar lo que está dentro de &lt;strong&gt;/features&lt;/strong&gt; (un .jar) en &lt;strong&gt;C:\Program Files (x86)\Adobe\Flex Builder 3\features&lt;/strong&gt; y lo que está dentro de &lt;strong&gt;/plugins&lt;/strong&gt; (un par de .jar) dentro de &lt;strong&gt;C:\Program Files (x86)\Adobe\Flex Builder 3\plugins&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Reinicias el Flex Builder, te vas a Window -&amp;gt; Preferences -&amp;gt; Team -&amp;gt; Perforce y debería funcionar todo perfectamente.&lt;/p&gt;
&lt;p&gt;Espero que le sirva a alguien algún día y que no pierdan casi una hora revisando que versión le funciona exactamente.&lt;/p&gt;</description><link>http://blog.demogar.com/post/20911912166</link><guid>http://blog.demogar.com/post/20911912166</guid><pubDate>Wed, 11 Apr 2012 13:02:35 -0500</pubDate><category>flex</category><category>perforce</category><category>scm</category><category>eclipse</category></item><item><title>CFBundleShortversion y Appcelerator 1.8.x</title><description>&lt;p&gt;Hoy, intentando sacar una nueva versión para CarteleraPanama para iOS, me encontré con un problema bastante curioso. Luego que intenté varias veces de validar la aplicación, me tiraba un error que decía:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;CFBundleShortversion should be higher then previous upload (&amp;#8230;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Curiosamente esto ya lo había tomado en cuenta (duh!) y había subido de la versión 1.1 a la versión 1.2. Viendo por aquí y por allá al parecer el problema es que al compilar, CFBundleShortVersionString siempre es 1.0, sin importar lo que tengas en el tiapp.xml.&lt;/p&gt;
&lt;p&gt;&lt;!-- more --&gt;&lt;/p&gt;
&lt;p&gt;Este error ya fue corregido en el SDK 2.0 de Appcelerator, sin embargo el mismo no ha sido liberado completamente, así que el workaround es bastante sencillo:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Te vas a /&amp;lt;project&amp;gt;/build/iphone&lt;/li&gt;
&lt;li&gt;Copias Info.plist y lo pegas al root de tu proyecto, justo donde está el tiapp.xml.&lt;/li&gt;
&lt;li&gt;Abres el archivo en cualquier editor de texto y editar CFBundleShortVersionString para que tenga tu nueva versión, en mi caso es 1.2.&lt;/li&gt;
&lt;li&gt;Compilas nuevamente. Quizás sea necesario que limpies todo el proyecto (Project -&amp;gt; Clean).&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Una vez recompiles, el compilador tomará en cuenta tu Info.plist y lo utilizará.&lt;/p&gt;</description><link>http://blog.demogar.com/post/20308445250</link><guid>http://blog.demogar.com/post/20308445250</guid><pubDate>Sun, 01 Apr 2012 16:14:38 -0500</pubDate><category>Appcelerator</category><category>Titanium</category><category>mobile</category></item><item><title>Less y Sass. Si estás escribiendo CSS sin ellos estás perdiendo tu tiempo.</title><description>&lt;p&gt;Se que también te ha pasado lo siguiente: tienes un CSS de más de 800 líneas y realmente se vuelve un desastre total mantenerlo. Logras tener líneas que se ven como:&lt;/p&gt;
&lt;p&gt;body#about div#content p.info span.important { &amp;#8230;&lt;/p&gt;
&lt;p&gt;Así hemos hecho los CSS desde hace mucho, el detalle está en que escribir tanto por un CSS puede lograr ser fastidioso, propenso a errores y ahora con CSS3 y tantas cosas lindas que se pueden hacer con las bondades del CSS3 y de paso le agregamos un par de motores de renderizado diferente que incorporaron estas características desde antes que se volviera un estándar (-moz-border-radius/-webkit-border-radius -&amp;gt; border-radius) y tenemos que soportarlos. Al final: más código para hacer algo que en teoría es simple.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Todo esto se volvería un desorden absoluto, con líneas y archivos enormes, código notablemente repetido y cuando tenemos que hacer modificaciones muchas veces nos perdemos.&lt;/p&gt;
&lt;p&gt;Aquí es donde interviene &lt;strong&gt;Sass&lt;/strong&gt; (Syntactically Awesome Stylesheets) y &lt;strong&gt;Less&lt;/strong&gt;. Las dos logran lo mismo: hacer que escribir CSS sea divertido (nuevamente). Sass tiene su propia sintaxis, aún cuando en Sass 3 permite la misma sintaxis de SCSS (que es más bien un CSS tabular). Less, por su parte, tiene una sintaxis muy parecida al SCSS, con algunas diferencias. Si vienes de CSS te parece más natural todo usar SCSS con Sass o simplemente irte con Less.&lt;/p&gt;
&lt;p&gt;Dentro de los últimos 6 meses pude hacer proyectos Sass y Less y en conclusión les puedo decir que &lt;strong&gt;si hoy siguen haciendo el CSS de la misma manera ESTÁS PERDIENDO TU TIEMPO&lt;/strong&gt; y debes obligatoriamente echarle un ojo a estas tecnologías.&lt;/p&gt;
&lt;h3&gt;Sass&lt;/h3&gt;
&lt;p&gt;Si haces Ruby on Rails ya debes saber que es Sass. Sass es una extensión de CSS3 que permite escribir CSS anidado, con una sintaxis mucho más cómoda y sencilla que la de CSS convencional.&lt;/p&gt;
&lt;p&gt;Igualmente posee las siguientes características:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Se compila a CSS ordinario&lt;/strong&gt; usando ya sea una herramienta por línea de comandos o alguna herramienta de escritorio como &lt;a href="http://incident57.com/codekit/"&gt;CodeKit&lt;/a&gt; (Mac). Yo usé un script en Ruby en la línea de comandos que dejaba corriendo siempre.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Posee variables&lt;/strong&gt;, así si tienes un mismo valor (un color, un tamaño o varios tamaños, etc) puedes grabarlo en una variable y reutilizarlo.&lt;/li&gt;
&lt;li&gt;Permite tener una &lt;strong&gt;sintaxis anidada&lt;/strong&gt; (como cualquier lenguaje de programación) de dos tipos: al estilo Sass donde no hay llaves ({) y los espacios son importantes o al estilo SCSS donde si hay llaves y es anidado. así si tienes un elemento que está contenido dentro de unas llaves quiere decir que es el hijo del otro elemento.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mixins:&lt;/strong&gt; piensen en funciones que están para evitar la repetición de código.&lt;/li&gt;
&lt;li&gt;Gran cantidad de &lt;a href="http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html"&gt;funciones por defecto&lt;/a&gt;. También permiten operaciones matemáticas básicas (pore ejemplo para agrandar tamaño de letras.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://compass-style.org/"&gt;Compass&lt;/a&gt;: Un pequeño framework para hacer el trabajo con Sass menos repetitivo. Ya tiene mixins, variables y demás elementos que te hará la vida feliz.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Veamos un ejemplo de Sass:&lt;/p&gt;
&lt;script src="https://gist.github.com/1701001.js"&gt; &lt;/script&gt;&lt;h3&gt;Less&lt;/h3&gt;
&lt;p&gt;Less es muy parecido a Sass, con el único hecho que necesita (no obligatoriamente) un Script en JavaScript para su interpretación de Less a CSS común. Lo que si cabe destacar es que hay herramientas como &lt;a href="http://incident57.com/less/"&gt;Less.app&lt;/a&gt; (Mac) y algunas en la línea de comando que transforman Less a CSS directamente.&lt;/p&gt;
&lt;p&gt;Las características son muy parecidas a Sass y ofrecen lo mismo que Sass, además de:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Pueden correr en el servidor con Node.js o Rhino&lt;/strong&gt;. Muy útil si utilizas Node.js en el server para alguna aplicación móvil o algo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No necesitas un compilador a CSS&lt;/strong&gt; si no quieres. Puedes utilizar su interpretador en JavaScript.&lt;/li&gt;
&lt;li&gt;Tiene &lt;strong&gt;mixins&lt;/strong&gt;, &lt;strong&gt;variables&lt;/strong&gt;, &lt;strong&gt;operaciones matemáticas&lt;/strong&gt; y &lt;strong&gt;funciones básicas&lt;/strong&gt;, igual que Sass.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parametric Mixins:&lt;/strong&gt; Esto está bueno. En español sencillo son funciones que pueden representar clases de CSS o funciones directamente. Así tenemos un mixin que se llama &amp;#8220;.border-radius&amp;#8221; quiere decir que los elementos pueden tener class=&amp;#8221;border-radius&amp;#8221; y utilizarán los parámetros establecidos o dentro de nuestro código ligeramente podríamos hacer { .border-radius() } y el ejecutaría en vez de una clase un mixin. &lt;a href="http://lesscss.org/#-parametric-mixins"&gt;Leer más&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Less no tiene Compass, pero hay una alternativa muy buena llamada &lt;a href="http://markdotto.com/bootstrap/"&gt;Preboot&lt;/a&gt;, utilizada como base del &lt;a href="http://twitter.github.com/bootstrap/"&gt;Bootstrap&lt;/a&gt; de Twitter.&lt;/li&gt;
&lt;li&gt;Comentarios con //.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;En conclusión les puedo decir que ya yo escogí Less sobre Sass, por varias razones pero básicamente es que me he acostumbrado mucho a utilizar Less.app, me encantan los &lt;strong&gt;Parametric Mixins&lt;/strong&gt; y prefiero &lt;strong&gt;Preboot sobre Compass&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Si tu eres un front end developer o un designer y utilizas CSS a diario y aún no estás utilizando ni Sass ni Less realmente te exhorto a que hoy mismo escojas uno y lo utilices de ahora en adelante en proyectos donde escribas más de 50 líneas de CSS. Me lo vas a agradecer.&lt;/p&gt;
&lt;p&gt;En otras noticias, acabamos de sacar el &lt;a href="http://www.pixmatstudios.com"&gt;nuevo sitio de Pixmat&lt;/a&gt; utilizando Less. Enjoy :).&lt;/p&gt;</description><link>http://blog.demogar.com/post/16722238877</link><guid>http://blog.demogar.com/post/16722238877</guid><pubDate>Sun, 29 Jan 2012 17:34:13 -0500</pubDate><category>less</category><category>css3</category><category>sass</category><category>front-end-development</category><category>design</category></item><item><title>¿Requests cortados en Nginx? Revisa los permisos</title><description>&lt;p&gt;Acabo de perder al menos 2 horas tratando de arreglar un problema y es que al tratar de conseguir un request bastante grande en un script el mismo se devolvía recortado y sólo devolvía las primeras 10,000 líneas.&lt;/p&gt;
&lt;p&gt;Ya, cuando estaba apunto de pegarme contra la pared, encontré un par de blog posts en otros idiomas donde indicaban que cuando los requests son bastante grandes el nginx comienza a grabar en disco mientras se hace el procesado de la data para su envío.&lt;/p&gt;
&lt;p&gt;En fin, la solución fue cuestión de 10 segundos: darle permisos a las carpetas &lt;strong&gt;client_body_temp&lt;/strong&gt; y &lt;strong&gt;fastcgi_temp&lt;/strong&gt; dentro de &lt;strong&gt;/opt/nginx&lt;/strong&gt; al usuario &lt;strong&gt;www-var&lt;/strong&gt;, que es quien corre el nginx en mi caso:&lt;/p&gt;
&lt;script src="https://gist.github.com/1636802.js?file=gistfile1.txt"&gt;&lt;/script&gt;</description><link>http://blog.demogar.com/post/16088080868</link><guid>http://blog.demogar.com/post/16088080868</guid><pubDate>Wed, 18 Jan 2012 19:43:00 -0500</pubDate><category>nginx</category><category>linux</category><category>server</category></item><item><title>¿Quieres un lenguaje para el 2012?: Que sea JavaScript</title><description>&lt;p&gt;Dentro de las &lt;a href="http://blog.demogar.com/post/15295662584/resoluciones-2012"&gt;resoluciones para el 2012&lt;/a&gt; mencioné que quería aprender bien JavaScript. JavaScript es (&lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;dejémosle el trabajo a Wikipedia&lt;/a&gt;):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;JavaScript is a prototype-based scripting language that is dynamic, weakly typed and has first-class functions. It is a multi-paradigm language, supporting object-oriented, imperative, and functional programming styles.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Es un lenguaje de scripting, multiparadigma, &amp;#8220;orientado a objetos&amp;#8221; (si es que eso se puede decir de JavaScript), etc. Un lenguaje común y corriente. Hago saber que no soy experto en JavaScript y aunque desde hace varios años he trabajado con él, luego de los últimos meses he descubierto que más es lo que desconozco de este lenguaje que lo que manejo de él.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Hace poco me preguntaron que lenguaje deberían aprender en el 2012. Una pregunta difícil, &lt;strong&gt;hace un año hubiese respondido Ruby o Python&lt;/strong&gt;, &lt;strong&gt;ahora respondería JavaScript&lt;/strong&gt;. &lt;a href="http://ejohn.org/"&gt;John Resign&lt;/a&gt; &lt;a href="http://ejohn.org/blog/javascript-as-a-first-language/"&gt;hizo hace poco un post&lt;/a&gt; sobre enseñar JavaScript como primer lenguaje, con muchos puntos a tomar en consideración, pero no me baso en ello para dar una respuesta, sino en el auge que parece que tendrá JavaScript durante este año. Web, RIA, Mobile y Server-Side: todo se puede con JavaScript.&lt;/p&gt;
&lt;h3&gt;Web / RIA&lt;/h3&gt;
&lt;p&gt;¿Quieres hacer RIA (aplicaciones ricas en internet)? Puedes hacerlo con JavaScript. Hoy en día hay frameworks específicos para esto, como &lt;a href="http://emberjs.com/"&gt;Ember.JS&lt;/a&gt; (&lt;a href="http://thinkvitamin.com/code/javascript/ember-js-a-more-lightweight-sproutcore/"&gt;Spoutcore 2&lt;/a&gt;), &lt;a href="http://knockoutjs.com/"&gt;Knockout&lt;/a&gt; y &lt;a href="http://documentcloud.github.com/backbone/"&gt;Backbone.JS&lt;/a&gt; que nos permiten crear productos ambiciosos en la web, proveyendo características como binding, templating y una arquitectura completa MVC.&lt;/p&gt;
&lt;p&gt;Igualmente hay librerías como jQuery, Dojo y Mootools (todas JavaScript también) pero más orientadas a manipulaciones del DOM. Estas librerías se pueden usar en conjunto con los nuevos chicos del barrio para crear grandes aplicaciones.&lt;/p&gt;
&lt;h3&gt;Mobile&lt;/h3&gt;
&lt;p&gt;Por su parte, si quieres desarrollar aplicaciones móviles tienes a Lungo.js, Sencha Touch, jQuery Mobile (estas tres web based) y Appcelerator (aplicaciones nativas). Todas programando el mismo JavaScript (y las web based obviamente necesitas conocimientos de HTML5 y CSS).&lt;/p&gt;
&lt;p&gt;Sólo he probado jQuery Mobile, Sencha Touch y Appcelerator. De Appcelerator &lt;a href="http://blog.demogar.com/post/15346241988/experiencias-con-rails-y-appcelerator"&gt;ya hablé un poco&lt;/a&gt; pero cabe decir que ahora mismo hay dos tendencias bien marcadas en desarrollo web:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Aplicaciones nativas para el dispositivo: de esas que tu bajas e instalas y tienes un link dentro de la lista de aplicaciones.&lt;/li&gt;
&lt;li&gt;Aplicaciones basadas en web: de aquellas que visitas un sitio y te carga una versión alterna. &lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;jQuery Mobile, Sencha Touch y Lungo.js&lt;/strong&gt; (una nueva alternativa española, bastante interesante) se centran en aplicaciones hechas con HTML5/CSS/JavaScript, osea la primera tendencia. jQuery Mobile me parece muy superior aún, sobretodo luego del release del 1.0.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;strong&gt;Appcelerator&lt;/strong&gt;, por su parte, es de la segunda tendencia. Con Appcelerator puedes crear aplicaciones nativas para Android y iPhone (e iPad) desde JavaScript directamente, sin necesidad de aprender Java (para Android) u Objective-C (para iOS).&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Server-side&lt;/h3&gt;
&lt;p&gt;Aunque a mi no me interesa mucho este apartado cabe destacar que JavaScript se destaca por su performance. Aquí reina &lt;a href="http://nodejs.org/"&gt;node.js&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Node.js is a platform built on Chrome&amp;#8217;s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Bonus track&lt;/h2&gt;
&lt;p&gt;Otra tendencia para este 2012 me parece que serán aplicaciones web centradas en API. Sea cual sea la tecnología que uses en tu servidor deberá ser más un conjunto de servicios expuestos que una aplicación completa.&lt;/p&gt;
&lt;p&gt;La gran ventaja de este tipo de aplicaciones es que permite que tu aplicación pueda ser utilizada en cualquier dispositivo o tecnología: sea un browser, un dispositivo móvil o una tablet o hasta una aplicación corriendo en tu escritorio.&lt;/p&gt;
&lt;p&gt;Pensemos en Instagram, utilizan Django en el servidor pero la aplicación corre en el móvil, para ello hicieron un REST API (vulgarmente: un web service por HTTP) que consumen desde la aplicación en el dispositivo.&lt;/p&gt;
&lt;p&gt;Así, ya sea que crees un aplicación con JavaScript en tu browser con Ember.js o utilices Appcelerator para crear una móvil sólo tendrías un código en tu servidor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Recomendaciones:&lt;/strong&gt; Rails o Django.&lt;/p&gt;</description><link>http://blog.demogar.com/post/15356867247</link><guid>http://blog.demogar.com/post/15356867247</guid><pubDate>Thu, 05 Jan 2012 15:07:44 -0500</pubDate><category>development</category><category>javascript</category></item><item><title>Experiencias con Rails y Appcelerator</title><description>&lt;p&gt;Hace casi un mes atrás decidí comenzar con ambas tecnologías que les he dado más vuelta de lo normal: &lt;strong&gt;Ruby on Rails&lt;/strong&gt; y &lt;strong&gt;Titanium Appcelerator&lt;/strong&gt;. El primero es un framework de desarrollo de aplicaciones web y el segundo es un phone web based framework para hacer aplicaciones móviles con los mismos conocimientos &lt;/p&gt;
&lt;p&gt;Al final este post sólo es una recopilación de todo lo que he notado sobre la marcha. Cabe destacar que soy un mero aprendiz en ambas tecnologías así que no me extraña que o esté en lo incorrecto. Igual me corrigen, es un honor aprender de ustedes.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3&gt;Ruby on Rails&lt;/h3&gt;
&lt;h4&gt;Lo que me gustó.&lt;/h4&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Buena documentación.&lt;/strong&gt; Me sigue pareciendo aún que la de CodeIgniter es la mejor documentación entre estos frameworks, pero no tengo quejas de la de Rails.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comunidad de calidad.&lt;/strong&gt; Se consigue muy buen código para aprender y la comunidad ayuda de manera correcta.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ActiveRecord es maravilloso&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pocas líneas hacen mucho.&lt;/strong&gt; Al menos en mi caso necesitaba hacer servicios y fue súper rápido, no lo podía creer siquiera.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gems para todo.&lt;/strong&gt; Me pasó un caso curioso: tuve que implementar una manera de subir archivos a Amazon S3. Luego de 10 minutos lo tenía funcionando con &lt;a href="https://github.com/thoughtbot/paperclip"&gt;Paperclip&lt;/a&gt;. Otros que me gustaron fueron &lt;a href="https://github.com/thoughtbot/factory_girl"&gt;Factory Girl&lt;/a&gt; (no había visto nada parecido y eso que si he usado Fixtures en Doctrine) y &lt;a href="http://faker.rubyforge.org/"&gt;Faker&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Buenos y muchos libros.&lt;/strong&gt; Ya me leí uno y medio y hay más por delante.&lt;/li&gt;
&lt;/ul&gt;&lt;h4&gt;Lo que no me gustó tanto:&lt;/h4&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Magia rodeando la magia.&lt;/strong&gt; Realmente dudo que por ahora mismo me ponga a ver como ocurren mil cosas por detrás.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tests, tests, tests.&lt;/strong&gt; Al menos rspec me parece estúpido. ¿Sólo porque debe verse lindo el test debo escribir tanto? Ya me dijeron que pruebe Test::Unit, creo que lo tendré que hacer. &lt;em&gt;Ojo:&lt;/em&gt; no me quejo de probar el código, eso me parece obligatorio, pero me pasaban casos que 2/3 del código que escribía eran tests.&lt;br/&gt;Esto es deprimente, pero si quieres sacar un código público es mejor que existan y corran los tests. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La comunidad del framework es gigante, la del lenguaje mismo no tanto&lt;/strong&gt; comparada con Python.&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Titanium Appcelerator&lt;/h3&gt;
&lt;h4&gt;Lo que me gustó:&lt;/h4&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Buen IDE.&lt;/strong&gt; El Titanium Studio está bastante bien. Aún cuando no soy fanático a estar usando IDE me pareció muy bueno, con la salvedad que realmente no vi que el debugger funcionara.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Algo conocido: JavaScript.&lt;/strong&gt; Hacer aplicaciones con lo que ya medio que conoces es un alivio algo grande si comparas que tienes que aprender Objective-C o utilizar Java (que no es algo que me guste, sinceramente).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;En crecimiento.&lt;/strong&gt; Veo que hay mucho movimiento en la comunidad, el foro y el canal de IRC permanecen en movimiento, lo que es bueno, ya que encontrar soluciones es bastante rápido.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kitchen Sink.&lt;/strong&gt; Tienen una aplicación de prueba llamada &lt;a href="https://github.com/appcelerator/KitchenSink"&gt;Kitchen Sink&lt;/a&gt; donde resumen casi todo el framework en un ejemplo completamente funcional. Es bueno como base y como referencia. Creo que sin esta aplicación hubiese dejado de hacerlo todo.&lt;/li&gt;
&lt;/ul&gt;&lt;h4&gt;Lo que no me gustó tanto:&lt;/h4&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Pocos ejemplos escritos.&lt;/strong&gt; Hay muchos screencasts pero pocos ejemplos escritos. Hay uno que otro buen tutorial en tutsplus, pero nada más.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La documentación realmente no es buena.&lt;/strong&gt; Me enredé mucho con esta documentación y la misma carece de ejemplos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;¿Libros? olvídate de eso.&lt;/strong&gt; Al menos por ahora no hay ningún libro de Appcelerator. Si quieres aprender debes dedicar largas horas trasteando y jugando. &lt;strong&gt;[Update]&lt;/strong&gt; &lt;a href="https://twitter.com/#!/miguelr"&gt;miguelr&lt;/a&gt; me informó que &lt;a href="https://www.packtpub.com/appcelerator-titanium-mobile-applications-development-for-smartphone-iphone-android-cookbook/book"&gt;acaba de salir un libro&lt;/a&gt;, realmente no me entere hasta hoy.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Al final, lo que si puedo estar seguro es que disfruté jugando con ambas tecnologías y de seguro seguiré jugando con ellas durante este año. Mi recomendación es que si tienen un chance y buscan que hacer, ahí tienen en que entretenerse y jugar.&lt;/p&gt;
&lt;p&gt;¡Saludos!&lt;/p&gt;</description><link>http://blog.demogar.com/post/15346241988</link><guid>http://blog.demogar.com/post/15346241988</guid><pubDate>Thu, 05 Jan 2012 10:00:00 -0500</pubDate><category>appcelerator</category><category>mobile</category><category>rails</category><category>titanium</category><category>webdevelopment</category></item><item><title>[Titanium Appcelerator] Could not find the file *.js</title><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; I tend to write everything in Spanish but this will be an exception, since I didn&amp;#8217;t find any information while digging for a solution for this known problem while using Titanium Studio for developing mobile applications.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A couple of days ago I found &lt;a href="http://developer.appcelerator.com/question/129818/error-message--could-not-find-the-file"&gt;this question&lt;/a&gt; under the Titanium Appcelerator forums. While doing my first Titanium Appcelerator application I ran into the same problem for a couple of minutes (to be honest I spent about 30 minutes on this): a big red messages that said &lt;strong&gt;&amp;#8220;Application Error: Could not find the file bla.js&amp;#8221;&lt;/strong&gt;, as shown in the following image:&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&lt;img align="middle" height="329" src="http://pixelgamma.com/titanium/2011-12-24_14.54.jpg" width="406"/&gt;&lt;/p&gt;
&lt;p&gt;Mysteriously the file existed and was ready to be used and compiled by Titanium Studio. However, the emulator continued showing the &lt;em&gt;fugly&lt;/em&gt; message (I really hate these Application Error messages on Appcelerator).&lt;/p&gt;
&lt;p&gt;Anyways, the solution for this is pretty simple, as I described in the forum:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Go to &lt;strong&gt;Project&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Clean&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Select your project&lt;/strong&gt; (or select to clean all projects) -&amp;gt; &lt;strong&gt;Click Ok&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Then compile again.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This will &lt;strong&gt;force a fresh compile&lt;/strong&gt; and all old files will be deleted and recompiled. &lt;strong&gt;This may take a while, so be patient.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Hope it helps if you run into this same situation and I hope you don&amp;#8217;t waste 30 minutes as I did.&lt;/p&gt;</description><link>http://blog.demogar.com/post/15336401383</link><guid>http://blog.demogar.com/post/15336401383</guid><pubDate>Thu, 05 Jan 2012 01:53:00 -0500</pubDate><category>appcelerator</category><category>mobile</category><category>titanium</category><category>javascript</category></item><item><title>Resoluciones 2012</title><description>&lt;p&gt;Casi todos los años trato de escribir &lt;a href="http://blog.demogar.com/post/2572880785/2010-new-years-resolutions" target="_blank"&gt;un par de resoluciones&lt;/a&gt; para fijarme metas a largo (y algunas a corto) plazo. Este año no sería la excepción, por lo que he decidido sacar una lista de resoluciones que espero cumplir a lo largo de este 2012, el cual espero que sea un gran año tanto en el aspecto profesional como personal.&lt;/p&gt;
&lt;h3&gt;Resoluciones 2012&lt;/h3&gt;
&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Master Ruby/Ruby on Rails:&lt;/strong&gt; Ya hice una aplicación que no pude sacar porque no tendría el tiempo necesario para mantenerla. Con lo poco que he podido hacer en Rails me han gustado varios factores: la comunidad y el código que se ve es muy bueno.&lt;br/&gt;Ruby, a diferencia de Python, me cautivó mucho, aún cuando la comunidad es muy inferior que la de Python. Rails, a diferencia de Django, me divirtió mucho más. &lt;em&gt;PHP seguirá siendo mi tecnología principal&lt;/em&gt;, más que nada por la experiencia que tengo con él, pero no dudaré en hacer algo en Ruby durante el año si tengo la posibilidad.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crear y sacar al menos dos aplicaciones para móviles:&lt;/strong&gt; Hice una de prueba y me pareció genial y divertido. Quiero sacar al menos dos aplicaciones móviles a lo largo del año.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Master JavaScript:&lt;/strong&gt; Ya comencé, pero este lenguaje me está costando un poco más de lo habitual. Créanme: si piensan que por usar jQuery ya saben JavaScript, están BIEN equivocados. Este es un lenguaje que me parece &lt;em&gt;va a triunfar en este 2012&lt;/em&gt;: para RIA, web en general, server side y hasta para mobile development. Muchas personas se están centrando sólo en HTML5, para mi JavaScript será la verdadera estrella este año, nuevamente.&lt;br/&gt;&lt;a href="http://emberjs.com/"&gt;Ember.js&lt;/a&gt; (antes SproutCore), &lt;a href="http://documentcloud.github.com/backbone/"&gt;Backbone.js&lt;/a&gt;, y &lt;a href="http://www.appcelerator.com/"&gt;Appcelerator&lt;/a&gt; son proyectos que me llamaron mucho la atención durante el 2011 y seguirán llamándome la atención en este nuevo año.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Graduarme y seguir:&lt;/strong&gt; Me faltan dos materias para la Ingeniería y ya estoy pensando que debo hacer después.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Viajar este año fuera del país.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comenzar a hacer ejercicio:&lt;/strong&gt; ahora sí :P.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aprender a cocinar:&lt;/strong&gt; Actualmente soy un cero a la izquierda en la cocina, pero algo internamente me dice que podría hacerlo bien (con hacerlo bien me refiero a no quemarla entera).&lt;/li&gt;
&lt;li&gt;(Pixmat) &lt;strong&gt;Sólo proyectos, cero horas de consultoría, divertirnos:&lt;/strong&gt; El 2011 fue un buen año, sinceramente no tengo quejas&amp;#8230; al menos con los números.&lt;br/&gt;Lo que si sentimos durante todo el año fue: &amp;#8220;¿es realmente esto lo que queremos hacer?&amp;#8221; La respuesta fue un contundente &amp;#8220;no&amp;#8221;.&lt;br/&gt;No haremos más consultoría y sólo aceptaremos proyectos completos durante el 2012. Si no tenemos proyectos a la mano lo ocuparemos ya sea haciendo servicios o aplicaciones personales o creando contenidos para la venta (templates, etc).&lt;br/&gt;&lt;em&gt;Tenemos en mente al menos 3 aplicaciones y servicios&lt;/em&gt; que queremos desarrollar durante el 2012, así que ya tenemos en que ocuparnos en nuestro tiempo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ayudar, enseñar y compartir:&lt;/strong&gt; Durante el 2011 participé de algunos talleres (jQuery, jQuery Mobile, etc). Aunque no soy el mejor presentador creo que he aprendido gracias al tiempo que otras personas han dedicado para que aprenda, como retribución podría tomar un poco de tiempo para enseñar lo que aprendo.&lt;br/&gt;Liberar cuanto código pueda, escribir de mis experiencias o descubrimientos, seguir ayudando a quien me lo pida o simplemente atendiendo a cualquier presentación que pueda.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Levantarme más temprano:&lt;/strong&gt; Creo que lo ideal sería poder levantarme más temprano y aprovechar más horas del día. Con tal de levantarme 2 horas antes podría aprovechar ese tiempo en hacer algo productivo.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;El año apenas empieza y tengo algunas muchas metas para este 2012, el cual espero que sea tan bueno y mejor que el 2011.&lt;/p&gt;
&lt;p&gt;Así que bueno, mejor nos apuramos un poco y comenzamos a realizar todo que ya nos quedan 362 días para cumplir todo esto (uno de &lt;em&gt;&lt;a href="http://en.wiktionary.org/wiki/%C3%B1apa" target="_blank"&gt;ñapa&lt;/a&gt;&lt;/em&gt;, que este año es bisiesto).&lt;/p&gt;</description><link>http://blog.demogar.com/post/15295662584</link><guid>http://blog.demogar.com/post/15295662584</guid><pubDate>Wed, 04 Jan 2012 09:52:17 -0500</pubDate><category>resolutions</category></item><item><title>Current status: playing with Titanium (Taken with picplz.)</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_lwz34lhuBZ1qzvjwlo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Current status: playing with Titanium (Taken with &lt;a href="http://picplz.com"&gt;picplz&lt;/a&gt;.)&lt;/p&gt;</description><link>http://blog.demogar.com/post/14976884597</link><guid>http://blog.demogar.com/post/14976884597</guid><pubDate>Thu, 29 Dec 2011 11:00:20 -0500</pubDate></item><item><title>shitsirisaysdotcom:

maybe a little too helpful…?
</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_ltaoxz4U5X1r4h7kbo1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://shitsirisays.com/post/11649363922"&gt;shitsirisaysdotcom&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;maybe a little too helpful…?&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://blog.demogar.com/post/11660123851</link><guid>http://blog.demogar.com/post/11660123851</guid><pubDate>Wed, 19 Oct 2011 13:55:34 -0500</pubDate></item><item><title>Pasos explicados:
Asegurarse que está ‘rooteado’ el...</title><description>&lt;iframe src="http://player.vimeo.com/video/30646976" width="400" height="225" frameborder="0"&gt;&lt;/iframe&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;strong&gt;Pasos explicados:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Asegurarse que está ‘rooteado’ el dispositivo.&lt;/li&gt;
&lt;li&gt;Descargar este &lt;a href="http://demogar.com.s3.amazonaws.com/cuevana.zip"&gt;archivo&lt;/a&gt;. Descomprimirlo y subirlo al sd del teléfono.&lt;/li&gt;
&lt;li&gt;Descargar &lt;a href="https://market.android.com/details?id=com.opera.browser&amp;feature=search_result"&gt;Opera Mobile&lt;/a&gt; (&lt;strong&gt;NO Opera Mini&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Descargar &lt;a href="https://market.android.com/details?id=xcxin.filexpert&amp;hl=en"&gt;File Expert&lt;/a&gt;. Le damos permiso de root a la aplicación.&lt;/li&gt;
&lt;li&gt;Pasamos los archivos a /data/data/opera.browser.com/opera&lt;/li&gt;
&lt;li&gt;Les damos permiso a los archivos.&lt;/li&gt;
&lt;li&gt;Disfrutamos.&lt;/li&gt;
&lt;/ol&gt;</description><link>http://blog.demogar.com/post/11572296793</link><guid>http://blog.demogar.com/post/11572296793</guid><pubDate>Mon, 17 Oct 2011 10:26:43 -0500</pubDate></item><item><title>jakethelab:

The saying “You are what you eat” also applies to...</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_lt68w7J5JL1qcods1o1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://jakethelab.com/post/11533702317"&gt;jakethelab&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The saying “You are what you eat” also applies to dogs!&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://blog.demogar.com/post/11572208716</link><guid>http://blog.demogar.com/post/11572208716</guid><pubDate>Mon, 17 Oct 2011 10:23:08 -0500</pubDate></item><item><title>Usando CodeIgniter Cache más limpiamente</title><description>&lt;p&gt;CodeIgniter Reactor (la versión de la comunidad) hace un par de meses traía consigo algo debajo del telón: un &amp;#8220;&lt;a href="http://codeigniter.com/user_guide/general/drivers.html"&gt;driver&lt;/a&gt;&amp;#8221; para &lt;a href="http://codeigniter.com/user_guide/libraries/caching.html"&gt;Cache&lt;/a&gt; que podría adaptarse con otras tecnologías como APC, y Memcached.&lt;/p&gt;
&lt;p&gt;Para la versión oficial 2.0.2 de CodeIgniter que salió en abril de este año ya traía incluída el CodeIgniter Cache. Yo mientras seguía usando la &lt;a href="http://philsturgeon.co.uk/code/codeigniter-cache"&gt;librería de Cache de Phil Sturgeon&lt;/a&gt;. Este fin de semana pude actualizar Panagamers a CodeIgniter 2.0.3 y con un cambio que hubo en el Core de CodeIgniter la librería quedo totalmente inservible. Tenía dos opciones: o arreglar el problema yo mismo o utilizar el Cache Library de CodeIgniter.&lt;/p&gt;
&lt;p&gt;Me fui por la segunda, pero tuve que implementar una sub-librería para hacer que el proceso fuese igual o parecido a como lo hacía con la librería de Phil Sturgeon y bueno, he aquí este post.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Lo que se me ocurrió fue hacer otra librería llamada &amp;#8220;Pgcache&amp;#8221; (Panagamers Cache) que instanciaba al driver de cache, utilizando File-based Cache y que generara los nombres directamente, así podíamos seguir utilizando llamados como &lt;strong&gt;$this-&amp;gt;pgcache-&amp;gt;model(&amp;#8216;nombre_model&amp;#8217;, metodo&amp;#8217;, $parametros, $tiempo)&lt;/strong&gt; sin tener que modificar tanto todas las implementaciones viejas. Lastimosamente si había que cambiar de &lt;strong&gt;$this-&amp;gt;cache&lt;/strong&gt; a &lt;strong&gt;$this-&amp;gt;pgcache&lt;/strong&gt;, ya que al utilizar &lt;strong&gt;$this-&amp;gt;cache&lt;/strong&gt; interpretaba el driver directamente y no era lo que queríamos, ya eso es harina de otro costal.&lt;/p&gt;
&lt;p&gt;El código me quedó de la siguiente forma:&lt;/p&gt;
&lt;script src="https://gist.github.com/1262015.js"&gt; &lt;/script&gt;&lt;h4&gt;Breve explicación&lt;/h4&gt;
&lt;p&gt;Si notamos un poco, el constructor lo único que hace es inicializar el driver de cache, indicando que nuestro adaptador será &amp;#8220;file&amp;#8221; (o que utilizaremos file-based caching).&lt;/p&gt;
&lt;p&gt;El &lt;strong&gt;método privado _generate_name()&lt;/strong&gt; lo único que hace es generar el nombre dependiendo de los parámetros que estemos utilizando (como el nombre del modelo, del método que llamamos, los parámetros, etc).&lt;/p&gt;
&lt;p&gt;Y el &lt;strong&gt;método model&lt;/strong&gt; es el que hace el resto. Pienso hacer otros métodos para librerías, helpers, etc. pero por ahora nos quedamos con las llamadas sólo para los models. Este método comprueba si ya está grabado en el Cache (y está vigente) de ser así lo busca y regresa (deserializado), sino lo serializa y lo graba para entonces retornarlo.&lt;/p&gt;
&lt;p&gt;Espero que a alguien le sea de ayuda, preferiblemente esto debió estar en inglés que hay un montón de gente pidiendo soluciones para esto en Internet, cuando tenga un poco más de tiempo hago la traducción (a menos que alguien se ofrezca :P)&lt;/p&gt;</description><link>http://blog.demogar.com/post/11023119067</link><guid>http://blog.demogar.com/post/11023119067</guid><pubDate>Tue, 04 Oct 2011 11:07:30 -0500</pubDate><category>codeigniter</category><category>php</category><category>cache</category><category>dry</category></item><item><title>¿Por qué sigo?</title><description>&lt;p&gt;Es 28 de agosto de 2011, son las 10:49 p.m., estoy cansado, agotado. Quiero ducharme y dormir. Sin embargo no puedo.&lt;/p&gt;
&lt;p&gt;Sí, estoy agotado, acabo de llegar de la final de los World Cyber Games 2011, en donde participé junto con el resto de &lt;a href="http://www.panagamers.com"&gt;Panagamers&lt;/a&gt; como organizadores de la categoría de Counter-Strike. Luego de casi un mes organizando, hoy terminamos todo. Durante todo este mes he ganado/descubierto enemistades, mucha gente me odia, mucha otra gente me odia menos, dudo que alguien me quiera más que mi perra (una labradora llamada Luana) y dudo que a alguien le simpatice. Al final de todo este tiempo y más de 3 años en Panagamers y casi 10 años apoyando al gaming panameño, me hice una pregunta: &lt;strong&gt;¿Por qué sigo? ¿Qué gano de todo?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No gano nada de esto, más pierdo (dinero, tiempo, horas de sueño, me canso, etc). Al final la única respuesta es que recuerdo mi primer World Cyber Games, hace 10 años, tenía 14 y jugaba Age of Empires. Miraba embobado como me destrozaban en octavos de final, luego de haber hecho una estrategia errada, en un tiempo errado. Si perdía un juego me iba a casa, eso era todo (nada de loser bracket, nada de best of three, nada de eso). Lo disfrutaba mucho y no es que me guste perder, soy muy competitivo, pero amo participar de estos eventos. El problema es que &lt;strong&gt;en Panamá sólo hay un evento grande en todo el año, el resto del año las compañías se olvidan de nosotros.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Quería jugar más, quería participar más, pero nadie hacía eventos, nadie tenía noticias, nadie tenía un lugar en común para compartir con personas iguales a mi, nadie sabía como comunicarse con otras personas que tenían esas ganas de jugar. Simplemente no existía.&lt;/p&gt;
&lt;p&gt;Si no lo hacía alguien que se sacrificara, nunca pasaría. Así nació la idea de Panagamers: sacrificarnos porque otras personas puedan tener lo que ninguno de nosotros en Panagamers tuvo: una comunidad, eventos concurrentes, un lugar en común.&lt;/p&gt;
&lt;p&gt;Durante los últimos años no ha habido sólo un torneo de gaming en Panamá y les apuesto que el 95% de los eventos de videojuegos en Panamá se organizan en Panagamers, ya sea por la comunidad o por nosotros mismos. Tenemos servidores de todos los juegos, gracias a acuerdos con Cable &amp;amp; Wireless. Al final de cada torneo sólo queremos dormir, pero siempre al final de todos los eventos en que somos parte hay alguien contento, que se te acerca a ti, te mira a los ojos con una sonrisa y te dice &amp;#8220;gracias, fue un buen evento, ¿cuándo hay otro?&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Al final, la satisfacción es verme en los ojos de cada uno de estos jóvenes que quieren un método de diversión sano y diferente, algo diferente. Me veo en ellos y quisiera jugar, pero si lo hago seguramente no concentraría en mis esfuerzos para que ellos puedan jugar.&lt;/p&gt;
&lt;p&gt;Muero por jugar, muero por verme jugar con ellos y contra ellos. Mi último torneo fue hace años y la pasé muy bien. Sin embargo con el poco tiempo libre puedo escoger sólo una de dos: jugar o hacer que otros jueguen. Prefiero la segunda, hay más sonrisas de por medio.&lt;/p&gt;
&lt;p&gt;Son las 11:09 p.m., voy a ducharme y luego dormir, mañana trabajo. Sólo me voy a la cama con la satisfacción que hoy jugaron personas que no lo hubiesen hecho, si estos 10 años los hubiese usado para jugar y no apoyar.&lt;/p&gt;</description><link>http://blog.demogar.com/post/9533640660</link><guid>http://blog.demogar.com/post/9533640660</guid><pubDate>Sun, 28 Aug 2011 23:08:00 -0500</pubDate></item><item><title>Flourish: librería en PHP completamente OOP</title><description>&lt;p&gt;A mi me parece que PHP cumple su propósito real: crear aplicaciones y sitios completos utilizando un lenguaje que desde el principio se diseño para este fin.&lt;/p&gt;
&lt;p&gt;Los frameworks (como &lt;a href="http://codeigniter.com/"&gt;CodeIgniter&lt;/a&gt; y &lt;a href="http://kohanaframework.org/"&gt;Kohana&lt;/a&gt;) y los CMS (como &lt;a href="http://expressionengine.com/"&gt;ExpressionEngine&lt;/a&gt; o &lt;a href="http://www.getfuelcms.com/"&gt;FuelCMS&lt;/a&gt;) han llegado para quedarse y nos facilitan completamente la creación de aplicaciones grandes en poco tiempo.&lt;/p&gt;
&lt;p&gt;El problema viene cuando nos acostumbramos o nos hacemos dependientes a ellos y tenemos este pequeño proyecto que necesitamos desarrollar, pero no es lo suficientemente grande como para hacerlo en un framework (aún cuando se pueda) o utilizar un CMS (o Wordpress) como base para el proyecto.&lt;/p&gt;

&lt;p&gt;Recuerdo antes, lo que teníamos era una serie de librerías desorganizadas y lo único que hacíamos era darle include_once cuando necesitábamos de ellas. Con el paso de los años he perdido la mayoría de mis librerías y tratando de buscar librerías para sacarme de apuro (y gracias a &lt;a href="http://twitter.com/atourino"&gt;atourino&lt;/a&gt;) pude jugar con Flourish, una librería completa en PHP y totalmente orientada a objetos.&lt;/p&gt;
&lt;p&gt;Lo que más me gusto de Flourish es que todo &lt;strong&gt;es consistente&lt;/strong&gt; y &lt;strong&gt;su documentación es muy buena y completa&lt;/strong&gt;. Tiene librerías completas orientadas a crear soluciones en:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Manejo de bases de datos (ORM).&lt;/li&gt;
&lt;li&gt;Manejo de consultas (Requests).&lt;/li&gt;
&lt;li&gt;Manejos de sesiones y cookies.&lt;/li&gt;
&lt;li&gt;Seguridad (CSRF, XSS, etc).&lt;/li&gt;
&lt;li&gt;Validación de formularios.&lt;/li&gt;
&lt;li&gt;CRUD completo.&lt;/li&gt;
&lt;li&gt;Formatters.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://flourishlib.com/docs"&gt;Otros&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>http://blog.demogar.com/post/8688801631</link><guid>http://blog.demogar.com/post/8688801631</guid><pubDate>Tue, 09 Aug 2011 08:43:35 -0500</pubDate><category>php</category><category>flourish</category></item><item><title>Forzar SSL para ciertas vistas en CodeIgniter</title><description>&lt;p&gt;El rollo es así: tenemos que forzar &lt;strong&gt;https&lt;/strong&gt; para ciertas vistas de nuestra aplicación. Para ello, como siempre, busqué a ver si alguien ya se le había ocurrido hacer esto. Tenía una idea de modificar el base_url en plena marcha de la aplicación, pero leyendo &lt;a href="http://codeigniter.com/forums/viewthread/83154/"&gt;una solución&lt;/a&gt; se me ocurrieron varias otras soluciones en conjunto:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Tener un controller llamado &lt;strong&gt;MY_Controller&lt;/strong&gt; que extienda de &lt;strong&gt;CI_Controller&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tener un helper donde tendríamos &lt;strong&gt;dos funciones&lt;/strong&gt; que estaban en el post anterior, donde se forzaría el comienzo de https y quitar el https para otras vistas.&lt;/li&gt;
&lt;li&gt;Tener una variable de configuración donde tendríamos el primer URI string para las secciones que quisiéramos que fueran seguras.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Así, nos quedaron los siguientes retazos de código:&lt;/p&gt;
&lt;script src="https://gist.github.com/1133428.js?file=ssl_routes.php"&gt;&lt;/script&gt;&lt;script src="https://gist.github.com/1133428.js?file=ssl_helper.php"&gt;&lt;/script&gt;&lt;script src="https://gist.github.com/1133428.js?file=MY_Controller.php"&gt;&lt;/script&gt;&lt;p&gt;Con estas tres partes de código, y asegurándonos que ya estamos cargando nuestro ssl_helper y nuestro ssl_routes (config) nos aseguramos que cada vez cargue una página que esté en &lt;strong&gt;/profile/* /tienda/*&lt;/strong&gt; o &lt;strong&gt;/pedidos/*&lt;/strong&gt; se redireccione a la misma dirección, sólo que usando https por delante.&lt;/p&gt;</description><link>http://blog.demogar.com/post/8677762460</link><guid>http://blog.demogar.com/post/8677762460</guid><pubDate>Mon, 08 Aug 2011 23:49:53 -0500</pubDate><category>codeigniter</category><category>php</category></item><item><title>(Taken with picplz.)</title><description>&lt;img src="http://24.media.tumblr.com/tumblr_lpkxr59uDT1qzvjwlo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;(Taken with &lt;a href="http://picplz.com"&gt;picplz&lt;/a&gt;.)&lt;/p&gt;</description><link>http://blog.demogar.com/post/8617818140</link><guid>http://blog.demogar.com/post/8617818140</guid><pubDate>Sun, 07 Aug 2011 17:42:40 -0500</pubDate></item><item><title>Control de una galería de SlideShowPro desde JavaScript y jQuery</title><description>&lt;p&gt;Ya tenía un par de semanas pendiente para escribir este artículo y fue algo que surgió mientras trabajaba en un proyecto de consultoría, en donde teníamos que tener modificar la paginación que crea por defecto el &lt;a target="_blank" href="http://slideshowpro.net/"&gt;SlideShowPro&lt;/a&gt; y utilizar una que nosotros mismos pudiéramos modificar a disposición.&lt;/p&gt;
&lt;p&gt;La &lt;strong&gt;paginación que tiene SSP por defecto es genial&lt;/strong&gt;, muy intuitiva, linda, con una imagen de preview fácil de navegar y demás, el hecho es que no tenemos una opción sencilla de poder tener botones diferentes o nuevos con los números de las fotos para poder navegar entre ellas, por lo que &lt;a href="http://wiki.slideshowpro.net/SSPplayer/API-API"&gt;revisando el API de SSP&lt;/a&gt; descubrimos que &lt;strong&gt;teníamos la facilidad de poder manejar y utilizar los datos provenientes de la galería a nuestro antojo.&lt;/strong&gt; Uno de estos datos son la cantidad de fotos. Además, existe otro método dentro del API de SSP que permite poder cargar una foto específica (especificando el número de foto que queremos cargar), por lo que ya teníamos todo a nuestra mano para poder hacer el trabajo: el número de fotos y como cambiar de una a otra.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h3&gt;Pero yo no se Flash&lt;/h3&gt;
&lt;p&gt;Y bueno, aquí es donde venía el asunto. Yo &lt;strong&gt;hace más de 5 años no hago nada en Flash&lt;/strong&gt; (gracias a Dios). Realmente Flash no me gusta, no me gusta trabajar con él y no divierto siquiera abriendo el Adobe Flash. El ActionScript, realmente no me molesta tanto y luego de varios meses trabajando con Flex me he acostumbrado bastante a él, ya casi me es más indiferente que fastidioso.&lt;/p&gt;
&lt;p&gt;En Flex los componentes visuales (llámese los botones) los podríamos crear muy fácil, pero estábamos en Flash, además necesitábamos que los botones se pudieran estilar fácilmente sin la necesidad de abrir el .fla en un futuro e importar nuevos botoncitos hechos en imágenes.&lt;/p&gt;
&lt;p&gt;Lo que me recordó que Flash tiene a su disposición las &lt;a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/external/ExternalInterface.html?filter_flash=cs5&amp;amp;filter_flashplayer=10.2&amp;amp;filter_air=2.6"&gt;External Interface&lt;/a&gt; que permiten que nuestros componentes de Flash puedan ser manejados de forma externa por por medio de JavaScript y ejecutar a funciones de JavaScript desde el mismo ActionScript.&lt;/p&gt;
&lt;p&gt;Todo dicho, quedamos con una conclusión: &lt;strong&gt;podríamos hacer los botones en HTML, estilizarlos con CSS común y manejar la funcionalidad (cambiar las imágenes) desde JavaScript, que a su vez llamaría a una función o método en ActionScript.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Trabajando con el ExternalInterface&lt;/h3&gt;
&lt;p&gt;La idea era la siguiente: cuando los datos del álbum de SSP se cargaban se obtuviera la cantidad de imágenes disponibles, lo que ejecutaría una función de JavaScript que dibujara los botones en donde se lo señaláramos.&lt;/p&gt;
&lt;p&gt;Esto es muy simple, agregando en nuestro .fla (en Actions) el siguiente código:&lt;/p&gt;
&lt;p&gt;
&lt;script src="https://gist.github.com/1077143.js?file=gistfile1.as"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;Luego, teníamos que hacer otro método que escuchara cada vez que una función de JavaScript se ejecutara, para eso tuvimos que escuchar la función de JavaScript (dentro del ActionScript) y que cada vez que se ejecutara, enviara un evento en el ActionScript, que ejerce un cambio de imagen.&lt;/p&gt;
&lt;p&gt;Así, nuestro código de ActionScript en el Flash queda de la siguiente manera:&lt;/p&gt;
&lt;p&gt;
&lt;script src="https://gist.github.com/1077145.js?file=gistfile1.as"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bienvenido jQuery y trabajando con el JavaScript.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Amo jQuery, ¿sabían?. jQuery es una gran librería de JavaScript que permite el manejo del DOM de manera sencilla, nada de Rocket Science, es simple y cumple su cometido de la forma que debería. Aún cuando tenemos la opción de hacer que los botones ejecuten un método en JavaScript (con el onclick) hace años he sentido que no debemos escribir esto de manera obstrusiva.&lt;/p&gt;
&lt;p&gt;Lo que hicimos fue crear un pequeño plugin en jQuery que pudiera recibir como parámetro la cantidad de fotografías y él solo creara los botones, con su funcionalidad de click, que a su vez ejecutara una función que escucha que botón (o número de foto) estamos tratando de visualizar, lo que a su vez cambia la foto en el SSP directamente (desde JavaScript hasta el ActionScript/Flash).&lt;/p&gt;
&lt;p&gt;El plugin de jQuery sólo hace esto: obtiene la cantidad de fotos e itera entre esta cantidad para crear un botón por cada foto. Pueden obtener el pequeño &lt;a href="https://gist.github.com/1077147"&gt;plugin por acá&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sin embargo, también necesitamos una función que será nuestro punto de salida, una vez se obtienen la cantidad de fotos o imágenes en la galería. Esta función tiene como función iniciar nuestro plugin que a su vez creará los botones y la funcionalidad relacionada a cada uno de ellos.&lt;/p&gt;
&lt;p&gt;Esta función debe tener el siguiente código:&lt;/p&gt;
&lt;p&gt;
&lt;script src="https://gist.github.com/1077149.js?file=gistfile1.js"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;Y ya estamos listos, deberíamos poder controlar toda la funcionalidad de SSP desde el JavaScript y estilizar nuestros botones sin la necesidad de tocar nunca más el Flash, todo desde HTML, CSS y JavaScript.&lt;/p&gt;
&lt;p&gt;Puedes ver un &lt;a href="http://www.demogar.com/tests/ssp/"&gt;DEMO de la aplicación.&lt;/a&gt;&lt;/p&gt;</description><link>http://blog.demogar.com/post/7514170594</link><guid>http://blog.demogar.com/post/7514170594</guid><pubDate>Mon, 11 Jul 2011 19:56:00 -0500</pubDate><category>actionScript</category><category>javascript</category><category>jquery</category><category>flash</category></item><item><title>Ya llego esta vaina! (Taken with picplz.)</title><description>&lt;img src="http://24.media.tumblr.com/tumblr_lnvngqs8pg1qzvjwlo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Ya llego esta vaina! (Taken with &lt;a href="http://picplz.com"&gt;picplz&lt;/a&gt;.)&lt;/p&gt;</description><link>http://blog.demogar.com/post/7274458029</link><guid>http://blog.demogar.com/post/7274458029</guid><pubDate>Tue, 05 Jul 2011 15:26:50 -0500</pubDate></item><item><title>Adapt.js ~ Responsive web design con ayuda de JavaScript</title><description>&lt;p&gt;Imagínense tener que crear varios diseños de una aplicación web totalmente diferentes, dependiendo de la cantidad de dispositivos que visitan el sitio (y por ende sus distintas resoluciones). Hoy en día tenemos iPad (y otros tablets), iPhone (y otros móviles), monitores pequeños y hasta súper monitores con resoluciones arriba de los 1920 pixeles.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Esto nos deja con quizás 5 ó 6 distintos diseños completos de nuestro sitio&lt;/strong&gt;, lo que se resume en mucho trabajo necesario para poder hacer que todos sean incluidos cuando nos visitan desde su dispositivo favorito.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Uno de los elementos que más ha captado mi atención en CSS3 es la aparición real de los &lt;strong&gt;media queries&lt;/strong&gt;, trayendo consigo lo que conocemos como &amp;#8220;&lt;a href="http://www.alistapart.com/articles/responsive-web-design/"&gt;Responsive Web Design&lt;/a&gt;&amp;#8221;, basado en &amp;#8220;&lt;em&gt;responsive architecture&lt;/em&gt;&amp;#8221; que no es más que como se amolda un espacio físico (en nuestro caso nuestro sitio) a la presencia de distintas cantidades de personas (que en nuestro caso sería la resolución del dispositivo).&lt;/p&gt;
&lt;p&gt;Los media queries, que vienen de manera intrínseca en la especificación oficial del CSS3, traen consigo mejoras claves para los &lt;strong&gt;distintos medios&lt;/strong&gt; que acceden a nuestro sitio. Esto hace que nuestro CSS se adapte a la resolución del dispositivo (o del medio) que lo accede, por lo que en una misma hoja de estilo, tenemos distintos comportamientos dependiendo de las característica del dispositivo que nos visita. Por ejemplo: si tenemos antes un diseño de dos columnas, podemos decir que para resoluciones menor o igual a 320px (iPhone) sea un diseño de una columna (osea, ponemos todos los div sin que floten, por decir algo).&lt;/p&gt;
&lt;h3&gt;Implementando en un sitio con 960.gs&lt;/h3&gt;
&lt;p&gt;Todo bien hasta aquí, ¿verdad?. Sí, el CSS3 trae consigo la capacidad de hacer esto de una manera muy simple. Al tener que implementar un diseño que ya estaba maquetado con &lt;a href="http://www.960.gs"&gt;960.gs&lt;/a&gt; me topé con dos problemas reales:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;En exploradores que no soportaban CSS3 no tenía el efecto &amp;#8220;cool&amp;#8221; de que dependiendo de la resolución cambiase la estructura o el diseño.&lt;/li&gt;
&lt;li&gt;Se me hacía muy incómodo tener que implementar los media queries a un CSS implementado con 960.gs&lt;/li&gt;
&lt;/ol&gt;&lt;h3&gt;Y aparece Adapt.js&lt;/h3&gt;
&lt;p&gt;Descubrí por mera casualidad &lt;a href="http://adapt.960.gs/"&gt;Adapt.js&lt;/a&gt;, hecho por el mismo creador de 960.gs - Nathan Smith - haciendo una búsqueda para encontrar si ya alguien había hecho algún &amp;#8220;hack&amp;#8221; de poner el 960.css amigable para móviles y tablets, que al final suponía que debía ser cambiar el &lt;strong&gt;min-width&lt;/strong&gt; del &lt;strong&gt;body&lt;/strong&gt; y el &lt;strong&gt;max-width&lt;/strong&gt; del &lt;strong&gt;container_12&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Adapt.js se describe como una librería de JavaScript pequeña que determina que archivo de CSS deberá cargar cada vez que el browser carga el sitio. Lo mejor: es amigable con 960.gs, por lo que hacerlo funcionar era genial. Simplemente tenemos una lista de rangos de pixeles y a cada una de ellas le asignamos que CSS base queremos que se cargue, de &lt;a href="https://gist.github.com/1014817"&gt;esta manera&lt;/a&gt;:&lt;/p&gt;
&lt;script src="https://gist.github.com/1014817.js"&gt; &lt;/script&gt;&lt;p&gt;Gracias a este código (que usa jQuery) agregamos un id al body, dependiendo del tipo de dispositivo que nos esté visitando. Si es un móvil quedaría como &lt;strong&gt;&amp;lt;body id=&amp;#8221;mobile&amp;#8221;&amp;gt;&lt;/strong&gt; y así sucesivamente.&lt;/p&gt;
&lt;p&gt;Entonces, para el diseño podríamos utilizar un CSS que tome en consideración el ID del body, por ejemplo, si queremos que cuando es un móvil la letra sea 14px sólo haríamos: &lt;strong&gt;body#mobile{font-size:14px;}&lt;/strong&gt; y este cambio, obviamente, no interferirá con las otras &amp;#8220;versiones&amp;#8221; de nuestro CSS.&lt;/p&gt;
&lt;p&gt;Una ventaja de usar Adapt.js es que como es JavaScript funciona para cualquier browser con el mismo habilitado, sin importar si soporta CSS3&amp;#160;o no.&lt;/p&gt;
&lt;p&gt;Para finalizar, una recomendación personal (gracias a atourino): si van a utilizar Adapt.JS deberían considerar utilizar &lt;a href="http://sass-lang.com/"&gt;Sass&lt;/a&gt; (preferiblemente) o &lt;a href="http://lesscss.org/"&gt;LESS&lt;/a&gt;, realmente hace divertido nuevamente hacer CSS.&lt;/p&gt;</description><link>http://blog.demogar.com/post/6324285228</link><guid>http://blog.demogar.com/post/6324285228</guid><pubDate>Wed, 08 Jun 2011 12:23:00 -0500</pubDate><category>css3</category><category>mediaqueries</category><category>javascript</category></item></channel></rss>

