Archivo Marzo, 2010

about Firefox

Las llamadas páginas ‘about:’ son aquellas que añaden funcionalidades extra al navegador. No son para nada un estandar y cada navegador hace con ellas lo que quiere.

Mozilla Firefox las utiliza ampliamente aunque para la mayoria de la gente pasan totalmente desapercibidas.

Son herramientas muy sencillas pero con utilidad. Incluso hay algun addons de Firefox que utilizan la nomenclatura ‘about:x’ para seguir esta filosofia.

about:plugins

Lista todos los plugins instalados, una breve descripción y si están activos o no.

about:cache

Muestra la memoria que está ocupando la caché y tienes tres sub secciones:

about:cache?device=memory

about:cache?device=disk

about:cache?device=offline

Entrando en cada una de ellas te muestra con detalle donde estan almacenados los archivos de caché, cuanto ocupan, la última modificación, cuando expiran etc.

about:sessionrestore

Incluso si te acabas de cargar la sesion anterior por equivocacion puedes volver a restaurarla durante la sesion actual. En caso de que la hayas descartado e iniciado una nueva, escribes este comando en la barra de direcciones y te ofrece la opcion de restaurar la sesion antigua selecionando las ventanas y pestañas a restaurar.

Cuando el navegador se cierra de manera inesperada y más tarde se vuelve a ejecutar, es esta página la que aparece como inicio por seguridad.

about:blank página en blanco

about:mozilla

Esto es lo que se llama un “huevo de pascua” una pequeña broma que meten desde mozilla y muestra lo siguiente:

Mammon se durmió. Y la bestia renació, propagándose por toda la Tierra, y sus seguidores fueron legión. Y proclamaron los nuevos tiempos y sacrificaron cosechas con fuego, con la astucia de los zorros. Y construyeron un nuevo mundo a su propia imagen como prometían las palabras sagradas, y la palabra
de la bestia y sus crías. Mammon se despertó, y súbitamente no era más que un rezagado.

de El Libro de Mozilla, 11:9
(10ª edición)

Esto es así en la version 3.6, para más versiones teneis el libro de mozilla o varias versiones en la wikipedia. Humor ante todo.

about:config

Para trabajar con la configuración como su nombre indica. Te advierte de que tengas cuidado.

about:robots

Otro “huevo de pascua” mezca de la cultura de ciencia ficción y chorradas en general que se ve que les gusta a los chicos de mozilla. Solo que este es especifico de firefox y no aparece en otro software de mozilla:

¡Bienvenidos humanos!

¡Venimos a visitaros en son de paz y con buena voluntad!

* Un robot no debe dañar a un ser humano o, por su inacción, dejar que un ser humano sufra daño.

* Los robots han visto cosas que vosotros no creeríais.

* Los robots son sus amigos de plástico con quien les gustará estar.

* Los robots tienen brillantes culos metálicos que no deben ser chupados.

…Y tienen un plan.

Otros navegadores tambien incorporan este sistema com el Chrome, Exporer, Konqueror y Opera como tambien lo hacen Flock, Epifany y SeaMonkey, este último al ser un fork de Firefox incorpora exactamente los mismos. Netescape ya incluia las paginas ‘about:’ en icluso tenia muchos más “huevos de pascua”.
En el caso de Safari las paginas about no existen, aunque no por ello deja de implementar funcionalidades extra de otro modo.

, ,

No hay Comentarios

Closures en JavaScript. Patrón Modulo

Si hace un tiemplo comentaba que en JavaScript el patrón singleton es implícito, voy a revisar otro patrón que sirve para modularizar nuestro código. Las clausuras de JavaScript o Closure es algo que tiene que conocer cualquiera que se dedique en profundidad a este lenguaje.

Closures
Una closure es en definitiva un objeto que es definido e instanciado en el momento de su declaración. Así hay que tener en cuenta que esta metodología cumple el patron modulo, al declarar el módulo, y el singleton, ya que no permite reinstanciaciones del mismo objeto porque se declara y se ejecuta.

var clos = (function(){

	var vprivada=999; // solo accesible desde esta closure

	function fprivada(param){
		vprivada=param;
	}

	var prop={};
	prop.funcion=function(){
		document.write("123456789");
	}
	prop.variable=119;

	return prop;

}());

Como la función es ejecutada al mismo tiempo que es declarada es necesario devolver el objeto que se genera dentro de ella. Si no asignamos la función a nada la closure es anónima, pero no deja de ejecutarse por ello.

Aumentar la closure
Para ampliar las propiedades de nuestro objeto podemos escribir otra closure y asignársela, el problema es que si lo hacemos sin más perdemos las propiedades anteriores, por eso debemos pasarle por parámetro todo el código anterior, es decir, la misma closure.

var clos=(function(prop2){

	prop2.funcion2=function(){
		document.write("999888777");
	}
	prop2.variable2=219;

	return prop2;
}(clos));

En caso de que no exista podemos crear una nueva closure al vuelo para evitar los errores de ejecución.

var clos=(function(prop){

	...

	return prop;
}( clos|| {} ));

