Este post describe como cerrar la ventana del navegador, que contiene una aplicación Flex, aunque es cierto que antes de hacer esto, deberías meditar si realmente esta acción tiene sentido… ¿es apropiado que una aplicación Web, tenga la potestad de cerrarte el navegador?

Si aún así deseas cerrar el navegador, desde tu aplicación Flex, este es un sencillo código que te lo permite… siempre y cuando estés usando IE.

var urlExitApp    : String = “javascript:window.opener = self; self.close();”;
var request     : URLRequest = new URLRequest( urlExitApp );
navigateToURL( request, “_self” );

El problema, es que por seguridad tanto Firefox, como Chrome no permiten cerrar ventanas desde javascript. Por ejemplo firefox, tiene una propiedad por defecto, llamada  dom.allow_scripts_to_close_windows, a false. Si queremos que el anterior código funcione para firefox, deberemos introducir en la barra de nuestro navegador, about:config, y buscar dicha variable y modificarla a true.

La clase Dictionary en Flex, permite crear de manera dinámica colecciones de claves-valores.

A menudo nos es de utilidad recorrer dichas colecciones. Tenemos dos maneras principalmente, la primera recorrerá las claves del diccionario, la segunda utilizando el for each, nos devolverá los objetos asociados a cada clave.

for (var key : Object in dictionary) {
// Recorre las claves almacenadas en el diccionario
}

for each (var value : Object in dictionary) {
// Recorre los valores almacenados por cada entrada del diccionario
}

 

Llevo un tiempo peleándome con un problema de rendimiento, en una aplicación Flex y quería comentar mi experiencias con quien esté interesado.

El caso es que, pasado un tiempo realizando ciertas operaciones que involucraban la creación y eliminación de hijos(instancias de objetos), la aplicación se ralentizaba de manera notoria. Utilizando el profile del Eclipse, descubrí que habia ciertas instancias que no se estaban eliminando de memoria, aunque en código eran eliminadas, así que me puse a investigar sobre el tema.

Al parecer el recolector de basura(GC) de Flex, sólo elimina los objetos de memoria cuando no existen referencias fuertes sobre el objeto. ¿Y a que se refieren con referencias fuertes? Pues, a listener no eliminados, watchers, e incluso a bindings. Es decir que si realizamos un removeChildren, de objetos que dentro de su lógica tengan algún binding asociado, estos no se borrarán de la memoria…

Bueno, para los que quieran saber más sobre este tema, os dejo un par de enlaces,
http://blogagic.com/163/flex-memory-management-and-memory-leaks
http://www.cubicleman.com/2008/06/11/bindingutilsbindproperty-use-a…

Pero vamos, en resumen, el primer artículo, nos viene a decir que tengamos especial cuidado con el uso de referencias y nos sugiere unas buenas prácticas para evitar estos posibles fallos.

  1. Asegurarnos de eliminar los eventListeners, o por lo menos habilitar el valor de weakReference a true a la hora de crearlos
  2. Con los BindingUtils.bindProperty, para versiones anteriores a flex 4.5 no existe la opción de weakReference, así que tendremos que asegurarnos de eliminar esos bindings cuando no los utilicemos. (con algo así)
  3. Por último nos sugiere el primer artículo, crear una interface para nuestros componentes que nos obligue a implementar un método que se ocupe de solucionar estos temas, para que cada componente individualmente se ocupe de no dejar basura sin recoger y abstraiga al resto.

Bueno, espero que alguno le sirva de algo esta parrafada ;) y si alguien tiene algo que aportar o corregirme bienvenido sea.

Bueno habitualmente, no hablo de este tipo de cosas, pero voy a hacer un breve resumen de como obtener el borrador de la renta del año 2010. Es muy sencillo.

  1. Ir a la página www.aeat.es
  2. Hacemos clic sobre la siguiente imágen
  3. Aparecerá un pequeño formulario a rellenar, NIF, apellido y una casilla de la renta del año pasado. (la 698 concretamente)
  4. Posteriormente nos pide un número de teléfono, al que se enviará el número de referencia.
  5. A los pocos minutos (no es inmediato), obtendremos el número de referencia de nuestro borrador
  6. Hay un enlace directo para consultar el borrador, una vez tenemos el número, pero a mi no me funcionó, me salió un error de JavaScript.  Use IE( ya que hay páginas de la administración que sólo funciona para el mismo), posiblemente fue mi castigo por tan mala decisión, desconozco si en Firefox pasa lo mismo.
  7. Si os falla como a mi el enlace, volvemos a la página principal, a la sección Renta 2010 y entramos en el apartado de Borrador de la declaración,  hacemos clic en consultar borrador, seleccionamos el ejercicio 2010 y por último en el formulario que nos aparece volvemos a introducir nuestros datos, y ahora en lugar de rellenar el valor de nuestra casilla, introducimos en la casilla de Referencia, el número que nos llegó al móvil.
  8. De esta manera accedemos al borrador de nuesta declaración.

