Follow me @Tmeister

Archive for the ‘ActionScript’ Category

Advanced round class AS3

Posted by Tmeister On March - 31 - 2008

Esta es una clase de mucha ayuda para cuando queramos redondear números de una forma más avanzada.

AS3 cuenta con su Math.round pero esta función lo único que hace es redondear el numero al entero más cercano. Pero qué pasa si quiero redondear un número en múltiplos de 5 por ejemplo.

Para ello escribí esta sencilla clase que lo permite.

[as]
package net.tmeister.utils
{
/**
*
* Advanced Round Class
* @version 0.1
* @author Enrique Chavez aka Tmeister
*
*/
public class MathUtils
{
/**
*
* Rounds a Number to the nearest multiple
* @param number Number to Round
* @param precision multiple to be rounded
* @return A number round
*
*/
public static function roundToNear(number:Number, precision:Number)
{
return Math.round( number / precision) * precision;
}
/**
*
* Rounds a Number up to the nearest multiple
* @param number Number to Round
* @param precision multiple to be rounded
* @return A number Up round
*
*/
public static function roundToUpNear(number:Number, precision:Number)
{
return Math.ceil( number / precision) * precision;
}
/**
*
* Rounds a Number down to the nearest multiple
* @param number number Number to Round
* @param precision multiple to be rounded
* @return A number down round
*
*/
public static function roundToDownNear(number:Number, precision:Number)
{
return Math.floor( number / precision) * precision;
}
}
}
[/as]

Modo de uso es tan simple como esto.

[as]
import net.tmeister.utils.MathUtils;

const number:Number = 38
const precision:Number = 5

trace(MathUtils.roundToNear(number, precision)) // 40
trace(MathUtils.roundToUpNear(number, precision)) // 40
trace(MathUtils.roundToDownNear(number, precision)) // 35
[/as]

Enjoy ;)

PureMVC :: ValueObjects

Posted by Tmeister On March - 26 - 2008

Los ValueObjects son indispensables al momento de trabajar con MVC o sin el :) .

Voy a tratar hacer una definición de los ValueObjects sin ser muy técnico. de ahora en adelante al usar VO me estaré refiriendo a los ValueObjects. Los puntos mas importantes de los VO son:

  1. Los VO son contenedores de información representada por una clase individual.
  2. Los VO son serializables, es decir, pueden ser enviados entre un servidor y un cliente mantenido sus propiedades.

Imaginemos que vamos a hacer un listado de mensajes para un guestbook, pero no sabemos quien, que o como nos van a proveer la información, lo único sabemos son los atributos que contendrá cada mensaje, estos son:

  • idUnique
  • author
  • url
  • content

Los mensajes siempre contendrán estas propiedades vengan de donde vengan.

Según el punto 1 esta información es representada por una clase individual entonces como nuestro cliente será hecho el FLEX creamos nuestro clase en AS3 la cual representara nuestros VO en el cliente.

[as]

package com.klr20mg.pureMVC.guestbook.model.vo
{
[RemoteClass(alias="MessagesVO")]
[Bindable]
public class MessagesVO
{
public var idUnique:String;
public var author:String;
public var url:String;
public var content:String;
public function MessagesVO(author:String=null, url:String=null, content:String=null)
{
this.idUnique = “”
this.author = author;
this.url = url;
this.content = content;
}
}
}

[/as]

Hay 2 formas comunes de “poblar” los VO mediante el constructor, como en este ejemplo o mediante getters y setters, yo prefiero la primera.

Ahora vamos crear un VO a partir de la clase anterior

[as]

package com.klr20mg.pureMVC.guestbook
{
import com.klr20mg.pureMVC.guestbook.model.vo.MessagesVO
public class someClass
{
public function someClass()
{
var miVO:MessagesVO = new MessagesVO(“Tmeister”, “http://tmeister.net”, “Este es un mensaje de prueba”);
trace(miVO)
}
}
}

[/as]

Con esto hemos creado un VO de acuerdo a la primera clase.

Los VO son “compatibles” entre el cliente y el servidor según el punto numero 2, y al usar AMFPHP, WebOrb entre otros podemos enviar arrays de VO’s entre el server y el cliente sin ningún problema, pero entonces debemos de crear nuestros VO’s en el servidor en este caso usando PHP para poder “mapear” esta información.


<?php
class MessagesVO
{
    public $idUnique;
    public $author;
    public $url;
    public $content; 

    public function MessagesVO()
    {
    }
    public function mapObject($data)
    {
        $this->idUnique = $data["idUnique"];
        $this->author = $data["author"];
        $this->url = $data["url"];
        $this->content = $data["content"];
    }
}
?>

Como pueden ver es el mismo concepto encapsular la información en una clase.

Con esto, repito, no importa si la información viene de archivos de texto, de un webservice, de una base de datos, siempre podremos almacenar, consultar y modificar la información mediante nuestros VO’s.

Espero que con esto quede claro que son y para que usan los ValueObjects

Saludos :)

