<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Stan! [ topics ]</title>
		<link>http://www.stan.com.mx</link>
		<description>Articles about technology, projects, university life, software discussions, pets, events at Mexico City and RENO INC's details.</description>
		<pubDate>Fri, 26 Sep 2008 19:03:34 -0500</pubDate>
		<lastBuildDate>Fri, 26 Sep 2008 19:03:34 -0500</lastBuildDate>
		<managingEditor>kiewic@gmail.com (Gilberto Stankiewicz)</managingEditor>
		<language>es-mx</language>
		<generator>CMS Champu</generator>
		<image>
			<title>Stan! [ topics ]</title>
			<url>http://www.stan.com.mx/stuff/logoStanRss.gif</url>
			<link>http://www.stan.com.mx</link>
		</image>
		<item>
			<title>ActionScript 3.0 Para Bobos!</title>
			<link>http://www.stan.com.mx/topics/view/2</link>
			<guid>http://www.stan.com.mx/topics/view/2</guid>
			<comments>http://www.stan.com.mx/topics/view/2#comments</comments>
			<pubDate>Fri, 26 Sep 2008 19:03:34 -0500</pubDate>
			<author>kiewic@gmail.com (Gilberto Stankiewicz)</author>
			<category>topics</category>
			<description>Hola! Hoy estoy dispuesto a escribir una serie de posts que resuman en pocas palabras todo lo que puede hacer ActionScript 3.0 (AS3) por ustedes, sean o no sean programadores.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;Empecemos ya!&lt;/h2&gt;
