Recuerdan aquel proyecto  que es una integración entre WordPress y AMF (Action Message Format ) usando servicios de AMFPHP llamado AWI.

Bien, este proyecto se quedo en la versión 2.3, si mal no recuerdo, de WordPress.

Ahora desde la lista de correo de desarrollo me entero que se ha creado un fork de AWI haciendo una actualización a WordPress 2.7 además de que se agregaron nuevos métodos.

El Fork fue creado por Dale Sattler  que en su blog nos cuenta de todos los cambios.

Así que ya saben si quieren hacer interfaces en Flash-Flex para WordPress esto es lo que están buscando

Saludos 8)

Tequila-valley

Leyendo mis feeds me entero que ha nacido una nueva Organización/Comunidad Mexicana enfocada al emprendimiento web, Tequila Valley.

Sin duda este tipo de proyectos son necesarios y sobre todo útiles para todas aquellas personas que tienen una idea pero no saben cómo iniciar a cómo desarrollarla.

Todos aquellos que alguna vez emprendimos un proyecto sabemos que la idea es solo la base de nuestro proyecto, la forma en cómo ejecutemos dicha idea es lo que asegurara o no el éxito del mismo. Es aquí en donde este tipo de comunidades son realmente valiosas, ya que dentro de ellas obtendrás consejos, tips, asesoramiento de personas que han pasado por lo mismo que tu, recuerda el dicho, “Nadie escarmienta en cabeza ajena”, hombre pero es bueno que te digan por donde ir de vez en cuando ¿no? :P

En lo personal, en México conozco Cafe de Altura , pero el punto que no me convence mucho es que las reuniones son físicas. No hay un foro o algo así que lo apoye (Al menos no he encontrado alguno, perdón si no busque buen), al contrario de Tequila Valley en donde desde un inicio encontramos una lista de correo y un foro.

Tequila Valley según sus creadores


¿Qué es Tequila Valley?

Corto y rapidito, con ayuda de varios, he aquí las tres reglas del club:


1. ES UNA AGRUPACIÓN MEXICANA

Neta, güey. Tequila Valley existe para fomentar nuestra nacionalidad como fuerte de desarrollo. Ojo que esto no quiere decir que tienes que estar pisoteando territorio azteca para poder hacer parte, sino que eres parte del club de mexicanos. Así estés en Tlalpán, Ushuaia, Washington o en el DF.


2. NO HAY JEFE, PRESIDENTE, DUEÑO, NI ACCIONISTAS (en serio, no insistan)

Tequila Valley es de todos. Para reunir un evento Tequila Valley no requieres permiso, autorización, visto bueno o carta apostillada del padre Benito, el de la iglesia de la esquina. De hecho, como otras organizaciones de este estilo lo dicen, es sólo un “estado mental”.


3. NO HAY REGLAS ESCRITAS EN PIEDRA

No, no las hay. De hecho, todo está abierto a discusión. Los invitamos a ser parte del grupo Google formativo de Tequila Valley, en donde a diario nos golpeamos la cabeza con temas banales como qué tipo de fuente usar o si el logotipo obedece las leyes de distribución áurea o no.

Fuente : Maestros del Web
Link del Proyecto: Tequila Valley

Al trabajar con clases AS3 en nuestros proyectos hay ocasiones en los que debemos acceder al stage principal de nuestra aplicación desde clases que no extienden a “DisplayObject”, haciendo que debamos pasar como parámetro dicho stage a las clases, esto funciona pero en realidad es un poco “sucio”.

Una solución simple es crear una clase singleton, en la cual, podemos almacenar no solo el stage principal, sino cualquier otro valor que necesitemos en varias clases. Algo así como _global de AS2, lo recuerdan?
Aquí la clase

[as] package net.tmeister.utils
{
public dynamic class Global
{
private static var global : Global

public static function getInstance() : Global
{
if ( global == null )
{
global = new Global( arguments.callee );
}
return global;
}

public function Global( caller : Function = null )
{
if ( caller != Global.getInstance )
{
throw new Error (“Global is a singleton class, use getInstance() instead”);
}
if ( Global.global != null )
{
throw new Error( “Only one Global instance should be instantiated” );
}
}
}
}
[/as]

