JSProxy: javascript desde actionscript

Una forma sencilla de gestionar todo el javascript que podamos necesitar en una aplicación flash/flex utilizando exclusivamente actionscript.
Un ejemplo (con Flash):

Actionscript:
  1. import com.joangarnet.js.JavaScript;
  2. import flash.events.Event;
  3.  
  4. var flashAppId:String = 'JSProxyFlash';// movie id in the html host
  5. test1();
  6. test2();
  7. function test1():void{
  8.     // some javascript to inject in the DOM
  9.     var js1:XML =
  10.     <script type="text/javascript">
  11.         <![CDATA[
  12.             function sayHello(){
  13.                 alert( "hello" );
  14.             }
  15.             Utils = {
  16.                 getURL:function(){
  17.                     return window.location.href.toString();
  18.                 }
  19.             }
  20.             var z = 10;
  21.             var a = {
  22.                 b:{
  23.                     c:{
  24.                         prop1:"hola 1",
  25.                         prop2:"--"
  26.                     }
  27.                 }
  28.             };
  29.         ]]>
  30.     </script>;
  31.     var javascript1:JavaScript = new JavaScript(flashAppId);
  32.     javascript1.addEventListener(Event.COMPLETE,javascript1Complete);
  33.     javascript1.js = js1.toString();
  34. }
  35. // the javascript is ready to use from now on
  36. function javascript1Complete(event:Event):void{
  37.     var javascript1:JavaScript = event.target as JavaScript;
  38.     trace( javascript1.getScope("Utils").getURL() );
  39.     javascript1.getScope(JavaScript.WINDOW).sayHello();
  40.     trace( javascript1.getScope(JavaScript.WINDOW).z );
  41.     trace( javascript1.getScope("a.b.c").prop1 );
  42.     javascript1.getScope("a.b.c").prop2 = "hola 2";
  43.     trace( javascript1.getScope("a.b.c").prop2 );
  44. }
  45. // let's try to load an external library
  46. function test2():void{
  47.     var javascript2:JavaScript = new JavaScript
  48.     (
  49.         flashAppId,
  50.         "http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"
  51.     );
  52.     javascript2.addEventListener(Event.COMPLETE,javascript2Complete);
  53. }
  54. // the library is loaded and ready to be used
  55. function javascript2Complete(event:Event):void{
  56.     var javascript2:JavaScript = event.target as JavaScript;
  57.     trace( javascript2.getScope("jQuery.browser").version );
  58. }

Se puede ver se puede trabajar de dos formas: inyectar javascript o cargar archivos .js externos en tiempo de ejecución.
Una vez se han inyectado/pedido dichos scripts y el javascript engine del navegador los ha interpretado disponemos de un callback que nos avisa de que ya podemos trabajar con ellos.

Firefox 3

Download DayPor si no te has enterado ya el día 17 se intentará batir un récord absurdo de "el software con más descargas durante 24 horas" con la salida de Firefox 3. Hay una página con la geolocalización de los inscritos y un formulario por si quieres inscribirte.
Menuda chorrada... pero yo me he inscrito y lo descargaré de todos modos!! :p

Cambio de servidor

Estos últimos días he tenido problemas serios con mi servidor, concretamente ha petado… he tenido que mover a todos mis clientes, incluído yo mismo, y toda su información a otro proveedor.
Parece que todo ha vuelto a la normalidad y que este blog está intacto después de la migración, pero si alguien ve alguna cosa rara agradecería que me lo notificara.
Gracias!

Talleres Verano SBF[08]

Ya estamos otra vez con el verano llamando a la puerta, en apenas un mes estaremos disfrutando de unas merecidas vacaciones. O como mínimo estaremos compartiendo buenos momentos con la gente que las esté disfrutando... la cuestión es que de algún modo el buen ambiente se contagia y el calor pasa a segundo plano...
Con el verano llegan las cosas típicamente veraniegas como los bañadores, las cremas protectoras, las noches largas y, como no, los talleres de verano subflash!

Este año se celebra la sexta edición de este familiar y entrañable festival del desarrollo Flash (realmente del desarrollo web en general).
En estas seis ediciones han pasado una gran cantidad de personajes de distintas partes de la geografía peninsular y algunos incluso de mucho más lejos... todos ellos con sus peculiaridades, sus personalidades y sus historias...

Y es que lo bueno de este evento es que, además de aprender acerca de las últimas tecnologías de boca de las personas que deciden la dirección que toman las mismas conoces a gente con inquietudes y sensibilidades muy afines a las tuyas.
En el fondo a la mayoría, por no decir todos los que asistimos, lo que nos mueve es la pasión por el desarrollo, así que tener la oportunidad de pasar tres días en un ambiente 100% enfocado a ello (y a todo lo que le envuelve) es como poco un gran placer :)

Seis años dan para mucho... la gente ha ido rotando. Unos vienen, otros se van, otros vuelven y así sucesivamente. El resultado final es una familia que cada año es mayor. Las conexiones cada vez son más numerosas y también lo son las posibilidades de colaboración. Este evento es una oportunidad para el disfrute, pero sin duda también para el negocio. Para nosotros ambas cosas son compatibles. Pero que suerte tenemos!