Introducción a PureMVC

Posted by Tmeister On March - 19 - 2008

La Teoría

PureMVC es un framework open source que implementa el modelo MVC para crear aplicaciones usando ActionScript 3 bajo Flash CS3 y Flex, creado originalmente por Cliff Hall .

Dentro de los planes de desarrollo podemos encontrar que se intenta implementar este framework en diversos lenguajes de programación, tales como:

  • ActionScript 2
  • ColdFusion
  • CSharp
  • Java
  • Perl
  • PHP
  • Python
  • Ruby

Al implementar el patrón MVC (Modelo-Control-Vista) podemos separar los datos de la aplicación, las vistas (Interfaz de usuario) y la lógica de control en tres “componentes”, para poder reutilizar código y sobre todo hacer nuestras aplicaciones escalabres y mantenibles.

PureMVC separa estos 3 componentes en 3 “actores” dentro del framework:

  • Proxies
  • Mediators
  • Commands

En donde:

Los datos, remotos o locales son manejados por los Proxies.
Las vistas o interfaz de usuario, son manejados por los Mediators.
La lógica de la aplicación es manejada por los Commands los cuales pueden interactuar con los Proxies, los Mediators y pueden activar o ejecutar otros Commands.

Existe un cuarto elemento en PureMVC llamado Facade el cual provee una interfaz simple de comunicación para que los 3 actores principales puedan comunicarse entre sí. Además de que PureMVC implementa un esquema de notificaciones (Eventos) mediante los cuales se puede activar/ejecutar una o varias acciones.

Read the rest of this entry »

Nuevo Hosting

Posted by Tmeister On November - 21 - 2006

Si estas leyendo este post es porque los DNS de nuestro nuevo hosting ya están esparcidos por la red =).

El cambio fue debido en mucha medida para poder contar de las bondades de php5, Ruby on Rails, entre otras cosas. Con PHP5 ahora podre probar finalmente weborb junto con Flex o con el alpha de Flash 9.

Ahora los dominios de tmeister.net y de klr20mg.com están hospedados en mediatemple.

PD. Todos los archivos de ejemplo, flas y zips fueron migrados (según yo) bien. :P pero si encuentran algún problema con los links por favor no duden en avisarme.

Nos estamos viendo.. 8)

Clase Config (Parsear archivos de configuración)

Posted by Tmeister On October - 14 - 2006

En muchas ocasiones cuando se nos encarga una aplicación dinámica en flash siempre hay un problema al momento de que el cliente cambie los valores de configuración de dicha aplicación mucho mas cuando este ultimo no quiere pagar por una interfaz de configuración =).

Para nosotros como desarrolladores no es nada del otro mundo poder cambiar los valores de un XML pero esto cambia cuando el cliente final sera el encargado de modificar dicho archivo. Cuando decimos XML se quedan con cara de ‘ehhh? Y eso con que se come’, repito si el cliente no quiere pagar por una interfaz de administración y quiere poder cambiar algunos valores de la aplicación lo mejor es que se le de un archivo de configuración en texto plano.

Ustedes pensaran que para ello podemos usar loadVars con las variables declaradas, el problema, de nuevo desde el punto de vista del cliente final es complicado ya que este debe tener un formato y ademas de que no podemos poner comentarios en el.

Jugando por ahí con Python me encontré con el modulo Config que carga y parsea un archivo de configuración estándar. A que me refiero con archivo de configuración estándar?

El típico archivo que utilizan los programas en linux, por ejemplo apache. Si nunca han visto este tipo de archivos así es como se ve.

###########################################
### This is a sample of a Config file config.txt
### Author: Enrique Chavez aka Tmeister
### Site: http:www.klr20mg.com
### Date: Oct, 14 2006
###########################################

###########################################
### The images path
###########################################

pathImages path/to/folder/

###########################################
### The gallery’s name
###########################################

GalleryName this is my test gallery

###########################################
### Your Firstname
###########################################

firstname = Enrique

###########################################
###Your Lastname
###########################################

lastname Chavez

###########################################
###Your Nick =)
###########################################

nick Tmeister

# End File

