<?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; Adobe AIR</title>
	<atom:link href="http://klr20mg.com/category/air/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>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>2do Lugar en AIR Contest 2008 de MadeInFlex</title>
		<link>http://klr20mg.com/2008/11/06/2do-lugar-en-air-contest-2008-de-madeinflex/</link>
		<comments>http://klr20mg.com/2008/11/06/2do-lugar-en-air-contest-2008-de-madeinflex/#comments</comments>
		<pubDate>Thu, 06 Nov 2008 19:15:59 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[Adobe AIR]]></category>
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=215</guid>
		<description><![CDATA[Con la noticia de que hoy leyendo mi lector de RSS descubro que la aplicación que cree para el sitio forosdelweb ha ganado el 2do lugar. Esta aplicación es un “Cliente” creado con Flash/AIR donde el usuario puede seguir desde su escritorio los temas nuevos creados en los foros de forosdelweb. Más información sobre el [...]]]></description>
			<content:encoded><![CDATA[<p>Con la noticia de que hoy leyendo mi lector de RSS descubro que la aplicación que cree para el sitio <a href="http://www.forosdelweb.com/">forosdelweb</a> <a href="http://www.madeinflex.com/2008/11/06/ganadores-air-contest-2008/">ha ganado el 2do lugar.</a></p>
<p>Esta aplicación es un “Cliente” creado con Flash/AIR  donde el usuario puede seguir desde su escritorio los temas nuevos creados en los foros de <a href="http://www.forosdelweb.com/">forosdelweb</a>. </p>
<p>Más información sobre el cliente la pueden encontrar en <a href="http://www.forosdelweb.com/wiki/Cliente_AIR_Foros_del_Web">http://www.forosdelweb.com/wiki/Cliente_AIR_Foros_del_Web</a></p>
<p>Y también del dejo el  video que se le dedico al tema </p>
<p>No me queda más que agradecer a los chicos de <a href="http://www.madeinflex.com">MadeInFlex</a> y a aquellos que fungieron como jurado.</p>
<div align="center">
<object width="400" height="302"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=1733057&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=1733057&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="302"></embed></object><br /><a href="http://vimeo.com/1733057">120 Segundos: Adobe Air y el cliente de Foros del Web</a> from <a href="http://vimeo.com/fdw120segs">120 Segundos</a> on <a href="http://vimeo.com">Vimeo</a>.
</div>
<p class="tips">Por cierto como dice en el video el código es abierto y se puede descargar siguiendo estas <a href="http://www.forosdelweb.com/wiki/Codigo_Fuente">simples instrucciones</a></p>
<p>Saludos!!</p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2008/11/06/2do-lugar-en-air-contest-2008-de-madeinflex/feed/</wfw:commentRss>
		<slash:comments>4</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>
		<item>
		<title>Actualizando FLASH CS3 para crear Aplicaciones AIR.</title>
		<link>http://klr20mg.com/2008/01/16/actualizando-flash-cs3-para-crear-aplicaciones-air/</link>
		<comments>http://klr20mg.com/2008/01/16/actualizando-flash-cs3-para-crear-aplicaciones-air/#comments</comments>
		<pubDate>Wed, 16 Jan 2008 19:44:13 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[Adobe AIR]]></category>

		<guid isPermaLink="false">http://klr20mg.com/2008/01/16/actualizando-flash-cs3-para-crear-aplicaciones-air/</guid>
		<description><![CDATA[Hace tiempo adobe lanzo un Update para Flash CS3 con el cual podemos crear aplicaciones de AIR desde este entorno, con lo cual estoy muy agradecido ya que aun FLEX no me termina de convencer . Dado que la mayoría de ejemplos y tutoriales de AIR que están por la red están creados en FLEX [...]]]></description>
			<content:encoded><![CDATA[<p><span lang="ES-MX">Hace tiempo adobe lanzo un Update para Flash CS3 con el cual podemos crear aplicaciones de AIR desde este entorno, con lo cual estoy muy agradecido ya que aun FLEX no me termina de convencer <img src='http://klr20mg.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> .<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-MX">Dado que la mayoría de ejemplos y tutoriales de AIR que están por la red están creados en FLEX decidí crear ejemplos de AIR creados desde FLASH CS3 y así nos olvidamos un poco del MXML.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-MX">Lo primero que debemos tener es obviamente :<o:p></o:p></span></p>
<ul class="checklist">
<li><a href="http://www.adobe.com/products/flash/" target="_blank" title="Flash cs3">Flash CS3</a></li>
<li><a href="http://labs.adobe.com/downloads/air.html" target="_blank" title="AIR"> AIR Beta 3</a><a href="http://labs.adobe.com/downloads/air.html"></a></li>
<li><a href="http://labs.adobe.com/wiki/index.php/AIR:Flash_CS3_Professional_Update" title="update" target="_blank"> FLASH CS3 Update </a></li>
</ul>
<p class="MsoNormal"><span lang="ES-MX">Para que este update funcione la versión de su Flash CS3 debe ser la 9.0.2 si no tienen esta versión lo primero que deben de hacer es<span>  </span>instalar este update, este proceso lo puedes hacer directamente desde el manejador de actualizaciones de Flash CS3 Help-updates.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-MX">Una vez que tengas dicha versión (9.0.2) sigue instalar el Runtime de Air beta 3 y por ultimo debes ejecutar el update de Flash.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-MX">Una vez terminada estas instalaciones verificamos si el parche fue exitoso para ello abrimos nuestro navegador de archivos (windows) y nos dirigimos a la siguiente carpeta<o:p></o:p></span></p>
<p class="MsoNormal">$PATHTO\Program Files\Adobe\Adobe Flash CS3</p>
<p class="MsoNormal"><span lang="ES-MX">Dentro de esta carpeta debe existir un nuevo folder llamado <span class="highlight">AIK</span>. Si esto es verdad solo queda ver los cambios de la interfaz de FLASH CS3<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-MX">Al<span>  </span>momento de abrir FLASH CS3 en la ventana de bienvenida en el apartado Create New debe existir una nueva opción llamada Flash File (Adobe Air) y bajo el menú Commands veremos 2 nuevos ítems:</p>
<p><span class="highlight">AIR – Application and Installer Settings</span> y<br />
<span class="highlight">AIR – Create AIR File</span><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-MX">Si esto es correcto ya estamos listos para crear aplicaciones AIR desde FLASH.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-MX">En el siguiente post hare un tutorial de cómo trabajar con <span class="highlight">SQLite</span> obviamente desde FLASH CS3.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="ES-MX">Nos estamos leyendo.<o:p></o:p></span></p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2008/01/16/actualizando-flash-cs3-para-crear-aplicaciones-air/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Apollo se convierte en &#8220;Adobe Integrated Runtime&#8221;</title>
		<link>http://klr20mg.com/2007/06/10/apollo-se-convierte-en-adobe-integrated-runtime/</link>
		<comments>http://klr20mg.com/2007/06/10/apollo-se-convierte-en-adobe-integrated-runtime/#comments</comments>
		<pubDate>Mon, 11 Jun 2007 05:15:03 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[Adobe AIR]]></category>

		<guid isPermaLink="false">http://klr20mg.com/2007/06/10/apollo-se-convierte-en-adobe-integrated-runtime/</guid>
		<description><![CDATA[Apollo, Nombre como hasta el día de hoy se conocía al Runtime creado por Adobe, para crear aplicaciones de escritorio mediante Flash/Flex HTML, Deja de existir como tal, Apollo fue el “Code Name” durante el tiempo de desarrollo. El día de hoy Adobe lanza el Beta 1 de lo que se ha llamado Adobe Integrated [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center"><img src="http://klr20mg.com/archivos/air.jpg" title="AIR" alt="AIR" height="249" width="559" /></p>
<p style="margin-bottom: 0cm">Apollo, Nombre como hasta el día de hoy se conocía al Runtime creado por Adobe, para crear aplicaciones de escritorio mediante Flash/Flex HTML, Deja de existir como tal, Apollo fue el “Code Name” durante el tiempo de desarrollo.</p>
<p style="margin-bottom: 0cm">El día de hoy Adobe lanza el Beta 1 de lo que se ha llamado Adobe Integrated Runtime (antes conocido como Apollo).</p>
<p style="margin-bottom: 0cm">La buena noticia olvidándonos del nombre es que, la versión beta por definición, significa que todas las características de AIR (antes Apollo) están completas y listas para probarse, olvidemos ya el ALPHA.</p>
<p style="margin-bottom: 0cm">En lo personal “Adobe Integrated Runtime” no me agrada en lo mas mínimo. Prefería 1000 veces Apollo, Pero bueno creo que ADOBE tiene derecho de poner el nombre que quiera a sus aplicaciones <img src='http://klr20mg.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p style="margin-bottom: 0cm">Release Notes <a href="http://labs.adobe.com/wiki/index.php/AIR:Release_Notes" target="_blank">http://labs.adobe.com/wiki/index.php/AIR:Release_Notes</a></p>
<p style="margin-bottom: 0cm">Descarga <a href="http://labs.adobe.com/downloads/air.html" target="_blank">http://labs.adobe.com/downloads/air.html</a></p>
<p style="margin-bottom: 0cm">A probar se ha dicho&#8230;..</p>
<p style="margin-bottom: 0cm">Ahora que haré con mi dominio <a href="http://www.apollo-code.com" target="_blank">http://www.apollo-code.com</a> <img src='http://klr20mg.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  bueno no me queda mas que seguir usándolo, jeje.</p>
<p style="margin-bottom: 0cm">==========UPDATE===========</p>
<p style="margin-bottom: 0cm">Ademas de AIR, veo con sorpresa que también esta disponible <a href="http://labs.adobe.com/technologies/flex/" target="_blank">FLEX 3 BETA</a> en <a href="ttp://labs.adobe.com" target="_blank">LABS </a>listo para descargar, uff demasiadas cosas de un golpe, estos tíos de ADOBE no nos dejan descansar, pues bueno, si no nos ponemos al día, terminaremos obsoletos&#8230; a darle..</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm"> Saludos!!</p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2007/06/10/apollo-se-convierte-en-adobe-integrated-runtime/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Apollo-code Reload.</title>
		<link>http://klr20mg.com/2007/04/03/apollo-code-reload/</link>
		<comments>http://klr20mg.com/2007/04/03/apollo-code-reload/#comments</comments>
		<pubDate>Wed, 04 Apr 2007 00:10:03 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[Adobe AIR]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=156</guid>
		<description><![CDATA[Que tal gente, bueno lo prometido es deuda. Hace un par de semanas lance el sitio Apollo-code, siendo nada mas un foro lo cual después de pensarlo un poco no era lo que deseaba. Ahora ademas del foro, que quedo como sección interna existe el apartado de artículos, noticias, tutoriales etc, que irán apareciendo conforme [...]]]></description>
			<content:encoded><![CDATA[<p>Que tal gente, bueno lo prometido es deuda.</p>
<p>Hace un par de semanas lance el sitio <a href="http://apollo-code.com">Apollo-code</a>, siendo nada mas un foro lo cual después de pensarlo un poco no era lo que deseaba. </p>
<p>Ahora ademas del foro, que quedo como sección interna existe el apartado de artículos, noticias, tutoriales etc, que irán apareciendo conforme vaya subiendo contenido.</p>
<p>De nuevo les hago la invitación a que se registren, y todo aquel que tenga o quiera publicar algún articulo/tutorial sobre Apollo, Flex, y/o Flash es bienvenido.</p>
<p>Las personas que se habían registrado anteriormente en el foro, mantienen su usuario en esta nueva versión.</p>
<p>La dirección es <a href="http://apollo-code.com">Apollo-Code.com</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/2007/04/03/apollo-code-reload/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nace Apollo-Code</title>
		<link>http://klr20mg.com/2007/03/20/nace-apollo-code/</link>
		<comments>http://klr20mg.com/2007/03/20/nace-apollo-code/#comments</comments>
		<pubDate>Tue, 20 Mar 2007 17:24:18 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[Adobe AIR]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=155</guid>
		<description><![CDATA[Que tal gente. Con todo lo nuevo que nos puede traer apollo, sobre todo las dudas. He creado un sitio dedicado en su totalidad a Apollo [Apollo-Code] y por supuesto a las tecnologías/lenguajes que se relacionan, Por ahora solo consta de foros de discusión si todo tiene buena aceptación ya iré agregando secciones nuevas. Como [...]]]></description>
			<content:encoded><![CDATA[<p>Que tal gente.</p>
<p>Con todo lo nuevo que nos puede traer apollo, sobre todo las dudas. He creado un sitio dedicado en su totalidad a Apollo [<a href="http://www.apollo-code.com">Apollo-Code</a>] y por supuesto a las tecnologías/lenguajes que se relacionan, Por ahora solo consta de foros de discusión si todo tiene buena aceptación ya iré agregando secciones nuevas.</p>
<p>Como comento en el mensaje de bienvenida, preferí abrir un foro que una lista de correo ya que entre otras cosas el acceso a la información es mucho mas fácil. En fin</p>
<p>Señores,  están todos cordialmente invitados a registrarse y a comenzar a postear sus preguntas, que estoy seguro que entre toda la comunidad sera mas fácil el aprendizaje y entendimiento de Apollo..</p>
<p>La dirección es:</p>
<p><a href="http://www.apollo-code.com">http://www.apollo-code.com</a> y/o <a href="http://www.apollo-code.net">http://www.apollo-code.net<br />
</a></p>
<p>Saludos y nos estamos leyendo. <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/2007/03/20/nace-apollo-code/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Apollo WebBrowser</title>
		<link>http://klr20mg.com/2007/03/19/apollo-webbrowser/</link>
		<comments>http://klr20mg.com/2007/03/19/apollo-webbrowser/#comments</comments>
		<pubDate>Mon, 19 Mar 2007 06:35:07 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[Adobe AIR]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=154</guid>
		<description><![CDATA[Se nota que estoy emocionado no?? cuatro post en menos de un par de horas.. jeje bueno es que hay tantas cosas que comentar sobre apollo. Recuerdan esos días en donde la pregunta interminable en los foros y listas de desarrollo de Flash era Como puedo cargar una Pagina HTML en mi SWF? Y donde [...]]]></description>
			<content:encoded><![CDATA[<p>Se nota que estoy emocionado no?? cuatro post en menos de un par de horas.. jeje bueno es que hay tantas cosas que comentar sobre apollo. <img src='http://klr20mg.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Recuerdan esos días en donde la pregunta interminable en los foros y listas de desarrollo de Flash era Como puedo cargar una Pagina HTML en mi SWF? Y donde nos cansábamos de responder: No, Flash solo parsea algunos tag de HTML no se puede&#8230;..</p>
<p>Bien pues eso llego a su fin.. <img src='http://klr20mg.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Ahora con apollo tenemos un componente el cual despliega cualquier pagina en HTML con todos sus elementos, a decir esto, estoy hablando de CSS, Javascripts, aun no soporta plugins pero vamos mejorando no???</p>
<p>Hacer un webBrowser es tan simple como escribir 6 lineas de código..</p>
<p>El código luce así:</p>
<pre class="brush: xml;">
&lt;mx:apolloapplication xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot; layout=&quot;absolute&quot; title=&quot;WebBrowser&quot; width=&quot;800&quot; height=&quot;600&quot;&gt;
&lt;mx:textinput y=&quot;0&quot; left=&quot;0&quot; right=&quot;75&quot; id=&quot;urlText&quot;&gt;
&lt;mx:button y=&quot;0&quot; label=&quot;Go&quot; right=&quot;20&quot; id=&quot;btn&quot; click=&quot;{viewer.location=urlText.text}&quot;&gt;
&lt;mx:html x=&quot;0&quot; y=&quot;30&quot; width=&quot;100%&quot; height=&quot;100%&quot; id=&quot;viewer&quot;&gt;
&lt;/mx:html&gt;
</pre>
<p></mx:button></mx:textinput></mx:apolloapplication></p>
<p>Simple no? Yo creo que si&#8230;.</p>
<p>Saludos <img src='http://klr20mg.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> </p>
<p class="download"><a href="http://klr20mg.com/apollo/wb/webBrowser.air">Descarga WebBrowser.air</a></p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2007/03/19/apollo-webbrowser/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Apollo IRC-Client</title>
		<link>http://klr20mg.com/2007/03/19/apollo-irc-client/</link>
		<comments>http://klr20mg.com/2007/03/19/apollo-irc-client/#comments</comments>
		<pubDate>Mon, 19 Mar 2007 06:14:56 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[Adobe AIR]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=153</guid>
		<description><![CDATA[Entre el poco de tiempo que me queda después del trabajo y proyectos propios he creado un Cliente sencillo muy sencillo de IRC basado en Apollo. Este cliente esta muy alpha, pero por lo menos funciona para hablar en una sala abierta, aun falta implementar privados etc.. jeje.. Las pruebas fueron únicamente contra servidores de [...]]]></description>
			<content:encoded><![CDATA[<p>Entre el poco de tiempo que me queda después del trabajo y proyectos propios he creado un Cliente sencillo muy sencillo de IRC basado en Apollo.</p>
<p>Este cliente esta muy alpha, pero por lo menos funciona para hablar en una sala abierta, aun falta implementar privados etc.. jeje..</p>
<p>Las pruebas fueron únicamente contra servidores de Undernet.</p>
<p>Una vez que estés logueado (ojo si hay un usuario con el mismo nick el server regresa que el nick esta ocupado pero aun no parseo el mensaje y en el cliente no pasa nada así que usa un nick no muy común <img src='http://klr20mg.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ) veras la pantalla con la información que envía el server algo así:</p>
<p>NOTICE AUTH :*** Checking Ident<br />
NOTICE AUTH :*** No ident response<br />
:London.UK.Eu.Undernet.Org 001 auniquieeee :Welcome to the UnderNet IRC Network via Kewlio.net, auniquieeee<br />
:London.UK.Eu.Undernet.Org 002 auniquieeee :Your host is London.UK.Eu.Undernet.Org, running version u2.10.12.pre09</p>
<p>Una vez que veas esto estas listo para hablar. Solo basta tipear /join #nombredecanal por ejemplo /join #php e eso es todo&#8230;<br />
<a href="http://klr20mg.com/apollo/irc/IRCApollo.air"><br />
Aquí el archivo</a> .air Confíen en el archivo a pesar del mensaje que aparece. Jeje yo lo hice y aun no encuentro el por que aparece dicho mensaje al instalar..</p>
<p>El source lo pueden encontrar en <a href="http://www.klr20mg.com/apollo/irc/srcview/">http://www.klr20mg.com/apollo/irc/srcview/</a> elcodigo aun tiene los trace, y comentarios comunes no esta limpio vamos.</p>
<p>y el Archivo instalable aquí <a href="http://klr20mg.com/apollo/irc/IRCApollo.air">http://klr20mg.com/apollo/irc/IRCApollo.air</a></p>
<p>Recuerden que este ejemplo esta muy alpha y puede tener varios errores&#8230; Pero no esta mal para un ejemplo rapidito no? <img src='http://klr20mg.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> </p>
<p>Mas adelante escribiré temas mas sencillos sobre apollo para ir entendiendo desde lo básico  <img src='http://klr20mg.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Enjoy&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2007/03/19/apollo-irc-client/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Apollo Alpha RELEASE</title>
		<link>http://klr20mg.com/2007/03/18/apollo-alpha-release/</link>
		<comments>http://klr20mg.com/2007/03/18/apollo-alpha-release/#comments</comments>
		<pubDate>Mon, 19 Mar 2007 04:31:17 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[Adobe AIR]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=151</guid>
		<description><![CDATA[Pues si, es oficial, Después de varios días de especulación, Hoy se lanza al publico Apollo Alpha. Se puede descargar en: http://www.adobe.com/cfusion/entitlement/index.cfm?e=labs_apollo Que es lo hay que descargar. Antes que nada se necesita bajar el RunTime. Este servirá para instalar y ejecutar las aplicaciones creadas con apollo. Después de esto. Si cuentas con Flex Builder [...]]]></description>
			<content:encoded><![CDATA[<p>Pues si, es oficial, Después de varios días de especulación, Hoy se lanza al publico Apollo Alpha.</p>
<p>Se puede descargar en:</p>
<p><a href="http://www.adobe.com/cfusion/entitlement/index.cfm?e=labs_apollo">http://www.adobe.com/cfusion/entitlement/index.cfm?e=labs_apollo</a></p>
<p>Que es lo hay que descargar.</p>
<p>Antes que nada se necesita bajar el RunTime.</p>
<p>Este servirá para instalar y ejecutar las aplicaciones creadas con apollo.</p>
<p>Después de esto. Si cuentas con Flex Builder 2.0.1, Deberás solamente descargar “Apollo Extension for Adobe Flex Builder 2.0.1”</p>
<p>Ahora que si no tienes FLEX biulder instalado, deberás descargar su versión de prueba. </p>
<p>Existe Apollo SDK que no necesita Flex Builder pero el MXML deberá ser hecho a mano con cualquier otro editor ej NotePad. <img src='http://klr20mg.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>A darle.. <img src='http://klr20mg.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Que hay con apollo.</p>
<p>Como ya sabemos Apollo es una aplicación para desarrollar RIAs ( Rich Internet Application ) multiplataforma que esta desarrollando Adobe, con la cual se podrá desarrollar tanto en Flash, Flex, HTML Ajax entre otros, El “target” serán RIAs que podrán usarse desde el desktop del usuario. </p>
<p>Las aplicaciones hechas con Apollo serán distribuidas por medio de archivos .AIR el cual instala la aplicación en la maquina local.</p>
<p>Las características que saltan a la vista al instante sobre Apollo son.</p>
<p>* API para manejo de ventanas nativas<br />
* API para acceder al FileSystem local (Escritura/lectura, Creación/Modificación/Eliminación) de archivos y Directorios.<br />
* API para actualizaciones automáticas de la aplicación.<br />
* Por supuesto el nuevo soporte de HTML, Ahora si hay soporte total de HTML/Javascript/CSS dentro de las aplicaciones<br />
* Nuevos componentes para la navegación del FileSystem.</p>
<p>Entre muchas muchas cosas mas.</p>
<p>Sin duda Apollo abre las puertas del desarrollo de aplicaciones de escritorio para todos los desarrolladores web, ya que se podrán crear aplicaciones por medio de HTML, si, ademas de FLEX, FLASH se podrán desarrollar aplicaciones mediante HTML.</p>
<p>En fin hay mucho que estudiar y con que jugar ahora que Apollo esta libre</p>
<p>En lo personal les llevo un poco de delantera ya que fui integrante del beta privado de Apollo.. jeje. <img src='http://klr20mg.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  </p>
<p>Links<br />
<a href="http://labs.adobe.com/"></p>
<p>http://labs.adobe.com/</a></p>
<p><a href="http://www.adobe.com/cfusion/entitlement/index.cfm?e=labs_apollo">http://www.adobe.com/cfusion/entitlement/index.cfm?e=labs_apollo</a><br />
<a href="http://labs.adobe.com/technologies/apollo/">http://labs.adobe.com/technologies/apollo/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2007/03/18/apollo-alpha-release/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Apollo estará disponible esta noche??</title>
		<link>http://klr20mg.com/2007/03/18/apollo-estara-disponible-esta-noche/</link>
		<comments>http://klr20mg.com/2007/03/18/apollo-estara-disponible-esta-noche/#comments</comments>
		<pubDate>Mon, 19 Mar 2007 04:17:48 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[Adobe AIR]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=152</guid>
		<description><![CDATA[Corren los rumores después del Apollo Camp, que esta noche sera lanzado a todos el alpha de Apollo. Sera cierto? Pues ya estaremos al tanto de ello. Otra cosa. Desde siempre se dijo que Apollo seria solo el Code Name del producto, pero siendo que todos han adoptado el nombre y lo identifican, se hizo [...]]]></description>
			<content:encoded><![CDATA[<p>Corren los rumores después del Apollo Camp, que esta noche sera lanzado a todos el alpha de Apollo.</p>
<p>Sera cierto? Pues ya estaremos al tanto de ello.</p>
<p>Otra cosa. Desde siempre se dijo que Apollo seria solo el Code Name del producto, pero siendo que todos han adoptado el nombre y lo identifican, se hizo una votación de 3 días en el Apollo Camp, donde la pregunta era</p>
<p>Debe Adobe conservar el nombre Codigo Apollo como el nombre oficial del producto?</p>
<p>La respuesta fue contundente 89% a Favor 11% en contra</p>
<p>Así que Apollo seguirá siendo Apollo.</p>
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2007/03/18/apollo-estara-disponible-esta-noche/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Anuncio oficial de Apollo Alpha</title>
		<link>http://klr20mg.com/2007/02/28/anuncio-oficial-de-apollo-alpha/</link>
		<comments>http://klr20mg.com/2007/02/28/anuncio-oficial-de-apollo-alpha/#comments</comments>
		<pubDate>Wed, 28 Feb 2007 22:15:41 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[Adobe AIR]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=150</guid>
		<description><![CDATA[Vía el blog de Mike Chambers me entero de que el lanzamiento del Apollo esta muy cercano, según Mike el lanzamiento sera una versión Alpha del Apollo, lo que significa que no estarán todos los features y tendrá algunos bugs. Pero a quien le importa jeje.. Estoy seguro que todos estamos ansiosos por comenzar a [...]]]></description>
			<content:encoded><![CDATA[<p>Vía el blog de <a href="http://weblogs.macromedia.com/mesh">Mike Chambers</a> me entero de que el lanzamiento del <a href="http://adobe.com/go/apollo">Apollo </a>esta muy cercano, según Mike el lanzamiento sera una versión Alpha del Apollo, lo que significa que no estarán todos los features y tendrá algunos bugs. </p>
<p>Pero a quien le importa jeje..</p>
<p>Estoy seguro que todos estamos ansiosos por comenzar a jugar con el..</p>
<p>La información en el blog de<a href="http://weblogs.macromedia.com/mesh/archives/2007/02/quick_apollo_up.html"> Mike Chambers</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/2007/02/28/anuncio-oficial-de-apollo-alpha/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apollo, Estamos cerca del Beta publico</title>
		<link>http://klr20mg.com/2006/09/12/apollo-estamos-cerca-del-beta-publico/</link>
		<comments>http://klr20mg.com/2006/09/12/apollo-estamos-cerca-del-beta-publico/#comments</comments>
		<pubDate>Wed, 13 Sep 2006 04:22:21 +0000</pubDate>
		<dc:creator>Tmeister</dc:creator>
				<category><![CDATA[Adobe AIR]]></category>

		<guid isPermaLink="false">http://klr20mg.com/?p=123</guid>
		<description><![CDATA[Aral Balkan ha hecho lo que hasta el día de hoy es la mejor reseña sobre Apollo. Que es Apollo? Apollo es una aplicación para desarrollar RIAs ( Rich Internet Application ) multiplataforma que esta desarrollando Adobe, con la cual se podrá desarrollar tanto en Flash, Flex, HTML Ajax entre otros, El “target” serán RIAs [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-bottom: 0cm"><a target="_blank" href="http://aralbalkan.com/">Aral Balkan</a> ha hecho lo que hasta el día de hoy es la mejor <a target="_blank" href="http://aralbalkan.com/729">reseña</a> sobre <a target="_blank" href="http://labs.adobe.com/wiki/index.php/Apollo">Apollo.</a></p>
<p style="margin-bottom: 0cm">Que es Apollo?</p>
<p style="margin-bottom: 0cm">Apollo es una aplicación para desarrollar RIAs ( Rich Internet Application ) multiplataforma que esta desarrollando Adobe, con la cual se podrá desarrollar tanto en Flash, Flex, HTML Ajax entre otros, El “target” serán RIAs que podrán usarse desde el desktop del usuario.</p>
<p style="margin-bottom: 0cm">En Fin este post es de lectura obligada.</p>
<p style="margin-bottom: 0cm"><a target="_blank" href="http://aralbalkan.com/729">http://aralbalkan.com/729</a></p>
<p style="margin-bottom: 0cm">Saludos!! <img src='http://klr20mg.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> </p>
<p style="margin-bottom: 0cm">
]]></content:encoded>
			<wfw:commentRss>http://klr20mg.com/2006/09/12/apollo-estamos-cerca-del-beta-publico/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
