Ayer Jamiroquai dio un concierto inolvidable en el Jazz Café de Londres, como parte de la Serie de eventos BBC Electric Proms. El concierto se escuchó por la BBC Radio 1Xtra y se podrá ver por televisión en el canal BBC Three el Sabado 28.

La lista de temas fue:

  • High Times
  • Space Cowboy
  • If I Like It I Just Do
  • Emergency On Planet Earth
  • Seven Days In Sunny June
  • Black Capricorn Day
  • Canned Heat
  • Use The Force
  • Travelling Without Moving
  • Runaway
  • Virtual Insanity

En este post del foro Jamirotalk, los fans recopilaron una lista de direcciones en donde se van a poder bajar los temas en mp3 y el video del show en formato AVI. Realmente lo recomiendo porque tiene una excelente calidad.

Un abrazo!

JavaScript es un lenguaje orientado a objetos, pero no es muy fácil comprenderlo en este aspecto. A pesar de la sintaxis y el nombre, la forma en que JavaScript implementa objetos es bastante diferente al que conocemos de C++ o Java, esto suele llevar a la confusión. Mi intención es describir como es que se trabaja con OOP en JavaScript intentando no confundir al compararlo con otros lenguajes.

Creación de Objetos

En JavaScript, todas las variables hacen referencia a objetos, no existe nada en este lenguaje que no sea un objeto, lo son todos los tipos de datos e inclusive las funciones, que pueden contener propiedades y métodos.

Para crear un objeto desde cero basta con hacer:

miobjeto = new Object();

Lo que equivale a hacer:

miobjeto = {};

La primera forma de declarar un objeto les puede resultar familiar, la segunda hace uso de una característica propia del lenguaje para declarar estructuras de datos. Todos los tipos de datos pueden declararse de las dos maneras, por ejemplo, una cadena de texto se declara:micadena = new String();

Y de la forma declarativa:micadena = “”;

Un array se declara:miarray = new Array();

Ó también:miarray = [];

Esta forma de declarar objetos es muy útil en algunos casos y es la base del intercambio de mensajes mediante el estándar JSON.

Agregar miembros

Javascript es un lenguaje dinámico, esto posibilita la modificación de los objetos en tiempo de ejecución, esto quiere decir que a un objeto, luego de ser creado, se le pueden agregar o eliminar métodos y propiedades.

Para agregar miembros al objeto creado anteriormente solo basta con declararlo y asignarle algún valor.

miobjeto.variable = “hola”;

miobjeto.metodo = new Function();

Listo, ya disponemos de un objeto personalizado creado desde cero, de este modo se pueden agregar mas miembros de cualquier tipo a nuestro objeto. Sin embargo, crear objetos de esta manera no es muy cómodo, ya que si quisiéramos crear una copia de este objeto deberíamos declarar nuevamente todos sus miembros, debido a que este objeto no se puede instanciar.

Creando ‘Clases’ en JavaScript

La forma en que los lenguajes orientados a objetos comúnmente resuelven el problema anterior es mediante el uso de Clases, en JavaScript no es posible declarar Clases, pero si es posible instanciar objetos a partir de un constructor.

El objeto Function es utilizado como objeto instanciable en JavaScript, y el cuerpo de la función es el constructor del nuestros objetos. Una vez que tenemos un constructor, podemos llamarlo con el operador new.

/*clase de ejemplo*/

miClase = new Function();

nuevoObjeto = new miClase(); // instanciamos ‘miClase’

El método mas difundido para emular las clases en JavaScript es aprovechar el funcionamiento de la palabra clave this dentro de los constructores. Cuándo una función es llamada con el operador new, this hace referencia al objeto que será retornado. Veamos como funciona.

/*clase de ejemplo*/

miClase = function(){

/*

agregamos miembros dinamicamente

al objeto que será retornado

*/

this.propiedad = “hola!”;

this.metodo = function(){

/* aqui ‘this’ hace referencia al objeto al que pertenece el metodo */

alert(this.propiedad);

}

}

nuevoObjeto = new miClase(); // instanciamos ‘miClase’

