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

<channel>
	<title>aNieto2K &#187; Proyectos</title>
	<atom:link href="http://www.anieto2k.com/category/proyectos/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.anieto2k.com</link>
	<description>Desarrollo web, Wordpress, y alguna cosilla más</description>
	<lastBuildDate>Sun, 05 Feb 2012 10:15:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>POM: Programación Orientada a Maquetadores</title>
		<link>http://www.anieto2k.com/2011/07/25/pom-programacion-orientada-a-maquetadores/</link>
		<comments>http://www.anieto2k.com/2011/07/25/pom-programacion-orientada-a-maquetadores/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 19:07:31 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=10225</guid>
		<description><![CDATA[Entre diseñadores web y desarrolladores web siempre ha habido una línea un tanto difusa entre las funciones de uno y las funciones de otros. En esa línea difusa aparece el perfil de maquetador que en muchas empresas recae entre las funciones de uno o de otro. Si nos ponemos tiquismiquis podemos sacar muchos más perfiles, [...]]]></description>
			<content:encoded><![CDATA[Entre diseñadores web y desarrolladores web siempre ha habido una línea un tanto difusa entre las funciones de uno y las funciones de otros. En esa línea difusa aparece el perfil de maquetador que en muchas empresas recae entre las funciones de uno o de otro.

Si nos ponemos tiquismiquis podemos <a href="http://javierperez.com/perfiles-existentes-en-el-desarrollo-web/">sacar muchos más perfiles</a>, pero para este artículo nos bastará con estos 3  :D
<h3>Proceso de creación</h3>
Para entendernos un poco mejor, explico lo que entiendo por un proceso de creación de una aplicación web, partiendo de que se haya hecho (o no...) un buen análisis, con su correspondiente toma de requerimientos y si ya estás en una empresa seria de verdad, un proceso de validación de prototipos, y especificaciones... pero solo si es una empresa seria de verdad, no vale con ir de ello...

En ese punto, una vez aprovado todo por el cliente, remarcado y explicado perfectamente lo que se ha pedido y lo que se ha de entregar, se comienza a trabajar.

En este punto, los diseñadores empiezan a darle forma a esos prototipos, esos wireframes que el usuario a validado y que espera recibir. Una vez terminados estos diseños, generalmente en formato imagen, se le muestran al usuario para que valide el diseño de la página y pasemos a darle funcionalidad a la misma. (Ojo!, creo que estoy entrando en un mundo utópico rodeado de unicornios y dragones... :D).

Vale, ya hemos validado con el usuario el diseño y la funcionalidad que desea para su nueva y flamante nueva aplicación web, ha sido un proceso duro, pero nos permite disponer de toda la información necesaria para empezar y no tener que volver a molestar al usuario, salvo las notificaciones periódicas que se planifiquen.

En este punto, el diseño se pasa a los maquetadores, encargados de convertir ese diseño en el HTML que el usuario podrá ver en su navegador, este HTML no contendrá ninguna funcionalidad, únicamente habrá HTML y CSS.

En este punto, entramos una zona pantanosa, ya que nos encontramos código javascript que necesita el diseño para ser funcional (sliders, autocompletes, ....). Soy de los que cree que esta responsabilidad debería caer en el maquetador, ya que es el que está más cerca del diseñador para saber que funcionamiento ha de tener esa porción de web concreta.

Por otro lado, nos encontramos con que hay ciertas funcionalidades que afectan, tanto al maquetador como al desarrollador web, por ejemplo los autocompletes (suggest), validación de formularios, ... esta funcionalidad es a veces un poco difusa. En este punto entra lo que yo llamo, en alarde de originalidad POM (Programación Orientada a Maquetadores).
<h3>POM: Programación Orientada a Maquetadores</h3>
Se trata de ofrecer al maquetador una serie de herramientas que le permita añadir funcionalidad básica al HTML sin necesidad de tocar una sola línea de Javascript. Básicamente se trata de generar componentes autónomos que lean el HTML y los atributos especiales que este HTML ha de tener.

Hace ya mucho tiempo, publiqué <a href="http://www.anieto2k.com/2008/06/25/validar-formularios-con-jquery/">un ejemplo de validación de formularios con jQuery que seguía esta metodología</a>. Se basaba en indicar a cada elemento de que tipo de validación requería para comprobar los datos de entrada. A grandes rasgos, vemos que usando el class de los atributos &lt;input /&gt;, &lt;select /&gt;,... informábamos el tipo de validación.
<h4>Atributos data-*</h4>
Entonces llegó <a href="http://dev.w3.org/html5/spec/Overview.html#embedding-custom-non-visible-data-with-the-data-attributes">HTML5 y sus atributos data-*</a>, unos atributos que abren un abanico de posibilidades, y aunque antes me daban un poco de miedo, ahora disfruto con ellos :D

Los atributos data-*, nos permiten dotar a nuestros elementos de un montón de datos que podemos usar en nuestro código javascript, de forma que podremos construir un código capaz de trabajar con ellos y construirse en función de ellos.

Veamos un ejemplo:
<pre>&lt;input type="text" class="autocomplete estilobonito" data-max-items="15" data-type="clientes" data-min-length="3" /&gt;

// jQuery
$("input.autocomplete").bind(function(){

	// Recogemos valores
	var $this = $(this),
	 	$value = $this.val(),
		$maxitems = $this.data("max-items") || 5,
		$type = $this.data("type") || "compras", 
		$minlength = $this.data("min-length") || 5;
	
	
	/* Funcionalidad */
	
	// Salimos si ha pulsado menos de $minlength carácteres
	if ($value.length &lt; $minlength) return;
	
	jQuery.getJSON("http://miservicio.com/", {
		type: $type,
		items: $maxitems,
		value: $value
	},function(){
		/* LO QUE QUIERAS HACER*/
	});
});</pre>
Como podemos ver, nos permita acceder a ellos fácilmente, <a href="http://stackoverflow.com/questions/5696464/are-html-data-attributes-safe-for-older-browsers-e-g-ie-6/5696483#5696483">sin jQuery y para IE es igual de fácil</a>.
<h3>¿Donde está la gracia?</h3>
La gracia está en hacer el código lo más reutilizable posible, haciendo que nos permita configurar nuestros elementos HTML de forma fácil. En mi caso personal, esta programación ha conseguido descargarme bastante de trabajo que antes hacía yo para que ahora los maquetadores/diseñadores puedan configurar.

Por experiencia, puedo decir que siempre terminas modificando el código y adaptando el código a las diferentes necesidades del diseño, pero se convierte en una tarea más sencilla y fácil de depurar.

Un ejemplo que estamos usando y que nos funciona muy bien, a ver si un día puedo implementar una versión de demo para que la veáis, es un autocomplete usando el de jQuery UI, capaz de diferenciar entre 3 o 4 tipos diferentes de datos y 3 o 4 salidas diferentes que comparten prácticamente todo el código.

Esto, añadido al <a href="http://www.anieto2k.com/2011/02/13/modularizar-aplicaciones-escalables-javascript-con-poa/">modelo de programación modular que vimos hace ya muuucho tiempo</a>, nos está dando unos muy buenos resultados, tanto a la hora de desarrollar como a la hora de depurar la aplicación.<h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2007/09/23/programacion-orientada-a-objetos-poo-en-javascript/" rel="bookmark" title="Permanent Link: Programación Orientada a Objetos (POO) en Javascript">Programación Orientada a Objetos (POO) en Javascript</a></li><li><a href="http://www.anieto2k.com/2006/03/20/browser-book-libro-para-maquetadores/" rel="bookmark" title="Permanent Link: Browser Book, Libro para maquetadores">Browser Book, Libro para maquetadores</a></li><li><a href="http://www.anieto2k.com/2008/06/18/joose-js-mejorando-la-programacion-orientada-a-objetos/" rel="bookmark" title="Permanent Link: Joose-js, mejorando la programación orientada a objetos">Joose-js, mejorando la programación orientada a objetos</a></li><li><a href="http://www.anieto2k.com/2006/11/21/top-20-lenguajes-de-programacion/" rel="bookmark" title="Permanent Link: Top 20 lenguajes de programacion">Top 20 lenguajes de programacion</a></li><li><a href="http://www.anieto2k.com/2009/05/13/de-photoshop-a-xhtmlcss-paso-a-paso/" rel="bookmark" title="Permanent Link: De Photoshop a XHTML/CSS paso a paso">De Photoshop a XHTML/CSS paso a paso</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.238"><img rel="38.107.179.238" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2011/07/25/pom-programacion-orientada-a-maquetadores/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Introducción a GTD (Getting Things Done)</title>
		<link>http://www.anieto2k.com/2010/09/14/introduccion-a-gtd-getting-things-done/</link>
		<comments>http://www.anieto2k.com/2010/09/14/introduccion-a-gtd-getting-things-done/#comments</comments>
		<pubDate>Tue, 14 Sep 2010 08:02:46 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[Proyectos]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=10035</guid>
		<description><![CDATA[Hace una semana que estoy intentando hacerme con el método de gestión de tareas llamado GTD (Getting Things Done). Por el momento me está ayudando a gestionarme más eficientemente las tareas del día a día. Y poco a poco voy cogiendo la rutina de trabajar con este sistema. Aprovechando que lo tengo reciente publico este [...]]]></description>
			<content:encoded><![CDATA[Hace una semana que estoy intentando hacerme con el método de gestión de tareas llamado<strong> GTD (Getting Things Done)</strong>. Por el momento me está ayudando a gestionarme más eficientemente las tareas del día a día. Y poco a poco voy cogiendo la rutina de trabajar con este sistema.

Aprovechando que lo tengo reciente publico este mini resumen por si a alguien no lo conoce y le puede ayudar. Aunque yo no lo he hecho (aún) recomiendo leer el libro <a href="http://www.amazon.com/Organizate-Eficacia-Getting-Things-Spanish/dp/849662708X">"Organizate con Eficacia /GTD"</a>.
<h3>Descripción</h3>
<strong><a href="http://es.wikipedia.org/wiki/Getting_Things_Done">GTD (Getting Things Done)</a></strong> es un método de gestión de tareas descrito por  David Allen, que se basa en apuntar las tareas y descargar al cerebro de la tarea de almacenarlas conscientemente.

En su lugar, propone que se creen listas por contextos, permitiéndonos revisar únicamente las tareas asociadas a un contexto. De esta forma únicamente será necesario procesar las del contexto en el que estemos en ese momento.

Por ejemplo, ¿Por qué pensar en las tareas a hacer en casa mientras estamos en el trabajo? Al llegar a casa, tendremos las tareas que debemos hacer en el contexto “casa”.


<h3>Preparación</h3>
La primera tarea que deberíamos hacer es definir los denominados “inbox”. Estos inbox son lugares en los que te llegan tareas. Ya sea, el correo del trabajo o tu lista de tareas en una herramienta de gestión (<a href="http://mail.google.com/tasks">Google Tasks</a>, <a href="http://www.rememberthemilk.com/">Remember the Milk</a>, <a href="http://www.gtdify.com/">GTDify</a>,…).
En mi caso, dispongo de 2 inbox:
<ol>
	<li>Inbox de tareas en Remember de Milk</li>
	<li>Inbox del Lotus Notes del trabajo.</li>
</ol>
Una vez detectado debemos dedicar un tiempo a “descargar el cerebro”, osea realizar un listado de tareas con todo lo que tenemos que hacer, nos gustaría hacer, en el resto de la vida. Lo ideal es que salgan más de 50 aunque lo ideal sería llegar a las 100 tareas pendientes.
Por ejemplo:
<ul>
	<li>Viaje a Japón</li>
	<li>Comprar agua</li>
	<li>Llamar a Pepe</li>
	<li>Tirar la basura</li>
	<li>…</li>
</ul>
<h3>Algún día</h3>
Con un listado tan grande y con ideas tan lejanas, la primera lista que debemos crear es la de “Algún día”. Allí irán tareas que te gustaría hacer, o que tienes que hacer pero no en un corto espacio de tiempo.
Por ejemplo:
<ul>
	<li>Viaje a Japón</li>
	<li>Comprar mampara del baño</li>
	<li>Cambiar la persiana del comedor</li>
	<li>….</li>
</ul>
<h3>Contextos</h3>
Una vez definidas las tareas, nos disponemos a ir analizando los contextos en los que pueden ser efectuadas.
Por ejemplo:
<ul>
	<li>Comprar agua à compras</li>
	<li>Llamar a Pepe à llamadas</li>
	<li>Tirar la basura à casa</li>
	<li>Proyectos</li>
</ul>
Las tareas que pueden ser divididas en 2 o más tareas pasan automáticamente a convertirse en un proyecto. Y este proyecto, no es más que un listado de tareas relacionadas entre si.
Por ejemplo:
<ul>
	<li>Viaje a Japón
<ul>
	<li>Buscar billetes de avión</li>
	<li>Buscar hotel</li>
	<li>Aprender frases compuestas en Japonés</li>
	<li>…</li>
</ul>
</li>
</ul>
<h3>Agendas</h3>
Hay tareas que necesitan de un tercero, en estos casos, David Allen las llama “agendas” y se tratan de una forma similar a los proyectos pero para ello crearemos una lista con el nombre de la persona con la que tendremos que hacer dicha tarea.
Por ejemplo:
<ul>
	<li>Pepe López
<ul>
	<li>Llamar a María</li>
	<li>Organizar cena antiguos alumnos</li>
	<li>…</li>
</ul>
</li>
</ul>
<h3>Cheklist</h3>
Se trata de esas tareas repetitivas que nos encontramos en cada proyecto.
Por ejemplo:
<ul>
	<li>Viaje a Japón
<ul>
	<li>Buscar billetes de avión</li>
	<li>Buscar hotel</li>
</ul>
</li>
	<li>Viaje a Islandia
<ul>
	<li>Buscar billetes de avión</li>
	<li>Buscar hotel</li>
</ul>
</li>
</ul>
<h3>En espera</h3>
Como no todas las posibles tareas dependen siempre de ti mismo, puedes encontrarte alguna tarea en la que necesitas que una persona realice una acción, en ese caso, usaremos la lista “En espera”.
Por ejemplo:
<ul>
	<li>En espera
<ul>
	<li>Organizar cena antiguos alumnos (Pepe López)</li>
	<li>…</li>
</ul>
</li>
</ul>
<h3>Prioridades</h3>
En esta metodología no existan las prioridades por definición, estas se contemplan en el momento que se revisa la lista concreta. Cada uno debe detectar que tarea es más importante y cual puede posponerse para un momento con más ánimos, tiempo,….
Por ejemplo:
<ul>
	<li>Casa
<ul>
	<li>Sacar la basura</li>
	<li>Llamar a mis padres</li>
	<li>Sacar ropa de la lavadora</li>
	<li>….</li>
</ul>
</li>
</ul>
<h3>Reglas básicas</h3>
Una vez definido los diferentes conceptos debemos conocer las reglas básicas que debemos de cumplir.

<strong>Revisar los inboxs al menos una vez al día</strong>
Al menos una vez al día hemos de revisar los inboxs y reorganizar las tareas que hayan podido llegar, ya sea que tu hayas añadido o correos que te hayan llegado.

<strong>Regla de los 2 minutos</strong>
A la hora de organizar las tareas, debemos tener en cuenta que si una tarea puede ser completada en menos de 2 minutos* debe hacerse en ese instante.

<em>* Los 2 minutos son orientativos, el tiempo lo pone cada uno. El único requisito es que no consuma demasiado tiempo</em> <em>ya que hará muy tediosa la tarea de revisar los inbox.</em>

<strong>Revisar las listas/contextos una vez a la semana</strong>
Una vez a la semana, debemos revisar todas las listas y proyectos y reorganizar las tareas que puedan estar en “Algún día” para pasarlas a su contexto correspondiente si fuera necesario. Vaciar la cabeza de nuevas tareas y dejar los inbox limpios.

<strong>Captura y sigue trabajando</strong>
Siempre que detectemos una nueva tarea debemos apuntarla en el inbox de tareas y seguimos haciendo lo que estuviéramos haciendo. También podemos aplicar la regla de los 2 minutos para hacerla, siempre y cuando no estemos haciendo una tarea importante. En este caso, no sería necesario añadirla al inbox.

En el proceso de revisado diario la reorganizamos y pasará a la lista de tareas próximas a hacer.
<h3>Diagrama</h3>
<div style="text-align: center;"><a rel="lightbox" href="http://farm3.static.flickr.com/2507/3748746057_d1d1569235_o.png"><img src="http://www.anieto2k.com/wp-content/uploads/2010/09/3748746057_ba698581d7_b-260x300.jpg" alt="Diagrama GTD" /></a>
<a href="http://farm3.static.flickr.com/2507/3748746057_d1d1569235_o.png"><small>(Ver Imagen)</small></a></div>
<h3>Más información</h3>
<ul>
	<li><a href="http://www.consumer.es/web/es/tecnologia/software/2010/01/04/190000.php">Aplicaciones GTD</a></li>
	<li><a href="http://thinkwasabi.com/">Cualquier artículo de Berto Pena en ThinkWasabi</a></li>
</ul>
<strong>Agradecimientos</strong>
Gracias a <em>Jordi Gaga</em> por la explicación y por los consejos para adaptar Remember the Milk.<h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2007/07/27/especificacion-css-algo-que-deberias-conocer/" rel="bookmark" title="Permanent Link: Especificidad CSS, algo que deberías conocer">Especificidad CSS, algo que deberías conocer</a></li><li><a href="http://www.anieto2k.com/2006/08/30/jquery-10-ha-salido-para-mostrarnos-la-luz/" rel="bookmark" title="Permanent Link: jQuery 1.0 ha salido para mostrarnos la luz">jQuery 1.0 ha salido para mostrarnos la luz</a></li><li><a href="http://www.anieto2k.com/2007/05/17/3-maravillas-para-los-desarrolladores-en-wordpress-22/" rel="bookmark" title="Permanent Link: 3 maravillas para los desarrolladores en WordPress 2.2">3 maravillas para los desarrolladores en WordPress 2.2</a></li><li><a href="http://www.anieto2k.com/2009/03/06/introduccion-al-hcard-presentate-semanticamente-en-la-web/" rel="bookmark" title="Permanent Link: Introducción al hCard, preséntate semánticamente en la web">Introducción al hCard, preséntate semánticamente en la web</a></li><li><a href="http://www.anieto2k.com/2008/08/15/creando-notas-al-pie-con-jquery/" rel="bookmark" title="Permanent Link: Creando notas al pie con jQuery">Creando notas al pie con jQuery</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.238"><img rel="38.107.179.238" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2010/09/14/introduccion-a-gtd-getting-things-done/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Reduce el ruido de tus fotografías apilando imágenes I</title>
		<link>http://www.anieto2k.com/2010/05/23/apilacion-de-imagenes/</link>
		<comments>http://www.anieto2k.com/2010/05/23/apilacion-de-imagenes/#comments</comments>
		<pubDate>Sun, 23 May 2010 18:40:58 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[fotografía]]></category>
		<category><![CDATA[photoshop]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=9921</guid>
		<description><![CDATA[Si recordamos los 3 factores que intervienen en la correcta exposición de una fotografía nos encontramos con la sensibilidad ISO, que era la que nos permite especificar la cantidad de luz que el sensor es capaz de procesar. Este proceso se realiza forzando la sensibilidad por defecto del sensor electrónicamente. Este sobreesfuerzo del sensor produce [...]]]></description>
			<content:encoded><![CDATA[Si recordamos los 3 factores que intervienen en<a href="http://www.anieto2k.com/2010/04/05/fotografia-para-desarrolladores-web/"> la correcta exposición de una fotografía</a> nos encontramos con la sensibilidad ISO, que era la que nos permite especificar la cantidad de luz que el sensor es capaz de procesar. Este proceso se realiza forzando la sensibilidad por defecto del sensor electrónicamente. Este sobreesfuerzo del sensor produce un efecto en forma de ruido, píxeles encendidos aleatóriamente por toda la fotografía que puede (o no) afear la imagen.

Una técnica que se usa para reducir el ruido de la imágen es la de apilar imágenes y promediarlas para eliminar los puntos aleatorios y reforzar los puntos de información de una fotografía. En este ejemplo usaré Photoshop, aunque hay muchas herramientas que permite conseguir el mismo efecto.
<h3>Poniendonos en situación</h3>
Imaginemos que estamos dentro de una iglesia, catedral o recinto oscuro que nos obliga a subir la sensibilidad ISO para obtener la imagen correctamente expuesta. Yo he usado el trípode como modelo y he hecho la foto en una habitación con la ventana cerrada para simular la falta de luz.
<p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2010/05/inicio.jpg"><img src="http://www.anieto2k.com/wp-content/uploads/2010/05/inicio-682x1024.jpg" alt="inicio" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2010/05/inicio.jpg"><small>(Ver Imagen)</small></a></p>
La fotografía está tomada a:
<ul>
	<li>Velocidad: 1/20 seg</li>
	<li>Apertura: f/4.0</li>
	<li>ISO: 1600</li>
	<li>Focal: 10mm</li>
</ul>


No es ninguna maravia estética, pero para ilustrar lo que quiero mostrar me bastará, podemos ver claramente en el siguiente recorte el ruido producido.
<p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2010/05/recorte-ruido.jpg"><img src="http://www.anieto2k.com/wp-content/uploads/2010/05/recorte-ruido.jpg" alt="recorte-ruido" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2010/05/recorte-ruido.jpg"><small>(Ver Imagen)</small></a></p>

<h3>4-5 mejor que 1</h3>
La técnica se basa en la apilación de imágenes iguales, eso significa que debemos hacer 4-5 (o más fotografías) para poder apilarlas posteriormente. Si usamos trípode sería idea, sinó lo suyo sería intentar no bajar de los 1/60 seg. y apoyarse en algo para hacer las tomas en ráfaga, siempre en ráfaga.
<h3>Photoshop</h3>
Para empezar deberemos cargar las imágenes como capas en Photoshop, para eso tendremos que ir al menú Archivo &gt; Secuencia de comandos &gt; Cargar archivos en pila ...
<p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2010/05/cargarpila.jpg"><img src="http://www.anieto2k.com/wp-content/uploads/2010/05/cargarpila-380x300.jpg" alt="cargarpila" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2010/05/cargarpila.jpg"><small>(Ver Imagen)</small></a></p>
Nos aparecerá una opción para seleccionar los ficheros que deseamos apilar, una vez seleccionados marcamos las dos casillas inferiores, como se muestra en la imagen:
<p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2010/05/seleccionadas.jpg"><img src="http://www.anieto2k.com/wp-content/uploads/2010/05/seleccionadas-447x300.jpg" alt="seleccionadas" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2010/05/seleccionadas.jpg"><small>(Ver Imagen)</small></a></p>
Pulsamos OK, y esperamos a que automáticamente alinée las imagenes.
<h3>Modo de apilamiento</h3>
Existen varios modos de apilamiento, y cada uno de ellos permite obtener un resultado diferente. No voy a entrar en las diferencias que hay entre unos y otros, pero nosotros usaremos el llamado "Promedio".
<p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2010/05/promedio.jpg"><img src="http://www.anieto2k.com/wp-content/uploads/2010/05/promedio-489x300.jpg" alt="promedio" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2010/05/promedio.jpg"><small>(Ver Imagen)</small></a></p>
Este proceso tardará un rato dependiendo de la máquina que lo ejecute, y el resultado debería ser algo parecido a esto.
<p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2010/05/final.jpg"><img src="http://www.anieto2k.com/wp-content/uploads/2010/05/final-683x1024.jpg" alt="final" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2010/05/final.jpg"><small>(Ver Imagen)</small></a></p>
Podemos ver el recorte como el resultado ha eliminado el ruido:
<p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2010/05/recorte-noruido.jpg"><img src="http://www.anieto2k.com/wp-content/uploads/2010/05/recorte-noruido.jpg" alt="recorte-noruido" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2010/05/recorte-noruido.jpg"><small>(Ver Imagen)</small></a></p>
Nota: En este ejemplo me han salido movido el resultado por que lo he hecho a pulso a una velocidad de obturación de 1/20, muy baja para mi pulso. Pero se puede apreciar la reducción de ruido de forma considerable. Mientras más imágenes se apilan, más ruido es posible eliminar,  por consecuente será más sencillo estirar el histograma permitiendo obtener más información de la imagen.

Un ejemplo de que se puede conseguir usando esta técnica es su aplicación en astrofotografía. Este uso y algunas de las aplicaciones que se usan en astrofotografía me gustaría explicarlo más adelante.

<p style="text-align: center;"><a rel="lightbox" title="Centro galáctico por anieto2k, en Flickr" href="http://www.flickr.com/photos/anieto2k/4631664590/"><img src="http://farm5.static.flickr.com/4047/4631664590_56788ace92_b.jpg" alt="Centro galáctico" width="682" height="1024" /></a>
<a href="http://www.flickr.com/photos/anieto2k/4631664590/"><small>(Ver Imagen)</small></a></p><h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2007/11/02/12-galerias-de-imagenes-en-javascript/" rel="bookmark" title="Permanent Link: 12 galerías de Imagenes en Javascript">12 galerías de Imagenes en Javascript</a></li><li><a href="http://www.anieto2k.com/2008/11/25/101-galerias-de-imagenes-en-javascriptflashcss/" rel="bookmark" title="Permanent Link: 101 galerías de imagenes en javascript/flash/css">101 galerías de imagenes en javascript/flash/css</a></li><li><a href="http://www.anieto2k.com/2006/06/07/precarga-de-imagenes-con-css/" rel="bookmark" title="Permanent Link: Precarga de Imagenes con CSS">Precarga de Imagenes con CSS</a></li><li><a href="http://www.anieto2k.com/2007/05/06/redimensiona-las-imagenes-de-tus-posts/" rel="bookmark" title="Permanent Link: Redimensiona las imagenes de tus posts">Redimensiona las imagenes de tus posts</a></li><li><a href="http://www.anieto2k.com/2006/09/18/transparencias-en-tus-imagenes-con-css/" rel="bookmark" title="Permanent Link: Transparencias en tus imagenes con CSS">Transparencias en tus imagenes con CSS</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.238"><img rel="38.107.179.238" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2010/05/23/apilacion-de-imagenes/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Wp-Answers, crea una comunidad de preguntas y respuestas con WordPress</title>
		<link>http://www.anieto2k.com/2009/11/07/wp-answers-crea-una-comunidad-de-preguntas-y-respuestas-con-wordpress/</link>
		<comments>http://www.anieto2k.com/2009/11/07/wp-answers-crea-una-comunidad-de-preguntas-y-respuestas-con-wordpress/#comments</comments>
		<pubDate>Sat, 07 Nov 2009 11:49:13 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[wordpress.plugin]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=9223</guid>
		<description><![CDATA[Hace unos meses empecé a montar este plugin que permite crear comunidades basadas en preguntas y respuestas, al estilo StackOverFlow y/o Yahoo! Answers. La idea es generar, sin modificar para nada el núcleo de WordPress, un sistema basado en votaciones de comentarios y ordenarlos por este número de votaciones. De esta forma, podremos disponer de [...]]]></description>
			<content:encoded><![CDATA[Hace unos meses empecé a montar este plugin que permite <strong>crear comunidades basadas en preguntas y respuestas</strong>, al estilo <a href="http://stackoverflow.com/">StackOverFlow</a> y/o <a href="http://es.answers.yahoo.com/">Yahoo! Answers</a>. La idea es generar, sin modificar para nada el núcleo de WordPress, un sistema basado en votaciones de comentarios y ordenarlos por este número de votaciones.

De esta forma, podremos disponer de un sistema que nos permita lanzar preguntas y que mediante las contestaciones de los usuarios y sus votos, podamos obtener una respuesta lo más acertada posible.
<h3>Wp-Answers</h3>
El plugin se encarga de añadir un formulario a cada comentario permitiendo que los usuarios puedan votar positiva o negativamente dicho comentario. Posteriormente y dependiendo del número de comentarios de este comentario y los demás, lo ordenará de forma que el comentario con más votos quede primero, el segundo mejor votado segundo y así sucesivamente.
<p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2009/11/wp-answers.jpg"><img src="http://www.anieto2k.com/wp-content/uploads/2009/11/wp-answers-438x300.jpg" alt="wp-answers" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2009/11/wp-answers.jpg"><small>(Ver Imagen)</small></a>
<h3>Nuestro theme</h3>
El plugin, está pensado para no depender de ningún theme y que pueda funcionar en cualquiera, por ello todo el estilo CSS y el Javascript (para realizar las llamadas con Ajax) se puede añadir fácilmente adaptándolo a cada WordPress.
<h4>Dándole estilos</h4>
El formulario, por defecto no tiene estilos aunque puede personalizarse como más nos guste <strong>incluyendo los estilos a nuestro style.css de nuestro theme</strong>. Os dejo un ejemplo del que he usado para las pruebas:
<pre><code>.wp_answers_votes {
 float:right;
 background-color:#F1F1F1;
 margin-bottom:10px;
 padding:10px
 text-align:center;
 -moz-border-radius:6px;
 -webkit-border-radius:6px;
 border-radius:6px;
}
.wp_answers_total_votes{
 font-size:2em;
}</code></pre>
<h3>Opciones</h3>
Disponemos de una serie de opciones, muy sencillas que nos permiten configurar el nivel de Karma que aporta o resta la votación de comentarios. Además de poder indicar si necesitamos que el usuario este registrado en el blog o no.
</p><p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2009/11/wp-answers-options1.jpg"><img src="http://www.anieto2k.com/wp-content/uploads/2009/11/wp-answers-options1-338x300.jpg" alt="wp-answers-options" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2009/11/wp-answers-options1.jpg"><small>(Ver Imagen)</small></a>
<h3>Widget</h3>
He creado un pequeño Widget que nos permitirá mostrar un top N usuarios, ordenados por karma acumulado en nuestro sidebar, simplemente tendremos que indicar las opciones del Widget y añadirlo al sidebar que deseemos.
</p><p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2009/11/wp-answers-widget.jpg"><img src="http://www.anieto2k.com/wp-content/uploads/2009/11/wp-answers-widget.jpg" alt="wp-answers-widget" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2009/11/wp-answers-widget.jpg"><small>(Ver Imagen)</small></a>
<h3>Descargar</h3>
Aquí <a href="http://downloads.wordpress.org/plugin/wp-answers.zip">teneis el enlace</a>, también podeis <a href="http://www.anieto2k.com/2009/11/11/%C2%BFtiene-sentido-usar-wp-answers-en-anieto2k/">verlo en funcionamiento</a> <span style="text-decoration: line-through;">con el theme <a href="http://wordpress.org/extend/themes/p2">P2 (de WordPress)</a></span>

<strong>Actualización</strong>

Por sugerencia de <a href="http://www.anieto2k.com/2009/11/07/wp-answers-crea-una-comunidad-de-preguntas-y-respuestas-con-wordpress/comment-page-1/#comment-61162">Cristian Eslava</a> añado la opción de seleccionar una categoría a la que asociar este sistema de mostrar los comentarios. De esta forma, es posible asociarlo a una parte de tu WordPress y no a todo.</p><h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2009/11/11/%c2%bftiene-sentido-usar-wp-answers-en-anieto2k/" rel="bookmark" title="Permanent Link: ¿Tiene sentido usar wp-answers en aNieto2k?">¿Tiene sentido usar wp-answers en aNieto2k?</a></li><li><a href="http://www.anieto2k.com/2006/05/17/respuestas-de-programador/" rel="bookmark" title="Permanent Link: Respuestas de programador">Respuestas de programador</a></li><li><a href="http://www.anieto2k.com/plugins-themes/" rel="bookmark" title="Permanent Link: Plugins &amp; Themes">Plugins &amp; Themes</a></li><li><a href="http://www.anieto2k.com/2005/12/01/un-amigo-muy-listo/" rel="bookmark" title="Permanent Link: Un amigo muy listo">Un amigo muy listo</a></li><li><a href="http://www.anieto2k.com/2008/03/29/%c2%bfquieres-ser-millonario-version-geek-para-tu-iphone/" rel="bookmark" title="Permanent Link: ¿Quieres ser millonario? versión Geek para tu iPhone">¿Quieres ser millonario? versión Geek para tu iPhone</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.238"><img rel="38.107.179.238" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2009/11/07/wp-answers-crea-una-comunidad-de-preguntas-y-respuestas-con-wordpress/feed/</wfw:commentRss>
		<slash:comments>77</slash:comments>
		</item>
		<item>
		<title>Introducción a los W3C Widgets</title>
		<link>http://www.anieto2k.com/2009/04/22/introduccion-a-los-w3c-widgets/</link>
		<comments>http://www.anieto2k.com/2009/04/22/introduccion-a-los-w3c-widgets/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 15:26:45 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[estandares]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[w3c.widgets]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=8005</guid>
		<description><![CDATA[Hace 3 años que vimos las primeras noticias sobre el borraror de la W3C sobre los Widgets. Y ya entonces vimos que el tema prometía. QuirksBlog nos muestra una introducción sobre como usar estos Widgets. ¿Que es un widget? Esencialmente un Widget es un conjunto de HTML/CSS/Javascript locales. Decimos locales, por que una vez que, [...]]]></description>
			<content:encoded><![CDATA[Hace 3 años que <a href="http://www.anieto2k.com/2006/11/10/la-w3c-le-mete-mano-a-los-widgets/">vimos las primeras noticias sobre el borraror de la W3C sobre los Widgets</a>. Y ya entonces vimos que el tema prometía. QuirksBlog nos muestra <a href="http://www.quirksmode.org/blog/archives/2009/04/introduction_to.html">una introducción sobre como usar estos Widgets</a>.
<h3>¿Que es un widget?</h3>
Esencialmente<strong> un Widget es un conjunto de HTML/CSS/Javascript locales</strong>. Decimos locales, por que una vez que, por ejemplo, un movil descarga un widget debe ser capaz de usarlo localmente, al quedar instalado en él.

Aunque actualmente la utilización de widgets es muy límitada, lectores de RSS, relojes,... no hay razones teóricas de que no puedan ser capaces de crear aplicaciones basadas en Javascript realmente complejas, por ejemplo una Hoja de Cálculo.

La belleza de este modelo, es que aunque una aplicación requisiera 200kb de Javascript, más una serie de librerías, el usuario únicamente tendrá que descargarlo una sola vez. Después de la descarga, la aplicación se instala y las próximas veces se ejecutará en local sin necesidad de descargar nada.

En caso de requerir cualquier dato externo al widget, dispone de una interface que nos permite realizar peticiones Ajax y cargar el contenido en el momento que lo necesitamos.

Los <em>W3C Widgets</em> nacen como estandarización a los ya existentes creados para dispositivos como el iPhone, móviles Android, ... que usan sistemas propietarios y únicamente adaptables a sus dispositivos. Con <em>W3C Widgets</em> se intenta crear un sistema que permita la interoperatividad de estos widgets en diferentes dispositivos sin necesidad de tener que modificar una sola línea de código del widget. Y todo ello aprovechando las técnicas HTML/CSS/Javascript que los desarrolladores conocemos.

En fin, los <em>W3C Widgets</em> apuntan como el futuro de la web movil. Son fáciles de crear, usan estándares abiertos y se ajustan al mínimo consumo de la red.
<h3>Información técnica</h3>
Los Widgets no son más que sitios web comprimidos. Creamos un fichero HTML, le añadimos los estilos necesarios en ficheros CSS y la funcionalidad viene dada en ficheros Javascript. Todo ello comprimir en un fichero zip, al que le cambiaremos la extensión a <code>.wg</code>t y listo. ¿Sencillo verdad?

Actualmente <a href="http://www.w3.org/TR/widgets-apis/">la especificación está continua como Working Draft</a> (Borrador) modificado últimamente el día 5 de Febrero de 2009. Aunque el proceso está siendo tan lento como la W3C ya están las bases muy bien definidas.

<h3>Creando nuestro primer Widget</h3>
Para evitar problemas y facilitar la creación de Widgets (al parecer los ficheros ZIP en OSX no acaban de permitir que los widgets funcionen), Vodafone, junto con Opera, han creado<a href="http://www.betavine.net/bvportal/web/guest/widgetzone/research"> una aplicación llamada Widgets SDK </a>que nos permite trabajar con ellos de una forma rápida y cómoda, solventado estos problemas de compatibilidad.

En la aplicación encontraremos Vodafone Widget Manager que nos pemitirá<a href="http://blog.stefankolb.de/2009/04/13/debugging-mobile-widgets-with-opera-dragonfly/"> depurar nuestros Widgets con una conexión bluetooth y Opera Dragonfly</a>.
<h4>Fichero config.xml</h4>
Un widget necesita un fichero <code>config.xml</code> que indicará el tamaño en pixels, el icono que tendrá nuestro widget, el nombre y definiremos la seguridad de nuestras peticiones Ajax mediante el tag <code>&lt;host /&gt;</code>.
<pre><code>&lt;widget id="http://quirksmode.org/widget" dockable="true"&gt;
  &lt;widgetname&gt;Test widget&lt;/widgetname&gt;
  &lt;icon&gt;pix/myIcon.gif&lt;/icon&gt;
  &lt;width&gt;200&lt;/width&gt;
  &lt;height&gt;200&lt;/height&gt;
  &lt;security&gt;
    &lt;access&gt;
      &lt;host&gt;quirksmode.org&lt;/host&gt;
    &lt;/access&gt;
  &lt;/security&gt;
&lt;/widget&gt;</code></pre>
Con <code>config.xml</code> definimos las capacidades del widget HTML/CSS/Javascript que hemos creado.
<h3>Vayamos al lio</h3>
Bueno, yo he usado la versión para Mac de Widgets SDK, que podeis descargar directamente desde <a href="http://www.betavine.net/bvcms/applications/widgets/widgetpackage_osx.zip">aqui (30mb)</a>, tambien está disponible la versión Windows <a href="http://www.betavine.net/bvcms/applications/widgets/widgetpackage_win.zip">aqui</a>.

Una vez descargado y descomprimido, vemos 3 carpetas, Application, Documentation y Tutorial. Dentro de Application encontramos todo lo que necesitamos para crear nuestro primer Widget.
<p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetapp.jpg"><img class="aligncenter" src="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetapp-600x160.jpg" alt="widgetapp" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetapp.jpg"><small>(Ver Imagen)</small></a>

Tenemos Opera 9.64 que nos permitirá probarlo en nuestro ordenador mediante el motor gráfico de Opera. Tambien encontraremos VodafoneAppsManager que se trata de un fichero .sis para instalar en un dispotivo symbian que nos permitirá ejecutar estos Widgets en nuestros móviles symbian. Y por último, WidgetPacker, una aplicación que nos ayudará a crear nuestro Widget.

Una vez instalado Opera o VodafoneAppsManager (el que queramos para probar) instalamos WidgetPacker y comenzamos a desarrollar.
</p><p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetprincipal.jpg"></a><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgettemplatesjpg.png"><img src="http://www.anieto2k.com/wp-content/uploads/2009/04/widgettemplatesjpg-418x300.png" alt="widgettemplatesjpg" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgettemplatesjpg.png"><small>(Ver Imagen)</small></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetprincipal.jpg"><small></small></a>

Podemos optar por usar un template sobre el que trabajar, recomendable para las primeras pruebas, o crear uno nuevo. Entre los templates disponibles, tenemos la posibilidad de crear un widget sobre Twitter o sobre Fortune. Nosotros vamos a crear uno desde cero.
</p><p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetprincipal.jpg"><img src="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetprincipal-418x300.jpg" alt="widgetprincipal" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetprincipal.jpg"><small>(Ver Imagen)</small></a>

Para ello primero definiremos los datos que nos va solicitando la aplicación y que se encargará de generar el fichero config.xml que hemos comentado previamente.

<a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2009/04/widget.jpg"><img src="http://www.anieto2k.com/wp-content/uploads/2009/04/widget-272x300.jpg" alt="widget" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2009/04/widget.jpg"><small>(Ver Imagen)</small></a>

Este será el resultado del fichero XML de nuestro ejemplo:
<pre><code>&lt;widget id="widget2k" dockable="yes"&gt;
  &lt;widgetname&gt;Mi Primer Widget&lt;/widgetname&gt;
  &lt;description&gt;Widget de Prueba&lt;/description&gt;
  &lt;width&gt;320&lt;/width&gt;
  &lt;height&gt;240&lt;/height&gt;
  &lt;author&gt;
    &lt;name&gt;Andrés Nieto&lt;/name&gt;
    &lt;organization&gt;aNieto2k&lt;/organization&gt;
    &lt;link&gt;http://www.anieto2k.com&lt;/link&gt;
    &lt;email&gt;XXXX@gmail.com&lt;/email&gt;
  &lt;/author&gt;
  &lt;security&gt;
    &lt;access&gt;
      &lt;host&gt;www.anieto2k.com&lt;/host&gt;
    &lt;/access&gt;
  &lt;/security&gt;
&lt;/widget&gt;</code></pre>
Una vez generado, veremos una línea nueva en "Projects" en la que veremos nuestro nuevo Widget. Para acceder al código, bastará con hacer click sobre el botón derecho sobre él y seleccionar "Reveal in File Explorer...":
</p><p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetviewsource.jpg"><img src="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetviewsource-442x300.jpg" alt="widgetviewsource" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetviewsource.jpg"><small>(Ver Imagen)</small></a>

Al hacer esto nos encontraremos nuestro nuevo Widget, osea el corazón de lo que será nuestro Widget. ¿Muy familiar verdad?
</p><p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetsource.jpg"><img src="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetsource-600x160.jpg" alt="widgetsource" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetsource.jpg"><small>(Ver Imagen)</small></a>
<h3>El código</h3>
Para editar el código de nuestro Widget usaremos el editor que más rabia nos dé, en mi caso usaré Textmate, ya que su visión de proyectos me encanta.
</p><p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgettextmate.jpg"><img src="http://www.anieto2k.com/wp-content/uploads/2009/04/widgettextmate-567x300.jpg" alt="widgettextmate" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgettextmate.jpg"><small>(Ver Imagen)</small></a>
<h4>HTML</h4>
<pre><code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&gt;
  &lt;head&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;
    &lt;title&gt;Mi Primer Widget&lt;/title&gt;
    &lt;link rel="stylesheet" type="text/css" href="css/style.css"/&gt;

	&lt;script type="text/javascript" src="js/wmpkit.js"&gt;&lt;/script&gt;
	&lt;script type="text/javascript" src="js/json2.js"&gt;&lt;/script&gt;

    &lt;script type="text/javascript" src="js/script.js"&gt;&lt;/script&gt;

  &lt;/head&gt;
  &lt;body&gt;
	&lt;div id="page"&gt;
		&lt;div id="header"&gt;
			&lt;h1&gt;&lt;a href="http://www.anieto2k.com"&gt;aNieto2k&lt;/a&gt;&lt;/h1&gt;
		&lt;/div&gt;
		&lt;div id="content"&gt;&lt;!-- CONTENEDOR DE NOTICIAS --&gt;&lt;/div&gt;
		&lt;div id="footer"&gt;
			&lt;p&gt;
				Desarrollado por &lt;a href="http://www.anieto2k.com"&gt;aNieto2k&lt;/a&gt;
			&lt;/p&gt;
		&lt;/div&gt;
	&lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre>
Definimos una estructura, que podría ser tranquilamente una página HTML normal. En ella nos encontramos la cabezara (<code>#header</code>), el contenido (<code>#content</code>) y el pie de la página (<code>#footer</code>).
<h4>CSS</h4>
El CSS nos dará un poco de color al widget, para el ejemplo he sido bastante escueto, así que con unas líneas estará listo.
<pre><code>body {
  	font-family: Verdana, Helvetica, sans-serif;
  	font-size: 10px;
  	background-color: #184574;
}

a {
	color:#878826;
}
.post {
	background-color: #fff;
	margin: .5em;
	padding: -5em;
}</code></pre>
<h4>Javascript</h4>
Ahora vamos a rellenar el contenido con Javascript, lanzando una petición hacia aNieto2k para obtener los feeds en formato <code>JSON</code>. Para ello simplemente añadiremos este código en el lugar que el fichero <code>script.js</code> nos indica.
<pre><code><em>//
// insert init code here...
//
</em>var blogURL = "http://www.anieto2k.com/feed/json/";
var contentContainer = document.getElementById("content");

<strong>// Lanzamos la petición
</strong>wmpkit.xhrGet(blogURL,handleResponse);
<strong>/*
	Funcion que se encarga de crear un &lt;div /&gt;
	que contendrá la información del post.
*/</strong>
function createPost(post){
	var container = document.createElement("div");
		container.setAttribute("class", "post");

	var title = document.createElement("a");
		title.textContent = post.title;
		title.setAttribute("class", "user");
		title.setAttribute("href", post.link);
	container.appendChild(title);

	var content = document.createElement("div");
		content.textContent = post.description;
	container.appendChild(content);
	contentContainer.appendChild(container);
}

<strong>/*
	Callback que ejecutamos al recibir
	la respuesta del servidor
*/</strong>
function handleResponse(xhr) {
	  if(xhr.responseText) {
		  try {
	  		var posts = JSON.parse(xhr.responseText);
  			for (var c = 0;c &lt; posts.items.length;c ++) {
  				createPost(posts.items[c]);
  			}
  		} catch (e) {}
  	}
  };</code></pre>
<h3>Compilación</h3>
Por llamarlo de alguna manera, por que realmente se trata de una simple compresión en ZIP y un renombrado de extensión.
</p><p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetbuild.jpg"><img src="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetbuild-328x300.jpg" alt="widgetbuild" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetbuild.jpg"><small>(Ver Imagen)</small></a>

Con nuestro proyecto seleccionado pulsaremos sobre el botón "Build" y este nos mostrará una ventana con la información sobre el proceso.
</p><p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetwgt.jpg"><img src="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetwgt-600x131.jpg" alt="widgetwgt" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetwgt.jpg"><small>(Ver Imagen)</small></a>

Ahora ya encontramos el fichero <code>.wgt</code> en la carpeta dist/ de la estructura de nuestro Widget. Este fichero será el encargado de instalarse en el dispositivo móvil o en el navegador Opera. Para ello podemos optar por 2 aciones:
<ol>
	<li>Ejecutarlo en el navegador (Opera 9.64) mediante un simple doble-click en el fichero .wgt.</li>
	<li>O mediante el botón "Deploy" de la aplicación que se encargará de enviarnoslo directamente a nuestro movil mediante Bluetooth (es necesario tenerlo).</li>
</ol>
<h3>Resultado</h3>
Como resultado obtenemos u
El resultado es una pequeña aplicación web ejecutada en nuestro movil o navegador (este ejemplo es de Opera 9.64). Podeis<a href="http://www.anieto2k.com/files/MiPrimerWidget.wgt"> descargar el Widget</a> si quereis modificarlo o usarlo. Vosotros mismos :D
</p><p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetfinaljpg.png"><img src="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetfinaljpg.png" alt="widgetfinaljpg" /></a>
<a href="http://www.anieto2k.com/wp-content/uploads/2009/04/widgetfinaljpg.png"><small>(Ver Imagen)</small></a>
<h3 style="text-align: left;">Más información</h3>
<ol>
	<li><a href="http://dev.opera.com/articles/view/creating-t-mobile-widgets/">Creando widgets para T-Mobile</a></li>
	<li><a href="http://www.forum.nokia.com/Resources_and_Information/Documentation/Web_Technologies/Web_Runtime.xhtml">Widgets en Forum Nokia</a></li>
</ol></p><h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2006/03/30/wordpress-widgets/" rel="bookmark" title="Permanent Link: WordPress Widgets">WordPress Widgets</a></li><li><a href="http://www.anieto2k.com/2006/11/10/la-w3c-le-mete-mano-a-los-widgets/" rel="bookmark" title="Permanent Link: La W3C le mete mano a los Widgets">La W3C le mete mano a los Widgets</a></li><li><a href="http://www.anieto2k.com/2007/03/28/wordpress-dashboard-editor-widgets-en-tu-dashboard/" rel="bookmark" title="Permanent Link: WordPress Dashboard Editor, widgets en tu dashboard">WordPress Dashboard Editor, widgets en tu dashboard</a></li><li><a href="http://www.anieto2k.com/2006/07/11/increibles-tablas-zebra-seleccionables/" rel="bookmark" title="Permanent Link: Increibles tablas zebra seleccionables">Increibles tablas zebra seleccionables</a></li><li><a href="http://www.anieto2k.com/2006/04/28/widget-traductor/" rel="bookmark" title="Permanent Link: Widget traductor">Widget traductor</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.238"><img rel="38.107.179.238" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2009/04/22/introduccion-a-los-w3c-widgets/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>iCal Archive para WordPress</title>
		<link>http://www.anieto2k.com/2009/02/17/ical-archive-para-wordpress/</link>
		<comments>http://www.anieto2k.com/2009/02/17/ical-archive-para-wordpress/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 23:26:37 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[hacks]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[wordpress.hacks]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=7544</guid>
		<description><![CDATA[Ya podemos descargar iCal Archive para WordPress. Se trata de de una adaptación sobre WordPress del script que vimos hace unos días con el que podiamos crear un calendario al estilo iCal (del iPhone) con jQuery. Ver Demo Instalación Descargamos el ficheros Descomprimimos y colocamos el directorio completo en la raiz de WordPress. Modificamos el [...]]]></description>
			<content:encoded><![CDATA[Ya podemos descargar<strong> iCal Archive para WordPress</strong>. Se trata de de <a href="http://www.anieto2k.com/2009/02/16/anieto2k-ical-version/">una adaptación sobre WordPress</a> del script que vimos hace unos días con el que podiamos <a href="http://www.anieto2k.com/2009/02/14/crear-un-ical-estilo-iphone-con-jquery/">crear un calendario al estilo iCal (del iPhone) con jQuery</a>.
<p style="text-align: center;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2009/02/ical_archive_wordpress.jpg"><img src="http://www.anieto2k.com/wp-content/uploads/2009/02/ical_archive_wordpress-600x279.jpg" alt="ical_archive_wordpress" /></a></p>
<p style="text-align: center;"><a href="http://www.anieto2k.com/demo/iWordpress/">Ver Demo</a></p>

<h3>Instalación</h3>
<ol>
	<li>Descargamos el ficheros</li>
	<li>Descomprimimos y colocamos el directorio completo en la raiz de WordPress.</li>
	<li>Modificamos el HTML si queremos adaptarlo al diseño del blog.</li>
</ol>
<h3>Descargar</h3>
<a href="http://www.anieto2k.com/downloads/mirror.php?id=107">Versión 0.1</a><h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2009/02/16/anieto2k-ical-version/" rel="bookmark" title="Permanent Link: aNieto2k iCal Version">aNieto2k iCal Version</a></li><li><a href="http://www.anieto2k.com/2009/02/14/crear-un-ical-estilo-iphone-con-jquery/" rel="bookmark" title="Permanent Link: Crear un iCal (estilo iPhone) con jQuery">Crear un iCal (estilo iPhone) con jQuery</a></li><li><a href="http://www.anieto2k.com/2006/09/02/otra-vulnerabilidad-para-ie-daxctleocx/" rel="bookmark" title="Permanent Link: Otra vulnerabilidad para IE (daxctle.ocx)">Otra vulnerabilidad para IE (daxctle.ocx)</a></li><li><a href="http://www.anieto2k.com/2007/01/26/necesitas-alguna-version-concreta-de-wordpress/" rel="bookmark" title="Permanent Link: Necesitas alguna versión concreta de WordPress">Necesitas alguna versión concreta de WordPress</a></li><li><a href="http://www.anieto2k.com/2009/05/27/dhtmlxscheduler-create-tu-propio-google-calendar/" rel="bookmark" title="Permanent Link: dhtmlxScheduler, create tu propio Google Calendar">dhtmlxScheduler, create tu propio Google Calendar</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.238"><img rel="38.107.179.238" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2009/02/17/ical-archive-para-wordpress/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Ejecutar PHP en tus posts con shortcodes</title>
		<link>http://www.anieto2k.com/2009/02/04/ejecutar-php-en-tus-posts-con-shortcodes/</link>
		<comments>http://www.anieto2k.com/2009/02/04/ejecutar-php-en-tus-posts-con-shortcodes/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 10:25:30 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[hacks]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[wordpress.shortcode]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=7435</guid>
		<description><![CDATA[Hace unos minutos he publicado una entrada sobre los ShortCodes y la importante labor que pueden llegar a desempeñar en nuestros WordPress. Usando la API de ShortCodes he montado un pequeño script basado en execPHP que permite ejecutar PHP en nuestros posts mediante un sencillo shortcode. Código function eval_php($atts, $content=null) { ob_start(); eval($content); $output = [...]]]></description>
			<content:encoded><![CDATA[Hace unos minutos he publicado<a href="http://www.anieto2k.com/2009/02/04/usando-shortcodes-como-profesionales/"> una entrada sobre los ShortCodes</a> y la importante labor que pueden llegar a desempeñar en nuestros WordPress. Usando la <a href="http://codex.wordpress.org/Shortcode_API">API de ShortCodes</a> he montado un pequeño script basado en <a href="http://bluesome.net/post/2005/08/18/50/">execPHP</a> que permite ejecutar PHP en nuestros posts mediante un sencillo shortcode.
<h3>Código</h3>
<pre><code>function eval_php($atts, $content=null) {
        ob_start();
        eval($content);
        $output = ob_get_contents();
        ob_end_clean();
        return "Entro".$output;
}

add_shortcode("php", "eval_php");
<strong>// Forzamos el do_shortcode al principio</strong>
add_filter('the_content', 'do_shortcode', 1);</code></pre>
<h4>Modo de empleo</h4>
<pre>[php]Código PHP[/php]</pre>
Sin los tags de php <code>&lt;?php</code> ni <code>?&gt;</code>.
<h4>Ejemplo</h4>
<pre><code>[php]
	$str = "Hello {xx}";
	echo str_replace('{xx}', 'World!', $str);
[/php]</code></pre>
<h3>¿Donde pongo este código?</h3>
Puedes ponerlo en el fichero functions.php de tu theme o crear un plugin con el código.
<h3>¿Precauciones?</h3>
Hay que pensar que se está ejecutando código PHP desde los posts, si no eres el único usuario que postea debes tener esto en cuenta y quizas modificar el script. He montado 2 ejemplos para los más vagos :D
<h4>1. Limitando por ID de usuario</h4>
<pre>// ID's de usuarios permitidos
$users_avail = array(1,2,3,4);

function noPHP($data = null){
	global $current_user, $users_avail;
  	 get_currentuserinfo();

	if (in_array($current_user-&gt;ID, $users_avail)) return $data;
	$data["post_content"] = str_replace("[php]", "", str_replace("[/php]", "", $data["post_content"]));
	$data["post_content_filtered"] = str_replace("[php]", "", str_replace("[/php]", "", $data["post_content_filtered"]));
	return $data;
}

add_filter('wp_insert_post_data', 'noPHP');

function eval_php($atts, $content=null) {
	ob_start();
	eval($content);
	$output = ob_get_contents();
	ob_end_clean();
	return $output;
}

add_shortcode("php", "eval_php");

// Forzamos el do_shortcode al principio
add_filter('the_content', 'do_shortcode', 1);</pre>
<h4>2. Limitando por level mínimo</h4>
<pre>/<span>/ Level mínimo
$minlevel = 5;

function noPHP($data = null){
	global $current_user, $minlevel;
      get_currentuserinfo();

	if ($current_user-&gt;user_level &gt; $minlevel)
		return $data;

	$data["post_content"] = str_replace("[php]", "", str_replace("[/php]", "", $data["post_content"]));
	$data["post_content_filtered"] = str_replace("[php]", "", str_replace("[/php]", "", $data["post_content_filtered"]));
	return $data;
}

add_filter('wp_insert_post_data', 'noPHP');

function eval_php($atts, $content=null) {
	ob_start();
	eval($content);
	$output = ob_get_contents();
	ob_end_clean();
	return $output;
}

add_shortcode("php", "eval_php");

// Forzamos el do_shortcode al principio
add_filter('the_content', 'do_shortcode', 1);</span></pre>
Así y todo yo tendría cuidado con esto ya que mediante la ejecución de PHP en los posts, los autores, editores, ... pueden hacer desastres de magnitudes impredecibles...
<h3>Limitaciones</h3>
No he podido hacer muchas pruebas, así que es posible que surjan errores y quizas haya limitaciones en el código que ponemos, podríamos comentarlas.<h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2009/05/13/ocultar-contenido-a-los-usuarios-no-registrados/" rel="bookmark" title="Permanent Link: Ocultar contenido a los usuarios no registrados">Ocultar contenido a los usuarios no registrados</a></li><li><a href="http://www.anieto2k.com/2010/09/14/usando-shortcodes-en-nuestro-theme/" rel="bookmark" title="Permanent Link: Usando Shortcodes en nuestro theme">Usando Shortcodes en nuestro theme</a></li><li><a href="http://www.anieto2k.com/2006/08/06/ejecuta-php-en-tus-posts/" rel="bookmark" title="Permanent Link: Ejecuta PHP en tus posts">Ejecuta PHP en tus posts</a></li><li><a href="http://www.anieto2k.com/2009/02/04/usando-shortcodes-como-profesionales/" rel="bookmark" title="Permanent Link: Usando Shortcodes como profesionales">Usando Shortcodes como profesionales</a></li><li><a href="http://www.anieto2k.com/2008/03/31/shortcode-api-otra-novedad-de-wordpress-25/" rel="bookmark" title="Permanent Link: ShortCode API, otra novedad de WordPress 2.5">ShortCode API, otra novedad de WordPress 2.5</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.238"><img rel="38.107.179.238" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2009/02/04/ejecutar-php-en-tus-posts-con-shortcodes/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Divide formularios en pasos con jQuery</title>
		<link>http://www.anieto2k.com/2009/01/28/divide-formularios-en-pasos-con-jquery/</link>
		<comments>http://www.anieto2k.com/2009/01/28/divide-formularios-en-pasos-con-jquery/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 14:02:31 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[estandares]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[usabilidad]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=7384</guid>
		<description><![CDATA[Revisando los posts del foro, en un rato que he tenido, me he encontrado babySteps, un plugin que hans me muestra y que se encarga de dividir formularios en partes. Un componente ideal para formularios rápidos y complicados. Revisando el plugin he visto que tu defines los puntos de corte y eso no me acaba [...]]]></description>
			<content:encoded><![CDATA[Revisando <a href="http://www.anieto2k.com/foro/">los posts del foro</a>, en un rato que he tenido, me he encontrado <a href="http://blog.vokle.com/index.php/2008/08/22/babysteps/">babySteps</a>, un plugin que <a href="http://www.anieto2k.com/foro/topic/jquery-plugin-babysteps?q=jquery-plugin-babysteps">hans me muestra</a> y que se encarga de dividir formularios en partes. Un componente ideal para formularios rápidos y complicados.

Revisando el plugin he visto que tu defines los puntos de corte y eso no me acaba de gustar, el tener que poner elementos que no tendrían ningún sentido si no fuera por el plugin no me ha gustado mucho. Así que me montado un pequeño script, que usando <code>jQuery</code>, nos permite obtener lo mismo siguiendo un poco más la semántica del HTML.
<h3>stepForm()</h3>
Simplemente es una función que se encarga de convertir todos los formularios cuyo atributo <code>class </code>sea <code>stepMe</code>. Únicamente se encarga de cortar el formulario por elementos <code>&lt;fieldset /&gt;</code> haciendo que un formulario largo aparente ser varios de menor tamaño.

Veamos un <a href="http://www.anieto2k.com/demo/stepForm/">ejemplo que he montado</a>.
<pre><code>&lt;form action="" method="post" class="stepMe"&gt;
	&lt;fieldset&gt;
		&lt;label for="name"&gt;Nombre:&lt;/label&gt;
		&lt;input name="nombre" id="name" value="" /&gt;
		&lt;label for="surname"&gt;Apellidos:&lt;/label&gt;
		&lt;input name="apellidos" id="surname" value="" /&gt;
		&lt;label for="birthday"&gt;Fecha de Nacimiento:&lt;/label&gt;
		&lt;input name="fnac" id="birthday" value="" /&gt;
	&lt;/fieldset&gt;
	&lt;fieldset&gt;
		&lt;label for="text1"&gt;Text1:&lt;/label&gt;
		&lt;select id="text1"&gt;
			&lt;option&gt;1&lt;/option&gt;
			&lt;option&gt;1&lt;/option&gt;
			&lt;option&gt;1&lt;/option&gt;
			&lt;option&gt;1&lt;/option&gt;
			&lt;option&gt;1&lt;/option&gt;
		&lt;/select&gt;
		&lt;label for="text2"&gt;Text2: &lt;/label&gt;
			&lt;input type="radio" id="text2" /&gt;
	&lt;/fieldset&gt;
	&lt;fieldset&gt;
		&lt;label for="submit"&gt;Submitar datos &lt;/label&gt;
		&lt;input type="submit" id="submit" value="Enviar" /&gt;
	&lt;/fieldset&gt;
&lt;/form&gt;</code></pre>
Este ejemplo nos divide la página en 3 pasos. Para permitir al usuario moverse entre los pasos he añadido un enlace "<em>Volver</em>" y otro "<em>Seguir</em>", pero no descarto añadir una pequeña paginación esta noche :D
<h3>Personalización</h3>
Podemos definir nuestro propio estilo para los enlaces que se añaden mediante el uso CSS de las clases <code>.nextStep</code> y <code>.backStep</code>.

Además, podemos definir el texto que queremos mostrar en ambos enlaces pasándolo como parámetro. Disponemos de 3 parámetros:
<ol>
	<li>Texto Back. (por defecto Volver)</li>
	<li>Texto Next. (por defecto Seguir)</li>
	<li>Contenedor. (por defecto fieldset)</li>
</ol>
<pre><code>$.stepForm();
<strong>// Volver / Seguir [fieldset] </strong>

$.stepForm('Back','Next');
<strong>// Back / Next [fieldset]</strong>

$.stepForm('&lt;-','-&gt;', 'p');
<strong>// Volver / Seguir [p]</strong></code></pre>
Si somos reacios a usar <code>&lt;fieldset /&gt;</code> podemos pasar como 3er parámetro el tag que vamos a usar como contenedor.
<h3>Código</h3>
<pre><code>jQuery.extend({
    stepForm: function(txtBack, txtNext, token){
    	var fieldsets = $((token || 'fieldset'), $("form.stepMe"));
        var total = $(fieldsets).length;
	$(fieldsets).each(function(x,el){
			    if (x &gt; 0) {
			      $(el).hide();
			      $(el).append('&lt;a class="backStep" href="#x_' + (x-1) + '"&gt;'+ (txtBack || 'Volver') +'&lt;/a&gt;');
			      $(".backStep", $(el)).bind("click", function(){
			                $("#x_" + (x - 1)).show();
			                $(el).hide();
			       });
			    }

			    if ((x+1)&lt; total) {
			        $(el).append('&lt;a class="nextStep" href="#_' + (x+1) + '"&gt;'+(txtNext || 'Seguir')+'&lt;/a&gt;');
			        $(".nextStep", $(el)).bind("click", function(){
			                $("#x_" + (x + 1)).show();
			                $(el).hide();
			        });
			    }
			    $(el).attr("id", "x_" + x);
	});
    }
});</code></pre>
<h3>Actualización</h3>

<a href="http://p0l0.binware.org/">Marco Neumann</a>  ha portado<a href="http://p0l0.binware.org/index.php/2009/01/29/moostepform/"> el script a MooTools para los usuarios de este framework</a>. La verdad es que la claridad del código no tiene comparación.<h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2008/10/21/mootools-formcheck-validador-de-formularios-con-mootoos/" rel="bookmark" title="Permanent Link: MooTools FormCheck, validador de formularios con MooToos">MooTools FormCheck, validador de formularios con MooToos</a></li><li><a href="http://www.anieto2k.com/2007/07/26/mejora-la-presentacion-de-los-formularios-con-jlook-y-jquery/" rel="bookmark" title="Permanent Link: Mejora la presentación de los formularios con jLook y jQuery">Mejora la presentación de los formularios con jLook y jQuery</a></li><li><a href="http://www.anieto2k.com/2009/09/07/vanadiumjs-validacion-de-formularios-en-el-cliente/" rel="bookmark" title="Permanent Link: VanadiumJS, validación de formularios en el cliente">VanadiumJS, validación de formularios en el cliente</a></li><li><a href="http://www.anieto2k.com/2009/02/12/validar-formularios-con-javascript/" rel="bookmark" title="Permanent Link: Validar formularios con Javascript">Validar formularios con Javascript</a></li><li><a href="http://www.anieto2k.com/2006/11/13/soluciones-modernas-a-los-formularios-20/" rel="bookmark" title="Permanent Link: Soluciones modernas a los formularios 2.0">Soluciones modernas a los formularios 2.0</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.238"><img rel="38.107.179.238" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2009/01/28/divide-formularios-en-pasos-con-jquery/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>@webdev2k, el microblog del desarrollo web</title>
		<link>http://www.anieto2k.com/2009/01/26/webdev2k-el-microblog-del-desarrollo-web/</link>
		<comments>http://www.anieto2k.com/2009/01/26/webdev2k-el-microblog-del-desarrollo-web/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 13:53:38 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[estandares]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[anieto2k]]></category>
		<category><![CDATA[desarrollo.web]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=7353</guid>
		<description><![CDATA[Usando Twitter y este artículo de ThinkVitamin, no ha sido muy complicado montar un microplanet de microposts sobre desarrollo web. Por ese motivo ha nacido @webdev2k, un lugar donde encontrar las últimas herramientas, artículos y/o publicaciones sobre desarrollo web en tiempo real. ¿Como funciona? Simplemente hay que añadir @webdev2k en tu tweet (micropost) en Twitter [...]]]></description>
			<content:encoded><![CDATA[Usando <a href="http://twitter.com/home">Twitte</a>r y este <a href="http://thinkvitamin.com/features/how-to-create-an-rss-enabled-micro-blog-with-twitter/">artículo de ThinkVitamin</a>, no ha sido muy complicado montar un microplanet de microposts sobre desarrollo web. Por ese motivo ha nacido @<a href="http://www.anieto2k.com/webdev2k/">webdev2k</a>, un lugar donde encontrar las últimas herramientas, artículos y/o publicaciones sobre desarrollo web en tiempo real.
<h3>¿Como funciona?</h3>
<p style="text-align: center;"><span style="color: #0000ee; text-decoration: underline;"><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2009/01/webdev2k.jpg"></a><a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2009/01/webdev2k1.jpg"><img src="http://www.anieto2k.com/wp-content/uploads/2009/01/webdev2k1-600x175.jpg" alt="webdev2k1" /></a></span></p>

Simplemente hay que añadir @webdev2k en tu tweet (micropost) en Twitter y automáticamente aparecerá en la aplicación. Como podemos ver en la imagen.
<h3>¿Para que sirve?</h3>
Principalmente para agrupar todo lo relacionado con el desarrollo web y promocionar tus aplicaciones, posts o artículos relacionados con el mundo web.
<h2 style="text-align: center;"><a href="http://www.anieto2k.com/webdev2k/">Visita @webdev2k</a></h2>
Para los que quieran seguirlo desde Twitter, podeis seguirlo como a otro usuario más.
<h2 style="text-align: center;"><a href="http://twitter.com/webdev2k">@webdev2k en Twitter</a></h2><h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2006/12/18/listado-de-herramientas-para-desarrollo-web/" rel="bookmark" title="Permanent Link: Listado de herramientas para desarrollo web">Listado de herramientas para desarrollo web</a></li><li><a href="http://www.anieto2k.com/2006/07/18/proceso-del-desarrollo-de-una-aplicacion-informatica/" rel="bookmark" title="Permanent Link: Proceso del desarrollo de una aplicación informática">Proceso del desarrollo de una aplicación informática</a></li><li><a href="http://www.anieto2k.com/2006/05/14/alonso-lo-consiguio-en-montmelo/" rel="bookmark" title="Permanent Link: Alonso, lo consiguió en Montmeló">Alonso, lo consiguió en Montmeló</a></li><li><a href="http://www.anieto2k.com/2006/09/04/qcodo-framework-de-desarrollo-en-php/" rel="bookmark" title="Permanent Link: Qcodo, Framework de desarrollo en PHP">Qcodo, Framework de desarrollo en PHP</a></li><li><a href="http://www.anieto2k.com/wpcommentfeed/" rel="bookmark" title="Permanent Link: commentFeed">commentFeed</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.238"><img rel="38.107.179.238" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2009/01/26/webdev2k-el-microblog-del-desarrollo-web/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>jsCron, portando Cron a Javascript</title>
		<link>http://www.anieto2k.com/2009/01/05/jscron-portando-cron-a-javascript/</link>
		<comments>http://www.anieto2k.com/2009/01/05/jscron-portando-cron-a-javascript/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 17:05:07 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[estandares]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=7243</guid>
		<description><![CDATA[En un momento de aburrimiento he estado implementado una versión de Cron para Javascript. Para los que no lo sepan, Cron es una utilidad del sistema Unix que permite programar tareas a lo largo del tiempo. Una de las utilidades más usadas para tareas como copias de seguridad, envío de mails, ... Para Javascript he [...]]]></description>
			<content:encoded><![CDATA[En un momento de aburrimiento he estado implementado <strong>una versión de Cron para Javascript</strong>. Para los que no lo sepan, <a href="http://es.wikipedia.org/wiki/Cron_(unix)">Cron es una utilidad del sistema Unix </a>que permite programar tareas a lo largo del tiempo. Una de las utilidades más usadas para tareas como copias de seguridad, envío de mails, ...

Para Javascript he pensado que sería interesante usar la misma estructura cron usa en <a href="http://dns.bdat.net/documentos/cron/x50.html">el fichero crontab</a>, donde se almacena la lista de tareas programadas.
<pre><code>35 17 * * * hola()</code></pre>
Hagamos un pequeño repaso a los parámetros de Cron (por orden):
<ol>
	<li>minuto [0-59]</li>
	<li>hora [0-23]</li>
	<li>dia del mes [0-31]</li>
	<li>mes [0-12]</li>
	<li>dia semana [0-7]</li>
	<li>ejecutable</li>
</ol>
Los <code>*</code> indican cualquier, por lo tanto en el ejemplo anterior indicamos que <em>cada día a las 17:35</em> se ejecutará el script <code>hola()</code>.
<h4 style="text-align: center;">La hora especificada será la del navegador del usuario</h4>
Veamos unos ejemplos más:
<pre><code>* 16 * * * hola(</code>)</pre>
<em>Cada día desde las 16:00 a las 16:59 se ejecutará <code>hola()</code>.</em>
<pre>30 6 1 * * showHola()</pre>
<em>Ejecutamos <code>showHola(</code>) el día 1 de cada mes a las 6:30 de la mañana.</em>

Se trata de un sistema bastante rudimentario, pero funciona y aunque operadores como (<strong>/2</strong>) no están contemplados, dan mucho juego.
<h3>Codigo</h3>
<pre><code>v</code><code>ar jsCron = {
		items:[],
		interval: null,
		parse: function(strUnix) {
				return strUnix.match(/^(\d+|\*) (\d+|\*) (\d+|\*) (\d+|\*) (\d|\*) +(\w+)/);
		},
		check: function() {
				var hoy = new Date();
				var test = [new Date(), hoy.getMinutes(), hoy.getHours(), hoy.getDate(), hoy.getMonth(), hoy.getDay()];

				for (var i in this.items) {
					var exec = 0;
					var t = this.parse(this.items[i][1]);
					for (var x in t)
				    if (t[x] &amp;&amp; (t[x] == test[x] || t[x] == "*"))exec++;
					if (exec == 5 &amp;&amp; this.items[i][0] == 0) {
							eval(t[6]).call();
							this.items[i][0] = 1;
					} else if (exec &lt; 5 &amp;&amp; this.items[i][0] == 1) {
						this.items[i][0] = 0;
					}
				}
		},
		set: function(strUnix) {
			if (!/^(\d+|\*) (\d+|\*) (\d+|\*) (\d+|\*) (\d|\*) +(\w+)/.test(strUnix)) return new Error("Formato invalido");
			this.items.push([0, strUnix]);
		},
		init: function(seg) {
			var seg = seg || 1000;
			this.interval = setInterval("jsCron.check()", seg);
		}
};
jsCron.init();
</code></pre>
<h3>Modo de uso</h3>
Al igual que de un crontab debemos especificar un listado de tareas a programar, para ello usaremos el método <code>set()</code> e introduciremos la sentencia en el formato explicado anteriormente.
<pre><code><strong>// Función hola();</strong>
function hola() {
   alert("Hola");
}

<strong>// Tarea programada</strong>
jsCron.set("35 17 * * * hola()");</code></pre>
<a href="http://www.anieto2k.com/demo/jscron/jscron.js">Descargar Fichero JS (jscron)</a>
<h4>Actualización</h4>
<a href="http://ajaxian.com/archives/jscron#comments">Un comentario de Ajaxian</a>, me ha dado una solución al usar un <code>eval()</code> para ejecutar el código. Así podemos usarlo de una forma más cómoda sin perder la legibilidad de la función.
<pre>// Tarea programada
jsCron.set("35 17 * * *", hola())
// de forma inline
jsCron.set("35 17 * * *", function() {
   alert("Hola");
});</pre><h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2011/09/04/twitterweek-2011-09-04-2/" rel="bookmark" title="Permanent Link: TwitterWeek &#8211; 2011-09-04">TwitterWeek &#8211; 2011-09-04</a></li><li><a href="http://www.anieto2k.com/2009/12/25/lo-mejor-del-blog-en-2009/" rel="bookmark" title="Permanent Link: Lo mejor del blog en 2009">Lo mejor del blog en 2009</a></li><li><a href="http://www.anieto2k.com/2007/09/15/portando-sprintf-a-javascript/" rel="bookmark" title="Permanent Link: Portando sprintf() a Javascript">Portando sprintf() a Javascript</a></li><li><a href="http://www.anieto2k.com/2007/09/27/google-reader-tambien-formato-iphoneipod-touch/" rel="bookmark" title="Permanent Link: Google Reader, tambien formato iPhone/iPod Touch">Google Reader, tambien formato iPhone/iPod Touch</a></li><li><a href="http://www.anieto2k.com/2009/07/06/enviate-copias-de-seguridad-de-tu-base-de-datos-a-tu-email/" rel="bookmark" title="Permanent Link: Enviate copias de seguridad de tu base de datos a tu email">Enviate copias de seguridad de tu base de datos a tu email</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.238"><img rel="38.107.179.238" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2009/01/05/jscron-portando-cron-a-javascript/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
	</channel>
</rss>

