<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>.:: klr20mg ::. Una dosis diaria de .... &#187; AS3</title>
	<atom:link href="http://klr20mg.com/category/as3/feed/" rel="self" type="application/rss+xml" />
	<link>http://klr20mg.com</link>
	<description>Blog acerca de desarrollo orientado hacia Flash, Flex y Actionscript.</description>
	<lastBuildDate>Wed, 26 May 2010 21:59:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Air 2.0 Conexi&#243;n IMAP mediante SecureSocket</title>
		<link>http://klr20mg.com/2010/02/26/air-2-0-conexin-imap-mediante-securesocket/</link>
		<comments>http://klr20mg.com/2010/02/26/air-2-0-conexin-imap-mediante-securesocket/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 01:56:24 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Adobe AIR]]></category>
		<category><![CDATA[Ejemplos]]></category>
		<category><![CDATA[Flex 4]]></category>
		<category><![CDATA[AIR 2.0]]></category>
		<category><![CDATA[FlashBuilder]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=546</guid>
		<description><![CDATA[Una de las nuevas características de Adobe Air 2.0 es la conexión a servidores mediante sockets encriptados (SSL). Uno de los servicios mas comunes que utiliza una conexión encriptado son los proveedores de correo usando IMAP. Para este ejemplo vamos a conectarnos al servidor IMAP de Gmail y obtener el numero de mensajes nuevos y [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://klr20mg.com/wp-content/uploads/2010/02/Adobe_Air-logo-8BE840B3A1.gif" alt="" title="Adobe_Air-logo-8BE840B3A1" width="200" height="200" class="alignright size-full wp-image-548" /><br />
Una de las nuevas características de Adobe Air 2.0 es la conexión a servidores mediante sockets encriptados (SSL).</p>
<p>Uno de los servicios mas comunes que utiliza una conexión encriptado son los proveedores de correo usando IMAP.</p>
<p>Para este ejemplo vamos a conectarnos al servidor IMAP de Gmail y obtener el numero de mensajes nuevos y mensajes en total que existen en nuestra cuenta.</p>
<p>Para fines prácticos de este ejemplo necesitamos:</p>
<ul>
<li>Una cuenta de Gmail, <a href="http://mail.google.com/mail/#settings/fwdandpop">con IMAP habilitado</a></li>
<li><a href="http://labs.adobe.com/technologies/flashbuilder4/">FlashBuilder</a></li>
<li><a href="http://labs.adobe.com/technologies/air2/">Adobe AIR 2.0</a></li>
</ul>
<p><span style="font-family: Georgia;">Lo primero es crear una interfaz sencilla en donde se pueda insertar el nombre de usuario, la contraseña, campos de output y un boton para iniciar el proceso.</span></p>
<pre class="brush: xml; light: true;">
	&lt;s:Label x=&quot;10&quot; y=&quot;17&quot; text=&quot;Gmail username:&quot;/&gt;
	&lt;s:Label x=&quot;10&quot; y=&quot;45&quot; text=&quot;Gmail password:&quot;/&gt;
	&lt;s:TextInput y=&quot;10&quot; id=&quot;username_txt&quot; change=&quot;_username = username_txt.text&quot; right=&quot;10&quot; left=&quot;120&quot;/&gt;
	&lt;s:TextInput y=&quot;40&quot; id=&quot;password_txt&quot; change=&quot;_password = password_txt.text&quot; displayAsPassword=&quot;true&quot; right=&quot;10&quot; left=&quot;120&quot;/&gt;
	&lt;s:Button y=&quot;70&quot; label=&quot;Tell me!!&quot; click=&quot;start()&quot; right=&quot;10&quot;/&gt;
	&lt;s:Label x=&quot;10&quot; y=&quot;100&quot; width=&quot;280&quot; id=&quot;result_txt&quot;/&gt;
	&lt;s:TextArea id=&quot;out_txt&quot; editable=&quot;false&quot; right=&quot;10&quot; bottom=&quot;10&quot; top=&quot;130&quot; left=&quot;10&quot;/&gt;
</pre>
<p><span id="more-546"></span></p>
<p>El resultado de esto se ve de esta forma:</p>
<div align="center">
<img src="http://klr20mg.com/wp-content/uploads/2010/02/gmailSSL.png" alt="" title="gmailSSL" width="308" height="280" class="aligncenter size-full wp-image-547" />
</div>
<p>Despues de tener nuestra interfaz vamos a declarar todas la variables y constantes que vamos a necesitar:</p>
<pre class="brush: as3; light: true;">
			/******************************************************************
			 *	Datos de la cuenta (Gmail IMAP)
			 * ***************************************************************/

			private static const INCOMING_SERVER:String = &quot;imap.gmail.com&quot;;
			private static const PORT:int = 993;
			private var _username:String = &quot;&quot;;
			private var _password:String = &quot;&quot;;

			/******************************************************************
			 * Socket &amp;&amp; Stuff
			 * ***************************************************************/ 

			private var _server:Socket;
			private var _buffer:ByteArray;
			private var _action:String;
			private var _totalMessages:String;
			private var _newMessages:String;

			/******************************************************************
			 * Respuestas del servidor (para filtar el contenido)
			 * http://tools.ietf.org/html/draft-gahrns-imap-namespace-00
			 * ****************************************************************/

			private static const CONNECT:String = &quot;*&quot;;
			private static const LOGIN:String = &quot;A002&quot;;
			private static const STATUS:String = &quot;A006&quot;;
			private static const CRLF:String = &quot;\r\n&quot;;
			private var _regSearch:RegExp = RegExp(&quot;\\&quot;+_action+&quot;\\r\\n&quot;);
</pre>
<p>Aqui hay un par de cosas que debo resaltar:</p>
<pre class="brush: as3; light: true;">
			private var _buffer:ByteArray;
</pre>
<p>En esta variable almacenaremos las respuestas que nos envié el servidor.</p>
<pre class="brush: as3; light: true;">
			private var _regSearch:RegExp = RegExp(&quot;\\&quot;+_action+&quot;\\r\\n&quot;);
</pre>
<p>Con esta expresion regular verificaremos si el mensaje que recibimos del servidor es util para nosotros.</p>
<pre class="brush: as3; light: true;">
			private static const CONNECT:String = &quot;*&quot;;
			private static const LOGIN:String = &quot;A002&quot;;
			private static const STATUS:String = &quot;A006&quot;;
</pre>
<p>Estas constantes son los identificadores de los mensajes que se mandan desde y hacia el servidor para saber mas de estos identificadores recomiendo esta lectura <a href="http://tools.ietf.org/html/draft-gahrns-imap-namespace-00">http://tools.ietf.org/html/draft-gahrns-imap-namespace-00</a></p>
<p>Ahora nos queda inicializar nuestro socket y crear los eventos que usaremos para comunicarnos con el servidor</p>
<pre class="brush: as3; light: true;">
				_server = new SecureSocket();
				_server.addEventListener(Event.CONNECT, onConnect);
				_server.addEventListener(Event.CLOSE, onClose);
				_server.addEventListener(ProgressEvent.SOCKET_DATA, onData);
				_server.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
</pre>
<p>El único cambio con respecto a trabajar con Sockets sin encriptar es el constructor de la clase en lugar de usar </p>
<pre class="brush: as3; light: true;">
				_server = new Socket();
</pre>
<p>Ahora debemos utilizar</p>
<pre class="brush: as3; light: true;">
				_server = new SecureSocket();
</pre>
<p>Así de simple; Bien, hemos seteado los listeners para CONNECT, SOCKET_DATA, CLOSE y IO_ERROR vamos a concentranos solamente en SOCKET_DATA que es el evento que se dispara al momento de recibir un mensaje del servidor.</p>
<pre class="brush: as3; light: true;">
			private function onData(e:ProgressEvent):void
			{
				out_txt.text += &quot;Data &quot; + e+&quot;\n&quot;;
				var socket:Socket = e.target as Socket;
				var bufferString:String;
				socket.readBytes(_buffer, _buffer.length, socket.bytesAvailable);
				bufferString = _buffer.toString();
				out_txt.text += &quot;SERVER: &quot; + _buffer.toString()+&quot;\n&quot;;
				if (  bufferString.search( _regSearch ) )
				{
					out_txt.text += &quot;Es una respuesta valida parsea\n&quot;;
					parseResponse();
				}
				cursorManager.removeBusyCursor()
			}
</pre>
<p>En esta función recibimos el evento y tomamos el contenido del mensaje mediante el método readBytes y lo almacenamos en la variable _buffer</p>
<pre class="brush: as3; light: true;">
				socket.readBytes(_buffer, _buffer.length, socket.bytesAvailable);
</pre>
<p>Verificamos que el mensaje corresponda a nuestra petición, en este caso solo usamos 3 peticiones CONNECT, LOGIN, STATUS y si el mensaje es correcto parseamos el contenido.</p>
<p>El primer mensaje que recibimos del servidor es el de conexión</p>
<p><strong>SERVER: * OK Gimap ready for requests from 189.216.40.184 14if7528374pzk.62</strong></p>
<p>Una vez que estemos conectados mandamos nuestras credenciales para que el servidor nos autentique y cambiamos el mensaje a LOGIN indicando que estamos esperando el mensaje de respuesta de la solicitud de logueo.</p>
<pre class="brush: as3; light: true;">
				if ( _action == CONNECT )
				{
					out_txt.text += &quot;Es es tag de conexion manda login\n&quot;;
					_server.writeUTFBytes(LOGIN + &quot; LOGIN &quot; + _username + &quot; &quot; + _password + CRLF);
					_action = LOGIN;
					_server.flush();
					return;
				}
</pre>
<p>Se envia el mensaje y de inmediato recibimos la respuesta del servidor, en caso de login correcto:</p>
<p><strong>A002 OK tmeister@gmail.com authenticated (Success)</strong></p>
<p>Si es incorrecto:</p>
<p><strong>A002 NO [ALERT] Invalid credentials (Failure)</strong></p>
<p>Con esto es muy fácil saber el resultado de la operación, usemos indexOf para saber si la palabra &#8220;OK&#8221; existe</p>
<pre class="brush: as3; light: true;">
				if ( _action == LOGIN )
				{
					out_txt.text += &quot;Es la respuesta del login\n&quot;;
					if( bufferString.indexOf(&quot;OK&quot;) != -1 )
					{
						out_txt.text += &quot;El login es correcto, estamos autenticados - Pedir correos sin leer\n&quot;;
						_action = STATUS;
						_server.writeUTFBytes(STATUS + &quot; STATUS inbox (MESSAGES UNSEEN)&quot; + CRLF);
						_server.flush();
					}else
					{
						out_txt.text += &quot;Ooops!! Las credenciales no son validas.\n&quot;;
						Alert.show(&quot;Ooops!! Las credenciales no son validas.&quot;, &quot;Error&quot;);
						_server.close();
					}
					return;
				}
</pre>
<p>Excelente estamos autenticados, Ahora que? solo nos falta pedir el estatus de la cuenta pidiendo los mensajes totales y los mensajes nuevos de la carpeta Inbox</p>
<pre class="brush: as3; light: true;">
						_server.writeUTFBytes(STATUS + &quot; STATUS inbox (MESSAGES UNSEEN)&quot; + CRLF);
</pre>
<p>El ultimo paso es recibir el mensaje del servidor con la información que pedimos y parsearla, al ser texto solo tenemos que usar indexOf y substring para acceder a lo que nos interesa</p>
<p><strong>STATUS &#8220;inbox&#8221; (MESSAGES 61298 UNSEEN 5)</strong></p>
<pre class="brush: as3; light: true;">
				if( _action == STATUS )
				{
					out_txt.text += &quot;Es la respuesta del Status &quot; + bufferString+&quot;\n&quot;;
					var startSub:int = bufferString.indexOf(&quot;(&quot;);
					var endSub:int = bufferString.indexOf(&quot;)&quot;);
					var message:String = bufferString.substring(startSub+1, endSub);
					var slides:Array = message.split(&quot; &quot;);
					var count:int = 0;
					for each( var slide:String in slides )
					{
						switch( slide )
						{
							case &quot;MESSAGES&quot;:
								_totalMessages = slides[count + 1];
								break;
							case &quot;UNSEEN&quot;:
								_newMessages = slides[count + 1];
								break;
						}
						count++;
					}
					result_txt.text = _newMessages + &quot; mensajes nuevos, de &quot; + _totalMessages + &quot; en total&quot;;
					out_txt.text += _totalMessages;
					out_txt.text += _newMessages;
					_action = null;
					_server.close();
				}
			}
</pre>
<p>Sin duda, lo mas complejo al momento de trabajar con Sockets es saber utilizar e implementar el protocolo de comunicación pero esa ya es otra historia.</p>
<p>Por ultimo les dejo el código completo</p>
<pre class="brush: as3;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;s:WindowedApplication xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot;
					   xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot;
					   xmlns:mx=&quot;library://ns.adobe.com/flex/halo&quot;
					   creationComplete=&quot;init(event)&quot;
					    width=&quot;300&quot; height=&quot;250&quot;&gt;
	&lt;fx:Script&gt;
		&lt;![CDATA[
			import flash.events.Event;
			import flash.events.IOErrorEvent;
			import flash.events.MouseEvent;
			import flash.events.ProgressEvent;
			import flash.net.SecureSocket;
			import flash.net.Socket;
			import flash.utils.ByteArray;

			import mx.controls.Alert;
			import mx.events.FlexEvent;

			private static const INCOMING_SERVER:String = &quot;imap.gmail.com&quot;;
			private static const PORT:int = 993;
			private var _username:String = &quot;&quot;;
			private var _password:String = &quot;&quot;;

			private var _server:Socket;
			private var _buffer:ByteArray;
			private var _action:String;
			private var _totalMessages:String;
			private var _newMessages:String;

			private static const CONNECT:String = &quot;*&quot;;
			private static const LOGIN:String = &quot;A002&quot;;
			private static const STATUS:String = &quot;A006&quot;;
			private static const CRLF:String = &quot;\r\n&quot;;
			private var _regSearch:RegExp = RegExp(&quot;\\&quot;+_action+&quot;\\r\\n&quot;);

			protected function init(event:FlexEvent):void
			{

				_server = new SecureSocket();
				_server.addEventListener(Event.CONNECT, onConnect);
				_server.addEventListener(Event.CLOSE, onClose);
				_server.addEventListener(ProgressEvent.SOCKET_DATA, onData);
				_server.addEventListener(IOErrorEvent.IO_ERROR, onIOError);

				_buffer = new ByteArray()
			}
			private function onConnect(e:Event):void
			{
				out_txt.text += &quot;Conexion establecida &quot; + e.toString()+&quot;\n&quot;;
			}
			private function onClose(e:Event):void
			{
				out_txt.text += &quot;Conexion cerrada &quot; + e+&quot;\n&quot;;
			}
			private function onData(e:ProgressEvent):void
			{
				out_txt.text += &quot;Data &quot; + e+&quot;\n&quot;;
				var socket:Socket = e.target as Socket;
				var bufferString:String;
				socket.readBytes(_buffer, _buffer.length, socket.bytesAvailable);
				bufferString = _buffer.toString();
				out_txt.text += &quot;SERVER: &quot; + _buffer.toString()+&quot;\n&quot;;
				if (  bufferString.search( _regSearch ) )
				{
					out_txt.text += &quot;Es una respuesta valida parsea\n&quot;;
					parseResponse();
				}
				cursorManager.removeBusyCursor()
			}
			private function onIOError(e:IOErrorEvent):void
			{
				out_txt.text += &quot;IOError &quot; + e+&quot;\n&quot;;
			}

			private function parseResponse():void
			{
				var bufferString:String = _buffer.toString();
				_buffer.clear();
				if ( _action == CONNECT )
				{
					out_txt.text += &quot;Es es tag de conexion manda login\n&quot;;
					_server.writeUTFBytes(LOGIN + &quot; LOGIN &quot; + _username + &quot; &quot; + _password + CRLF);
					_action = LOGIN;
					_server.flush();
					return;
				}
				if ( _action == LOGIN )
				{
					out_txt.text += &quot;Es la respuesta del login\n&quot;;
					if( bufferString.indexOf(&quot;OK&quot;) != -1 )
					{
						out_txt.text += &quot;El login es correcto, estamos autenticados - Pedir correos sin leer\n&quot;;
						_action = STATUS;
						_server.writeUTFBytes(STATUS + &quot; STATUS inbox (MESSAGES UNSEEN)&quot; + CRLF);
						_server.flush();
					}else
					{
						out_txt.text += &quot;Ooops!! Las credenciales no son validas.\n&quot;;
						Alert.show(&quot;Ooops!! Las credenciales no son validas.&quot;, &quot;Error&quot;);
						_server.close();
					}
					return;
				}
				if( _action == STATUS )
				{
					out_txt.text += &quot;Es la respuesta del Status &quot; + bufferString+&quot;\n&quot;;
					var startSub:int = bufferString.indexOf(&quot;(&quot;);
					var endSub:int = bufferString.indexOf(&quot;)&quot;);
					var message:String = bufferString.substring(startSub+1, endSub);
					var slides:Array = message.split(&quot; &quot;);
					var count:int = 0;
					for each( var slide:String in slides )
					{
						switch( slide )
						{
							case &quot;MESSAGES&quot;:
								_totalMessages = slides[count + 1];
								break;
							case &quot;UNSEEN&quot;:
								_newMessages = slides[count + 1];
								break;
						}
						count++;
					}
					result_txt.text = _newMessages + &quot; mensajes nuevos, de &quot; + _totalMessages + &quot; en total&quot;;
					out_txt.text += _totalMessages;
					out_txt.text += _newMessages;
					_action = null;
					_server.close();
				}
			}

			private function start():void
			{
				out_txt.text = &quot;iniciando Conexion\n&quot;;
				if( _server != null &amp;&amp; _server.connected )
				{
					_server.close();
				}
				if( _username.length &amp;&amp; _password.length )
				{
					_action = CONNECT;
					_server.connect(INCOMING_SERVER, PORT);
					cursorManager.setBusyCursor();
				}else
				{
					Alert.show(&quot;Escribe tus credenciales..&quot;, &quot;Error&quot;);
				}
			}

		]]&gt;
	&lt;/fx:Script&gt;
	&lt;s:Label x=&quot;10&quot; y=&quot;17&quot; text=&quot;Gmail username:&quot;/&gt;
	&lt;s:Label x=&quot;10&quot; y=&quot;45&quot; text=&quot;Gmail password:&quot;/&gt;
	&lt;s:TextInput y=&quot;10&quot; id=&quot;username_txt&quot; change=&quot;_username = username_txt.text&quot; right=&quot;10&quot; left=&quot;120&quot;/&gt;
	&lt;s:TextInput y=&quot;40&quot; id=&quot;password_txt&quot; change=&quot;_password = password_txt.text&quot; displayAsPassword=&quot;true&quot; right=&quot;10&quot; left=&quot;120&quot;/&gt;
	&lt;s:Button y=&quot;70&quot; label=&quot;Tell me!!&quot; click=&quot;start()&quot; right=&quot;10&quot;/&gt;
	&lt;s:Label x=&quot;10&quot; y=&quot;100&quot; width=&quot;280&quot; id=&quot;result_txt&quot;/&gt;
	&lt;s:TextArea id=&quot;out_txt&quot; editable=&quot;false&quot; right=&quot;10&quot; bottom=&quot;10&quot; top=&quot;130&quot; left=&quot;10&quot;/&gt;
&lt;/s:WindowedApplication&gt;
</pre>
<h1>Descarga</h1>
<div style="width: 200px; margin: 10px; text-align: center">
	<p><a rel="nofollow" title="Download version 0.1 of Gmail-Imap.air" href="http://klr20mg.com/downloads/Gmail-Imap.air"><img src="http://klr20mg.com/wp-content/plugins/drain-hole/images/download.png" alt="download" width="128" height="128"/></a></p>

	<table class="download">
		<tr>
			<th>Download:</th>
			<td><a rel="nofollow" title="Download version 0.1 of Gmail-Imap.air" href="http://klr20mg.com/downloads/Gmail-Imap.air">Gmail-Imap.air</a></td>
		</tr>
		<tr>
			<th>Version:</th>
			<td>0.1</td>
		</tr>
		<tr>
			<th>Updated:</th>
			<td>February 26, 2010</td>
		</tr>
		<tr>
			<th>Size:</th>
			<td>870.16 KB</td>
		</tr>
	</table>
</div>

<p>Espero les sea de ayuda y nos estamos leyendo.</p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2010/02/26/air-2-0-conexin-imap-mediante-securesocket/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Adobe Influxis Latin Flash Tour</title>
		<link>http://klr20mg.com/2009/10/22/adobe-influxis-latin-flash-tour/</link>
		<comments>http://klr20mg.com/2009/10/22/adobe-influxis-latin-flash-tour/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 03:16:56 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=455</guid>
		<description><![CDATA[Evento enfocado a todos los entusiastas de la Plataforma Flash en México. Se hablarán de las próximas novedades Flash para iPhone, Flash CS5, Flash Builder, Flash Catalyst y más&#8230; Fecha: 18 de Noviembre 2009. Hora: 9:00 am. a 2:00 pm. Lugar: Universidad Iberoamericana. Dirección: Prolongación Paseo de la Reforma 880, Lomas de Santa Fe, Mexico [...]]]></description>
			<content:encoded><![CDATA[<p style="line-height: normal; padding-top: 0px; padding-right: 0px; padding-bottom: 8px; padding-left: 0px; margin: 0px;">Evento enfocado a todos los entusiastas de la Plataforma Flash en México. Se hablarán de las próximas novedades Flash para iPhone, Flash CS5, Flash Builder, Flash Catalyst y más&#8230;</p>
<p style="line-height: normal; padding-top: 0px; padding-right: 0px; padding-bottom: 8px; padding-left: 0px; margin: 0px;">
<div align='center'>
<p style="line-height: normal; padding-top: 0px; padding-right: 0px; padding-bottom: 8px; padding-left: 0px; margin: 0px;"><a title="Sitio del Evento" href="http://latinflashtourmx.eventbrite.com" target="_blank"><img class="aligncenter size-full wp-image-463" title="Sitio del Evento" src="http://klr20mg.com/wp-content/uploads/2009/10/latinflash.jpg" alt="latinflash" width="450" height="130" /></a></p>
</div>
<p><strong>Fecha:</strong> 18 de Noviembre 2009.<br />
<strong>Hora:</strong> 9:00 am. a 2:00 pm.<br />
<strong>Lugar:</strong> Universidad Iberoamericana.<br />
<strong>Dirección:</strong> Prolongación Paseo de la Reforma 880, Lomas de Santa Fe, Mexico D.F.</p>
<p style="line-height: normal; padding-top: 0px; padding-right: 0px; padding-bottom: 8px; padding-left: 0px; margin: 0px;"><strong>Patrocinado por:</strong></p>
<p><a style="color: #3a3a3a; text-decoration: underline;" href="http://www.adobe.com/" target="_blank">Adobe</a> | <a style="color: #3a3a3a; text-decoration: underline;" href="http://influxis.com/" target="_blank">Influxis</a></p>
<p style="line-height: normal; padding-top: 0px; padding-right: 0px; padding-bottom: 8px; padding-left: 0px; margin: 0px;">
<p style="line-height: normal; padding-top: 0px; padding-right: 0px; padding-bottom: 8px; padding-left: 0px; margin: 0px;">Twitter: <a style="color: #3a3a3a; text-decoration: underline;" href="http://twitter.com/latinflashtour" target="_blank">@latinflashtour</a> hashtag oficial #latinflashtour</p>
<p style="line-height: normal; padding-top: 0px; padding-right: 0px; padding-bottom: 8px; padding-left: 0px; margin: 0px;">
<p style="line-height: normal; padding-top: 0px; padding-right: 0px; padding-bottom: 8px; padding-left: 0px; margin: 0px;"><span style="text-decoration: underline;">Para ingresar al evento se debe presentar impreso el registro</span></p>
<p style="line-height: normal; padding-top: 0px; padding-right: 0px; padding-bottom: 8px; padding-left: 0px; margin: 0px;"><strong>Conferencistas Magistrales:</strong></p>
<p style="line-height: normal; padding-top: 0px; padding-right: 0px; padding-bottom: 8px; padding-left: 0px; margin: 0px;">Todos ellos evangelistas de Adobe para la Plataforma Flash.</p>
<ul>
<li>Lee Brimelow (<a style="color: #3a3a3a; text-decoration: underline;" href="http://theflashblog.com/" target="_blank">The Flash Blog</a> &amp; <a style="color: #3a3a3a; text-decoration: underline;" href="http://www.gotoandlearn.com/" target="_blank">GotoAndLearn</a>)</li>
<li>Enrique Duvos (<a style="color: #3a3a3a; text-decoration: underline;" href="http://www.duvos.com/" target="_blank">RIA Excellence</a> &amp; <a style="color: #3a3a3a; text-decoration: underline;" href="http://www.madeinflex.com/" target="_blank">Made In Flex</a>)</li>
<li>Mike Chambers (<a style="color: #3a3a3a; text-decoration: underline;" href="http://www.mikechambers.com/blog/" target="_blank">Mike&#8217;s Blog</a>)</li>
</ul>
<p style="line-height: normal; padding-top: 0px; padding-right: 0px; padding-bottom: 8px; padding-left: 0px; margin: 0px;">Organizadores:</p>
<p style="line-height: normal; padding-top: 0px; padding-right: 0px; padding-bottom: 8px; padding-left: 0px; margin: 0px;"><a style="color: #3a3a3a; text-decoration: underline;" href="http://www.riactive.com/" target="_blank">RIActive</a> | <a style="color: #3a3a3a; text-decoration: underline;" href="http://www.riahispano.org/" target="_blank">RIAhispano</a> | <a style="color: #3a3a3a; text-decoration: underline;" href="http://flashmc.org/">Flash MC</a></p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2009/10/22/adobe-influxis-latin-flash-tour/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Tweckr, Nuevo proyecto en linea</title>
		<link>http://klr20mg.com/2009/08/05/tweckr-nuevo-proyecto-en-linea/</link>
		<comments>http://klr20mg.com/2009/08/05/tweckr-nuevo-proyecto-en-linea/#comments</comments>
		<pubDate>Wed, 05 Aug 2009 15:44:51 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[Tweckr]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=445</guid>
		<description><![CDATA[En las ultimas semanas he estado trabajando en un nuevo proyecto llamado Tweckr, el cual es un buscador de imágenes en tiempo real para twitter. El día de hoy fue el lanzamiento oficial de este nuevo proyecto y los invito a que lo visiten y me dejen sus impresiones, comentarios, o sugerencias en el blog [...]]]></description>
			<content:encoded><![CDATA[<p>En las ultimas semanas he estado trabajando en un nuevo proyecto llamado Tweckr, el cual es un buscador de imágenes en tiempo real para twitter.</p>
<p>El día de hoy fue el lanzamiento oficial de este nuevo proyecto y los invito a que lo visiten y me dejen sus impresiones, comentarios, o sugerencias en el <a href="http://blog.tweckr.com/">blog de desarrollo</a> del proyecto donde pueden encontrar los <a href="http://blog.tweckr.com/2009/08/hello-world-tweckr-is-alive/">detalles del lanzamiento</a> .</p>
<p>En verdad agradeceré todo el feedback.</p>
<p>Enlace: <a href="http://tweckr.com/">Tweckr, The eyes of twitter</a><br />
Blog: <a href="http://blog.tweckr.com/">Tweckr, The eyes of twitter &#8211; Dev Blog.</a><br />
Twitter: <a href="http://twitter.com/tweckr">@Tweckr</a></p>
<p>Saludos! <img src='http://klr20mg.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2009/08/05/tweckr-nuevo-proyecto-en-linea/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Adobe en Vivo 2009 en su version onLine</title>
		<link>http://klr20mg.com/2009/07/08/adobe-en-vivo-2009-en-su-version-online/</link>
		<comments>http://klr20mg.com/2009/07/08/adobe-en-vivo-2009-en-su-version-online/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 16:12:04 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[Eventos]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=432</guid>
		<description><![CDATA[Como ya saben, Adobe en Vivo es una seria de conferencias internacionales que son de forma presencial organizadas por Adobe User Group Perú (Garage Flash), invitando a los expositores a pasar una semana en Perú, dando conferencias gratuitas y talleres privados. Como este evento se hace de forma anual, hemos pensado hacer una versión onLine [...]]]></description>
			<content:encoded><![CDATA[<p>Como ya saben, <a href="http://www.garageflash.com/adobe-en-vivo-version-online-del-14-al-18-de-julio/" target="_blank">Adobe en Vivo</a> es una seria de conferencias internacionales que son de forma presencial organizadas por <a href="http://www.garageflash.com/" target="_blank">Adobe User Group Perú (Garage Flash)</a>, invitando a los expositores a pasar una semana en Perú, dando conferencias gratuitas y talleres privados. Como este evento se hace de forma anual, hemos pensado hacer una versión onLine con 21 conferencistas entre manager, co-manager, lideres de comunidad y de opinión web.</p>
<p><a href="http://klr20mg.com/wp-content/uploads/2009/07/aev_logo.png"><img class="aligncenter size-full wp-image-433" title="aev_logo" src="http://klr20mg.com/wp-content/uploads/2009/07/aev_logo.png" alt="aev_logo" width="272" height="93" /></a></p>
<h2></h2>
<h1>Martes 14</h1>
<p><strong>Realidad Aumentada</strong><br />
Perú &#8211; <a href="http://www.garageflash.com/" target="_blank">Elder Vásquez</a> (eldervaz)</p>
<p><strong>Entrelazado vs progresivo en After Effects</strong><br />
España &#8211; <a href="http://www.adobelabo.com/" target="_blank">Jorge Mochon</a></p>
<p><strong>Contenido dinámico con InDesign</strong><br />
Colombia &#8211; <a href="http://xpert.com.co/" target="_blank">Marlon Ceballos</a></p>
<p><strong>Haciendo la Web más Dinámica con Premiere, Encore y After Effects</strong><br />
Rep.Dominicana &#8211; <a href="http://www.sdq.com.do/" target="_blank">Luis Sosa</a></p>
<h1>Miércoles 15</h1>
<p><strong>Experiencia del Usuario</strong><br />
México &#8211; <a href="http://www.activ.com.mx/" target="_blank">Edgar Parada</a></p>
<p><strong>Coldfusion 9</strong><br />
Ecuador &#8211; <a href="http://www.adobeenvivo.com/" target="_blank">Michael Borbor</a></p>
<p><strong>LiveCycle</strong><br />
Chile &#8211; <a href="http://www.garageflash.com/" target="_blank">Héctor Castro</a></p>
<p><strong>Técnicas de Alto Rendimiento en Sitios Web</strong><br />
Argentina &#8211; <a href="http://groups.adobe.com/groups/93e61be362/summary" target="_blank">Maximiliano R. Firtman</a></p>
<h1>Jueves 16</h1>
<p><strong>AIR vs Flash Player API&#8217;s</strong><br />
España &#8211; <a href="http://www.joangarnet.com/blog" target="_blank">Joan Garnet</a></p>
<p><strong>Trabajo con Adobe BrowserLab</strong><br />
España &#8211; <a href="http://www.dwug.es/" target="_blank">Andres Cayon</a></p>
<p><strong>ActionScript 3.0</strong><br />
México &#8211; <a href="http://www.activ.com.mx/" target="_blank">Alberto Gonzalez</a></p>
<p><strong>Soluciones para real-time applications</strong><br />
Perú &#8211; <a href="http://funciton.com/" target="_blank">Fernando Flórez</a> (fernando)</p>
<h1>Viernes 17</h1>
<p><strong>Mobile Video &#8211; Dandelion Player for Flash Lite</strong><br />
España &#8211; <a href="http://www.blocketpc.com/" target="_blank">Raul Jimenez</a> (elecash)</p>
<p><strong>Juegos en Flash Lite</strong><br />
España &#8211; <a href="http://www.blocketpc.com/" target="_blank">Marcos González</a></p>
<p><strong>Flash Builder 4 &#8211; Data Centric Development</strong><br />
España &#8211; <a href="http://groups.adobe.com/groups/d542f14d2e/summary" target="_blank">David Lopez</a></p>
<p><strong>ADOBE</strong><br />
EEUU &#8211; <a href="http://groups.adobe.com/pages/home" target="_blank">John Koch</a> &#8211; Community Manager<br />
International Developer Relations Manager</p>
<h1>Sábado 18</h1>
<p><strong>Flash Catalyst</strong><br />
España &#8211; <a href="http://groups.adobe.com/groups/3924ff1ac2/summary" target="_blank">Guillermo de la Iglesia</a> (Zguillez)</p>
<p><strong>El impacto de los Medios sociales</strong><br />
Bolivia &#8211; <a href="http://www.aeromental.com/" target="_blank">Daniel Sempértegui</a> (DanielSemper)</p>
<p><strong>Semántica en XHTML</strong><br />
Perú &#8211; <a href="http://aprendiendoweb.com/" target="_blank">Germán Martínez</a></p>
<p><strong>Promete algo útil</strong><br />
Colombia &#8211; <a href="http://foros.cristalab.com/" target="_blank">Freddie Vega</a> (freddie)</p>
<p><strong>Progressive Enhancement</strong><br />
Venezuela &#8211; <a href="http://thefricky.wordpress.com/" target="_blank">César Frick</a> (thefricky)</p>
<p><strong>Equipos Web en el Mundo Real™</strong><br />
Perú &#8211; <a href="http://indexante.com/" target="_blank">César Soplín</a> (cesars)<br />
Esta conferencia será transmitida por Adobe Connect, y para ello solo tienes que ingresar a la dirección web que será publicada el mismo día del evento.<br />
Verifica la fecha y hora de cada charla en:  <a href="http://www.adobenvivo.com/online/" target="_blank">http://www.adobenvivo.com/online/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2009/07/08/adobe-en-vivo-2009-en-su-version-online/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tweetcoding, Unos meses atrasado, ve el resultado =)</title>
		<link>http://klr20mg.com/2009/07/03/tweetcoding-unos-meses-atrasado-ve-el-resultado/</link>
		<comments>http://klr20mg.com/2009/07/03/tweetcoding-unos-meses-atrasado-ve-el-resultado/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 00:38:16 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[AS3]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=418</guid>
		<description><![CDATA[Hace meses @gskinner convoco a un concurso en donde el reto era hacer una pieza de codigo de menos de 140 caracteres que pudiera ser enviado usando un tweet, Obviamente este codigo debe hacer algo XD, en fin hoy despues de extrañar flash (Ultimamente solo estoy haciendo PHP), me puse a jugar y el resultado [...]]]></description>
			<content:encoded><![CDATA[<p>Hace meses <a href="http://twitter.com/gskinner/">@gskinner</a> convoco a un <a href="http://gskinner.com/playpen/tweetcoding.html">concurso</a> en donde el reto era hacer una pieza de codigo de menos de 140 caracteres que pudiera ser enviado usando un tweet, Obviamente este codigo debe hacer algo XD, en fin hoy despues de extrañar flash (Ultimamente solo estoy haciendo PHP), me puse a jugar y el resultado es este.</p>
<p><strong>La forma del dibujo cambia con cada refresh asi actualiza el navegador unas cuantas veces para que veas la diferencia. <img src='http://klr20mg.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> </strong></p>
<p><strong><span id="more-418"></span><br />
</strong></p>
<p>[FLASH]http://klr20mg.com/wp-content/uploads/2009/07/tweet.swf, 400,400[/FLASH]</p>
<p><a href="http://twitter.com/Tmeister/status/2462268077">Aqui encuentran el Tweet original.</a></p>
<p>Y este el codigo completo</p>
<p>[as]</p>
<p>g=graphics;<br />
mt=g.moveTo;<br />
lt=g.lineTo;<br />
ls=g.lineStyle;<br />
m=Math;<br />
r=m.random;<br />
s=m.sin;<br />
i=0;<br />
o={};</p>
<p>function f(e)<br />
{<br />
if(o.k==null){a=3000;c=.1;x=y=200;o.k=r()*20}i-=.2;w=i*s(a*.1);e=i*m.cos(a*.1);g.beginFill(r()*000099,c);g.drawCircle(w,e,7);c+=.0002;a-=o.k<br />
}<br />
addEventListener(&#8220;enterFrame&#8221;,f);</p>
<p>[/as]</p>
<p>Saludos <img src='http://klr20mg.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2009/07/03/tweetcoding-unos-meses-atrasado-ve-el-resultado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adobe Blueprint, Referencias a la mano.</title>
		<link>http://klr20mg.com/2009/06/12/adobe-blueprint-referencias-a-la-mano/</link>
		<comments>http://klr20mg.com/2009/06/12/adobe-blueprint-referencias-a-la-mano/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 19:04:59 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=383</guid>
		<description><![CDATA[El día de ayer descubrí gracias a un tweet hecho por @yacaFx, un plugin para Flex y Flash Builder llamado BluePrint. Blueprint como ya dije es un plugin que se instala en Flex Builder o Flash Builder el cual permite un acceso rápido a referencias de código sobre un componente, clase o función haciendo la [...]]]></description>
			<content:encoded><![CDATA[<p>El día de ayer descubrí gracias a un <a href="http://twitter.com/yacaFx/status/2124361268" target="_blank">tweet </a>hecho por <a href="http://twitter.com/yacaFx/">@yacaFx</a>, un <a href="http://labs.adobe.com/technologies/blueprint/">plugin</a> para Flex y Flash Builder llamado <a href="http://labs.adobe.com/technologies/blueprint/">BluePrint</a>.</p>
<p><a href="http://labs.adobe.com/technologies/blueprint/">Blueprint </a>como ya dije es un plugin que se instala en Flex Builder o Flash Builder el cual permite un acceso rápido a referencias de código sobre un componente, clase o función haciendo la vida de los desarrolladores un poco mas sencilla (Si eso es posible :p ).</p>
<p>Con una combinacion de teclas ALT+b para Windows o  CTRL+b para Mac, se lanza una ventana de ayuda con las referencias de codigo del elemento seleccionado.</p>
<p>Blueprint se<a href="http://labs.adobe.com/wiki/index.php/Blueprint:Installation_Instructions"> instala de una manera simple y sencilla</a> y sin duda es de gran ayuda.</p>
<p><a href="http://klr20mg.com/wp-content/uploads/2009/06/blueprint.jpg"><img class="aligncenter size-full wp-image-384" title="blueprint" src="http://klr20mg.com/wp-content/uploads/2009/06/blueprint.jpg" alt="blueprint" width="570" height="425" /></a></p>
<p>[Enlace] <a href="http://labs.adobe.com/technologies/blueprint/">Blueprint</a></p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2009/06/12/adobe-blueprint-referencias-a-la-mano/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tips para mejorar el rendimiento de aplicaciones AIR</title>
		<link>http://klr20mg.com/2009/05/07/tips-para-mejorar-el-rendimiento-de-aplicaciones-air/</link>
		<comments>http://klr20mg.com/2009/05/07/tips-para-mejorar-el-rendimiento-de-aplicaciones-air/#comments</comments>
		<pubDate>Thu, 07 May 2009 21:53:07 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[Adobe AIR]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=359</guid>
		<description><![CDATA[Hoy, a partir de un post en el blog de Grant Skinner en donde habla de que el rendimiento de las aplicaciones creadas en AIR no es la optima, han salido a la luz varias recomendaciones o &#8220;Buenas Practicas&#8221; que debemos tener en cuenta al momento de desarrollar una aplicación AIR con Flash. Sin duda [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy, a partir de un <a href="http://www.gskinner.com/blog/archives/2009/05/idle_cpu_usage.html">post en el blog </a>de <a href="http://www.gskinner.com/">Grant Skinner</a> en donde habla de que el rendimiento de las aplicaciones creadas en AIR no es la optima, han salido a la luz varias recomendaciones o &#8220;Buenas Practicas&#8221; que debemos tener en cuenta al momento de desarrollar una aplicación AIR con Flash.</p>
<p>Sin duda son puntos sólidos a temer en cuenta, aquí un par de links que hablan sobre el tema.</p>
<ul>
<li><a href="http://arno.org/arnotify/2009/05/writing-well-behaved-efficient-air-applications/">Writing well-behaved, efficient, AIR applications</a></li>
<li><a href="http://blogs.adobe.com/air/2009/05/performance_tips_for_adobe_air.html">Performance Tips for Adobe AIR </a></li>
</ul>
<p>Saludos! <img src='http://klr20mg.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2009/05/07/tips-para-mejorar-el-rendimiento-de-aplicaciones-air/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Facebook &amp; Adobe: Creando aplicaciones sociales con Flash.</title>
		<link>http://klr20mg.com/2009/03/31/facebook-adobe-creando-aplicaciones-sociales-con-flash/</link>
		<comments>http://klr20mg.com/2009/03/31/facebook-adobe-creando-aplicaciones-sociales-con-flash/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 23:54:05 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[connect]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=295</guid>
		<description><![CDATA[El día de hoy Facebook &#38; Adobe anunciaron una sociedad y han lanzado una librería para Flash, esto es para hacer la vida del desarrollador un poco más fácil (Si eso es posible ) al momento de crear aplicaciones sociales basadas en el API de Facebook. Al día de hoy ya existen varias librerías para [...]]]></description>
			<content:encoded><![CDATA[<p>El día de hoy <a href="http://facebook.com/">Facebook</a> &amp; <a href="http://www.adobe.com">Adobe</a> anunciaron una sociedad y han lanzado una <a href="http://code.google.com/p/facebook-actionscript-api/">librería para Flash</a>, esto es para hacer la vida del desarrollador un poco más fácil (Si eso es posible <img src='http://klr20mg.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ) al momento de crear aplicaciones sociales basadas en el <a href="http://wiki.developers.facebook.com/index.php/API">API de Facebook</a>.</p>
<p>Al día de hoy ya existen varias librerías para consumir el API de facebook en  AS3, pero están incompletas, son muy bugies etc., Es por ello que facebook de asocio con Adobe para crear una librería de AS3 que este a la altura.</p>
<p>Esta librería es oficial y se une a la lista de librerías oficiales, PHP, iPhone y javascript.</p>
<p>Sin duda una de las más grandes ventajas de ser una librería oficial es el hecho de que cuenta con gran documentación e información.</p>
<p>El link de descarga de la librería es  <a href="http://code.google.com/p/facebook-actionscript-api/">ActionScript 3.0 Client Library for Facebook</a><br />
<a href="http://wiki.developers.facebook.com/index.php/Flash/ActionScript">Documentación oficial de facebook</a><br />
<a href="http://www.adobe.com/devnet/facebook/">Documentación oficial de Adobe</a></p>
<p>Bien, con esto tenemos para jugar por un buen tiempo; Así que a programar se ha dicho <img src='http://klr20mg.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Saludos</p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2009/03/31/facebook-adobe-creando-aplicaciones-sociales-con-flash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Acceder el Stage desde cualquier clase AS3</title>
		<link>http://klr20mg.com/2008/11/13/acceder-el-stage-desde-cualquier-clase-as3/</link>
		<comments>http://klr20mg.com/2008/11/13/acceder-el-stage-desde-cualquier-clase-as3/#comments</comments>
		<pubDate>Thu, 13 Nov 2008 22:48:06 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Clases]]></category>
		<category><![CDATA[singlenton]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=224</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>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”.</p>
<p>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?<br />
Aquí la clase</p>
<p>[as]<br />
package net.tmeister.utils<br />
{<br />
	public dynamic class Global<br />
	{<br />
		private static var global : Global</p>
<p>		public static function getInstance() : Global<br />
		{<br />
			if ( global == null )<br />
			{<br />
				global = new Global( arguments.callee );<br />
			}<br />
			return global;<br />
		}</p>
<p>		public function Global( caller : Function = null )<br />
		{<br />
			if ( caller != Global.getInstance )<br />
			{<br />
				throw new Error (&#8220;Global is a singleton class, use getInstance() instead&#8221;);<br />
			}<br />
			if ( Global.global != null )<br />
			{<br />
				throw new Error( &#8220;Only one Global instance should be instantiated&#8221; );<br />
			}<br />
		}<br />
	}<br />
}<br />
[/as]</p>
<p>Y su modo de uso.</p>
<p>[as]<br />
package<br />
{<br />
	import flash.display.MovieClip;<br />
	import net.tmeister.utils.Global<br />
	public class Main extends MovieClip<br />
	{<br />
		private var global:Global;</p>
<p>		public function Main()<br />
		{<br />
			global = Global.getInstance();<br />
			global.stage = stage<br />
			trace(&#8216;global.stage&#8217; + global.stage)<br />
			global.algunOtroValor = new MovieClip()<br />
			trace(&#8216;global.algunOtroValor &#8216; + global.algunOtroValor)<br />
		}<br />
	}<br />
}<br />
[/as]</p>
<p>Simple.</p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2008/11/13/acceder-el-stage-desde-cualquier-clase-as3/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Flash CS4, A la vuelta de la esquina.</title>
		<link>http://klr20mg.com/2008/10/10/flash-cs4-a-la-vuelta-de-la-esquina/</link>
		<comments>http://klr20mg.com/2008/10/10/flash-cs4-a-la-vuelta-de-la-esquina/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 23:14:09 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[ActionScript]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=213</guid>
		<description><![CDATA[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/&#8230;html Programming ActionScript 3.0 http://help.adobe.com/&#8230;./ 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/&#8230;/index.html Con esto, sin duda, ya tenemos para entretenernos un bien [...]]]></description>
			<content:encoded><![CDATA[<p>Como ya sabrán, la nueva suite de Adobe esta por ser lanzada, y para abrir boca, la documentación ya esta disponible.</p>
<p><strong>Main help portal</strong><br />
<a href="http://help.adobe.com/en_US/Flash/10.0_Welcome/">http://help.adobe.com/en_US/Flash/10.0_Welcome/</a></p>
<p><strong>New features</strong><br />
<a href="http://help.adobe.com/en_US/Flash/10.0_UsingFlash/WS9F717870-8AED-438d-B324-44ACCE6871E8a.html">http://help.adobe.com/en_US/&#8230;html</a></p>
<p><strong>Programming ActionScript 3.0</strong><br />
<a href="http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/">http://help.adobe.com/&#8230;./</a></p>
<p><strong>ActionScript 3.0 Language and Components Reference</strong><br />
<a href="http://help.adobe.com/en_US/AS3LCR/Flash_10.0/index.html">http://help.adobe.com/en_US/AS3LCR/Flash_10.0/index.html</a></p>
<p><strong>Extending Adobe Flash Professional CS4</strong><br />
<a href="http://help.adobe.com/en_US/Flash/10.0_ExtendingFlash/index.html">http://help.adobe.com/&#8230;/index.html</a></p>
<p>Con esto, sin duda, ya tenemos para entretenernos un bien tiempo.</p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2008/10/10/flash-cs4-a-la-vuelta-de-la-esquina/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Clase TiledBackground</title>
		<link>http://klr20mg.com/2008/07/04/clase-tiledbackground/</link>
		<comments>http://klr20mg.com/2008/07/04/clase-tiledbackground/#comments</comments>
		<pubDate>Fri, 04 Jul 2008 23:00:11 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Background]]></category>
		<category><![CDATA[tiled]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=204</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>Que tal gente. </p>
<p>Hace un buen rato que no posteo, pero aquí estoy de vuelta con algo sencillo.<br />
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 <img src='http://klr20mg.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>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.</p>
<p>TiledBackground<br />
[as]<br />
package net.tmeister.utils.background<br />
{</p>
<p>	import flash.display.BitmapData;<br />
	import flash.display.Loader;<br />
	import flash.display.Sprite;<br />
	import flash.display.Stage;<br />
	import flash.events.Event;<br />
	import flash.geom.Matrix;<br />
	import flash.net.URLRequest;<br />
	import flash.display.StageScaleMode;<br />
	import flash.display.StageAlign;<br />
	import flash.display.GradientType;  </p>
<p>	public class TiledBackground extends Sprite<br />
	{<br />
		private var _pattern:String;<br />
		private var _container:Sprite;<br />
		private var _image:Loader;<br />
		private var _stage:Stage;<br />
		private var _gradient:Boolean = true;<br />
		private var _gProperties:Object = {};</p>
<p>		public function TiledBackground(stage:Stage)<br />
		{<br />
			_stage = stage<br />
			_stage.scaleMode = StageScaleMode.NO_SCALE;<br />
			_stage.align = StageAlign.TOP_LEFT;<br />
			_stage.addEventListener(Event.RESIZE, resize);<br />
		}<br />
		public function set pattern (urlPattern:String):void<br />
		{<br />
			_pattern = urlPattern;<br />
			loadPattern();<br />
		}<br />
		public function get pattern():String<br />
		{<br />
			return _pattern;<br />
		}<br />
		public function set radialGradient(value:Boolean):void<br />
		{<br />
			_gradient = value;<br />
		}<br />
		public function get radialGradient():Boolean<br />
		{<br />
			return _gradient;<br />
		}<br />
		public function set gradientProperties(properties:Object):void<br />
		{<br />
			_gProperties = properties;<br />
		}<br />
		public function get gradientProperties():Object<br />
		{<br />
			return _gProperties;<br />
		}<br />
		private function loadPattern():void<br />
		{<br />
			var patternLoader:Loader = new Loader();<br />
			var patternUrl:URLRequest = new URLRequest(_pattern);<br />
			patternLoader.load(patternUrl);<br />
			patternLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onPatternLoaded);<br />
		}<br />
		private function onPatternLoaded(e:Event):void<br />
		{<br />
			_image = e.target.loader;<br />
			createBackground();<br />
			createRadialGradient()<br />
		}<br />
		private function createBackground():void<br />
		{<br />
			if (_container != null)<br />
			{<br />
				removeChild(_container);<br />
				_container = null;<br />
			}<br />
			var bitmap:BitmapData = new BitmapData (_image.width, _image.height);<br />
			bitmap.draw(_image)<br />
			_container = new Sprite();<br />
			_container.graphics.beginBitmapFill(bitmap);<br />
			_container.graphics.drawRect(0,0, _stage.stageWidth , _stage.stageHeight);<br />
			_container.graphics.endFill();<br />
			addChild(_container);<br />
		}</p>
<p>		private function createRadialGradient():void<br />
		{<br />
			if (! _gradient )<br />
			{<br />
				return;<br />
			}<br />
			var matrix:Matrix = new Matrix();<br />
			var gType:String = GradientType.RADIAL;<br />
			matrix.createGradientBox(_stage.stageWidth,_stage.stageHeight,0,0,0);<br />
			var gColors:Array = [(_gProperties.insideColor) ? _gProperties.insideColor : 0xffffff, (_gProperties.outsideColor) ? _gProperties.outsideColor : 0xffffff];<br />
			var gAlphas:Array = [(_gProperties.insideColorAlpha) ? _gProperties.insideColorAlpha : .15 ,(_gProperties.outsideColorAlpha) ? _gProperties.outsideColorAlpha : 0];<br />
			var gRatio:Array = [0,255];<br />
			var bound:Sprite = new Sprite();<br />
			bound.graphics.beginGradientFill(gType,gColors,gAlphas,gRatio,matrix);<br />
			bound.graphics.drawRect(0,0,_stage.stageWidth,_stage.stageHeight);<br />
			addChild(bound);<br />
		}<br />
		private function resize(e:Event):void<br />
		{<br />
			createBackground();<br />
			createRadialGradient()<br />
		}<br />
	}<br />
}<br />
[/as]<br />
Uso:</p>
<p>[as]<br />
package<br />
{<br />
	import flash.display.Sprite;<br />
	import net.tmeister.utils.background.TiledBackground</p>
<p>	public class sampleTiled extends Sprite<br />
	{<br />
		public function sampleTiled()<br />
		{<br />
			var background:TiledBackground = new TiledBackground(stage);<br />
			background.pattern = &#8220;bg1.gif&#8221;<br />
			background.gradientProperties = {insideColor:0xffffff, outsideColor:0xffffff, insideColorAlpha:.05, outsideColorAlpha:0}<br />
			addChild(background)<br />
		}<br />
	}<br />
}<br />
[/as]</p>
<p><a href="http://klr20mg.com/tiled/">Aquí el ejemplo</a> y como siempre los archivos fuente están disponibles.</p>
<div class="legend">
<h3 class="legend-title">Archivos para descarga</h3>
<table>
<tr>
<td><div style="width: 200px; margin: 10px; text-align: center">
	<p><a rel="nofollow" title="Download version 0.1 of TiledBackground.zip" href="http://klr20mg.com/downloads/TiledBackground.zip"><img src="http://klr20mg.com/wp-content/plugins/drain-hole/images/download.png" alt="download" width="128" height="128"/></a></p>

	<table class="download">
		<tr>
			<th>Download:</th>
			<td><a rel="nofollow" title="Download version 0.1 of TiledBackground.zip" href="http://klr20mg.com/downloads/TiledBackground.zip">TiledBackground.zip</a></td>
		</tr>
		<tr>
			<th>Version:</th>
			<td>0.1</td>
		</tr>
		<tr>
			<th>Updated:</th>
			<td>July 4, 2008</td>
		</tr>
		<tr>
			<th>Size:</th>
			<td>12.42 KB</td>
		</tr>
	</table>
</div>
</td>
</tr>
</table>
</div>
<p>Saludos!! </p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2008/07/04/clase-tiledbackground/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Obteniendo los hijos de un DisplayObject [AS3]</title>
		<link>http://klr20mg.com/2008/04/01/obteniendo-los-hijos-de-un-displayobject-as3/</link>
		<comments>http://klr20mg.com/2008/04/01/obteniendo-los-hijos-de-un-displayobject-as3/#comments</comments>
		<pubDate>Tue, 01 Apr 2008 20:51:28 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Clases]]></category>
		<category><![CDATA[DisplayObject]]></category>
		<category><![CDATA[Utils]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=201</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>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:</p>
<p><strong>getAllChilds</strong></p>
<p>Regresa todos los hijos contenidos en el “target”</p>
<p><strong>getChildsByType</strong></p>
<p>Regresa solo los hijos que sean de un tipo específico, por ejemplo solo MovieClips, o solo Botones.</p>
<h2>DisplayObjectUtils</h2>
<p>[as]<br />
package net.tmeister.utils<br />
{<br />
	/**<br />
	 * @author Enrique Chavez aka Tmeister<br />
	 */<br />
	import flash.display.DisplayObject;<br />
	public class DisplayObjectUtils<br />
	{<br />
		/**<br />
		 *<br />
		 * @param	target<br />
		 * @return Array<br />
		 */<br />
		public static function getAllChilds(target:*):Array<br />
		{<br />
			var listTmp:Array = []<br />
			for (var a = 0; a < target.numChildren; a++ )<br />
			{<br />
				listTmp.push (target.getChildAt(a) )<br />
			}<br />
			return listTmp<br />
		}<br />
		/**<br />
		 *<br />
		 * @param	target<br />
		 * @param	type<br />
		 * @return<br />
		 */<br />
		public static function getChildsByType(target:*, type:*):Array<br />
		{<br />
			var listTmp:Array = []<br />
			for (var a = 0; a < target.numChildren; a++ )<br />
			{<br />
				if (target.getChildAt(a) is type)<br />
				{<br />
					listTmp.push (target.getChildAt(a) )<br />
				}<br />
			}<br />
			return listTmp<br />
		}<br />
	}<br />
}<br />
[/as]</p>
<p>Su uso es el siguiente:</p>
<p>Primero creamos unos Movieclips y unos botones para tener algo que buscar.</p>
<p>[as]<br />
import net.tmeister.utils.DisplayObjectUtils;<br />
import fl.controls.Button</p>
<p>createMovieClips()<br />
createButtons()<br />
getChilds()</p>
<p>function createButtons()<br />
{<br />
	for(var a:Number = 0; a<2; a++)<br />
	{<br />
		var tmp:Button = new Button();<br />
		tmp.x = Math.random()*400<br />
		tmp.y = Math.random()*400<br />
		tmp.label = &#8220;buton&#8221;+a<br />
		addChild(tmp)<br />
	}<br />
}<br />
function createMovieClips()<br />
{<br />
	for(var a:Number = 0; a<5; a++)<br />
	{<br />
		var tmp:MovieClip = new MovieClip();<br />
		tmp.graphics.beginFill(0x2a2a2a, .5)<br />
		tmp.graphics.drawRect(Math.random()*500, Math.random()*300, Math.random()*100, Math.random()*100);<br />
		tmp.graphics.endFill();<br />
		tmp.name = &#8220;mc&#8221;+a;<br />
		addChild(tmp)<br />
	}<br />
}<br />
function getChilds()<br />
{<br />
	trace(&#8220;All Childs: &#8221; + DisplayObjectUtils.getAllChilds(this) )<br />
	trace(&#8220;=====================================================================================&#8221;)<br />
	trace(&#8220;Movieclips:  &#8221; + DisplayObjectUtils.getChildsByType(this, MovieClip))<br />
	trace(&#8220;=====================================================================================&#8221;)<br />
	trace(&#8220;Buttons:  &#8221; + DisplayObjectUtils.getChildsByType(this, Button))</p>
<p>}</p>
<p>[/as]</p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2008/04/01/obteniendo-los-hijos-de-un-displayobject-as3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Advanced round class AS3</title>
		<link>http://klr20mg.com/2008/03/31/advanced-round-as3/</link>
		<comments>http://klr20mg.com/2008/03/31/advanced-round-as3/#comments</comments>
		<pubDate>Tue, 01 Apr 2008 01:06:02 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Clases]]></category>
		<category><![CDATA[Math]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=200</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>Esta es una clase de mucha ayuda para cuando queramos redondear números de una forma más avanzada.</p>
<p>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.</p>
<p>Para ello escribí esta sencilla clase que lo permite.</p>
<p>[as]<br />
package net.tmeister.utils<br />
{<br />
	/**<br />
	 *<br />
	 * Advanced Round Class<br />
	 * @version 0.1<br />
	 * @author Enrique Chavez aka Tmeister<br />
	 *<br />
	*/<br />
	public class MathUtils<br />
	{<br />
		/**<br />
		 *<br />
		 * Rounds a Number to the nearest multiple<br />
		 * @param	number Number to Round<br />
		 * @param	precision multiple to be rounded<br />
		 * @return 	A number round<br />
		 *<br />
		 */<br />
		public static function roundToNear(number:Number, precision:Number)<br />
		{<br />
			return Math.round( number / precision) * precision;<br />
		}<br />
		/**<br />
		 *<br />
		 * Rounds a Number up to the nearest multiple<br />
		 * @param	number Number to Round<br />
		 * @param	precision multiple to be rounded<br />
		 * @return 	A number Up round<br />
		 *<br />
		 */<br />
		public static function roundToUpNear(number:Number, precision:Number)<br />
		{<br />
			return Math.ceil( number / precision) * precision;<br />
		}<br />
		/**<br />
		 *<br />
		 * Rounds a Number down to the nearest multiple<br />
		 * @param	number number Number to Round<br />
		 * @param	precision multiple to be rounded<br />
		 * @return 	A number down round<br />
		 *<br />
		 */<br />
		public static function roundToDownNear(number:Number, precision:Number)<br />
		{<br />
			return Math.floor( number / precision) * precision;<br />
		}<br />
	}<br />
}<br />
[/as]</p>
<p>Modo de uso es tan simple como esto.</p>
<p>[as]<br />
import net.tmeister.utils.MathUtils;</p>
<p>const number:Number = 38<br />
const precision:Number = 5</p>
<p>trace(MathUtils.roundToNear(number, precision)) // 40<br />
trace(MathUtils.roundToUpNear(number, precision)) // 40<br />
trace(MathUtils.roundToDownNear(number, precision)) // 35<br />
[/as]</p>
<p>Enjoy <img src='http://klr20mg.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2008/03/31/advanced-round-as3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PureMVC :: ValueObjects</title>
		<link>http://klr20mg.com/2008/03/26/puremvc-valueobjects/</link>
		<comments>http://klr20mg.com/2008/03/26/puremvc-valueobjects/#comments</comments>
		<pubDate>Thu, 27 Mar 2008 05:34:09 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[AMFPHP]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PureMVC]]></category>
		<category><![CDATA[ActionScript3]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=199</guid>
		<description><![CDATA[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: Los VO son contenedores de información representada [...]]]></description>
			<content:encoded><![CDATA[<p>Los ValueObjects son indispensables al momento de trabajar con MVC o sin el <img src='http://klr20mg.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>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:</p>
<ol>
<li>Los VO son contenedores de información representada por una clase individual.</li>
<li>Los VO son serializables, es decir, pueden ser enviados entre un servidor y un cliente mantenido sus propiedades.</li>
</ol>
<p>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:</p>
<ul class="stars">
<li>idUnique</li>
<li>author</li>
<li>url</li>
<li>content</li>
</ul>
<p>Los mensajes siempre contendrán estas propiedades vengan de donde vengan.</p>
<p>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.</p>
<p>[as]</p>
<p>package com.klr20mg.pureMVC.guestbook.model.vo<br />
{<br />
    [RemoteClass(alias="MessagesVO")]<br />
    [Bindable]<br />
    public class MessagesVO<br />
    {<br />
        public var idUnique:String;<br />
        public var author:String;<br />
        public var url:String;<br />
        public var content:String;<br />
        public function MessagesVO(author:String=null, url:String=null, content:String=null)<br />
        {<br />
            this.idUnique = &#8220;&#8221;<br />
            this.author = author;<br />
            this.url = url;<br />
            this.content = content;<br />
        }<br />
    }<br />
}</p>
<p>[/as]</p>
<p>Hay 2 formas comunes de &#8220;poblar&#8221; los VO mediante el constructor, como en este ejemplo o mediante getters y setters, yo prefiero la primera.</p>
<p>Ahora vamos crear un VO a partir de la clase anterior</p>
<p>[as]</p>
<p>package com.klr20mg.pureMVC.guestbook<br />
{<br />
    import com.klr20mg.pureMVC.guestbook.model.vo.MessagesVO<br />
    public class someClass<br />
    {<br />
        public function someClass()<br />
        {<br />
            var miVO:MessagesVO = new MessagesVO(&#8220;Tmeister&#8221;, &#8220;http://tmeister.net&#8221;, &#8220;Este es un mensaje de prueba&#8221;);<br />
            trace(miVO)<br />
        }<br />
    }<br />
}</p>
<p>[/as]</p>
<p>Con esto hemos creado un VO de acuerdo a la primera clase.</p>
<p>Los VO son &#8220;compatibles&#8221; entre el cliente y el servidor según el punto numero 2, y al usar AMFPHP, WebOrb entre otros podemos enviar arrays de VO&#8217;s entre el server y el cliente sin ningún problema, pero entonces debemos de crear nuestros VO&#8217;s en el servidor en este caso usando PHP para poder &#8220;mapear&#8221; esta información.</p>
<pre class="brush: php;">

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

    public function MessagesVO()
    {
    }
    public function mapObject($data)
    {
        $this-&gt;idUnique = $data[&quot;idUnique&quot;];
        $this-&gt;author = $data[&quot;author&quot;];
        $this-&gt;url = $data[&quot;url&quot;];
        $this-&gt;content = $data[&quot;content&quot;];
    }
}
?&gt;
</pre>
<p>Como pueden ver es el mismo concepto encapsular la información en una clase.</p>
<p>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&#8217;s.</p>
<p>Espero que con esto quede claro que son y para que usan los ValueObjects</p>
<p>Saludos <img src='http://klr20mg.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2008/03/26/puremvc-valueobjects/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Trabajando con SQLite, AIR y FLASH CS3</title>
		<link>http://klr20mg.com/2008/01/17/trabajando-con-sqlite-air-y-flash-cs3/</link>
		<comments>http://klr20mg.com/2008/01/17/trabajando-con-sqlite-air-y-flash-cs3/#comments</comments>
		<pubDate>Thu, 17 Jan 2008 18:34:06 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[Adobe AIR]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://klr20mg.com/2008/01/17/trabajando-con-sqlite-air-y-flash-cs3/</guid>
		<description><![CDATA[Air desde su versión beta 2 si no mal recuerdo trae integrado un engine de base de datos SQL mediante SQLite. ¿Que significa esto? Significa que podemos crear base de datos locales desde nuestra aplicación de AIR sin la necesidad de que el usuario final instale nada más que el Runtime de AIR. Con esto [...]]]></description>
			<content:encoded><![CDATA[<p><span class="dropcap">A</span>ir desde su versión beta 2 si no mal recuerdo trae integrado un engine de base de datos SQL mediante SQLite.</p>
<p>¿Que significa esto?</p>
<p>Significa que podemos crear base de datos locales desde nuestra aplicación de AIR sin la necesidad de que el usuario final instale nada más que el Runtime de AIR.</p>
<p>Con esto podemos crear eliminar modificar bases de datos, tablas, registro etc.</p>
<p>Para propósitos de este tutorial vamos a crear un simple cliente que cree una base de datos si no existe, que cree la tabla con la cual trabajaremos y donde consultaremos, agregaremos y eliminaremos entradas.</p>
<p>Cabe mencionar que para efectos prácticos no posteare todo el código en cada ejemplo. Al final del tutorial estará la clase final así como los archivos fuente para su estudio <img src='http://klr20mg.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h2>Creación de Base de Datos</h2>
<p>Al ser una base de datos local, evidentemente dicho archivo se tiene que crear en la maquina del usuario, para saber si la base de datos existe o no, debemos verificar si el archivo existe, para ello hacemos uso de la Clase File</p>
<p>[as]<br />
package com.tmeister.samples.sql<br />
{<br />
	import flash.filesystem.File;</p>
<p>	public class sqlSample extends MovieClip<br />
	{<br />
		private var db:File;</p>
<p>		public function sqlSample()<br />
		{<br />
			db = File.applicationStorageDirectory.resolvePath(&#8220;myFirst.db&#8221;);<br />
			(!db.exists) ? createDatabase() : dbExist();<br />
		}<br />
		private function createDatabase()<br />
		{<br />
			trace(&#8220;Creamos la BD&#8221;)<br />
		}<br />
		private function dbExist()<br />
		{<br />
			trace(&#8220;La Base de datos ya existe&#8221;)<br />
		}<br />
	}<br />
}<br />
[/as]</p>
<p><span id="more-178"></span></p>
<p>Con esto sabremos si la base de datos existe o no, si dicha base de datos no existe debemos crearla, pero antes de poder crearla debemos crear una instancia de la clase SQLConnection para poder conectarnos con el engine y después de esto entonces si crear la BD.</p>
<p>[as]<br />
//Importamos las clases para trabajar con SQLite<br />
import flash.data.SQLConnection;<br />
import flash.events.SQLErrorEvent;<br />
import flash.events.SQLEvent;</p>
<p>//Creamos una nueva conexion y seteamos sus respectivos handlers<br />
conn = new SQLConnection();<br />
conn.addEventListener(SQLEvent.OPEN, dbConnOpen);<br />
conn.addEventListener(SQLErrorEvent.ERROR, dbConnError);</p>
<p>//&#8221;Abrimos&#8221; la base de datos, si no existe se crea<br />
conn.openAsync(db);</p>
<p>// Handlers de los eventos<br />
private function dbConnOpen(e:SQLEvent)<br />
{<br />
	trace(&#8220;Se conecto a la base de datos &#8220;)<br />
	trace(&#8220;Ya podemos hacer uso de la base de datos.&#8221;)<br />
}<br />
private function dbConnError(e:SQLErrorEvent)<br />
{<br />
	trace(&#8220;Error al conectarse a la base de datos&#8221;);<br />
	trace(e)<br />
}<br />
[/as]</p>
<p>En esta parte de código asignamos 2 listeners a conn que es nuestra conexión con el engine, Los listeners son:</p>
<ul>
<li><span class="highlight">SQLEvent.OPEN</span> : El cual se ejecuta cuando la base de datos esta lista para ser usada.</li>
<li><span class="highlight">SQLErrorEvent.ERROR</span> : El cual se ejecuta si un error ocurrió al momento de intentar acceder a la base de datos.</li>
</ul>
<p>La línea “mágica” es </p>
<p>[as]<br />
conn.openAsync(db);<br />
[/as]</p>
<p>Con esta instrucción abrimos la base de datos pasando como referencia el archivo respectivo, si el archivo no existe se crea automáticamente. Hay dos formas de trabajar con SQLite, de forma <span class="highlight">Síncrona</span> o <span class="highlight">Asíncrona</span>, en este ejemplo trabajamos con la segunda opción, en una entrada posterior tratare de explicar las diferencias entre cada una de ellas.</p>
<p>Con esto ya tenemos una base de datos creada ahora lo siguiente es crear un tabla</p>
<h2>Creación de Tablas</h2>
<p>Una vez que ya tenemos nuestra base de datos ahora necesitamos una tabla en donde insertar datos.</p>
<p>Las interacciones hacia la base de datos es exactamente igual que en otros lenguajes de programación (dígase PHP), se crea la conexión a la base de datos se escribe el SQL y se ejecuta la instrucción.</p>
<p>Lo único que cambia en AS3 es que debemos crear una instancia de la clase SQLStatement en la cual seteamos que conexión a DB usar, asignar la cadena de consulta o ejecución (SQL) y asignar los valores.</p>
<p>Todo esto se resume a lo siguiente.</p>
<p>[as]<br />
import flash.events.SQLErrorEvent;<br />
import flash.events.SQLEvent;</p>
<p>private const TABLE_NAME:String = &#8220;people&#8221;</p>
<p>//Creamos una instancia de la clase<br />
var dbManager:SQLStatement = new SQLStatement();</p>
<p>//Asignamos la conexion a la base de datos<br />
dbManager.sqlConnection  = conn</p>
<p>//Asignamos listeners a los eventos<br />
dbManager.addEventListener(SQLErrorEvent.ERROR, sqlError);<br />
dbManager.addEventListener(SQLEvent.RESULT, tableResult);</p>
<p>//Sentencia a ejecutar<br />
var sql:String = &#8220;CREATE TABLE &#8221; + TABLE_NAME + &#8221; (&#8220;;<br />
sql += &#8220;id INTEGER PRIMARY KEY AUTOINCREMENT,&#8221;<br />
sql += &#8220;name TEXT,&#8221;;<br />
sql += &#8220;age NUMERIC&#8221;;<br />
sql += &#8220;)&#8221;;</p>
<p>//La sentencia SQL debe ser asignada a la propiedad text del SQLStatement<br />
dbManager.text = sql;</p>
<p>//Por ultimo ejecutamos la sentencia<br />
dbManager.execute();</p>
<p>//Handlers<br />
private function tableResult(e:SQLEvent)<br />
{<br />
	trace(&#8220;La tabla se creo correctamente&#8221;);<br />
}<br />
private function sqlError(e:SQLErrorEvent)<br />
{<br />
	trace(&#8220;Error: &#8220;+ e.error.message);<br />
	trace(&#8220;Detalles: &#8220;+ e.error.details);<br />
}<br />
[/as]</p>
<h2>Inserts</h2>
<p>Como mencione antes todas las interacciones con la base de datos se deben de hacer mediante una instancia de la clase SQLStatement. Lo único que cambia de acuerdo con el ejemplo anterior (Creación de tablas) es la sentencia SQL  y la asignación de los valores de los campos.</p>
<p>Ejemplo de Insert</p>
<p>[as]<br />
import flash.events.SQLErrorEvent;<br />
import flash.events.SQLEvent;</p>
<p>//Creamos una instancia de la clase<br />
var insertManager:SQLStatement = new SQLStatement();</p>
<p>//Asignamos la conexion a la base de datos<br />
insertManager.sqlConnection = conn;</p>
<p>//Asignamos listeners a los eventos<br />
insertManager.addEventListener(SQLEvent.RESULT, insertResult);<br />
insertManager.addEventListener(SQLErrorEvent.ERROR, sqlError);</p>
<p>//Sentencia a ejecutar<br />
var sql:String = &#8220;INSERT INTO &#8221; + TABLE_NAME + &#8221; (name, age) VALUES (:name, :age)&#8221;;</p>
<p>//Asignacion de valor a los parametros de la sentencia<br />
insertManager.parameters[":name"] = &#8220;Tmeister&#8221;;<br />
insertManager.parameters[":age"] = &#8220;29&#8243;;</p>
<p>//La sentencia SQL debe ser asignada a la propiedad text del SQLStatement<br />
insertManager.text = sql;</p>
<p>//Por ultimo ejecutamos la sentencia<br />
insertManager.execute();</p>
<p>//Handlers<br />
private function tableResult(e:SQLEvent)<br />
{<br />
	trace(&#8220;La tabla se creo correctamente&#8221;);<br />
}<br />
private function sqlError(e:SQLErrorEvent)<br />
{<br />
	trace(&#8220;Error: &#8220;+ e.error.message);<br />
	trace(&#8220;Detalles: &#8220;+ e.error.details);<br />
}<br />
[/as]</p>
<p>Aqui vemos cosas nuevas en la sentencia.</p>
<p>Primero </p>
<p>[as]<br />
var sql:String = &#8220;INSERT INTO &#8221; + TABLE_NAME + &#8221; (name, age) VALUES (:name, :age)&#8221;;<br />
[/as]</p>
<p>Si pueden ver los valores de los campos están precedidos de dos puntos <span class="highlight">:</span> esto significa que son parámetros de la sentencia.</p>
<p>La clase SQLStatement tiene una propiedad llamada parameters que es un Array en donde se tiene que asignar el valor de cada parámetro escrito en nuestra sentencia, en este ejemplo tenemos 2 parámetros <span class="highlight">:name</span> y <span class="highlight">:age</span> entonces necesitamos asignarle valores esto se hace con estas líneas</p>
<p>[as]<br />
insertManager.parameters[":name"] = &#8220;Tmeister&#8221;;<br />
insertManager.parameters[":age"] = &#8220;29&#8243;;<br />
[/as]</p>
<p>En realidad es algo simple. no?</p>
<h2>Obteniendo datos de la base de datos</h2>
<p>Para obtener datos de la base de datos es exactamente lo mismo que hicimos para crear la tabla, solamente cambia la sentencia SQL</p>
<p>[as]<br />
import flash.events.SQLErrorEvent;<br />
import flash.events.SQLEvent;<br />
import flash.data.SQLStatement;</p>
<p>private const TABLE_NAME:String = &#8220;people&#8221;</p>
<p>//Creamos una instancia de la clase<br />
var query:SQLStatement = new SQLStatement();</p>
<p>//Asignamos la conexion a la base de datos<br />
query.sqlConnection = conn</p>
<p>//Asignamos listeners a los eventos<br />
query.addEventListener(SQLErrorEvent.ERROR, sqlError);<br />
query.addEventListener(SQLEvent.RESULT, sqlResult);</p>
<p>//Sentencia a ejecutar<br />
var sql:String = &#8220;SELECT * FROM &#8221; + TABLE_NAME + &#8221; order by id&#8221;;</p>
<p>//La sentencia SQL debe ser asignada a la propiedad text del SQLStatement<br />
query.text = sql;</p>
<p>//Por ultimo ejecutamos la sentencia<br />
query.execute();</p>
<p>private function sqlError(e:SQLErrorEvent)<br />
{<br />
	trace(&#8220;Error: &#8220;+ e.error.message);<br />
	trace(&#8220;Detalles: &#8220;+ e.error.details);<br />
}<br />
private function sqlResult(e:SQLEvent)<br />
{<br />
	var result:SQLResult = e.target.getResult();<br />
	for each ( var row:Object in result.data)<br />
	{<br />
		trace(row)<br />
		trace(row.id)<br />
		trace(row.name)<br />
		//etc<br />
	}<br />
}<br />
[/as]</p>
<p>Para obtener el resultado de la consulta de debemos ejecutar la función getResult de la instancia SQLStatement.</p>
<p>[as]<br />
var result:SQLResult = e.target.getResult();<br />
[/as]</p>
<p>Por último solo queda recorrer los resultados, que son devueltos como objetos</p>
<p>[as]<br />
for each ( var row:Object in result.data)<br />
	{<br />
		trace(row)<br />
		trace(row.id)<br />
		trace(row.name)<br />
		//etc<br />
	}<br />
[/as]</p>
<p>Con esto ya podemos comenzar a trabajar con SQLite para manejar información en la maquina local del usuario final.</p>
<div class="legend">
<h3 class="legend-title">Archivos para descarga</h3>
<table>
<tr>
<td><div style="width: 200px; margin: 10px; text-align: center">
	<p><a rel="nofollow" title="Download version 0.1 of SQLite.zip" href="http://klr20mg.com/downloads/SQLite.zip"><img src="http://klr20mg.com/wp-content/plugins/drain-hole/images/download.png" alt="download" width="128" height="128"/></a></p>

	<table class="download">
		<tr>
			<th>Download:</th>
			<td><a rel="nofollow" title="Download version 0.1 of SQLite.zip" href="http://klr20mg.com/downloads/SQLite.zip">SQLite</a></td>
		</tr>
		<tr>
			<th>Version:</th>
			<td>0.1</td>
		</tr>
		<tr>
			<th>Updated:</th>
			<td>January 17, 2008</td>
		</tr>
		<tr>
			<th>Size:</th>
			<td>898.21 KB</td>
		</tr>
	</table>
</div>
</td>
<td><div style="width: 200px; margin: 10px; text-align: center">
	<p><a rel="nofollow" title="Download version 0.1 of SQLSample.air" href="http://klr20mg.com/downloads/SQLSample.air"><img src="http://klr20mg.com/wp-content/plugins/drain-hole/images/download.png" alt="download" width="128" height="128"/></a></p>

	<table class="download">
		<tr>
			<th>Download:</th>
			<td><a rel="nofollow" title="Download version 0.1 of SQLSample.air" href="http://klr20mg.com/downloads/SQLSample.air">SQLSample</a></td>
		</tr>
		<tr>
			<th>Version:</th>
			<td>0.1</td>
		</tr>
		<tr>
			<th>Updated:</th>
			<td>January 17, 2008</td>
		</tr>
		<tr>
			<th>Size:</th>
			<td>78.04 KB</td>
		</tr>
	</table>
</div>
</td>
</tr>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2008/01/17/trabajando-con-sqlite-air-y-flash-cs3/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>
