actionscript.es :: enlaces de Flash

El señor Marc Palau [ cdmon.com, palaueb.com ] ha abierto una página de enlaces a recursos Flash y web en general.
http://www.actionscript.es/

( vía carlosrovira.com )

un portafolio original

Aparte de dominar 5 lenguajes de programación, programación orientada a objetos, partones de diseño, saber algo de vídeo, audio y diseño gráfico, ahora la nueva generación de Flasheros tambien domina el arte del espectáculo :)
Dave Werner portfolio
( vía brandspankingnew )

En navidad que no te den gato por liebre!

No vayas al mercado con AS1.0, pásate a AS2.0 !!

Actionscript:
  1. import animales.mamiferos.Liebre;
  2. import mercado.carnicerias.TIMOteo;
  3. var mi_liebre:Liebre;
  4. mi_liebre = TIMOteo.getLiebre();

Sacará:


**Error** Type mismatch in assignment statement:
     found Gato where Liebre is required.
     mi_liebre = TIMOteo.getLiebre();

Total ActionScript Errors: 1 	 Reported Errors: 1

jeje, para que no se diga que la POO es aburrida :)
Felices fiestas a todos!

Derechos de autor

Tras leer el post que ha escrito Carlos Rovira acerca de un caso de plagio de su trabajo en el blog por parte de una publicación comercial, creo que es importante tenerlo en cuenta e informar a la gente de cómo funciona esto de "las licencias".

Este blog, el de Carlos y muchos más suelen estar bajo una licencia Creative Commons.
Estas licecnias son muy fáciles de entender y no requeiren que uno sea licenciado en derecho para leerlas y sacar conclusiones.
Las licencias Creative Commons fueron concebidas para dar más opciones a los creadores a la hora de restringir el uso de sus trabajos. Las licencias pueden llegar a ser muy flexibles en el uso del material. Por ejemplo en este blog solo se indica que si se utiliza algún material, ya sea artículo o código, se cite la fuente, y si además se realiza algún trabajo derivado de éste, el resultado tenga una licencia idéntica a ésta.
Aquí dejo unos enlaces a las licencias más comunes:

Dominio Público

Reconocimiento-NoComercial-SinObraDerivada

Reconocimiento-NoComercial-CompartirIgual

Reconocimiento-NoComercial

Reconocimiento-SinObraDerivada

Reconocimiento-CompartirIgual

Reconocimiento

Un buen ejemplo de utilización de las licecnias CC es el sitio bioart.com.es, que se basa en colaboraciones de usuarios y ofrece un sistema de selección de licencia al enviar la colaboración.

¿Qué vale tu blog?

Quieres saber qué vale tu blog? :)
Introduce la URL y recibe el cálculo. El mío a resultado valer $14,113.50... creo que me esperaré a ver si suben las acciones para venderlo XD

( via extrajetzt )

Firefox :: algunos atajos de teclado útiles

No podría vivr sin los atajos de teclado...
Estos son mis preferidos en Firefox:

ALT + Inicio  -> ir a la página por defecto (home)
ALT + <= (cursor flecha izquierda) -> ir atrás (en historial)
ALT + => (cursor flecha derecha) -> ir adelante
CTRL + T -> abrir nuevo tab
CTRL + N -> abrir nueva ventana
CTRL + D -> guardar página en favoritos
CTRL + L (ó F6) -> pone el foco en la barra de direcciones

Actualiza a Firefox 1.5!

Bloglines :: lee tus blogs preferidos a tu aire

Llevo ya más de un año utilizando Bloglines, un servicio gratuito que te permite dar de alta blogs, categorizarlos y guardar las entradas que van saliendo hasta que te apetezca leerlas.
Ellos se describen muy bien :)

Bloglines es un servicio GRATUITO que permite buscar, crear, compartir y suscribirse a canales de noticias, blogs y otros contenidos de la red. Con Bloglines no es necesario descargar ni instalar software alguno – simplemente regístrese como nuevo usuario para acceder a su cuenta instantáneamente desde cualquier ordenador o dispositivo móvil.

También dispone de una pequeña aplicación "Bloglines notifier" que se instala en la barra de tareas, al lado del reloj, que te notifica cada X minutos si hay nuevas entadas sin leer en alguno de los blogs en los que estás suscrito.
Muy útil para adictos a la información ( lo admito, soy adicto... )
Si quieres probarlo, empieza suscribiéndote a éste blog :)
Suscríbete al blog joangarnet.com con Bloglines
Y aquí dejo mi blogroll

Tutoriales de desarrollo de components v2

Algunos enlaces a tutoriales de desarrollo de componentes con la arquitectura del framework v2 de Macromedia:

* The Basics pt.1
Cubre lo más básico, que es como estructurar la cosa desde el IDE de Flash, como se configura y qué más se necesita.

