<?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, 01 Aug 2008 19:23:35 -0500</pubDate>
		<lastBuildDate>Fri, 01 Aug 2008 19:23:35 -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/champuStuff/logoStanRss.gif</url>
			<link>http://www.stan.com.mx</link>
		</image>
		<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, 01 Aug 2008 19:23:35 -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/champuFlash/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/champuFlash/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/champuImages/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/champuImages/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/champuImages/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/champuFlash/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/champuFlash/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/champuFlash/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/champuFlash/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/champuFlash/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/champuFlash/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/champuFlash/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/champuFlash/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/champuFlash/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/champuImages/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/champuImages/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>
		<item>
			<title>¿Incompatibilidad Editorial Entre Carmen Aristegui Y Televisa? :(</title>
			<link>http://www.stan.com.mx/topics/view/5</link>
			<guid>http://www.stan.com.mx/topics/view/5</guid>
			<comments>http://www.stan.com.mx/topics/view/5#comments</comments>
			<pubDate>Thu, 31 Jul 2008 09:19:05 -0500</pubDate>
			<author>kiewic@gmail.com (Gilberto Stankiewicz)</author>
			<category>topics</category>
			<description>&lt;a href=&quot;http://es.wikipedia.org/wiki/Carmen_Aristegui&quot;&gt;Carmen Aristegui&lt;/a&gt; salé hoy de W Radio, estación de Televisa Radio, por &amp;quot;incompatibilidad editorial&amp;quot;. Es una verdadera lástima.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Algunas palabras:&lt;br /&gt;&#13;
&lt;br /&gt;&lt;ul&gt;&#13;
&lt;li&gt; &amp;quot;Con la llegada de Daniel Moreno a la dirección de contenidos en W – hombre cercano a Juan Ignacio Zavala, cuñado de Calderón, y a ... Marta Saghún, - ... quien plantea una centralización de la agenda política de los conductores de noticiarios de la emisora, un importante grupo de colaboradores de la estación ha decidido salir de la misma. El primero fue Carlos Loret de Mola, ... (él) argumentó que el rediseño de los criterios en la empresa reducía su margen de maniobra. Posteriormente también emprendieron la partida personajes como Ezra Shabot, titular del informativo vespertino, y los ex colaboradores de El Wueso, Salvador Soto y Christián Ahumada, El Duende.&amp;quot;, periódico La Jornada.&lt;/li&gt;&#13;
&lt;li&gt; &amp;quot;... Carmen Aristegui incluyó temas como el conflicto poselectoral de 2006, por las dudas en los resultados que dieron como ganador de la Presidencia a Felipe Calderón; los efectos por la aprobación de la llamada ley Televisa –que permitía la concentración mediática en unas cuantas manos–; el caso Zongolica; los abusos contra Lydia Cacho por el gobernador de Puebla, Mario Marín, y el empresario Kamel Nacif; los procesos judiciales en Estados Unidos contra el cardenal Norberto Rivera por presunto encubrimiento de curas pederastas; el conflicto en Oaxaca y otras violaciones a los derechos humanos ...&amp;quot;, periódico La Jornada.&lt;/li&gt;&#13;
&lt;li&gt; “No sabemos qué vamos a hacer ese día (el lunes), de 6 a 10, sin Carmen; no habrá nadie que llene su espacio, ... Carmen, estamos contigo, porque México necesita periodistas valientes y con principios, como tú, ... Que quede claro, no somos W, somos Aristegui.” radioescuchas entrevistados por el periódico La Jornada.&lt;/li&gt;&#13;
&lt;/ul&gt;&#13;
&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Algunas ligas:&lt;br /&gt;&#13;
&lt;br /&gt;&lt;ul&gt;&#13;
&lt;li&gt; &lt;a href=&quot;http://www.jornada.unam.mx/2008/01/05/index.php?section=politica&amp;amp;article=007n1pol&quot;&gt;El lunes llevaré al pequeño Emilio al colegio, dice Carmen Aristegui al despedirse de la W.&lt;/a&gt;&lt;/li&gt;&#13;
&lt;li&gt; &lt;a href=&quot;http://www.milenio.com/index.php/2008/01/04/171283/&quot;&gt;Se despide Carmen Aristegui de W Radio&lt;/a&gt;&lt;/li&gt;&#13;
&lt;li&gt; &lt;a href=&quot;http://www.eluniversal.com.mx/notas/471940.html&quot;&gt;Sale Carmen Aristegui de W Radio por “incompatibilidad editorial”.&lt;/a&gt;&lt;/li&gt;&#13;
&lt;li&gt; &lt;a href=&quot;http://www.eluniversal.com.mx/columnas/69219.html&quot;&gt;La periodista Carmen Aristegui deja la &amp;quot;W&amp;quot;.&lt;/a&gt;&lt;/li&gt;&#13;
&lt;li&gt; &lt;a href=&quot;http://vivirmexico.com/2008/01/04/aristegui-incompatible-con-el-modelo-de-w-radio/&quot;&gt;Aristegui, incompatible con nuestro modelo.&lt;/a&gt;&lt;/li&gt;&#13;
&lt;li&gt; &lt;a href=&quot;http://vivirmexico.com/2008/01/04/sale-carmen-aristegui-de-w-radio/&quot;&gt;Sale Carmen Aristegui de W Radio.&lt;/a&gt;&lt;/li&gt;&#13;
&lt;li&gt; &lt;a href=&quot;http://www.jornada.unam.mx/ultimas/2008/01/04/conduce-carmen-aristegui-su-ultimo-programa-en-w-radio&quot;&gt;Por incompatibilidad editorial, Carmen Aristegui deja W Radio.&lt;/a&gt;&lt;/li&gt;&#13;
&lt;/ul&gt;&#13;
&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Algunas fotos:&lt;br /&gt;&#13;
&lt;br /&gt;&lt;ul&gt;&#13;
&lt;li&gt; &lt;a href=&quot;http://www.jornada.unam.mx/2008/01/05/fotos/007n1pol-1.jpg&quot;&gt;La periodista Carmen Aristegui a su salida de W Radio, donde la esperaban radioescuchas con pancartas de apoyo a su &amp;quot;labor crítica&amp;quot;. (Periódico La Jornada.)&lt;/a&gt;&lt;/li&gt;&#13;
&lt;/ul&gt;&#13;
&lt;br /&gt;&#13;
 &lt;br /&gt;&#13;
&lt;h2&gt;¿Qué Pasa En W Radio?&lt;/h2&gt;
&lt;br /&gt;&#13;
Hace unas semanas escuché la última emisión de &lt;a href=&quot;http://www.dommo.net/&quot;&gt;Dommo Radio&lt;/a&gt; (Ricardo Zamora y Javier Matuk), ahora termina Carmen Aristegui.&lt;br /&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>Wed, 04 Jun 2008 01:40:36 -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/champuImages/MySQLCharsetCollationI.gif&quot; alt=&quot;utf8 vs latin1&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/champuImages/MySQLCharsetCollationN.gif&quot; alt=&quot;utf8_spanish_ci vs utf8_general_ci&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/champuImages/MySQLCharsetCollationEs.gif&quot; alt=&quot;utf8_spanish_ci&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/champuImages/MySQLCharsetCollationEs2.gif&quot; alt=&quot;utf8_spanish2_ci&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/champuImages/MySQLCharsetCollationCz.gif&quot; alt=&quot;utf8_czech_ci&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/champuImages/MySQLCharsetCollationBin.gif&quot; alt=&quot;utf8_general_ci vs utf8_bin&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>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>Sun, 01 Jun 2008 15:00:00 -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/champuImages/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/champuImages/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>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>Sat, 24 May 2008 12:04:50 -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/champuImages/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/champuImages/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/champuImages/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>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>Tue, 13 May 2008 23:45:00 -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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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>¿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>Sat, 22 Mar 2008 20:40:25 -0600</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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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/champuImages/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>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, 21 Mar 2008 00:46:08 -0600</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/champuImages/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/champuImages/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/champuImages/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/champuImages/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>FW: Nuevamente La Aportación Y  La Escuela (ESCOM) Sigue Igual</title>
			<link>http://www.stan.com.mx/topics/view/6</link>
			<guid>http://www.stan.com.mx/topics/view/6</guid>
			<comments>http://www.stan.com.mx/topics/view/6#comments</comments>
			<pubDate>Mon, 21 Jan 2008 23:20:03 -0600</pubDate>
			<author>kiewic@gmail.com (Gilberto Stankiewicz)</author>
			<category>topics</category>
			<description>Recibí el siguiente correo con algunos puntos a considerar antes de realizar la aportación escolar. A mí no me molesta la aportación, y la escuela me parece respetable. &lt;b&gt;Sólo quisiera que las autoridades de ESCOM (Escuela Superior de Cómputo) pusieran un poco de atención en:&lt;/b&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&lt;ol&gt;&#13;
&lt;li&gt; Que se haga del conocimiento público donde queda ese dinero, porque no estoy seguro dónde quedó el dinero del semestre pasado. &lt;b&gt;¿Sería mucho pedir que se publicara una lista del destino de ese dinero?&lt;/b&gt;&lt;/li&gt;&#13;
&lt;li&gt; Que se mejore el SIGUE!!! (Sistema Institucional de Gestión y Unificación Escolar) &lt;b&gt;Es estúpido que las cuentas queden bloqueadas con dos o tres errores en la contraseña.&lt;/b&gt; Alguien con una boleta similar a la mía puede bloquear mi cuenta por error (o por no error) y verme perder mi próximo descanso en Control Escolar. Mejor que abran la posibilidad de poner contraseñas más largas, y mejoren el sistema de seguridad.&lt;/li&gt;&#13;
&lt;li&gt; Que el sitio de ESCOM se vea en Firefox!! ¿Cómo es posible que el sitio de la escuela y el SIGUE no tengan soporte completo para el navegador Firefox? Es una vergüenza. Yo aun no descubro quien es el encargado del sitio. Como escuela especializada en Sistemas Computacionales, la página nos queda muy pequeña. &lt;b&gt;El sitio de ESCOM debería ser un ejemplo de innovación para las demás escuelas y una muestra de lo que los alumnos de la escuela son capaces de hacer,&lt;/b&gt; pero no, alguien diseñó un &lt;b&gt;sitio basado en frames!!&lt;/b&gt; con algunos efectos malos en Flash y otros &amp;quot;efectos&amp;quot; en JavaScript no compatibles con los principales navegadores.&lt;/li&gt;&#13;
&lt;li&gt; &lt;b&gt;Que los exámenes de programación se realicen en computadoras.&lt;/b&gt; Yo, en tres semestres que llevo en la escuela, &lt;b&gt;jamás he tenido una clase en laboratorios de computación.&lt;/b&gt; Algunos conocidos tienen grandes deficiencias en programación y los exámenes en papel son una pésima forma de evaluar los conocimientos de Programación, porque la realidad es otra frente a una computadora.&lt;/li&gt;&#13;
&lt;li&gt; Ah! Y también he escuchado historias de &lt;b&gt;mujeres que han recibido un trato diferente por parte de algunos profesores,&lt;/b&gt; donde si ellas no participan como el profesor les sugiere, entonces suelen tener complicaciones en calificaciones y ETSs.&lt;/li&gt;&#13;
&lt;/ol&gt;&#13;
&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
A continuación el correo que recibí.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
--------------------------------------------------------------------------------&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Hola a todos!&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Este correo originalmente iba a mis compañeros cercanos de ESCOM pero el hecho de que ahora esté circulando por los demás parece ser útil simplemente para que los que aquí estudiamos tengamos un poco de información y cada quien tome la mejor decisión al respecto.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
En este ciclo escolar que inicia en el 2008, nos encontramos con que la escuela ahora cobrará lo que nosotros conocíamos como &amp;#039;La Aportación&amp;#039; con otro nombre un poco más &amp;#039;conveniente&amp;#039;, ahora se llama &amp;#039;Apoyo para mejoras del laboratorio&amp;#039;.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
En principio sería bueno retribuir a la escuela, pero siempre y cuando los beneficiados de éstas aportaciones de los alumnos fueran los mismos alumnos y en realidad desde que entré ya casi 4 años les puedo decir que no ha MEJORADO, seguimos con los mismos problemas. No importa si va este dinero a &amp;#039;los laboratorios&amp;#039;, &amp;#039;la cafetería&amp;#039;, &amp;#039;los salones&amp;#039;, &amp;#039;el estacionamiento&amp;#039;, &amp;#039;las áreas verdes&amp;#039; o lo que conocemos como &amp;#039;las canchas&amp;#039;, etc, el problema es que pasa cada semestre y no vemos INVERSIÓN en nuestra escuela, solo vemos que se hacen gastos que nunca se le informa a la comunidad del porque y un ejemplo de estos es EL CAMBIO DE PISO de una sección del edificio central.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Por citas problemas que tenemos desde hace mucho están los siguientes:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
 * Los salones donde supuestamente eran para ser equipados con tecnología para la enseñanza simplemente son SALONES ABANDONADOS, NO HAY PIZARRONES ELECTRÓNICOS, PROYECTORES, casilleros para los alumnos (estos últimos los rentan cuando DEBERÍA SER UN SERVICIO DE LA ESCUELA y no hay una responsabilidad de parte del &amp;#039;prestador del servicio&amp;#039; por si algunas cosas se extravían), etc. Solo de inicio tienen piso y techo falso, contemplando que en el futuro se equiparán, pero NO LO ESTÁN.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
 * Un DEPARTAMENTO DE CONTROL ESCOLAR INEFICIENTE, donde como cualquier oficina de gobierno hay que hacer trámites manualmente y a veces con malos tratos de algunas de las funcionarias (os) en ese departamento. Este departamento no cuenta con una forma automatizada para hacer trámites siendo totalmente contradictorio para ser una ESCUELA DE COMPUTO, maestros y alumnos sufren de este departamento cada que se necesita tener contacto con él. Por otro lado cuentan con un &amp;#039;sistema&amp;#039; llamado SIGUE que mas que ayuda es una forma mas de obstaculizar los trámites.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
 * Los LABORATORIOS NO SON ÚTILES, ya que cuentan con personal NO CAPACITADO para la administración de ellos (hablando principalmente de los de sistemas), en cuanto a los del área de electrónica NO ESTÁN EQUIPADOS APROPIADAMENTE.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
 * En nuestra escuela NO HAY SERVICIOS BÁSICOS para el trabajo como es el caso del Internet, en otras escuelas este servicio es público y es fácilmente accesible por los usuarios, en nuestra caso no lo es, a veces esta en función, otras no y otras NO ES UTILIZABLE, TIENE RESTRICCIONES totalmente inadecuadas y ridículas debido a filtros. Sin mencionar que EL ACCESO A ESTE SERVICIO ESTÁ PRIORIZADO principalmente a los alumnos que se encuentran desarrollando su trabajo terminal y los profesores. Simplemente es UN SERVICIO Y UNA RED MAL ADMINISTRADAS, este nos DEBERÍA PERMITIR HACER TRÁMITES ESCOLARES EN REMOTO y quizá hasta poner TOMAR CLASE DE ESTA MANERA, debería poder darnos la posibilidad de tener un espacio de almacenamiento y publicación como cualquier universidad en este ramo.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
 * Contamos con una administración interna que no nos permite tener una expresión de ideas e interacción entre los estudiantes, esta expresión puede ser deportiva, artística, cultural, etc, lo único que existe es un mero salón que intenta ser un área de expresión.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
 * NO TENEMOS VINCULACIÓN real CON EL CAMPO LABORAL, el hecho de que envíen un correo con plazas de trabajo la mayoría de las veces MAL PAGADAS no es una vinculación real. Para hacer servicio social nos ofrecen lugares totalmente INCONVENIENTES PARA LOS ALUMNOS, donde si bien es un &amp;#039;servicio social&amp;#039;, no es un regalo de nuestro esfuerzo y conocimientos.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
 * NO EXISTE ACTIVIDADES COMPLEMENTARIAS, el hecho de que cada fin de año se realice una &amp;#039;fiesta&amp;#039; y algunos asistan y bailen no es realmente una &amp;#039;actividad complementaria&amp;#039;, NO EXISTE UN DEPARTAMENTO DEPORTIVO que realmente funcione.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
 * EXISTEN PROFESORES INEFICIENTES, hay áreas donde los &amp;#039;facilitadores del conocimiento&amp;#039; no tienen un compromiso real con sus alumnos y esto se puede reflejar con los comentarios entre los alumnos y las calificaciones emitidas por ellos cada fin de año, PERO QUE NO SIRVEN para tomar acciones contundentes, HAY PROFESORES CORRUPTOS, SIN CONOCIMIENTOS Y SIN COMPROMISO con la enseñanza, todo ellos claramente conocidos por todos.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
 * Un ÁREA DE IMPRESIONES donde se intentó lucrar en vez de dar servicio y cuentan con UN PERSONAL INADECUADO, tenemos un proceso para poder imprimir algún documento totalmente ineficiente, hay que comprar un vale, subir a imprimir, pasar a verificar el vale y recibir el documento, el cual es muy TARDADO.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
 * Nuestras IDENTIFICACIONES de la escuela SON CREDENCIALES PRÁCTICAMENTE SIN VALIDEZ EXTERNA y muchas de las veces hasta FALSIFICABLES, debido a la sencillez y la falta de calidad en su elaboración.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Creo que no les he dicho nada nuevo, simplemente quiero recordarles lo que esta pasando y las condiciones sobre las que estamos haciendo nuestra carrera y quizá uno de los estudios mas importantes de nuestra vida. En lo personal con mucho gusto apoyaría a una escuela la cual me da todo lo que tiene para que mi estancia y desarrollo fuera el mejor posible, pero esta no lo es.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Cada quien TIENE EL DERECHO DE NO PAGAR ESTA APORTACIÓN POR SU CARÁCTER VOLUNTARIO, pero nos &amp;#039;obligan&amp;#039; a pagarlo ya que en control escolar al pedir informes nos dicen que para inscribirse hay que depositar en &amp;#039;el buzón&amp;#039; el comprobante de la aportación, el de pago a COFAA (el del Banco) y un horario de clases. PERO NO ES OBLIGATORIO, todos tenemos la oportunidad de decidir si queremos pagar o no eso.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
En mi caso no lo haré, hasta que las autoridades nos den muestras de que hay voluntad para tener una escuela mejor para todos, para los lideres y dirigentes como negocio y para los alumnos como una escuela y fuente de conocimientos.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Esto también es culpa de nosotros por permitir esto, han habido esfuerzos de compañeros que han intentado cambiar las cosas pero nos hemos dado cuenta que pesar de estos esfuerzos muchos de nosotros pero principalmente las autoridades no ponen de su parte para crear una solución a éste tipo de problemáticas.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Como ultimo punto y como petición personal, si desean reenviar este mensaje, PONGAN A TODOS LOS DESTINATARIOS BAJO EL CAMPO &amp;#039;CON COPIA OCULTA&amp;#039;, primero para que no se preste a hacer una forma de acumular direcciones de correo y así proteger la privacidad de cada uno y no fomentar actividades como el spam.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Saludos a todos. Y ustedes decidan.&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>Wed, 02 Jan 2008 09:33:52 -0600</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/champuFlash/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/champuFlash/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>
	</channel>
</rss>