Bueno, He creado una sencilla clase que se encarga de parsear este tipo de archivos pudiendo acceder a los valores de las variables de una forma simple.

Tomando como ejemplo el archivo de configuración anterior, lo único que tenemos que hacer en nuestra clase o Fla es algo así..

[as]
import org.utils.Config
import mx.utils.Delegate
class myApp extends MovieClip
{
private var config : Config;
function myApp ()
{
}
function onLoad ()
{
config = new Config (“config.txt”);
config.addEventListener (“fault”, Delegate.create (this, onFault));
config.addEventListener (“complete”, Delegate.create (this, onComplete));
}
private function onComplete (obj : Object)
{
trace (config.read (“pathImages”))
for (var i in config.list)
{
trace (‘key: ‘ + i + ‘, value: ‘ + config.list [i]);
}
}
private function onFault (obj : Object)
{
for (var i in obj) trace (‘key: ‘ + i + ‘, value: ‘ + obj [i]);
}
}
[/as]

Con esto obtenemos algo así:

path/to/folder/
key: nick, value: Tmeister
key: lastname, value: Chavez
key: firstname, value: Enrique
key: GalleryName, value: this is my test gallery
key: pathImages, value: path/to/folder/

Como pueden ver al instaciar la clase se le pasa como parámetro el path del archivo de configuración. Esta clase cuenta con 2 dispatchs, fault y complete los nombres son mas que descriptivos cierto? :)
Por ultimo hay 2 métodos

read que regresa el valor de la variable que se pasa como parámetro y
list que regresa un objeto con todas las variables del archivo de configuración

Por ultimo la clase Config

[as]
import mx.events.EventDispatcher;
import mx.utils.Delegate
[Event("complete")]
[Event("fault")]
class org.utils.Config
{
private var cfgFile : String
private var cfg_lv : LoadVars
public var addEventListener : Function
private var dispatchEvent : Function;
private var token : Object
public var configList : Object
public function Config (getFile : String)
{
EventDispatcher.initialize (this);
cfgFile = getFile;
loadConfig ();
}
private function loadConfig ()
{
cfg_lv = new LoadVars ();
cfg_lv.load (cfgFile);
cfg_lv.onLoad = Delegate.create (this, parseCfg);
}
private function parseCfg (ok)
{
if ( ! ok)
{
dispatchEvent (
{
type : “fault”, msg : “Cant load file ” + cfgFile
});
return
}
var data : String = unescape (cfg_lv.toString ())
data = data.split (“=&onLoad=[type Function]“).join (“”)
data = data.split (“&onLoad=[type Function]“).join (“”)
var lines : Array = data.split (“\n”)
var count : Number = 0;
token = {
};
configList = {
}
while (lines [count])
{
var actualLine = lines [count ++]
var firstCharacter : String = escape (actualLine.substr (0, 1));
if (firstCharacter != “%23″ && firstCharacter != “%0D” && firstCharacter != ” “)
{
var finalLine = actualLine.split (“\r”).join (“”)
var values : Array = finalLine.split (” “);
var finalValue : String = “”;
for (var i : Number = 1; i < values.length; i ++)
{
finalValue += values [i] + " ";
}
finalValue = finalValue.substr (0, - 1)
token [values [0]] = finalValue
configList [values [0]] = finalValue
}
}
dispatchEvent (
{
type : "complete"
});
}
public function read (variable : String) : String
{
return token [variable]
}
public function get list () : Object
{
return configList;
}
}
[/as]

Los archivos Fuente. http://klr20mg.com/archivos/config.zip

Estoy totalmente convencido que la mejor manera para manejar nuestras configuraciones en Flash sigue y seguirá siendo un archivo XML, pero para aquellos necesiten un archivo de texto plano que sirva como archivo de configuración simple con comentarios para los clientes necios jeje esta clase puede ser de utilidad.

Saludos!!

Acerca de mi
Enrique Chavez

Enrique Chávez también es conocido como @Tmeister es un desarrollador, emprendedor, poeta y loco.

Geek autodeclarado y apasionado de todo lo que tiene que ver con tecnología y desarrollo.

Cuenta con una experiencia de más de 7 años en el ramo del desarrollo, creando, sobre todo, aplicaciones web en la empresa Sapotek.

A finales del 2008 crea, junto con 3 colegas, la consultoría llamada AureaCode, enfocándose a brindar servicios de desarrollo web en todas sus variantes.

Si necesitas algún tipo de información o consulta por favor no dude en escribir.

View Enrique Chávez's profile on LinkedIn

Carlos Enrique Chavez Garcia's VisualCV

RSS Feed

Links Patrocinados