Ahora, ‘nuevoObjeto’ va a referenciar al objeto que se retornó cuando se llamó a ‘miClase’ usando el operador new, por lo tanto, va a tener todas las propiedades y metodos que se crearon dentro del constructor.

El problema de esta forma de crear clases es que cada vez que la función ‘miClase’ es llamada, se crea una nueva función llamada ‘metodo’, de modo que cada objeto tiene su propia versión de ‘metodo’ cuando, en realidad, todos los objetos deberían compartir la misma función.

La propiedad ‘Prototype’

Todas las funciones tienen una propiedad llamada prototype, esta propiedad es un objeto que será utilizado como ‘modelo’ inicial de todos los objetos que sean creados con esta función cuando sea utilizada como constructor.

Inicialmente esta propiedad es un objeto vacío, pero debemos modificarla para aprovechar esta característica del lenguaje. Reescribiendo el ejemplo anterior el código quedaría así:

/* creamos un constructor limpio */

miClase = new Function();

miClase.prototype.propiedad = “hola!”;

miClase.prototype.metodo = function(){

/* aqui ‘this’ hace referencia al objeto al que pertenece el metodo */

alert(this.propiedad);

}

nuevoObjeto = new miClase(); // instanciamos ‘miClase’

Ahora todos los objetos creados a partir de ‘miClase’ compartirán inicialmente las mismas referencias en todas sus propiedades, esto significa que, todos los objetos van a compartir la misma versión de ‘metodo’.

Adicionalmente, al utilizar la propiedad prototype, obtenemos otra ventaja, podemos usar la palabra reservada instanceof. Vemos como se usa si escribimos:alert(nuevoObjeto instanceof miClase) // muestra ‘true’

El problema del uso de prototype, es que todas las propiedades hacen referencia a las mismas del prototipo, por lo que si modificamos estos objetos se van a modificar también en todos los objetos creados con esta clase. En siguiente ejemplo cambiamos nuestra propiedad a un array para poder modificarla sin cambiar nuestra referencia, de modo que podamos ver lo que explico con un ejemplo:

/* creamos un constructor limpio */

miClase = new Function();

miClase.prototype.propiedad = new Array(“hola”,“hello”);

miClase.prototype.metodo = function(){

/* aqui ‘this’ hace referencia al objeto al que pertenece el metodo */

alert(this.propiedad);

}

nuevoObjeto = new miClase(); // instanciamos ‘miClase’

otroObjeto = new miClase(); // instanciamos ‘miClase’

nuevoObjeto.propiedad.push(“olá”);

otroObjeto.metodo(); // muestra “hola”,”hello”,”olá”

Como pueden ver en el ejemplo anterior, ‘nuevoObjeto’ y ‘otroObjeto’ hacen referencia al mismo array, para solucionar este problema solo debemos asignar un objeto diferente a cada propiedad de nuestros objetos. El constructor es un buen lugar para realizar esta tarea:

miClase = function(){

this.propiedad = new Array(“hola”,“hello”); // reemplazamos el valor de nuestra propiedad con un nuevo objeto

};

miClase.prototype.propiedad = new Array(“hola”,“hello”);

miClase.prototype.metodo = function(){

/* aqui ‘this’ hace referencia al objeto al que pertenece el metodo */

alert(this.propiedad);

}

nuevoObjeto = new miClase(); // instanciamos ‘miClase’

otroObjeto = new miClase(); // instanciamos ‘miClase’

nuevoObjeto.propiedad.push(“olá”);

otroObjeto.metodo(); // muestra “hola”,”hello” :)

Listo, tenemos clase y tenemos objetos que funcionan bien. Espero que les haya resultado claro, en el próximo post voy a explicar el mecanismo de la herencia en JavaScript (si!!, se puede!!). Hasta entonces.

Yo no trabajé 7 años en esto todavía, pero hay cosas que se aprenden rápido:

  • ·         El departamento de informática de cualquier empresa siempre será uno de los peor considerados, ya que no genera beneficios sino sólo pérdidas. No esperes que te paguen las horas extra, así que no las hagas.
  • ·         Si te prometen darte días libres por quedarte un fin de semana nunca te darán un jueves y un viernes seguidos, sino dos martes. Si entiendes que este trato no te interesa, harías bien en no quedarte ese fin de semana antes de que llegaran esos martes.
  • ·         Nunca te dirán claramente que hagas horas extra.
  • ·         Si no haces horas extra, no pasará nada.

 

