<?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>marcis / blog &#187; desarrollo web</title>
	<atom:link href="http://blog.marcis.es/etiqueta/desarrollo-web/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.marcis.es</link>
	<description>Desarrollo Web</description>
	<lastBuildDate>Fri, 08 Jul 2011 19:04:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Extensiones para desarrollo web</title>
		<link>http://blog.marcis.es/extensiones-para-desarrollo-web/</link>
		<comments>http://blog.marcis.es/extensiones-para-desarrollo-web/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 11:18:38 +0000</pubDate>
		<dc:creator>marcis</dc:creator>
				<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[herramientas]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugins]]></category>

		<guid isPermaLink="false">http://blog.marcis.es/?p=191</guid>
		<description><![CDATA[A raíz de un par de artículos sobre el tema, os dejo unas cuantas extensiones de Chrome y Firefox para desarrolladores web. Para Firefox: Firebug: no necesita presentación. FireQuery: compatibilidad entre jQuery y Firebug. FirePHP: añade soporte para PHP y Ajax. Web Developer: herramienta que permite activar/desactivar las hojas de estilos, los plugins, el código [...]]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.marcis.es%2Fextensiones-para-desarrollo-web%2F&amp;layout=button_count&amp;show_faces=false&amp;width=&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Extensiones para desarrollo web" data-url="http://blog.marcis.es/extensiones-para-desarrollo-web/" 
						data-via="" ></a> 
				</div></div>
		<div style="clear:both;"></div><p>A raíz de un par de artículos sobre el tema, os dejo unas cuantas <strong>extensiones</strong> de <a title="Extensiones de Google Chrome para el desarrollo Web" href="http://www.megadual.com/2010/05/31/extensiones-de-google-chrome-para-el-desarrollo-web/" target="_blank">Chrome</a> y <a title="EXTENSIONES DE FIREFOX RECOMENDADAS PARA EL DESARROLLO WEB" href="http://skatox.com/blog/2010/05/27/mis-extensiones-recomendadas-desarrollo-web-firefox/" target="_blank">Firefox</a> para <strong>desarrolladores web</strong>.</p>
<p><span id="more-191"></span>Para <strong>Firefox</strong>:</p>
<ul>
<li><a title="Firebug" href="https://addons.mozilla.org/es-ES/firefox/addon/1843/" target="_blank">Firebug</a>: no necesita presentación.</li>
<li><a title="FireQuery" href="https://addons.mozilla.org/es-ES/firefox/addon/12632/" target="_blank">FireQuery</a>: compatibilidad entre jQuery y Firebug.</li>
<li><a title="FirePHP" href="https://addons.mozilla.org/es-ES/firefox/addon/6149/" target="_blank">FirePHP</a>: añade soporte para PHP y Ajax.</li>
<li><a title="Web Developer" href="https://addons.mozilla.org/es-ES/firefox/addon/60/" target="_blank">Web Developer</a>: herramienta que permite activar/desactivar las hojas de estilos, los plugins, el código javascript, las tablas, las imágenes,&#8230;</li>
<li><a title="HTML Validator" href="https://addons.mozilla.org/firefox/addon/249" target="_blank">Html Validator</a>: evidentemente, ayuda a comprobar si una página cumplen el estándar.</li>
</ul>
<p>Para <strong>Chrome</strong>:</p>
<ul>
<li><a title="Resolution Test" href="https://chrome.google.com/extensions/detail/idhfcdbheobinplaamokffboaccidbal" target="_blank">Resolution Test</a>: permite redimensionar el navegador para visualizar la página en distintas resoluciones y comprobar que &#8220;todo funciona&#8221;.</li>
<li><a title="Speed Tracer" href="http://www.omeyasweb.com/extensiones-de-google-chrome-para-el-desarrollo-web/Speed%20Tracer" target="_blank">Speed Tracer</a>: <a title="Speed Tracer de Google | marcis / blog" href="http://blog.marcis.es/speed-tracer-de-google/" target="_self">ya hablamos de él</a> en este blog.</li>
<li><a title="Pendule" href="https://chrome.google.com/extensions/detail/gbkffbkamcejhkcaocmkdeiiccpmjfdi" target="_blank">Pendule</a>: permite hacer <em>probatinas</em> con los colorer, hojas de estilo, javascript,&#8230;</li>
</ul>
<p>¿Cuáles son vuestras preferidas?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.marcis.es/extensiones-para-desarrollo-web/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Un nuevo giro</title>
		<link>http://blog.marcis.es/un-nuevo-giro/</link>
		<comments>http://blog.marcis.es/un-nuevo-giro/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 15:00:32 +0000</pubDate>
		<dc:creator>marcis</dc:creator>
				<category><![CDATA[marcis]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[emprendedor]]></category>
		<category><![CDATA[ideas]]></category>
		<category><![CDATA[profesional]]></category>
		<category><![CDATA[proyectos]]></category>
		<category><![CDATA[viajes]]></category>

		<guid isPermaLink="false">http://blog.marcis.es/?p=131</guid>
		<description><![CDATA[Tras intentar una aventura en compañía durante poco más de un año, vuelvo a dar un giro a mi vida profesional y me lanzo en solitario. Hay decisiones que son difíciles de tomar. Sin embargo, una vez que las tienes claras lo mejor es dar el paso lo antes posible. A nadie le apetece pasar [...]]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.marcis.es%2Fun-nuevo-giro%2F&amp;layout=button_count&amp;show_faces=false&amp;width=&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Un nuevo giro" data-url="http://blog.marcis.es/un-nuevo-giro/" 
						data-via="" ></a> 
				</div></div>
		<div style="clear:both;"></div><p>Tras intentar <a title="Una nueva etapa | marcis / blog" href="http://blog.marcis.es/una-nueva-etapa/">una aventura en compañía</a> durante poco más de un año, vuelvo a dar un giro a mi vida profesional y me lanzo <strong>en solitario</strong>.</p>
<p><span id="more-131"></span></p>
<div class="wp-caption alignright" style="width: 330px"><a href="http://www.flickr.com/photos/22746515@N02/4101974109/"><img class=" " title="Loneliness" src="http://farm3.static.flickr.com/2548/4101974109_1fd3ea8861.jpg" alt="" width="320" height="254" /></a><p class="wp-caption-text">Loneliness de Bert K</p></div>
<p>Hay <strong>decisiones</strong> que son difíciles de tomar. Sin embargo, una vez que las tienes claras lo mejor es dar el paso lo antes posible. A nadie le apetece pasar por un divorcio (aunque sea profesional) pero más vale separarse antes de que haya &#8220;chiquillos&#8221; y el daño sea irreparable.</p>
<p>Nuevas ideas, <strong>nuevos proyectos</strong>, nuevas puertas que se abren. Seguiré con el <a title="desarrollo web | marcis / blog" href="http://blog.marcis.es/tema/desarrollo-web/">desarrollo web</a>, con los <a title="marcis es viajero" href="http://marcis.es/viajero/">viajes</a>, escribiendo en los blogs e intentando ser un <a title="marcis es emprendedor" href="http://marcis.es/emprendedor/">emprendedor</a>.</p>
<p>Quizás parezca que estoy dando vueltas en círculo o perdido en medio del bosque, pero <strong>sigo buscando mi camino</strong>.</p>
<p><span style="color: #ffffff;">X4VR2BEWVKKR</span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.marcis.es/un-nuevo-giro/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Google y la velocidad de carga</title>
		<link>http://blog.marcis.es/google-y-la-velocidad-de-carga/</link>
		<comments>http://blog.marcis.es/google-y-la-velocidad-de-carga/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 11:32:53 +0000</pubDate>
		<dc:creator>marcis</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[optimización]]></category>
		<category><![CDATA[posicionamiento]]></category>
		<category><![CDATA[velocidad]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.marcis.es/?p=96</guid>
		<description><![CDATA[En los últimos meses se han sucedido las noticias y los lanzamientos de herramientas en torno a Google y la velocidad de carga de las páginas web. ¿Cuál es el verdadero objetivo del gigante de Internet? Lo cierto es que últimamente Google está haciendo bastante hincapié en la optimización de los sitios web, ya sea [...]]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.marcis.es%2Fgoogle-y-la-velocidad-de-carga%2F&amp;layout=button_count&amp;show_faces=false&amp;width=&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Google y la velocidad de carga" data-url="http://blog.marcis.es/google-y-la-velocidad-de-carga/" 
						data-via="" ></a> 
				</div></div>
		<div style="clear:both;"></div><p><a href="http://www.telegraph.co.uk/technology/google/6125689/Gmail-outage-affected-majority-of-users-says-Google.html"><img class="alignright size-medium wp-image-97" title="Google speed" src="http://blog.marcis.es/wp-content/uploads/2010/01/Google-velocidad-300x187.jpg" alt="Google speed" width="300" height="187" /></a>En los últimos meses se han sucedido las noticias y los lanzamientos de herramientas en torno a <strong>Google y la velocidad de carga de las páginas web</strong>. ¿Cuál es el verdadero objetivo del gigante de Internet?</p>
<p><span id="more-96"></span>Lo cierto es que últimamente Google está haciendo bastante hincapié en la <strong>optimización de los sitios web</strong>, ya sea a través de herramientas como el complemento para Firefox <a title="Page Speed" href="http://code.google.com/intl/es-ES/speed/page-speed/" target="_blank">Page Speed</a> o <a title="Speed Tracer de Google - marcis / blog" href="http://blog.marcis.es/speed-tracer-de-google/">la ya comentada Speed Tracer</a>, o bien mediante la publicación de <a title="Google Code Blog: Use compression to make the web faster" href="http://googlecode.blogspot.com/2009/11/use-compression-to-make-web-faster.html" target="_blank">artículos relacionados con el tema</a>.</p>
<p>Matt  Cutts, ingeniero de Google, comentó en una entrevista que <strong>la velocidad de carga podría empezar a ser un factor de posicionamiento</strong>. A partir de esta especie de anuncio oficial, surgieron multitud de comentarios como <a title="  ¿Está tratando Google realmente de mejorar la web?" href="http://www.adseok.com/google/%C2%BFesta-tratando-google-realmente-de-mejorar-la-web/" target="_blank">este</a>, <a title="Los nuevos factores del posicionamiento web 2010" href="http://www.chicaseo.com/nuevos-factores-posicionamiento/" target="_blank">este</a> o <a title="Google: Page Speed May Become a Ranking Factor in 2010" href="http://www.webpronews.com/topnews/2009/11/13/google-page-speed-may-be-a-ranking-factor-in-2010" target="_blank">este</a>.</p>
<p>Como bien se apunta en alguno de ellos, detrás de este interés por <strong>mejorar la web y la experiencia del usuario </strong>seguramente hay algo más, como un <strong>ahorro sustancial</strong> en tiempos de procesamiento y, por lo tanto, recursos.</p>
<p>Y por supuesto, también suelen aprovechar el tirón para meter su cuña sobre <strong>la rapidez de Chrome</strong> a la hora de cargar las páginas. ¿Tiene algo que ver el <strong>buen rendimiento</strong> del navegador de Google? Quizás es parte de una estrategia conjunta para <a title="Google Chrome" href="http://www.google.com/googlebooks/chrome/" target="_blank">promocionar el uso de Google Chrome</a>.</p>
<p>Foto de <a title="Gmail outage affected majority of users, says Google" href="http://www.telegraph.co.uk/technology/google/6125689/Gmail-outage-affected-majority-of-users-says-Google.html" target="_blank">Telegraph.co.uk</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.marcis.es/google-y-la-velocidad-de-carga/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Speed Tracer de Google</title>
		<link>http://blog.marcis.es/speed-tracer-de-google/</link>
		<comments>http://blog.marcis.es/speed-tracer-de-google/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 17:01:31 +0000</pubDate>
		<dc:creator>marcis</dc:creator>
				<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[aplicaciones]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[herramientas]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.marcis.es/?p=73</guid>
		<description><![CDATA[Speed Tracer es una herramienta, lanzada por Google recientemente, que sirve para &#8220;identificar y solucionar problemas de rendimiento en las aplicaciones web&#8220;. Fundamentalmente, su funcionamiento se basa en el tiempo de carga de la página desde que realizas la petición hasta que ésta termina por completo. Speed Tracer te muestra una gráfica de los tiempos [...]]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.marcis.es%2Fspeed-tracer-de-google%2F&amp;layout=button_count&amp;show_faces=false&amp;width=&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Speed Tracer de Google" data-url="http://blog.marcis.es/speed-tracer-de-google/" 
						data-via="" ></a> 
				</div></div>
		<div style="clear:both;"></div><p><strong>Speed Tracer</strong> es una herramienta, lanzada por Google recientemente, que sirve para &#8220;identificar y solucionar <strong>problemas de rendimiento en las aplicaciones web</strong>&#8220;.</p>
<p><span><span id="more-73"></span>Fundamentalmente, su funcionamiento se basa en el <strong>tiempo de carga de la página</strong> desde que realizas la petición hasta que ésta termina por completo.</span></p>
<p><span>Speed Tracer te muestra una <strong>gráfica de los tiempos invertidos</strong> en el transporte por la red, la recepción de la página, su carga y <em>renderizado</em>, así como la petición y carga de otros archivos dependientes de la página (imágenes, javascript, códigos externos,&#8230;).</span></p>
<div id="attachment_75" class="wp-caption aligncenter" style="width: 458px"><strong><img class="size-full wp-image-75" title="Speed Tracer" src="http://blog.marcis.es/wp-content/uploads/2009/12/Speed-Tracer.jpg" alt="Captura de un ejemplo de uso de Speed Tracer" width="448" height="271" /></strong><p class="wp-caption-text">Captura de un ejemplo de uso de Speed Tracer</p></div>
<p><span>De esa forma puedes detectar cuáles son los <strong>puntos críticos</strong> de tu aplicación web, es decir aquellos que merece la pena optimizar. La información, que se muestra de una manera muy visual, es bastante completa y te permite ampliar los detalles de cada una de las fases y sus componentes.</span></p>
<p><span>Speed Tracer está diponible como una <strong>extensión de Chrome para desarrolladores web</strong> en sus versiones para Windows y Linux.</span></p>
<p>Más detalles en <a title="Speed Tracer - Google Web Toolkit - Google Code" href="http://code.google.com/intl/es-ES/webtoolkit/speedtracer/" target="_blank">Speed Tracer &#8211; Google Web Toolkit &#8211; Google Code</a> y en <a title="Speed Tracer" href="http://code.google.com/p/speedtracer/" target="_blank">la página del proyecto</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.marcis.es/speed-tracer-de-google/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Surviving The Deep End, introducción a Zend Framework</title>
		<link>http://blog.marcis.es/surviving-the-deep-end-introduccion-a-zend-framework/</link>
		<comments>http://blog.marcis.es/surviving-the-deep-end-introduccion-a-zend-framework/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 12:24:19 +0000</pubDate>
		<dc:creator>marcis</dc:creator>
				<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[documentacion]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[libros]]></category>
		<category><![CDATA[manuales]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Zend]]></category>

		<guid isPermaLink="false">http://blog.marcis.es/surviving-the-deep-end-introduccion-a-zend-framework/</guid>
		<description><![CDATA[Empezar a utilizar el framework de Zend puede ser como un dolor de muelas. La documentación del portal es buena, pero se echa de menos una mejor explicación del entorno, cómo funciona, su instalación y cómo empezar a desarrollar una aplicación de verdad. Surviving The Deep End es un libro online gratuito sobre el framework [...]]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.marcis.es%2Fsurviving-the-deep-end-introduccion-a-zend-framework%2F&amp;layout=button_count&amp;show_faces=false&amp;width=&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Surviving The Deep End, introducción a Zend Framework" data-url="http://blog.marcis.es/surviving-the-deep-end-introduccion-a-zend-framework/" 
						data-via="" ></a> 
				</div></div>
		<div style="clear:both;"></div><p>Empezar a utilizar el <strong>framework de Zend</strong> puede ser como un dolor de muelas. <a title="Zend Framework Documentation - Overview" href="http://framework.zend.com/docs/overview" target="_blank">La documentación del portal</a> es buena, pero se echa de menos una mejor explicación del entorno, cómo funciona, su instalación y <strong>cómo empezar a desarrollar una aplicación</strong> de verdad.</p>
<p><span id="more-54"></span>
<p><a title="Zend Framework Book: Surviving The Deep End" href="http://www.survivethedeepend.com/" target="_blank">Surviving The Deep End</a> es un <strong>libro online gratuito</strong> sobre el framework Zend, que sirve de introducción a este entorno de desarrollo basado en PHP y la arquitectura MVC.</p>
<p align="center"><img alt="Zend Framework: surviving the deep end" src="http://blog.marcis.es/wp-content/uploads/2009/11/zendframeworksurvivingthedeepend.jpg" width="568" height="100" /></p>
<p>Comienza explicando <strong>qué es Zend Framework</strong>, su filosofía y sus principales ventajas. Continúa con la arquitectura y cómo ha implementado las 3 capas: Modelo, Vista y Controlador.</p>
<p>Después de un capítulo dedicado a su instalación, encontramos el típico ejemplo de &#8220;Hello World&#8221;.</p>
<p>A partir de ahí entra en temas más &#8220;interesantes&#8221; si queremos desarrollar una aplicación real, como las clases más importantes, el manejo de errores, el diseño o la optimización.</p>
<p>Una lectura recomendable para quienes estén dando sus <strong>primeros pasos con Zend</strong>.</p>
<p>Nota: el manual, por supuesto, está implementado con Zend.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.marcis.es/surviving-the-deep-end-introduccion-a-zend-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desarrollar un plugin para WordPress</title>
		<link>http://blog.marcis.es/desarrollar-un-plugin-para-wordpress/</link>
		<comments>http://blog.marcis.es/desarrollar-un-plugin-para-wordpress/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 14:09:41 +0000</pubDate>
		<dc:creator>marcis</dc:creator>
				<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[proyectos]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.marcis.es/desarrollar-un-plugin-para-wordpress/</guid>
		<description><![CDATA[Dentro del proyecto en el que trabajo surgió la necesidad de crear una serie de herramientas externas de apoyo al usuario. La primera, y seguramente la más importante, era un plugin para WordPress que integrara nuestra aplicación con una de las plataformas de blogs más usadas. Sólo conocía WP como usuario y administrador, sin tener [...]]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.marcis.es%2Fdesarrollar-un-plugin-para-wordpress%2F&amp;layout=button_count&amp;show_faces=false&amp;width=&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Desarrollar un plugin para WordPress" data-url="http://blog.marcis.es/desarrollar-un-plugin-para-wordpress/" 
						data-via="" ></a> 
				</div></div>
		<div style="clear:both;"></div><p><img alt="WordPress" align="right" src="http://blog.marcis.es/wp-content/uploads/2009/10/wordpress-logo-cristal1.jpg" width="128" height="128" />Dentro del proyecto en el que trabajo surgió la necesidad de crear una serie de herramientas externas de apoyo al usuario. La primera, y seguramente la más importante, era un <strong>plugin para WordPress</strong> que integrara nuestra aplicación con una de las plataformas de blogs más usadas.</p>
<p><span id="more-35"></span>
<p>Sólo conocía WP como usuario y administrador, sin tener apenas idea de su implementación. Empecé a buscar recursos y a leer.</p>
<p>He de reconocer que me gustó la estructura interna de WordPress y que <strong>resultó bastante sencillo</strong> implementar un plugin básico, tarea que seguramente habría sido más complicada sin conocimientos previos de PHP y MySQL.</p>
<p>Aunque opino que <strong>los desarrollos web nunca se terminan</strong>, disponemos de una versión bastante avanzada del plugin con las siguientes funcionalidades:</p>
<ul>
<li>Instalación/desinstalación, incluyendo la interacción con la base de datos.</li>
<li>Actualización de una tabla en función de los resultados de una llamada remota.</li>
<li>Gestión, por parte del usuario, de las opciones de configuración.</li>
<li>Modificación parcial de los contenidos del blog, a partir de la información de la base de datos.</li>
</ul>
<p>Como comentaba, el desarrollo no tuvo grandes complicaciones ya que <strong>WP facilita enormemente la tarea</strong> con los <em>hooks</em> (¿puntos de enganche?): métodos de instalación/desinstalación, gestión de menús, configuración, comunicación con la base de datos,&#8230;</p>
<p>Si hubiera que ponerle alguna pega, diría que <strong>la creación de páginas de opciones podría ser más ligera</strong>.</p>
<p>Había pensado publicar un breve manual sobre <strong>cómo crear un plugin para WordPress</strong> desde cero, pero hay un par de motivos que me han desanimado. Primero, hay bastante documentación disponible y de buena calidad. Segundo, dependiendo de lo que quieras hacer el número de posibilidades que ofrece WP es incontable y, lamentablemente, no tengo tiempo suficiente para abarcarlas todas. Así que me limitaré a compartir con vosotros los enlaces que más me ayudaron durante el proceso:</p>
<ul>
<li><a title="Plugin Resources &lt;&lt; WordPress Codex &gt; WordPress Codex" href="http://codex.wordpress.org/Plugin_Resources" target="_blank">Plugin Resources</a>: introducción &#8220;oficial&#8221; a los <em>plugins</em> de WordPress y recursos relacionados (en inglés).</li>
<li><a title="Writing a Plugin &lt;&lt; WordPress Codex" href="http://codex.wordpress.org/Writing_a_Plugin" target="_blank">Writing a Plugin</a>: otra página oficial sobre cómo crear un plugin, convenciones de nombres, archivos, opciones, sugerencias,&#8230; (en inglés).</li>
<li><a title="Crear un plugin para wordpress - aurea" href="http://aurea.es/2008/04/17/crear-un-plugin-para-wordpress/" target="_blank">Crear un plugin para wordpress</a>: tutorial muy básico pero sencillo de comprender.</li>
<li><a title="Estandarización en los plugins para WordPress, desde el usuario | Blog en Serio" href="http://blogenserio.com/2008/01/sugerencias-para-la-estandarizacion-de-plugins-de-wordpress/" target="_blank">Estandarización de los plugins para WordPress</a>: sugerencias para estandarizar tanto el código como el contenido de los plugins.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.marcis.es/desarrollar-un-plugin-para-wordpress/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Acceder al portapapeles desde Javascript</title>
		<link>http://blog.marcis.es/acceder-al-portapapeles-desde-javascript/</link>
		<comments>http://blog.marcis.es/acceder-al-portapapeles-desde-javascript/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 19:23:44 +0000</pubDate>
		<dc:creator>marcis</dc:creator>
				<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[usabilidad]]></category>

		<guid isPermaLink="false">http://blog.marcis.es/?p=17</guid>
		<description><![CDATA[Estoy trabajando en un proyecto en el que hemos decidido mostrarle al usuario, para facilitarle la tarea, un botón o enlace que le permita copiar un texto al portapapeles. De esa forma puede realizar dos acciones con un solo click: seleccionar y copiar. Empecé la investigación (léase búsqueda en Google) y obtuve resultados demasiado buenos [...]]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.marcis.es%2Facceder-al-portapapeles-desde-javascript%2F&amp;layout=button_count&amp;show_faces=false&amp;width=&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Acceder al portapapeles desde Javascript" data-url="http://blog.marcis.es/acceder-al-portapapeles-desde-javascript/" 
						data-via="" ></a> 
				</div></div>
		<div style="clear:both;"></div><p>Estoy trabajando en un proyecto en el que hemos decidido mostrarle al usuario, para facilitarle la tarea, un botón o enlace que le permita <strong>copiar un texto al portapapeles</strong>. De esa forma puede realizar dos acciones con un solo <em>click</em>: seleccionar y copiar.</p>
<p><span id="more-17"></span>Empecé la investigación (léase búsqueda en Google) y obtuve resultados demasiado buenos para ser verdad. Gracias al método &#8220;setData&#8221; del objeto &#8220;clipboardData&#8221; era sencillo cumplir mi objetivo:</p>
<pre style="padding-left: 30px;">clipboardData.setData("Text", s)
// siendo "s" una variable que contiene el texto a copiar</pre>
<p>Pero no podía ser tan fácil. El código anterior sólo funciona en Internet Explorer, así que seguí buscando una solución <em>cross-browser</em> o, como mínimo, <strong>compatible</strong> con Firefox.</p>
<p>Después de <a title="Dynamic Tools - Javascript Copy To Clipboard" href="http://www.dynamic-tools.net/toolbox/copyToClipboard/" target="_blank">algún intento infructuoso</a>, encontré <a title="Javascript copy to Firefox and Mozilla clipboard" href="http://www.febooti.com/support/website-help/website-javascript-copy-clipboard.html" target="_blank">este ejemplo</a> que funcionaba&#8230; con ciertas <strong>restricciones</strong>.</p>
<p>Por lo visto, las <a title="Security Policies - MozillaZine Knowledge Base" href="http://kb.mozillazine.org/Security_Policies" target="_blank">políticas de seguridad de Mozilla</a> impiden la ejecución de dicho código. Y puede que con motivo, ya que de lo contrario <a title="Retrieve Clipboard Text To A Web Page With Javascript - Make Sure You Do Not Allow Someone To Gather This Information, It Is An Exploit In Many Eyes" href="http://www.friendlycanadian.com/applications/clipboard.htm" target="_blank">cualquier página podría tener acceso a tu portapapeles</a> y, por lo tanto, a <strong>información potencialmente delicada</strong> (direcciones de e-mail, teléfonos, números de tarjeta de crédito,&#8230; o cualquier otro dato que hayas copiado).</p>
<p>Llegados a este punto, existían dos opciones para <strong>poder copiar el texto en Firefox</strong>:</p>
<ul>
<li><a title="JavaScript Security: Signed Scripts" href="http://www.mozilla.org/projects/security/components/signed-scripts.html" target="_blank">Firmar el script</a>, demasiado costoso para lo que queremos hacer</li>
<li>Confiar en que el usuario tenga activada la opción &#8220;signed.applets.codebase_principal_support&#8221; en su configuración (<a title="About:config entries - MozillaZine Knowledge Base" href="http://kb.mozillazine.org/Firefox_:_FAQs_:_About:config_Entries" target="_blank">about:config</a>), o bien esté dispuesto a habilitarla</li>
</ul>
<p>Si estamos pensando en hacer la aplicación más fácil de usar, <strong>no podemos pedirle al usuario</strong> que configure su navegador de una forma especial, que además conlleva cierto riesgo.</p>
<p>A todo esto hay que unir por un lado un <a title="Febooti Software" href="http://www.febooti.com/scripts/febooti.js" target="_blank">código fuente</a> bastante &#8220;farragoso&#8221;, lleno de capturas de excepciones y avisos al usuario. Y por otro, las <strong>alertas de seguridad</strong> que tanto IE como FF muestran antes de permitir la copia de contenidos al portapapeles. Seguro, pero poco práctico.</p>
<p>Me estaba replanteando la decisión de incluir esta funcionalidad cuando encontré <strong>una solución algo más limpia</strong>. Inicialmente había descartado la opción de implementarla usando Flash, pero al ver <a title="AddThis - Get Your Button Code" href="http://www.addthis.com/web-button?type=bm&amp;where=website&amp;url=&amp;bm=bn3&amp;analytics=0" target="_blank">la alternativa de AddThis</a> volví a cambiar de opinión.</p>
<p>La propuesta se basa en 4 elementos:</p>
<ol>
<li>La <a title="jQuery: The Write Less, Do More, JavaScript Library" href="http://jquery.com/" target="_blank">librería jQuery</a>, versión 1.3.2 reducida, como apoyo.</li>
<li>Un archivo de Flash, <a title="ZeroClipboard.swf" href="http://www.addthis.com/lib/zeroclipboard/ZeroClipboard.swf" target="_blank">ZeroClipboard.swf</a>, que fundamentalmente consiste en una imagen transparente que &#8220;captura&#8221; los eventos del ratón y copia un texto predefinido al portapapeles. Si teneis curiosidad por saber cómo está implementado, os recomiendo <a title="SWF Decompiler, Flash Decompiler, SWF to Flex,  SWF To FLA Converter, Recover FLA" href="http://www.sothink.com/product/flashdecompiler/" target="_blank">Sothink SWF Decompiler</a>.</li>
<li>Una clase, <a title="Simple Set Clipboard System" href="http://cache.addthis.com/www/q0004/lib/zeroclipboard/ZeroClipboard.js" target="_blank">ZeroClipboard</a>, que sirve de enlace entre el Flash y el Javascript de la página.</li>
<li>El <a title="ZeroClipboard example" href="http://cache.addthis.com/www/q0004/js/web-button.js" target="_blank">código Javascript que se ejecuta en la página</a> y que analizaremos a continuación:</li>
</ol>
<pre style="padding-left: 30px;">// Inicializamos el objeto ZeroClipboard con la ruta del fichero Flash
ZeroClipboard.setMoviePath('/lib/zeroclipboard/ZeroClipboard.swf');
// Usaremos como "disparadores" los elementos con class="copybtn"
$('.copybtn').each(function(){
    // Para diferenciarlos deben llamarse copybtn[X], siendo [X] un entero
    c = this.id.substr(7);
    // Se crea un "cliente" para cada disparador
    clips[c] = new ZeroClipboard.Client();
    // El texto se tomará del elemento con id="txt[X]"
    clips[c].setText($('#txt'+c).val());
    // Al terminar de copiar, ejecutar la función "cplt" (más abajo)
    clips[c].addEventListener('onComplete', cplt);
    // Si no está oculto, "pegar" el Flash al elemento actual
    // (es decir, colocarlo justo encima ocupando toda su extensión)
    if (!$(this).hasClass('hidebtn')) clips[c].glue(this);
}).bind('toggle',function(e){
    // Comportamiento cuando se cambie de un elemento a otro
    ...
});

// Al terminar, selecciona el texto copiado
// y muestra un mensaje de confirmación durante unos segundos
var cplt = function(client, text)
{
    c = client.domElement.id.substr(7);
    // Selecciona el contenido del "textarea"
    // (si usamos otro elemento, habrá que modificar esta línea)
    $('#txt'+c).get(0).select();
    $('#copyfdbk'+c).html('&amp;nbsp;&lt;em&gt;Copied&lt;/em&gt;').show();
    setTimeout("$('#copyfdbk"+c+"').fadeOut()", 2500);
}</pre>
<p>En cuanto al HTML, destacar sólo un par de detalles:</p>
<pre style="padding-left: 30px;">&lt;!-- El contenedor del texto es un textarea con el id adecuado --&gt;
&lt;<span>textarea</span><span> rows</span>=<span>"5" </span><strong><span>id</span>=</strong><span><strong>"txt0"</strong> </span><span>wrap</span>=<span>"off"...</span>
&lt;!-- El disparador es un botón con el id y la clase indicados --&gt;
&lt;<span>input</span><span> <strong>id</strong></span><strong>=</strong><span><strong>"copybtn0"</strong> </span><span>type</span>=<span>"button" </span><span>value</span>=<span>"Copy Code" </span><span>class</span>=<span>"<strong>copybtn</strong> lgbtn" </span><span><span>/</span></span>&gt;
&lt;!-- El elemento donde se mostrará el "feedback" --&gt;
&lt;<span>span</span><span> <strong>id</strong></span><strong>=<span>"copyfdbk0"</span></strong>&gt;&lt;/<span>span</span>&gt;</pre>
<p>Lo único que falta es ejecutar el código Javascript al terminar de cargar la página.</p>
<p>Más información sobre <a title="zeroclipboard - Project Hosting on Google Code" href="http://code.google.com/p/zeroclipboard/" target="_blank">Zero Clipboard en Google Code</a>.</p>
<h3>Seleccionar el contenido de un <em>span</em></h3>
<p>Como comentaba más arriba, si queremos <strong>seleccionar el texto</strong> de un elemento que no sea un <em>textarea</em> tendremos que modificar la llamada:</p>
<pre style="padding-left: 30px;">// $('#txt'+c).get(0).select();
selectElement($('#text_to_copy_'+c).get(0))

// Siendo la función:
function selectElement (element)
{
    if (document.selection) {
        var range = document.body.createTextRange();
        range.moveToElementText(element);
        range.select();
    } else if (window.getSelection) {
        var range = document.createRange();
        range.selectNodeContents(element);
        var selection = window.getSelection();
        selection.removeAllRanges();
        selection.addRange(range);
    }
}</pre>
<p>Os dejo un <a title="FAQTs - Knowledge Base - View Entry - I want to select some span text dynamically using Javascipt. Is there any way to do that?" href="http://www.faqts.com/knowledge_base/view.phtml/aid/37741" target="_blank">enlace a la fuente original</a> con su correspondiente explicación.</p>
<h3>¿Y si el usuario no tiene instalado el plugin de Flash?</h3>
<p>Por último, si no queremos confiar el funcionamiento del <em>script</em> en la carga del Flash podemos hacer una pequeña modificación:</p>
<ul>
<li>Retomamos la función Javascript que <a title="Febooti Software" href="http://www.febooti.com/scripts/febooti.js" target="_blank">copia un texto al portapapeles</a>. Llamémosla &#8220;copyToClipboard&#8221;.</li>
<li>En el bucle que recorre los disparadores, le asignamos a cada uno de ellos un gestor del evento &#8220;click&#8221; que llame a &#8220;copyToClipboard&#8221;.</li>
<li>Hacemos un cambio en el método &#8220;glue&#8221; de la clase &#8220;ZeroClipboard.Client&#8221; para que coloque el Flash fuera de lugar:</li>
</ul>
<pre style="padding-left: 30px;">// style.left = '' + box.left + 'px';
style.left = '0px';
// style.top = '' + box.top + 'px';
style.top = '0px';</pre>
<ul>
<li>Y añadimos otro gestor de eventos al objeto cliente, para comprobar que se carga correctamente:</li>
</ul>
<pre style="padding-left: 30px;">clips[c].addEventListener('onLoad', loaded);</pre>
<pre style="padding-left: 30px;">// Colocar en su sitio si todo va bien
var loaded = function(client) {
    c = client.domElement.id.substr(12);
    clips[c].reposition();
}</pre>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 1667px; width: 1px; height: 1px;">
<pre style="padding-left: 30px;">style.top = '' + box.top + 'px';</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.marcis.es/acceder-al-portapapeles-desde-javascript/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Una nueva etapa</title>
		<link>http://blog.marcis.es/una-nueva-etapa/</link>
		<comments>http://blog.marcis.es/una-nueva-etapa/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 08:18:02 +0000</pubDate>
		<dc:creator>marcis</dc:creator>
				<category><![CDATA[marcis]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[proyectos]]></category>
		<category><![CDATA[tecnologia]]></category>
		<category><![CDATA[viajes]]></category>

		<guid isPermaLink="false">http://blog.marcis.es/?p=5</guid>
		<description><![CDATA[Declaración de intenciones del blog de marcis]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.marcis.es%2Funa-nueva-etapa%2F&amp;layout=button_count&amp;show_faces=false&amp;width=&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Una nueva etapa" data-url="http://blog.marcis.es/una-nueva-etapa/" 
						data-via="" ></a> 
				</div></div>
		<div style="clear:both;"></div><p>El <a title="marcis | blog" href="http://blog.marcis.es/">blog de marcis</a> nace con la intención de recoger las novedades relativas a mi vida <strong>profesional</strong>, algunos consejos sobre <strong>tecnología</strong>, las últimas noticias relacionadas con <strong>Internet</strong>,&#8230;</p>
<p>Tras varios años en diversas empresas del sector, decidí dar el salto y empezar a trabajar por mi cuenta. Gracias a la experiencia acumulada en <strong>desarrollo web</strong> (principalmente en entorno LAMP), mis conocimientos sobre Internet y también mi afición por los <strong>viajes</strong>, emprendí esta nueva aventura.</p>
<p>Después de <a title="Simplemente de viaje" href="http://simplementedeviaje.blogspot.com/">una parada para tomar aire</a>, el 2009 empezó con el firme propósito de retomar viejas <strong>ideas y proyectos</strong> pendientes para hacerlos realidad. Pero no solo por cumplir un sueño sino también para hacer de ellos mi forma de vida.</p>
<p>Por supuesto, estoy abierto a <strong>colaboraciones profesionales</strong> y deseando escuchar tus comentarios y sugerencias. Si quieres ponerte en <strong>contacto</strong> conmigo, visita la página <a title="Acerca de - marcis | blog" href="http://blog.marcis.es/acerca-de/">Acerca de</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.marcis.es/una-nueva-etapa/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