* Sizing in the IDE pt.1
Cubre el desarrollo de un componente super sencillo. Creación de la clase, utilización de los métodos esenciales de la arquitectura v2 y el escalado en el IDE (live preview).

* Developing Components in Flash 2004
Cubre todo el proceso de desarrollo, desde que se abre Flash hasta que se distribuye el componente. Muy completo.

* Introduction to the v2 component architecture
Este explica como funcionan las enrtañas de la arquitectura v2. Bastante completo y una lectura obligada si vamos a desarrollar componentes seriamente.

Cake :: rapid development framework para PHP

Cake es una librería de PHP a la Ruby on Rails.
Está en temprano desarrollo pero promete.

"Cake is a rapid development framework for PHP which uses commonly known design patterns like ActiveRecord, Association Data Mapping, Front Controller and MVC. Our primary goal is to provide a structured framework that enables PHP users at all levels to rapidly develop robust web applications, without any loss to flexibility."

Enlaces de interés:
* Cake PHP
* CakePHP - A ‘tasty’ solution for PHP programming
Enlaces relacionados:
* Ruby on Rails

Búsquedas binarias

Me encontrado con la siguiente situación:
Un cliente me ha dado una base de datos ACCESS (.mdb) con 13 columnas y 16,796 registros para confeccionar un diccionario traductor.
Para poder trabajar con los datos desde Flash he tenido que hacer la conversión a .xml y el archivo resultante pesaba 6.5Mb y tenía 218,347 líneas. Unos tamaños algo indigestos para la mayoría de parseadores de XML...
La primera solución que se me planteó fue separar cada letra del abecedario en diferentes archivos xml, pero aún así seguía siendo demasiado para el parser del FlashPlayer.
Finalmente (viendo que ni MTASC me podía salvar) tuve que crearme un script php que:
- parseara el archivo xml
- separara por idiomas
- separara cada idioma por iniciales
- sacara todos los valores de cada inicial a un archivo .as en forma de array asociativo (array de objetos)
- luego con la librería Ming generar los archivos .swf que contendrán los arrays compilados listos para ser cargados dinámicamente

Una vez hecho esto he obtenido una estructura así:

+---ale
|       ale_a.swf
|       ale_b.swf
|       ale_c.swf
    ( ...... )
|       ale_w.swf
|       ale_x.swf
|       ale_y.swf
|       ale_z.swf
|
+---cast
|       cast_a.swf
|       cast_b.swf
    ( ...... )
|       cast_x.swf
|       cast_y.swf
|       cast_z.swf
|
+---fran
|       fran_a.swf
|       fran_b.swf
    ( ...... )
|       fran_x.swf
|       fran_y.swf
|       fran_z.swf
|
|---ing
        ing_a.swf
        ing_b.swf
        ing_c.swf
        ing_d.swf
        ing_e.swf
    ( ...... )

A partir de ahí es cuando ha entrado en juego el dilema de qué algoritmo de búsqueda utilizar para realizar las búsquedas totales y parciales de las palabras.
Por un lado he necesitado poder consultar el array a cada evento de teclado desde el campo de texto de búsqueda para conseguir la misma funcionalidad que al escribir algo en la barra de direcciones del navegador, que mientras escribes se te muestran las ocurrencias de palabras que contienen el segmento de cadena que has escrito.
Lo demás ha sido mucho más sencillo a partir de ahí...

Tras investigar por ahí varios sistemas de búsqueda he llegado a la conclusión que el más versátil son las búsquedas binarias (binary search), que te permiten realizar búsquedas muy rápidas sin consumir nada de memoria y poco de procesador.
El concepto de las búsquedas binarias es bastante sencillo, en la wikipedia viene una definición:

Búsqueda binaria
Para realizarla, es necesario contar con un array o arreglo ordenado. Luego tomamos el elemento que se encuentra a la mitad del arreglo (N/2) y lo comparamos con el elemento buscado. Si el elemento buscado es menor, ahora solo buscaremos del inicio hasta la mitad (N/2), en caso contrario, buscaremos de la mitad +1 (N/2+1) hasta el final.
El siguiente paso de la búsqueda se repite el procedimiento en la mitad del arreglo elegido donde se puede encontrar la solución y se repite, resultando en una búsqueda recursiva.
De esta forma la complejidad computacional se reduce a O(ln N)

He creado una implementación de la búsqueda binaria total y otra de búsqueda binaria parcial para poder comparar segmentos de cadena.
Las dos testeadas con arrays de miles de registros.