Solo algunas ideas sacadas de “Las siete lecciones que aprendí tras siete años de experiencia laboral”.

Yo resalté estas porque mi experiencia laboral me enseñó que, por hacer horas extras y preocuparme por problemas de otros fuera de mi horario laboral, no gané absolutamente nada. De hecho, perdí valiosas oportunidades de pasar ratos lindos con la gente que quiero.

Para tener en cuenta..

Cooperator Framework

Octubre 3, 2006

Hace un tiempo que vengo usando la versión del SVN de Cooperator Framework, mientras lo pruebo, voy ayudando al grupo de desarrollo comunicándole los bugs que encuentro y dando alguna que otra sugerencia. Creo que el estado actual del framework permite que los desarrolladores lo vayan probando y conociendo. El motivo de este post es hacerlo público y que la gente se entere de que se trata y para que sirve.

¿Que es?

Cooperator Framework es un conjunto de herramientas y librerías que agilizan el desarrollo de aplicaciones en Microsoft .Net Framework 2.0, distribuido bajo licencia Open Source.

La tarea principal que desempeña esta herramienta es el mapeo de objetos sobre una base de datos relacional, caracterizándose por la generación semiautomática de las clases a partir del modelo que obtiene accediendo a la Base de datos.

Este framework fue desarrollado con el objetivo de lograr un modelo 100% orientado a objetos, facilitándole el camino a quienes todavía están condicionados por el modelo relacional.

Para personalizar el código a generar, el Framework dispone de una herramienta llamada Cooperator Modeller, que permite seleccionar las clases que van a generarse y editar sus características, también, permite generar el código en el lenguaje que prefiera el programador, ya que se vale de Scripts de generación para realizar esta tarea. El modelo resultante puede ser guardado y editado posteriormente, ayudando al mantenimiento y crecimiento del sistema, y el código generado es extensible mediante el uso de clases parciales.

Una de las base de diseño del Framework que no utiliza Datasets ni Reflexion, y que las clases de persistencia y recuperación de objetos devuelven un tipo especifico y no un tipo genérico u ‘Object’. Estos objetos aprovechan las nuevas características de .Net Framework 2.0, como Generics, evitan el acoplamiento implementando Interfaces y se pueden enlazar a controles de formularios, tanto Windows como Web.

El código generado

Los grupos de clases generados por Cooperator son, a grandes rasgos, Rows, Gateways, Entitys y Mappers.

Las clases del grupo Rows son una por cada tabla de la base de datos y representan un registro de la misma. A cada una le corresponde una clase del tipo Rowset que representa un grupo de Rows. Ambas, Row y Rowset, son cargadas y guardadas en base de datos por su correspondiente Gateway, que ejecuta stores procedures en llamadas a sus métodos para realizar las tareas de mapeo.

Las clases del grupo Entitys heredan de Rows y las extienden con propiedades de los tipos generados por el Framework. Dependiendo de las relaciones de las tablas en la Base de Datos, estas van a ser un objeto o una colección de objetos, y van a representar una relación simple, o una agregación a la Entidad, esto es bastante importantes de entender e identificar, ya que los Mappers, objetos encargados de realizar las tareas de mapeo de Entitys, cambian su comportamiento con respecto a estas propiedades dependiendo de lo que representan conceptualmente.

Más allá del Mapeo

Además de las funciones de ORM, Cooperator posiblita trabajar con Units of Works e implementa herramientas de seguridad y de validación de datos.

Video de Runaway online

Septiembre 25, 2006

Esta mañana escuchaba en la 100.5 (radio de Cba) la presentación del nuevo tema de Jamiroquai, y al mismo tiempo pude ver en internet el video que ya estaba saliendo el viernes pasado en Londres :)

Que talco? :D

Pandora a full

Septiembre 22, 2006

Ya recomendé Pandora  antes,  y si había algo que me faltase para usar todo el tiempo este servicio, eso era Open Pandora.

