lunes, 30 de enero de 2012

Evaluación corta de Patrones de Diseño GoF


He estado dando un curso de patrones de diseño en la empresa en la que laboro como parte del programa de capacitación interna. Quiero dejar a disposición del público una prueba corta de 15 preguntas (en inglés) de selección única, para todo aquel que quiera evaluar que tanto conoce de los patrones clásicos de GoF.

martes, 24 de enero de 2012

Función JavaScript para leer valores del Query String


Normalmente es muy sencillo leer los parámetros y valores del Query String con un lenguage de servidor. Digase por ejemplo en PHP "$_GET['param']". Pero hace poco necesitaba hacer esto mismo pero del lado de JavaScript. Me encontré esta función que hace el trabajo:

function getUrlVars()
{
var vars = [], hash;
var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
for(var i = 0; i < hashes.length; i++) {
hash = hashes[i].split('=');
vars.push(hash[0]);
vars[hash[0]] = hash[1];
}
return vars;
}

He aquí un ejemplo sencillo que lee el parámetro "error" para determinar si hay que deplegar un mensaje de error en la pantalla de autenticación.


var error = getUrlVars()["error"];

if (error == "1") {
$("#error_message1").show();
} else if(error == "2") {
$("#error_message2").show();
}

lunes, 16 de enero de 2012

Cerrando una ventana en Firefox con JavaScript

Un compañero estaba teniendo problemas con un requerimiento que pidió el cliente que consistía simplemente en agregar un link que cerrara la ventana cuando se seleccionaba.

Una simple línea en JavaScript: "window.close();" pensabamos que era suficiente para hacer el trabajo, pero resulta que Firefox no permite esta operación porque lo percibe como una llamada poco segura. Algo que no debería permitirsele al navegador por defecto (similar a la capacidad de un script de leer archivos del cliente).

Googleando por un rato descubrí que hay una manera de habilitar estas llamadas poco seguras usando esta línea: "netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserWrite");".

Así que hice mi código de ejemplo que hiciera una excepción para FF:

<html>
<head>
<script language="Javascript">
function closeWindow() {
if (navigator.userAgent.indexOf("Firefox")!=-1){
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserWrite");
alert("This will close the window");
window.open('','_self');
window.close();
} else {
this.focus();self.opener = this;self.close();
}
}
</script>
</head>
<body>
<a href="javascript:closeWindow();">Close Window</a>
</body>
</html>


Cuando abrí la página localmente e intenté cerrarla con el enlace que me conecta a la función JavaScript, me apareció el siguiente mensaje de confirmación:


Si le doy permitir, efectivamente la ventana se cierra. El problema está cuando uno coloca el script en un servidor web porque FF ni siquiera muestra este mensaje sino que de una niega el acceso. Esto se puede ver en la consola de errores:



Pareciera que existe todo un proceso en Mozilla para certificar scripts que intentan hacer este tipo de llamadas para obtener privilegios del navegador. Si los scripts no están certificados, FF interpreta el sitio como no seguro para hacer este tipo de llamadas.

La conclusión en mi caso particular, es que parace demasiado trabajo para agregar una opción que en sí no parece tan natural para una aplicación web. Lo mejor es dejarlo habilitado solamente para los navegadores que lo soportan.

jueves, 12 de enero de 2012

Herramientas: ArgoUML

Otra opción para crear diagramas UML: ArgoUML.

No lo he explorado mucho, pero parece que la interface fue creada con Java Swing lo cual en particular me produce una sensación de lento que arrastro de las primeras veces que trabajaba con Swing.

En todo caso puede ser una mejor alternativa a StarUML debido a que este no ha sido actualizado en mucho tiempo y tiene problemas para generar código e ingeniería inversa, con versiones de Java más arriba de 1.4.