&lt;br /&gt;&#13;
Hay varias formas de programar con ActionScript 3.0:&lt;br /&gt;&#13;
&lt;br /&gt;&lt;ul&gt;&#13;
&lt;li&gt; Desarrollando aplicaciones con &lt;i&gt;Adobe Flex Builder&lt;/i&gt;.&lt;/li&gt;&#13;
&lt;li&gt; El compilador oficial de ActionScript 3.0 que es gratuito!!&lt;/li&gt;&#13;
&lt;li&gt; O usando el entorno original que le dio vida al ActionScript, el Flash, en su versión 9, mejor conocida como &lt;i&gt;Adobe Flash CS3 Professional&lt;/i&gt;. Este es mi método preferido!! Flash aún es flexible con algunos detalles de la sintaxis. Es importante resaltar que las versiones anteriores de Flash no soportan ActionScript 3.0.&lt;/li&gt;&#13;
&lt;/ul&gt;&#13;
&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;object type=&quot;application/x-shockwave-flash&quot; classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0&quot; width=&quot;500&quot; height=&quot;300&quot;&gt;
&lt;param name=&quot;movie&quot; value=&quot;http://www.stan.com.mx/flach/HolaMundo.swf&quot;&gt;
&lt;param name=&quot;quality&quot; value=&quot;high&quot;&gt;
&lt;param name=&quot;menu&quot; value=&quot;false&quot;&gt;
&lt;embed src=&quot;http://www.stan.com.mx/flach/HolaMundo.swf&quot; quality=&quot;high&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;500&quot; height=&quot;300&quot; /&gt;
&lt;/object&gt;
&lt;/div&gt;
&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;¿Cómo hacer una aplicación con ActionScript 3.0 con el compilador gratuito? Para los pobres como yo.&lt;/h2&gt;
&lt;br /&gt;&#13;
Primero debes conseguir el Flex SDK 2 (38MB) en la siguiente liga:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;a href=&quot;http://www.adobe.com/products/flex/downloads/&quot;&gt;http://www.adobe.com/products/flex/downloads/&lt;/a&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
O si eres más desesperado, el Flex SDK 3 (76.2MB):&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;a href=&quot;http://labs.adobe.com/downloads/&quot;&gt;http://labs.adobe.com/downloads/&lt;/a&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Lo instalas.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Copia el siguiente código y guardalo en un archivo que se llame &lt;b&gt;HolaMundo.as&lt;/b&gt;:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
package {&#13;
	import flash.display.Shape;&#13;
	import flash.display.SimpleButton;&#13;
	import flash.display.Sprite;&#13;
	import flash.events.Event;&#13;
	import flash.events.MouseEvent;&#13;
	import flash.text.TextField;&#13;
	import flash.text.TextFieldType;&#13;
	import flash.text.TextFormat;&#13;
	import flash.text.TextFormatAlign;&#13;
	import flash.text.TextFieldAutoSize;&#13;
	&#13;
	public class HolaMundo extends Sprite {&#13;
		protected var _balloon:Shape;&#13;
		protected var _button:SimpleButton;&#13;
		&#13;
		public function HolaMundo() {&#13;
			drawBalloon();&#13;
			drawHello();&#13;
			drawButton();&#13;
			&#13;
			x = (500 - width) / 2;&#13;
			y = (300 - height) / 2;&#13;
			alpha = 0;&#13;
			addEventListener(Event.ENTER_FRAME,upAlpha);&#13;
		}&#13;
		&#13;
		private function getANewTextFormat(color:uint):TextFormat {&#13;
			var format:TextFormat = new TextFormat();&#13;
			format.font = &amp;quot;Trebuchet MS,Arial&amp;quot;;&#13;
			format.align = TextFormatAlign.CENTER;&#13;
			format.bold = true;&#13;
			format.color = color;&#13;
			format.letterSpacing = -4;&#13;
			format.size = 50;&#13;
			return format;&#13;
		}&#13;
		&#13;
		private function getANewRect(width:uint,height:uint,color:uint=0):Shape {&#13;
			var rect:Shape = new Shape();&#13;
			rect.graphics.beginFill(color);&#13;
			rect.graphics.drawRect(0,0,width,height);&#13;
			rect.graphics.endFill();&#13;
			return rect;&#13;
		}&#13;
		&#13;
		private function drawBalloon():void {&#13;
			_balloon = new Shape();&#13;
			_balloon.graphics.beginFill(0x0099CC);&#13;
			_balloon.graphics.drawRoundRect(0,0,200,150,100);&#13;
			_balloon.graphics.moveTo(150,150);&#13;
			_balloon.graphics.lineTo(150,200);&#13;
			_balloon.graphics.lineTo(100,150);&#13;
			_balloon.graphics.endFill();&#13;
			addChild(_balloon);&#13;
		}&#13;
		&#13;
		private function drawHello():void {&#13;
			var hello:TextField = new TextField();&#13;
			hello.autoSize = TextFieldAutoSize.CENTER;&#13;
			hello.defaultTextFormat = getANewTextFormat(0xFFFFFF);&#13;
			hello.text = &amp;quot;Hola\nMundo!&amp;quot;;&#13;
			hello.x = 20;&#13;
			hello.y = 10;&#13;
			addChild(hello);&#13;
		}		&#13;
		&#13;
		private function drawButton():void {&#13;
			_button = new SimpleButton();&#13;
			_button.hitTestState = _balloon;&#13;
			_button.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);&#13;
			_button.addEventListener(MouseEvent.MOUSE_UP,onMouseUp);&#13;
			_button.addEventListener(MouseEvent.ROLL_OVER,onRollOver);&#13;
			_button.addEventListener(MouseEvent.ROLL_OUT,onRollOut);&#13;
			addChild(_button);&#13;
		}&#13;
		&#13;
		private function upAlpha(event:Event):void {&#13;
			if (alpha &amp;lt; 1)&#13;
				alpha += .1&#13;
		}&#13;
&#13;
		private function downAlpha(event:Event):void {&#13;
			if (alpha &amp;gt; .4)&#13;
				alpha -= .1&#13;
		}&#13;
		&#13;
		private function onRollOver(event:MouseEvent):void {&#13;
			removeEventListener(Event.ENTER_FRAME,upAlpha);&#13;
			addEventListener(Event.ENTER_FRAME,downAlpha);&#13;
		}&#13;
		&#13;
		private function onRollOut(event:MouseEvent):void {&#13;
			removeEventListener(Event.ENTER_FRAME,downAlpha);&#13;
			addEventListener(Event.ENTER_FRAME,upAlpha);&#13;
		}&#13;
		&#13;
		private function onMouseDown(event:MouseEvent):void {&#13;
			startDrag();&#13;
		}&#13;
&#13;
		private function onMouseUp(event:MouseEvent):void {&#13;
			stopDrag();&#13;
		}&#13;
	}&#13;
}&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Ejecuta &lt;b&gt;Adobe Flex 2 SDK Command Prompt&lt;/b&gt;, para ello debes hacer click en el &lt;i&gt;Menú Inició » Programas » Adobe » Adobe Flex 2 SDK Command Prompt&lt;/i&gt;. Se abrirá una ventana del &lt;i&gt;Símbolo del Sistema&lt;/i&gt; de Windows, con el classpath ya modificado para encontrar los compiladores y librerias de ActionScript.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/ActionScript3BobosMxmlc.gif&quot; alt=&quot;Hola Mundo con el compilador de ActionScript.&quot;  width=&quot;500&quot; height=&quot;200&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
Usando el &lt;i&gt;Símbolo de Sistema&lt;/i&gt;, muévete al directorio donde guardaste el archivo &lt;b&gt;HolaMundo.as&lt;/b&gt; y compilalo así:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;code&gt;mxmlc.exe HolaMundo.as&lt;/code&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
O con un tamaño personalizado:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;code&gt;mxmlc.exe -default-size 500 300 HolaMundo.as&lt;/code&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Y listo! Ahora tienes un archivo &lt;b&gt;HolaMundo.swf&lt;/b&gt; en el mismo directorio. Tal vez algunas rutas sean diferentes, pero el archivo &lt;b&gt;mxmlc.exe&lt;/b&gt; es el compilador de ActionScript 3.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;¿Cómo hacer una aplicación con ActionScript 3.0 usando Adobe Flash CS3 Professional?&lt;/h2&gt;
&lt;br /&gt;&#13;
Uy! Hay un montón de formas de programar, pero la que yo recomiendo ampliamente es usando una &lt;b&gt;Document Class&lt;/b&gt;. Una &lt;i&gt;Document Class&lt;/i&gt; es un archivo AS que esta ligado a un archivo FLA. Entonces puedes hacer lo que quieras en tu documento FLA como siempre lo has hecho con Flash, poner dibujitos, sonidos, películas y fotos, pero todo el código lo pones en uno o varios archivos AS. &lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Para que funcione, es importante que escribas el nombre de la clase principal en el cuadrito &lt;i&gt;Document Class&lt;/i&gt; que aparece en el panel &lt;i&gt;Properties&lt;/i&gt; cuando haces click sobre el escenario. Obviamente es importante guardar todos los archivos en el mismo directorio (o si tú ya entiendes paquetes, entonces esto no es necesario).&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/ActionScript3BobosDocumentClass.gif&quot; alt=&quot;Configurar la Document Class.&quot;  width=&quot;500&quot; height=&quot;200&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
Al probar la película (CTRL + ENTER), se ejecuta el constructor de la clase principal.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Puedes probar el código de arriba. Guárdalo en un archivo que se llame &lt;b&gt;HolaMundo.as&lt;/b&gt;. Abre el Flash CS3 y crea un nuevo documento &lt;i&gt;File » New... » Flash File (ActionScript 3.0) » Aceptar&lt;/i&gt; y escribe &lt;b&gt;HolaMundo&lt;/b&gt; en el cuadrito &lt;i&gt;Document Class&lt;/i&gt;. Presiona CTRL + ENTER para correr la película.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;¿Cómo hacer una aplicación con ActionScript 3.0 usando Adobe Flex Builder 2?&lt;/h2&gt;
&lt;br /&gt;&#13;
Ok, tienes una versión de prueba de Adobe Flex Builder 2. Puedes hacer legal tu copia solicitando un número de serie gratis para estudiantes en la siguiente liga:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;a href=&quot;http://www.flexregistration.com/&quot;&gt;http://www.flexregistration.com/&lt;/a&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Si ya tienes el Flex, debes crear un nuevo proyecto haciendo click en &lt;i&gt;File » New » ActionScript Project&lt;/i&gt;, escribes un nombre para el proyecto, en el ejemplo será &lt;b&gt;HolaMundo&lt;/b&gt; y después haces click en &lt;i&gt;Finish&lt;/i&gt;.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/ActionScript3BobosFlexBuilder.gif&quot; alt=&quot;Hola Mundo con Flex Builder 2.&quot;  width=&quot;500&quot; height=&quot;300&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
Entonces, se abre el archivo &lt;b&gt;HolaMundo.as&lt;/b&gt; en el panel central. Borra todo el código existente y pégale el código de arriba. Guarda los cambios y presiona CTRL + F11 para correr tu proyecto. Entonces estarás enfrente de tu primera aplicación con Adobe Flex Builder! &lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;Entonces ¿Cuál Usar?&lt;/h2&gt;
&lt;br /&gt;&#13;
Ok, ya probamos los tres métodos, ¿cuáles son las ventajas y desventajas de cada uno? Yo sigo siendo novato en estas tecnologías, y desconozco si se pueden configurar algunos detalles en cada uno, pero por mi experiencia podría enumerar las siguientes características.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;table&gt;&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;b&gt;Flex SDK (Compilador mxmlc.exe)&lt;/b&gt; &lt;/td&gt;&lt;td&gt; &lt;b&gt;Flash CS3 Professional&lt;/b&gt; &lt;/td&gt;&lt;td&gt; &lt;b&gt;Flex Builder 2&lt;/b&gt; &lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt; Lista de métodos, propiedades y paquetes al codificar. &lt;/td&gt;&lt;td&gt; No tiene esto. &lt;/td&gt;&lt;td&gt; Flash te ayuda con los nombres de propiedades y métodos cuando él quiere (no funciona en todas las situaciones). &lt;/td&gt;&lt;td&gt; Flex siempre te muestra una lista de métodos y propiedades. &lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt; Genera archivos SWF. &lt;/td&gt;&lt;td&gt; Sip. &lt;/td&gt;&lt;td&gt; Claro. &lt;/td&gt;&lt;td&gt; También. &lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt; Genera archivos SWF con tamaño fijo (sin ayuda de un HTML o XHTML). &lt;/td&gt;&lt;td&gt; Sip, si usas las opciones &lt;code&gt;-default-size 800 600&lt;/code&gt; a la hora de compilar, donde 800 es el ancho y 600 es el alto. &lt;/td&gt;&lt;td&gt; Sí, las dimensiones son las mismas que se han definido en el archivo FLA. &lt;/td&gt;&lt;td&gt; Sí, Flex Builder tiene valores predeterminados de 500x375, pero estos valores se pueden modificar si se hace click con el botón derecho sobre el nombre del proyecto en el panel &lt;i&gt;Navigator&lt;/i&gt; y se selecciona &lt;i&gt;Properties » ActionScript Compiler&lt;/i&gt; y en el cuadro de texto &lt;i&gt;Aditional compiler arguments:&lt;/i&gt; se escribe &lt;code&gt;-default-size 800 600&lt;/code&gt;. &lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt; Componentes &lt;/td&gt;&lt;td&gt; Sí, están incluidos en el SDK, pero al compilar se debe agregar esos directorios al classpath. &lt;/td&gt;&lt;td&gt; Sí, en el menú &lt;i&gt;Window » Components&lt;/i&gt; se abre un panel con TextInput, CheckBox, ComboBox, FLVPlayback .. entre otros componentes. Si los componentes se colocan sobre el escenario, Flash relaciona estás clases automáticamente (modifica el classpath automáticamente). Sino se arrastran sobre el escenario, habrá que localizar el directorio de estas clases y agregarlos al classpath manualmente en &lt;i&gt;Edit » Preferences » ActionScript » ActionScript 3.0 Settings&lt;/i&gt;. &lt;/td&gt;&lt;td&gt; Oops, pues están incluidos en el SDK, pero son fáciles de arrastrar sólo cuando se trabaja con MXML y no en proyecto ActionScript, de otra forma habrá que  agregar los directorios al classpath. &lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt; Ayuda y documentación. &lt;/td&gt;&lt;td&gt; No tiene, pero incluye algunos ejemplos. &lt;/td&gt;&lt;td&gt; Sí, tiene ayuda y es muy buena. Escribe algo mientras programas, colócate encima y presiona F1. Al instante tendrás lo que buscas. &lt;/td&gt;&lt;td&gt; Sí tiene, pero es muy lenta y no es tan intuitiva. &lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt; Opciones para debuguear. &lt;/td&gt;&lt;td&gt; Sí, al compilar deberas usar &lt;code&gt;-debug&lt;/code&gt; para mostrar información adicional. &lt;/td&gt;&lt;td&gt; Sí, presiona CTRL + SHIFT + ENTER para debuguear la película. (Sólo así funcionan los &lt;i&gt;breakpoints&lt;/i&gt;.) &lt;/td&gt;&lt;td&gt; Sí, presiona F11 para debuguear. Los mensajes de &lt;code&gt;trace()&lt;/code&gt; los podrás ver en el panel &lt;i&gt;Console&lt;/i&gt;. &lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt; La mejor ventaja que tiene. &lt;/td&gt;&lt;td&gt; Es gratis. &lt;/td&gt;&lt;td&gt; Puedes hacer un dibujo usando las herramientas de dibujo, lo seleccionas y lo conviertes en MovieClip presionando la tecla F8. Esto te ahorrara algunos &lt;code&gt;lineTo()&lt;/code&gt;, &lt;code&gt;drawCircle()&lt;/code&gt;, &lt;code&gt;beginFill()&lt;/code&gt; y &lt;code&gt;lineStyle()&lt;/code&gt;. &lt;/td&gt;&lt;td&gt; Flex Builder está completamente orientado a la creación de RIAs. Es compatible con muchos otros lenguajes de programación, servidores y frameworks. &lt;/td&gt;&lt;/tr&gt;&#13;
&lt;/table&gt;&lt;br /&gt;&#13;
&lt;h2&gt;Conclusiones&lt;/h2&gt;
&lt;br /&gt;&#13;
Ok! Si llegaste hasta aquí, es momento de comenzar a programar con ActionScript 3.0. Digo, son vacaciones y tú estás leyendo el blog de Stan!!! Seguro te sobra algo de tiempo. :P&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Algunos tips para migrar de ActionScript 2 a ActionScript 3, escritos por la líder (MUJER!!) del proyecto Adobe Flash Player, los pueden encontrar en:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;a href=&quot;http://www.adobe.com/devnet/actionscript/articles/actionscript_tips.html&quot;&gt;http://www.adobe.com/devnet/actionscript/articles/actionscript_tips.html&lt;/a&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Y para entender la nueva estructura de los archivos SWF, les recomiendo:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;a href=&quot;http://www.adobe.com/newsletters/edge/may2007/articles/article6/index.html?trackingid=ZCEF&quot;&gt;http://www.adobe.com/newsletters/edge/may2007/articles/article6/index.html?trackingid=ZCEF&lt;/a&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Si algo no se entiende bien, puedes dejar los comentarios que quieras a continuación y trataré de ayudarte.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Feliz año 2008!!&lt;br /&gt;</description>
		</item>
		<item>
			<title>Adios 2007 (Lo Que El 2007 Se Llevó)</title>
			<link>http://www.stan.com.mx/topics/view/3</link>
			<guid>http://www.stan.com.mx/topics/view/3</guid>
			<comments>http://www.stan.com.mx/topics/view/3#comments</comments>
			<pubDate>Fri, 26 Sep 2008 19:03:13 -0500</pubDate>
			<author>kiewic@gmail.com (Gilberto Stankiewicz)</author>
			<category>topics</category>
			<description>Por cuarto ocasión gastaré los últimos instantes del año, escribiendo un resumen de actividades (pueden recordar el &lt;a href=&quot;http://blog.stan.com.mx/index.php?id=130&quot;&gt;2006&lt;/a&gt;, &lt;a href=&quot;http://blog.stan.com.mx/index.php?id=86&quot;&gt;2005&lt;/a&gt; y &lt;a href=&quot;http://blog.stan.com.mx/index.php?id=3&quot;&gt;2004&lt;/a&gt;).&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/Adios2007ComidaChina.jpg&quot; alt=&quot;Eso pasa siempre que como comida china.&quot;  width=&quot;600&quot; height=&quot;250&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
Claro! Es una forma muy sana de ver que estuvo bien y que no estuvo bien este año. Este año el reporte de actividades será breve.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
ESTE AÑO ME FUE MUY BIEN!!&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Así de breve.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Tengo que &lt;b&gt;agradecer a todos mis amigos, a todos mis nuevos amigos y a todos mis no amigos.&lt;/b&gt; :]&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
También quiero listar &lt;b&gt;las 12 canciones que me van a recordar el 2007&lt;/b&gt;, una actividad que comenzó &lt;a href=&quot;http://kiewic.hi5.com/friend/profile/displayProfile.do?userid=5273498&quot;&gt;Gris&lt;/a&gt; hace algunos días:&lt;br /&gt;&#13;
&lt;br /&gt;&lt;ol&gt;&#13;
&lt;li&gt; La Luna - &lt;b&gt;Volovan con Ximena Sariñana&lt;/b&gt; &lt;sub&gt;(del mismo disco que Britany y Monitor)&lt;/sub&gt;&lt;/li&gt;&#13;
&lt;li&gt; September / The Joker - &lt;b&gt;Earth Wind And Fire / Fatboy Slim (ATFC&amp;#039;s Aces High Remix)&lt;/b&gt; &lt;sub&gt;(Babel Soundtrack, donde también pueden encontrar Tú Me Acostumbraste)&lt;/sub&gt;&lt;/li&gt;&#13;
&lt;li&gt; Lámpara De Lava - &lt;b&gt;Furland&lt;/b&gt; &lt;sub&gt;(del mismo disco que Robot y Tour De France)&lt;/sub&gt;&lt;/li&gt;&#13;
&lt;li&gt; Cintiana - &lt;b&gt;Pastilla&lt;/b&gt; &lt;sub&gt;(del mismo disco que A Marte, Lamento y Colores)&lt;/sub&gt;&lt;/li&gt;&#13;
&lt;li&gt; Agrío Silencio - &lt;b&gt;Las Ultrasónicas&lt;/b&gt; &lt;sub&gt;(del mismo disco que El Rock De La Pájara Peggy)&lt;/sub&gt;&lt;/li&gt;&#13;
&lt;li&gt; Le Festin - &lt;b&gt;Camille&lt;/b&gt; &lt;sub&gt;(Ratatouille Soundtrack)&lt;/sub&gt;&lt;/li&gt;&#13;
&lt;li&gt; Alma Gemela - &lt;b&gt;El Otro Yo&lt;/b&gt; &lt;sub&gt;(del mismo disco que El Final Del Planeta)&lt;/sub&gt;&lt;/li&gt;&#13;
&lt;li&gt; Hip Hop No Pares - &lt;b&gt;Instituto Mexicano del Sonido (IMS)&lt;/b&gt; &lt;sub&gt;(del mismo disco que Escríbeme Pronto)&lt;/sub&gt;&lt;/li&gt;&#13;
&lt;li&gt; Me Haces Existir - &lt;b&gt;Monocordio&lt;/b&gt; &lt;sub&gt;(del mismo disco que Nada Tiene Color Sin La Luz Del Amor y Siempre Te Busqué)&lt;/sub&gt;&lt;/li&gt;&#13;
&lt;li&gt; Quiero Ver - &lt;b&gt;Café Tacuba&lt;/b&gt;&lt;/li&gt;&#13;
&lt;li&gt; Hold Me Tight - &lt;b&gt;Evan Rachel Wood&lt;/b&gt; &lt;sub&gt;(Across The Universe Soundtrack, donde también pueden encontrar Hapinness Is A Warm Gun y Blue Jay Way)&lt;/sub&gt;&lt;/li&gt;&#13;
&lt;li&gt; No One - &lt;b&gt;Alicia Keys&lt;/b&gt; &lt;sub&gt;(del mismo disco que Teenage Love Affair y Wreckless Love, disco 36 en la lista Rolling Stone USA)&lt;/sub&gt;&lt;/li&gt;&#13;
&lt;/ol&gt;&#13;
&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
En ese orden fueron apareciendo las canciones en mi 2007. &lt;b&gt;¿Tú tienes tu lista de canciones del 2007?&lt;/b&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/Adios2007Queretaro.jpg&quot; alt=&quot;ACM en Querétaro.&quot;  width=&quot;600&quot; height=&quot;250&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
Los mejores momentos del año fueron:&lt;br /&gt;&#13;
&lt;br /&gt;&lt;ol&gt;&#13;
&lt;li&gt; &lt;b&gt;Bill Gates en México.&lt;/b&gt; Yo odio la forma en que Microsoft se roba todas las ideas, pero todo lo que sucedió ese día en el evento estuvo interesante.&lt;/li&gt;&#13;
&lt;li&gt; &lt;b&gt;Creative Suite 3 Tour en el Salón 21&lt;/b&gt;. Las compañías de software pocas veces hacen eventos en nuestra ciudad, o nunca me entero. Había muchos bocadillos gratis, y cosas como Apollo (ahora AIR), InDesign, Spry, Contribute y hasta Photoshop me sorprendieron ese día.&lt;/li&gt;&#13;
&lt;li&gt; &lt;b&gt;Festival Vive Latino&lt;/b&gt;. Dos días repletos de música y comida.&lt;/li&gt;&#13;
&lt;li&gt; &lt;b&gt;Concierto de Soda Stereo&lt;/b&gt;. Gracias a mi hermana conseguí un boleto un día antes.&lt;/li&gt;&#13;
&lt;li&gt; &lt;b&gt;Concurso ACM en Querétaro&lt;/b&gt;. Justo cuando salté porque mi equipo ganó un recorrido por la noche en las calles de Querétaro.&lt;/li&gt;&#13;
&lt;li&gt; &lt;b&gt;Comprar una cámara nueva&lt;/b&gt;. Después de haber descompuesto la Cannon el año pasado, ahora tengo una Cybershoot para entretenerme.&lt;/li&gt;&#13;
&lt;li&gt; &lt;b&gt;Trabajar en un edificio de Insurgentes Sur&lt;/b&gt;. Sí, me tocó trabajar en Insurgentes. A la hora de la comida, salen miles de personas por todos lados a comer. Tuve que aprender ASP .NET de verdad. Debo reconocer que ASP .NET tiene sus ventajas, pronto pondré mis propios tips para migrar de PHP a ASP .NET.&lt;/li&gt;&#13;
&lt;/ol&gt;&#13;
&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;Y mi sitio?&lt;/h2&gt;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/Adios2007DominioComMx.gif&quot; alt=&quot;Dominio .com.mx contra revista R&amp;amp;R.&quot;  width=&quot;600&quot; height=&quot;250&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
¿Qué puedo decir de mi sitio personal? Este año el sitio emigró de la versión 7 a la versión 8. Este año, pagar el dominio nos salió más caro que lo que le cuesta a Memo ir cada quincena por la Revista R&amp;amp;R.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;Propositos? Y Deseos!&lt;/h2&gt;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/Adios2007Programacion.gif&quot; alt=&quot;Programación dinámica.&quot;  width=&quot;600&quot; height=&quot;250&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
Uy! Como me cuesta trabajo cumplir los propositos, pero sí tengo unos para este año.&lt;br /&gt;&#13;
&lt;br /&gt;&lt;ol&gt;&#13;
&lt;li&gt; &lt;b&gt;Aprender programación dinámica.&lt;/b&gt; Como sufro por no saber este tema y otros temas relacionados.&lt;/li&gt;&#13;
&lt;li&gt; &lt;b&gt;Dejar de imaginar y ponerme a programar.&lt;/b&gt; Tengo una lista de aplicaciones pendientes por programar.&lt;/li&gt;&#13;
&lt;li&gt; &lt;b&gt;Convencer al mundo de que ActionScript no hace daño.&lt;/b&gt; Caray! Espero que Mike Chambers y sus amigos visiten México este año.&lt;/li&gt;&#13;
&lt;li&gt; &lt;b&gt;Cambiar de sistema operativo.&lt;/b&gt; &lt;/li&gt;&#13;
&lt;li&gt; &lt;b&gt;Aprender inglés.&lt;/b&gt; Para que no me manden a freír espárragos.&lt;/li&gt;&#13;
&lt;li&gt; &lt;b&gt;Ser más hábil en el taller de teatro.&lt;/b&gt; Aprenderme los diálogos y no olvidar salir al escenario. Eso si aún no me han sacado del taller.&lt;/li&gt;&#13;
&lt;/ol&gt;&#13;
&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Y los deseos son:&lt;br /&gt;&#13;
&lt;br /&gt;&lt;ol&gt;&#13;
&lt;li&gt; Un viaje a Europa! (Por eso son deseos, no?)&lt;/li&gt;&#13;
&lt;li&gt; Que Mike Chambers y sus amigos vengan a México.&lt;/li&gt;&#13;
&lt;li&gt; Que abran pronto la Biblioteca Vasconcelos.&lt;/li&gt;&#13;
&lt;li&gt; Y paz y felicidad infinita para todos mis amigos y conocidos!!&lt;/li&gt;&#13;
&lt;/ol&gt;&#13;
&lt;br /&gt;</description>
		</item>
		<item>
			<title>Colores Sin Sentido (Aprendiendo ActionScript 3.0)</title>
			<link>http://www.stan.com.mx/topics/view/4</link>
			<guid>http://www.stan.com.mx/topics/view/4</guid>
			<comments>http://www.stan.com.mx/topics/view/4#comments</comments>
			<pubDate>Fri, 26 Sep 2008 19:02:59 -0500</pubDate>
			<author>kiewic@gmail.com (Gilberto Stankiewicz)</author>
			<category>topics</category>
			<description>Ya estoy de vuelta con la segunda aplicación en ActionScript 3.0.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;object type=&quot;application/x-shockwave-flash&quot; classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0&quot; width=&quot;500&quot; height=&quot;350&quot;&gt;
&lt;param name=&quot;movie&quot; value=&quot;http://www.stan.com.mx/flach/NonsenseColors.swf&quot;&gt;
&lt;param name=&quot;quality&quot; value=&quot;high&quot;&gt;
&lt;param name=&quot;menu&quot; value=&quot;false&quot;&gt;
&lt;embed src=&quot;http://www.stan.com.mx/flach/NonsenseColors.swf&quot; quality=&quot;high&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;500&quot; height=&quot;350&quot; /&gt;
&lt;/object&gt;
&lt;/div&gt;
&#13;
&lt;br /&gt;&#13;
Características:&lt;br /&gt;&#13;
&lt;br /&gt;&lt;ul&gt;&#13;
&lt;li&gt; Puedes escribir el valor RGB en hexadecimal de un color en el cuadro rosa (justo abajo de la flecha). Luego debes hacer click en OK o dar un ENTER.&lt;/li&gt;&#13;
&lt;li&gt; Al pasar el ratón encima de algún tono, se despliega una etiqueta con el valor RGB de ese color.&lt;/li&gt;&#13;
&lt;li&gt; También es posible hacer click en cualquiera de los colores de la derecha, y automáticamente ese color pasara a ser el color del centro del panel.&lt;/li&gt;&#13;
&lt;/ul&gt;&#13;
&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
A continuación pueden encontrar el código de esta apliacación. Es totalmente libre, o sea, pueden hacer con él lo que quieran.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Primero necesitamos un archivo &lt;b&gt;NonsenseColors.as&lt;/b&gt;:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
/**&#13;
 * Nonsense Colors (A Palette Color Generator)&#13;
 * Gilberto Stankiewicz &#13;
 * http://www.stan.com.mx&#13;
 * January 2008&#13;
 */&#13;
 &#13;
package {&#13;
	import flash.display.Sprite;&#13;
	import flash.display.Shape;&#13;
	import flash.display.SimpleButton;&#13;
	import flash.events.Event;&#13;
	import flash.events.MouseEvent;&#13;
	import flash.events.KeyboardEvent;&#13;
	import flash.text.TextField;&#13;
	import flash.text.TextFieldType;&#13;
	import flash.text.TextFieldAutoSize;&#13;
	import flash.ui.Keyboard;&#13;
	import NonsenseSquare;&#13;
	import GiveMeA;&#13;
	&#13;
	public class NonsenseColors extends Sprite {&#13;
		protected var _arrow:Shape;&#13;
		protected var _textInput:TextField;&#13;
		protected var _button:SimpleButton;&#13;
		protected var _squares:Array;&#13;
		&#13;
		public function NonsenseColors() {&#13;
			drawArrow();&#13;
			drawTextInput();&#13;
			drawButton();&#13;
			drawAds();&#13;
			drawSquares();&#13;
			changeColor();&#13;
		}&#13;
		&#13;
		private function drawArrow():void {&#13;
			_arrow = new Shape();&#13;
			_arrow.graphics.beginFill(0xFF0099);&#13;
			_arrow.graphics.curveTo(100,0,100,100);&#13;
			_arrow.graphics.lineTo(150,100);&#13;
			_arrow.graphics.lineTo(150 / 2,200);&#13;
			_arrow.graphics.lineTo(0,100);&#13;
			_arrow.graphics.lineTo(50,100);&#13;
			_arrow.graphics.curveTo(50,50,0,50);&#13;
			_arrow.graphics.lineTo(0,0);&#13;
			_arrow.graphics.endFill();&#13;
			addChild(_arrow);&#13;
		}&#13;
		&#13;
		private function drawTextInput():void {&#13;
			_textInput = new TextField();&#13;
			_textInput.type = TextFieldType.INPUT;&#13;
			_textInput.border = true;&#13;
			_textInput.background = true;&#13;
			_textInput.multiline = false;&#13;
			_textInput.maxChars = 6;&#13;
			_textInput.restrict = &amp;quot;A-F 0-9&amp;quot;;&#13;
			_textInput.defaultTextFormat = GiveMeA.newTextFormat(0x000000);&#13;
			_textInput.height = _textInput.textHeight * 1.2;&#13;
			_textInput.width = 80;&#13;
			_textInput.borderColor = 0xFF0099;&#13;
			_textInput.text = &amp;quot;FF0099&amp;quot;;&#13;
			_textInput.x = 40;&#13;
			_textInput.y = 220;&#13;
			_textInput.addEventListener(KeyboardEvent.KEY_DOWN,onKey);&#13;
			addChild(_textInput);&#13;
		}&#13;
		&#13;
		private function createButtonText():TextField {&#13;
			var buttonText:TextField = new TextField();&#13;
			buttonText.width = _textInput.width;&#13;
			buttonText.height = _textInput.height;&#13;
			buttonText.defaultTextFormat = GiveMeA.newTextFormat(0xFFFFFF);&#13;
			buttonText.text = &amp;quot;Ok&amp;quot;;&#13;
			return buttonText;&#13;
		}&#13;
		&#13;
		private function createButtonState(color:uint):Sprite {&#13;
			var sprite:Sprite = new Sprite();&#13;
			sprite.addChild(GiveMeA.newRect(_textInput.width,_textInput.height,color));&#13;
			sprite.addChild(createButtonText());&#13;
			return sprite;&#13;
		}&#13;
		&#13;
		private function drawButton():void {&#13;
			_button = new SimpleButton();&#13;
			_button.upState = createButtonState(0xFF0099);&#13;
			_button.overState = createButtonState(0xFF3300);&#13;
			_button.downState = createButtonState(0x663300);&#13;
			_button.hitTestState = _button.upState;&#13;
			_button.x = 40;&#13;
			_button.y = _textInput.y + _textInput.height + 10;&#13;
			&#13;
			_button.addEventListener(MouseEvent.CLICK,onButtonClick);&#13;
			addChild(_button);&#13;
		}&#13;
		&#13;
		private function drawAds():void {&#13;
			var stanAd:TextField = new TextField();&#13;
			stanAd.autoSize = TextFieldAutoSize.RIGHT;&#13;
			stanAd.defaultTextFormat = GiveMeA.newTextFormat(0xD0D0D0);&#13;
			stanAd.text = &amp;quot;STAN.COM.MX&amp;quot;;&#13;
			stanAd.x = 10;&#13;
			stanAd.y = 340 - stanAd.textHeight;&#13;
			addChild(stanAd);&#13;
		}&#13;
		&#13;
		private function drawSquares():void {&#13;
			var panel:Sprite = new Sprite();&#13;
			var side:uint = 50;&#13;
			var square:NonsenseSquare;&#13;
			_squares = new Array();&#13;
			&#13;
			for (var j:uint = 0; j &amp;lt; 7; j++) {&#13;
				for (var i:uint = 0; i &amp;lt; 7; i++) {&#13;
					square = new NonsenseSquare(side * i,side * j,this);&#13;
					panel.addChild(square);&#13;
					_squares.push(square);&#13;
				}&#13;
			}&#13;
			&#13;
			panel.x = 200;&#13;
			panel.y = 0;&#13;
			addChild(panel);&#13;
		}&#13;
		&#13;
		private function onKey(event:KeyboardEvent) {&#13;
			if (event.keyCode == Keyboard.ENTER)&#13;
				changeColor();&#13;
		}&#13;
		&#13;
		private function onButtonClick(event:MouseEvent) {&#13;
			changeColor();&#13;
		}&#13;
		&#13;
		public function changeTextInput(text:String):void {&#13;
			_textInput.text = text;&#13;
			changeColor();&#13;
		}&#13;
		&#13;
		private function checkColor(color:int):uint {&#13;
			if (color &amp;gt; 255)&#13;
				return 255;&#13;
			if (color &amp;lt; 0) &#13;
				return 0;&#13;
			return color;&#13;
		}&#13;
		&#13;
		private function changeColor():void {&#13;
			var i:uint = 0, j:uint = 0;&#13;
			var mRed:uint, mGreen:uint, mBlue:uint;&#13;
			var color:uint = parseInt(&amp;quot;0x&amp;quot; + _textInput.text);&#13;
			var red:uint = (color &amp;amp; 0xFF0000) &amp;gt;&amp;gt; 16;&#13;
			var green:uint = (color &amp;amp; 0x00FF00) &amp;gt;&amp;gt; 8;&#13;
			var blue:uint = (color &amp;amp; 0x0000FF);&#13;
			var mX:uint = 10, mY:uint = 22;&#13;
			&#13;
			for each (var square:NonsenseSquare in _squares) {&#13;
				mRed = mGreen = mBlue = 0;&#13;
				if (j != 0 || j != 6)&#13;
					mRed = mX * (i - 3) + mY * (j - 3);&#13;
				if (j != 1 || j != 5)&#13;
					mGreen = mX * (i - 3) + mY * (j - 3);&#13;
				if (j != 2 || j != 4)&#13;
					mBlue = mX * (i - 3) + mY * (j - 3);&#13;
				&#13;
				if (++i &amp;gt;= 7) {&#13;
					i = 0;&#13;
					j++;&#13;
				}&#13;
&#13;
				square.changeColor(checkColor(red + mRed), checkColor(green + mGreen), checkColor(blue + mBlue));&#13;
			}&#13;
		}&#13;
	}&#13;
}&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Otra clase &lt;b&gt;NonsenseSquare.as&lt;/b&gt;:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
package {&#13;
	import flash.display.Sprite;&#13;
	import flash.display.Shape;&#13;
	import flash.display.SimpleButton;&#13;
	import flash.events.Event;&#13;
	import flash.events.MouseEvent;&#13;
	import flash.geom.ColorTransform;&#13;
	import flash.text.TextField;&#13;
	import GiveMeA;&#13;
	&#13;
	public class NonsenseSquare extends Sprite {&#13;
		protected var _square:Shape;&#13;
		protected var _button:SimpleButton;&#13;
		protected var _label:TextField;&#13;
		protected var _grandfather:NonsenseColors;&#13;
		protected var _width:uint;&#13;
		protected var _height:uint;&#13;
		&#13;
		public function NonsenseSquare(posX:Number,posY:Number,grandfather:NonsenseColors) {&#13;
			x = posX;&#13;
			y = posY;&#13;
			_grandfather = grandfather;&#13;
			_width = 50;&#13;
			_height = 50;&#13;
			drawSquare();&#13;
			drawLabel();&#13;
			drawButton();&#13;
		}&#13;
		&#13;
		protected function drawSquare():void {&#13;
			_square = GiveMeA.newRect(_width,_height);&#13;
			addChild(_square);&#13;
		}&#13;
&#13;
		protected function drawButton():void {&#13;
			_button = new SimpleButton();&#13;
			_button.hitTestState = _square;&#13;
			_button.addEventListener(MouseEvent.ROLL_OVER,onMouseOver);&#13;
			_button.addEventListener(MouseEvent.ROLL_OUT,onMouseOut);&#13;
			_button.addEventListener(MouseEvent.CLICK,onMouseClick);&#13;
			addChild(_button);&#13;
		}&#13;
		&#13;
		protected function drawLabel():void {&#13;
			_label = new TextField();&#13;
			_label.background = true;&#13;
			_label.backgroundColor = 0xFFFFCC&#13;
			_label.defaultTextFormat = GiveMeA.newTextFormat(0x555555);&#13;
			_label.text = &amp;quot;Ok&amp;quot;;&#13;
			_label.height = _label.textHeight * 1.2;&#13;
			_label.width = 70;&#13;
			_label.visible = false;&#13;
			addChild(_label);&#13;
		}&#13;
		&#13;
		protected function onMouseOver(event:MouseEvent) {&#13;
			parent.setChildIndex(this,parent.numChildren - 1);&#13;
			_label.visible = true;&#13;
			addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove);&#13;
		}&#13;
		&#13;
		protected function onMouseOut(event:MouseEvent) {&#13;
			_label.visible = false;&#13;
			removeEventListener(MouseEvent.MOUSE_MOVE,onMouseMove);&#13;
		}&#13;
		&#13;
		protected function onMouseMove(event:MouseEvent) {&#13;
			_label.x = event.localX;&#13;
			_label.y = event.localY - _label.height;&#13;
		}&#13;
		&#13;
		public function onMouseClick(event:MouseEvent) {&#13;
			_grandfather.changeTextInput(_label.text);&#13;
		}&#13;
		&#13;
		public function decToHex(dec:uint):String {&#13;
			var str:String;&#13;
			str = &amp;quot;0&amp;quot; + dec.toString(16);&#13;
			return str.substr(-2).toUpperCase();&#13;
		}&#13;
		&#13;
		public function changeColor(red:uint,green:uint,blue:uint):void {&#13;
			_square.transform.colorTransform = new ColorTransform(0,0,0,1,red,green,blue);&#13;
			_label.text =  decToHex(red) + decToHex(green) + decToHex(blue);&#13;
		}&#13;
	}&#13;
}&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Y una clase más, &lt;b&gt;GiveMeA.as&lt;/b&gt;:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
package {&#13;
	import flash.display.Shape;&#13;
	import flash.text.TextFormat;&#13;
	import flash.text.TextFormatAlign;&#13;
	&#13;
	public class GiveMeA {&#13;
		public static function newRect(width:uint,height:uint,color:uint=0):Shape {&#13;
			var rect:Shape = new Shape();&#13;
			rect.graphics.beginFill(color);&#13;
			rect.graphics.drawRect(0,0,width,height);&#13;
			rect.graphics.endFill();&#13;
			return rect;&#13;
		}&#13;
	&#13;
		public static function newTextFormat(color:uint=0,size:uint=0,align:String=null,font:String=null):TextFormat {&#13;
			var format:TextFormat = new TextFormat();&#13;
			format.align = (align == null ? TextFormatAlign.CENTER : align);&#13;
			format.bold = true;&#13;
			format.blockIndent = 5;&#13;
			format.color = color;&#13;
			format.font = (font == null ? &amp;quot;Trebuchet MS,Arial&amp;quot; : font);&#13;
			format.size = (size == 0 ? 14 : size);&#13;
			return format;&#13;
		}&#13;
	}&#13;
}&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Si no sabes como empezar, te recomiendo otro post que escribí:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;a href=&quot;http://www.stan.com.mx/topics/view/2/&quot;&gt;ActionScript 3.0 Para Bobos!&lt;/a&gt;&lt;br /&gt;</description>
		</item>
		<item>
			<title>Introducción A La Programación Dinámica</title>
			<link>http://www.stan.com.mx/topics/view/7</link>
			<guid>http://www.stan.com.mx/topics/view/7</guid>
			<comments>http://www.stan.com.mx/topics/view/7#comments</comments>
			<pubDate>Fri, 26 Sep 2008 19:02:40 -0500</pubDate>
			<author>kiewic@gmail.com (Gilberto Stankiewicz)</author>
			<category>topics</category>
			<description>Hace pocos días, los muchachos de Bátiz y Martín me dieron una clase de programación dinámica. Los pasos para dominar esta técnica son:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;1. Tener Un Problema Que Se Resuelva Con Programación Dinámica&lt;/h2&gt;