Open Pandora es en programa que te permite usar Pandora sin necesidad de abrir el browser, ya que carga el plugin de reproducción dentro de su ventana. Además,  el programa ofrece varias comodidades como:

  • ·         Control total desde el Tray
  • ·         Integración con Msn y Last.fm
  • ·         Minimización al tray
  • ·         Soporte de las teclas multimedia del teclado

Winamp, lo siento, este programa me conoce mejor y me pone Sting de vez en cuando :)

 

P.D: hablando de música, se va al carajo el chino, eh?

High Times cover artwork

Septiembre 20, 2006

Uff… esperaba escribir algo sobre web development antes de volver a escribir sobre Jamiroquai, pero es que hay noticias excelentes :D

Ya esta confirmado el artwork del nuevo CD de grandes éxitos, disponible para verlo en el sitio oficial de la banda, donde además han revelado que el CD contendrá 16 tracks conocidos y 2 temas nuevos, ‘Runaway’ y ‘Radio’.

El CD repasará los diferentes estilos de la banda a lo largo de su carrera, Acid Jazz en temas como ‘Too Young To Die’ y ‘Emergency On Planet Earth’ , ‘Cosmic Girl’ y ‘Virtual Insanity’, Disco con ‘Little L’ y ‘Canned Heat’ hasta llegar a los temas de el ultimo álbum ‘Dynamite’.

Habrá también una edición especial que contendrá varios remixes , un DVD con todos los videos existentes y tracks extras reclamados por los fans, como ‘Stillness In Time’ y ‘Half The Man’.

Sin lugar a dudas, una excelente manera de terminar el contrato con Sony (valla a saber porque) y que seguramente no se puede pasar por alto.

Que opinan sobre el cover artwork?

Runaway por primera vez en radio

Septiembre 18, 2006

El nuevo single de Jamiroquai ya se esta escuchando en las radios londinenses, este track va a formar parte del nuevo álbum  de grandes éxitos llamado  “High Times: Singles 1992-2006” que tendrá una lista diferente de temas  en Japón, como es costumbre de Sony , y habrá también un DVD y un segundo CD de remixes, aunque esto ultimo son todavía rumores.

Ya circulan por Internet algunas fotos de la filmación del video del nuevo single y  el baterista de la banda, Derrick McKenzie, a escrito en su blog que están preparando  un tour de grandes éxitos para el 2007.

Como ven, muchas novedades de mi banda favorita ^_^.

Muchos programadores coincidimos en que Javascript es un lenguaje incomprendido. Sus características son poco conocidas y crean confusión en aquellos desarrolladores que pasan de lenguajes  no dinámicos, mismo así siendo de sintaxis parecida como Java o C++. A esto se le suma la diferencia en implementaciones de cada browser, los eventuales bug  en los mismos, etc.

Durante la semana encontré este post de un desarrollador que mostrando su descontento con las tecnologías que rodean el desarrollo de aplicaciones WEB 2.0 y las dificultades que implican utilizarlas. Yo, en una reacción típica de un abogado defensor de uno de los lenguajes que mas me gusta le respondí (debo decir que bastante fuerte) puntualizando en donde yo creo que se equivoca, y afortunadamente, fue para bien, y como resultado del mismo hoy podemos contar con una breve pero excelente guía de cómo configurar IE para  depurar JS con Visual Studio.

Felicitaciones! Estas es la forma de hacer WEB 2.0 :)

Uno de los problemas que encuentran los desarrolladores muy a menudo con javascript es la dificultad de escribir y aplicaciones que mantengan una buena performance durante su ejecución.

La importancia de buscar métodos para mejorar la performance del código escrito en JS a aumentado desde la aparición de mas aplicaciones y  desarrolladores que utilizan AJAX, y es uno de los reclamos mas frecuentes para el desarrollo de la nueva generación de browsers.

Claro que no todo depende del browser y de la implementación de JS que tengan, Peter Gurevich ha  escrito en este articulo del blog de IE7 algunas recomendaciones que deberían seguir los desarrolladores.

Algunas de las recomendaciones son bastante simples, como declarar las variables locales usando var o cachear variables con contenido HTML antes de insertarlas en el DOM, pero implican procesamiento del motor JS que es muy importante conocer.