Upload con FileReference y Mac

Escrito en actionscript, bug, flash el Octubre 5th, 2007 por ddt / 13 Comentarios »

Aqui tengo un post cortito de advertencia. Si usais el FileReference para subir un fichero al servidor desde un Mac podeis encontraros con el problema de que el evento onComplete no salta al finalizar, bueno, ni ese ni ningun otro. Dejando la aplicación ‘colgada’, a la espera de que finalize la transacción. Por lo que he visto esto ocurre si la pagina aspx, php o lo que sea, no escribe absolutamente nada en la respuesta (es una pagina sin response body, tecnicamente hablando). Con que escribas ahi cualquier cosa, por ejemplo “eat me, fucking mac”. El trasto se lo traga. Hay que reconocer que es el sitio perfecto para una frase ocurrente y liberadora. Pasa tanto con Firefox como con Safari por tanto no tiene pinta de ser un bug de los navegadores. Asi que alguien en Adobe o Apple me debe unas 5 horitas de su vida. Las apunto a la cuenta. Y tu, que has encontrado en tu desesperación esta página a través de google, me debes unas cañas. También las apunto.

Advertidos quedais ;)

¿Flash “Next”?

Escrito en General el Octubre 3rd, 2007 por ddt / 2 Comentarios »

Más cosas en el MAX. Nuevas características, estas para la próxima versión del IDE. Alucinante. Stage basado en Flash Player 10, con previsualizacion completa en tiempo de diseño, se cargan los keyframes (si, si, lo que oyes) y además soporte de bones.

Hechad un vistazo a este video :) 

Flash Player 10 codename Astro, o la historia de como nunca podrás dormir mas de 4 horas.

Escrito en flash, tecnología el Octubre 3rd, 2007 por ddt / 11 Comentarios »

O por lo menos, sin sufrir las terribles consecuencias de quedarte obsoleto en un par de meses. Por qué, dios mio, justo ahora que creo que empiezo a tener una visión mas o menos clara de AS3, E4X y toda la parafernalia que trae consigo, Adobe me trae nuevos “regalitos” en forma de actualización para el Flash Player 9 (codename moviestar) con su soporte de video H.264 de alta resolución, audio AAC, soporte para los nuevos micros multi-core, y caché de frameworks comunes (zarate pidió algo parecido, ¿qué has hecho tio, a quien has pagado?) entre otras maravillas que solo las conocen “ciertos” beta-testers. Hasta aqui, muy bien, no parece demasiado trabajo (lease con cierta ironía). Pero entonces se abren las puertas del MAX 07 en Chicago y el key person de turno, da la keynote de turno… Astro, hay que joderse….

Leer más »

AS2 EventGlue, una clase para escribir menos codigo.

Escrito en General el Septiembre 21st, 2007 por ddt / 7 Comentarios »

Hoy os traigo una de las clases de mi framework personal que más aprecio. EventGlue. La uso docenas de veces en cada proyecto :)

Leer más »

AS3 Arrays (part II)

Escrito en General, actionscript, actionscript 3, flash, tecnica el Agosto 29th, 2007 por ddt / 2 Comentarios »

Como os prometí, voy a poner algun ejemplo más de los nuevos metodos del array en Actionscript 3. Particularmente interesantes son:

map: Ejecuta la funcion en cada uno de los elementos y crea un nuevo array con el resultado. Esto es particularmente útil cuando necesitas hacer una transformación sobre todos los elementos del Array como convertirlos en mayusculas/minusculas, cambiar espacios por guiones o cosas mas complicadas con objetos. Posiblemente es de las novedades que más utilize.

filter: Ejecuta la funcion en cada uno de los elementos para determinar si deben de aparecer en el nuevo Array. Como su propio nombre indica sirve para realizar un filtro determinado sobre los elementos.

Muy interesante tambien la posibilidad de ir combinandolos, el siguiente ejemplo pone en mayusculas la primera letra de los elementos en un Array de Strings, desecha los elementos que no tengan mas de una palabra y los muestra en pantalla.

