SagMor 2009-11-26T14:19:27+00:00 http://sagmor.com/ Sebastian Gamboa mbleigh@sagmor.com OOP en Javascript 2009-06-29T00:00:00+00:00 http://sagmor.com/blog/2009/06/oop-en-javascript <p><img src='http://www.quicksnapper.com/files/5632/15430052554A48FE2977759_m.png' alt='Javascript' /></p> <p><a href='http://es.wikipedia.org/wiki/JavaScript'>Javascript</a> debe ser <a href='http://javascriptexperts.blogspot.com/2009/03/javascript-el-lennguaje-de-programacion.html'>el lenguaje mas malentendido del mundo</a>, pero resulta ser uno de los lenguajes mas interesantes y poderosos que hay, con sus bases funcionales se pueden hacer cosas muy interesantes y una de ellas es la <a href='http://es.wikipedia.org/wiki/Programación_orientada_a_objetos'>programación orientada a objetos</a>, aun que, sorprendentemente, esto es algo que no muchos saben que se puede hacer y mi intención es darle un par de vueltas en este post.</p> <p>La gente que ha jugado con javascript estará acostumbrada a código <a href='http://es.wikipedia.org/wiki/Programación_estructurada'>eminentemente procedural</a> con código como el siguiente:</p> <pre><code>function function_name(param1, param2, param3) { // Do something! } function_name(some, actual, params);</code></pre> <p>Está bien, se hace lo que se pide pero, imaginen unas 20, 30 o mas funciones de esas y ya tienes una pesadilla.</p> <p>Luego uno conoce <a href='http://es.wikipedia.org/wiki/JSON'>JSON</a> que es excelente para pasar parámetros o transferirlo por la red.</p> <pre><code>some_function({ arg1: &#39;value1&#39;, arg2: &#39;value2&#39; });</code></pre> <p>Esto definitivamente hace mas facil entender que se está haciendo, pero todavía falta algo, esas funciones desperdigadas por el mundo me molestan, así que definamos &#8220;objetos de verdad&#8221; ahora!</p> <pre><code>function Person(name) { this.name = name; } Person.prototype.greet = function() { alert(&#39;Hello, &#39; + this.name); } // Y lo usamos: var p = new Person(&#39;Sebastián&#39;); p.greet();</code></pre> <p>Aquí creo que debería aclarar que es <em>Person.prototype</em>, el modelo de objetos de JavaScript se basa en en <a href='http://es.wikipedia.org/wiki/Programación_basada_en_prototipos'>prototipos</a> y el objeto <em>Person.prototype</em> no es mas que una colección de propiedades que se ván a copiar en toda instancia de Person que se cree, de hecho, nos podemos aprovechar de esto para implementar herencia!</p> <pre><code>function Employee(name, company) { this.name = name; this.company = company; } Employee.prototype = new Person(); var e = new Employee(&#39;Sebastián&#39;, &#39;Gaaper&#39;); e.greet();</code></pre> <p>Esto sorprendentemente comienza a verse mejor y se vuelve mucho mas interesante cuando se entienden correctamente las <strong>clausuras</strong> (que para los que vienen de <a href='http://www.ruby-lang.org/es/'>Ruby</a> notarán que se parecen mucho a los bloques pero un poco mas potentes) ya que usándolas inteligentemente se pueden implementar <a href='http://es.wikipedia.org/wiki/Encapsulamiento_(programación_orientada_a_objetos)'>encapsulamiento</a> y <a href='http://es.wikipedia.org/wiki/Espacio_de_nombre'>espacios de nombres</a>.</p> <p>Veamos una clausura básica:</p> <pre><code>(function() { var private = 0; window.increaseValue = function() { private++; } window.getValue = function() { return private; } })(); getValue(); // retorna 0; increaseValue(); private--; // error: ReferenceError: Can&#39;t find variable: private getValue(); // retorna 1;</code></pre> <p>Esto básicamente encapsula el valor de <em>private</em> que es inaccesible desde fuera de la clausura y define las funciones <em>increaseValue</em> y <em>getValue</em> que permiten acceder y modificar <em>private</em>. Y para esto solo hizo falta definir una <strong>función anonima</strong> y ejecutarla!</p> <p>Pero nos falta una cosa todavía, estas funciones están definidas en <em>window</em> por lo que se corre el riesgo de que existan conflictos de nombre con otro script y para eso acuden los <strong>espacios de nombres</strong> al rescate!</p> <pre><code>Namespace = {}; (function($) { var private = 0; $.increaseValue = function() { private++; } $.getValue = function() { return private; } })(Namespace); Namespace.increaseValue(); Namespace.getValue();</code></pre> <p>Fácil y rápido, hemos cambiado el ejemplo anterior para que utilizara un Espacio de Nombre y no definiera los métodos en <em>window</em>.</p> <p>La verdad es que JavaScript es un lenguaje muy dinamico y existen otras formas de hacer todo lo que puse aquí cada una con sus pros y contras, pero intenté mantener todo lo mas sencillo posible y utilizando los diseños que a mi me parecen mas elegantes y si tienen alguna idea de como esto se podría hacer mejor, me encantaría que la plantearan en los comentarios.</p> <p>Para finalizar les dejo un ejemplo que aplica gran parte de lo que puse aquí, es un poco mas complejo pero adelante ;)</p> <pre><code>(function($) { // Aquí defino la &quot;clase Foo&quot; function Foo(text) { /* Variable de instancia pública */ this.text = text || privateMethod(); /* Variable de instancia privada */ var priv = &#39;ehem&#39;; /* método público que utiliza la variable privada */ this.setPrivate = function(p) { priv = p; } /* método privado */ function privateMethod() { return &#39;this is private: &#39;+priv; } } Foo.prototype.getText = function() { return this.text; } /* Variable de clase privada */ var class_priv = 0; /* Método de clase público */ Foo.bar = function() { class_priv++; return new Foo(&#39;bar&#39;+class_priv); } /* Método de clase privado */ function helloFoo() { return new Foo(&#39;Hello&#39;); } $.Foo = Foo; })(window); var f = new Foo(&#39;Hello!&#39;);</code></pre> <p>Y si quedaron con gusto a poco, <a href='http://javascript.crockford.com/' title='Douglas Crockford&apos;s Javascript'>aquí les dejo un lugar</a> donde encontrar mas información pero en inglés.</p> Fácil y rápido 2009-06-28T00:00:00+00:00 http://sagmor.com/blog/2009/06/facil-y-rapido <p>Así es otra vez estoy inaugurando un nuevo sitio personal, pero esta ves utilizando las herramientas con las que en verdad me siento cómodo, ¡mi editor y mi terminal!</p> <p>Ya lo se, es tan facil tener un sitio ahora. <strong>Instala Wordpress y listo!</strong>, pero para mí usar Wordpress es como usar Word, <em>sencillamente complicado</em>, me saca de mi flujo normal de trabajo y todas esas ventajas no se vuelven mas que distracciones y luego de ver lo que <a href='http://github.com/blog/272-github-pages' title='GitHub Pages'>ofrecen los chicos de GitHub</a>, pensé &#8220;Eso es justo lo que necesito!&#8221;.</p> <p>La idea es fácil:</p> <ul> <li>Te creas un repositorio llamado <em>tu-nombre.github.com</em> (donde tu-nombre es tu usuario en GitHub)</li> <li>haces el sítio (casi como si fuera contenido estático)</li> <li>lo subes, usando git, al repositorio que acabas de crear</li> <li>y ya está, <a href='http://github.com/'>GitHub</a> hace el resto.</li> </ul> <p>Y siempre lo pueden complicar mas si quieren, de hecho es bastante personalizable y pueden aprender mas <a href='http://pages.github.com/' title='Introduction to Pages'>aquí</a>.</p> <p>Por cierto todo el sitio lo pueden encontrar en el repositorio <a href='http://github.com/sagmor/sagmor.github.com/tree/master'>sagmor.github.com</a></p> No soy delincuente 2009-04-02T00:00:00+00:00 http://sagmor.com/blog/2009/04/no-soy-delincuente <p>Simplemente genial, porque <strong>todos somos delincuentes!?</strong> por <a href='http://janidejesmar.tumblr.com/'>Jani Dueñas</a></p> <object height='270' classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' width='400' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'><param name='allowfullscreen' value='true' /><param name='allowscriptaccess' value='always' /><param name='src' value='http://vimeo.com/moogaloop.swf?clip_id=3621247&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1' /><embed src='http://vimeo.com/moogaloop.swf?clip_id=3621247&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1' allowfullscreen='true' type='application/x-shockwave-flash' allowscriptaccess='always' height='270' width='400' /></object> <p>Vía: <a href='http://www.huasonic.com/2009/03/17/no-soy-delincuente/'>Huasonic</a> | Más información en <a href='http://nosoydelincuente.cl/'>Nosoydelincuente.cl</a></p> Liberando Feeling Needish 2009-03-30T00:00:00+00:00 http://sagmor.com/blog/2009/03/liberando-feeling-needish <p>Saludos, hace tiempo que no escribo nada por acá.</p> <p>Así que vamos, para variar, a colocar algo que le puede interesar a aquellos que están metidos en lo que es el desarrollo de aplicaciones nativas para el iPhone, se trata de la primera aplicación que desarrollé, bien fea por cierto, pero que mas se le puede pedir a un humilde ingeniero con un mes de trabajo ;)</p> <p>Se trata de la aplicación con la que participé en el concurso <a href='http://www.web2rockstars.com/'>Web2.0Rockstars</a> en la que accedo a la api de <a href='http://www.needish.com/'>Needish</a> y pueden encontrar su código fuente completo <a href='http://github.com/sagmor/feelingneedish/tree/master' title=' Feeling Needish at GitHub'>aquí!</a>.</p> <p>Ojalá a alguien le sirva y le saque provecho&#8230;</p> Código Fuente CelShader 2008-11-17T00:00:00+00:00 http://sagmor.com/blog/2008/11/codigo-fuente-celshader <p>Luego de haber trabajado limpiando un poco el código de la aplicación, y aprovechando que Apple levantó el NDA del iPhone, es un agrado informarles que el código fuente se encuentra disponible en mi repositorio <a href='http://git.or.cz/' title='Git - Fast Version Control System'>Git</a> en:</p> <blockquote> <p><a href='http://github.com/SagMor/iphone-celshader/'>http://github.com/SagMor/iphone-celshader/</a></p> </blockquote> Versión final del proyecto de Cel-Shading 2008-11-16T00:00:00+00:00 http://sagmor.com/blog/2008/11/version-final-del-proyecto-de-cel-shading <p>Luego de un semestre completo de estudios y de trabajo, finalmente están listos los últimos detalles que me faltaban implementar para completar el proyecto de <strong>&#8220;Rendering no fotorealista&#8221;</strong> para el <em>iPhone</em>, entre estos últimos detalles destacan:</p> <ul> <li> <p>Cargar la textura del modelo y mostrarla en conjunto con la textura generada por el Cel-Shading</p> </li> <li> <p>Una interfaz a través de la cual se puede:</p> <ul> <li>Seleccionar el modelo a cargar.&lt;/li&gt;</li> <li>Activar o desactivar el algoritmo de Cel-Shading y a textura por defecto del modelo.</li> <li>Desplazar y acercar/alejar el modelo usando la interfaz multi-touch del dispositivo.</li> </ul> </li> </ul> <p>Aún que el proyecto ya esta terminado, de todas formas hay un par de cosas que planeo hacer con el, primero quiero limpiar un poco el código, y aprovechando que Apple a liberado el NDA, espero pronto subir el código de la aplicación para que otros puedan aprovecharlo y por otra parte espero animarme y escribir un par de artículos detallando un poco mas la experiencia.</p> Cel-Shading Funcionando 2008-10-19T00:00:00+00:00 http://sagmor.com/blog/2008/10/cel-shading-funcionando <p>Ya implementé Cel-Shading en la aplicación y esta dando excelentes resultados como se puede ver en la <a href='http://sagmor.github.com/iphone-celshader/galery/'>Galería de Imágenes del proyecto</a>.</p> <p>Por si les interesa saber como lo hice, me base principalmente en dos artículos <a href='http://www.gamedev.net/reference/articles/article1438.asp' title='GameDev.net - Cel-Shading'>el primero</a> es una introducción teorica sobre los que se trata CelShading, que básicamente lo que hace es &#8220;discretizar&#8221; la iluminación de los objetos quitándoles la apariencia 3D que les da la iluminación tradicional.</p> <p>El segundo articulo es la <a href='http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=37' title='eHe Productions: OpenGL Lesson #37'>lección numero 37</a> de <a href='http://nehe.gamedev.net'>NeHe</a> en que implementan el algoritmo que explican &#8220;teoricamente&#8221; en el primero, nuevamente tuve que hacer varios ajustes para hacerlo funcionar con VertexArrays, y por otra parte tuve que modificar las rutinas de carga de la textura tambien debido a limitaciones de <strong>OpenGL ES</strong>.</p> <p>La implementación, dado que OpenGL ES 1.1 no incluye soporte para vertex/fragment program, se basa en desactivar las luces de la escena, para posteriormente calcular la intensidad de la luz que le corresponde a cada triángulo del modelo para luego asociarle una textura que obscurece en función de la intensidad calculada.</p> Soy un Desarrollador Certificado! 2008-09-25T00:00:00+00:00 http://sagmor.com/blog/2008/09/soy-un-desarrollador-certificado <p><img src='http://www.quicksnapper.com/files/5632/4584522914A4839A490A37_m.png' alt='Certificado' /></p> <p>Hoy me acaba de enterar que aprobaron mi solicitud para acceder al <a href='http://developer.apple.com/iphone/program/'>iPhone Developer Program</a> lo que me permite finalmente realizar pruebas en un iPhone real de mi <a href='http://sagmor.github.com/iphone-celshader/'>proyecto de computación gráfica</a>, ademas de otras ideas que están rondando por mi cabeza.</p> Carga de Modelos 3D 2008-09-20T00:00:00+00:00 http://sagmor.com/blog/2008/09/carga-de-modelos <p>Ya esta implementada la carga de modelos 3D a partir de archivos <a href='http://en.wikipedia.org/wiki/MD2_(file_format)'>MD2</a>.</p> <p><a href='http://sagmor.github.com/iphone-celshader/galery/files/page0-1002-full.html'><img src='http://sagmor.github.com/iphone-celshader/galery/files/page0-1002-thumb.jpg' alt='Modelo Cargado por la Aplicación' /></a> <a href='http://sagmor.github.com/iphone-celshader/galery/files/page0-1001-full.html'><img src='http://sagmor.github.com/iphone-celshader/galery/files/page0-1001-thumb.jpg' alt='Modelo Cargado por la Aplicación' /></a> <a href='http://sagmor.github.com/iphone-celshader/galery/files/page0-1000-full.html'><img src='http://sagmor.github.com/iphone-celshader/galery/files/page0-1000-thumb.jpg' alt='Modelo Cargado por la Aplicación' /></a></p> <p>Para hacer esto, me basé en la implementación en <strong>C</strong> descrita en <a href='http://tfc.duke.free.fr/coding/md2-specs-en.html'>http://tfc.duke.free.fr/coding/md2-specs-en.html</a> la cual en general fue bastante sencilla de seguir gracias a que el iPhone incluye toda (o al menos gran parte de) la <a href='http://www.gnu.org/software/libc/'>libc</a>, sin embargo, se presentaron ciertas dificultades al momento de dibujar los modelos, puesto que <a href='http://www.khronos.org/opengles/'>OpenGL ES</a> deprecó el paradigma.</p> <pre><code>glBegin(...); glEnd();</code></pre> <p>Reemplazándolo por el uso de <em>VertexArrays</em>.</p> <p>Todavía es una implementación bastante rudimentaria, principalmente debido a las restricciones impuestas por la <strong>API</strong> de <strong>OpengGL ES</strong> con las que me he ido encontrando, lo que deja bastantes cosas por hacer todavía, principalmente:</p> <ul> <li>Reducir consumo de CPU/Memoria</li> <li>Cargar Texturas</li> </ul> <p>Problemas que voy a retocar en paralelo mientras implemento la siguiente face del desarrollo del proyecto, <strong>el algoritmo de Cel-Shading</strong>.</p> Definida la plataforma 2008-08-18T00:00:00+00:00 http://sagmor.com/blog/2008/08/definida-la-plataforma <p>Ya definí la plataforma para desarrollar <a href='/blog/2008/08/09/proyecto-grafica/'>este proyecto</a>.</p> <p>Finalmente opte por desarrollarlo utilizando el <strong>iPhone SDK</strong>.</p> <p>Las razones por las que escogí esta plataforma de desarrollo son básicamente</p> <ul> <li>El interes personal por ahondar en el desarrollo para Mac/iPhone</li> <li>Varias facilidades técnicas, como que ya tengo el software necesario para empezar a trabajar y no necesito utilizar emuladores para el sistema operativo (trabajo con Mac OS X y la mayoría de las otras plataformas se desarrollan en Windows)</li> <li>Y finalmente tengo acceso a un dispositivo para hacer pruebas, al menos en cuando obtenga los certificados de apple para ejecutar código en el)</li> </ul> <p>En fin, ya está todo listo para empezar a trabajar en el proyecto.</p> Inicio del proyecto de Computación Gráfica 2008-08-09T00:00:00+00:00 http://sagmor.com/blog/2008/08/proyecto-grafica <p>Hoy le doy inicio al desarrollo del proyecto del curso <strong>Computación Gráfica</strong> (CC52B) de la carrera <em>Ingeniería Civil en Ciencias de la Computación</em> impartido por el <a href='http://www.dcc.uchile.cl/'>Departamento de Ciencias de la Computación (DCC)</a> de la <a href='http://www.uchile.cl/'>Universidad de Chile</a>.</p> <p>Como podrán ver en el <a href='http://sagmor.github.com/iphone-celshader/'>sitio del proyecto</a>, este consiste en implementar un algorítmo de Rendering No-Fotrealista, en particular de Cel-Shading en un dispositivo movil que estaría definiendo dentro de los próximos días.</p>