<?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>Dandel</title>
	<atom:link href="http://dandel.es/feed" rel="self" type="application/rss+xml" />
	<link>http://dandel.es</link>
	<description>Dandel</description>
	<lastBuildDate>Sun, 22 Jan 2012 10:47:54 +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>ZeroBundle: Recursos gratuitos para diseñadores</title>
		<link>http://dandel.es/zerobundle-recursos-gratuitos-para-disenadores</link>
		<comments>http://dandel.es/zerobundle-recursos-gratuitos-para-disenadores#comments</comments>
		<pubDate>Sun, 22 Jan 2012 10:47:54 +0000</pubDate>
		<dc:creator>dandel</dc:creator>
				<category><![CDATA[Recursos]]></category>
		<category><![CDATA[Diseño web]]></category>

		<guid isPermaLink="false">http://dandel.es/?p=17811</guid>
		<description><![CDATA[Zero Bundle es un pack de recursos gratuitos para diseñadores que está disponible para descarga por tiempo limitado. Creado por la gente de Webdesigner Depot y Mighty Deals, ofrece un conjunto de recursos para uso tanto personal como profesional y 100% &#8230; <a href="http://dandel.es/zerobundle-recursos-gratuitos-para-disenadores">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://dandel.es/wp-content/uploads/2012/01/zero_bundle1.jpg"><img class="aligncenter size-full wp-image-17815" title="Zero Bundle" src="http://dandel.es/wp-content/uploads/2012/01/zero_bundle1.jpg" alt="Zero Bundle" width="600" height="237" /></a></p>
<p><strong>Zero Bundle</strong> es un pack de recursos gratuitos para diseñadores que está disponible para descarga por tiempo limitado. Creado por la gente de <strong><a title="Webdesigner Depot" href="http://www.webdesignerdepot.com/">Webdesigner Depot</a> </strong>y <a title="Mighty Deals" href="http://www.mightydeals.com/"><strong>Mighty Deals</strong></a>, ofrece un conjunto de recursos para uso tanto personal como profesional y 100% gratuitos. Iconos, plantillas de Photoshop, imágenes vectoriales, pinceles, texturas&#8230; entre otros.</p>
<p>Se puede descargar hasta finales de febrero así que&#8230; ¡Corred, insensatos!</p>
<p>Enlace: <a title="Zero Bundle" href="http://www.zerobundle.com/">Zero Bundle</a></p>
]]></content:encoded>
			<wfw:commentRss>http://dandel.es/zerobundle-recursos-gratuitos-para-disenadores/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Singleton y Lazy Loading en .NET 4</title>
		<link>http://dandel.es/singleton-y-lazy-loading-en-net-4</link>
		<comments>http://dandel.es/singleton-y-lazy-loading-en-net-4#comments</comments>
		<pubDate>Sun, 22 Jan 2012 10:15:46 +0000</pubDate>
		<dc:creator>dandel</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://dandel.es/?p=17793</guid>
		<description><![CDATA[Hace tiempo me construí una clase Logger a partir de la de un compañero, añadiendo un par de detalles para adaptarla a mis necesidades. Es una clase muy útil para procesos que se ejecutan en consola o servicios de Windows &#8230; <a href="http://dandel.es/singleton-y-lazy-loading-en-net-4">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://dandel.es/wp-content/uploads/2012/01/lazy_loading1.jpg"><img class="aligncenter size-full wp-image-17818" title="Singleton y Lazy Loading en .NET 4" src="http://dandel.es/wp-content/uploads/2012/01/lazy_loading1.jpg" alt="Singleton y Lazy Loading en .NET 4" width="600" height="340" /></a>Hace tiempo me construí una clase Logger a partir de la de un compañero, añadiendo un par de detalles para adaptarla a mis necesidades. Es una clase muy útil para procesos que se ejecutan en consola o servicios de Windows o WCF. Se instancia de forma estática utilizando el <a title="Patrón de diseño Singleton" href="http://msdn.microsoft.com/en-us/library/ff650316.aspx">patrón Singleton</a>, de modo que cualquier proceso de la aplicación puede acceder a ella y escribir tanto en consola como en un archivo de texto lo que vamos haciendo. Llevo ya bastante tiempo usándola y nunca me ha dado problemas.</p>
<p>Pero el otro día otro compañero que la está utilizando me planteó una duda: le daba la sensación de que la clase estaba ralentizando la ejecución de su aplicación, la cual utilizaba varios subprocesos para realizar ejecuciones bastante costosas. Yo le comenté que había utilizado mi Logger con aplicaciones que también usaba múltiples hilos e incluso con la <a title="Task Parallel Library" href="http://msdn.microsoft.com/es-es/library/dd460717.aspx">Task Parallel Library</a> de .NET 4 y nunca había notado nada raro.</p>
<p>Aún así, me quedó la duda: <strong>¿Es totalmente thread-safe una clase declarada mediante el patrón Singleton?</strong></p>
<p>La respuesta, tras consultar un foro de debate en LinkedIn y un par de blogs, es que&#8230; ¿lo adivináis? Depende de vuestra implementación <img src='http://dandel.es/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Veámoslo en detalle.</p>
<p><span id="more-17793"></span></p>
<h2>Primera aproximación: El patrón Singleton</h2>
<p>Doy por hecho que conoceréis el patrón singleton, ya que es una de los primeros conceptos que se aprenden cuando empiezas a programar. Pero para refrescar la memoria, consiste en diseñar la implementación de una clase para que se cree una única instancia de la misma en toda la aplicación. Aunque <a title="Singleton anti pattern" href="http://accu.org/index.php/journals/337">hay quien lo llega a considerar un <strong>anti patrón</strong></a> por el hecho de depender del uso de métodos y propiedades estáticas y dificultar el <em>unit testing</em>, yo pienso que puede ser muy útil en ciertos casos, siempre que no se abuse de él. Mi clase <strong>Logger</strong> puede ser un ejemplo perfecto, ya que aseguramos que solamente hay un objeto en toda la aplicación que utiliza un recurso de disco: el archivo de texto en el que se imprime el log.</p>
<p>¿El problema de Singleton? Que no es Thread Safe. Un ejemplo de una <strong>mala implementación</strong> del patrón Singleton sería la siguiente:</p>
<div id="wpshdo_1" class="wp-synhighlighter-outer"><div id="wpshdt_1" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_1"></a><a id="wpshat_1" class="wp-synhighlighter-title" href="#codesyntax_1"  onClick="javascript:wpsh_toggleBlock(1)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_1" onClick="javascript:wpsh_code(1)" title="Show code only"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_1" onClick="javascript:wpsh_print(1)" title="Print code"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://dandel.es/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_1" class="wp-synhighlighter-inner" style="display: block;"><pre class="csharp" style="font-family:monospace;"><span class="co1">// Mala implementación!!!</span>
<span class="kw1">public</span> <span class="kw1">sealed</span> <span class="kw4">class</span> MiClase
<span class="br0">&#123;</span>
    <span class="kw1">private</span> <span class="kw1">static</span> MiClase instance<span class="sy0">=</span>null<span class="sy0">;</span>
&nbsp;
    <span class="kw1">private</span> MiClase<span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw1">public</span> <span class="kw1">static</span> MiClase Instance
    <span class="br0">&#123;</span>
        get
        <span class="br0">&#123;</span>
            <span class="kw1">if</span> <span class="br0">&#40;</span>instance<span class="sy0">==</span><span class="kw1">null</span><span class="br0">&#41;</span>
            <span class="br0">&#123;</span>
                instance <span class="sy0">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> MiClase<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
            <span class="kw1">return</span> instance<span class="sy0">;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>&nbsp;</p>
<p>En el ejemplo anterior, no es <em>thread safe</em>, ya que dos procesos de la aplicación podrían evaluar al mismo tiempo que (instance == null) = true y generar una nueva instancia de MiClase.</p>
<h2>Segunda aproximación: uso de bloqueos (lock)</h2>
<p>Si el problema es la concurrencia, lo primero que nos viene a la cabeza es utilizar un <em>lock</em> (bloqueo) para proteger el código que genera la instancia del Singleton (o de cualquiera de sus métodos). El lock asegura una barrera de memoria, de forma que solo un proceso puede ejecutar esa porción de código al mismo tiempo hasta que se libera.</p>
<div id="wpshdo_2" class="wp-synhighlighter-outer"><div id="wpshdt_2" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_2"></a><a id="wpshat_2" class="wp-synhighlighter-title" href="#codesyntax_2"  onClick="javascript:wpsh_toggleBlock(2)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_2" onClick="javascript:wpsh_code(2)" title="Show code only"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_2" onClick="javascript:wpsh_print(2)" title="Print code"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://dandel.es/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_2" class="wp-synhighlighter-inner" style="display: block;"><pre class="csharp" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">sealed</span> <span class="kw4">class</span> MiClase
<span class="br0">&#123;</span>
    <span class="kw1">private</span> <span class="kw1">static</span> MiClase instance <span class="sy0">=</span> null<span class="sy0">;</span>
    <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">readonly</span> <span class="kw4">object</span> padlock <span class="sy0">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> <span class="kw4">object</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    MiClase<span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw1">public</span> <span class="kw1">static</span> MiClase Instance
    <span class="br0">&#123;</span>
        get
        <span class="br0">&#123;</span>
            <span class="kw1">lock</span> <span class="br0">&#40;</span>padlock<span class="br0">&#41;</span>
            <span class="br0">&#123;</span>
                <span class="kw1">if</span> <span class="br0">&#40;</span>instance <span class="sy0">==</span> <span class="kw1">null</span><span class="br0">&#41;</span>
                <span class="br0">&#123;</span>
                    instance <span class="sy0">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> MiClase<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                <span class="br0">&#125;</span>
                <span class="kw1">return</span> instance<span class="sy0">;</span>
            <span class="br0">&#125;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>La implementación anterior soluciona el problema a medias, ya que genera otros nuevos. Si os fijáis, una clase externa que quiera instanciar MiClase, lo haría así:</p>
<div id="wpshdo_3" class="wp-synhighlighter-outer"><div id="wpshdt_3" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_3"></a><a id="wpshat_3" class="wp-synhighlighter-title" href="#codesyntax_3"  onClick="javascript:wpsh_toggleBlock(3)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_3" onClick="javascript:wpsh_code(3)" title="Show code only"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_3" onClick="javascript:wpsh_print(3)" title="Print code"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://dandel.es/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_3" class="wp-synhighlighter-inner" style="display: block;"><pre class="csharp" style="font-family:monospace;">MiClase.<span class="me1">Instance</span><span class="sy0">;</span></pre></div></div>
<p>De forma que cada vez que se accede a la propiedad Instance se produce un bloqueo. Y los bloqueos son peligrosos, ya que pueden dejar &#8220;frita&#8221; nuestra aplicación dependiendo del código que tengan que ejecutar. Así que no es una mala solución en la mayoría de los casos, pero prefiero la siguiente.</p>
<h2>Tercera aproximación: ¡Fuera bloqueos!</h2>
<p>En C# un constructor estático cuando se crea una instancia de la clase o uno de sus miembros estáticos es referenciado, y se ejecuta una sola vez por dominio de aplicación (AppDomain). Dicho esto, con la siguiente implementación aseguramos que la instancia de MiClase se ejecutará una vez pase lo que pase, sin tener que recurrir a comprobaciones o a bloqueos y optimizando al máximo el rendimiento.</p>
<div id="wpshdo_4" class="wp-synhighlighter-outer"><div id="wpshdt_4" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_4"></a><a id="wpshat_4" class="wp-synhighlighter-title" href="#codesyntax_4"  onClick="javascript:wpsh_toggleBlock(4)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_4" onClick="javascript:wpsh_code(4)" title="Show code only"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_4" onClick="javascript:wpsh_print(4)" title="Print code"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://dandel.es/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_4" class="wp-synhighlighter-inner" style="display: block;"><pre class="csharp" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">sealed</span> <span class="kw4">class</span> MiClase
<span class="br0">&#123;</span>
    <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">readonly</span> MiClase instance <span class="sy0">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> MiClase<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="kw1">static</span> MiClase<span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw1">private</span> MiClase<span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw1">public</span> <span class="kw1">static</span> MiClase Instance
    <span class="br0">&#123;</span>
        get
        <span class="br0">&#123;</span>
            <span class="kw1">return</span> instance<span class="sy0">;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>
<h2>Cuarta aproximación: ¡Ponte al día y usa Lazy Loading de .NET 4!</h2>
<p>Si los ejemplos anteriores eran bastante estándar e incluso independientes del lenguaje, este es solo para programadores de .NET 4. Pero como es mi caso&#8230; ya podéis adivinar que esta última solución es mi preferida. Siempre digo que cuando Microsoft inventa algo, no hay por qué complicarse matando moscas a cañonazos.</p>
<p>A partir de la versión 4 del <em>framework</em> se nos ha incluído la clase <a title="System Lazy (Of T)" href="http://msdn.microsoft.com/en-us/library/dd642331.aspx">System.Lazy&lt;T&gt;</a>, con la que podemos construir de forma &#8220;perezosa&#8221; y completamente <em>thread-safe</em> un objeto de tipo T.</p>
<div id="wpshdo_5" class="wp-synhighlighter-outer"><div id="wpshdt_5" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_5"></a><a id="wpshat_5" class="wp-synhighlighter-title" href="#codesyntax_5"  onClick="javascript:wpsh_toggleBlock(5)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_5" onClick="javascript:wpsh_code(5)" title="Show code only"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_5" onClick="javascript:wpsh_print(5)" title="Print code"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://dandel.es/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_5" class="wp-synhighlighter-inner" style="display: block;"><pre class="csharp" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">sealed</span> <span class="kw4">class</span> MiClase
<span class="br0">&#123;</span>
    <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">readonly</span> Lazy<span class="sy0">&lt;</span>MiClase<span class="sy0">&gt;</span> lazy <span class="sy0">=</span>
        <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> Lazy<span class="sy0">&lt;</span>MiClase<span class="sy0">&gt;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">=&gt;</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> MiClase<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="kw1">public</span> <span class="kw1">static</span> MiClase Instance <span class="br0">&#123;</span> get <span class="br0">&#123;</span> <span class="kw1">return</span> lazy.<span class="me1">Value</span><span class="sy0">;</span> <span class="br0">&#125;</span> <span class="br0">&#125;</span>
&nbsp;
    <span class="kw1">private</span> MiClase<span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>El constructor requiere un <em>delegate</em> para construir el objeto de tipo MiClase, algo que se soluciona en una línea con una simple <em>lambda expression</em>. La solución no utiliza bloqueos y asegura no solo una única instancia, sino también una &#8220;carga perezosa&#8221;, que es otro de los motivos por los que alguien querría utilizar un Singleton. Además, tiene varias propiedades y métodos muy útiles para gestionar la instancia, como</p>
<ul>
<li>IsValueCreated, que nos dice si el tipo está inicializado</li>
<li>Value, que nos devuelve la instancia de tipo T</li>
<li>Finalize() que ejecuta la instrucción Finalize() del <em>IDisposable</em> y libera recursos de memoria</li>
<li>Y otros que podéis consultar en la especificación (<a title="System.Lazy(Of T)" href="http://msdn.microsoft.com/en-us/library/dd642331.aspx">ver</a>)</li>
</ul>
<p>En mi opinión, este último ejemplo es óptimo en cuanto a claridad del código y rendimiento.</p>
<h2>Conclusión</h2>
<p>Espero que os haya sido útil el artículo y que no le perdáis el miedo a los Singleton, muy denostados últimamente. Como siempre, si tenéis alguna sugerencia para mejorar el código, los comentarios son bienvenidos <img src='http://dandel.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://dandel.es/singleton-y-lazy-loading-en-net-4/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manipular XML en .NET</title>
		<link>http://dandel.es/manipular-xml-en-net</link>
		<comments>http://dandel.es/manipular-xml-en-net#comments</comments>
		<pubDate>Sat, 29 Oct 2011 15:28:37 +0000</pubDate>
		<dc:creator>dandel</dc:creator>
				<category><![CDATA[Trucos]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[linq]]></category>

		<guid isPermaLink="false">http://dandel.es/?p=232</guid>
		<description><![CDATA[Hace poco tuve que manipular los resultados de una consulta FOR XML de SQL server. La query que me venía de base de datos contenía un campo con una sub-select que se imprimía en un string xml. Dependiendo de unas &#8230; <a href="http://dandel.es/manipular-xml-en-net">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hace poco tuve que manipular los resultados de una consulta <a title="Transact-SQL FOR XML" href="http://msdn.microsoft.com/en-us/library/ms345137(v=sql.90).aspx">FOR XML</a> de SQL server. La query que me venía de base de datos contenía un campo con una sub-select que se imprimía en un string xml.</p>
<p>Dependiendo de unas restricciones de seguridad, para ciertos registros se tenían que eliminar algunos de los nodos del XML. Eso me obligaba a trasladar lógica de negocio a base de datos o bien tratar de aprovechar la potencia del framework .NET y <a href="http://msdn.microsoft.com/es-es/library/bb387061(v=VS.90).aspx">Linq to XML</a>.</p>
<p><span id="more-17772"></span></p>
<p>Imaginemos que tenemos un string XML con los datos de contactos de clientes y que, en función de los permisos del usuario, no se permite mostrar el teléfono o la dirección de correo electrónico, por ejemplo. El campo XML que nos devolvería la base de datos para un cliente tendría una estructura de este tipo:</p>
<div id="wpshdo_6" class="wp-synhighlighter-outer"><div id="wpshdt_6" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_6"></a><a id="wpshat_6" class="wp-synhighlighter-title" href="#codesyntax_6"  onClick="javascript:wpsh_toggleBlock(6)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_6" onClick="javascript:wpsh_code(6)" title="Show code only"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_6" onClick="javascript:wpsh_print(6)" title="Print code"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://dandel.es/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_6" class="wp-synhighlighter-inner" style="display: block;"><pre class="xml" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;Contacts<span class="re2">&gt;</span></span></span>
	<span class="sc3"><span class="re1">&lt;Contact<span class="re2">&gt;</span></span></span>
		<span class="sc3"><span class="re1">&lt;ContactId<span class="re2">&gt;</span></span></span>1<span class="sc3"><span class="re1">&lt;/ContactId<span class="re2">&gt;</span></span></span>
		<span class="sc3"><span class="re1">&lt;Name<span class="re2">&gt;</span></span></span>Jose<span class="sc3"><span class="re1">&lt;/Name<span class="re2">&gt;</span></span></span>
		<span class="sc3"><span class="re1">&lt;Surname<span class="re2">&gt;</span></span></span>Perez<span class="sc3"><span class="re1">&lt;/Surname<span class="re2">&gt;</span></span></span>
		<span class="sc3"><span class="re1">&lt;Email<span class="re2">&gt;</span></span></span>pepe@email.com<span class="sc3"><span class="re1">&lt;/Email<span class="re2">&gt;</span></span></span>
		<span class="sc3"><span class="re1">&lt;Phone<span class="re2">&gt;</span></span></span>93 111 22 33<span class="sc3"><span class="re1">&lt;/Phone<span class="re2">&gt;</span></span></span>
		<span class="sc3"><span class="re1">&lt;Mobile<span class="re2">&gt;</span></span></span>600 11 22 33<span class="sc3"><span class="re1">&lt;/Mobile<span class="re2">&gt;</span></span></span>
	<span class="sc3"><span class="re1">&lt;/Contact<span class="re2">&gt;</span></span></span>
        <span class="sc3"><span class="re1">&lt;Contact<span class="re2">&gt;</span></span></span>
		<span class="sc3"><span class="re1">&lt;ContactId<span class="re2">&gt;</span></span></span>1<span class="sc3"><span class="re1">&lt;/ContactId<span class="re2">&gt;</span></span></span>
		<span class="sc3"><span class="re1">&lt;Name<span class="re2">&gt;</span></span></span>Alberto<span class="sc3"><span class="re1">&lt;/Name<span class="re2">&gt;</span></span></span>
		<span class="sc3"><span class="re1">&lt;Surname<span class="re2">&gt;</span></span></span>Garcia<span class="sc3"><span class="re1">&lt;/Surname<span class="re2">&gt;</span></span></span>
		<span class="sc3"><span class="re1">&lt;Email<span class="re2">&gt;</span></span></span>berto@email.com<span class="sc3"><span class="re1">&lt;/Email<span class="re2">&gt;</span></span></span>
		<span class="sc3"><span class="re1">&lt;Phone<span class="re2">&gt;</span></span></span>93 333 22 11<span class="sc3"><span class="re1">&lt;/Phone<span class="re2">&gt;</span></span></span>
		<span class="sc3"><span class="re1">&lt;Mobile<span class="re2">&gt;</span></span></span>600 33 22 11<span class="sc3"><span class="re1">&lt;/Mobile<span class="re2">&gt;</span></span></span>
	<span class="sc3"><span class="re1">&lt;/Contact<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Contacts<span class="re2">&gt;</span></span></span></pre></div></div>
<p>Para tratar el XML, es conveniente crear un método que reciba por parámetro la información de los datos de contacto de los clientes en un string con formato XML y un enumerado con los permisos del usuario que desea consultar los datos.</p>
<div id="wpshdo_7" class="wp-synhighlighter-outer"><div id="wpshdt_7" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_7"></a><a id="wpshat_7" class="wp-synhighlighter-title" href="#codesyntax_7"  onClick="javascript:wpsh_toggleBlock(7)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_7" onClick="javascript:wpsh_code(7)" title="Show code only"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_7" onClick="javascript:wpsh_print(7)" title="Print code"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://dandel.es/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_7" class="wp-synhighlighter-inner" style="display: block;"><pre class="csharp" style="font-family:monospace;"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw4">string</span> ClearXmlInfo<span class="br0">&#40;</span><span class="kw4">string</span> xmlInfo, IEnumerable permissions<span class="br0">&#41;</span>
        <span class="br0">&#123;</span>
            <span class="kw4">string</span> resultXML <span class="sy0">=</span> <span class="kw4">string</span>.<span class="me1">Empty</span><span class="sy0">;</span>
&nbsp;
            <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">string</span>.<span class="me1">IsNullOrWhiteSpace</span><span class="br0">&#40;</span>xmlInfo<span class="br0">&#41;</span><span class="br0">&#41;</span>
                return<span class="sy0">;</span>
&nbsp;
            XElement xElement <span class="sy0">=</span> XElement.<span class="me1">Parse</span><span class="br0">&#40;</span>xmlInfo<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
            var contacts <span class="sy0">=</span> <span class="br0">&#40;</span>from c <span class="kw1">in</span> xElement.<span class="me1">Descendants</span><span class="br0">&#40;</span><span class="st0">&quot;Contact&quot;</span><span class="br0">&#41;</span>
                           select c<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
            <span class="kw1">foreach</span><span class="br0">&#40;</span>contact <span class="kw1">in</span> contacts<span class="br0">&#41;</span>
            <span class="br0">&#123;</span>
                <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span>permissions.<span class="me1">Contains</span><span class="br0">&#40;</span>Permission.<span class="me1">ShowEmail</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                    xElement.<span class="me1">SetElementValue</span><span class="br0">&#40;</span><span class="st0">&quot;Email&quot;</span>, <span class="kw4">string</span>.<span class="me1">Empty</span><span class="br0">&#41;</span><span class="sy0">;</span>
                <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span>permissions.<span class="me1">Contains</span><span class="br0">&#40;</span>Permission.<span class="me1">ShowPhone</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                    xElement.<span class="me1">SetElementValue</span><span class="br0">&#40;</span><span class="st0">&quot;Phone&quot;</span>, <span class="kw4">string</span>.<span class="me1">Empty</span><span class="br0">&#41;</span><span class="sy0">;</span>
                <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span>permissions.<span class="me1">Contains</span><span class="br0">&#40;</span>Permission.<span class="me1">ShowMobileNumber</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                    xElement.<span class="me1">SetElementValue</span><span class="br0">&#40;</span><span class="st0">&quot;Mobile&quot;</span>, <span class="kw4">string</span>.<span class="me1">Empty</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
                resultXML <span class="sy0">+=</span> xElement<span class="sy0">;</span>
            <span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
            <span class="kw1">return</span> resultXML<span class="sy0">;</span>
        <span class="br0">&#125;</span></pre></div></div>
<h2>Conclusiones</h2>
<p>El ejemplo es sencillo, pero espero que sirva para ilustrar que es bastante fácil recorrer y manipular XML con el framework de .NET y Linq.</p>
]]></content:encoded>
			<wfw:commentRss>http://dandel.es/manipular-xml-en-net/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fauna del asfalto</title>
		<link>http://dandel.es/fauna-del-asfalto</link>
		<comments>http://dandel.es/fauna-del-asfalto#comments</comments>
		<pubDate>Sun, 09 Oct 2011 10:18:49 +0000</pubDate>
		<dc:creator>dandel</dc:creator>
				<category><![CDATA[Artículos]]></category>

		<guid isPermaLink="false">http://dandel.es/?p=237</guid>
		<description><![CDATA[No es que lleve demasiados años conduciendo, ni tampoco que me pase mucho tiempo en la carretera cada día. Apenas cojo el coche para ir y volver del trabajo en un trayecto de 20 minutos y hacer recados el fin &#8230; <a href="http://dandel.es/fauna-del-asfalto">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>No es que lleve demasiados años conduciendo, ni tampoco que me pase mucho tiempo en la carretera cada día. Apenas cojo el coche para ir y volver del trabajo en un trayecto de 20 minutos y hacer recados el fin de semana. Pero en mi corta experiencia como conductor he llegado a la conclusión de que se puede realizar un completo estudio sociológico observando a los conductores de una ciudad.</p>
<p>No puedo evitar observar a los demás mientras conduzco y pronto me di cuenta de que nuestros hábitos de comportamiento no son demasiado variados. Sin arriesgarme demasiado en generalizar, se podría catalogar a la gran mayoría de conductores en casos típicos y predecibles.</p>
<p><span id="more-17773"></span></p>
<p>Un ejemplo, para entrar en materia: <strong>el del Golf. </strong>Nótese que digo &#8220;el&#8221; y no &#8220;la&#8221;, porque a ellas les suele gustar más llevar un Polo. El del Golf es el típico caso de estudio al que le gusta conducir con el bracito fuera de la ventanilla y cambiarse de carril bruscamente en los atascos intentando situarse en el que avanza más rápido. Suele adelantarte por la derechita cuando vas en la autopista por el carril central solo para girarse a mirarte y hacerte notar lo ofendido que está por verte ir a una velocidad tan absurda. Y de paso enseñarte el peluco, el cigarro o el dedo.</p>
<p>Luego tenemos al típico <strong>transportista</strong>. Ese hombre &#8220;HOMBRE&#8221;, que se tira medio día en la carretera y toda la tarde en el bar y que conduce una furgoneta. El grado de destartalamiento de la furgoneta es indiferente, el caso es ponerla al límite en cada maniobra. Se nota que el vehículo no es suyo, porque tiene unas cuantas abolladuras causadas por aparcar de forma despreocupada. O de oído. Este hombre siempre tiene prisa, así que todos los demás conductores le estorban. Su grado de desesperación es tal que cambia de carril incesantemente haciendo un elegante eslalon, sin señalizar y si te puede hacer frenar presa del pánico, se irá con una sonrisa. Los transportistas, o &#8220;furgoneteros&#8221;, también son conocidos mundialmente por hacer la típica &#8220;finta&#8221; cuando cambian de dirección para girar y meterse en una calle transversal. Ya sabéis, eso tan gracioso de abrirse en la dirección contraria a la que quieren girar, para despistar a sus adversarios. Los adversarios somos todos los demás, se entiende. Seguro que os habéis encontrado a alguno.</p>
<p>De la misma familia de primates, deriva el <strong>conductor de autobús</strong>. En este caso, conductor o conductora, ya es indiferente. Este ejemplar, consciente de la envergadura de su montura, decidió un buen día dejar de cederle el paso a los demás. Desde aquél dia de revelación espiritual, se incorpora a la autopista como un coche de Daytona y entra en las glorietas con el mismo respeto que un cuchillo corta la mantequilla.</p>
<p>Hay ciertos casos que me gusta agrupar como los <strong>padres y madres de familia</strong>. En el caso de los padres, conducen un monovolúmen. Tratándose de ellas, suele ser un todoterreno. Ellos con el monovolúmen tienen todo el espacio que necesitan para que los niños retocen en la parte de atrás sin tocarles los huevos. Ellas con el todoterreno, tienen la seguridad que necesitan para conducir sin miedo a estamparse y que su coche quede abollado de una forma muy antiestética. Mientras más grande y más alto, mejor. Aunque sea para conducir solo por ciudad, da igual. Si se encuentran con un accidente, es mejor que tu coche sea capaz de pasarle por encima al de los demás como si fuera un tanque. Y si es de noche y tienen un coche delante, es mejor deslumbrarle con tus luces a metro y medio del suelo para que sepa que estás ahí.</p>
<p>Y no podría olvidarme de mi favorito: <strong>el del BMW</strong>. Tengo una teoría que he mencionado en alguna ocasión por twitter. Creo firmemente que cuando vas a un concesionario y quieres comprarte un BMW, la marca exige como condición indispensable que sus compradores se sometan a una <strong>lobotomía antes de darles las llaves.</strong> No falla: cuando veas un BMW en la carretera, échate a temblar y si puede ser, apártate de su camino. Prepárate a que te coman el culo, que te adelanten bruscamente mirándote con odio, que te hagan luces aunque vayas a 120 por el carril de la derecha y todo tipo de situaciones inverosímiles que se os pasen por la cabeza. Yo entiendo que conducir un BMW <span style="color: #000000;"><strong>representa mucha presión</strong>, pero aún así no entiendo el patrón de comportamiento común que se suele dar en la gran mayoría de sus conductores. </span></p>
<h2> Todo eso es generalizar, ¿no?</h2>
<p>Pensarás. Pues sí, seguramente esté generalizando pero macho&#8230; uno a veces se desespera con las locuras que le hacen los demás conduciendo. No gano para sustos. Necesitaba desahogarme. Ala :p</p>
]]></content:encoded>
			<wfw:commentRss>http://dandel.es/fauna-del-asfalto/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Botones en CSS3 puro</title>
		<link>http://dandel.es/botones-en-css-puro</link>
		<comments>http://dandel.es/botones-en-css-puro#comments</comments>
		<pubDate>Sat, 17 Sep 2011 08:06:57 +0000</pubDate>
		<dc:creator>dandel</dc:creator>
				<category><![CDATA[Trucos]]></category>
		<category><![CDATA[CSS3]]></category>

		<guid isPermaLink="false">http://dandel.es/?p=213</guid>
		<description><![CDATA[Soy fan #1 de hacer completamente en CSS cosas que hace unos años solo se podían conseguir con JavaScript. El verdadero desafío es conseguir que el resultado sea compatible en todos los navegadores, pero ahí está la gracia. Como ventaja, &#8230; <a href="http://dandel.es/botones-en-css-puro">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://dandel.es/wp-content/uploads/2011/09/pure-css3-button.png"><img class="aligncenter size-full wp-image-217" title="Botones en CSS3 puro" src="http://dandel.es/wp-content/uploads/2011/09/pure-css3-button.png" alt="Botones en CSS3 puro" width="382" height="81" /></a></p>
<p>Soy fan #1 de hacer completamente en <strong>CSS</strong> cosas que hace unos años solo se podían conseguir con <strong>JavaScript</strong>. El verdadero desafío es conseguir que el resultado sea compatible en todos los navegadores, pero ahí está la gracia. Como ventaja, te ahorras un montón de código de script innecesario.</p>
<p>Hoy voy a explicar de forma breve cómo están hechos los <strong>botones</strong> de este blog.</p>
<p><span id="more-17770"></span></p>
<h2>Maquetación</h2>
<p>Me gusta utilizar un simple tag <strong>&lt;span&gt;</strong> para el botón, ya que así me aseguro de que no va a provocar ningún comportamiento indeseado en ningún navegador. Si utilizase un &lt;input&gt;, se podría hacer submit sin que yo lo controlase y los <em>anchors </em>(&lt;a&gt;) solo me gusta usarlos en enlace, por cuestiones de SEO. Manías de programador, supongo.</p>
<div id="wpshdo_8" class="wp-synhighlighter-outer"><div id="wpshdt_8" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_8"></a><a id="wpshat_8" class="wp-synhighlighter-title" href="#codesyntax_8"  onClick="javascript:wpsh_toggleBlock(8)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_8" onClick="javascript:wpsh_code(8)" title="Show code only"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_8" onClick="javascript:wpsh_print(8)" title="Print code"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://dandel.es/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_8" class="wp-synhighlighter-inner" style="display: block;"><pre class="html4strict" style="font-family:monospace;"><span class="sc2">&lt;<a href="http://december.com/html/4/element/span.html"><span class="kw2">span</span></a> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;button&quot;</span>&gt;</span>Texto del botón <span class="sc1">&amp;raquo;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/span.html"><span class="kw2">span</span></a>&gt;</span></pre></div></div>
<h2>Estilos CSS</h2>
<p>Esta es la madre de los huevos. El truco para emular el comportamiento del botón al hacer &#8220;clic&#8221; está en ese desplazamiento de 1px respecto al margen superior que le asignamos al evento <strong>.active</strong>.</p>
<p>Como podéis comprobar, los bordes se redondean con propiedades de CSS3 tipo &#8220;border-radius&#8221; y se le da un sombreado al elemento y al texto con &#8220;box-shadow&#8221; y &#8220;text-shadow&#8221;. La ventaja de hacerlo así es que en navegadores antiguos, simplemente se verá cuadrado, sin requerir maquetación adicional. Si estáis conforme con perder esta diferencia visual con tal de ganar en ancho de banda, esta solución es idónea.</p>
<p>Para el fondo, se utiliza un pequeño truco para hacer el degradado y que sea compatible con todos los navegadores. Utilizando esta <a href="http://dandel.es/wp-content/uploads/2011/09/alert-overlay.png">imagen png de 1px de ancho</a> y repitiéndola en el eje horizontal del elemento, ya podemos personalizar el botón con el color que queramos y queda un bonito efecto de degradado.</p>
<div id="wpshdo_9" class="wp-synhighlighter-outer"><div id="wpshdt_9" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_9"></a><a id="wpshat_9" class="wp-synhighlighter-title" href="#codesyntax_9"  onClick="javascript:wpsh_toggleBlock(9)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_9" onClick="javascript:wpsh_code(9)" title="Show code only"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_9" onClick="javascript:wpsh_print(9)" title="Print code"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://dandel.es/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_9" class="wp-synhighlighter-inner" style="display: block;"><pre class="css" style="font-family:monospace;"><span class="re1">.button</span><span class="sy0">,</span> <span class="re1">.button</span><span class="re2">:visited</span><span class="br0">&#123;</span>
    <span class="kw1">background</span><span class="sy0">:</span> <span class="kw2">url</span><span class="br0">&#40;</span><span class="st0">&quot;img/alert-overlay.png&quot;</span><span class="br0">&#41;</span> <span class="kw2">repeat-x</span> <span class="kw2">scroll</span> 0 0 <span class="re0">#857968</span><span class="sy0">;</span>
    <span class="kw1">border-bottom</span><span class="sy0">:</span> <span class="re3">1px</span> <span class="kw2">solid</span> rgba<span class="br0">&#40;</span>0<span class="sy0">,</span> 0<span class="sy0">,</span> 0<span class="sy0">,</span> 0.25<span class="br0">&#41;</span><span class="sy0">;</span>
    border-radius<span class="sy0">:</span> <span class="re3">5px</span> <span class="re3">5px</span> <span class="re3">5px</span> <span class="re3">5px</span><span class="sy0">;</span>
    box-shadow<span class="sy0">:</span> 0 <span class="re3">1px</span> <span class="re3">3px</span> rgba<span class="br0">&#40;</span>0<span class="sy0">,</span> 0<span class="sy0">,</span> 0<span class="sy0">,</span> 0.5<span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="kw1">color</span><span class="sy0">:</span> <span class="re0">#FFFFFF</span><span class="sy0">;</span>
    <span class="kw1">cursor</span><span class="sy0">:</span> <span class="kw2">pointer</span><span class="sy0">;</span>
    <span class="kw1">display</span><span class="sy0">:</span> inline-<span class="kw2">block</span><span class="sy0">;</span>
    <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">relative</span><span class="sy0">;</span>
    <span class="kw1">text-decoration</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span>
    <span class="kw1">font-size</span><span class="sy0">:</span> <span class="re3">13px</span><span class="sy0">;</span>
    <span class="kw1">font-weight</span><span class="sy0">:</span> <span class="kw2">bold</span><span class="sy0">;</span>
    <span class="kw1">line-height</span><span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">;</span>
    <span class="kw1">text-shadow</span><span class="sy0">:</span> 0 <span class="re3">-1px</span> <span class="re3">1px</span> rgba<span class="br0">&#40;</span>0<span class="sy0">,</span> 0<span class="sy0">,</span> 0<span class="sy0">,</span> 0.25<span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="kw1">padding</span><span class="sy0">:</span> <span class="re3">8px</span> <span class="re3">14px</span> <span class="re3">9px</span><span class="sy0">;</span>
    <span class="kw1">margin</span><span class="sy0">:</span><span class="re3">20px</span> <span class="nu0">0</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="re1">.button</span><span class="re2">:visited </span><span class="br0">&#123;</span>
    <span class="kw1">background-color</span><span class="sy0">:</span> <span class="re0">#857968</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
<span class="re1">.button</span><span class="re2">:hover </span><span class="br0">&#123;</span>
    <span class="kw1">background-color</span><span class="sy0">:</span> <span class="re0">#554236</span><span class="sy0">;</span>
    <span class="kw1">color</span><span class="sy0">:</span> <span class="re0">#FFFFFF</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
<span class="re1">.button</span><span class="re2">:active </span><span class="br0">&#123;</span>
    <span class="kw1">top</span><span class="sy0">:</span> <span class="re3">1px</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>Espero que os sea útil. Como siempre, estoy abierto a sugerencias para mejorar este truco en CSS3.</p>
<p>Por último, estas cosas no las aprendo yo solo: me basé en el sencillo tutorial que encontré en <a title="Pure CSS3 buttons" href="http://www.zurb.com/article/266/super-awesome-buttons-with-css3-and-rgba">ZURB</a>, con varios ejemplos en distintas tonalidades.</p>
]]></content:encoded>
			<wfw:commentRss>http://dandel.es/botones-en-css-puro/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>5 años de Smashing Magazine</title>
		<link>http://dandel.es/5-anos-de-smashing-magazine</link>
		<comments>http://dandel.es/5-anos-de-smashing-magazine#comments</comments>
		<pubDate>Fri, 09 Sep 2011 07:29:06 +0000</pubDate>
		<dc:creator>dandel</dc:creator>
				<category><![CDATA[Artículos]]></category>

		<guid isPermaLink="false">http://dandel.es/?p=210</guid>
		<description><![CDATA[El blog de Smashing Magazine es una de mis principales referencias de consulta en cuanto a diseño y programación web se refiere y hoy cumplen 5 años. Es una excusa perfecta para echar un vistazo a sus mejores artículos, que &#8230; <a href="http://dandel.es/5-anos-de-smashing-magazine">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>El blog de <a title="Smashing Magazine" href="http://www.smashingmagazine.com" target="_blank">Smashing Magazine</a> es una de mis principales referencias de consulta en cuanto a diseño y programación web se refiere y hoy <a title="5º Aniversario de Smashing Magazine" href="http://www.smashingmagazine.com/2011/09/08/to-five-smashing-years-and-a-free-anniversary-ebook-treat/" target="_blank">cumplen 5 años</a>. Es una excusa perfecta para echar un vistazo a sus mejores artículos, que han recopilado en un <strong>eBook</strong> que han puesto a disposición de sus lectores de forma gratuita <a title="Los mejores artículos de Smashing Magazine" href="http://itunes.apple.com/book/best-of-smashing-magazine/id456595375?mt=11" target="_blank">en iTunes</a> y en sus servidores.</p>
<p>También os recomiendo su libro en formato físico, una guía indispensable para aprender cosas sobre tipografía, teoría del color y otros conceptos de diseño web.</p>
<p>Desde este humilde rincón de Internet, ¡felicidades, <strong>Smashing Magazine</strong>! <img src='http://dandel.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://dandel.es/5-anos-de-smashing-magazine/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo crear un plugin de jQuery</title>
		<link>http://dandel.es/como-crear-plugin-de-jquery</link>
		<comments>http://dandel.es/como-crear-plugin-de-jquery#comments</comments>
		<pubDate>Sat, 03 Sep 2011 06:56:07 +0000</pubDate>
		<dc:creator>dandel</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://dandel.es/?p=109</guid>
		<description><![CDATA[jQuery es uno de mis frameworks JavaScript preferidos, por su extensibilidad, la amplia documentación que existe en la Red y la independencia que me da para implementarlo y asegurar que va a funcionar igual de bien en cualquier navegador. Es &#8230; <a href="http://dandel.es/como-crear-plugin-de-jquery">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://dandel.es/wp-content/uploads/2011/05/jqueyr_plugin.jpg"><img class="aligncenter size-full wp-image-157" title="Cómo crear un plugin de jQuery" src="http://dandel.es/wp-content/uploads/2011/05/jqueyr_plugin.jpg" alt="Cómo crear un plugin de jQuery" width="600" height="268" /></a></p>
<p><strong>jQuery </strong>es uno de mis <strong>frameworks JavaScript</strong> preferidos, por su extensibilidad, la amplia documentación que existe en la Red y la independencia que me da para implementarlo y asegurar que va a funcionar igual de bien en cualquier navegador.</p>
<p>Es muy fácil aprender a trabajar con él, pero su potencia no se basa solo en la capacidad de hacer virguerías con el <strong>DOM</strong> y <strong>animacione</strong>s que antes haríamos con Flash. Lo que más me gusta de jQuery es que con tres o <strong>cuatro líneas de código</strong> consigues lo que antes te costaba mucho más con JavaScript clásico u otro lenguaje de cliente.</p>
<p>Con este artículo me gustaría ilustrar la potencia de jQuery para crear <strong>plugins</strong> y <strong>extender el comportamiento de los elementos de una página</strong>.</p>
<p><span id="more-109"></span></p>
<h2>Lo que queremos</h2>
<p>Vamos a crear un <strong>plugin para extender el funcionamiento</strong> de los objetos tipo textbox de un formulario. El funcionamiento de un textbox es idéntico en todos los navegadores: nos ofrece una caja para que el usuario pueda introducir texto. Con este plugin, haremos que todos los textbox muestren una marca de agua con un texto por defecto.</p>
<h2>Maquetación</h2>
<p>Empezaremos creando los tres archivos que necesitaremos. El HTML, la hoja de estilos css y el script de jQuery:</p>
<p><a href="http://dandel.es/wp-content/uploads/2011/05/archivos_plugin_js.jpg"><img class="alignright size-full wp-image-139" title="Archivos plugin jQuery" src="http://dandel.es/wp-content/uploads/2011/05/archivos_plugin_js.jpg" alt="Archivos plugin jQuery" width="600" height="103" /></a></p>
<p>Lo primero es maquetar el formulario en HTML. Vamos a hacer algo sencillo, para centrarnos en las posibilidades de jQuery.</p>
<div id="wpshdo_10" class="wp-synhighlighter-outer"><div id="wpshdt_10" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_10"></a><a id="wpshat_10" class="wp-synhighlighter-title" href="#codesyntax_10"  onClick="javascript:wpsh_toggleBlock(10)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_10" onClick="javascript:wpsh_code(10)" title="Show code only"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_10" onClick="javascript:wpsh_print(10)" title="Print code"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://dandel.es/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_10" class="wp-synhighlighter-inner" style="display: block;"><pre class="html4strict" style="font-family:monospace;"><span class="sc2">&lt;<a href="http://december.com/html/4/element/html.html"><span class="kw2">html</span></a>&gt;</span>
  <span class="sc2">&lt;<a href="http://december.com/html/4/element/head.html"><span class="kw2">head</span></a>&gt;</span>
    <span class="sc2">&lt;<a href="http://december.com/html/4/element/title.html"><span class="kw2">title</span></a>&gt;</span>Ejemplo de formulario con marcas de agua<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/title.html"><span class="kw2">title</span></a>&gt;</span>
    <span class="sc2">&lt;<a href="http://december.com/html/4/element/link.html"><span class="kw2">link</span></a> <span class="kw3">rel</span><span class="sy0">=</span><span class="st0">&quot;stylesheet&quot;</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;style.css&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/css&quot;</span> <span class="kw3">media</span><span class="sy0">=</span><span class="st0">&quot;screen&quot;</span> <span class="sy0">/</span>&gt;</span>
  <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/head.html"><span class="kw2">head</span></a>&gt;</span>
  <span class="sc2">&lt;<a href="http://december.com/html/4/element/body.html"><span class="kw2">body</span></a>&gt;</span>
    <span class="sc2">&lt;<a href="http://december.com/html/4/element/form.html"><span class="kw2">form</span></a>&gt;</span>
      <span class="sc2">&lt;<a href="http://december.com/html/4/element/ul.html"><span class="kw2">ul</span></a>&gt;</span>
        <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>
          <span class="sc2">&lt;<a href="http://december.com/html/4/element/label.html"><span class="kw2">label</span></a> <span class="kw3">for</span><span class="sy0">=</span><span class="st0">&quot;name&quot;</span>&gt;</span>Nombre:<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/label.html"><span class="kw2">label</span></a>&gt;</span>
          <span class="sc2">&lt;<a href="http://december.com/html/4/element/input.html"><span class="kw2">input</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text&quot;</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;name&quot;</span> <span class="kw3">title</span><span class="sy0">=</span><span class="st0">&quot;Introduce tu nombre&quot;</span><span class="sy0">/</span>&gt;</span>
        <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>
	<span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>
	  <span class="sc2">&lt;<a href="http://december.com/html/4/element/label.html"><span class="kw2">label</span></a> <span class="kw3">for</span><span class="sy0">=</span><span class="st0">&quot;surname&quot;</span>&gt;</span>Apellidos:<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/label.html"><span class="kw2">label</span></a>&gt;</span>
	  <span class="sc2">&lt;<a href="http://december.com/html/4/element/input.html"><span class="kw2">input</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text&quot;</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;surname&quot;</span> <span class="kw3">title</span><span class="sy0">=</span><span class="st0">&quot;Introduce tus apellidos&quot;</span><span class="sy0">/</span>&gt;</span>
        <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>
      <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/ul.html"><span class="kw2">ul</span></a>&gt;</span>
    <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/form.html"><span class="kw2">form</span></a>&gt;</span>
  <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/body.html"><span class="kw2">body</span></a>&gt;</span>
<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/html.html"><span class="kw2">html</span></a>&gt;</span></pre></div></div>
<p>Como podéis comprobar, es tan solo un pequeño formulario en el que se nos pide el nombre y el apellido. Para los formularios, me gusta utilizar <a title="Listas desordenadas HTML" href="http://www.w3.org/TR/html401/struct/lists.html#h-10.2">listas desordenadas</a> en lugar de <a title="Listas de definición HTML" href="http://www.w3.org/TR/html401/struct/lists.html#h-10.3">listas de definición</a> o divs, porque requieren menos maquetación y esto se traduce en menos ancho de banda consumido. En la cabecera hacemos referencia a una <strong>hoja de estilos CSS</strong>, así que la crearemos en un archivo independiente, tal y como marca el estándar.</p>
<div id="wpshdo_11" class="wp-synhighlighter-outer"><div id="wpshdt_11" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_11"></a><a id="wpshat_11" class="wp-synhighlighter-title" href="#codesyntax_11"  onClick="javascript:wpsh_toggleBlock(11)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_11" onClick="javascript:wpsh_code(11)" title="Show code only"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_11" onClick="javascript:wpsh_print(11)" title="Print code"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://dandel.es/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_11" class="wp-synhighlighter-inner" style="display: block;"><pre class="css" style="font-family:monospace;">body<span class="br0">&#123;</span>
	<span class="kw1">font-family</span><span class="re2">:Arial</span><span class="sy0">,</span> Verdana<span class="sy0">,</span> <span class="kw2">sans-serif</span><span class="sy0">;</span>
	<span class="kw1">font-size</span><span class="sy0">:</span><span class="re3">10pt</span><span class="sy0">;</span>
	<span class="kw1">width</span><span class="sy0">:</span><span class="re3">500px</span><span class="sy0">;</span>
	<span class="kw1">margin</span><span class="sy0">:</span> <span class="re3">30px</span> <span class="kw2">auto</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
label<span class="br0">&#123;</span>
	<span class="kw1">display</span><span class="sy0">:</span><span class="kw2">block</span><span class="sy0">;</span>
	<span class="kw1">float</span><span class="sy0">:</span><span class="kw1">left</span><span class="sy0">;</span>
	<span class="kw1">margin-right</span><span class="sy0">:</span><span class="re3">20px</span><span class="sy0">;</span>
	<span class="kw1">width</span><span class="sy0">:</span><span class="re3">55px</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
ul<span class="br0">&#123;</span>
	<span class="kw1">margin</span><span class="sy0">:</span><span class="nu0">0</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
li<span class="br0">&#123;</span>
	<span class="kw1">clear</span><span class="sy0">:</span><span class="kw1">left</span><span class="sy0">;</span>
	<span class="kw1">margin-top</span><span class="sy0">:</span><span class="re3">20px</span><span class="sy0">;</span>
	<span class="kw1">list-style</span><span class="sy0">:</span><span class="kw2">none</span><span class="sy0">;</span>
	<span class="kw1">overflow</span><span class="sy0">:</span><span class="kw2">hidden</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
input<span class="br0">&#123;</span>
	<span class="kw1">float</span><span class="sy0">:</span><span class="kw1">left</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>
<p>También me gusta utilizar el body como un contenedor cualquiera, ya que así uno se ahorra divs innecesarios. Ahora que ya tenemos el formulario listo, ya podemos empezar con <strong>jQuery</strong>.</p>
<h2>Extendiendo el comportamiento del textbox</h2>
<p>Vamos a crear un <strong>plugin de jQuery</strong>, así que lo primero que tenemos que hacer es referenciar a la librería del framework. Podemos descargarla de su sitio oficial (descargar) o enlazarla directamente al repositorio de Google. Yo prefiero hacer esto último, ya que a ellos les sobra ancho de banda y <em>casi</em> nunca se les caen los servidores. Así que ya que nos lo ofrecen&#8230;</p>
<div id="wpshdo_12" class="wp-synhighlighter-outer"><div id="wpshdt_12" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_12"></a><a id="wpshat_12" class="wp-synhighlighter-title" href="#codesyntax_12"  onClick="javascript:wpsh_toggleBlock(12)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_12" onClick="javascript:wpsh_code(12)" title="Show code only"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_12" onClick="javascript:wpsh_print(12)" title="Print code"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://dandel.es/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_12" class="wp-synhighlighter-inner" style="display: block;"><pre class="html4strict" style="font-family:monospace;"><span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span>
<span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;watermark.js&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span></pre></div></div>
<p>La primera línea es el enlace a la <strong>librería jQuery</strong> que proporciona <strong>Google APIs. </strong>Ese enlace garantizará que siempre obtengamos la última versión de la serie 1.x.x. Cuando saquen la versión 2, habrá que cambiar en la parte de &#8220;&#8230;/jquery/<strong>1</strong>/jquery.min.js&#8221; el 1 por un 2.</p>
<p>La segunda línea hace referencia al archivo donde vamos a crear el código de nuestro script.</p>
<p>El concepto de <strong>crear un plugin para jQuery</strong> es añadir una función al código de la librería. Esta función llevará el nombre de nuestro plugin y tendrá el comportamiento que nosotros definamos. Así que crear un plugin es algo tan sencillo como esto:</p>
<div id="wpshdo_13" class="wp-synhighlighter-outer"><div id="wpshdt_13" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_13"></a><a id="wpshat_13" class="wp-synhighlighter-title" href="#codesyntax_13"  onClick="javascript:wpsh_toggleBlock(13)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_13" onClick="javascript:wpsh_code(13)" title="Show code only"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_13" onClick="javascript:wpsh_print(13)" title="Print code"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://dandel.es/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_13" class="wp-synhighlighter-inner" style="display: block;"><pre class="javascript" style="font-family:monospace;">jQuery.<span class="me1">fn</span>.<span class="me1">watermark</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span class="co1">// Aquí irá el código de nuestro plugin</span>
<span class="br0">&#125;</span><span class="sy0">;</span></pre></div></div>
<p>La función se añadirá al objeto <strong>jQuery.fn</strong> de la librería y a partir de este momento podremos utilizarla en cualquier parte de nuestro site.</p>
<p>Si queremos, podemos utilizar el mágico simbolo del dolar <strong>$</strong> que seguro habréis visto en muchísimos ejemplos de jQuery. Pero para estar seguros de que el acceso directo no entra en conflicto con otras librerías de JavaScript, protegeremos su uso al ámbito concreto de nuestro plugin:</p>
<div id="wpshdo_14" class="wp-synhighlighter-outer"><div id="wpshdt_14" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_14"></a><a id="wpshat_14" class="wp-synhighlighter-title" href="#codesyntax_14"  onClick="javascript:wpsh_toggleBlock(14)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_14" onClick="javascript:wpsh_code(14)" title="Show code only"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_14" onClick="javascript:wpsh_print(14)" title="Print code"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://dandel.es/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_14" class="wp-synhighlighter-inner" style="display: block;"><pre class="javascript" style="font-family:monospace;"><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span> $ <span class="br0">&#41;</span><span class="br0">&#123;</span>
  $.<span class="me1">fn</span>.<span class="me1">watermark</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="co1">// Aquí irá el código de nuestro plugin</span>
  <span class="br0">&#125;</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span> jQuery <span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>
<p>Envolviéndolo en esa función, nos aseguramos de que la variable <strong>$</strong> no se usará más que en el ámbito de la función.</p>
<p>Ahora ya podemos llamar a la función <strong>watermark</strong> desde cualquier elemento DOM instanciado con jQuery. En el siguiente fragmento de código, aplicamos un selector a todos los <strong>input</strong> de tipo texto para que llamen a la función de nuestro plugin nada más inicializarse:</p>
<div id="wpshdo_15" class="wp-synhighlighter-outer"><div id="wpshdt_15" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_15"></a><a id="wpshat_15" class="wp-synhighlighter-title" href="#codesyntax_15"  onClick="javascript:wpsh_toggleBlock(15)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_15" onClick="javascript:wpsh_code(15)" title="Show code only"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_15" onClick="javascript:wpsh_print(15)" title="Print code"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://dandel.es/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_15" class="wp-synhighlighter-inner" style="display: block;"><pre class="javascript" style="font-family:monospace;">$<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  $<span class="br0">&#40;</span><span class="st0">'input:text'</span><span class="br0">&#41;</span>.<span class="me1">watermark</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>
<p>Para comprobar que esto funciona, completaremos el contenido de la función <strong>watermark</strong> con el código que queremos.</p>
<div id="wpshdo_16" class="wp-synhighlighter-outer"><div id="wpshdt_16" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_16"></a><a id="wpshat_16" class="wp-synhighlighter-title" href="#codesyntax_16"  onClick="javascript:wpsh_toggleBlock(16)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_16" onClick="javascript:wpsh_code(16)" title="Show code only"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_16" onClick="javascript:wpsh_print(16)" title="Print code"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://dandel.es/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_16" class="wp-synhighlighter-inner" style="display: block;"><pre class="javascript" style="font-family:monospace;"><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span> $ <span class="br0">&#41;</span><span class="br0">&#123;</span>
  $<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    $<span class="br0">&#40;</span><span class="st0">'input:text'</span><span class="br0">&#41;</span>.<span class="me1">watermark</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
  $.<span class="me1">fn</span>.<span class="me1">watermark</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw1">this</span>.<span class="me1">addClass</span><span class="br0">&#40;</span><span class="st0">&quot;watermark&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="kw1">this</span>.<span class="me1">each</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
      $<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">val</span><span class="br0">&#40;</span>$<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">attr</span><span class="br0">&#40;</span><span class="st0">&quot;title&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="br0">&#125;</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span> jQuery <span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>
<p>Fijáos en la diferencia en el uso de <strong>this</strong> o <strong>$(this)</strong> dependiendo del ámbito. En el primer caso, <strong>this</strong> ya es un objeto de jQuery que contiene un <strong>array con todos los elementos input de tipo text.</strong> En el segundo caso, se recorre el array con el <strong>.each() </strong>y <strong>$(this) </strong>hace referencia a cada input por separado dentro del ámbito de cada iteración.</p>
<p>Este código debería mostrar el contenido del atributo title del textbox como texto por defecto:</p>
<p><a href="http://dandel.es/wp-content/uploads/2011/05/watermark.jpg"><img class="size-full wp-image-150 aligncenter" title="watermark" src="http://dandel.es/wp-content/uploads/2011/05/watermark.jpg" alt="" width="247" height="96" /></a></p>
<h2>Crear opciones por defecto</h2>
<p>Hasta ahora hemos utilizado varias variables <em>hardcoded</em> para inicializar el plugin, pero es recomendable dejar toda la libertad posible al usuario y no forzarle a utilizar un nombre de clase CSS concreto, por ejemplo. Para ello, pasaremos al plugin un objeto por parámetro a la hora de inicializarlo con aquellas variables que deseemos permitir modificar.</p>
<div id="wpshdo_17" class="wp-synhighlighter-outer"><div id="wpshdt_17" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_17"></a><a id="wpshat_17" class="wp-synhighlighter-title" href="#codesyntax_17"  onClick="javascript:wpsh_toggleBlock(17)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_17" onClick="javascript:wpsh_code(17)" title="Show code only"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_17" onClick="javascript:wpsh_print(17)" title="Print code"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://dandel.es/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_17" class="wp-synhighlighter-inner" style="display: block;"><pre class="javascript" style="font-family:monospace;"><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span> $ <span class="br0">&#41;</span><span class="br0">&#123;</span>
  $<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    $<span class="br0">&#40;</span><span class="st0">'input:text'</span><span class="br0">&#41;</span>.<span class="me1">watermark</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
    	className<span class="sy0">:</span> <span class="st0">'marcaDeAgua'</span>
    <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
  $.<span class="me1">fn</span>.<span class="me1">watermark</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span>options<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
  	<span class="co1">// establecemos las opciones por defecto</span>
	<span class="kw2">var</span> defaults <span class="sy0">=</span> <span class="br0">&#123;</span>
    	  className<span class="sy0">:</span> <span class="st0">'watermark'</span><span class="sy0">,</span>
    	  attrName<span class="sy0">:</span> <span class="st0">'title'</span>
	<span class="br0">&#125;</span><span class="sy0">;</span> 
&nbsp;
  	<span class="co1">// Se sobreescriben las opciones por defecto</span>
	<span class="co1">// con las que proporciona el usuario y se</span>
	<span class="co1">// combinan en la variable 'options'</span>
  	<span class="kw2">var</span> options <span class="sy0">=</span> $.<span class="me1">extend</span><span class="br0">&#40;</span><span class="br0">&#123;</span><span class="br0">&#125;</span><span class="sy0">,</span> defaults<span class="sy0">,</span> options<span class="br0">&#41;</span><span class="sy0">;</span> 
&nbsp;
        <span class="kw1">this</span>.<span class="me1">addClass</span><span class="br0">&#40;</span>options.<span class="me1">className</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw1">this</span>.<span class="me1">each</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
          $<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">val</span><span class="br0">&#40;</span>$<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">attr</span><span class="br0">&#40;</span>options.<span class="me1">attrName</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="br0">&#125;</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span> jQuery <span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>
<p>En el ejemplo anterior le pasamos a la función del plugin un objeto con un único atributo, &#8216;<strong>className</strong>&#8216;. En el cuerpo de la función, hemos creado un objeto con dos atributos, que definen el nombre de la clase que utilizarán los <em>input</em> con marca de agua y el atributo de donde cogerán el texto por defecto. En nuestro caso, el &#8216;<strong>title</strong>&#8216;.</p>
<p>La potencia del código está en la función siguiente:</p>
<pre>$.extend({}, defaults, options);</pre>
<p>Esta función, propia de jQuery, nos permite combinar los elementos de un objeto en otro. De este modo, se toma como base el objeto <strong>defaults</strong> y se sobreescriben los atributos que se han definido en <strong>options</strong>. Como no hemos definido ningún atributo nuevo del cual coger el texto por defecto, se quedará con el que está predeterminado. En el caso del <strong>className</strong>, se reemplazará el valor por defecto por el que hemos definido. Podéis comprobarlo ejecutando el código.</p>
<h2>Añade eventos</h2>
<p>El texto por defecto puede ser útil, pero es bastante molesto tener que borrarlo cada vez que queramos escribir en una caja de texto, ¿verdad? Bien, pues ¡para eso tenemos el código! Vamos a añadir un par de eventos útiles para que se limpie el texto al hacer clic con el ratón y se vuelva a rellenar el contenido por defecto, siempre que el usuario no haya escrito nada.</p>
<div id="wpshdo_18" class="wp-synhighlighter-outer"><div id="wpshdt_18" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_18"></a><a id="wpshat_18" class="wp-synhighlighter-title" href="#codesyntax_18"  onClick="javascript:wpsh_toggleBlock(18)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_18" onClick="javascript:wpsh_code(18)" title="Show code only"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_18" onClick="javascript:wpsh_print(18)" title="Print code"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://dandel.es/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://dandel.es/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_18" class="wp-synhighlighter-inner" style="display: block;"><pre class="javascript" style="font-family:monospace;"><span class="kw1">this</span>.<span class="me1">each</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
      $<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">val</span><span class="br0">&#40;</span>$<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">attr</span><span class="br0">&#40;</span>options.<span class="me1">attrName</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
      <span class="co1">// Implementamos el comportamiento</span>
      <span class="co1">// de varios eventos útiles</span>
      $<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">click</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
        <span class="kw1">if</span><span class="br0">&#40;</span>$<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">val</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">==</span> $<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">attr</span><span class="br0">&#40;</span>options.<span class="me1">attrName</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
                $<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">val</span><span class="br0">&#40;</span><span class="st0">''</span><span class="br0">&#41;</span><span class="sy0">;</span>
      <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
      $<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">focusout</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
      	<span class="kw1">if</span><span class="br0">&#40;</span>$<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">val</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">==</span> <span class="st0">''</span><span class="br0">&#41;</span>
      		$<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">val</span><span class="br0">&#40;</span>$<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">attr</span><span class="br0">&#40;</span>options.<span class="me1">attrName</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
      <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>
<h2>Conclusiones</h2>
<p>Hemos creado un plugin que ofrece un comportamiento muy sencillo, para centrarnos en lo que se requiere para hacer un plugin con jQuery y extrapolarlo a cualquier otro comportamiento que deseemos implementar.</p>
<p>Es importante pensar siempre en utilizar eventos para tener controlado el comportamiento del plugin en todo momento, así como usar opciones por defecto para permitir al usuario el poder personalizarlo por completo.</p>
<p>En fin, espero que os haya sido útil. Si tenéis alguna sugerencia para mejorar lo que he descrito, espero vuestros comentarios.</p>
]]></content:encoded>
			<wfw:commentRss>http://dandel.es/como-crear-plugin-de-jquery/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Me he comprado un iMac</title>
		<link>http://dandel.es/comprado-imac</link>
		<comments>http://dandel.es/comprado-imac#comments</comments>
		<pubDate>Tue, 16 Aug 2011 08:48:23 +0000</pubDate>
		<dc:creator>dandel</dc:creator>
				<category><![CDATA[Artículos]]></category>

		<guid isPermaLink="false">http://dandel.es/?p=171</guid>
		<description><![CDATA[Hace cosa de un par de meses, se nos estropearon en casa los dos ordenadores que teníamos: el mío de sobremesa y el portátil de mi mujer. Cuando nos vinimos a vivir juntos, cada uno se trajo su PC y &#8230; <a href="http://dandel.es/comprado-imac">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://dandel.es/wp-content/uploads/2011/08/iMac.jpg"><img class="aligncenter size-full wp-image-176" title="iMac" src="http://dandel.es/wp-content/uploads/2011/08/iMac.jpg" alt="" width="908" height="452" /></a>Hace cosa de un par de meses, se nos estropearon en casa los dos ordenadores que teníamos: el mío de sobremesa y el portátil de mi mujer. Cuando nos vinimos a vivir juntos, cada uno se trajo su PC y no sé si se habrán confabulado para fastidiarnos la vida, pero el caso es que se pusieron de acuerdo para reventar en la misma semana.</p>
<p>Últimamente ya no escribo, así que no utilizo tanto el ordenador en casa como antes. Pero ella lo necesitaba para buscar trabajo, así que decidimos comprar uno para los dos. En lugar de destinar los ahorros a dos PC&#8217;s regularcillos, quisimos echar el resto y comprar algo en condiciones.</p>
<p><span id="more-17768"></span></p>
<p>El caso es que después de mirar en varias tiendas, todos los ordenadores nos parecían demasiado caros para lo que ofrecían. Estuve incluso mirando de montar uno por piezas, pero me daba mucha pereza volver a tener un sobremesa debajo del escritorio. Por no hablar de que en cualquier tienda te intentan colar una configuración &#8220;para poder tirar con el Crysis sin problemas&#8221; cuando yo lo único que necesito es que me abra el Google Chrome y el jDownloader. Cuando les digo eso a los dependientes, me miran con cara de haberme visto salir de la alcantarilla remojado en las heces de todo el barrio.</p>
<p>El caso es que fuimos a la Apple Store que hay en el Centro Comercial de La Maquinista a echar un vistazo. No íbamos demasiado convencidos, pero lo que vimos nos impresionó tanto que acabamos por llevarnos uno a casa. Estas tiendas están diseñadas para fardar. Al lado de cada producto tienen un iPad con las especificaciones y una comparativa de las características con otros productos de la familia. A eso se le llama ahorrar papel con clase. Además, tienen un botón con el que llamar al dependiente asignado a esa zona. Nada más pulsarlo, viene a atenderte y a intentar venderte lo que sea.</p>
<p>A nosotros no nos convencía el tema de ver películas y series en la tele. Con el anterior PC lo teníamos bastante bien montado, ya que la Xbox 360 se conectaba al Windows Media Center y se lo tragaba todo. Podíamos ver cualquier cosa por <em>streaming</em>. Preguntamos si había algo parecido para Mac y nos mostraron el Apple TV. Un pequeño cacharrito con salida HDMI y un mando diminuto que se conecta a tus librerías de iTunes y con el que se pueden ver películas, series, fotos o escuchar música. Por el precio que tiene (alrededor de 100€, si no recuerdo mal), vale mucho la pena. Sobre todo, porque nos lo llevamos del salón al dormitorio cuando queremos y vemos lo que nos da la gana con total comodidad.</p>
<p>Lo único que le falta al Apple TV es reproducir DivX, Xvid, Mkv&#8230; y esos formatos que todos conocemos. En teoría está diseñado para ver las películas descargadas desde iTunes (o alquiladas desde el propio reproductor, que también tiene ese servicio), pero como la comunidad de usuarios no es tonta se puede <em>jailbreakear</em> para meterle un programita que libere el potencial oculto del chisme y se pueda reproducir de todo. Y si no, siempre puedes convertirlos a un formato compatible nada más bajártelos. Allá tú.</p>
<p>El caso es que estamos encantados con el pack iMac + Apple TV. Mira que yo me gano la vida programando en entorno Microsoft, pero desde que probé el Mac OS he llegado a la conclusión de que he vivido engañado toda mi vida. Facilidad de uso, comodidad, sencillez, diseño, rapidez&#8230; todo le da veinte patadas a Windows en cualquier punto comparable. Lo único que echo de menos son los juegos, que no hay demasiados (aunque haberlos, haylos). Pero por lo demás, he estado haciendo el tonto. Probar Mac OS viniendo de Windows es como probar un coche automático viniendo de uno de marchas. Te preguntas por qué narices no se fabrican todos los coches así y qué sentido tiene tener que aprender a usar un embrague y una palanca de cambios en pleno 2011.</p>
<p><a href="http://dandel.es/wp-content/uploads/2011/08/magic-trackpad.jpg"><img class="aligncenter size-full wp-image-179" title="magic trackpad" src="http://dandel.es/wp-content/uploads/2011/08/magic-trackpad.jpg" alt="" width="434" height="276" /></a></p>
<p>Lo que más me ha gustado es una tableta táctil que venden ahora con los iMac. Puedes escoger entre el ratón de toda la vida (de diseño Apple, eso sí) o el bautizado como <strong>Magic Trackpad</strong>. Es algo así como el área táctil de todos los portátiles, pero para escritorio. La gran ventaja es que es multitáctil, por lo que es capaz de distinguir cuándo la pulsas con varios dedos. Unido a las posibilidades del sistema operativo, es la mejor interfaz para controlar un ordenador que he utilizado en mi vida. El Mac OS reconoce gestos que hacemos con los dedos en el trackpad, por lo que con dos dedos haremos scroll en las páginas web (horizontal o vertical), con tres dedos podemos ir hacia atrás o pasar fotos, también podemos hacer el gesto de ampliar, despejar el escritorio con cuatro dedos&#8230; todo completamente configurable. Si esto se incorpora en el mundo Windows, el ratón tiene los días contados.</p>
<p>En fin, que estamos muy contentos. Obviamente, no todo es como te lo venden. Te dicen que Mac OS no se cuelga, no tiene virus, no te irá nunca lento&#8230; y no es cierto. Se cuelga, te va lento si tienes demasiadas cosas abiertas y, si bien es cierto que el 90% de los virus existentes no le afectan (por estar programados para Windows), también hay virus para Mac y hay que andarse con ojo. Pero por lo demás, vale mucho la pena para cualquier usuario que quiera el ordenador para cualquier cosa que no sea jugar.</p>
<p>Eso sí, habrá que mirarse un portátil o algo. Ahora tenemos que pedir hora para usarlo <img src='http://dandel.es/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://dandel.es/comprado-imac/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Keep it simple, stupid!</title>
		<link>http://dandel.es/simple-stupid</link>
		<comments>http://dandel.es/simple-stupid#comments</comments>
		<pubDate>Sun, 29 May 2011 21:14:58 +0000</pubDate>
		<dc:creator>dandel</dc:creator>
				<category><![CDATA[Artículos]]></category>

		<guid isPermaLink="false">http://dandel.es/?p=130</guid>
		<description><![CDATA[Dejémoslo claro desde el principio: la sencillez es mucho más compleja de uno puede llegar a pensar. El principio KISS (Keep it Simple, Stupid! o &#8220;¡Mantenlo simple, estúpido!&#8221;) es una de mis premisas en la ingeniería, a pesar de que &#8230; <a href="http://dandel.es/simple-stupid">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://dandel.es/wp-content/uploads/2011/05/keep-it-simple-stupid-kiss.jpg"><img class="alignright size-thumbnail wp-image-153" title="keep-it-simple-stupid-kiss" src="http://dandel.es/wp-content/uploads/2011/05/keep-it-simple-stupid-kiss-150x150.jpg" alt="" width="150" height="150" /></a>Dejémoslo claro desde el principio: la <strong>sencillez es mucho más compleja de uno puede llegar a pensar</strong>. El principio <strong>KISS</strong> (<em>Keep it Simple, Stupid! </em>o &#8220;¡Mantenlo simple, estúpido!&#8221;) es una de mis premisas en la ingeniería, a pesar de que no siempre soy capaz de aplicarlo.</p>
<p>En realidad se trata de un principio que tiene validez en cualquier ámbito de la vida. Tiene distintas variantes y quizás la más conocida es la de la <strong>Navaja de Ockham</strong>. La solución más sencilla suele ser la correcta. En programación, una codificación sencilla, breve y limpia siempre será más óptima que otra más complicada y elaborada. En un diseño web, eliminar los elementos innecesarios de la interfaz para hacerla lo más usable posible es un trabajo constante de iteración y reflexión.</p>
<p><span id="more-17767"></span></p>
<p>Si las tendencias en el <strong>diseño web </strong>se dirigen cada vez más al <strong>minimalismo</strong> es precisamente para intentar buscar la mínima expresión de lo que se quiere transmitir de la forma más sencilla. En el Románico, la literatura estaba relegada a los textos religiosos y sólo se copiaban libros en los monasterios, con aquellas tipografías germánicas tan recargadas y antinaturales. Con la llegada de la imprenta, la sencillez se abrió camino y los garabatos de los monjes dejaron paso al espacio en blanco y la prosa moderna.</p>
<p>Lo más sencillo siempre es mejor, aunque cueste dar con ello. Intento tenerlo siempre presente.</p>
]]></content:encoded>
			<wfw:commentRss>http://dandel.es/simple-stupid/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notepad++ Bueno, bonito y barato</title>
		<link>http://dandel.es/notepad-bueno-bonito-barato</link>
		<comments>http://dandel.es/notepad-bueno-bonito-barato#comments</comments>
		<pubDate>Tue, 24 May 2011 05:20:10 +0000</pubDate>
		<dc:creator>dandel</dc:creator>
				<category><![CDATA[Recursos]]></category>

		<guid isPermaLink="false">http://dandel.es/?p=115</guid>
		<description><![CDATA[Notepad++ es mi aplicación preferida para visualizar y editar código rápidamente, sobre todo cuando se trata de php, jQuery, CSS o HTML puro. Es decir, lenguajes interpretados o lenguajes de marcado. Obviamente, no tiene la potencia de un IDE en &#8230; <a href="http://dandel.es/notepad-bueno-bonito-barato">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong><a href="http://dandel.es/wp-content/uploads/2011/05/nppLogo.png"><img class="alignright size-full wp-image-118" title="nppLogo" src="http://dandel.es/wp-content/uploads/2011/05/nppLogo.png" alt="Notepad++" width="187" height="138" /></a>Notepad++</strong> es mi aplicación preferida para visualizar y editar código rápidamente, sobre todo cuando se trata de <strong>php</strong>, <strong>jQuery</strong>, <strong>CSS</strong> o <strong>HTML</strong> puro. Es decir, <a href="http://es.wikipedia.org/wiki/Lenguaje_de_marcado">lenguajes interpretados</a> o <a href="http://es.wikipedia.org/wiki/Lenguaje_de_marcado">lenguajes de marcado</a>. Obviamente, no tiene la potencia de un IDE en condiciones, con su <em>intellisense</em> y otras utilidades, pero también prescinde de características que no me servirían para nada y un consumo de memoria abusivo. He llegado a crear todo un portal utilizando únicamente este programa sin echar nada en falta.</p>
<p><strong>Descarga:</strong> <a title="Notepad++" href="http://notepad-plus-plus.org/">Notepad++</a></p>
<p><span id="more-17766"></span></p>
<h2>Características</h2>
<p><strong>Notepad++</strong> es un editor texto de <strong>código abierto</strong>, además de <strong>gratuito</strong>. Funciona sobre Windows, algo que puede echar atrás a los que utilicen otro sistema operativo. Pero en mi caso, ya me va bien.</p>
<p>Entre otras opciones, es capaz de reconocer el código introducido y destacar las palabras clave por colores, ejecutar macros que habremos grabado previamente y un decente &#8220;autocompletar&#8221; que, si bien no tirará de la documentación oficial, sí que nos ahorrará unos valiosos segundos a la hora de codificar. Otras de sus características son más curiosas que útiles, como el reconocimiento de gestos del ratón para manejar las pestañas. Echo de menos un buen comparador de código, pero podemos encontrarlo en forma de plugin.</p>
<p>He probado otros editores, pero siempre me han parecido demasiado complejos y he terminado volviendo a <strong>Notepad++</strong>, con el que ya llevo unos años. De todas formas, si conocéis otro mejor, estoy abierto a sugerencias.</p>
<p><strong>Descarga:</strong> <a title="Notepad++" href="http://notepad-plus-plus.org/">Notepad++</a></p>
]]></content:encoded>
			<wfw:commentRss>http://dandel.es/notepad-bueno-bonito-barato/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