Actionscript:
  1. <code>
  2. var items:Array = ["turn on the bright lights","antics","our love to ADMIRE"];</code>
  3.  
  4. function capitalize(item:String,index:int,arr:Array):String
  5. {
  6. return item.charAt(0).toUpperCase() + item.substring(1).toLowerCase();
  7. }
  8. function multipleWords(item:String,index:int,arr:Array):Boolean
  9. {
  10. return item.split(" ").length&gt;1;
  11. }
  12. function render(item:String,index:int,arr:Array):void
  13. {
  14. var txt:TextField = new TextField();
  15. txt.text = item;
  16. txt.y = index*20;
  17. txt.width = 200;
  18. stage.addChild(txt);
  19. }
  20. items.map(capitalize).filter(multipleWords).forEach(render);

Genial, ¿no?

Aqui enumero la lista de estos nuevos métodos para que les hecheis un vistazo:

every:
Sirve para determinar si todos los elementos de un array cumplen un determinado criterio o condicion
some:
Parecido a every. En este caso determina si alguno de los elementos lo cumplen
filter:
Crea un nuevo array filtrando los elementos
forEach:
Ejecuta una función por cada uno de los elementos
filter:
Crea un nuevo array filtrando los elementos con la función dada
map:
Crea un nuevo array esta vez transformando los elementos con la función

Bastante útiles todos como podeis ver... ;)

AS3 Arrays: ¿Quién necesita bucles?

Escrito en General, actionscript, actionscript 3, flash, tecnica el Julio 26th, 2007 por ddt / 7 Comentarios »

Una cosa que de la que no he oido hablar sobre AS3 es las nuevas caracteristicas de la clase Array, si, nuestro antiguo compañero de andanzas... Que yo cuente tiene por lo menos 7 nuevos métodos que me parecen muy muy interesantes. Tanto que podría decir que usandolos no volveras a escribir un bucle que recorra un Array. Y eso, teniendo en cuenta que el 90% de los bucles que normalmente se escriben se utilizan con Arrays, es mucho decir.

La primera bendición llega con el nombre de indexOf(), seguro que mas de una vez lo habeis utilizado con la clase String, pues básicamente funciona igual solo que busca en un elemento en un Array.

Actionscript:
  1. // Busco y elimino el elemento "dos"
  2. var numeros:Array = ["uno","dos","tres","cuatro"];
  3. numeros.splice( numeros.indexOf("dos"), 1);

Por fin se puede buscar algo dentro un array manteniendo la dignidad, sin la necesidad de un embarazoso bucle :_)

Pero ahi no acaba todo, dados los nuevos closures, se han añadido a la clase Array unos metodos que cogen funciones como parametros y hacen cosas muy utiles. El mejor ejemplo, el forEach, ¿Cuantas veces has hecho un bucle para crear MovieClips por cada uno de los elementos? Me referia a cúantas al dia... ;)

Actionscript:
  1. var nombres:Array = ["uno","dos","tres","cuatro"];</code>
  2.  
  3. function mostrar(item:String,index:Number,array:Array):void{
  4. var tx:TextField = new TextField();
  5. tx.text = item;
  6. tx.y = index*20;
  7. addChild(tx);
  8. }
  9.  
  10. nombres.forEach(mostrar);

Como veis el metodo forEach coge como parametro una funcion y la ejecuta una vez por cada elemento del Array pasandole como argumento el propio elemento entre otras cosas. Realmente me encanta... Más sobre esto en próximos posts.

Back in town

Escrito en General el Junio 23rd, 2007 por ddt / 7 Comentarios »

Bueno, despues de casi 2 años offline vuelvo a la blogosesfera. :)

La verdad es que el tiempo no es algo que me sobre últimamente pero creo que podré encontrar el necesario para escribir aqui de nuevo mis pensamientos, trucos y opinion sobre todo lo relacionado con el mundo de Flash y desarrollo web en general.

Quiero que este primer post de esta segunda epoca de sidedev sirva un poco para hacer una especie de "declaracion de intenciones". La primera es que voy a intentar mantener este blog siempre lo mas on-topic posible. A mi personalmente no me gusta nada estar subscrito a un blog de caracter técnico (como va a seguir siendo este) y de repente ver entradas sobre lo chula que era la peli que vi la semana pasada. La temática va a ser muy Flash-centrica. Aunque en el pasado estube mas involucrado tambien en el mundillo de los standares web, web semantica..etc. Hoy en dia he perdido un poco el hilo del tema. No porque no me parezca interesante, sino porque durante estos ultimos 2 años el trabajo me ha obligado a especializarme y a decir verdad si tengo que elegir entre hacerlo sobre todo el mundo de los web standards y el mundo de Flash, me quedo con este último sin pensarlo 2 veces. Me gusta más, punto. Aunque también me parezca interesante el otro.