&lt;br /&gt;&#13;
Creo que un borrego necesita recorrer un tablero de &lt;b&gt;Y&lt;/b&gt; filas y &lt;b&gt;X&lt;/b&gt; columnas, empieza en la casilla superior izquierda y termina en la casilla inferior derecha. Cada casilla tiene un costo en vitaminas y el borrego quiere gastar la menor cantidad de vitaminas posibles.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/ProgramacionDinamicaProblema.gif&quot; alt=&quot;Problema de programación dinámica.&quot;  width=&quot;282&quot; height=&quot;122&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
Por cierto, el borrego sólo puede caminar para abajo y para la derecha.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/ProgramacionDinamicaMovimientos.gif&quot; alt=&quot;Posibles movimientos.&quot;  width=&quot;282&quot; height=&quot;122&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
Ajá! Un mínimo! Dicen que si el problema te pide &lt;b&gt;un mínimo o un máximo, entonces huele a programación dinámica.&lt;/b&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Una posible entrada para este problema sería:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
2 3&#13;
1 4 2&#13;
2 3 6&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;2. Dibujar El Árbol De Búsqueda&lt;/h2&gt;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/ProgramacionDinamicaArbol.gif&quot; alt=&quot;Árbol de búsqueda.&quot;  width=&quot;710&quot; height=&quot;510&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
Como verán, el árbol tiene un crecimiento exponencial en potencias de dos (2&lt;sup&gt;n&lt;/sup&gt;).&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Algunos nodos como el &lt;b&gt;y=1,x=1&lt;/b&gt; se calculan varias veces. Más adelante podemos utilizar memorización para ahorrar cálculos.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;3. Versión Backtracking&lt;/h2&gt;
&lt;br /&gt;&#13;
Esa búsqueda tiene una implementación con Backtracking muy sencilla.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
#include &amp;lt;iostream&amp;gt;&#13;
#include &amp;lt;climits&amp;gt;&#13;
&#13;
#define Y_MAX 1111&#13;
#define X_MAX 1111&#13;
&#13;
using namespace std;&#13;
&#13;
int Y, X;&#13;
int tablero[Y_MAX][X_MAX];&#13;
&#13;
int minimo (int a, int b) {&#13;
	return (a &amp;lt; b ? a :  b);&#13;
}&#13;
&#13;
int f (int y, int x) {&#13;
	// destino final&#13;
	if (y == Y - 1 &amp;amp;&amp;amp; x == X -1)&#13;
		return tablero[y][x];&#13;
	// fuera del tablero&#13;
	if (x &amp;gt;= X || y &amp;gt;= Y)&#13;
		return INT_MAX;&#13;
	// calcular el mejor camino desde aquí&#13;
	return minimo(f(y + 1, x), f(y, x + 1)) + tablero[y][x];	&#13;
}&#13;
&#13;
int main () {&#13;
	cin &amp;gt;&amp;gt; Y;&#13;
	cin &amp;gt;&amp;gt; X;&#13;
	&#13;
	// entrada&#13;
	for (int y = 0; y &amp;lt; Y; y++) {&#13;
		for (int x = 0; x &amp;lt; X; x++) {&#13;
			cin &amp;gt;&amp;gt; tablero[y][x];&#13;
		}&#13;
	}&#13;
	&#13;
	// salida&#13;
	cout &amp;lt;&amp;lt; f(0, 0) &amp;lt;&amp;lt; endl;&#13;
}&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;4. Versión Backtracking Con Memorización&lt;/h2&gt;
&lt;br /&gt;&#13;
Guardar en memoria los valores ya calculados, evita calcular varias veces el mismo dato y mejora considerablemente el tiempo.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
#include &amp;lt;iostream&amp;gt;&#13;
#include &amp;lt;climits&amp;gt;&#13;
&#13;
#define Y_MAX 1111&#13;
#define X_MAX 1111&#13;
&#13;
using namespace std;&#13;
&#13;
int Y, X;&#13;
int tablero[Y_MAX][X_MAX];&#13;
int poda[Y_MAX][X_MAX];&#13;
&#13;
int minimo(int a, int b) {&#13;
	return (a &amp;lt; b ? a :  b);&#13;
}&#13;
&#13;
int f(int y, int x) {&#13;
	// destino final&#13;
	if (y == Y - 1 &amp;amp;&amp;amp; x == X -1)&#13;
		return tablero[y][x];&#13;
	// fuera del tablero&#13;
	if (x &amp;gt;= X || y &amp;gt;= Y)&#13;
		return INT_MAX;&#13;
	if (poda[y][x] == 0)&#13;
		poda[y][x] = minimo(f(y + 1, x), f(y, x + 1)) + tablero[y][x];&#13;
	return 	poda[y][x];&#13;
}&#13;
&#13;
int main () {&#13;
	cin &amp;gt;&amp;gt; Y;&#13;
	cin &amp;gt;&amp;gt; X;&#13;
	&#13;
	// entrada&#13;
	for (int y = 0; y &amp;lt; Y; y++) {&#13;
		for (int x = 0; x &amp;lt; X; x++) {&#13;
			cin &amp;gt;&amp;gt; tablero[y][x];&#13;
		}&#13;
	}&#13;
	&#13;
	// salida&#13;
	cout &amp;lt;&amp;lt; f(0, 0) &amp;lt;&amp;lt; endl;&#13;
}&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;5. Encontrar La Función De Programación Dinámica&lt;/h2&gt;
&lt;br /&gt;&#13;
Una implementación con Programación Dinámica será más eficiente. ¿Pero cómo se calculan los valores? Analizando el árbol, se ve que el valor de un nodo depende de los siguientes nodos.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Entonces, para llenar la tabla deberá de llenarse primero los niveles más avanzados. En este caso sería de abajo para arriba y de izquierda a derecha.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Cada condición del backtracking se debe analizar para ver si se incluyen en la versión dinámica o no. En este caso son los límites &lt;code&gt;if (x &amp;gt;= X || y &amp;gt;= Y)&lt;/code&gt;.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
La importancia de la programación dinámica es eliminar la recursividad.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;6. Versión Programación Dinámica&lt;/h2&gt;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
#include &amp;lt;iostream&amp;gt;&#13;
#include &amp;lt;climits&amp;gt;&#13;
&#13;
#define Y_MAX 1111&#13;
#define X_MAX 1111&#13;
&#13;
using namespace std;&#13;
&#13;
int Y, X;&#13;
int tablero[Y_MAX][X_MAX];&#13;
&#13;
int minimo(int a, int b) {&#13;
	return (a &amp;lt; b ? a :  b);&#13;
}&#13;
&#13;
int main () {&#13;
	cin &amp;gt;&amp;gt; Y;&#13;
	cin &amp;gt;&amp;gt; X;&#13;
	&#13;
	// entrada	&#13;
	for (int y = 0; y &amp;lt; Y; y++) {&#13;
		for (int x = 0; x &amp;lt; X; x++) {&#13;
			cin &amp;gt;&amp;gt; tablero[y][x];&#13;
		}&#13;
	}&#13;
	&#13;
	// poner infinitos&#13;
	for (int y = 0; y &amp;lt; Y; y++) {&#13;
		tablero[y][X] = INT_MAX;&#13;
	}&#13;
	&#13;
	for (int x = 0; x &amp;lt; X; x++) {&#13;
		tablero[Y][x] = INT_MAX;&#13;
	}&#13;
	&#13;
	// poner ceros en casillas adyacentes a la casilla final&#13;
	tablero[Y-1][X] = 0;&#13;
	tablero[Y][X-1] = 0;&#13;
	&#13;
	// programación dinámica&#13;
	for (int y = Y - 1; y &amp;gt;= 0; y--) {&#13;
		for (int x = X - 1; x &amp;gt;= 0; x--) {&#13;
			tablero[y][x] += minimo(tablero[y + 1][x], tablero[y][x + 1]);&#13;
		}&#13;
	}&#13;
	&#13;
	// salida&#13;
	cout &amp;lt;&amp;lt; tablero[0][0] &amp;lt;&amp;lt; endl;&#13;
}&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;7. Prueba De Escritorio&lt;/h2&gt;
&lt;br /&gt;&#13;
Al finalizar la ejecución, el tablero en memoria debe terminar así:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/ProgramacionDinamicaPrueba.gif&quot; alt=&quot;Prueba de escritorio del problema de programación dinámica.&quot;  width=&quot;282&quot; height=&quot;122&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
&lt;h2&gt;8. Resultados Interesantes&lt;/h2&gt;
&lt;br /&gt;&#13;
Por último, analicemos los tiempos (en milisegundos) con cada versión y diferentes casos de prueba. &lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;table&gt;&lt;tr&gt;&lt;td&gt; Caso De Prueba &lt;/td&gt;&lt;td&gt; &lt;b&gt;Backtracking&lt;/b&gt; &lt;/td&gt;&lt;td&gt; &lt;b&gt;Backtracking Con Memorización&lt;/b&gt; &lt;/td&gt;&lt;td&gt; &lt;b&gt;Programación Dinámica&lt;/b&gt; &lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt; 10x10 &lt;/td&gt;&lt;td&gt; 35 &lt;/td&gt;&lt;td&gt; 35 &lt;/td&gt;&lt;td&gt; 35 &lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt; 100x100 &lt;/td&gt;&lt;td&gt; mucho &lt;/td&gt;&lt;td&gt; 75 &lt;/td&gt;&lt;td&gt; 70 &lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt; 1000x1000 &lt;/td&gt;&lt;td&gt; muchísimo &lt;/td&gt;&lt;td&gt; 3895 &lt;/td&gt;&lt;td&gt; 3844 &lt;/td&gt;&lt;/tr&gt;&#13;
&lt;/table&gt;</description>
		</item>
		<item>
			<title>¿Cómo Resolver Un Juego De Mesa Con C++?</title>
			<link>http://www.stan.com.mx/topics/view/8</link>
			<guid>http://www.stan.com.mx/topics/view/8</guid>
			<comments>http://www.stan.com.mx/topics/view/8#comments</comments>
			<pubDate>Fri, 26 Sep 2008 19:02:25 -0500</pubDate>
			<author>kiewic@gmail.com (Gilberto Stankiewicz)</author>
			<category>topics</category>
			<description>Alguna vez un amigo me regaló un juego de mesa que se hace llamar Solitario.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/SolitarioCaja.jpg&quot; alt=&quot;Solitario de Fotorama de México.&quot;  width=&quot;300&quot; height=&quot;300&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