Y su modo de uso.

[as] package
{
import flash.display.MovieClip;
import net.tmeister.utils.Global
public class Main extends MovieClip
{
private var global:Global;

public function Main()
{
global = Global.getInstance();
global.stage = stage
trace(‘global.stage’ + global.stage)
global.algunOtroValor = new MovieClip()
trace(‘global.algunOtroValor ‘ + global.algunOtroValor)
}
}
}
[/as]

Simple.

Ya está disponible para su descarga la versión 10 de nuestro querido Flash Player, entre las características principales podemos encontrar:

  • Efectos 3D Nativos
  • Filtros y efectos personalizados
  • Soporte de texto avanzado
  • Generación de sonido dinámico
  • Nuevo API de dibujo
  • Aceleración por hardware
  • Nuevo DataType Vector
  • Streaming dinámico

Y más más…. Ahora solo falta esperar el release de FLASH CS4 :)

La información completa la pueden encontrar en la página oficial del FlashPlayer

Como ya sabrán, la nueva suite de Adobe esta por ser lanzada, y para abrir boca, la documentación ya esta disponible.

Main help portal
http://help.adobe.com/en_US/Flash/10.0_Welcome/

New features
http://help.adobe.com/en_US/…html

Programming ActionScript 3.0
http://help.adobe.com/…./

ActionScript 3.0 Language and Components Reference
http://help.adobe.com/en_US/AS3LCR/Flash_10.0/index.html

Extending Adobe Flash Professional CS4
http://help.adobe.com/…/index.html

Con esto, sin duda, ya tenemos para entretenernos un bien tiempo.

Que tal gente.

Hace un buen rato que no posteo, pero aquí estoy de vuelta con algo sencillo.
TiledBackground es una clase simple la cual toma una imagen externa (jpg, gif, png) y la repite tantas veces quepa en el navegador tal y como lo hiciéramos en CSS :)

Además de que tiene un par de parámetros, se puede sobreponer un gradiente radial para hacer un efecto sobre el fondo. Los colores y alphas del gradiente se pueden configurar.

TiledBackground

[as3] package net.tmeister.utils.background
{

import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.Event;
import flash.geom.Matrix;
import flash.net.URLRequest;
import flash.display.StageScaleMode;
import flash.display.StageAlign;
import flash.display.GradientType;

public class TiledBackground extends Sprite
{
private var _pattern:String;
private var _container:Sprite;
private var _image:Loader;
private var _stage:Stage;
private var _gradient:Boolean = true;
private var _gProperties:Object = {};

public function TiledBackground(stage:Stage)
{
_stage = stage
_stage.scaleMode = StageScaleMode.NO_SCALE;
_stage.align = StageAlign.TOP_LEFT;
_stage.addEventListener(Event.RESIZE, resize);
}
public function set pattern (urlPattern:String):void
{
_pattern = urlPattern;
loadPattern();
}
public function get pattern():String
{
return _pattern;
}
public function set radialGradient(value:Boolean):void
{
_gradient = value;
}
public function get radialGradient():Boolean
{
return _gradient;
}
public function set gradientProperties(properties:Object):void
{
_gProperties = properties;
}
public function get gradientProperties():Object
{
return _gProperties;
}
private function loadPattern():void
{
var patternLoader:Loader = new Loader();
var patternUrl:URLRequest = new URLRequest(_pattern);
patternLoader.load(patternUrl);
patternLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onPatternLoaded);
}
private function onPatternLoaded(e:Event):void
{
_image = e.target.loader;
createBackground();
createRadialGradient()
}
private function createBackground():void
{
if (_container != null)
{
removeChild(_container);
_container = null;
}
var bitmap:BitmapData = new BitmapData (_image.width, _image.height);
bitmap.draw(_image)
_container = new Sprite();
_container.graphics.beginBitmapFill(bitmap);
_container.graphics.drawRect(0,0, _stage.stageWidth , _stage.stageHeight);
_container.graphics.endFill();
addChild(_container);
}

private function createRadialGradient():void
{
if (! _gradient )
{
return;
}
var matrix:Matrix = new Matrix();
var gType:String = GradientType.RADIAL;
matrix.createGradientBox(_stage.stageWidth,_stage.stageHeight,0,0,0);
var gColors:Array = [(_gProperties.insideColor) ? _gProperties.insideColor : 0xffffff, (_gProperties.outsideColor) ? _gProperties.outsideColor : 0xffffff];
var gAlphas:Array = [(_gProperties.insideColorAlpha) ? _gProperties.insideColorAlpha : .15 ,(_gProperties.outsideColorAlpha) ? _gProperties.outsideColorAlpha : 0];
var gRatio:Array = [0,255];
var bound:Sprite = new Sprite();
bound.graphics.beginGradientFill(gType,gColors,gAlphas,gRatio,matrix);
bound.graphics.drawRect(0,0,_stage.stageWidth,_stage.stageHeight);
addChild(bound);
}
private function resize(e:Event):void
{
createBackground();
createRadialGradient()
}
}
}
[/as3]