Como veis el blog en si esta bastante "soso". Simplemente le he puesto un tema sin tocarlo y actualmente esa es la unica personalización que tengo, pero como precisamente el querer tenerlo todo impecable antes de salir a la luz es lo que me ha impedido hacerlo finalmente he tomado la decision de hacer una instalacion del wordpress, elegir un theme en una hora y sacarlo. Si veo que esto finalmente va funcionando, la gente se ve interesada en lo que digo y encuentro el tiempo necesario lo iré "tuneando" un poco mas y dandole un caracter más personal. Por suerte, hace tiempo cuando decidi hacer todo esto en word press, conseguí importar las entradas de mi antiguo blog a este sistema y las he dejado aqui por razones más emocionales que historicas. Las he marcado todas bajo el tag Historico.

Bueno, nos seguimos leyendo ;)

[Componente] Mouse Gestures para Flash

Escrito en Historico, componentes, mouse gestures, opera, subflash, usabilidad el Octubre 7th, 2005 por ddt / 4 Comentarios »

Hace algún tiempo que escribí esta clase para Flash inspirado por la genial funcionalidad includia en el navegador Opera. Incluso tuve la oportunidad de presentarlo en las charlas de Subflash este verano. Por fín he podido sacar el tiempo necesario para documentarlo debidamente (no me gusta publicar nada que no lo esté), empaquetarlo y mejorar los ejemplos.

La clase sirve para observar los trazos del ratón generados por el usuario y así asociar ciertas acciones a ellos. Bueno, pienso que lo mejor es que le hecheis un vistazo al tema, asi que aquí lo teneis:

Mouse Gesture Manager Class

Espero que le encontreis utilidad.

Problemas con IE (para variar)

Escrito en Historico el Septiembre 7th, 2005 por ddt / Sin comentarios »

Que impedian ver esta página. Solucionado, un script, amigo de un bug, que conocia de antes al service pack 2 se vé que no le gustaba el alto de mi pagina.

¿No lo entendeis? Yo tampoco.

Flash y criptografía: Técnica de ocultación de información en cliente.

Escrito en Historico, criptografia, flash, tecnica el Agosto 30th, 2005 por ddt / 2 Comentarios »

Otra vez de nuevo por aquí con una técnica que creo que muchos pueden encontrar interesante. En un trabajo reciente para un cliente, este quería colgar en una web en Flash unos archivos que solo se pudieran descargar con password. Hasta aquí nada peculiar excepto por el hecho de que el servidor no soportaba lenguaje de servidor, además pedirlo solo para eso me parecía exagerado. Así que como últimamente he estado trabajando un rato con el tema de encriptación le he estado dando vueltas para conseguir un sistema que aunque no fuese infalible (ninguno lo es) evitase los casos mas probables de ataque, como la decompilación del SWF e incluso temas mas complicados como algún sniffer.

Seguro que alguno me cuenta que este sistema ya lo conocía, que es trivial, pero la criptografía es un tema de lo más oscuro para muchos. Vamos, lo era para mí hasta que me tuve que meter de lleno por un proyecto que requería especial tratamiento en la seguridad.

Por explicarlo rápidamente y muy por encima digamos que hay 2 tipos de algoritmos:

  • Los de vía única, no reversibles, comúnmente llamados algoritmos de hash, que tienen 2 características que son muy útiles:
    • Una vez cifrado el texto, no se puede descifrar, no hay vuelta atrás.
    • Y que es prácticamente imposible que usando dos textos diferentes se obtengan el mismo hash. Los más conocidos son MD5 y SHA-1.

    Actualización: Xabi Beumala me comenta:

    Los algortimos reversibles se separan en dos grandes grupos, los simétricos y los asimétricos. En los simétricos la llave es la misma en ambos extremos (encrypt y decrypt), en los asimétricos tienes dos llaves una deshace a la otra.

  • Los reversibles, seguramente los mas conocidos por todos. Tienes una palabra clave que usas para cifrar el texto y esa misma clave sirve para revertir el texto. Hay muchos de este tipo, pero los más conocidos son los RSA y AES.