La forma de jugar es mover una pieza por encima de otra, o sea, brincarla. Entonces la pieza que nos hemos saltado, debe desaparecer del tablero, nos la comemos. Más o menos como se juega en las damas inglesas. Al final debe quedar solo una pieza en el tablero.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Entonces tenemos un programita que puede encontrar un montón de soluciones para este problema.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
#include &amp;lt;iostream&amp;gt;&#13;
#include &amp;lt;conio.h&amp;gt;&#13;
&#13;
using namespace std;&#13;
&#13;
int tablero[5][5];&#13;
int pila[15][4];&#13;
int piezas;&#13;
&#13;
void llenarTablero () {&#13;
	for (int i = 0; i &amp;lt; 5; i++) {&#13;
		for (int j = 0; j &amp;lt;= i; j++) {&#13;
			tablero[i][j] = 1;&#13;
		}&#13;
	}&#13;
}&#13;
&#13;
void imprimirTablero () {&#13;
	for (int i = 0; i &amp;lt; 5; i++) {&#13;
		for (int j = 0; j &amp;lt; 4 - i; j++) {&#13;
			cout &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&#13;
		}&#13;
		for (int j = 0; j &amp;lt;= i; j++) {&#13;
			cout &amp;lt;&amp;lt; tablero[i][j] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&#13;
		}&#13;
		cout &amp;lt;&amp;lt; endl;&#13;
	}&#13;
}&#13;
&#13;
void imprimirPila () {&#13;
	cout &amp;lt;&amp;lt; endl;&#13;
	for (int i = 0; i &amp;lt; 13; i++) {&#13;
		cout &amp;lt;&amp;lt; pila[i][0] &amp;lt;&amp;lt; &amp;quot;,&amp;quot; &amp;lt;&amp;lt; pila[i][1] &amp;lt;&amp;lt; &amp;quot; &amp;gt; &amp;quot; &amp;lt;&amp;lt; pila[i][2] &amp;lt;&amp;lt; &amp;quot;,&amp;quot; &amp;lt;&amp;lt; pila[i][3] &amp;lt;&amp;lt; endl;&#13;
	}&#13;
	cout &amp;lt;&amp;lt; endl;&#13;
	getch();&#13;
}&#13;
&#13;
void deshacerBrinco(int y0, int x0, int y1, int x1, int y2, int x2) {&#13;
	// ocupar posición inicial&#13;
	tablero[y0][x0] = 1;&#13;
	// ocupar posision intermedia&#13;
	tablero[y1][x1] = 1;&#13;
	// desocupar posición final &#13;
	tablero[y2][x2] = 0;&#13;
}&#13;
&#13;
// 0s son posición inicial&#13;
// 1s son posición intermedia&#13;
// 2s son posición final&#13;
int hacerBrinco (int y0, int x0, int y1, int x1, int y2, int x2) {&#13;
	// posición final dentro del tablero&#13;
	if (y2 &amp;gt;= 0 &amp;amp;&amp;amp; y2 &amp;lt; 5 &amp;amp;&amp;amp; x2 &amp;gt;= 0 &amp;amp;&amp;amp; x2 &amp;lt;= y2) {&#13;
		// posición intermedia ocupada&#13;
		// posición final vacía&#13;
		if (tablero[y1][x1] == 1 &amp;amp;&amp;amp; tablero[y2][x2] == 0) {&#13;
			// desocupar posición inicial&#13;
			tablero[y0][x0] = 0;&#13;
			// desocupar posision intermedia&#13;
			tablero[y1][x1] = 0;&#13;
			// ocupar posición final &#13;
			tablero[y2][x2] = 1;&#13;
&#13;
			// guardar movimiento en pila&#13;
			pila[14 - piezas][0] = y0;&#13;
			pila[14 - piezas][1] = x0;&#13;
			pila[14 - piezas][2] = y2;&#13;
			pila[14 - piezas][3] = x2;&#13;
&#13;
			void siguienteSalto();&#13;
			siguienteSalto();&#13;
			deshacerBrinco(y0, x0, y1, x1, y2, x2);&#13;
			&#13;
			return 1;&#13;
		}&#13;
	}&#13;
	return 0;&#13;
}&#13;
&#13;
void siguienteSalto () {&#13;
	if (--piezas == 1) {&#13;
		imprimirTablero();&#13;
		imprimirPila();&#13;
	}&#13;
&#13;
	if (piezas &amp;gt; 1) {&#13;
		for (int i = 0; i &amp;lt; 5; i++) {&#13;
			for (int j = 0; j &amp;lt;= i; j++) {&#13;
				// posición actual ocupada&#13;
				if (tablero[i][j] == 1) {&#13;
					// izquierda&#13;
					hacerBrinco(i, j, i, j - 1, i, j - 2);&#13;
					// derecha&#13;
					hacerBrinco(i, j, i, j + 1, i, j + 2);&#13;
					// arriba izquierda&#13;
					hacerBrinco(i, j, i - 1, j - 1, i - 2, j - 2);&#13;
					// arriba derecha&#13;
					hacerBrinco(i, j, i - 1, j, i - 2, j);&#13;
					// abajo izquierda&#13;
					hacerBrinco(i, j, i + 1, j - 1, i + 2, j - 2);&#13;
					// abajo derecha&#13;
					hacerBrinco(i, j, i + 1, j, i + 2, j);&#13;
				}&#13;
			}&#13;
		}&#13;
	}&#13;
&#13;
	++piezas;&#13;
}&#13;
&#13;
void quitarPrimera () {&#13;
	for (int i = 0; i &amp;lt; 5; i++) {&#13;
		for (int j = 0; j &amp;lt;= i; j++) {&#13;
			tablero[i][j] = 0; // quitar&#13;
			siguienteSalto();&#13;
			tablero[i][j] = 1; // poner&#13;
		}&#13;
	}&#13;
}&#13;
&#13;
int main () {&#13;
	llenarTablero();&#13;
	piezas = 15;&#13;
	quitarPrimera();&#13;
}&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
La representación del tablero en memoria es algo así.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/SolitarioMatriz.jpg&quot; alt=&quot;Representación del solitario en memoria.&quot;  width=&quot;333&quot; height=&quot;300&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
La salida hasta el primer &lt;code&gt;getch()&lt;/code&gt; es ..&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
    1&#13;
   0 0&#13;
  0 0 0&#13;
 0 0 0 0&#13;