Para los que quieran ver un pedazo de lo que se vive en estos tres días aquí dejo un PEDAZO de montaje que Toni y Astrid tuvieron el gran detalle de regalarnos a todos los que asistimos en la edición del 2005 ( qué melancolía... ):
http://www.subflash.com/talleres/2005/video/videoTalleres.html

Por cierto, este año nos vemos! ya hablaré más adelante en otro post de la ponencia/taller que voy a dar: "Del 2 al 3 en 45".

Aquí dejo algunos enlaces de interés:

* Foro talleres verano 2008
* Microsite talleres 2008

Nueva cara

Por fin he decidido darle un cambio a la cara del blog. Desde que empecé este blog a finales del 2004 he mantenido el mismo estilo en dos sistemas de blog distintos.
Ahora continúo con Wordpress pero he actualizado a la última versión y he aprovechado para modificar el tema.
Todavía no he acabado las mudanzas... espero tenerlo todo listo para la semana que viene. Por el momento si alguien ve alguna cosa rara que me avise por favor.
Gracias!

Utilizando namespaces

¿Qué es?

Un namespace (espacio de nombres) es un contenedor abstracto que nos permite controlar la visibilidad de propiedades y métodos. Es algo parecido al concepto de package.
Por defecto disponemos de cuatro namespaces: private, protected, public e internal. Estos espacios de nombre tiene un comportamiento especial que permite restringir el acceso a miembros teniendo en cuenta una serie de reglas con respecto a la herencia o al package al que pertenecen.
Aparte de éstos cuatro nosotros podemos definir nuestros propios namespaces.

Un ejemplo

Definimos un namespace:

Actionscript:
  1. package com.joangarnet.namespaces{
  2.    public namespace jg_internal = "http://www.joangarnet.com/namespaces/jg_internal";
  3. }

Aplicamos el namespace a un miembro de una clase:

Actionscript:
  1. package com.joangarnet.controls{
  2.    public class Window{
  3.       import com.joangarnet.namespaces.jg_internal;
  4.       private var propiedad:String = "No soy accesible";
  5.       jg_internal var propiedad:String = "Si soy accesible";
  6.    }
  7. }

Vemos que tenemos dos propiedades "propiedad" con el mismo identificador, lo cual puede parecer erróneo. Lo que sucede al compilar es que al tener visibilidades diferentes, estan en espacios de nombres diferentes, los identificadores no colisionan.
Yo personalmente he utilizado raramente esta característica del lenguaje, pero se me ocurren algunas [pseudo]situaciones interesantes dónde puede ser útil:

Miembros pseudo privados

Hace un par de posts me quejaba del hecho que, en algún caso puntual algunas clases del SDK de Flex lo ponían dificil a la hora de proporcionar extendibilidad. La causa de ésto era la definición de miembros privados en algunas clases que entorpecían y, alguna vez incluso imposibilitaban el poder extenderlas. En un par de ocasiones he tenido que recurrir a una técnica llamada monkey patching para poder extender una clase determinada.
Una posible forma de eviar esto pasaría por definir un espacio de nombres semánticamente parecido a private (¿os suena mx_internal?) que nos permitiera extender los miembros de la clase de forma responsable, siendo conscientes de que estamos utilizando un namespace especial y que tenemos que andar con especial ojo en lo que hacemos.

Pseudo sobrecarga de métodos

El hecho que podamos definir un mismo método en diferentes espacios de nombres dentro de una misma clase nos hace recordar a la sobrecarga de métodos disponible en otros lenguajes como Java. Se puede obtener una funcionalidad parecida utilizando namespaces:

Actionscript:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="inicio()">
  3.     <mx:Script>
  4.         <![CDATA[
  5.             namespace air;
  6.             namespace flex;
  7.             private var runtime:Namespace;
  8.             private function inicio():void{
  9.                 if( Capabilities.playerType == "Desktop" ) {
  10.                     runtime = air;
  11.                 }else{
  12.                     runtime = flex
  13.                 }
  14.                 runtime::guardar();
  15.             }
  16.  
  17.             air function guardar():void {
  18.                 trace( "Guardar en filesystem" )
  19.             }
  20.  
  21.             flex function guardar():void {
  22.                 trace( "Guardar en el server" )
  23.             }
  24.         ]]>
  25.     </mx:Script>
  26. </mx:Application>

Esto ejecutado en un navegador y ejecutado en una aplicación AIR muestra dos resultados diferentes.

Ejecución pseudo condicional

La compilación condicional disponible en Flex Builder es una funcionalidad muy útil (de la que hablaré en un futuro post en madeinflex) que permite definir bloques que se ejecutan dependiendo si se ha asignado un valor determinado desde los parámetros de compilación. Esto permite por ejemplo tener rutinas de debug que solo se compilan durante el desarrollo y que en el momento de salir a producción con un simple cambio en un valor desaparecen por completo.
Con namespaces y siguiendo exactamente el mismo sistema que en el ejemplo anterior podemos hacer algo parecido como se ve en el siguiente ejemplo:

XML:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="inicio()">
  3.     <mx:Script>
  4.         <![CDATA[
  5.             namespace desarrollo;
  6.             namespace produccion;
  7.  
  8.             public static var entorno:Namespace;
  9.  
  10.             private function inicio():void{
  11.                 entorno = produccion;
  12.                 entorno::guardar();
  13.             }
  14.  
  15.             desarrollo function guardar():void {
  16.                 trace( "Estoy en desarrollo" )
  17.             }
  18.  
  19.             produccion function guardar():void {
  20.                 trace( "Estoy en producción" )
  21.             }
  22.         ]]>
  23.     </mx:Script>
  24. </mx:Application>

Enlaces relacionados

* namespace
* Namespace

Flash Player 10 Astro

Esta major release del flash player no es comparable a la 9 porque no lleva una nueva máquina virtual, pero la verdad es que si hay un segundo puesto éste es para Flash Player 10 codename Astro! Además esta release lleva claramente la firma de la comunidad por la influencia que ésta ha tenido en la dirección que algunas de las novedades han tomado!

No voy a explicar mis experiencias porque me acabo de enterar y no he experimentado nada pero las nuevas funcionalidades hablan por si solas.. las pongo por órden de interés según mi criterio.

Dynamic Sound Generation

Posibilidad de generar sonido dinámicamente a través de nuevas APIs de la clase Sound.
(sacado de kaourantin.net)

Actionscript:
  1. var sound:Sound = new Sound();
  2. function sineWavGenerator(event:SamplesCallbackEvent):void {
  3.     for ( var c:int=0; c<1234; c++ ) {
  4.         var sample:Number = Math.sin((Number(c+event.position)/Math.PI/2))*0.25;
  5.         sound.samplesCallbackData.writeFloat(sample);
  6.         sound.samplesCallbackData.writeFloat(sample);
  7.     }
  8. }
  9. sound.addEventListener("samplesCallback",sineWavGenerator);
  10. sound.play();

New Text Engine + Text Layout Components

Acceso de bajo nivel a un nuevo motor de renderizado de texto que permite crear componentes de texto totalmente personalizados. Junto con el motor se han proporcionado algunos componentes AS3 que hacen uso de él.

File Reference runtime access

Posibilidad de cargar y guardar archivos del sistema de archivos del usuario en el Flash Player (sin necesidad de AIR). No he leído acerca de esto pero seguro deben haber implicaciones en cuanto a politicas de seguridad...

Más...

Hay más cosas que se pueden consultar en las release notes, como por ejemplo un nuevo tipo llamado Vector que es parecido a Array pero en el que todos los elementos deben ser del mismo tipo, los efectos 3D nativos que permiten de forma sencilla añadir, animar o transformar elementos 2D en un mundo pseudo 3D....

Una release realmente interesante!

Nuevo Flex!

Fascinante!!!! esta vez se han pasado cuatro calles!!!!!
Ahora puedes construir tu propio Flex a medida! Puedes hacerlo a través de un configurador muy visual hecho con.... Flex!
Además esta vez tenemos una web especialmente creada para Flex!
Corre, serás uno de los primeros en verlo ;)
* Nuevo Flex

[ via faratasystems.com ]

¿Métodos privados?

Me he encontrado con que el componente mx.controls.ProgressBar del SDK de Flex 3 tiene un bug. El bug se da en el método updateDisplayList(), que en un momento dado intenta acceder a una propiedad que es nula. El típico Cannot access a property or method of a null object reference ....

Llegado a este punto me he dicho:
- vale, no pasa nada. Creo una subclase de ProgressBar, sobreescribo updateDisplayList() y me aseguro de que la propiedad en cuestión no se acceda con valor nulo. Parece simple...
Pues no... resulta que el método updateDisplayList(), un método con visibilidad protected, durante su ejecución hace una llamada a un método privado y además utiliza propiedades privadas durante su ciclo de vida, lo cuál inutiliza totalmente el que el método sea sobrescribible ya que a la práctica no lo es.

Yo me pregunto... ¿tiene sentido hacer esto? Yo opino que es un error de diseño del método. Si expones un método a las subclases tienes que tener cuidado de que pueda ser sobrescrito.

Y ya poniéndonos fuertes... ¿Tiene sentido utilizar propiedades privadas en un SDK? Nunca sabes lo que los usuarios van a hacer con tus APIs, así que no te confíes y define la visibilidad más restrictiva con protected.
Vaya, digo yo...

El futuro de ActionScript

No sé en otros lenguajes, pero con ActionScript los desarrolladores siempre se han caracterizado por tener un especial afán en descubrir "qué es lo que viene en la próxima versión", supongo que se ha debido al hecho que en cada nueva versión siempre se le ha sacado el 200% del jugo tanto al lenguaje como al runtime.
Pues bien, para lo que sean de este grupo ( me incluyo :) ) aquí dejo un par de enlaces muy interesantes que desvelan las novedades de ECMAScript 4 que van a ser incluídas (o es muy posible que vayan a ser incluídas) en ActionScript.

Next Page →