Antes de comenzar os tenéis que bajar unas clases de crypto que resuelvan la parte engorrosa del asunto: Implementar los algoritmos. Os recomiendo las ASCrypt que tiene todo lo que necesitamos. En el ejemplo usaremos estas, aunque hay otras como ActionCrypt

Para poner en práctica esta técnica que os cuento no nos valdría solo con este ultimo tipo ya que de alguna manera deberíamos incluir la clave en los datos del SWF o se tendría que trasmitir desde el servidor lo que haría el sistema bastante débil. Necesitamos una combinación de los dos.

El escenario es el siguiente. Pensamos en una palabra clave, esta es la que le vamos a dar a los usuarios que queremos que tengan acceso. Pongamos que es "privado". OK

Previamente calculamos el Hash usando SHA1 (por ejemplo) y copiamos el hash que hemos obtenido, que seria "7e4231b4e1b8534ea5106bf821f0bb324987c567" y en Flash simplemente comprobamos si el usuario es válido con un simple if:

Actionscript:
  1. import com.meychi.ascrypt.*;
  2. var logged:Boolean = false;
  3. var key:String;
  4. function validate(pass:String):Boolean{
  5. if(SHA1.calculate(pass)== "7e4231b4e1b8534ea5106bf821f0bb324987c567"){
  6. logged = true;
  7. key = pass;
  8. return true;
  9. }
  10. return false;
  11. }

Lo interesante aquí es que da igual que vean el texto cifrado (hash) porque no es posible revertirlo para ver la clave original :) así que aunque vean el código fuente es prácticamente imposible obtenerla.

Fijaros también que guardamos la clave que ha introducido el usuario en la variable "key", esta la vamos a utilizar en el paso siguiente. Ahora imaginaros que la url que queremos ocultar es: "/ficheros/documento.pdf". Ahora utilizaremos un algoritmo reversible, un AES, también conocido como Rijndael. De nuevo generamos el texto cifrado para esa url usando como clave "privado" la misma que hemos hasheado con el SHA1 y nos devolverá lo siguiente: "3e3b9304a675c7fb24be775d4aee65962118be8080270e618204093773374004", perfecto, de nuevo nos vamos a Flash y utilizamos la variable "key" donde hemos almacenado la que ha introducido el usuario para desencriptar ese churro y obtener la url original:

Actionscript:
  1. var codec:Rijndael = new Rijndael(192, 128);
  2. function decryptfile(crypto:String):String{
  3. return codec.decrypt(crypto, key, "ECB");
  4. }
  5. descargar.onRelease = function(){
  6. if(logged){
  7. getURL(decryptfile("3e3b9304a675c7fb24be775d4aee65962118be8080270e618204093773374004"),"_blank");
  8. }
  9. else{
  10. trace("No permitido");
  11. }
  12. }

De esta manera ya tenemos protegido el nombre del fichero. Y es prácticamente imposible obtenerlo sin conocer la clave. Creo que winzip, winrar .etc. utilizan un sistema parecido para proteger los ficheros.

Este sistema tiene algunas pegas, una de ellas es el hecho de la clave se tiene que proporcionar previamente al usuario de alguna manera, ese método puede ser inseguro (como el email común) y ahí estaría el talón de Aquiles del sistema. Otro inconveniente es que el hecho de cambiar la clave obliga a generar de nuevo el hash y todos los textos cifrados, pero esto se podría aliviar manteniéndolos en un XML externo y actualizándolo cuando esta cambiase. Incluso se podrían cargar diferentes basándose en un nombre de usuario o email.

Bueno, espero que os sea útil esta técnica. Admito todo tipo de comentarios al respecto, no soy un experto en criptografía ni mucho menos, pero creo que el sistema en sí tiene una fiabilidad bastante alta.

Aquí os cuelgo el fichero de ejemplo y un generador de claves para crear el hash y las urls cifradas. Merece la pena que leáis sobre el tema, si quitas los detalles de implementación, el resto es bastante interesante ;)