0 0 0 0 0&#13;
&#13;
2,2 &amp;gt; 0,0&#13;
2,0 &amp;gt; 2,2&#13;
0,0 &amp;gt; 2,0&#13;
3,0 &amp;gt; 1,0&#13;
3,3 &amp;gt; 1,1&#13;
4,2 &amp;gt; 2,0&#13;
1,0 &amp;gt; 3,0&#13;
4,0 &amp;gt; 2,0&#13;
4,4 &amp;gt; 4,2&#13;
4,1 &amp;gt; 4,3&#13;
4,3 &amp;gt; 2,1&#13;
2,0 &amp;gt; 2,2&#13;
2,2 &amp;gt; 0,0&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
.. lo que significa ..&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/SolitarioTablero00.jpg&quot; alt=&quot;Solitario después de 0 movimeintos.&quot;  width=&quot;266&quot; height=&quot;200&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/SolitarioTablero01.jpg&quot; alt=&quot;Solitario después de 1 movimeintos.&quot;  width=&quot;266&quot; height=&quot;200&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/SolitarioTablero02.jpg&quot; alt=&quot;Solitario después de 2 movimeintos.&quot;  width=&quot;266&quot; height=&quot;200&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/SolitarioTablero03.jpg&quot; alt=&quot;Solitario después de 3 movimeintos.&quot;  width=&quot;266&quot; height=&quot;200&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/SolitarioTablero04.jpg&quot; alt=&quot;Solitario después de 4 movimeintos.&quot;  width=&quot;266&quot; height=&quot;200&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/SolitarioTablero05.jpg&quot; alt=&quot;Solitario después de 5 movimeintos.&quot;  width=&quot;266&quot; height=&quot;200&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/SolitarioTablero06.jpg&quot; alt=&quot;Solitario después de 6 movimeintos.&quot;  width=&quot;266&quot; height=&quot;200&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/SolitarioTablero07.jpg&quot; alt=&quot;Solitario después de 7 movimeintos.&quot;  width=&quot;266&quot; height=&quot;200&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/SolitarioTablero08.jpg&quot; alt=&quot;Solitario después de 8 movimeintos.&quot;  width=&quot;266&quot; height=&quot;200&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/SolitarioTablero09.jpg&quot; alt=&quot;Solitario después de 9 movimeintos.&quot;  width=&quot;266&quot; height=&quot;200&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/SolitarioTablero10.jpg&quot; alt=&quot;Solitario después de 10 movimeintos.&quot;  width=&quot;266&quot; height=&quot;200&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/SolitarioTablero11.jpg&quot; alt=&quot;Solitario después de 11 movimeintos.&quot;  width=&quot;266&quot; height=&quot;200&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/SolitarioTablero12.jpg&quot; alt=&quot;Solitario después de 12 movimeintos.&quot;  width=&quot;266&quot; height=&quot;200&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/SolitarioTablero13.jpg&quot; alt=&quot;Solitario después de 13 movimeintos.&quot;  width=&quot;266&quot; height=&quot;200&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
Y eso es todo.&lt;br /&gt;</description>
		</item>
		<item>
			<title>Presentaciones Con PowerPoint</title>
			<link>http://www.stan.com.mx/topics/view/9</link>
			<guid>http://www.stan.com.mx/topics/view/9</guid>
			<comments>http://www.stan.com.mx/topics/view/9#comments</comments>
			<pubDate>Fri, 26 Sep 2008 19:01:43 -0500</pubDate>
			<author>kiewic@gmail.com (Gilberto Stankiewicz)</author>
			<category>topics</category>
			<description>Cuando es temporada de exposiciones en al escuela, algunos compañeros usan Flash para sus presentaciones. La verdad me parece que &lt;b&gt;hacer algo en Flash que se podía haber hecho en PowerPoint es un desperdicio de tiempo.&lt;/b&gt; Flash requiere mucho tiempo más, aún cuando se usan sus plantillas para presentaciones. &lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Yo solía hacer gráficas y presentaciones en Flash, pero la verdad es que en exposiciones tan cortas nadie lo nota. Ahora me dedico a realizar mis presentaciones con PowerPoint, como la última para la clase de Economía.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointMaiz01.gif&quot; alt=&quot;Importaciones Y Exportaciones de Maíz&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointMaiz02.gif&quot; alt=&quot;Importaciones Y Exportaciones de Maíz&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointMaiz03.gif&quot; alt=&quot;Importaciones Y Exportaciones de Maíz&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointMaiz04.gif&quot; alt=&quot;Importaciones Y Exportaciones de Maíz&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointMaiz05.gif&quot; alt=&quot;Importaciones Y Exportaciones de Maíz&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointMaiz06.gif&quot; alt=&quot;Importaciones Y Exportaciones de Maíz&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointMaiz07.gif&quot; alt=&quot;Importaciones Y Exportaciones de Maíz&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointMaiz08.gif&quot; alt=&quot;Importaciones Y Exportaciones de Maíz&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
La última de Ingeniería de Software II.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointUML01.gif&quot; alt=&quot;UML Studio&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointUML02.gif&quot; alt=&quot;UML Studio&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointUML03.gif&quot; alt=&quot;UML Studio&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointUML04.gif&quot; alt=&quot;UML Studio&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointUML05.gif&quot; alt=&quot;UML Studio&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointUML06.gif&quot; alt=&quot;UML Studio&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointUML07.gif&quot; alt=&quot;UML Studio&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointUML08.gif&quot; alt=&quot;UML Studio&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointUML09.gif&quot; alt=&quot;UML Studio&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointUML10.gif&quot; alt=&quot;UML Studio&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
O la primera de Electrónica Analógica.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointPortadores01.gif&quot; alt=&quot;Portadores de Carga&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointPortadores02.gif&quot; alt=&quot;Portadores de Carga&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointPortadores03.gif&quot; alt=&quot;Portadores de Carga&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointPortadores04.gif&quot; alt=&quot;Portadores de Carga&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointPortadores05.gif&quot; alt=&quot;Portadores de Carga&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointPortadores06.gif&quot; alt=&quot;Portadores de Carga&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointPortadores07.gif&quot; alt=&quot;Portadores de Carga&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;img src=&quot;http://www.stan.com.mx/images/PowerPointPortadores08.gif&quot; alt=&quot;Portadores de Carga&quot;  width=&quot;300&quot; height=&quot;225&quot; /&gt;&#13;
&lt;/div&gt;</description>
		</item>
		<item>
			<title>INNER JOIN, LEFT OUTER JOIN y RIGHT OUTER JOIN en MySQL Explicado Con Diptongos y Hiatos</title>
			<link>http://www.stan.com.mx/topics/view/10</link>
			<guid>http://www.stan.com.mx/topics/view/10</guid>
			<comments>http://www.stan.com.mx/topics/view/10#comments</comments>
			<pubDate>Fri, 26 Sep 2008 19:01:18 -0500</pubDate>
			<author>kiewic@gmail.com (Gilberto Stankiewicz)</author>
			<category>topics</category>
			<description>Hola, hoy platicaremos un poco de Joins (Uniones) en MySQL. Y de paso podemos repasar que son los diptongos, hiatos y triptongos.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Para los ejemplos, necesitamos crear y llenar tres tablas. La primera es un catálogo de las reglas gramaticales para los acentos:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