Actionscript:
  1. /**
  2. * @class   BinarySearchUtils
  3. * @author  Joan Garnet
  4. * @version 1.0
  5. * @license http://creativecommons.org/licenses/by-sa/1.0/
  6. * @date    Sun Dec 18 06:56:26 2005
  7. * @usage   var arr:Array = [5,2,8,7,65,12,10,9,6,4,6,7,8,2,1,3,6,9,12,54,65,78,7,5,4,6];
  8. *          arr.sort (Array.NUMERIC);
  9. *          trace (arr);
  10. *          var index:Number = com.joangarnet.utils.BinarySearchUtils ( arr, 6 );
  11. *          trace (index)
  12. *          trace (arr[index])
  13. *
  14. *          var arr:Array = ["apple","orange","apple","nectarine","lemon","apple"];
  15. *          arr.sort ();
  16. *          trace (arr);
  17. *          var index:Number = com.joangarnet.utils.BinarySearchUtils ( arr, "apple" );
  18. *          trace (index)
  19. *          trace (arr[index])
  20. */
  21. class com.joangarnet.utils.BinarySearchUtils
  22. {
  23.     /**
  24.      * Busca la coincidencia de [terminoBusqueda] en [arrayDeBusqueda] con índice menor
  25.      * binarySearch basado en la implementación en Java de Tim Bray ( http://www.tbray.org/ongoing/When/200x/2003/03/22/Binary )
  26.      *
  27.      * @param   arrayDeBusqueda: (Array) de Strings o Numbers ordenado
  28.      * @param   terminoBusqueda: (Number) o un String
  29.      * @param   key:             (String). Corresponde a la clave en la que buscar si se trata de un array asociativo
  30.      * @return  Devuelve -1 si no se ha encontado la coincidencia o, si se ha encontrado, la posición
  31.      *          en el Array donde se encuentra (la de índice menor en el caso que esté repetida)
  32.      */
  33.     static public function binarySearch ( arrayDeBusqueda:Array, terminoBusqueda:Object, key:String ):Number
  34.     {
  35.         var alto:Number = arrayDeBusqueda.length;
  36.         var medio:Number;
  37.         var bajo:Number = -1;
  38.         while ((alto - bajo)> 1)
  39.         {
  40.             medio = Math.floor ((alto + bajo) / 2);
  41.         if (key==undefined) var arrValue=arrayDeBusqueda[medio]; else var arrValue = arrayDeBusqueda[medio][key];
  42.             if (arrValue <terminoBusqueda)
  43.             {
  44.                 bajo = medio;
  45.             }
  46.             else
  47.             {
  48.                 alto = medio;
  49.             }
  50.         }
  51.         if (key==undefined) var arrValue=arrayDeBusqueda[alto]; else var arrValue = arrayDeBusqueda[alto][key];
  52.         if (alto == arrayDeBusqueda.length or arrValue != terminoBusqueda)
  53.         {
  54.             return -1;
  55.         }
  56.         else
  57.         {
  58.             return alto;
  59.         }
  60.     }
  61.  
  62.     /**
  63.      * Busca la coincidencia parcial de [terminoBusqueda] en [arrayDeBusqueda.substr(0,terminoBusqueda.length)] con índice menor
  64.      *
  65.      * @param   arrayDeBusqueda: (Array) de Strings ordenado
  66.      * @param   terminoBusqueda: (String)
  67.      * @param   key:             (String). Corresponde a la clave en la que buscar si se trata de un array asociativo
  68.      * @return  Devuelve -1 si no se ha encontado la coincidencia o, si se ha encontrado, la posición
  69.      *          en el Array donde se encuentra (la de índice menor en el caso que esté repetida)
  70.      */
  71.     static public function binarySubstringSearch ( arrayDeBusqueda:Array, terminoBusqueda:String, key:String ):Number
  72.     {
  73.         var strLen:Number = terminoBusqueda.length;
  74.         var alto:Number = arrayDeBusqueda.length;
  75.         var medio:Number;
  76.         var bajo:Number = -1;
  77.         while ((alto - bajo)> 1)
  78.         {
  79.             medio = Math.floor ((alto + bajo) / 2);
  80.         if (key==undefined) var arrValue=arrayDeBusqueda[medio]; else var arrValue = arrayDeBusqueda[medio][key];
  81.             var substrDeBusqueda:String = arrValue.substr (0, strLen);
  82.             if (substrDeBusqueda <terminoBusqueda)
  83.             {
  84.                 bajo = medio;
  85.             }
  86.             else
  87.             {
  88.                 alto = medio;
  89.             }
  90.         }
  91.     if (key==undefined) var arrValue=arrayDeBusqueda[alto]; else var arrValue = arrayDeBusqueda[alto][key];
  92.         var substrDeBusqueda:String = arrValue.substr (0, strLen);
  93.         if (alto == arrayDeBusqueda.length or substrDeBusqueda != terminoBusqueda)
  94.         {
  95.             return -1;
  96.         }
  97.         else
  98.         {
  99.             return alto;
  100.         }
  101.     }
  102. }

Enlaces relacionados:
* On the Goodness of Binary Search
* Búsqueda binaria

Next Page →