<?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>Entre Códigos &#187; taller</title>
	<atom:link href="http://www.entrecodigos.com/temas/taller/feed" rel="self" type="application/rss+xml" />
	<link>http://www.entrecodigos.com</link>
	<description>Reflexiones de un cerebro en fuga y artículos sobre posicionamiento, e-marketing, usabilidad y otros tecnicismos.</description>
	<lastBuildDate>Wed, 25 Jan 2012 07:45:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Abriendo las pestañas de Firefox al antiguo modo</title>
		<link>http://www.entrecodigos.com/2010/03/abriendo-las-pestanas-de-firefox-al-antiguo-modo.html</link>
		<comments>http://www.entrecodigos.com/2010/03/abriendo-las-pestanas-de-firefox-al-antiguo-modo.html#comments</comments>
		<pubDate>Thu, 18 Mar 2010 13:16:08 +0000</pubDate>
		<dc:creator>Ruben Cantón</dc:creator>
				<category><![CDATA[taller]]></category>

		<guid isPermaLink="false">http://www.entrecodigos.com/?p=1574</guid>
		<description><![CDATA[
Bueno, tras unos días con Firefox detrás mío avisándome de una nueva versión finalmente he actualizado. Lo primero que he visto es que te muestran la opción de incluir un theme en tu Firefox nada más instalar (opción que si no me equivoco ya existía antes) y unos minutos después descubro que al abrir una [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://img715.imageshack.us/img715/1518/firefoxtrucos.jpg" alt="Firefox 3.6" class="aligncenter" /><br />
Bueno, tras unos días con Firefox detrás mío avisándome de una nueva versión <strong>finalmente he actualizado</strong>. Lo primero que he visto es que te muestran la opción de incluir un theme en tu Firefox nada más instalar (opción que si no me equivoco ya existía antes) y unos minutos después descubro que al abrir una nueva pestaña ésta no se abre al final de mi barra de pestañas sino al lado de la que tengo activa.</p>
<p><strong>¡Menudo horror! ¡Qué tragedia! ¡Qué será de mí!</strong> He pensado mientras me equivocaba varias veces al ir en busca de mi nueva pestaña, cansado de confundir mi cerebro con el nuevo y antiguo modo y convencido de que lo antiguo es mejor porque yo soy así de conservador e inmovilista he rebuscado entre las opciones de configuración de Firefox para cambiar ese comportamiento claramente anómalo propiciado por el club Blinderberg para impedir que yo pueda navegar por Menéame.</p>
<p>Sin éxito. Desmoralizado y hundido descubro que <strong>Firefox no permite cambiar al modo anterior para abrir tus pestañas</strong>, empiezo a pensar en volver a la versión anterior y quedarme en ella por toda la eternidad, me imagino a mí en el 2020 usando Firefox 3.4 mientras una ventana de emergencia me avisa de que la versión 13 está disponible y de que soy un peligro para la humanidad por utilizar semejante reliquia. Desisto, considero que es mejor acostumbrarme al nuevo estilo de vida, tendré que joderme y desorientarme con las pestañas&#8230; o no.</p>
<p>Entonces me da por probar de comentarle a los desarrolladores de firefox que existe gente ultraconservadora como yo y que el mundo podría tocar a su fin en 2012, eso no tiene nada que ver, pero le da más dramatismo. Y un amable y super genio desarrollador de Firefox me muestra el camino a la luz y la forma de conseguir que mis pestañas vuelvan a abrirse en orden, de forma que yo sepa cuál abrí primero y cuál abrí la última y no me pierda:</p>
<p><strong>Paso 1</strong><br />
Abre una nueva pestaña y escribe en la barra de direcciones about:config</p>
<p><strong>Paso 2</strong><br />
Seguramente te saldrá el siguiente mensaje, dale al botón para seguir adelante:<br />
<img src="http://img299.imageshack.us/img299/4840/configfirefox.jpg" alt="Configuración avanzada de Firefox" class="aligncenter" /></p>
<p><strong>Paso 3</strong><br />
Busca la opción browser.tabs.insertRelatedAfterCurrent y dale doble click para cambiar su valor a false. Puedes usar el filtro de la parte de arriba para encontrarla más fácilmente.</p>
<p>¡Violá! <strong>Las pestañas vuelven a abrirse como antes</strong>, el sol brilla más (sí, el sol también estaba preocupado) y hasta el gobierno dice que bajará los impuestos, bueno puede que esto último no, pero después de lo vivido ¿a quién le importa? =)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.entrecodigos.com/2010/03/abriendo-las-pestanas-de-firefox-al-antiguo-modo.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Open source Captcha para PHP</title>
		<link>http://www.entrecodigos.com/2010/03/open-source-captcha-para-php.html</link>
		<comments>http://www.entrecodigos.com/2010/03/open-source-captcha-para-php.html#comments</comments>
		<pubDate>Wed, 17 Mar 2010 04:56:05 +0000</pubDate>
		<dc:creator>Ruben Cantón</dc:creator>
				<category><![CDATA[taller]]></category>

		<guid isPermaLink="false">http://www.entrecodigos.com/?p=1567</guid>
		<description><![CDATA[Uno de los filtros antispam más comunes se conoce como Captcha y consiste en una imagen con una palabra escrita que el usuario humano debe escribir en un cuadro de texto para así ponérselo difícil a los bots de SPAM. El proceso resulta molesto para el usuario pero puede ayudar a filtrar el spam y [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de los filtros antispam más comunes se conoce como <strong>Captcha</strong> y consiste en una imagen con una palabra escrita que el usuario humano debe escribir en un cuadro de texto para así ponérselo difícil a los bots de SPAM. El proceso resulta molesto para el usuario pero puede ayudar a filtrar el spam y en algunos casos incluso a evitar una oleada que casi tumbe tu servidor.</p>
<p>Si estás pensando en colocar uno de estos módulos en tu web te aviso de que existen opciones de código abierto (open source) como <strong>Secureimage, un captcha en PHP open source</strong> que puedes <a href="http://www.phpcaptcha.org/download">descargarte en su página oficial</a>.</p>
<p>Para instalar éste Captcha open source en tu web basta con que descomprimas el archivo en el directorio de la misma e introduzcas las siguientes líneas de código:</p>
<p>Primero, pon ésta línea de código en donde quieras que se muestre la imagen con la palabra. Cuidado con la ruta de la imagen, ha de coincidir con la ruta en que se encuentra ese archivo en tu web.</p>
<pre>&lt;img id="captcha" src="/securimage/securimage_show.php" alt="CAPTCHA Image" /></pre>
<p>Segundo, pon ésta otra línea de código que será el cuadro en que el usuario deberá escribir la palabra. Ojo con la propiedad name que la necesitaremos luego.</p>
<pre>&lt;input type="text" name="captcha_code" size="10" maxlength="6" /></pre>
<p>Opcionalmente tenemos la posibilidad de habilitar la opción de recargar imagen por si el usuario es incapaz de reconocer la imagen generada automáticamente. Fíjate en que la id de la imagen anterior ha de coincidir con lo que apunta el getElementById y en que nuevamente la nueva ruta de la imagen debe coincidir con el archivo en tu web.</p>
<pre>&lt;a href="#" onclick="document.getElementById('captcha').src = '/securimage/securimage_show.php?' + Math.random(); return false">Cargar otra imagen.&lt;/a></pre>
<p>Ahora que ya tenemos preparada la interfaz que utilizará el usuario, debemos colocar un código en el servidor que recogerá lo enviado por el usuario y analizará si es o no correcto. Hay varias formas de hacer esto, yo he empleado un postback sobre la misma página, por tanto, establezco un condicional que en caso de estar realizando un postback y ya que en esa página es el único formulario posible comprueba que todo sea correcto.</p>
<p>Dentro del postback hay que colocar las siguientes instrucciones. Ojo con session_start(); que debe ejecutarse antes de que se haya escrito ningún HTML, lo mejor es colocarlo a principio de toda la página pero puedes ponerlo más abajo siempre que te asegures de que no se ha escrito nada de HTML aún.</p>
<pre>if( strtoupper( $_SERVER['REQUEST_METHOD'] ) == "POST" ) { // Es un postback
  session_start();
  include './ModCaptcha/securimage.php';
  $securimage = new Securimage();

  if ($securimage->check($_POST['captcha_code']) == false) {
    // El código no es correcto
  } else {
    // Envío email
  }
}</pre>
<p>Como ves, tras crear y cargar el objeto Secureimage comprobamos si el código introducido por el usuario es correcto, a partir de aquí te toca a ti realizar las distintas operaciones para mostrar el error o enviar el mensaje etc.</p>
<p>Si te interesa colocar otro diseño a la imagen generada tienes <a href="http://www.phpcaptcha.org/captcha-gallery/">varias opciones en ésta galería</a>. Si quieres ver un ejemplo puedes pasarte por <a href="http://www.rubencanton.com/contact.php">el formulario de contacto de mi web</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.entrecodigos.com/2010/03/open-source-captcha-para-php.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Page Rank, backlinks y enlaces internos</title>
		<link>http://www.entrecodigos.com/2009/11/page-rank-backlinks-y-enlaces-internos.html</link>
		<comments>http://www.entrecodigos.com/2009/11/page-rank-backlinks-y-enlaces-internos.html#comments</comments>
		<pubDate>Mon, 30 Nov 2009 12:08:04 +0000</pubDate>
		<dc:creator>Ruben Cantón</dc:creator>
				<category><![CDATA[google]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[taller]]></category>

		<guid isPermaLink="false">http://www.entrecodigos.com/?p=1428</guid>
		<description><![CDATA[Quizás no haya nada más importante en SEO que el Page Rank y las múltiples formas de aumentar el mismo en tu página, muchas de ellas al límite de las recomendaciones Google e incluso fuera de él que han provocado más de un baneo y múltiples penalizaciones a SEOs de todo el mundo.
¿Qué es el [...]]]></description>
			<content:encoded><![CDATA[<p>Quizás no haya nada más importante en SEO que el Page Rank y las múltiples formas de aumentar el mismo en tu página, muchas de ellas al límite de las recomendaciones Google e incluso fuera de él que han provocado más de un baneo y múltiples penalizaciones a SEOs de todo el mundo.</p>
<p><H2>¿Qué es el Page Rank?</H2></p>
<p>Lo primero que hay que decir sobre el Page Rank es que <strong>gracias a este sistema Google es hoy día lo que es</strong>, ya que gracias a él sus búsquedas fueron mucho más eficaces y supuso en su día una revolución. En su base, el Page Rank funciona como un sistema democrático con enlaces, de forma que cada enlace (<a href="#">hipervínculo</a>) que enlaza a una página funciona como un voto a esa página, y por tanto, si 500 webs enlazan una página la idea es que esa página debe ofrecer mejor información que la que no recibe ningún enlace. Así, para una palabra clave determinada, una página será más relevante que otra en función de los enlaces que apunten a la misma.</p>
<p><img class="aligncenter" src="http://img20.imageshack.us/img20/3294/pagerank.png" alt="Votos entre páginas" /><br />
Dicho esto parece fácil hacer SEO, si colocamos 500 enlaces seguidos a una página desde otra conseguiremos que la misma se posicione mejor, y os aseguro que <strong>éste truco funcionaba</strong> y yo mismo llegué a utilizarlo años atrás, pero las granjas de enlaces pasaron a mejor vida hace años y ahora resulta bastante más difícil conseguir enlaces entrantes válidos que apunten a tu página.</p>
<p><span id="more-1428"></span><strong>¿Enlace entrante válido?</strong> Vale. Primero aclaremos lo que es un enlace entrante o sus múltiples sinónimos (backlink, backwardlink, inbound link, incoming link, &#8230;), un enlace entrante se refiere a un enlace que desde una web externa se realiza a tu web. El enlace será válido <strong>o de mayor valor</strong> si cumple con las siguientes características:</p>
<ul>
<li>Distinto propietario de la web origen.</p>
<li>Distinto servidor de la web origen.
<li>La web origen no recibe enlaces desde la web destino (lo que se conoce como cross-linking)
<li>La web origen tiene un contexto igual al de la web destino
<li>El enlace en la web origen parece natural (embebido en el texto, gramática correcta, etc.).
<li>El Page Rank de la web origen.
<li>Cualquier cosa futura que a Google se le ocurra tener en cuenta.
</ul>
<p>Por tanto, y en resumen, el Page Rank mide el valor de tu página, <strong>a mayor Page Rank mayor peso y por tanto más posibilidades de estar arriba en los resultados de Google</strong>. A causa de la existencia de los SEOs y de la manipulación del Page Rank por parte de los mismos consiguiendo enlaces fraudulentos Google lleva años batallando por desenmascarar dichas prácticas penalizándolas y mejorando su algoritmo, hasta el punto de que <strong>a día de hoy el Page Rank cuenta mucho menos que en el pasado</strong> a la hora de posicionar una página.</p>
<h2>¿Cómo se calcula el Page Rank?</h2>
<p>Aunque existe <a href="http://es.wikipedia.org/wiki/PageRank">una fórmula tan secreta como la de la Coca Cola</a> que se encarga de calcular esto (y si hablásemos de la que calcula el posicionamiento final, que encima es variable, ni os cuento), la idea es bastante sencilla:</p>
<p>Cada página que te enlace te da un voto, y por tanto ganas Page Rank salvo que Google considere que has hecho trampas y no cuente ese enlace. El Page Rank que ganas depende del Page Rank que tenía la página origen y de la cantidad de enlaces de la misma. Teniendo en cuenta que en la fórmula de cálculo del Page Rank <strong>se divide el PR de la página por el total de enlaces en la misma</strong>, a mayor cantidad de enlaces menos PR se entrega a cada uno, y por tanto, una página con PR10 y mil enlaces puede estar entregándote menos PR que otra con PR5 y un sólo enlace.</p>
<p>Por decirlo de alguna manera más clara, pongamos que cada página tiene un pastel y divide el pastel entre la cantidad de comensales (enlaces), a mayor cantidad de comensales menos pastel para cada uno, pero el tamaño del pastel depende de la página (PR1 a PR10).</p>
<p>Dicho esto, parece que todas nuestras páginas tienen un jugoso pastel, y podemos repartirlo generosamente o ser cuidadosos y alimentar primero a nuestros niños. ¿Lo que? Fácil. El pastel no sólo se reparte entre tus propias páginas sino que también se reparte entre los invitados (páginas externas), por tanto, si tienes una página con 5 enlaces a tus páginas internas y 5 enlaces a páginas externas, estás regalando la mitad de tu pastel.</p>
<h2>¿Cómo mido mi Page Rank?</h2>
<p>Existen muchos plugins o webs que miden el PR de tu página, pero quizás la forma más cómoda y segura es <a href="http://www.google.com/intl/es/toolbar/ff/index.html">instalar la barra Google</a>, ya que la misma incorpora un medidor de Page Rank que te va diciendo el PR de cada página que visitas, y al ser la barra de Google, ¡no hay nada más fiable que eso!</p>
<h2>Utilizar tu PR de forma inteligente</h2>
<p>Una vez que sabemos lo que es el PR, mas o menos cómo se calcula y que lo mejor es conservarlo, debemos aprender a utilizar el mismo con la máxima eficacia. Lo primero, diferenciar entre enlaces externos (backlinks) y enlaces internos:</p>
<p>Un <strong>enlace externo</strong> es un enlace que va de un dominio a otro, mientras que un <strong>enlace interno</strong> es un enlace que apunta dentro de un mismo dominio. Un dominio es el nombre de una web, por ejemplo: www.entrecodigos<strong>.com</strong>, pero ojo, porque el dominio www.entrecodigos<strong>.es</strong> cuenta como distinto a menos que exista una redirección al .com.</p>
<p><img class="alignright" src="http://img28.imageshack.us/img28/8389/prgoogle.jpg" alt="Page Rank Google" />Dicho esto, imaginemos que la página principal de nuestra web -que suele ser la que tiene más PR- consigue PR5, bien, si en esta página principal el 40% de los enlaces son externos, estaremos perdiendo el 40% del mayor peso de nuestra web, que es la página principal, para regalarlo a páginas externas. Para evitarlo, podemos tener cuidado con a quien enlazamos en nuestras páginas con más peso o utilizar <a href="http://www.entrecodigos.com/2007/11/robots-nofollow-noindex.html">el nofollow del que os hablé en éste post</a>.</p>
<p>Pero eso no es lo único que debemos tener en cuenta, ya que nuestra página tiene que competir con otras en posicionamiento, es posible que nos queramos posicionar para las palabras clave &#8220;viajes costa brava&#8221; y para &#8220;cristalería costa brava&#8221;, como te puedes imaginar, la primera opción tiene más dificultades y requiere de más fuerza que la segunda, por ese motivo podríamos canalizar nuestro PR hacia la página que requiere de más fuerza y no tanto a la que requiere menos.</p>
<p><strong>¿Cómo se hace esto?</strong> Pues básicamente reduciendo la cantidad de enlaces o colocando nofollows a todos los que no quieres darles un cachito del pastel. Ten en cuenta que cuanto más pastel entregues más peso tendrán tus páginas, por lo que debes alimentar mejor aquellas que quieres sean más relevantes o que necesitan más peso para posicionarse. Por otro lado, si en tus páginas colocas muchos enlaces internos la mayor cantidad del pastel irá a parar a tu web, mientras que si colocas pocos los enlaces externos que tengas se llevaran algo que podría interesarte.</p>
<p>Y para terminar, recuerda que <strong>para aumentar tu pastel necesitas que los demás te den parte del suyo</strong>, así que procura conseguirte enlaces entrantes válidos. Cuantas más páginas tenga tu web también tendrás más peso, pero lo que te hará engordar son los enlaces entrantes, los internos son sólo para repartir lo que te llega o para evitar que se escape.</p>
<p>Un <strong>ejemplo práctico</strong> de esto sería <a rel="nofollow" href="http://www.joserodriguez.info/bloc/?p=2581">éste post de José Rodríguez</a> (Administrador de la web de UGT Catalunya y a quien tengo el placer de conocer en persona), en el que enlaza a muchísimos bloggers al final del mismo pero <strong>no les entrega PR</strong> (ha puesto el nofollow) excepto al Secretario General de UGT Catalunya, Josep María Álvarez, y a su amigo Rubén Novoa con quien tiró adelante esa iniciativa. Lo mejor de todo es que los enlazados puede que le devuelvan el enlace desconociendo que ellos seguramente sí le estén entregando PR&#8230; y encima ha quedado como un señor <img src='http://www.entrecodigos.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <strong>Actualización</strong>: Parece que Jose no hizo eso intencionadamente, lo cual no quita que era un buen ejemplo, así que lo dejo.</p>
<p>Otro truco que puede serte útil es compartir enlaces con otras webs, Google ya tiene eso en cuenta y valora menos esos enlaces por Cross-linking, pero todavía los valora <img src='http://www.entrecodigos.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Eso sí, si compartes enlaces sé ético y no pongas nofollow!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.entrecodigos.com/2009/11/page-rank-backlinks-y-enlaces-internos.html/feed</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>Diferencia wordpress entre urls mayúsculas y minúsculas?</title>
		<link>http://www.entrecodigos.com/2009/09/diferencia-wordpress-urls-mayusculas-yminuscula.html</link>
		<comments>http://www.entrecodigos.com/2009/09/diferencia-wordpress-urls-mayusculas-yminuscula.html#comments</comments>
		<pubDate>Tue, 15 Sep 2009 13:49:30 +0000</pubDate>
		<dc:creator>Ruben Cantón</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[taller]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.entrecodigos.com/?p=1328</guid>
		<description><![CDATA[Bueno, finalmente he actualizado a la versión 2.8.4, un poco tarde pero las vacaciones han sido largas este año&#8230; xD
Lo único que me gustaría comentar es un pequeño problema que he tenido con las urls y que me ha llevado unas horas solucionar. Como muchos, tengo un módulo de rewriting y urls virtuales para el [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno, finalmente he actualizado a la versión 2.8.4, un poco tarde pero las vacaciones han sido largas este año&#8230; xD</p>
<p>Lo único que me gustaría comentar es un pequeño problema que he tenido con las urls y que me ha llevado unas horas solucionar. Como muchos, tengo un módulo de <strong>rewriting y urls virtuales</strong> para el blog que hasta ahora no me había dado problemas (*ejem*, bueno, no demasiados&#8230; ¬¬) y tras actualizar la versión la home dejaba de funcionar.</p>
<p>Volviendo atrás en la actualización la Home funcionaba de nuevo, quitando el theme la cosa no se arreglaba y tras mirar configuraciones por todas partes lo único que saqué en claro fue que todas las páginas funcionaban menos la home (<a href="http://www.entrecodigos.com">http://www.entrecodigos.com</a>).</p>
<p>Tras pedirle ayuda a Victor, mi ángel de la guarda en businet, éste ha conseguido que el blog por lo menos mostrara un mensaje de error y a partir de aquí e investigando he llegado a encontrar el problema: el servidor tenía configurado por defecto que si no se le solicitaba una página mostrara Index.php (y una lista de otras posibles opciones) como suele hacerse, pero si os fijáis Index está escrito con mayúscula.</p>
<p>Por algún motivo, lo que antes wordpress pillaba sin problemas ahora era incapaz de mostrártelo. Modificando el rewriter y forzando a minúsculas la url he conseguido solucionar esto. Pero mi pregunta es&#8230; <strong>¿han cambiado algo en wordpress que ahora diferencia entre mayúsculas y minúsculas en las URLs o es algo que yo no he tenido en cuenta?</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.entrecodigos.com/2009/09/diferencia-wordpress-urls-mayusculas-yminuscula.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cómo funciona el sistema de subastas de AdWords</title>
		<link>http://www.entrecodigos.com/2009/07/sistema-subastas-adwords.html</link>
		<comments>http://www.entrecodigos.com/2009/07/sistema-subastas-adwords.html#comments</comments>
		<pubDate>Mon, 06 Jul 2009 07:00:28 +0000</pubDate>
		<dc:creator>Ruben Cantón</dc:creator>
				<category><![CDATA[google]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[taller]]></category>

		<guid isPermaLink="false">http://www.entrecodigos.com/?p=1249</guid>
		<description><![CDATA[Hace unos meses Google colgó este interesante vídeo en Youtube y el otro día me lo encontré de nuevo y decidí colgarlo ya que me parece muy interesante:

]]></description>
			<content:encoded><![CDATA[<p>Hace unos meses Google colgó este interesante vídeo en Youtube y el otro día me lo encontré de nuevo y decidí colgarlo ya que me parece muy interesante:</p>
<p><object width="480" height="295"><param name="movie" value="http://www.youtube.com/v/K7l0a2PVhPQ&#038;hl=es&#038;fs=1&#038;rel=0&#038;hd=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/K7l0a2PVhPQ&#038;hl=es&#038;fs=1&#038;rel=0&#038;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.entrecodigos.com/2009/07/sistema-subastas-adwords.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Probando el rendimiento de LINQ en ASP.Net</title>
		<link>http://www.entrecodigos.com/2009/07/probando-el-rendimiento-de-linq-en-aspnet.html</link>
		<comments>http://www.entrecodigos.com/2009/07/probando-el-rendimiento-de-linq-en-aspnet.html#comments</comments>
		<pubDate>Fri, 03 Jul 2009 07:00:44 +0000</pubDate>
		<dc:creator>Ruben Cantón</dc:creator>
				<category><![CDATA[laboratorio]]></category>
		<category><![CDATA[taller]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[linq]]></category>

		<guid isPermaLink="false">http://www.entrecodigos.com/?p=1096</guid>
		<description><![CDATA[
Después de haber aprendido lo que es LINQ y cómo funciona, es obligado ver si, además de simplificar el código, mejora la eficiencia de nuestro proyecto.
Me he decidido por probar la lectura de archivos XML por parte de LINQ y determinar quien tiene mayor velocidad de lectura, la librería de acceso a XML de .Net [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://img5.imageshack.us/img5/6633/linqbanner.jpg" class="aligncenter" alt="LINQ" /><br />
Después de haber aprendido lo <a href="http://www.entrecodigos.com/2009/05/iniciacion-a-linq-en-aspnet.html">que es LINQ y cómo funciona</a>, es obligado ver si, además de simplificar el código, mejora la eficiencia de nuestro proyecto.</p>
<p>Me he decidido por <strong>probar la lectura de archivos XML por parte de LINQ</strong> y determinar quien tiene mayor velocidad de lectura, la librería de acceso a XML de .Net o la nueva tecnología: LINQ. Para ello, <strong>he creado un XML con 100.000 registros</strong> que simula una tabla de alumnos y realizaré consultas a dicho XML.</p>
<p>Éstas son las consultas que he decidido realizar utilizando ambos sistemas:</p>
<ul>
<li><strong>Prueba 1</strong>: Extraer todos los alumnos que se llamen Jorge.</li>
<li><strong>Prueba 2</strong>: Contar cuantos alumnos han aprobado.</li>
<li><strong>Prueba 3</strong>: De entre los alumnos que se llaman Jorge, ¿cuántos han suspendido?</li>
<li><strong>Prueba 4</strong>: De entre los alumnos que han sacado más de un 8, ¿cual es el nombre más predominante?</li>
<li><strong>Prueba 5</strong>: Extraer sólo los nombres distintos de los alumnos y ordenarlos..</li>
</ul>
<p><span id="more-1096"></span>Y tras lanzar las mismas aquí están, en segundos, los tiempos que ha tardado cada método en cada una de las consultas anteriores:</p>
<table border="1" bordercolor="grey" cellpadding="4" cellspacing="0" style="margin:0 auto;">
<tr style="text-align:center;">
<td>Prueba</td>
<td>XML Reader</td>
<td>LINQ</td>
</tr>
<tr>
<td>1</td>
<td>0,301934</td>
<td>0,000036</td>
</tr>
<tr>
<td>2</td>
<td>0,589991</td>
<td>0,090168</td>
</tr>
<tr>
<td>3</td>
<td>0,390582</td>
<td>0,054944</td>
</tr>
<tr>
<td>4</td>
<td>0,432305</td>
<td>0,091441</td>
</tr>
<tr>
<td>5</td>
<td>0,281885</td>
<td>0,042886</td>
</tr>
</table>
<p>Se puede apreciar claramente la diferencia en velocidades de acceso, siendo el <strong>XML Reader entre 7 y 8 veces más lento que LINQ</strong>. Pero además, las consultas en LINQ me han ocupado entre 1 y 3 líneas (y porque he querido dividirlo en líneas) mientras que las realizadas con el antiguo método ocupaban entre 10 y 30 líneas.</p>
<p>Por todo esto, LINQ parece batir al XML Reader tanto en velocidad de acceso como en simplificación de código, lo que <strong>reduce errores y costes de producción o mantenimiento</strong>.</p>
<p>Sé que <strong>existen otros métodos para acceder a un XML</strong> en .Net (la librería de XML ofrece otras opciones), pero yo me he decantado por ésta, quizás alguna otra resultase más eficiente, pero tras realizar varias pruebas con LINQ, realmente me ha convencido como tecnología de acceso a conjuntos de datos.</p>
<p>Por último, dejo aquí el código fuente utilizado, por si a alguien le pica la curiosidad o he metido la pata y alguien puede corregirme:</p>
<pre>
    Private Sub TestVelocidad1()
Dim rutaArchivo As String = "C:/test/xmlAlumnos100.xml"
Dim metodoReader As System.Xml.XmlTextReader
Dim metodoLINQ As System.Xml.Linq.XDocument = System.Xml.Linq.XDocument.Load(rutaArchivo)
Dim lstAlumnos As New Collections.Generic.List(Of Alumno)
Dim lstNombres As New Collections.Generic.List(Of String)
Dim oAlumno As Alumno = Nothing
Dim notaAux As Byte = 0
Dim cantAprobados As Integer = 0
Dim cantSuspendidos As Integer = 0

Page.Trace.IsEnabled = True

'Prueba 1: Extraer todos los alumnos que se llamen Jorge.
Trace.Warn("Empieza la prueba 1")
Dim alumnos = From alum In metodoLINQ.Descendants("alumno") _
Where alum.Attribute("nombre") IsNot Nothing AndAlso alum.Attribute("nombre").Value = "Jorge" _
Select Nombre = alum.Attribute("nombre").Value, Nota = alum.Attribute("nota").Value
Trace.Warn("Fin prueba 1 con LINQ")

metodoReader = New System.Xml.XmlTextReader(rutaArchivo)
Do While metodoReader.Read
If metodoReader.NodeType = System.Xml.XmlNodeType.Element AndAlso metodoReader.Name = "alumno" AndAlso metodoReader.HasAttributes Then
oAlumno = New Alumno
While metodoReader.MoveToNextAttribute
If metodoReader.Name = "nombre" Then
oAlumno.Nombre = metodoReader.Value
If oAlumno.Nombre &lt;> "Jorge" Then Exit While
ElseIf metodoReader.Name = "nota" Then
Byte.TryParse(metodoReader.Value, oAlumno.Nota)
End If
End While
If oAlumno.Nombre = "Jorge" Then lstAlumnos.Add(oAlumno)
End If
Loop
Trace.Warn("Fin prueba 1 con Reader")

'Prueba 2: Contar cuantos alumnos han aprobado.
Trace.Warn("Empieza la prueba 2")
cantAprobados = (From alum In metodoLINQ.Descendants("alumno") Where alum.Attribute("nota") IsNot Nothing AndAlso Integer.Parse(alum.Attribute("nota").Value) > 4).Count
Trace.Warn("Fin prueba 2 con LINQ")

metodoReader = New System.Xml.XmlTextReader(rutaArchivo)
cantAprobados = 0
Do While metodoReader.Read
If metodoReader.NodeType = System.Xml.XmlNodeType.Element AndAlso metodoReader.Name = "alumno" AndAlso metodoReader.HasAttributes Then
notaAux = 0
While metodoReader.MoveToNextAttribute
If metodoReader.Name = "nota" Then
Byte.TryParse(metodoReader.Value, notaAux)
If notaAux > 4 Then cantAprobados += 1
End If
End While
End If
Loop
Trace.Warn("Fin prueba 2 con Reader")

'Prueba 3: De entre los alumnos que se llaman Jorge, ¿cuántos han suspendido?
Trace.Warn("Empieza la prueba 3")
cantSuspendidos = (From alum In metodoLINQ.Descendants("alumno") _
Where alum.Attribute("nombre") IsNot Nothing AndAlso alum.Attribute("nombre").Value = "Jorge" _
Where alum.Attribute("nota") IsNot Nothing AndAlso Integer.Parse(alum.Attribute("nota").Value) &lt; 5).Count
        Trace.Warn("Fin prueba 3 con LINQ")

        metodoReader = New System.Xml.XmlTextReader(rutaArchivo)
        cantSuspendidos = 0
        oAlumno = New Alumno
        Do While metodoReader.Read
            If metodoReader.NodeType = System.Xml.XmlNodeType.Element AndAlso metodoReader.Name = "alumno" AndAlso metodoReader.HasAttributes Then
                notaAux = 0 : oAlumno.Nombre = "" : oAlumno.Nota = 0
                While metodoReader.MoveToNextAttribute
                    If metodoReader.Name = "nota" Then Byte.TryParse(metodoReader.Value, oAlumno.Nota)
                    If metodoReader.Name = "nombre" Then oAlumno.Nombre = metodoReader.Value
                End While
                If oAlumno.Nombre = "Jorge" And oAlumno.Nota &lt; 5 Then cantSuspendidos += 1
            End If
        Loop
        Trace.Warn("Fin prueba 3 con Reader")

        'Prueba 4: De entre los alumnos que han sacado más de un 8, ¿cual es el nombre más predominante?
        Dim NombreMasEmpollon As String = ""
        Trace.Warn("Empieza la prueba 4")

        Dim empollon As Generic.List(Of String) = (From n In (From alum In metodoLINQ.Descendants("alumno") _
            Where (alum.Attribute("nota") IsNot Nothing AndAlso Integer.Parse(alum.Attribute("nota").Value) > <img src='http://www.entrecodigos.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> _
            Group alum By nombre = alum.Attribute("nombre").Value Into cantNombres = Count() _
            Select nombre, cantNombres Order By cantNombres Descending Order By cantNombres Descending Take 1) Select n.nombre).ToList
        NombreMasEmpollon = empollon.Item(0).ToString
        Trace.Warn("Fin prueba 4 con LINQ")

        metodoReader = New System.Xml.XmlTextReader(rutaArchivo)
        Dim klstNombres As New Generic.SortedList(Of String, Integer)
        oAlumno = New Alumno
        Do While metodoReader.Read
            If metodoReader.NodeType = System.Xml.XmlNodeType.Element AndAlso metodoReader.Name = "alumno" AndAlso metodoReader.HasAttributes Then
                oAlumno.Nombre = "" : oAlumno.Nota = 0
                While metodoReader.MoveToNextAttribute
                    If metodoReader.Name = "nota" Then Byte.TryParse(metodoReader.Value, oAlumno.Nota)
                    If metodoReader.Name = "nombre" Then oAlumno.Nombre = metodoReader.Value

                    If oAlumno.Nota > 0 And oAlumno.Nombre.Length > 0 Then
                        If oAlumno.Nota > 8 Then
                            If klstNombres.Keys.IndexOf(oAlumno.Nombre) &lt; 0 Then
                                klstNombres.Add(oAlumno.Nombre, 1)
                            Else
                                klstNombres.Item(oAlumno.Nombre) = klstNombres.Item(oAlumno.Nombre) + 1
                            End If
                        End If
                        Exit While
                    End If
                End While
            End If
        Loop
        NombreMasEmpollon = klstNombres.Keys(0)
        For Each n As String In klstNombres.Keys
            If klstNombres(n) > klstNombres(NombreMasEmpollon) Then
                NombreMasEmpollon = n
            End If
        Next
        Trace.Warn("Fin prueba 4 con Reader")

        'Prueba 5: Extraer sólo los nombres distintos de los alumnos y ordenarlos.
        Trace.Warn("Empieza la prueba 5")
        Dim nombres As String() = (From alum In metodoLINQ.Descendants("alumno") Select n = alum.Attribute("nombre").Value Distinct Order By n.ToString).ToArray
        Trace.Warn("Fin prueba 5 con LINQ")

        metodoReader = New System.Xml.XmlTextReader(rutaArchivo)
        lstNombres.Clear()
        Do While metodoReader.Read
            If metodoReader.NodeType = System.Xml.XmlNodeType.Element AndAlso metodoReader.Name = "alumno" AndAlso metodoReader.HasAttributes Then
                While metodoReader.MoveToNextAttribute
                    If metodoReader.Name = "nombre" Then
                        If lstNombres.IndexOf(metodoReader.Value) &lt; 0 Then
                            lstNombres.Add(metodoReader.Value)
                        End If
                        Exit While
                    End If
                End While
            End If
        Loop
        lstNombres.Sort()
        Trace.Warn("Fin prueba 5 con Reader")

    End Sub

Public Class Alumno

#Region "Variables"
    Private _nombre As String
    Private _nota As Byte
#End Region

#Region "Propiedades"
    Public Property Nombre() As String
        Get
            Return _nombre
        End Get
        Set(ByVal value As String)
            _nombre = value
        End Set
    End Property
    Public Property Nota() As Byte
        Get
            Return _nota
        End Get
        Set(ByVal value As Byte)
            _nota = value
        End Set
    End Property
#End Region

End Class
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.entrecodigos.com/2009/07/probando-el-rendimiento-de-linq-en-aspnet.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Iniciación a LINQ en ASP.Net</title>
		<link>http://www.entrecodigos.com/2009/05/iniciacion-a-linq-en-aspnet.html</link>
		<comments>http://www.entrecodigos.com/2009/05/iniciacion-a-linq-en-aspnet.html#comments</comments>
		<pubDate>Mon, 11 May 2009 14:22:29 +0000</pubDate>
		<dc:creator>Ruben Cantón</dc:creator>
				<category><![CDATA[informatica]]></category>
		<category><![CDATA[laboratorio]]></category>
		<category><![CDATA[taller]]></category>
		<category><![CDATA[tecnologia]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[linq]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.entrecodigos.com/?p=1086</guid>
		<description><![CDATA[
Tras echarle un primer vistazo a LINQ hace unos meses finalmente me he puesto a darle caña a esta nueva tecnología desarrollada por Microsoft y que pretende facilitarnos las tareas a los desarrolladores.
¿Qué es LINQ?
LinQ (Language Integrated Query) es una nueva librería que se integra en Visual Studio 2008 y permite gestionar colecciones de datos [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://img5.imageshack.us/img5/6633/linqbanner.jpg" alt="LinQ Microsoft" class="aligncenter" /><br />
Tras echarle un primer vistazo a LINQ hace unos meses finalmente me he puesto a darle caña a esta nueva tecnología desarrollada por Microsoft y que pretende facilitarnos las tareas a los desarrolladores.</p>
<h2>¿Qué es LINQ?</h2>
<p>LinQ (Language Integrated Query) es una nueva librería que se integra en Visual Studio 2008 y permite gestionar colecciones de datos de forma más directa utilizando un lenguaje similar al de SQL. Las colecciones de datos pueden proceder de un simple array, una base de datos relacional, un listado de objetos en caché, un archivo XML u orígenes de datos de terceros.</p>
<h2>¿Cómo se usa LINQ?</h2>
<p>Lo mejor para ver esto es poner un ejemplo de cómo se hacían antes las cosas y cómo pueden hacerse ahora gracias a LINQ: </p>
<p><span id="more-1086"></span>Pongamos que por ejemplo tenemos una BDD de alumnos con la tabla TAlumnos y los campos Nombre, Nota y Aprobado por simplificar. Pongamos que nuestro proyecto realiza el 90% de las consultas a esa tabla, y el 70% son simples selects para mostrar datos. Como queremos ahorrarnos cientos de accesos a la BDD (abrir conexión, realizar consulta, cerrar conexión) realizamos una carga inicial de todos esos datos en caché, guardándolo todo en memoria a través de un listado de objetos definidos por la clase CAlumno de propiedades Nombre, Nota y Aprobado.</p>
<p>Imaginemos ahora que quiero consultar los alumnos que han aprobado, y para evitar acceder a la BDD y aprovechando que están en caché hago lo siguiente:</p>
<pre>
        Dim aprobados As New Collections.Generic.List(Of CAlumno)
        For Each alum As CAlumno In Cache.getAlumnos()
            If alum.Aprobado = True Then
                aprobados.Add(alum)
            End If
        Next
</pre>
<p>Aunque supongo que ya se entiende, Cache.getAlumnos devuelve una lista de objetos CAlumno. Por otro lado, meto los aprobados en una lista para luego insertarlos en un GridView sin problemas. Ahora veamos cómo hacer eso mismo con LINQ:</p>
<pre>
Dim aprobados As New Collections.Generic.List(Of CAlumno)
aprobados = From alum In Cache.getAlumnos() Where alum.Aprobado = True
</pre>
<p>Básicamente la sintaxis que lo inicia todo es &#8220;FROM&#8221; tras eso se coloca el origen y se le pueden añadir distintas cláusulas como &#8220;DISTINCT&#8221;, &#8220;WHERE&#8221;, &#8220;ORDER BY&#8221;, &#8220;GROUP BY&#8221;, &#8220;HAVING&#8221;, &#8220;JOIN&#8221;, &#8220;UNION&#8221;, etc y al final un &#8220;SELECT&#8221; en caso de que sólo queramos coger ciertos campos. Si en el caso anterior sólo quisiéramos los nombres:</p>
<pre>
Dim aprobados As String()
aprobados = From alum In Cache.getAlumnos() Where alum.Aprobado = True SELECT alum.Nombre
</pre>
<p>Más allá de la simplificación de código, mi pregunta ahora es&#8230; <strong>¿qué resulta más eficiente?</strong> ¿Qué consume menos recursos o tiempo de proceso? Pues bien, lo mejor para esto es realizar un test de velocidad accediendo a los datos de un XML en LINQ y de la forma tradicional, pero otro día, que por hoy ya tenemos bastante.</p>
<p>Para quien quiera saber más sobre LINQ le recomiendo <a href="http://geeks.ms/blogs/jorge/archive/2007/12/05/aprendiendo-linq-para-visual-basic-2008.aspx">este post de Jorge Serrano</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.entrecodigos.com/2009/05/iniciacion-a-linq-en-aspnet.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Insertar archivos PDF en tus posts de Wordpress</title>
		<link>http://www.entrecodigos.com/2009/03/insertar-archivos-pdf-en-tus-posts-de-wordpress.html</link>
		<comments>http://www.entrecodigos.com/2009/03/insertar-archivos-pdf-en-tus-posts-de-wordpress.html#comments</comments>
		<pubDate>Thu, 19 Mar 2009 10:15:15 +0000</pubDate>
		<dc:creator>Ruben Cantón</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[taller]]></category>

		<guid isPermaLink="false">http://www.entrecodigos.com/?p=952</guid>
		<description><![CDATA[Hoy me siento como Kristian Pielhoff, presentador de Bricomanía, y me he decidido por realizar un tutorial sobre la inserción de archivos PDF en nuestro blog en wordpress. Aviso que las opciones que voy a mostraros podrían no coincidir si no tenéis instalada la versión 2.7.1 de wordpress.
Publicar archivo PDF
Lo primero de todo es ver [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy me siento como Kristian Pielhoff, presentador de Bricomanía, y me he decidido por realizar un tutorial sobre la <strong>inserción de archivos PDF en nuestro blog en wordpress</strong>. Aviso que las opciones que voy a mostraros podrían no coincidir si no tenéis instalada la versión 2.7.1 de wordpress.</p>
<h2>Publicar archivo PDF</h2>
<p>Lo primero de todo es ver cómo incluir de forma sencilla un archivo PDF para descargar en nuestro blog. Pues bien, esto es muy sencillo, rápido y económico. En el menú de escritura del post seguramente habremos observado las siguientes opciones en la parte superior, justo donde pone &#8220;<em>Add media</em>&#8220;:</p>
<p><img class="aligncenter" src="http://img17.imageshack.us/img17/8909/opcionesupload.jpg" alt="opciones" /></p>
<p><span id="more-952"></span>La primera de ellas, &#8220;<em>Add an image</em>&#8220;, la hemos usado más de una vez, pero la última, &#8220;<em>Add media</em>&#8220;, puede resultarnos algo confusa y por ello no llegamos a utilizarla. Pues bien, es precisamente esa opción la que debemos utilizar.</p>
<p>Veréis que el menú para insertar un archivo (en este caso un PDF) es muy similar al que permite subir imágenes. Utiliza el campo &#8220;<em>Título</em>&#8221; para establecer el texto del enlace. Sólo dos apuntes: Si ves que el menú no te funciona haz click en &#8220;<em>Try the Browser uploader instead</em>&#8220;. Además, <strong>asegúrate de tener permisos de escritura en el servidor</strong> para poder subir archivos, si no los tienes no podrás subir ni imágenes, contacta con tu administrador de sistema y pídele que te de permisos.</p>
<h2>PDF con icono</h2>
<p>Para que nuestro enlace al PDF tenga un icono descriptivo del tipo de archivo que se va a encontrar el usuario podemos subir una imagen pequeñita y ponerla manualmente al lado del enlace, pero también tenemos el plugin <a href="http://wordpress.org/extend/plugins/custom-thumbnails/">Custom thumbnails</a>.</p>
<p>Tras instalar el plugin, tenemos la opción de publicar PDFs con icono siguiendo estos pasos:</p>
<ol>
<li>Sube el archivo PDF igual que antes, a través de la opción Add media. No lo insertes en el post aún.</li>
<li>Sube la imagen a usar de icono, no publiques nada aún.</li>
<li>Observa que el menú de Add Media tiene 3 pestañas, accede a la pestaña &#8220;Media Library&#8221;.<br />
<img src="http://img21.imageshack.us/img21/4336/medialibrary.jpg" class="aligncenter" /></li>
<li>Busca la imagen tamaño icono que has subido y presiona &#8220;<em>Show</em>&#8220;.</li>
<li>Ahora, en &#8220;<em>Parent Item</em>&#8220;, puedes seleccionar un &#8220;Archivo padre&#8221;, de forma que ese archivo se linkará con ésta imagen como icono.</li>
<li>Existen varias opciones de presentación en función de si rellenas el campo Caption o no, pero te recomiendo dejar ese espacio en blanco y presionar &#8220;<em>Insert into post</em>&#8220;</li>
<li>Tras eso ya tenemos todo montado, pero nuestro icono no tiene texto. Ahora vamos al modo de edición en HTML y justo al cierre del enlace (justo antes de la etiqueta &lt;/a>) incluimos nuestro texto.</li>
</ol>
<p>Éste es el resultado:</p>
<p><img src="http://blog.pisos.com/wp-content/uploads/2009/03/ico-pdf.gif" /><a href="#">Descargar archivo PDF.</a></p>
<h2>Opción externa</h2>
<p>Una última opción es utilizar un <strong>servicio gratuito para subir PDFs</strong> y enlazar la ruta del archivo, ésta alternativa puede ser útil si queremos ahorrarnos ancho de banda. Por ejemplo: <a href="http://pdfmenot.com/">Free Online PDF viewer</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.entrecodigos.com/2009/03/insertar-archivos-pdf-en-tus-posts-de-wordpress.html/feed</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Cómo crear un widget de wordpress.</title>
		<link>http://www.entrecodigos.com/2009/01/como-crear-un-widget-de-wordpress.html</link>
		<comments>http://www.entrecodigos.com/2009/01/como-crear-un-widget-de-wordpress.html#comments</comments>
		<pubDate>Fri, 23 Jan 2009 07:51:26 +0000</pubDate>
		<dc:creator>Ruben Cantón</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[taller]]></category>

		<guid isPermaLink="false">http://www.entrecodigos.com/?p=811</guid>
		<description><![CDATA[Siguiendo con el manual de crear tu propio theme de wordpress, es posible que te encuentres con que quieres agregar nuevos módulos al sidebar, más conocidos como widgets.
Hay varias formas de hacer esto, por un lado, puesto y que tienes la opción de escoger entre un sidebar dinámico y otro estático, podrías escoger lo segundo [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://img398.imageshack.us/img398/5676/widget2hw8.jpg" class="alignright" alt="Widget RSS" />Siguiendo con el manual de <a href="http://www.entrecodigos.com/2009/01/como-crear-un-theme-de-wordpress-parte-1.html">crear tu propio theme de wordpress</a>, es posible que te encuentres con que quieres agregar nuevos módulos al <strong>sidebar</strong>, más conocidos como <strong>widgets</strong>.</p>
<p>Hay varias formas de hacer esto, por un lado, puesto y que tienes la opción de escoger entre un sidebar dinámico y otro estático, podrías escoger lo segundo y programar en php el <strong>sidebar de una sola pieza</strong>, aunque <strong>no será configurable</strong> desde el panel de administración. Otra opción es entrar al panel de administración y crear un <strong>widget de tipo texto</strong>, en el que podrías meter código html o javascript.</p>
<p>Pero el problema de todo esto, es que en caso de querer modificar el sidebar sin tocar el código fuente, de que algún widget de problemas, queramos hacer un backup o actualizar a una nueva versión, el mantenimiento resulta más costoso. Por ello la opción más lenta pero también más segura a largo plazo consiste en <strong>crear nuevos widgets</strong> e incorporarlos a través del panel de administración.</p>
<h2>¿Cómo creo un nuevo widget?</h2>
<p>Crear un nuevo widget es sencillo, sólo tienes que seguir estos pasos:</p>
<ol>
<li>Crear un archivo php para meter tu widget, por ejemplo <em>miwidget.php</em></li>
<li>Incluir y editar en ese archivo las líneas de código que te pongo mas abajo.</li>
<li>Colocar el archivo <em>miwidget.php</em> en la carpeta wp-content/plugins/</li>
<li>En el panel de administración, activar el widget en el apartado de plugins.</li>
<li>En el panel de administración, arrastrar el widget al sidebar en el apartado de design-&gt;widgets.</li>
</ol>
<p><span id="more-811"></span>Éste es el código que debes introducir en el archivo <em>miwidget.php</em>:</p>
<pre>&lt;?php
/*
Plugin Name: MiWidget - Feed RSS
Plugin URI: http://www.entrecodigos.com/
Description: Enlaces para suscribirse al feed del blog
Author: Rubén Cantón
Version: 1
Author URI: http://www.entrecodigos.com/
*/

function miwidget_rss() {
    echo "&lt;div class='sidebar-rss'&gt;";
    echo "&lt;img src='./wp-content/plugins/miwidget/rss.gif' alt='rss'/&gt;";
    echo "&lt;a href = \"http://feeds.feedburner.com/entrecodigos/ \"&gt;Feed de artículos&lt;/a&gt;";
    echo "&lt;/div&gt;";
}

function init_miwidget_rss(){register_sidebar_widget("Mi Widget - Feed RSS", "miwidget_rss");}

add_action("plugins_loaded", "init_miwidget_rss");
?&gt;</pre>
<p>Al igual que cuando creamos el style.css, <strong>los comentarios del principio sirven para identificar tu widget</strong> en el panel de administración, en este caso, de administración de plugins.</p>
<p>Los métodos utilizados son los siguientes:</p>
<p><strong>add_action</strong>: Establece que cuando se produzca un evento determinado (en este caso, tras la carga de los plugins), se ejecute el método establecido.</p>
<p><strong>register_sidebar_widget</strong>: Registra un widget estableciendo un nombre para el mismo (que será el que se muestre en el panel de administración de widgets) y la función a la que se debe llamar cuando se ejecute.</p>
<h2>Lo que no debemos olvidar</h2>
<ul>
<li>No olvides que existen <a href="http://widgets.wordpress.com/">widgets ya creados para wordpress.</a></li>
<li>Cuando crees tus propias funciones, recuerda poner siempre algún prefijo imposible de igualar, no sea que generes un conflicto con funciones del wordpress o con otro plugin.</li>
<li>Puedes crear una carpeta para tu plugin, y meter imágenes, estilos o cualquier cosa en ella, como he hecho yo en el ejemplo.</li>
</ul>
<p>Fuentes:<br />
<a href="http://www.emanueleferonato.com/2008/02/15/how-to-create-a-wordpress-widget/">Emanuele Feronato</a><br />
<a href="http://codex.wordpress.org/Plugins/WordPress_Widgets_Api">Wordpress Widgets API</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.entrecodigos.com/2009/01/como-crear-un-widget-de-wordpress.html/feed</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Cómo crear un theme de wordpress &#8211; Parte 1</title>
		<link>http://www.entrecodigos.com/2009/01/como-crear-un-theme-de-wordpress-parte-1.html</link>
		<comments>http://www.entrecodigos.com/2009/01/como-crear-un-theme-de-wordpress-parte-1.html#comments</comments>
		<pubDate>Mon, 12 Jan 2009 07:32:53 +0000</pubDate>
		<dc:creator>Ruben Cantón</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[disenyo]]></category>
		<category><![CDATA[taller]]></category>
		<category><![CDATA[diseño]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.entrecodigos.com/?p=766</guid>
		<description><![CDATA[Aunque normalmente y dada mi falta de originalidad para ciertos temas (además de mi mente excesivamente analítica) prefiero coger un theme gratuito y editarlo a mi gusto, me he decidido por investigar cómo crear desde 0 (bueno, desde 0,5) un theme de wordpress.
Resulta bastante sencillo y no supone un gran coste, pero para poder explicarme [...]]]></description>
			<content:encoded><![CDATA[<p>Aunque normalmente y dada mi falta de originalidad para ciertos temas (además de mi mente excesivamente analítica) prefiero coger un theme gratuito y editarlo a mi gusto, me he decidido por investigar cómo crear desde 0 (bueno, desde 0,5) un <strong>theme de wordpress</strong>.</p>
<p><strong>Resulta bastante sencillo</strong> y no supone un gran coste, pero para poder explicarme con más comodidad y hacer artículos menos densos prefiero hacerlo en 2 o 3 partes, de forma que separe unos temas de otros. De esta manera, pasaré a explicar cómo crear y configurar un theme y qué archivos son necesarios, los estilos que deberíamos incluir, los archivos que deberíamos editar y por último algún truco más avanzado. Empecemos.</p>
<p><span id="more-766"></span><br />
<h2>Creando nuestro nuevo theme. ¿Qué necesitamos?</h2>
<p>Lo primero que hay que saber es que los themes se guardan en carpetas independientes dentro de <em>wp-content/themes/</em>, por lo tanto, nos metemos ahí y <strong>creamos una nueva carpeta</strong>, por ejemplo &#8220;<em>miNuevoTheme</em>&#8220;.</p>
<p>Tras esto es necesario <strong>crear un archivo style.css</strong> que empiece por el siguiente texto, esto es importante ya que <strong>wordpress no reconocerá el theme si no tiene estos datos</strong> ya que wordpress utiliza esta información para mostrar los themes en el panel de administración. Si quieres ver un ejemplo utiliza el style.css del theme por defecto de wordpress.</p>
<pre>/*
Theme Name: Mi super Theme
Theme URI: http://www.entrecodigos.com/
Description: Theme de pruebas.
Version: 1
Author: Ruben Canton
Author URI: http://www.entrecodigos.com/
Tags: blue, custom header, fixed width, one column, widgets
*/</pre>
<p>Ahora sólo hace falta que coloquemos ciertos archivos php que definen la estructura de las distintas secciones de nuestro blog, sólo 3 de ellos son imprescindibles:</p>
<ul>
<li><strong>index.php</strong>: Es el archivo al que realmente se llama, éste es quien debe llamar a header.php y footer.php.</li>
<li><strong>header.php</strong>: incluye la cabecera.</li>
<li><strong>footer.php</strong>: Incluye el pie de página.</li>
</ul>
<p>Seguramente te preguntarás cómo meter un sidebar, widgets o cómo hacer estructuras distintas para listar categorías, páginas o resultados de búsqueda. Pues bien, por eso en la mayoría de themes hay muchos más archivos, los 3 anteriores son imprescindibles para un diseño básico, pero si quieres hacer algo mas complejo sin provocar que el index.php termine ocupando 800 líneas de código lleno de bifurcaciones será mejor que te mires la carpeta con el theme por defecto de wordpress y copies todos los archivos php que contiene. Así podrás tener todos los archivos y partir de una base, como hice yo, lo que puede resultarte muy útil.</p>
<p>Por último, existe una imagen llamada <strong>screenshot.png</strong> de 300&#215;225 que wordpress utiliza para mostrarte una minipreview del theme en el panel de administración, cuando termines tu theme puedes hacer una captura y colocarlo para distinguirlo fácilmente.</p>
<h2>¿Qué estilos colocar en style.css?</h2>
<p>Cada uno trabaja a su manera, si coges el style.css de algún theme te encontrarás con mucha basura o estilos que no vas a utilizar, si utilizas el style por defecto de wordpress no te libras de esa basura, y además, su forma de organizar el css puede que no se adapte a tu forma de trabajar, como me pasó a mi. Por lo que lo mejor es borrarlo todo y empezar desde 0 teniendo claro qué estilos sí son imprescindibles o necesarios, aunque como tú eres quien define la estructura puedes modificar el nombre de los mismos, te recomiendo que utilices los que vienen por defecto, así tu theme será más compatible. Te muestro la estructura básica:</p>
<ul>
<li>body</li>
<li>
<ul>
<li>page</li>
<li>
<ul>
<li>header</li>
<li>content</li>
<li>
<ul>
<li>post</li>
<li>postmetadata</li>
<li>entry</li>
<li>commentlist</li>
<li>commentmetadata</li>
<li>avatar</li>
<li>commentform</li>
</ul>
</li>
<li>sidebar</li>
<li>footer</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Por supuesto no hay que olvidar ponerle estilo a las típìcas etiquetas HTML como a, h1, h2, ul, ol, li, img, &#8230; y tras eso ya puedes empezar a crear tus propios estilos o bloques e incuirlos en la estructura y en el css.</p>
<p><strong>Nota</strong>: Si has copiado los archivos php del theme por defecto, fíjate que el header.php mete un estilo de forma dinámica en función del tipo de página que se carga, puedes utilizar esto si te interesa para tener distintos estilos o eliminarlo para que no te moleste.</p>
<p>Continuará&#8230;</p>
<p>Fuente: Un especial agradecimiento a Andrés Nieto, <a href="http://www.anieto2k.com/2006/01/28/cronicas-de-la-creacion-de-un-theme-i/">por su manual</a> y por <a href="http://www.anieto2k.com/2006/04/21/si-no-haces-un-theme-es-por-que-no-quieres/">su recopilación de manuales</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.entrecodigos.com/2009/01/como-crear-un-theme-de-wordpress-parte-1.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