Espero haber sido de ayuda, un saludo!

A continuación, publico dos ejemplos de APIS, que nos permiten añadir de manera sencilla, mapas dinámicas en aplicaciones Flex.

El primer mapa, está desarrollado con la API de Google, y muestra un sencillo ejemplo en el que al hacer clic, sobre el mapa obtenemos las coordenadas del punto sobre el que hemos hecho clic.

Mapa Flex - API de Google Maps para Flash

 

Mapa Flex 2 - API de Google Maps para Flash

 

Para más información:

http://code.google.com/intl/es/apis/maps/documentation/flash/tutorial-flex.html

En segundo caso, he utilizado la AGS Flex API, basada en el OpenStreetMap con mapas de ArcGIS, del que ya hablé hace un tiempo,

Mapa Flex - API AGS

Otros ejemplos más elaborados,

http://help.arcgis.com/en/webapps/flexviewer/

http://help.arcgis.com/en/webapps/flexviewer/live/index.html?config=config-edit.xml

 

 

Queremos crear una clase singleton en Action Script para un proyecto Flex, es decir, garantizar que una clase sólo tenga una instancia y proporcionar un punto de acceso global a ella.

Solución:

Creamos una instancia de la clase, que será de acceso público. Implementamos un geter para la instancia, que llame al constructor sólo si no existe todavía la instancia. Para el constructor de la clase usamos una clase privada, para simular los constructores protegidos o privados de otros lenguajes. De esta manera nos aseguramos, que no se instancie la clase desde fuera de la misma.