Uso:

[as] package
{
import flash.display.Sprite;
import net.tmeister.utils.background.TiledBackground

public class sampleTiled extends Sprite
{
public function sampleTiled()
{
var background:TiledBackground = new TiledBackground(stage);
background.pattern = “bg1.gif”
background.gradientProperties = {insideColor:0xffffff, outsideColor:0xffffff, insideColorAlpha:.05, outsideColorAlpha:0}
addChild(background)
}
}
}
[/as]

Aquí el ejemplo y como siempre los archivos fuente están disponibles.

Saludos!!

Está en una clase simple pero muy útil, al menos para mí, que recorre todos los hijos contenidos en un DisplayObject, la clase cuenta con 2 funciones:

getAllChilds

Regresa todos los hijos contenidos en el “target”

getChildsByType

Regresa solo los hijos que sean de un tipo específico, por ejemplo solo MovieClips, o solo Botones.

DisplayObjectUtils

[as] package net.tmeister.utils
{
/**
* @author Enrique Chavez aka Tmeister
*/
import flash.display.DisplayObject;
public class DisplayObjectUtils
{
/**
*
* @param target
* @return Array
*/
public static function getAllChilds(target:*):Array
{
var listTmp:Array = [] for (var a = 0; a < target.numChildren; a++ )
{
listTmp.push (target.getChildAt(a) )
}
return listTmp
}
/**
*
* @param target
* @param type
* @return
*/
public static function getChildsByType(target:*, type:*):Array
{
var listTmp:Array = [] for (var a = 0; a < target.numChildren; a++ )
{
if (target.getChildAt(a) is type)
{
listTmp.push (target.getChildAt(a) )
}
}
return listTmp
}
}
}
[/as]

Su uso es el siguiente:

Primero creamos unos Movieclips y unos botones para tener algo que buscar.

[as] import net.tmeister.utils.DisplayObjectUtils;
import fl.controls.Button

createMovieClips()
createButtons()
getChilds()

function createButtons()
{
for(var a:Number = 0; a<2; a++)
{
var tmp:Button = new Button();
tmp.x = Math.random()*400
tmp.y = Math.random()*400
tmp.label = “buton”+a
addChild(tmp)
}
}
function createMovieClips()
{
for(var a:Number = 0; a<5; a++)
{
var tmp:MovieClip = new MovieClip();
tmp.graphics.beginFill(0x2a2a2a, .5)
tmp.graphics.drawRect(Math.random()*500, Math.random()*300, Math.random()*100, Math.random()*100);
tmp.graphics.endFill();
tmp.name = “mc”+a;
addChild(tmp)
}
}
function getChilds()
{
trace(“All Childs: ” + DisplayObjectUtils.getAllChilds(this) )
trace(“=====================================================================================”)
trace(“Movieclips: ” + DisplayObjectUtils.getChildsByType(this, MovieClip))
trace(“=====================================================================================”)
trace(“Buttons: ” + DisplayObjectUtils.getChildsByType(this, Button))

}

[/as]

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 ;)

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"];
}
}
?>

[/php]

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 :)

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 Full Article →

Follow me through my day

Send requests or questions about my products, find out on what I'm working and stay tune with my updates or just say hello ;)

Array

@Tmeister

active