De esta manera podemos distribuir nuestro código entre distintos archivos en caso de que fuese necesario. En una página donde tengamos implementadas pocas funcionalidades esto no es necesario, pero cuando va creciendo la cantidad de cosas que queremos hacer con JavaScript, modularizar el código de esta manera resulta bastante útil.

También es importante saber que podemos extender nuestra closure con otras para hacerla más rica. Así incorporando librerías de terceros (como jQuery) podemos personalizar el producto a nuestras necesidades. Esto podria considerarse un tipo de herencia implicita, para ver la herencia explicita aquí.

Ya he visto que en ciertos perfiles laborales se indica explícitamente el conocimiento de closures. Cuando estamos programando en paralelo con un compañero de trabajo y se dividen las funcionalidades a programar, debe de hacerse con aumentos de closures, que hace fácil unificar el código y también puede permitir acotar a la hora de buscar fallos.

, , , , , , ,

No hay Comentarios

000 Ipads

000 Ipads es el Trending del día (en Irlanda) en twitter. Por lo visto esta extraña cifra de cero iPads viene a cuenta de que a salido a la venta y está triunfando.

Desde mashable apuntan que son 90.000 y en el apartado de tecnología de la CNN dicen que son 120.000 vendidos el primer día de los cuales 50.000 en las primeras 2 horas.

Queda bastante claro que esta tableta pseudo-inutil causa estragos. Los fanboys de apple rondan por doquier y mantienen a su venerada empresa con las acciones bien altas.

Por lo visto los chicos de twitter tienen bastante en cuenta los singnos de puntuación a la hora de tomar los Trends. Cómo se suele puntuar en los números de más de 3 cifras (a veces con comas), los trends se han hecho un lio.

El algoritmo que hace hash a las palabras que aparecen en un twitt lo más probable es que lo realice de más de una palabra, ya que en ocasiones aparecen treads de incuso 4 conceptos, así no es raro pensar que realiza hash de todas las frases separadas por signos de puntuación, motivo por el que aparece este “fallo” en los temas de irlanda.

No es de extrañar que con toda esta plataforma detrás de un servicio, aunque parezca tan sencillo, tiene un volumen de mensajes que supera los 40 millones diarios. Es normal que procesando, almacenando y buscando entre toda esta inmensa maraña de mensajes de 140 caracteres Twitter tenga cada vez más caídas de servicio, aunque aun no son muchas, ya se dejan notar.

, , , ,

No hay Comentarios

Patrón Singleton implícito en JavaScript

Uno de los tantos patrones arquitectónicos en ingeniería del software es el llamado Singleton. No voy a explicar el patrón singleton por completo, simplemente decír que como idea principal se define una clase de la que solo existirá una instancia.

Por lo tanto en una clase qu cumpla con el singleton se define el método getInstancia() que solo se ocupa de devolver la única instancia existente. Así que el constructor no se ejecuta siempre, solamente invoca cuando no existe ninguna instancia. Cuando si la hay se devuelve la referencia a ella. Así de sencillo.

Y esto se implementa así en cualquier lenguaje orientado a objetos. De hecho incluso en JavaScript se puede implementar una clase con estas caracteristicas, el unico problema es que en JavaScript no hay métodos privados y siempre podría hacer un new miClase() y me devolveria una instancia nueva.

Pues bien, hay una caracteristica en JavaScript que me hace pensar que esto se puede hacer sin ningun problema, solo por las caracteristicas del propio lenguaje, ya que una funcion es una funcion y una variable también puede serlo etc. y jugando con esto podemos definir una clase que compla el partrón implicitamente y otra que no.

Definir el objeto

Objeto que no cumple el patrón singleton:

function objetoNoSingleton(){
   this.cadena = "cadena de texto";
   this.metodo = function(){
      alert(cadena);
   }
}

Objeto que cumple el patrón singleton:

var objetoSingleton = {
   cadena : "cadena de texto",
   metodo : function() {
      alert(cadena);
   }
}

Este objeto singleton es una variable y un objeto, pero es un objeto de clase irreproducible, de hecho al ejecutar new objetoSingleton() la instrucción falla.

Añadiendo funcionalidades

Existen diferencias de sintaxis debido al lenguaje. De hecho si queremos utilizar la propiedad prototype (no la libreria) para añadir métodos o variables a los objetos también existen diferencias.
Objeto que no cumple el patrón singleton:

objetoNoSingleton.prototype.valor2 = "valor dos";
objetoNoSingleton.prototype.metodo2 = function(){
   alert(valor2);
}

Para ser ejecutado necesitamos una instancia ya que estamos añadiendo funcionalidades a una clase no a un objeto en particular:

var instanciaNoSingleton = new objetoNoSingleton();
instanciaNoSingleton.metodo2();

Objeto que cumple el patrón singleton no hay que usar prototype. Crear un nuevo elemento en el objeto es simplemente nombrarlo y asignarle valor porque ya es una instancia.

objetoSingleton.valor2 = "valor dos";
objetoSingleton.metodo2 = function(){
   alert(valor2);
}

objetoSingleton.metodo2();

Con un objeto único se elimina el método getInstancia() típico del patrón Singleton, pero en si también desaparece la función new, por lo que en realidad el objeto a usar va a ser siempre la misma instancia.

, , ,

1 Comentario