package {
public class Singleton     {
private static var _instance: Singleton;
public function Singleton ( pc : PrivateClass )
{
//lo que sea…
}
public static function get instance():TranslatedValue
{
if ( _instance == null )
_instance = new Singleton ( new PrivateClass() );
return _instance;
}
}

class PrivateClass{ }

Referencias:

http://es.wikipedia.org/wiki/Singleton

http://cookbooks.adobe.com/post_Singleton_Pattern-262.html

A continuación dejo un sotware muy útil, para redimensionar imágenes y otras tares útiles que enumero brevemente:

  • Redimensión
  • Renombrado(Pudiendo usar distintas máscaras de datos)
  • Cambio de formato
  • Añadir marcas de agua
  • Efectos (sepia, grises, invertir colores…)
  • Enviar por mail, comprimir, pasar a pdf…

Todo esto de una sola vez, para múltiples imágenes. Es muy sencillo y fácil de usar así que no me centraré en su manejo. Os dejo la url de descarga [ aquí ] y para más información [ aquí ]

Navegando un poco, me he encontrado con que el sábado 18 de septiembre se celebrará el Día de la Libertad del Software 2010. En está página http://softwarefreedomday.org/map/index.php?year=2010 puedes ver los distintos eventos que se celebrarán en las distintas partes del globo.

Y es en esta página donde he encontrado algo que me ha sorprendido, el mapa de los eventos no estaba hecha con la omnipotente API de google maps, sino que usaba OpenStreetMap, un editor libre del mapa de todo el mundo. A continuación cito, algunos aspecto de la información que he encontrado en su página de referencia en castellano ( http://wiki.openstreetmap.org/wiki/ES:Main_Page)

OpenStreetMap es (o debería ser) un mapa libre y actualizable de todo el mundo que en la actualidad su comunidad de usuarios está creando desinteresadamente.

OpenStreetMap te permite ver, editar y usar información geográfica de forma colaborativa de cualquier parte del mundo. Para ello existen tres herramientas principales:(Acerca de)

  • Visor. Te permite, a través de tu navegador, localizar, por ejemplo lugares.
  • Editor online. A través de un applet Java y sin necesitar mas que de un navegador web es posible introducir nuevos datos como calles, puntos de interés, zonas, etc. o etiquetar los ya existentes – en un futuro existirá una gran variedad de etiquetas de metadatos disponibles. Puedes subir al servidor tracks o rutas previamente capturadas por tu GPS y a partir de esos nodos crear los viales. Así mismo puedes descargarte a tu ordenador los tracks que hayas subido. Para editar un mapa o subir tracks has de validarte como usuario previamente para que el servidor puede llevar un registro de las modificaciones del mapa.
  • Editores offline. Son programas que puedes instalar en tu ordenador que poseen herramientas para facilitar la tarea de digitalización y etiquetado de nueva información, permitiendo bajarte la cartografía ya existente en el servidor y subir la actualizada o creada por ti. Aunque hay varios estos son los más conocidos:
  1. Home editor. Está dirigido a los usuarios más avanzados que quieren una mayor flexibilidad y prefieren dedicarse a la edición de datos.
  2. JOSM. Uno de los más usados por la comunidad de OpenStreetMap. Requiere Java 1.5.

En resumen, OpenStreetMap es un mapa libremente editable de todo el mundo. Está hecho por personas como usted.

OpenStreetMap te permite ver, editar y usar información geográfica de manera colaborativa desde cualquier lugar del mundo.

Una nueva herramienta, sobre la que investigar y darle uso. Me ha parecido entre otra cosas curioso, el mapa de vías ciclistas que aparece al hacer clic en el botón +, de la parte superior derecha y destacar la importancia de que no hay una marca que se ocupe de actualizar esto, es la comunidad la que mantiene el proyecto y con las colaboraciones de todos se van creando los mapas de interés. Algo a tener en cuenta…

Imagen Open Street Map

Imagen Open Street Map

Buscando información sobre los patrones de diseño, me he encontrado de bruces con los patrones de anti-diseño “patrones de diseño que invariablemente conduce a una mala solución para un problema.”

No sabía de su existencia pero después de leer esta entrada de wikipedia, me produce una reflexión, quién no ha sufrido en sus carnes ya sea en la universidad, o en el trabajo, con muchos de estos antipatrones, incluso quién puede decir que está libre de pecado, y no ha realizado algunos de estos atajos-chapuzas-comportamientos…

Algunos ejemplos:

Te lo dije (I told you so): Permitir que la atención se centre en que la desoída advertencia de un experto se ha demostrado justificada

Punto de vista ambiguo (ambiguous viewpoint): Presentar un modelo sin concretar ciertos aspectos, postergando así decisiones conflictivas.

Confianza ciega (blind faith): Descuidar la comprobación de los resultados que produce una subrutina, o bien de la efectividad de un parche o solución a un problema.

Lava seca (lava flow): Código muerto e información de diseño olvidada permanecen congelados en un diseño cambiante. Esto es análogo a un flujo de lava en el que se van endureciendo pedazos de roca. La solución incluye un proceso de gestión de la configuración que elimina el código muerto y permite evolucionar o rehacer el diseño para acrecentar la calidad.

Todo aquél que se informe sobre los antipatrones, debería hacer una reflexión sobre los mismo, e intentar no caer en estos malos hábitos.

Escribo este post, después de estar varios días pegándome, intentando que una aplicación flex reconociera el idioma de mi navegador.

En el 90% de las páginas, recomiendan hacerlo de manera rápida y sencilla usando javascript, utilizando las siguientes propiedades del objeto navigator:

navigator.browserLanguage;(IE)

navigator.language (Mozilla)

Mi sorpresa fue que en el IE8 en que probaba, cuando cambiaba el idioma(Herramientas->Opciones de Internet ->Idioma), siempre me devolvía los mismos valores “es”, … Desesperado por el error, y por no encontrar información sobre sucesos parecidos en la red, decidí buscar alternativas.

Investigando, descubrí que en el navegador al realizar una petición http, existía una cabecera que tenía la información que buscaba, “Accept-Language”. (No sólo te da el valor del idioma por defecto, sino el listado de idiomas por orden de preferencia, por lo que si no tienes un idioma para la aplicación en concreto, puedes seguir buscando en la lista de idiomas del usuario). Así que busqué, de que manera podía recuperar ese valor.

En Javascript, existe el objeto XMLHttpRequest , que  es una interfaz empleada para realizar peticiones HTTP y HTTPS a servidores Web. Como la cabecera que me interesaba, iba en la Request y no en el Response, no la podía obtener de manera directa. Por este motivo, utilizamos un servlet, que recibiría mi petición http, recogería mi cabecera Accept-Language, y me la insertará en el response del XMLHttpRequest, que posteriormente recogería en Javascript, para enviarlo a mi aplicación Flex.

Javascript:

var xhr = new XMLHttpRequest();

xhr.open(“POST”, urlServlet, false);
/*

Internet Explorer caches the results of HTTP GET requests in the Temporary Internet Files (TIF) folder. In most cases, caching improves performance for data that will not change frequently. To guarantee that the results are not cached, use POST.(Fuente. http://msdn.microsoft.com/en-us/library/ms536648%28VS.85%29.aspx)

*/

xhr.onreadystatechange = updatePage; // Lanzala funcion si el estado cambia
xhr.send(null);

function updatePage() {

language = xhr.getResponseHeader(“Accept-Language”);

}

Java Servlet:

String clientLanguage = request.getHeader(“Accept-Language”);
request.setHeader(“Accept-Language”, clientLanguage);

Flex:

Desde Flex, simplemente invocaremos la función Javascript, al iniciar la aplicación usando ExternalInterface.call(‘getLanguage’); // Siendo getLanguage la función JS

Espero que os sirva de ayuda y si alguien sabe a que se debe que la propiedad navigator, no detecte el cambio de idioma  en IE-7-8 que no dude en comentármelo.

Un saludo


Seguir

Get every new post delivered to your Inbox.