CREATE TABLE regla (&#13;
	idRegla VARCHAR(1) DEFAULT &amp;#039;&amp;#039; PRIMARY KEY,&#13;
	nombre VARCHAR(20) DEFAULT &amp;#039;&amp;#039; NOT NULL,&#13;
	descripcion VARCHAR(250) DEFAULT &amp;#039;&amp;#039; NOT NULL&#13;
);&#13;
&#13;
INSERT INTO regla VALUES (&amp;#039;A&amp;#039;,&amp;#039;aguda&amp;#039;,&amp;#039;última sílaba&amp;#039;);&#13;
INSERT INTO regla VALUES (&amp;#039;G&amp;#039;,&amp;#039;grave&amp;#039;,&amp;#039;penúltima sílaba&amp;#039;);&#13;
INSERT INTO regla VALUES (&amp;#039;E&amp;#039;,&amp;#039;esdrújula&amp;#039;,&amp;#039;antepenúltima sílaba&amp;#039;);&#13;
INSERT INTO regla VALUES (&amp;#039;S&amp;#039;,&amp;#039;sobreesdrújula&amp;#039;,&amp;#039;trasantepenúltima sílaba&amp;#039;);&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
La segunda tabla es un catálogo de casos especiales, tales como diptongo, hiato y triptongo.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
CREATE TABLE caso (&#13;
	idCaso VARCHAR(1) DEFAULT &amp;#039;&amp;#039; PRIMARY KEY,&#13;
	nombre VARCHAR(20) DEFAULT &amp;#039;&amp;#039; NOT NULL,&#13;
	descripcion VARCHAR(250) DEFAULT &amp;#039;&amp;#039; NOT NULL&#13;
);&#13;
&#13;
INSERT INTO caso VALUES (&amp;#039;H&amp;#039;,&amp;#039;hiato&amp;#039;,&amp;#039;dos vocales fuertes están juntas | una vocal fuerte está junto con una vocal débil que suena más fuerte (en este caso siempre se acentúa la vocal débil)&amp;#039;);&#13;
INSERT INTO caso VALUES (&amp;#039;D&amp;#039;,&amp;#039;diptongo&amp;#039;,&amp;#039;&amp;#039;);&#13;
INSERT INTO caso VALUES (&amp;#039;T&amp;#039;,&amp;#039;triptongo&amp;#039;,&amp;#039;&amp;#039;);&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Y la tercera tabla almacena las palabras que vamos a estudiar.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
CREATE TABLE palabra (&#13;
	cadena VARCHAR(20) DEFAULT &amp;#039;&amp;#039; PRIMARY KEY,&#13;
	idRegla VARCHAR(1) NULL,&#13;
	idCaso VARCHAR(1) NULL,&#13;
	FOREIGN KEY (idRegla) REFERENCES regla (idRegla),&#13;
	FOREIGN KEY (idCaso) REFERENCES caso (idCaso)&#13;
);&#13;
&#13;
INSERT INTO palabra VALUES (&amp;#039;Raúl&amp;#039;,&amp;#039;A&amp;#039;,&amp;#039;H&amp;#039;);&#13;
INSERT INTO palabra VALUES (&amp;#039;baúl&amp;#039;,&amp;#039;A&amp;#039;,&amp;#039;H&amp;#039;);&#13;
INSERT INTO palabra VALUES (&amp;#039;bahía&amp;#039;,&amp;#039;G&amp;#039;,&amp;#039;H&amp;#039;);&#13;
INSERT INTO palabra VALUES (&amp;#039;tía&amp;#039;,&amp;#039;G&amp;#039;,&amp;#039;H&amp;#039;);&#13;
INSERT INTO palabra VALUES (&amp;#039;aéreo&amp;#039;,&amp;#039;E&amp;#039;,&amp;#039;H&amp;#039;);&#13;
INSERT INTO palabra VALUES (&amp;#039;canción&amp;#039;,&amp;#039;A&amp;#039;,&amp;#039;D&amp;#039;);&#13;
INSERT INTO palabra VALUES (&amp;#039;estuvo&amp;#039;,&amp;#039;G&amp;#039;,NULL);&#13;
INSERT INTO palabra VALUES (&amp;#039;país&amp;#039;,&amp;#039;A&amp;#039;,&amp;#039;H&amp;#039;);&#13;
INSERT INTO palabra VALUES (&amp;#039;maíz&amp;#039;,&amp;#039;A&amp;#039;,&amp;#039;H&amp;#039;);&#13;
&#13;
INSERT INTO palabra VALUES (&amp;#039;nunca&amp;#039;,&amp;#039;G&amp;#039;,NULL);&#13;
INSERT INTO palabra VALUES (&amp;#039;jamás&amp;#039;,&amp;#039;A&amp;#039;,NULL);&#13;
&#13;
INSERT INTO palabra VALUES (&amp;#039;quiero&amp;#039;,&amp;#039;G&amp;#039;,&amp;#039;T&amp;#039;);&#13;
INSERT INTO palabra VALUES (&amp;#039;ver&amp;#039;,NULL,NULL);&#13;
INSERT INTO palabra VALUES (&amp;#039;tu&amp;#039;,NULL,NULL);&#13;
INSERT INTO palabra VALUES (&amp;#039;risa&amp;#039;,&amp;#039;G&amp;#039;,NULL);&#13;
INSERT INTO palabra VALUES (&amp;#039;todo&amp;#039;,&amp;#039;G&amp;#039;,NULL);&#13;
INSERT INTO palabra VALUES (&amp;#039;el&amp;#039;,DEFAULT,DEFAULT);&#13;
INSERT INTO palabra VALUES (&amp;#039;día&amp;#039;,&amp;#039;G&amp;#039;,&amp;#039;H&amp;#039;);&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Si seleccionamos todas las palabras &lt;b&gt;tenemos 18 filas&lt;/b&gt;.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
SELECT *&#13;
FROM palabra;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Si seleccionamos todas las palabras que no tiene una regla gramatical tenemos &lt;b&gt;3 filas&lt;/b&gt;.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
SELECT *&#13;
FROM palabra&#13;
WHERE idRegla IS NULL;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;[INNER] JOIN&lt;/h2&gt;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/MySQLInnerJoin.gif&quot; alt=&quot;INNER JOIN con teoría de conjuntos.&quot;  width=&quot;360&quot; height=&quot;214&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
Seleccionamos &lt;b&gt;sólo las palabras que tienen regla&lt;/b&gt; gramatical.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
-- 15 rows (sólo palabras con regla)&#13;
SELECT p.cadena, r.nombre&#13;
FROM palabra AS p&#13;
INNER JOIN regla AS r ON p.idRegla = r.idRegla;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Entonces tenemos &lt;b&gt;15 filas&lt;/b&gt;.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
cadena  nombre&#13;
------- ------&#13;
baúl    aguda&#13;
canción aguda&#13;
jamás   aguda&#13;
maíz    aguda&#13;
país    aguda&#13;
Raúl    aguda&#13;
aéreo   esdrújula&#13;
bahía   grave&#13;
día     grave&#13;
estuvo  grave&#13;
nunca   grave&#13;
quiero  grave&#13;
risa    grave&#13;
tía     grave&#13;
todo    grave&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;LEFT [OUTER] JOIN&lt;/h2&gt;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/MySQLLeftOuterJoin.gif&quot; alt=&quot;LEFT OUTER JOIN con teoría de conjuntos.&quot;  width=&quot;360&quot; height=&quot;214&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
Ahora seleccionamos &lt;b&gt;todas las palabras&lt;/b&gt; aunque no tengan regla gramatical. &lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
-- 18 rows (todas las palabras, aunque no tengan regla)&#13;
SELECT p.cadena, r.nombre&#13;
FROM palabra AS p&#13;
LEFT OUTER JOIN regla AS r ON p.idRegla = r.idRegla;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Entonces tenemos &lt;b&gt;18 filas.&lt;/b&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
cadena  nombre&#13;
------- ------&#13;
el&#13;
tu&#13;
ver&#13;
baúl    aguda&#13;
canción aguda&#13;
jamás   aguda&#13;
maíz    aguda&#13;
país    aguda&#13;
Raúl    aguda&#13;
aéreo   esdrújula&#13;
bahía   grave&#13;
día     grave&#13;
estuvo  grave&#13;
nunca   grave&#13;
quiero  grave&#13;
risa    grave&#13;
tía     grave&#13;
todo    grave&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;RIGHT [OUTER] JOIN&lt;/h2&gt;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/MySQLRightOuterJoin.gif&quot; alt=&quot;RIGHT OUTER JOIN con teoría de conjuntos.&quot;  width=&quot;360&quot; height=&quot;214&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
Ahora seleccionamos &lt;b&gt;todas las reglas&lt;/b&gt; gramaticales aunque no existan palabras asociadas.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
-- 16 rows (15 palabras con regla + 1 regla sin palabras)&#13;
SELECT p.cadena, r.nombre&#13;
FROM palabra AS p&#13;
RIGHT OUTER JOIN regla AS r ON p.idRegla = r.idRegla;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Entonces tenemos &lt;b&gt;16 filas.&lt;/b&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
cadena  nombre&#13;
------- ------&#13;
baúl    aguda&#13;
canción aguda&#13;
jamás   aguda&#13;
maíz    aguda&#13;
país    aguda&#13;
Raúl    aguda&#13;
aéreo   esdrújula&#13;
bahía   grave&#13;
día     grave&#13;
estuvo  grave&#13;
nunca   grave&#13;
quiero  grave&#13;
risa    grave&#13;
tía     grave&#13;
todo    grave&#13;
        sobreesdrújula&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;NATURAL JOIN&lt;/h2&gt;
&lt;br /&gt;&#13;
El &lt;code&gt;NATURAL JOIN&lt;/code&gt; nos ahorra la fastidiosa tarea de escribir las condiciones &lt;code&gt;ON ..&lt;/code&gt; si hemos trabajado correctamente con las llaves primarias (&lt;code&gt;PRIMARY KEY&lt;/code&gt;) y las llaves foraneas (&lt;code&gt;FOREIGN KEY&lt;/code&gt;).&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Así que podemos reescribir las consultas anteriores usando la sintaixs del &lt;code&gt;NATURAL JOIN&lt;/code&gt;.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
-- 15 rows (sólo palabras con regla)&#13;
SELECT p.cadena, r.nombre&#13;
FROM palabra AS p&#13;
NATURAL JOIN regla AS r;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
-- 18 rows (todas las palabras, aunque no tengan regla)&#13;
SELECT p.cadena, r.nombre&#13;
FROM palabra AS p&#13;
NATURAL LEFT OUTER JOIN regla AS r;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
-- 16 rows (15 palabras con regla + 1 regla sin palabras)&#13;
SELECT p.cadena, r.nombre&#13;
FROM palabra AS p&#13;
NATURAL RIGHT OUTER JOIN regla AS r;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;Conclusiones&lt;/h2&gt;
&lt;br /&gt;&#13;
La posible salida deseada con estas tres tablas puede ser esta. &lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
-- 18 rows (todas la palabras, con su regla y caso si estás aplican)&#13;
SELECT p.cadena AS cadena, IFNULL(r.nombre,&lt;i&gt;) AS regla, IFNULL(c.nombre,&lt;/i&gt;) AS caso&#13;
FROM palabra p&#13;
LEFT OUTER JOIN regla r ON p.idRegla = r.idRegla&#13;
LEFT OUTER JOIN caso c ON p.idCaso = c.idCaso;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Entonces tenenemos &lt;b&gt;18 filas.&lt;/b&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
cadena  regla       caso&#13;
------- ----------- ----&#13;
aéreo   esdrújula   hiato&#13;
bahía   grave       hiato&#13;
baúl    aguda       hiato&#13;
canción aguda       diptongo&#13;
día     grave       hiato&#13;
el&#13;
estuvo  grave&#13;
jamás   aguda&#13;
maíz    aguda       hiato&#13;
nunca   grave&#13;
país    aguda       hiato&#13;
quiero  grave       triptongo&#13;
Raúl    aguda       hiato&#13;
risa    grave&#13;
tía     grave       hiato&#13;
todo    grave&#13;
tu&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;CREATE VIEW&lt;/h2&gt;
&lt;br /&gt;&#13;
Podemos generar una vista de la consulta anterior.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
CREATE VIEW gramatica AS&#13;
SELECT p.cadena AS cadena, IFNULL(r.nombre,&lt;i&gt;) AS regla, IFNULL(c.nombre,&lt;/i&gt;) AS caso&#13;
FROM palabra p&#13;
LEFT OUTER JOIN regla r ON p.idRegla = r.idRegla&#13;
LEFT OUTER JOIN caso c ON p.idCaso = c.idCaso;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Ahora tenemos una consulta más sencilla.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
SELECT *&#13;
FROM gramatica;&#13;
&lt;/pre&gt;</description>
		</item>
		<item>
			<title>Timestamps Y Zonas Horarias (Time Zones) En MySQL</title>
			<link>http://www.stan.com.mx/topics/view/11</link>
			<guid>http://www.stan.com.mx/topics/view/11</guid>
			<comments>http://www.stan.com.mx/topics/view/11#comments</comments>
			<pubDate>Fri, 26 Sep 2008 19:01:07 -0500</pubDate>
			<author>kiewic@gmail.com (Gilberto Stankiewicz)</author>
			<category>topics</category>
			<description>En MySQL existen dos tipos para almacenar fechas y horas: &lt;b&gt;DATETIME&lt;/b&gt; y &lt;b&gt;TIMESTAMP&lt;/b&gt;. La diferencia entre estos dos, es que el &lt;b&gt;TIMESTAMP&lt;/b&gt; convierte la fecha de la zona horaria actual a &lt;a href=&quot;http://en.wikipedia.org/wiki/Coordinated_Universal_Time&quot;&gt;UTC&lt;/a&gt;, o sea, guarda la fecha en un formato universal e internacional, que más o menos coincide con el meridiano de Greenwich.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;Instalar MySQL Time Zones En Windows&lt;/h2&gt;
&lt;br /&gt;&lt;ol&gt;&#13;
&lt;li&gt; Entrar al sitio &lt;b&gt;&lt;a href=&quot;http://dev.mysql.com/downloads/timezones.html&quot;&gt;Time Zone Description Tables&lt;/a&gt;&lt;/b&gt; y descargar  el archivo &lt;b&gt;.zip&lt;/b&gt;.  &lt;/li&gt;&#13;
&lt;li&gt; Descomprimir el archivo &lt;b&gt;.zip&lt;/b&gt;.&lt;/li&gt;&#13;
&lt;li&gt; Esta carpeta tiene archivo &lt;b&gt;.frm&lt;/b&gt;, &lt;b&gt;.myd&lt;/b&gt; y &lt;b&gt;.myi&lt;/b&gt;. Estos archivos tenemos que copiarlos (o sobreescribirlos) en la carpeta &lt;code&gt;c:\mysql\data\mysql\&lt;/code&gt; (el inicio de la ruta puede ser diferente).&lt;/li&gt;&#13;
&lt;li&gt; Reiniciar el servidor de MySQL.&lt;/li&gt;&#13;
&lt;/ol&gt;&#13;
&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/MySQLTimestampsTimezones.gif&quot; alt=&quot;Instalar time zones en MySQL.&quot;  width=&quot;304&quot; height=&quot;902&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
Si todo ha salido bien, al correr la siguiente consulta deben aparecer más de 500 filas.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
SELECT * FROM mysql.time_zone_name;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;Columnas TIMESTAMP&lt;/h2&gt;
&lt;br /&gt;&#13;
La primera columna de tipo &lt;code&gt;TIMESTAMP&lt;/code&gt; en tablas con una o más columnas &lt;code&gt;TIMESTAMP&lt;/code&gt; tiene truco. Esa columna (la primera) siempre se actualiza al valor &lt;code&gt;CURRENT_TIMESTAMP&lt;/code&gt; en un &lt;code&gt;INSERT&lt;/code&gt; o un &lt;code&gt;UPDATE&lt;/code&gt; si no se le especifica explícitamente otro valor. &lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
-- tabla con columnas TIMESTAMP&#13;
CREATE TABLE example1 (&#13;
  w INT,&#13;
  x DATETIME,&#13;
  y TIMESTAMP,&#13;
  z TIMESTAMP&#13;
);&#13;
&#13;
INSERT INTO example1&#13;
VALUES (1, &amp;#039;2010#10#10 00#00#00&amp;#039;, &amp;#039;2010#10#10 00#00#00&amp;#039;, &amp;#039;2010#10#10 00#00#00&amp;#039;);&#13;
&#13;
-- 1, &amp;#039;2010-10-10 00:00:00&amp;#039;, &amp;#039;2010-10-10 00:00:00&amp;#039;, &amp;#039;2010-10-10 00:00:00&amp;#039;&#13;
SELECT *&#13;
FROM example1;&#13;
&#13;
-- la primera columna TIMESTAMP también cambia de valor&#13;
UPDATE example1&#13;
SET w = 2;&#13;
&#13;
-- 2, &amp;#039;2010-10-10 00:00:00&amp;#039;, &amp;#039;2008-06-01 14:30:40&amp;#039;, &amp;#039;2010-10-10 00:00:00&amp;#039;&#13;
SELECT *&#13;
FROM example1;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Para evitar que la primera columna &lt;code&gt;TIMESTAMP&lt;/code&gt; se actualice, podemos modificar la  estructura de la tabla y declara esa columna con un &lt;code&gt;DEFAULT CURRENT_TIMESTAMP&lt;/code&gt; lo que evita un &lt;code&gt;ON UPDATE CURRENT_TIMESTAMP&lt;/code&gt; implícito. &lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
-- tabla con columnas TIMESTAMP&#13;
CREATE TABLE example2 (&#13;
  w INT,&#13;
  x DATETIME,&#13;
  y TIMESTAMP DEFAULT CURRENT_TIMESTAMP,&#13;
  z TIMESTAMP&#13;
);&#13;
&#13;
INSERT INTO example2&#13;
VALUES (1, &amp;#039;2010#10#10 00#00#00&amp;#039;, &amp;#039;2010#10#10 00#00#00&amp;#039;, &amp;#039;2010#10#10 00#00#00&amp;#039;);&#13;
&#13;
-- 1, &amp;#039;2010-10-10 00:00:00&amp;#039;, &amp;#039;2010-10-10 00:00:00&amp;#039;, &amp;#039;2010-10-10 00:00:00&amp;#039;&#13;
SELECT *&#13;
FROM example2;&#13;
&#13;
-- la primera columna TIMESTAMP no cambia de valor&#13;
UPDATE example2&#13;
SET w = 2;&#13;
&#13;
-- 2, &amp;#039;2010-10-10 00:00:00&amp;#039;, &amp;#039;2010-10-10 00:00:00&amp;#039;, &amp;#039;2010-10-10 00:00:00&amp;#039;&#13;
SELECT *&#13;
FROM example2;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;DATETIME vs TIMESTAMP&lt;/h2&gt;
&lt;br /&gt;&#13;
Si jugamos a cambiar de zona horaria, la columna &lt;code&gt;DATETIME&lt;/code&gt; permanecerá constante, pero la columna &lt;code&gt;TIMESTAMP&lt;/code&gt; se ajusta a la nueva zona horaria. &lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
-- tabla con columnas DATETIME y TIMESTAMP&#13;
CREATE TABLE example3 (&#13;
  x DATETIME,&#13;
  y TIMESTAMP DEFAULT 0&#13;
);&#13;
&#13;
-- cambiar a zona horaria de la Ciudad de México&#13;
SET GLOBAL time_zone = &amp;#039;America/Mexico_City&amp;#039;;&#13;
&#13;
INSERT INTO example3&#13;
VALUES (&amp;#039;2010#10#10 00#00#00&amp;#039;, &amp;#039;2010#10#10 00#00#00&amp;#039;);&#13;
&#13;
-- &amp;#039;2010-10-10 00:00:00&amp;#039;, &amp;#039;2010-10-10 00:00:00&amp;#039;&#13;
-- iguales&#13;
SELECT *&#13;
FROM example3;&#13;
&#13;
-- 1286686823, 1286686823&#13;
-- iguales&#13;
SELECT UNIX_TIMESTAMP(x), UNIX_TIMESTAMP(y)&#13;
FROM example3;&#13;
&#13;
-- cambiar a zona horaria de Madrid&#13;
SET GLOBAL time_zone = &amp;#039;Europe/Madrid&amp;#039;;&#13;
&#13;
-- &amp;#039;2010-10-10 00:00:00&amp;#039;, &amp;#039;2010-10-10 07:00:00&amp;#039;&#13;
-- columna DATETIME permanece constante (no cambia)&#13;
-- columna TIMESTAMP se ajusta a la zona horaria Europe/Madrid&#13;
SELECT *&#13;
FROM example3;&#13;
&#13;
-- 1286661623, 1286686823&#13;
-- columna DATETIME primero se convierte de Europe/Madrid a UTC&#13;
-- columna TIMESTAMP sigue valiendo el mismo UNIX_TIMESTAMP&#13;
SELECT UNIX_TIMESTAMP(x), UNIX_TIMESTAMP(y)&#13;
FROM example3;&#13;
&#13;
-- convertir la hora de Europe/Madrid a America/Mexico_City&#13;
-- &amp;#039;2010-10-10 00:00:00&amp;#039;, &amp;#039;2010-10-10 00:00:00&amp;#039;&#13;
-- iguales otra vez&#13;
SELECT x, CONVERT_TZ(y,&amp;#039;Europe/Madrid&amp;#039;,&amp;#039;America/Mexico_City&amp;#039;)&#13;
FROM example3;&#13;
&#13;
SELECT x, CONVERT_TZ(y,&amp;#039;Europe/Madrid&amp;#039;,&amp;#039;SYSTEM&amp;#039;)&#13;
FROM example3;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;b&gt;La columna&lt;/b&gt; &lt;code&gt;TIMESTAMP&lt;/code&gt; &lt;b&gt;funciona como la mayoría de nuestros dispositivos eléctricos&lt;/b&gt; (computadora, teléfono celular, PALM, iPod, ..) y lo puede comprobar si le cambia la zona horaria.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/MySQLTimestampsIPod.jpg&quot; alt=&quot;Zonas horarias en el iPod.&quot;  width=&quot;304&quot; height=&quot;304&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
&lt;h2&gt;SYSTEM No Siempre Es Lo Mismo Que America/Mexico_City&lt;/h2&gt;
&lt;br /&gt;&#13;
La “zona horaria” &lt;code&gt;SYSTEM&lt;/code&gt; representa la hora y la zona horaria del sistema operativo, en mi caso Windows XP. MySQL sigue esta zona horaria por defecto. &lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Pero si comparamos los &lt;code&gt;UNIX_TIMESTAMP&lt;/code&gt; de una fecha almacenada con zona horaria &lt;code&gt;SYSTEM&lt;/code&gt; y una fecha almacenada con zona horaria &lt;code&gt;America/Mexico_City&lt;/code&gt;, podemos ver que existe una diferencia de segundos.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
CREATE TABLE example4 (&#13;
  x TIMESTAMP DEFAULT 0&#13;
);&#13;
&#13;
-- cambiar a zona horaria del sistema operativo&#13;
SET GLOBAL time_zone = &amp;#039;SYSTEM&amp;#039;;&#13;
&#13;
INSERT INTO example4&#13;
VALUES (&amp;#039;2010#10#10 00#00#00&amp;#039;);&#13;
&#13;
-- cambiar a zona horaria de la Ciudad de México&#13;
SET GLOBAL time_zone = &amp;#039;America/Mexico_City&amp;#039;;&#13;
&#13;
INSERT INTO example4&#13;
VALUES (&amp;#039;2010#10#10 00#00#00&amp;#039;);&#13;
&#13;
-- &amp;#039;2010-10-09 23:59:37&amp;#039;&#13;
-- &amp;#039;2010-10-10 00:00:00&amp;#039;&#13;
-- 23 segundos de diferencia&#13;
SELECT *&#13;
FROM example4;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;b&gt;Lo mismo sucede con PHP y MySQL.&lt;/b&gt; El &lt;code&gt;TIMESTAMP&lt;/code&gt; de MySQL sigue las reglas del UTC y le suma algunos segundos extra para tener una hora más exacta. &lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;Conocer La Zona Horaria De MySQL&lt;/h2&gt;
&lt;br /&gt;&#13;
Basta imprimir las variables &lt;code&gt;@@global.time_zone&lt;/code&gt; y &lt;code&gt;@@session.time_zone&lt;/code&gt; para conocer la zona horaria de  nuestro manejador MySQL.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
SELECT @@global.time_zone, @@session.time_zone;&#13;
&lt;/pre&gt;</description>
		</item>
		<item>
			<title>CHARACTER SET y COLLATION En MySQL</title>
			<link>http://www.stan.com.mx/topics/view/12</link>
			<guid>http://www.stan.com.mx/topics/view/12</guid>
			<comments>http://www.stan.com.mx/topics/view/12#comments</comments>
			<pubDate>Fri, 26 Sep 2008 19:00:54 -0500</pubDate>
			<author>kiewic@gmail.com (Gilberto Stankiewicz)</author>
			<category>topics</category>
			<description>Si tienes dudas sobre qué es un &lt;b&gt;conjunto de caracteres (CHARACTER SET)&lt;/b&gt; o una &lt;b&gt;colación (COLLATION)&lt;/b&gt; debes empezar leyendo  &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/charset-general.html&quot;&gt;Character Sets and Collations in General&lt;/a&gt;.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;UTF8 vs Latin1&lt;/h2&gt;
&lt;br /&gt;&#13;
El &lt;b&gt;latin1&lt;/b&gt; es una codificación de 8 bits de longitud, el &lt;b&gt;utf8&lt;/b&gt; es una codificación de 8 o 16 o 24 bits de longitud. Obviamente el &lt;b&gt;utf8&lt;/b&gt; soporta una mayor cantidad de caracteres internacionales.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/MySQLCharsetCollationI.gif&quot; alt=&quot;utf8 vs latin1&quot;  width=&quot;697&quot; height=&quot;130&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
Ejemplo con una tabla &lt;b&gt;latin 1.&lt;/b&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
CREATE TABLE ejemplolatin1 (&#13;
  x varchar(10)&#13;
) CHARACTER SET=&amp;#039;latin1&amp;#039;;&#13;
&#13;
INSERT INTO ejemplolatin1 VALUES (&amp;#039;pais&amp;#039;);&#13;
INSERT INTO ejemplolatin1 VALUES (&amp;#039;país&amp;#039;);&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Como resultado tenemos palabras de &lt;b&gt;4 bytes.&lt;/b&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
SELECT x, LENGTH(x), CHAR_LENGTH(x), HEX(x) FROM ejemplolatin1;&#13;
&#13;
-- &amp;#039;pais&amp;#039;, 4, 4, &amp;#039;70616973&amp;#039;&#13;
-- &amp;#039;país&amp;#039;, 4, 4, &amp;#039;7061ED73&amp;#039;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Lo mismo pero con una tabla &lt;b&gt;utf8.&lt;/b&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
CREATE TABLE ejemploutf8 (&#13;
  x varchar(10)&#13;
) CHARACTER SET=&amp;#039;utf8&amp;#039;;&#13;
&#13;
INSERT INTO ejemploutf8 VALUES (&amp;#039;pais&amp;#039;);&#13;
INSERT INTO ejemploutf8 VALUES (&amp;#039;país&amp;#039;);&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Ahora tenemos como resultado palabras de &lt;b&gt;4 y 5 bytes.&lt;/b&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
SELECT x, LENGTH(x), CHAR_LENGTH(x), HEX(x) FROM ejemploutf8;&#13;
&#13;
-- &amp;#039;pais&amp;#039;, 4, 4, &amp;#039;70616973&amp;#039;&#13;
-- &amp;#039;país&amp;#039;, 5, 4, &amp;#039;7061C3AD73&amp;#039;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
La función &lt;code&gt;HEX()&lt;/code&gt; nos devuelve la cadena en hexadecimal. Podemos ver en la palabra &lt;b&gt;país&lt;/b&gt; los valores en hexadecimal de &lt;b&gt;í&lt;/b&gt; en &lt;b&gt;latin1&lt;/b&gt; y &lt;b&gt;utf8&lt;/b&gt; respectivamente.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;UTF8 A Latin1 Y Viceversa&lt;/h2&gt;
&lt;br /&gt;&#13;
Para convertir entre codificaciones, tenemos que escribir &lt;code&gt;_utf8&lt;/code&gt; o &lt;code&gt;_latin1&lt;/code&gt; a cualquier cadena o expresión que represente una cadena. &lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
SELECT _utf8&amp;#039;país&amp;#039;, _latin1&amp;#039;país&amp;#039;;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;utf8_spanish_ci vs utf8_general_ci&lt;/h2&gt;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/MySQLCharsetCollationN.gif&quot; alt=&quot;utf8_spanish_ci vs utf8_general_ci&quot;  width=&quot;508&quot; height=&quot;244&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
Las siguientes comparaciones dan &lt;b&gt;verdadero.&lt;/b&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;A&amp;#039; COLLATE utf8_spanish_ci; -- 1&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;á&amp;#039; COLLATE utf8_spanish_ci; -- 1&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;à&amp;#039; COLLATE utf8_spanish_ci; -- 1&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;ä&amp;#039; COLLATE utf8_spanish_ci; -- 1&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;â&amp;#039; COLLATE utf8_spanish_ci; -- 1&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Y también estas.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;A&amp;#039; COLLATE utf8_general_ci; -- 1&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;á&amp;#039; COLLATE utf8_general_ci; -- 1&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;à&amp;#039; COLLATE utf8_general_ci; -- 1&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;ä&amp;#039; COLLATE utf8_general_ci; -- 1&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;â&amp;#039; COLLATE utf8_general_ci; -- 1&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Pero la siguente comparación da &lt;b&gt;falso.&lt;/b&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
SELECT &amp;#039;n&amp;#039; = &amp;#039;ñ&amp;#039; COLLATE utf8_spanish_ci; -- 0&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
En español moderno &lt;b&gt;n&lt;/b&gt; no es igual a &lt;b&gt;ñ&lt;/b&gt;. Cosa que si sucede en &lt;code&gt;utf8_general_ci&lt;/code&gt;.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
SELECT &amp;#039;n&amp;#039; = &amp;#039;ñ&amp;#039; COLLATE utf8_general_ci; -- 1&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;utf8_spanish_ci vs utf8_spanish2_ci&lt;/h2&gt;
&lt;br /&gt;&#13;
Antes del año 1994, &lt;b&gt;ch&lt;/b&gt; y &lt;b&gt;ll&lt;/b&gt; se consideraban letras independientes, entonces &lt;b&gt;utf8_spanish2_ci&lt;/b&gt; (español tradicional) ordena &lt;b&gt;ch&lt;/b&gt; entre &lt;b&gt;c&lt;/b&gt; y &lt;b&gt;d&lt;/b&gt; y &lt;b&gt;ll&lt;/b&gt; entre &lt;b&gt;l&lt;/b&gt; y &lt;b&gt;m&lt;/b&gt;, cosa que no sucede con &lt;b&gt;utf8_spanish_ci&lt;/b&gt; (español moderno).&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
CREATE TABLE ejemploSpanish (&#13;
  x varchar(10)&#13;
) CHARACTER SET=&amp;#039;utf8&amp;#039;;&#13;
&#13;
INSERT INTO ejemploSpanish VALUES (&amp;#039;culebra&amp;#039;);&#13;
INSERT INTO ejemploSpanish VALUES (&amp;#039;chuleta&amp;#039;);&#13;
INSERT INTO ejemploSpanish VALUES (&amp;#039;luchador&amp;#039;);&#13;
INSERT INTO ejemploSpanish VALUES (&amp;#039;llanta&amp;#039;);&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/MySQLCharsetCollationEs.gif&quot; alt=&quot;utf8_spanish_ci&quot;  width=&quot;602&quot; height=&quot;124&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
SELECT * FROM ejemploSpanish ORDER BY x COLLATE utf8_spanish_ci;&#13;
&#13;
-- &amp;#039;chuleta&amp;#039;&#13;
-- &amp;#039;culebra&amp;#039;&#13;
-- &amp;#039;llanta&amp;#039;&#13;
-- &amp;#039;luchador&amp;#039;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/MySQLCharsetCollationEs2.gif&quot; alt=&quot;utf8_spanish2_ci&quot;  width=&quot;602&quot; height=&quot;124&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
SELECT * FROM ejemploSpanish ORDER BY x COLLATE utf8_spanish2_ci;&#13;
&#13;
-- &amp;#039;culebra&amp;#039;&#13;
-- &amp;#039;chuleta&amp;#039;&#13;
-- &amp;#039;luchador&amp;#039;&#13;
-- &amp;#039;llanta&amp;#039;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Algo similar sucede con el idioma checo (&lt;b&gt;utf8_czech_ci&lt;/b&gt;) que considera &lt;b&gt;ch&lt;/b&gt; una letra entre &lt;b&gt;h&lt;/b&gt; e &lt;b&gt;i&lt;/b&gt;.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/MySQLCharsetCollationCz.gif&quot; alt=&quot;utf8_czech_ci&quot;  width=&quot;602&quot; height=&quot;124&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
CREATE TABLE ejemploCzech (&#13;
  x varchar(10)&#13;
) CHARACTER SET=&amp;#039;utf8&amp;#039;;&#13;
&#13;
INSERT INTO ejemploCzech VALUES (&amp;#039;c&amp;#039;);&#13;
INSERT INTO ejemploCzech VALUES (&amp;#039;h&amp;#039;);&#13;
INSERT INTO ejemploCzech VALUES (&amp;#039;ch&amp;#039;);&#13;
INSERT INTO ejemploCzech VALUES (&amp;#039;i&amp;#039;);&#13;
&#13;
SELECT * FROM ejemploCzech ORDER BY x COLLATE utf8_czech_ci;&#13;
&#13;
-- &amp;#039;c&amp;#039;&#13;
-- &amp;#039;h&amp;#039;&#13;
-- &amp;#039;ch&amp;#039;&#13;
-- &amp;#039;i&amp;#039;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;utf8_general_ci vs utf8_bin&lt;/h2&gt;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/MySQLCharsetCollationBin.gif&quot; alt=&quot;utf8_general_ci vs utf8_bin&quot;  width=&quot;500&quot; height=&quot;580&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
Como vimos en los ejemplos de arriba, la colación &lt;b&gt;utf8_spanish_ci&lt;/b&gt; no distingue entre:&lt;br /&gt;&#13;
&lt;br /&gt;&lt;ul&gt;&#13;
&lt;li&gt; vocales con tilde (acento ortográfico) o sin tilde&lt;/li&gt;&#13;
&lt;li&gt; letras con diéresis o sin diéresis&lt;/li&gt;&#13;
&lt;li&gt; minúsculas y mayúsculas&lt;/li&gt;&#13;
&lt;/ul&gt;&#13;
&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
La colación &lt;b&gt;utf8_bin&lt;/b&gt; sí lo hace. Esta colación realiza una comparación binaria, bit por bit.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;A&amp;#039; COLLATE utf8_general_ci; -- 1&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;á&amp;#039; COLLATE utf8_general_ci; -- 1&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;à&amp;#039; COLLATE utf8_general_ci; -- 1&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;ä&amp;#039; COLLATE utf8_general_ci; -- 1&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;â&amp;#039; COLLATE utf8_general_ci; -- 1&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;A&amp;#039; COLLATE utf8_bin; -- 0&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;á&amp;#039; COLLATE utf8_bin; -- 0&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;à&amp;#039; COLLATE utf8_bin; -- 0&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;ä&amp;#039; COLLATE utf8_bin; -- 0&#13;
SELECT &amp;#039;a&amp;#039; = &amp;#039;â&amp;#039; COLLATE utf8_bin; -- 0&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;SHOW CHARACTER SET y SHOW COLLATION&lt;/h2&gt;
&lt;br /&gt;&#13;
La sentencia &lt;code&gt;SHOW CHARACTER SET&lt;/code&gt; despliega todos los conjuntos de caracteres o codificaciones disponibles en el manejador MySQL.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
SHOW CHARACTER SET;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
La sentencia &lt;code&gt;SHOW COLLATION&lt;/code&gt; despliega las diferentes colaciones disponibles en el manejador MySQL.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
SHOW COLLATION;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Para conocer las codificaciones usadas actualmente por MySQl, la siguiente consulta puede ayudar.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
SHOW VARIABLES LIKE &amp;#039;%char%&amp;#039;;&#13;
&#13;
-- &amp;#039;character_set_client&amp;#039;, &amp;#039;utf8&amp;#039;&#13;
-- &amp;#039;character_set_connection&amp;#039;, &amp;#039;utf8&amp;#039;&#13;
-- &amp;#039;character_set_database&amp;#039;, &amp;#039;latin1&amp;#039;&#13;
-- &amp;#039;character_set_results&amp;#039;, &amp;#039;utf8&amp;#039;&#13;
-- &amp;#039;character_set_server&amp;#039;, &amp;#039;latin1&amp;#039;&#13;
-- &amp;#039;character_set_system&amp;#039;, &amp;#039;utf8&amp;#039;&#13;
-- &amp;#039;character_sets_dir&amp;#039;, &amp;#039;C:\mysql\share\charsets\&amp;#039;&#13;
&lt;/pre&gt;</description>
		</item>
		<item>
			<title>Galería de Fotos Tipo Hilo Dental (Aprendiendo ActionScript 3.0)</title>
			<link>http://www.stan.com.mx/topics/view/13</link>
			<guid>http://www.stan.com.mx/topics/view/13</guid>
			<comments>http://www.stan.com.mx/topics/view/13#comments</comments>
			<pubDate>Fri, 26 Sep 2008 18:46:36 -0500</pubDate>
			<author>kiewic@gmail.com (Gilberto Stankiewicz)</author>
			<category>topics</category>
			<description>Hace tiempo que no escribo sobre ActionScript 3.0 (AS3). Hoy por fin he termino una copia a un efecto hecho con Flash en un sitio que quitaron hace tiempo. Se trata de &lt;b&gt;una tira de fotos que se mueve de un lado a otro como si fuera un hilo dental&lt;/b&gt;.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;object type=&quot;application/x-shockwave-flash&quot; classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0&quot; width=&quot;750&quot; height=&quot;150&quot;&gt;
&lt;param name=&quot;movie&quot; value=&quot;http://www.stan.com.mx/flach/FlexFloss.swf&quot;&gt;
&lt;param name=&quot;quality&quot; value=&quot;high&quot;&gt;
&lt;param name=&quot;menu&quot; value=&quot;false&quot;&gt;
&lt;embed src=&quot;http://www.stan.com.mx/flach/FlexFloss.swf&quot; quality=&quot;high&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;750&quot; height=&quot;150&quot; /&gt;
&lt;/object&gt;
&lt;/div&gt;
&#13;
&lt;br /&gt;&#13;
La película flash de arriba muestra como queda finalmente el efecto. Abajo un prototipo del efecto. &lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/FlossPrototype.gif&quot; alt=&quot;Patrón de hilo dental con Flex y AS3.&quot;  width=&quot;750&quot; height=&quot;61&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
El proyecto se llama &lt;b&gt;FlexFloss&lt;/b&gt;. Disculpen que mi inglés no sea muy bueno, pero según el diccionario, hilo dental en inglés se dice Floss.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
En esta ocasión sólo voy a explicar algunos detalles importantes del proyecto. Pero &lt;a href=&quot;http://www.stan.com.mx/files/download/62/&quot;&gt;el código completo lo pueden descargar aquí&lt;/a&gt;.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Esta desarrollado en &lt;b&gt;Adobe Flex&lt;/b&gt;, pero si han leído los &lt;a href=&quot;http://www.stan.com.mx/topics/view/2/&quot;&gt;artículos anteriores&lt;/a&gt; podrán adaptarlo fácilmente al &lt;b&gt;compilador de AS3&lt;/b&gt; o &lt;b&gt;Adobe Flash CS3&lt;/b&gt;.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
El proyecto está compuesto por ocho clases:&lt;br /&gt;&#13;
&lt;br /&gt;&lt;ol&gt;&#13;
&lt;li&gt; AssetManager.as&lt;/li&gt;&#13;
&lt;li&gt; Caption.as&lt;/li&gt;&#13;
&lt;li&gt; FlexFloss.as&lt;/li&gt;&#13;
&lt;li&gt; FlossPicture.as&lt;/li&gt;&#13;
&lt;li&gt; GiveMeA.as&lt;/li&gt;&#13;
&lt;li&gt; LoadBar.as&lt;/li&gt;&#13;
&lt;li&gt; NervousLoadBar.as&lt;/li&gt;&#13;
&lt;li&gt; Picture.as&lt;/li&gt;&#13;
&lt;/ol&gt;&#13;
&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Estás clases están relacionadas de esta forma:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/FlossClassDiagram.gif&quot; alt=&quot;Diagrama de clases de FlexFloss.&quot;  width=&quot;699&quot; height=&quot;683&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
&lt;sup&gt;&lt;b&gt;¿Cómo representar métodos estáticos (static) en StarUML?&lt;/b&gt; En el diagrama de clases, dar click con el botón derecho a la clase que contiene ese método, click en &lt;i&gt;Select In Model Explorer&lt;/i&gt;, en el panel &lt;i&gt;Model Explorer&lt;/i&gt; expandir esa clase, seleccionar el método estático y en el panel &lt;i&gt;Properties&lt;/i&gt; cambiar la propiedad &lt;i&gt;OwnerScope&lt;/i&gt; de &lt;i&gt;INSTANCE&lt;/i&gt; a &lt;i&gt;CLASSIFIER&lt;/i&gt;.&lt;/sup&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;Entrada Del &amp;quot;Sistema&amp;quot;&lt;/h2&gt;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/FlossWorkflow.gif&quot; alt=&quot;Diagrama de flujo de FlexFloss.&quot;  width=&quot;400&quot; height=&quot;210&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
La entrada de la aplicación es un archivo &lt;b&gt;xml&lt;/b&gt; como el siguiente:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
&amp;lt;photos&amp;gt;&#13;
	&amp;lt;photo&amp;gt;&#13;
		&amp;lt;file&amp;gt;http://www.stan.com.mx/flach/floss01.jpg&amp;lt;/file&amp;gt;&#13;
		&amp;lt;description&amp;gt;muuuh! catsup!&amp;lt;/description&amp;gt;&#13;
	&amp;lt;/photo&amp;gt;&#13;
	&amp;lt;photo&amp;gt;&#13;
		&amp;lt;file&amp;gt;http://www.stan.com.mx/flach/floss02.jpg&amp;lt;/file&amp;gt;&#13;
		&amp;lt;description&amp;gt;mmmm! papas a la francesa!&amp;lt;/description&amp;gt;&#13;
	&amp;lt;/photo&amp;gt;&#13;
	&amp;lt;photo&amp;gt;&#13;
		&amp;lt;file&amp;gt;http://www.stan.com.mx/flach/floss03.jpg&amp;lt;/file&amp;gt;&#13;
		&amp;lt;description&amp;gt;muuuh! hamburguesa con doble queso!&amp;lt;/description&amp;gt;&#13;
	&amp;lt;/photo&amp;gt;&#13;
	&amp;lt;photo&amp;gt;&#13;
		&amp;lt;file&amp;gt;http://www.stan.com.mx/flach/floss04.jpg&amp;lt;/file&amp;gt;&#13;
		&amp;lt;description&amp;gt;mooh! mcflurry y sundae!&amp;lt;/description&amp;gt;&#13;
	&amp;lt;/photo&amp;gt;&#13;
	&amp;lt;photo&amp;gt;&#13;
		&amp;lt;file&amp;gt;http://www.stan.com.mx/flach/floss05.jpg&amp;lt;/file&amp;gt;&#13;
		&amp;lt;description&amp;gt;mooh! breakfast potato!&amp;lt;/description&amp;gt;&#13;
	&amp;lt;/photo&amp;gt;&#13;
	&amp;lt;photo&amp;gt;&#13;
		&amp;lt;file&amp;gt;http://www.stan.com.mx/flach/floss06.jpg&amp;lt;/file&amp;gt;&#13;
		&amp;lt;description&amp;gt;muuuh! lechitas!&amp;lt;/description&amp;gt;&#13;
	&amp;lt;/photo&amp;gt;&#13;
	&amp;lt;photo&amp;gt;&#13;
		&amp;lt;file&amp;gt;http://www.stan.com.mx/flach/floss07.jpg&amp;lt;/file&amp;gt;&#13;
		&amp;lt;description&amp;gt;muuuuuh! big mac!&amp;lt;/description&amp;gt;&#13;
	&amp;lt;/photo&amp;gt;&#13;
	&amp;lt;photo&amp;gt;&#13;
		&amp;lt;file&amp;gt;http://www.stan.com.mx/flach/floss08.jpg&amp;lt;/file&amp;gt;&#13;
		&amp;lt;description&amp;gt;auuu! mcpollo! (mcchicken)&amp;lt;/description&amp;gt;&#13;
	&amp;lt;/photo&amp;gt;&#13;
	&amp;lt;photo&amp;gt;&#13;
		&amp;lt;file&amp;gt;http://www.stan.com.mx/flach/floss09.jpg&amp;lt;/file&amp;gt;&#13;
		&amp;lt;description&amp;gt;mmmmm! french fries!&amp;lt;/description&amp;gt;&#13;
	&amp;lt;/photo&amp;gt;&#13;
&amp;lt;/photos&amp;gt;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Basta con editar este archivo para tener una tira de fotos diferentes con otras descripciones.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;Barra de Progreso de Carga y Fotos&lt;/h2&gt;
&lt;br /&gt;&#13;
Bueno, aquí he diseñado algo rarito para lograr que la &lt;b&gt;LoadBar&lt;/b&gt; refleje el porcentaje correcto de carga de todas las fotos.&lt;br /&gt;&#13;
&lt;br /&gt;&lt;ol&gt;&#13;
&lt;li&gt; Inicializo una &lt;b&gt;LoadBar&lt;/b&gt;: &lt;code&gt;loadBar = new NervousLoadBar(750, 150, 0xFF0066);&lt;/code&gt;&lt;/li&gt;&#13;
&lt;li&gt; Agrego la &lt;b&gt;LoadBar&lt;/b&gt; al escenario: &lt;code&gt;addChild(loadBar);&lt;/code&gt;&lt;/li&gt;&#13;
&lt;li&gt; Leo el archivo &lt;b&gt;xml&lt;/b&gt;&lt;/li&gt;&#13;
&lt;li&gt; Por cada foto en el archivo &lt;b&gt;xml&lt;/b&gt; creo un &lt;b&gt;FlossPicture&lt;/b&gt;: &lt;code&gt;picture = new FlossPicture(node.file + &amp;quot;?&amp;quot; + date.time, loadBar, node.description);&lt;/code&gt;&lt;/li&gt;&#13;
&lt;li&gt; El constructor de &lt;b&gt;FlossPicture&lt;/b&gt; recibe una referencia a la &lt;b&gt;LoadBar&lt;/b&gt; y se agrega automáticamente a un &lt;b&gt;Array&lt;/b&gt; en la &lt;b&gt;LoadBar&lt;/b&gt;: &lt;code&gt;loadBar.add(this);&lt;/code&gt;&lt;/li&gt;&#13;
&lt;li&gt; Agrego este &lt;b&gt;FlossPicture&lt;/b&gt; al escenario: &lt;code&gt;addChild(picture);&lt;/code&gt;&lt;/li&gt;&#13;
&lt;li&gt; Cuando termino de agregar las fotos, entonces comienzo a cargar las fotos (antes no lo hago, porque corro el riesgo de terminar de cargar algunas fotos cuando todavía ni comienzo a procesar otras): &lt;code&gt;loadBar.load();&lt;/code&gt;&lt;/li&gt;&#13;
&lt;li&gt; Cuando todas las fotos han terminado de cargarse, entonces las despliego: &lt;code&gt;if (percent == 100) display();&lt;/code&gt;&lt;/li&gt;&#13;
&lt;/ol&gt;&#13;
&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Esto se representa más o menos como en el siguiente diagrama de secuencia.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/FlossSequenceDiagram.gif&quot; alt=&quot;Diagrama de secuencia entre las clases LoadBar y Picture.&quot;  width=&quot;574&quot; height=&quot;816&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
&lt;sup&gt;¿Cómo representar eventos (click con el mouse, presionar una tecla o finalizar la cargar de un archivo) en un diagrama de secuencia? ¿Tenía que usar un diagrama de actividades? Bueno, pues yo invente un actor llamado FlashPlayer que ejecuta estos eventos.&lt;/sup&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;Truco Para Ver La LoadBar Funcionar&lt;/h2&gt;
&lt;br /&gt;&#13;
A la ruta de cada foto le concateno un &lt;b&gt;query string&lt;/b&gt; con la fecha y hora actual para que el navegador no guarde en caché las fotos y tú puedas apreciar el efecto de la barra de carga cada vez que presionas la tecla &lt;b&gt;F5&lt;/b&gt; (actualizar la página). &lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
date = new Date();&#13;
...&#13;
picture = new FlossPicture(node.file + &amp;quot;?&amp;quot; + date.time, loadBar, node.description);&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
Entonces el fragmento de código &lt;code&gt;+ &amp;quot;?&amp;quot; + date.time&lt;/code&gt; no es indispensable en aplicaciones reales.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;Asuntos de Seguridad&lt;/h2&gt;
&lt;br /&gt;&#13;
&lt;div class=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.stan.com.mx/images/FlossCrossdomain.gif&quot; alt=&quot;Introducción al archivo crossdomain.xml .&quot;  width=&quot;500&quot; height=&quot;266&quot; /&gt;&#13;
&lt;/div&gt;
&lt;br /&gt;&#13;
Pues si el archivo &lt;b&gt;swf&lt;/b&gt; lo estamos corriendo en un dominio como &lt;b&gt;http://localhost/&lt;/b&gt; y el archivo &lt;b&gt;xml&lt;/b&gt; o las fotos se encuentran en otro dominio como podría ser &lt;b&gt;http://www.stan.com.mx&lt;/b&gt;, entonces tenemos que cumplir con las reglas (póliza) de seguridad de ActionScript 3. &lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Las fotos y el archivo &lt;b&gt;xml&lt;/b&gt; deben de conceder un permiso al archivo &lt;b&gt;swf&lt;/b&gt;. Para esto debemos crear un archivo &lt;b&gt;crossdomain.xml&lt;/b&gt; en la raíz del sitio con una lista de dominios que tienen permisos de interactuar con los archivos de este dominio. &lt;br /&gt;&#13;
&lt;br /&gt;&#13;
En este ejemplo sería algo así &lt;b&gt;http://www.stan.com.mx/crossdomain.xml&lt;/b&gt;.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Y el contenido sería:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;pre&gt;&#13;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&#13;
&amp;lt;cross-domain-policy&amp;gt;&#13;
	&amp;lt;allow-access-from domain=&amp;quot;*&amp;quot;/&amp;gt;&#13;
&amp;lt;/cross-domain-policy&amp;gt;&#13;
&lt;/pre&gt;&#13;
&lt;br /&gt;&#13;
El &lt;b&gt;*&lt;/b&gt; significa que cualquier dominio puede ocupar los archivos de &lt;b&gt;http://www.stan.com.mx&lt;/b&gt;. Pero puedes cambiar el &lt;b&gt;*&lt;/b&gt; por cualquier nombre de dominio.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Tener cuidado, porque el Flash Player interpreta &lt;b&gt;http://stan.com.mx&lt;/b&gt; y &lt;b&gt;http://www.stan.com.mx&lt;/b&gt; como dominios diferentes.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Si trabajas todo en el mismo dominio, entonces no tendrás problemas. Pero sino es así, podrías tener muchas veces el &lt;b&gt;error #2048 Security sandbox violation&lt;/b&gt;.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;a href=&quot;http://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html&quot;&gt;Más información sobre seguridad y dominios.&lt;/a&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;h2&gt;En Google Developer Day 2008 México&lt;/h2&gt;
&lt;br /&gt;&#13;
En el &lt;b&gt;Google Developer Day 2008 México&lt;/b&gt; todos abuchearon la tecnología de Flash. Pero la tecnología de Flash se ve muy bien y la podemos encontrar en aplicaciones como:&lt;br /&gt;&#13;
&lt;br /&gt;&lt;ul&gt;&#13;
&lt;li&gt; cajeros automáticos en otros países&lt;/li&gt;&#13;
&lt;li&gt; máquinas que venden boletos de avión&lt;/li&gt;&#13;
&lt;li&gt; máquinas que venden boletos de cine&lt;/li&gt;&#13;
&lt;li&gt; &lt;a href=&quot;http://www.good-neighbor.com/&quot;&gt;sistemas que controlan edificios&lt;/a&gt; (seguridad, comodidad, comunicaciones, compras ..) como el de Reforma 222&lt;/li&gt;&#13;
&lt;li&gt; &lt;a href=&quot;http://jetblue.com/wherewejet/&quot;&gt;mapas de rutas de aerolíneas&lt;/a&gt;&lt;/li&gt;&#13;
&lt;li&gt; &lt;a href=&quot;http://www.ichotelsgroup.com/intercontinental/en/gb/locations/city-tour/interactive-map/loscabos&quot;&gt;mapas interactivos&lt;/a&gt;&lt;/li&gt;&#13;
&lt;li&gt; reproductores de video como el de &lt;a href=&quot;http://vimeo.com/983198&quot;&gt;Vimeo&lt;/a&gt; o YouTube que tienen descarga progresiva y streaming &lt;/li&gt;&#13;
&lt;/ul&gt;&#13;
&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
¿Esto es posible hacerlo con JavaScript tan fácil y portable?&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Disfruten los últimos días del verano y pónganse a programar con AS3 :] Si surge alguna duda de AS3, escríbeme un comentario y haré lo posible por ayudar.&lt;br /&gt;</description>
		</item>
	</channel>
</rss>
