<?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/"
	xmlns:media="http://search.yahoo.com/mrss/">

<channel>
	<title>Opsou &#187; Labs</title>
	<atom:link href="http://www.opsou.com/blog/category/labs/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.opsou.com/blog</link>
	<description>Opsou</description>
	<lastBuildDate>Thu, 25 Apr 2013 08:14:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Top 10 de las entradas más leídas en 2011</title>
		<link>http://www.opsou.com/blog/top-10-de-las-entradas-mas-leidas-en-2011/</link>
		<comments>http://www.opsou.com/blog/top-10-de-las-entradas-mas-leidas-en-2011/#comments</comments>
		<pubDate>Fri, 30 Dec 2011 08:02:46 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Branding digital]]></category>
		<category><![CDATA[Comunicación]]></category>
		<category><![CDATA[creatividad]]></category>
		<category><![CDATA[Diseño]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Labs]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[2011]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[top ten]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=2130</guid>
		<description><![CDATA[<img src="http://www.opsou.com/blog/wp-content/uploads/2011/12/2012_blog.jpg" alt="Top 10 de las entradas más leídas en 2011" title="Top 10 de las entradas más leídas en 2011" /> 2011 se termina y es momento de hacer repaso del trabajo de todo el año. En lo que respecta a este blog  estos son los post más leidos por vosotros durante 2011 10. Interactuando: Tipos de códigos QR 9. Last night a dj saved my life 8. Servidor de máquinas virtuales remotas con Virtualbox 7. Cartografía básica para creativos...<a class="rmore" href="http://www.opsou.com/blog/top-10-de-las-entradas-mas-leidas-en-2011/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<img src="http://www.opsou.com/blog/wp-content/uploads/2011/12/2012_blog.jpg" alt="Top 10 de las entradas más leídas en 2011" title="Top 10 de las entradas más leídas en 2011" /> <p></p>
<p>2011 se termina y es momento de hacer repaso del trabajo de todo el año. En lo que respecta a este blog  estos son los post más leidos por vosotros durante 2011</p>
<p><span id="more-2130"></span></p>
<p>10. <a href="http://www.opsou.com/blog/interactuando-tipos-de-codigos-qr/" target="_blank">Interactuando: Tipos de códigos QR</a></p>
<p>9. <a href="http://www.opsou.com/blog/last-night-a-dj-saved-my-life/" target="_blank">Last night a dj saved my life</a></p>
<p>8. <a href="http://www.opsou.com/blog/servidor-de-maquinas-virtuales-remotas-con-virtualbox/" target="_blank">Servidor de máquinas virtuales remotas con Virtualbox</a></p>
<p>7. <a href="http://www.opsou.com/blog/cartografia-basica-para-creativos/" target="_blank">Cartografía básica para creativos</a></p>
<p>6. <a href="http://www.opsou.com/blog/chat-en-tu-navegador-con-node-js-y-faye/" target="_blank">Chat en tu navegador con node.js y Faye</a></p>
<p>5. <a href=" http://www.opsou.com/blog/mejorando-la-seguridad-en-faye-wildcards/" target="_blank">Mejorando la seguridad en faye: Wildcards</a></p>
<p>4. <a href="http://www.opsou.com/blog/tutorial-retrato-con-tipografia/" target="_blank">Tutorial: Retrato con tipografías</a></p>
<p>3. <a href=" http://www.opsou.com/blog/5-modulos-interesantes-de-drupal-7/" target="_blank">Cinco módulos interesantes de Drupal 7</a></p>
<p>2. <a href="http://www.opsou.com/blog/10-buenas-frases-sobre-la-creatividad/" target="_blank">Diez buenas frases sobre creatividad</a></p>
<p>1. <a href=" http://www.opsou.com/blog/musica-invisible/" target="_blank">Música Invisible</a></p>
<p>&nbsp;</p>
<p>Gracias a todos por leernos y por compartir con nosotros buenos momentos en 2011. Os deseamos que 2012 sea al menos tan bueno como 2011</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/top-10-de-las-entradas-mas-leidas-en-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2011/12/2012_blog-300x188.jpg" length="25586" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2011/12/2012_blog-300x188.jpg" width="300" height="188" medium="image" type="image/jpeg" />	</item>
		<item>
		<title>OpForm: Creación y gestión de formularios potente y sencilla en PHP 5</title>
		<link>http://www.opsou.com/blog/opform-creacion-y-gestion-de-formularios-potente-y-sencilla-en-php-5/</link>
		<comments>http://www.opsou.com/blog/opform-creacion-y-gestion-de-formularios-potente-y-sencilla-en-php-5/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 14:53:13 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[forms]]></category>
		<category><![CDATA[formularios]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[gpl]]></category>
		<category><![CDATA[neoforms]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=2057</guid>
		<description><![CDATA[<img src="http://www.opsou.com/blog/wp-content/uploads/2011/12/opform_blog.jpg" alt="OpForm: Creación y gestión de formularios potente y sencilla en PHP 5" title="OpForm: Creación y gestión de formularios potente y sencilla en PHP 5" /> Queremos compartir un proyecto GPLv3 que iniciamos. Se trata de una Liberia, o mejor dicho un conjunto de clases, que gestiona la creación, visualización y validación de formularios web. Una de las labores criticas a las que se enfrenta todo programador web es la petición de datos a los usuarios en el lado cliente y como...<a class="rmore" href="http://www.opsou.com/blog/opform-creacion-y-gestion-de-formularios-potente-y-sencilla-en-php-5/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<img src="http://www.opsou.com/blog/wp-content/uploads/2011/12/opform_blog.jpg" alt="OpForm: Creación y gestión de formularios potente y sencilla en PHP 5" title="OpForm: Creación y gestión de formularios potente y sencilla en PHP 5" /> <p></p>
<p>Queremos compartir un proyecto <strong>GPLv3</strong> que iniciamos. Se trata de una Liberia, o mejor dicho un conjunto de clases, que gestiona la creación, visualización y validación de formularios web.</p>
<p><span id="more-2057"></span></p>
<p>Una de las labores criticas a las que se enfrenta todo programador web es la petición de datos a los usuarios en el lado cliente y como segunda fase de este proceso la validación y securización de estos datos.</p>
<p>En 2001 nació <strong>neoforms</strong> una clase monolítica escrita para php 4 que permitía crear y validar formularios de forma sencilla. Como primera aproximación resultó ser muy flexible en algunos aspectos y útil, pero era complicada de mantener y su crecimiento fue desordenado.</p>
<p>En base a la experiencia de uso acumulada con <strong>neoforms</strong> hemos creado forms, un conjunto de clases que resuelven el mismo problema (la gestión y validación de formularios) pero con un enfoque más modular y estructurado. Usando la posibilidades los objetos de PHP5 (herencia, abstracción, etc).</p>
<p>Creemos que esta librería puede llegar a ser muy potente y extensible por ello cobra sentido que todos seamos participes por ello hemos creado un repositorio en gitHub (<a href="https://github.com/sergiocarracedo/OpForms">https://github.com/sergiocarracedo/OpForms</a>) en el que podréis descargar el código y aportar vuestras mejoras, sugerencias, y realizar el reporte de bugs.</p>
<p>&nbsp;</p>
<h3>Hoja de ruta</h3>
<p>Actualmente (15/12/2011) en el repositorio esta el primer envio, que posee un funcionamiento correcto, y en el cual la arquitectura de clases esta correctamente definida, pero no nos queremos quedar aquí y estas son las funcionalidades que pretendemos implementar:</p>
<ul>
<li>Creación de más tipos de campo:</li>
<ul>
<li>Hora</li>
<li>Geolocalización (con mapa)</li>
<li>Campos relacionados (que muestre datos de un campo en función del valor seleccionado en otro)</li>
<li>Ordenación de valores</li>
<li>Subida de ficheros</li>
<li>Subida de fotos</li>
</ul>
<li>Creación de más validadores</li>
<ul>
<li>Tarjeta de crédito</li>
<li>CCC</li>
<li>NIF /CIF</li>
<li>Completar los validadores de comparación</li>
</ul>
<li>Gestión de validación de lado cliente (Ajax)</li>
<li>Agrupación de elementos</li>
<li>Creación de más validadores</li>
</ul>
<p>Esperamos vuestro <em>feedback</em> y se acepta cualquier sugerencia</p>
<p>En breve publicaremos con más detalle el funcionamiento de la clase y como crear nuevos tipos de campos, mientras podéis probar su funcionamiento <a href="https://github.com/sergiocarracedo/OpForms/zipball/master" target="_blank">descargando el repositorio</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/opform-creacion-y-gestion-de-formularios-potente-y-sencilla-en-php-5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2011/12/opform_blog-300x188.jpg" length="12460" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2011/12/opform_blog-300x188.jpg" width="300" height="188" medium="image" type="image/jpeg" />	</item>
		<item>
		<title>Nueva rama de desarrollo en Node.js y nueva imagen de marca</title>
		<link>http://www.opsou.com/blog/nueva-rama-de-desarrollo-en-node-js-y-nueva-imagen-de-marca/</link>
		<comments>http://www.opsou.com/blog/nueva-rama-de-desarrollo-en-node-js-y-nueva-imagen-de-marca/#comments</comments>
		<pubDate>Mon, 08 Aug 2011 11:04:44 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Branding digital]]></category>
		<category><![CDATA[Diseño]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[faye]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[nodejs]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=1704</guid>
		<description><![CDATA[<img src="http://www.opsou.com/blog/wp-content/uploads/2011/08/nodejs-1024x768.png" alt="Nueva rama de desarrollo en Node.js y nueva imagen de marca" title="Nueva rama de desarrollo en Node.js y nueva imagen de marca" /> Node.js el servidor javascript del que ya hemos hablado en post anteriores (Node.js, Javascript power!!, Mejorando node.js: Faye y Chat en tu navegador con node.js y Faye) acaba de publicar una nueva rama (branch) de desarrollo, la 0.5.x, sobre la que seguir creciendo. Hay numerosos cambios y bugfixes que podeis conocer aqui. La rama estable continua siendo la...<a class="rmore" href="http://www.opsou.com/blog/nueva-rama-de-desarrollo-en-node-js-y-nueva-imagen-de-marca/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<img src="http://www.opsou.com/blog/wp-content/uploads/2011/08/nodejs-1024x768.png" alt="Nueva rama de desarrollo en Node.js y nueva imagen de marca" title="Nueva rama de desarrollo en Node.js y nueva imagen de marca" /> <p></p>
<p><strong>Node.js</strong> el servidor <em>javascript</em> del que ya hemos hablado en post anteriores (<a href="http://www.opsou.com/blog/node-js-javascript-power/">Node.js, Javascript power!!</a>, <a href="http://www.opsou.com/blog/mejorando-node-js-faye/">Mejorando node.js: Faye</a> y <a href=" http://www.opsou.com/blog/chat-en-tu-navegador-con-node-js-y-faye/">Chat en tu navegador con node.js y Faye</a>) acaba de publicar una nueva rama (<em>branch</em>) de desarrollo, la 0.5.x, sobre la que seguir creciendo. Hay numerosos cambios y <em>bugfixes</em> que podeis conocer <a href="https://github.com/joyent/node/wiki/ChangeLog">aqui</a>. La rama estable continua siendo la 0.4.x,</p>
<p>Este es un momento importante para el proyecto que continua su desarrollo. Muestra de esto es al apoyo de Microsoft para crear un <em>port</em> sobre la <a href="http://blog.nodejs.org/2011/06/23/porting-node-to-windows-with-microsoft%e2%80%99s-help/">plataforma Windows</a></p>
<p>También ha aprovechado para evolucionar la marca y crear una <a href="http://blog.nodejs.org/2011/07/11/evolving-the-node-js-brand/">nueva imagen corporativa</a> más consistente e identificable.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/nueva-rama-de-desarrollo-en-node-js-y-nueva-imagen-de-marca/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2011/08/nodejs-1024x768-300x225.png" length="60460" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2011/08/nodejs-1024x768-300x225.png" width="300" height="225" medium="image" type="image/png" />	</item>
		<item>
		<title>Chat en tu navegador con node.js y Faye</title>
		<link>http://www.opsou.com/blog/chat-en-tu-navegador-con-node-js-y-faye/</link>
		<comments>http://www.opsou.com/blog/chat-en-tu-navegador-con-node-js-y-faye/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 08:18:50 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[chat]]></category>
		<category><![CDATA[faye]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[node]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=1618</guid>
		<description><![CDATA[<img src="http://www.opsou.com/blog/wp-content/uploads/2011/07/node.jpg" alt="Chat en tu navegador con node.js y Faye" title="Chat en tu navegador con node.js y Faye" /> Siguiendo con los posts sobre faye, vamos a realizar un ejemplo práctico y muy vistoso, vamos a realizar un sencillo pero funcional  chat web en este post. Lo primero es crear el servidor node: Solo tenemos que incluir la extensión de faye para node var Faye = require&#40;&#8216;./faye/faye-node.js&#8217;&#41;; var fayeServer = new Faye.NodeAdapter&#40;&#123;  mount:  ...<a class="rmore" href="http://www.opsou.com/blog/chat-en-tu-navegador-con-node-js-y-faye/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<img src="http://www.opsou.com/blog/wp-content/uploads/2011/07/node.jpg" alt="Chat en tu navegador con node.js y Faye" title="Chat en tu navegador con node.js y Faye" /> <p><br />
Siguiendo con los posts sobre<strong> faye</strong>, vamos a realizar un ejemplo práctico y muy vistoso, vamos a realizar un sencillo pero funcional  <strong>chat</strong> web en este post.<br />
<span id="more-1618"></span></p>
<p>Lo primero es crear el servidor node:</p>
<p>Solo tenemos que incluir la extensión de <strong>faye</strong> para <strong>node</strong></p>
<div class="codesnip-container" >
<div class="javascript codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> Faye <span class="sy0">=</span> require<span class="br0">&#40;</span><span class="st0">&#8216;./faye/faye-node.js&#8217;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="kw2">var</span> fayeServer <span class="sy0">=</span> <span class="kw2">new</span> Faye.<span class="me1">NodeAdapter</span><span class="br0">&#40;</span><span class="br0">&#123;</span>  mount<span class="sy0">:</span>    <span class="st0">&#8216;/&#8217;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">fayeServer.<span class="me1">listen</span><span class="br0">&#40;</span>8888<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
</div>
<p>A este fichero lo llamaremos <em>node.js</em>, ahora desde <em>bash</em> lanzamos el servidor que acabamos de crear:</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1">$ node node.js</div>
</li>
</ol>
</div>
</div>
<p>Y ya tenemos nuestro &#8220;<em>servidor de chat&#8221;</em> corriendo, preparado para funcionar</p>
<p>En el lado cliente creamos un sencillo html y un script para gestionar el chat:</p>
<div class="codesnip-container" >
<div class="html4strict codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;faye/faye-browser-min.js&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span>&gt;</span>// <span class="sc2">&lt;!<span class="br0">&#91;</span>CDATA<span class="br0">&#91;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span>function<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var client <span class="sy0">=</span> new Faye.Client<span class="br0">&#40;</span><span class="st0">&#8216;http://localhost:8888/&#8217;</span><span class="br0">&#41;</span>;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var nick <span class="sy0">=</span> <span class="st0">&quot;&quot;</span>;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client.subscribe<span class="br0">&#40;</span><span class="st0">&#8216;/chat&#8217;</span>, function<span class="br0">&#40;</span>message<span class="br0">&#41;</span> <span class="br0">&#123;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#chat&quot;</span><span class="br0">&#41;</span>.append<span class="br0">&#40;</span><span class="st0">&quot;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="st0">&lt;div&gt;&lt;strong&gt;</span></span>&quot;+message.nick+&quot;<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/strong.html"><span class="kw2">strong</span></a>&gt;</span>: &quot;+message.text+&quot;<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a>&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&quot;)</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $(&quot;.nick form&quot;).submit(function() {</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nick=$(&quot;.nick input[name=nick]&quot;).val();</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $(&quot;.nick&quot;).hide();&nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $(&quot;.chatMessage&quot;).show();</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; })</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $(&quot;.chatMessage form&quot;).submit(function() {</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; text=$(&quot;.chatMessage input[name=message]&quot;).val();</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client.publish(&#8216;/chat&#8217;, {</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nick : nick,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; text: text</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; })</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">// ]]&gt;<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc1">&amp;nbsp;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc1">&amp;nbsp;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2">&lt;<a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;nick&quot;</span>&gt;&lt;<a href="http://december.com/html/4/element/form.html"><span class="kw2">form</span></a> <span class="kw3">action</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span> <span class="kw3">method</span><span class="sy0">=</span><span class="st0">&quot;POST&quot;</span> <span class="kw3">enctype</span><span class="sy0">=</span><span class="st0">&quot;multipart/form-data&quot;</span>&gt;&lt;<a href="http://december.com/html/4/element/label.html"><span class="kw2">label</span></a>&gt;</span>Tu nick:<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/label.html"><span class="kw2">label</span></a>&gt;</span>  <span class="sc2">&lt;<a href="http://december.com/html/4/element/input.html"><span class="kw2">input</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text&quot;</span> <span class="kw3">name</span><span class="sy0">=</span><span class="st0">&quot;nick&quot;</span> <span class="sy0">/</span>&gt;</span> <span class="sc2">&lt;<a href="http://december.com/html/4/element/input.html"><span class="kw2">input</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;submit&quot;</span> <span class="kw3">value</span><span class="sy0">=</span><span class="st0">&quot;Entrar al chat!!&quot;</span> <span class="sy0">/</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/form.html"><span class="kw2">form</span></a>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a>&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2">&lt;<a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;chatMessage&quot;</span> <span class="kw3">style</span><span class="sy0">=</span><span class="st0">&quot;display: none;&quot;</span>&gt;&lt;<a href="http://december.com/html/4/element/form.html"><span class="kw2">form</span></a> <span class="kw3">action</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span> <span class="kw3">method</span><span class="sy0">=</span><span class="st0">&quot;POST&quot;</span> <span class="kw3">enctype</span><span class="sy0">=</span><span class="st0">&quot;multipart/form-data&quot;</span>&gt;&lt;<a href="http://december.com/html/4/element/label.html"><span class="kw2">label</span></a>&gt;</span>Tu mensaje:<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/label.html"><span class="kw2">label</span></a>&gt;</span>  <span class="sc2">&lt;<a href="http://december.com/html/4/element/input.html"><span class="kw2">input</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text&quot;</span> <span class="kw3">name</span><span class="sy0">=</span><span class="st0">&quot;message&quot;</span> <span class="sy0">/</span>&gt;</span> <span class="sc2">&lt;<a href="http://december.com/html/4/element/input.html"><span class="kw2">input</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;submit&quot;</span> <span class="kw3">value</span><span class="sy0">=</span><span class="st0">&quot;Enviar&quot;</span> <span class="sy0">/</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/form.html"><span class="kw2">form</span></a>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a>&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc2">&lt;<a href="http://december.com/html/4/element/hr.html"><span class="kw2">hr</span></a> <span class="sy0">/</span>&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc1">&amp;nbsp;</span></div>
</li>
</ol>
</div>
</div>
<p>&nbsp;</p>
<p>Dejo una <a title="Chat" href="http://www.opsou.com/labs/chat" target="_blank">demostración</a> funcional del tutorial para ver realmente la rapidez de <strong>node</strong> y <strong>faye </strong>lo recomendable seria iniciar la demo en dos o tres navegadores distintos.</p>
<p><a title="Opsou Node Chat Demo" href="http://www.opsou.com/labs/chat/opsouNodeChatDemo.tar.gz">Descargar código</a></p>
<blockquote><p><strong>ACTUALIZACIÓN:</strong> Debido a un cambio de proveedor en nuestro servidor node ha dejado de funcionar y el ejemplo del tutorial no funcionará</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/chat-en-tu-navegador-con-node-js-y-faye/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2011/07/node-300x150.jpg" length="6413" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2011/07/node-300x150.jpg" width="300" height="150" medium="image" type="image/jpeg" />	</item>
		<item>
		<title>Mejorando node.js: Faye</title>
		<link>http://www.opsou.com/blog/mejorando-node-js-faye/</link>
		<comments>http://www.opsou.com/blog/mejorando-node-js-faye/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 08:02:41 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Backstage]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[bayeux]]></category>
		<category><![CDATA[chat]]></category>
		<category><![CDATA[faye]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[node]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[push]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=1605</guid>
		<description><![CDATA[<img src="http://www.opsou.com/blog/wp-content/uploads/2011/07/images.jpg" alt="Mejorando node.js: Faye" title="Mejorando node.js: Faye" /> Como ya comentamos en una entrada anterior node.js es una herramienta muy potente, que nos permite crear servidores empleando javascript como lenguaje de programación en el servidor, pero puede ser costoso crear ciertas herramientas y protocolos desde 0. Faye es una capa (extensión) sobre node.js, lógicamente escrita en javascript, que crea un sistema de publicación y suscripción a canales...<a class="rmore" href="http://www.opsou.com/blog/mejorando-node-js-faye/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<img src="http://www.opsou.com/blog/wp-content/uploads/2011/07/images.jpg" alt="Mejorando node.js: Faye" title="Mejorando node.js: Faye" /> <p><img class="size-full wp-image-1612 alignnone aligncenter" title="images" src="http://www.opsou.com/blog/wp-content/uploads/2011/07/images.jpg" alt="" width="393" height="128" /></p>
<p>Como ya comentamos en una entrada anterior <strong>node.js</strong> es una herramienta muy potente, que nos permite crear servidores empleando javascript como lenguaje de programación en el servidor, pero puede ser costoso crear ciertas herramientas y protocolos desde 0.</p>
<p><strong><a title="Faye" href="http://faye.jcoglan.com/node.html" target="_blank">Faye</a></strong> es una capa (extensión) sobre<strong> node.js</strong>, lógicamente escrita en javascript, que crea un sistema de publicación y suscripción a canales de mensajes basados en el protocolo <strong><a href="http://svn.cometd.com/trunk/bayeux/bayeux.html" target="_blank">Bayeux</a>.</strong></p>
<p><span id="more-1605"></span></p>
<p>En otras palabras, <strong>faye </strong>se encarga de gestionar los canales, los envios de mensajes y la recepción por parte de los subscriptores a esos canales.</p>
<p><strong>Faye</strong> consta de dos partes, una en el lado servidor y otra en el lado cliente (también escrita en javascript)</p>
<p>Para explicar el funcionamiento de <strong>faye</strong> más fácilmente pongamos un ejemplo:</p>
<p>Imaginemos que estamos creando una aplicación que necesita enviar notificaciones en tiempo real a todos los usuarios conectados a una página.</p>
<p>En nuestro <em>script</em> para <strong>node.js</strong> instroducimos lo siguiente:</p>
<div class="codesnip-container" >
<div class="javascript codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> Faye &nbsp; <span class="sy0">=</span> require<span class="br0">&#40;</span><span class="st0">&#8216;faye&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">server <span class="sy0">=</span> <span class="kw2">new</span> Faye.<span class="me1">NodeAdapter</span><span class="br0">&#40;</span><span class="br0">&#123;</span>mount<span class="sy0">:</span> <span class="st0">&#8216;/&#8217;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">server.<span class="me1">listen</span><span class="br0">&#40;</span>8000<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
</div>
<p>y lanzamos <strong>node.js</strong></p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1">$ node faye.js</div>
</li>
</ol>
</div>
</div>
<p>Ahora en el cliente, cargamos un fichero javascript con este contenido:</p>
<div class="codesnip-container" >
<div class="javascript codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> client <span class="sy0">=</span> <span class="kw2">new</span> Faye.<span class="me1">Client</span><span class="br0">&#40;</span><span class="st0">&#8216;http://localhost:8000/&#8217;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">client.<span class="me1">subscribe</span><span class="br0">&#40;</span><span class="st0">&#8216;/messages&#8217;</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span>message<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">&#8216;Got a message: &#8216;</span> <span class="sy0">+</span> message.<span class="me1">text</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
</div>
<p>Con estas dos sencillas operaciones, todos los usuarios que estén conectados a nuestra web estarán subscritos al canal <em>messages</em> y estarán en disposición de recibir información.</p>
<p>Para enviar un mensaje, desde uno de los clientes, que puede ser nuestro panel de control de la web ejecutamos el siguiente javascript:</p>
<div class="codesnip-container" >
<div class="javascript codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1">client.<span class="me1">publish</span><span class="br0">&#40;</span><span class="st0">&#8216;/messages&#8217;</span><span class="sy0">,</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">text<span class="sy0">:</span> <span class="st0">&#8216;Hello world&#8217;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
</div>
<p>Y inmediatamente en todos los navegadores de los visitantes de la web aparecerá un <em>alert</em> con el mensaje &#8220;Hello world&#8221;</p>
<p>Este es un ejemplo extraído de la web de faye, pero quería explicarlo con un ejemplo práctico. Como veis la potencialidad y simpleza de este sistema es grande, ya que podemos enviar más variables que <em>message</em> si lo necesitasemos (por ejemplo, número de mensajes sin leer, fecha, etc), tambien podemos tener varios canales distintos a por los que enviar distintos tipos de información o solo subscribir a algunos usuarios a esos canales.</p>
<p>En un próximo post explicaré como manipular los mensajes en el lado servidor, para por ejemplo, almacenarlos en una base de datos, enviar mensajes desde el propio servidor, etc.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/mejorando-node-js-faye/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2011/07/images-300x97.jpg" length="4484" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2011/07/images-300x97.jpg" width="300" height="97" medium="image" type="image/jpeg" />	</item>
		<item>
		<title>3D sin plugins en tu navegador con javascript: three.js</title>
		<link>http://www.opsou.com/blog/3d-sin-plugins-en-tu-navegador-con-javascript-three-js/</link>
		<comments>http://www.opsou.com/blog/3d-sin-plugins-en-tu-navegador-con-javascript-three-js/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 07:44:26 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Backstage]]></category>
		<category><![CDATA[creatividad]]></category>
		<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[three.js]]></category>
		<category><![CDATA[webgl]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=1562</guid>
		<description><![CDATA[Hasta hace muy poco necesitábamos plugins, para realizar tareas que ahora nos parecen triviales, reproducir sonido, ver videos, hasta la más simple de las animación de un botón. Pero esto esta cambiando, la evolución de los navegadores es frenética y la próxima liberación de la especificación final de HTML5 y CSS3 y otros estandares (actualmente son borradores),...<a class="rmore" href="http://www.opsou.com/blog/3d-sin-plugins-en-tu-navegador-con-javascript-three-js/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone" title="three.js" src="http://bassemdy.files.wordpress.com/2010/12/three-js-normal-material_1291339709492.png?w=604&amp;h=395" alt="" width="604" height="395" /></p>
<p>Hasta hace muy poco necesitábamos plugins, para realizar tareas que ahora nos parecen triviales, reproducir sonido, ver videos, hasta la más simple de las animación de un botón. Pero esto esta cambiando, la evolución de los navegadores es frenética y la próxima liberación de la especificación final de <strong>HTML5</strong> y <strong>CSS3</strong> y otros estandares (actualmente son borradores), nos hace pensar que podremos tener pronto una nueva revolución en la web. Permitiendo a los creativos dar rienda suelta a sui imaginación sin chocar con la usabilidad, la accesibilidad y el posicionamiento como sucede hasta la fecha.</p>
<p><span id="more-1562"></span></p>
<p>En una nueva demostración de las posibilidades de los estándares <a href="https://github.com/mrdoob">mrdoob</a>, pone a nuestra disposición un<strong> framework</strong> escrito completamente en<strong> javascrip</strong>t para manipulación de objetos 3D. Con lo que nos libera de la carga de realizar muchos de los cálculos necesarios para algo tan simple generar la perspectiva segun el posicionamiento de la cámara.</p>
<p>Simplemente nos tendremos que preocupar de colocar los objetos y la cámara en nuestro <em>lienzo</em> para empezar a jugar con el 3d en nuestro navegador.</p>
<p><strong><a title="three.js" href="https://github.com/mrdoob/three.js/" target="_blank">three.js</a></strong> es capaz de trabajar sobre <em>canvas</em> (modo soportado por IE9, safari 4, FF4, Chrome) y empleando webGL, una especificación que permite al navegador usar la tarjeta gráfica (GPU) para <em>hacer el render </em>de la escena, con la consiguiente mejora de velocidad y de calidad de los gráficos (soportado por Chrome y FF4)</p>
<p>Es casi obvio decir que modo <em>canvas</em> tiene limitaciones en cuanto al uso de texturas, luces y sistemas de partículas. Pero es perfectamente funcional para muchas aplicaciones.</p>
<p>No podíamos dejar de probarlo así que hemos jugado un poco con esta magnifica herramienta creando nuestro propio universo <strong><a href="http://www.opsou.com" target="_blank">Opsou</a></strong> en nuestra web. No dejéis de probarlo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/3d-sin-plugins-en-tu-navegador-con-javascript-three-js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recopilación de plugins Jquery para la selección de color (colorPicker)</title>
		<link>http://www.opsou.com/blog/recopilacion-de-plugings-jquery-para-la-seleccion-de-color-colorpicker/</link>
		<comments>http://www.opsou.com/blog/recopilacion-de-plugings-jquery-para-la-seleccion-de-color-colorpicker/#comments</comments>
		<pubDate>Mon, 25 Apr 2011 08:38:51 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Backstage]]></category>
		<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Usabilidad]]></category>
		<category><![CDATA[colorpicker]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=1469</guid>
		<description><![CDATA[En un proyecto reciente nos encontramos con la necesidad de facilitar al usuario la selección de colores, lo habitual seria emplear simplemente un campo input en el que el usuario introduce el color en formato hexadecimal (Ej #04afea). Para una usuario acostumbrado a trabajar con colores en la web esto no representa mayor problema, pero...<a class="rmore" href="http://www.opsou.com/blog/recopilacion-de-plugings-jquery-para-la-seleccion-de-color-colorpicker/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-1471 aligncenter" title="color_picker_windows" src="http://www.opsou.com/blog/wp-content/uploads/2011/04/color_picker_windows.jpg" alt="color_picker_windows" width="453" height="331" /></p>
<p>En un proyecto reciente nos encontramos con la necesidad de facilitar al usuario la selección de colores, lo habitual seria emplear simplemente un campo <em>input</em> en el que el usuario introduce el color en formato hexadecimal (Ej #04afea). Para una usuario acostumbrado a trabajar con colores en la web esto no representa mayor problema, pero para un usuario convencional el escoger un color de esta manera puede ser todo un suplicio.</p>
<p><span id="more-1469"></span>La mayoría de los usuarios de windows reconocen y están habituados el selector de color del sistema, ¿por que no tener algo similar a esto en nuestra web?</p>
<p>Aquí es donde entra en juego la <em>magia</em> de jQuery, os dejamos un listado de plugins que os permitirá mejorar la usabilidad de vuestras aplicaciones</p>
<h3><strong><a style="color: #000000; text-decoration: none; padding: 0px; margin: 0px;" title="farbtastic" rel="nofollow" href="http://acko.net/dev/farbtastic" target="_blank">Farbtastic</a> </strong></h3>
<p><a href="http://acko.net/dev/farbtastic">http://acko.net/dev/farbtastic</a></p>
<p><strong><img class="alignnone size-full wp-image-1477" title="farbtastic" src="http://www.opsou.com/blog/wp-content/uploads/2011/04/farbtastic.jpg" alt="farbtastic" width="173" height="226" /></strong></p>
<h3><strong><strong>ColorPicker</strong></strong></h3>
<p><strong><a href="http://www.eyecon.ro/colorpicker/">http://www.eyecon.ro/colorpicker/</a></strong></p>
<p><span style="color: #222222;"><img class="alignnone size-full wp-image-1478" title="Screenshot" src="http://www.opsou.com/blog/wp-content/uploads/2011/04/Screenshot.png" alt="Screenshot" width="368" height="184" /></span></p>
<h3>JPicker</h3>
<p><a href="http://www.digitalmagicpro.com/jPicker/">http://www.digitalmagicpro.com/jPicker/</a></p>
<p><span style="color: #222222;"> </span></p>
<p><strong><strong><img style="border: 0px initial initial;" title="jpicker" src="http://www.opsou.com/blog/wp-content/uploads/2011/04/jpicker.png" alt="jpicker" width="550" height="331" /></strong></strong></p>
<h3 style="margin-top: 0px; margin-right: 0px; margin-bottom: 12px; margin-left: 0px; color: #222222; font-size: 14px; padding: 0px;"><span style="color: #aa0000;"><a style="color: #333333; text-decoration: none; margin: 0px;" href="http://blog.meta100.com/post/600571131/mcolorpicker">mColorPicker</a></span></h3>
<p><strong><a href="http://blog.meta100.com/post/600571131/mcolorpicker">http://blog.meta100.com/post/600571131/mcolorpicker</a></strong></p>
<p><strong><img class="alignnone size-full wp-image-1480" title="Screenshot-1" src="http://www.opsou.com/blog/wp-content/uploads/2011/04/Screenshot-1.png" alt="Screenshot-1" width="382" height="216" /></strong></p>
<h3><strong>Small color picker</strong></h3>
<p><strong><a href="http://electrobeat.org/files/picker/example.html">http://electrobeat.org/files/picker/example.html</a></strong></p>
<p><strong><br />
</strong></p>
<p><strong><br />
</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/recopilacion-de-plugings-jquery-para-la-seleccion-de-color-colorpicker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2011/04/color_picker_windows-300x219.jpg" length="24321" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2011/04/color_picker_windows-300x219.jpg" width="300" height="219" medium="image" type="image/jpeg" />	</item>
		<item>
		<title>Como usar Twidge desde dos servidores</title>
		<link>http://www.opsou.com/blog/como-usar-twidge-desde-dos-servidores/</link>
		<comments>http://www.opsou.com/blog/como-usar-twidge-desde-dos-servidores/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 12:56:46 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Backstage]]></category>
		<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[servidores]]></category>
		<category><![CDATA[twidge]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=1315</guid>
		<description><![CDATA[Recientemente os hablamos de Twidge una herramientas para tweetear desde bash, pero si os pasa como a nosotros que necesitamos actualizar una misma cuenta de twitter, desde dos equipos distintos, os habreis dado cuenta que al configurar la cuenta en el segundo, en el primer equipo deja de funcionar. Esto se debe a que twitter...<a class="rmore" href="http://www.opsou.com/blog/como-usar-twidge-desde-dos-servidores/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-1311" title="Twidge ubuntu" src="http://www.opsou.com/blog/wp-content/uploads/2011/03/Captura-de-pantalla-sergio@sergio-desktop-.png" alt="Twidge ubuntu" width="650" height="386" /></p>
<p>Recientemente os hablamos de <strong>Twidge</strong> una herramientas para tweetear desde <em>bash</em>, pero si os pasa como a nosotros que necesitamos actualizar una misma cuenta de<strong> twitter</strong>, desde dos equipos distintos, os habreis dado cuenta que al configurar la cuenta en el segundo, en el primer equipo deja de funcionar.</p>
<p>Esto se debe a que <strong>twitter</strong> autoriza un solo <em>token</em> para cada aplicacion y al configurar la cuenta en <strong>twidge</strong> en el segundo equipo, impicitamente estamos revocando los permisos del <em>token</em> generado en el primer equipo.</p>
<p>La forma más sencilla de resolver este &#8220;problema&#8221; es copiar el archivo de configuración (<em>.twidgerc</em>) en tu directorio home de <strong>twidge</strong> del segundo equipo al primero.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/como-usar-twidge-desde-dos-servidores/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twidge: Actualiza tu twitter desde bash</title>
		<link>http://www.opsou.com/blog/twidge-actualiza-tu-twitter-desde-bash/</link>
		<comments>http://www.opsou.com/blog/twidge-actualiza-tu-twitter-desde-bash/#comments</comments>
		<pubDate>Fri, 25 Mar 2011 09:42:22 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Backstage]]></category>
		<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[twidge]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=1299</guid>
		<description><![CDATA[En muchas ocasiones necesitamos estar informados de la actividad de nuestro servidor o equipo local, confirmar la realizaciónj de backups, emitir alertas, etc. Lo tradiccional es que el servidor nos envie un correo electronico mediante el comando mailx Aqui os proponemos una alternativa más 2.0, el uso del comando twidge. Twidge es un cliente twitter...<a class="rmore" href="http://www.opsou.com/blog/twidge-actualiza-tu-twitter-desde-bash/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-1311" title="Twidge ubuntu" src="http://www.opsou.com/blog/wp-content/uploads/2011/03/Captura-de-pantalla-sergio@sergio-desktop-.png" alt="Twidge ubuntu" width="650" height="386" /></p>
<p>En muchas ocasiones necesitamos estar informados de la actividad de nuestro servidor o equipo local, confirmar la realizaciónj de backups, emitir alertas, etc.</p>
<p>Lo tradiccional es que el servidor nos envie un correo electronico mediante el comando</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1">mailx</div>
</li>
</ol>
</div>
</div>
<p>Aqui os proponemos una alternativa más 2.0, el uso del comando <strong><em>twidge.</em></strong></p>
<p><strong><em><span id="more-1299"></span></em></strong></p>
<p><em>Twidge </em>es un cliente twitter (que tambien opera con <em><strong>identi.ca</strong></em>) para uso en linea de comandos. Sus caracteristicas más importantes son:</p>
<ul>
<li>Es muy<strong> sencillo</strong> de utilizar</li>
<li>Es compatible con la <strong>API</strong> actual de twitter, usando <em>OAuth</em> (Olvidate de <em>curl</em>)</li>
<li>Puede <strong>acortar URL</strong> usando tinyurl</li>
<li>Esta muy pensado para su uso en script de shell</li>
</ul>
<p>Su isntalación es muy sencilla, esta disponible en los repositorios de <strong>Debian </strong>(y en <strong>Ubuntu</strong>, como explicaré ahora), aunque tambíen puedes <a href="https://github.com/jgoerzen/twidge" target="_blank">compilarlo</a> tu mismo)</p>
<p>Si usas <strong>Ubuntu</strong>, necesitas añadir una nueva fuente al repositorio, para ello editamos el <em>sources.list<br />
</em><em> </em>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">sudo</span> <span class="kw2">nano</span> <span class="sy0">/</span>etc<span class="sy0">/</span>apt<span class="sy0">/</span>sources.list</div>
</li>
</ol>
</div>
</div>
<p>Y añadimos en la última linea <em>deb http://ftp.de.debian.org/debian squeeze main</em><br />
Actualizamos el repositiorio:
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">sudo</span> <span class="kw2">apt-get</span> update</div>
</li>
</ol>
</div>
</div>
<p>Lo instalamos
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">sudo</span> <span class="kw2">apt-get</span> <span class="kw2">install</span> twidge</div>
</li>
</ol>
</div>
</div>
<p>Una vez instalado hay que configurarlo para su uso</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1">twidge setup</div>
</li>
</ol>
</div>
</div>
<p>Nos facilitara una URL que hay que visitar para obtener un token que nos devuelve <strong>twitter</strong> que ingresaremos en<strong> twidge</strong>.<br />
Y listo!! Ahora ya podemos usar nuestra cuenta <strong>Twitter</strong> desde nuestra <em>shell</em> favorita</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1">twidge lsrecent</div>
</li>
</ol>
</div>
</div>
<p>Nos devolverá las 20 últimas actualizaciones</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1">twidge update <span class="st0">&quot;Mi primer tweet desde shell&quot;</span></div>
</li>
</ol>
</div>
</div>
<p> Actualiza nuestro estado</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1">twidge follow opsou</div>
</li>
</ol>
</div>
</div>
<p>Siguenos <img src='http://www.opsou.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1">twidge unfollow microsoft</div>
</li>
</ol>
</div>
</div>
<p> Lo contario</p>
<div class="codesnip-container" >
<div class="bash codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1">twidge lsfollowers</div>
</li>
</ol>
</div>
</div>
<p> Lista los usuarios que te siguen</p>
<p>Ahora puedes modificar tus scripts para que te envien las actualizaciones del servidor. Nuestro consejo es que crees una cuenta twitter para tu servidor , que sigas esa cuenta con tu usuario y que protejas los tweets de miradas indiscretas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/twidge-actualiza-tu-twitter-desde-bash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2011/03/Captura-de-pantalla-sergio@sergio-desktop--300x178.png" length="56089" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2011/03/Captura-de-pantalla-sergio@sergio-desktop--300x178.png" width="300" height="178" medium="image" type="image/png" />	</item>
		<item>
		<title>Detección del foco de la ventana con javascript</title>
		<link>http://www.opsou.com/blog/deteccion-del-foco-de-la-ventana-con-javascript/</link>
		<comments>http://www.opsou.com/blog/deteccion-del-foco-de-la-ventana-con-javascript/#comments</comments>
		<pubDate>Fri, 05 Nov 2010 18:50:38 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Backstage]]></category>
		<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[blur]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[focus]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[window]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=1221</guid>
		<description><![CDATA[En algún caso necesitamos controlar cuando el usuario tiene atención sobre nuestra página, o lo que es lo mismo cuando &#8220;window has focus&#8221;.  Por ejemplo en el chat que hemos desarrollado para ChaXpert necesitabamos que cuando llegara un nuevo mensaje el navegador emitiera un sonido, pero no queriamos que ese sonido se reproduciese en todo...<a class="rmore" href="http://www.opsou.com/blog/deteccion-del-foco-de-la-ventana-con-javascript/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-1224" title="550294_96327600.redimensionado" src="http://www.opsou.com/blog/wp-content/uploads/2010/11/550294_96327600.redimensionado.jpg" alt="550294_96327600.redimensionado" width="500" height="333" /></p>
<p>En algún caso necesitamos controlar cuando el usuario tiene atención sobre nuestra página, o lo que es lo mismo cuando &#8220;window has focus&#8221;.  Por ejemplo en el chat que hemos desarrollado para <a href="http://www.chaxpert.com" target="_blank">ChaXpert</a> necesitabamos que cuando llegara un nuevo mensaje el navegador emitiera un sonido, pero no queriamos que ese sonido se reproduciese en todo momento, solo cuando el usuario estaba fuera de la aplicación web (en otra pestaña, en una aplicacion de escritorio), para ello necesitamos recurrir a los eventos de <em>window</em>, pero como en casi todo Internet Explorer va por su cuenta.<span id="more-1221"></span></p>
<p>Para Firefox, Safari, Chrome/Chromium los eventos a emplear son: <em>onfocus</em> y <em>onblur</em>, que se activan cuando la ventana(pestaña) adquiere el foco y lo pierde respectivamente.</p>
<p>En el caso de Internet Explorer estos eventos se llaman <em>onfocusin</em> y <em>onfocusout, </em>realizando la misma función que los citados anteriormente pero con otro nombre (cosas de Microsoft) y teniendo en cuenta que son eventos de <em>document</em>.</p>
<p>Para poder asignar las funciones a los eventos correspondientes a cada navegador en este caso se emplea la <a href="http://www.javascriptkit.com/javatutors/conditionalcompile.shtml" target="_blank">compilación condicional</a> de explorer como elemento diferenciador del navegador, pero si ya tenemos cargada alguna libreria de detección o queremos usar otro método solo tenemos que modificar el <em>if</em>.</p>
<p>Vamos al código!!</p>
<div class="codesnip-container" >
<div class="javascript codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> windowFocus<span class="sy0">=</span><span class="kw2">true</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> <span class="kw3">onBlur</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">windowFocus<span class="sy0">=</span><span class="kw2">false</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> <span class="kw3">onFocus</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">windowFocus<span class="sy0">=</span><span class="kw2">true</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="coMULTI">/*@cc_on!@*/</span><span class="kw2">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// check for Internet Explorer</span></div>
</li>
<li class="li1">
<div class="de1">document.<span class="me1">onfocusin</span> <span class="sy0">=</span> <span class="kw3">onFocus</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">document.<span class="me1">onfocusout</span> <span class="sy0">=</span> <span class="kw3">onBlur</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">window.<span class="kw3">onfocus</span> <span class="sy0">=</span> <span class="kw3">onFocus</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">window.<span class="kw3">onblur</span> <span class="sy0">=</span> <span class="kw3">onBlur</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
</div>
<p>Lo que hacemos, simplemente, es asignar una funcion a cada evento (previa selección del nombre de evento según el navegador) y segun la ventana/pestaña pierda o gane el foco cambiamos el valor de una variable global, a partir de lo cual podremos ejecutar las acciones que necesitemos en función de ese valor.</p>
<p>El código base lo hemos encontrado en  <a href="http://odondo.wordpress.com/2007/08/28/javascript-and-cross-browser-window-focus/">http://odondo.wordpress.com/2007/08/28/javascript-and-cross-browser-window-focus/</a> donde tambien podreis ver una <a href="http://www.thefutureoftheweb.com/demo/2007-05-16-detect-browser-window-focus/" target="_blank">demo de funcionamiento</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/deteccion-del-foco-de-la-ventana-con-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2010/11/550294_96327600.redimensionado-300x199.jpg" length="8879" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2010/11/550294_96327600.redimensionado-300x199.jpg" width="300" height="199" medium="image" type="image/jpeg" />	</item>
		<item>
		<title>Node.js: Javascript power!!</title>
		<link>http://www.opsou.com/blog/node-js-javascript-power/</link>
		<comments>http://www.opsou.com/blog/node-js-javascript-power/#comments</comments>
		<pubDate>Mon, 25 Oct 2010 17:07:50 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[node]]></category>
		<category><![CDATA[push]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=1124</guid>
		<description><![CDATA[Node.js es un entorno de programación de entrada/salida orientada a eventos, sobre el motor de Javascript V8 (el mismo que usa Google Chrome) Pero ¿Que quiere decir todo esto? ¿Y para que me puede servir? Lo más básico que podemos realizar con node.js es un servidor web (HTTP). var http = require&#40;&#8216;http&#8217;&#41;; http.createServer&#40;function &#40;req, res&#41;...<a class="rmore" href="http://www.opsou.com/blog/node-js-javascript-power/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-1177" title="node.js" src="http://www.opsou.com/blog/wp-content/uploads/2010/10/node.jpg" alt="node.js" width="500" height="300" /></p>
<p><strong><a href="http://www.nodejs.org" target="_blank">Node.js</a></strong> es un entorno de programación de entrada/salida orientada a eventos, sobre el motor de Javascript <strong>V8</strong> (el mismo que usa Google Chrome)</p>
<p><em>Pero ¿Que quiere decir todo esto? ¿Y para que me puede servir?</em></p>
<p><em><span id="more-1124"></span></em></p>
<p>Lo más básico que podemos realizar con <strong>node.js</strong> es un servidor web (HTTP).</p>
<div class="codesnip-container" >
<div class="javascript codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> http <span class="sy0">=</span> require<span class="br0">&#40;</span><span class="st0">&#8216;http&#8217;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">http.<span class="me1">createServer</span><span class="br0">&#40;</span><span class="kw2">function</span> <span class="br0">&#40;</span>req<span class="sy0">,</span> res<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">res.<span class="me1">writeHead</span><span class="br0">&#40;</span><span class="nu0">200</span><span class="sy0">,</span> <span class="br0">&#123;</span><span class="st0">&#8216;Content-Type&#8217;</span><span class="sy0">:</span> <span class="st0">&#8216;text/plain&#8217;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">res.<span class="me1">end</span><span class="br0">&#40;</span><span class="st0">&#8216;Hello World<span class="es0">\n</span>&#8216;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>.<span class="me1">listen</span><span class="br0">&#40;</span><span class="nu0">8124</span><span class="sy0">,</span> <span class="st0">&quot;127.0.0.1&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
</div>
<p>Con estas pocas lineas tenemos un servidor web escuchando el puerto 8124 funcionando en nuestro equipo y respondiendonos siempre &#8220;<em>Hello World</em>&#8221;</p>
<p>Podemos crear tambien servidores  TCP.</p>
<p>Para programar un servidor <strong>node.js</strong> empleamos javascript como lenguaje, con los que nos evitamos muchas de las complicaciones de otros lenguajes de programación como C, C++, python, etc.</p>
<p>Como comentaba, esta completamente orientado a eventos por lo que no tendremos que preocuparnos de muchas tareas que el servidor realiza por nosotros, por ejemplo. Si queremos responder a una petición, programamos la respuesta al evento &#8220;on data&#8221;.</p>
<p>Es muy ligero y rápido, y su <a href="http://nodejs.org/api.html" target="_blank">API</a> es simplemente fantastica, tenemos acceso de recursos del equipo (ficheros) y muchas utilidades que nos facilitarán el trabajo de programación.</p>
<p>Muchos os preguntareis: <em>¿Para que necesito programar un servidor HTTP si hay opciones muy potentes disponibles (apache, ngix, etc)?</em></p>
<p><em><span style="font-style: normal;">La respuesta es bien sencilla, no son tan ligeros y especificos como <strong>node.js</strong>, con el podremos hacer uso de la <a href="http://es.wikipedia.org/wiki/Tecnolog%C3%ADa_Push" target="_blank">tecnología push</a> que nos permitira hacer virguerias como estas:</span></em></p>
<ul>
<li>Chat en el navegador: <a href="http://chat.nodejs.org/">http://chat.nodejs.org/</a></li>
<li>Podemos mostrar el cursor de los otros visitantes de la web: <a href="http://jeffkreeftmeijer.com/2010/experimenting-with-node-js/">http://jeffkreeftmeijer.com/2010/experimenting-with-node-js/</a></li>
<li>Servidor de archivos estáticos <a href="http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/">http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/</a></li>
</ul>
<p>En proximos post seguiremos adentrandonos en este maravilloso proyecto</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/node-js-javascript-power/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2010/10/node-300x180.jpg" length="7382" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2010/10/node-300x180.jpg" width="300" height="180" medium="image" type="image/jpeg" />	</item>
		<item>
		<title>Sigue a chaXpert a través de su nuevo blog</title>
		<link>http://www.opsou.com/blog/sigue-a-chaxpert-a-traves-de-su-nuevo-blog/</link>
		<comments>http://www.opsou.com/blog/sigue-a-chaxpert-a-traves-de-su-nuevo-blog/#comments</comments>
		<pubDate>Wed, 20 Oct 2010 10:25:33 +0000</pubDate>
		<dc:creator>Pedro Figueras</dc:creator>
				<category><![CDATA[Backstage]]></category>
		<category><![CDATA[Branding digital]]></category>
		<category><![CDATA[Comunicación]]></category>
		<category><![CDATA[Diseño]]></category>
		<category><![CDATA[Gestión del conocimiento]]></category>
		<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Usabilidad]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=955</guid>
		<description><![CDATA[<img src="http://www.opsou.com/blog/wp-content/uploads/2010/10/tumblr_chaxpert-opsou.jpg" alt="Sigue a chaXpert a través de su nuevo blog" title="Sigue a chaXpert a través de su nuevo blog" /> Ya puedes seguir la actividad de chaXpert a través de twitter y de su blog. Tomando como guía el diseño corporativo de chaXpert, hemos diseñado la imagén gráfica de el nuevo blog montado sobre Tumblr, una evolución de el &#8220;concepto blog&#8220;. Relacionados: Primeras imágenes de chaXpert ¿Quieres ser un BetaTester de chaXpert? chaXpert, ya tiene...<a class="rmore" href="http://www.opsou.com/blog/sigue-a-chaxpert-a-traves-de-su-nuevo-blog/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<img src="http://www.opsou.com/blog/wp-content/uploads/2010/10/tumblr_chaxpert-opsou.jpg" alt="Sigue a chaXpert a través de su nuevo blog" title="Sigue a chaXpert a través de su nuevo blog" /> <p>Ya puedes seguir la actividad de <strong><a href="http://www.chaxpert.com" target="_blank">chaXpert</a></strong> a través de <a href="http://www.twitter.com/chaxpert/" target="_blank"><strong>twitter</strong></a> y de su <strong><a href="http://sayhi.chaxpert.com/" target="_blank">blog</a></strong>.</p>
<p>Tomando como guía el diseño corporativo de <strong><a href="http://www.chaxpert.com" target="_blank">chaXpert</a></strong>, hemos diseñado la imagén gráfica de el nuevo blog montado sobre <a href="http://www.tumblr.com/" target="_blank"><strong>Tumblr</strong></a>, una evolución de el &#8220;<strong>concepto blog</strong>&#8220;.</p>
<p></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 12px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; text-decoration: none; font-family: Helvetica, Arial, FreeSans; padding: 0px;"><strong><em><br />
Relacionados</em></strong>:</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 12px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; text-decoration: none; font-family: Helvetica, Arial, FreeSans; padding: 0px;"><a href="http://www.opsou.com/blog/2010/10/13/primeras-imagenes-de-chaxpert/" target="_self">Primeras imágenes de chaXpert</a><br />
<a href="http://www.opsou.com/blog/2010/10/11/¿quieres-ser-un-betatester-de-chaxpert/" target="_self"> ¿Quieres ser un BetaTester de chaXpert?</a><br />
<a href="http://www.opsou.com/blog/2010/08/02/chaxpert-ya-tiene-imagen-corporativa/" target="_self">chaXpert, ya tiene imagen corporativa</a><a href="http://www.opsou.com/blog/2010/07/12/necesito-a-alguien-de-confianza-¿eres-tu/" target="_self"><br />
Necesito a alguien de confianza. ¿eres tú?</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/sigue-a-chaxpert-a-traves-de-su-nuevo-blog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2010/10/tumblr_chaxpert-opsou-250x300.jpg" length="17728" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2010/10/tumblr_chaxpert-opsou-250x300.jpg" width="250" height="300" medium="image" type="image/jpeg" />	</item>
		<item>
		<title>Servidor de Máquinas virtuales remotas con Virtualbox</title>
		<link>http://www.opsou.com/blog/servidor-de-maquinas-virtuales-remotas-con-virtualbox/</link>
		<comments>http://www.opsou.com/blog/servidor-de-maquinas-virtuales-remotas-con-virtualbox/#comments</comments>
		<pubDate>Tue, 19 Oct 2010 08:05:00 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Backstage]]></category>
		<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=830</guid>
		<description><![CDATA[Para un desarrollador de web, es muy importante tener un entorno de desarrollo y de prueba completamente optimizado. En el apartado de pruebas lo recomendable es que probemos nuestros desarrollos web con la mayor cantidad de navegadores posibles. Si como es nuestro caso, empleas Linux como sistema operativo de desarrollo, podras probar si problema la...<a class="rmore" href="http://www.opsou.com/blog/servidor-de-maquinas-virtuales-remotas-con-virtualbox/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone" title="virtualbox" src="http://www.opsou.com/blog/wp-content/uploads/2010/10/virtualbox-1024x819.png" alt="virtualbox" width="90%"  /></p>
<p>Para un desarrollador de web, es muy importante tener un entorno de desarrollo y de prueba completamente optimizado.</p>
<p>En el apartado de pruebas lo recomendable es que probemos nuestros desarrollos web con la mayor cantidad de navegadores posibles.</p>
<p>Si como es nuestro caso, empleas Linux como sistema operativo de desarrollo, podras probar si problema la mayoria de los navegadores: Firefox, Chrome, Opera, Konqueror, etc, (incluso Safari usando <strong>wine)</strong>, pero hay un navegador que se nos va a escapar y que por desgracia para la web es ampliamente utilizado: <strong>Internet Explorer.</strong></p>
<p><strong><span id="more-830"></span></strong></p>
<p>Una posible solución es disponer de un equipo con Windows (XP,Vista, 7) con este navegador y acceder a el para realizar las pruebas. Esto supone disponer de un equipo que únicamente funcionará en Windows, con el coste que ello supone.</p>
<p>La solución más económica es instalar windows en una máquina virtual y realizar las pruebas desde ella. En nuestro caso usamos VirtualBox.</p>
<p>El problema de arrancar la maquina virutal en el mismo equipo  es el consumo de recursos, sobre todo de memoria, lo que va a reducir el rendimiento del equipo y nuestra productividad.</p>
<p>Por ello y aprovechandonos del protoloco VRCP que implementa VirtualBox, podemos instalar  la máquia virtual con windows en otro equipo de la red y acceder a la citada máquina mediante algun cliente de Terminal Server. De esta manera transladaremos la carga de recursos (procesador, memoria, etc) a otro equipo, permitiendonos además que varios usuarios utilicen la máquina virutal desde sus puestos de trabajo.</p>
<p>Voy a dar por hecho que ya tenemos instalada y configurada la máquina virtual en el equipo remoto (la documentación de instalación se puede consultar <a href="http://www.virtualbox.org/wiki/Linux_Downloads">aqui</a>).</p>
<p>Ahora accedemos por ssh al equipo en el que tenemos la máquina virtual.</p>
<p>ssh equipo_vm</p>
<p>Y arrancamos la máquina virtual pero sin interface gŕafica</p>
<p>VBoxHeadless -startvm &#8220;Windows 7&#8243;</p>
<p>Ahora ya podemos conectarnos via cliente de terminal a la máquina y realizar nuestras pruebas</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/servidor-de-maquinas-virtuales-remotas-con-virtualbox/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2010/10/virtualbox-300x240.png" length="63854" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2010/10/virtualbox-300x240.png" width="300" height="240" medium="image" type="image/png" />	</item>
		<item>
		<title>Herramientas TIC para la coordinación de proyectos</title>
		<link>http://www.opsou.com/blog/herramientas-tic-para-la-coordinacion-de-proyectos/</link>
		<comments>http://www.opsou.com/blog/herramientas-tic-para-la-coordinacion-de-proyectos/#comments</comments>
		<pubDate>Mon, 18 Oct 2010 13:21:31 +0000</pubDate>
		<dc:creator>Pedro Figueras</dc:creator>
				<category><![CDATA[Backstage]]></category>
		<category><![CDATA[Comunicación]]></category>
		<category><![CDATA[Gestión del conocimiento]]></category>
		<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Usabilidad]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[redmine]]></category>
		<category><![CDATA[skype]]></category>
		<category><![CDATA[yammer]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=154</guid>
		<description><![CDATA[<img src="http://www.opsou.com/blog/wp-content/uploads/2010/10/tic_01.jpg" alt="Herramientas TIC para la coordinación de proyectos" title="Herramientas TIC para la coordinación de proyectos" /> A veces, cuando nos enfrentamos a grandes proyectos en los que participan un grupo de profesionales de distintas áreas de producción, nos encontramos que algunos de los mayores problemas con los que te puedes encontrar son la comunicación y el tiempo. No siempre es posible estar todos a la vez, un día a una hora...<a class="rmore" href="http://www.opsou.com/blog/herramientas-tic-para-la-coordinacion-de-proyectos/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<img src="http://www.opsou.com/blog/wp-content/uploads/2010/10/tic_01.jpg" alt="Herramientas TIC para la coordinación de proyectos" title="Herramientas TIC para la coordinación de proyectos" /> <p>A veces, cuando nos enfrentamos a grandes proyectos en los que participan un grupo de profesionales de distintas áreas de producción, nos encontramos que algunos de los mayores problemas con los que te puedes encontrar son la <strong>comunicación</strong> y <strong>el tiempo</strong>. No siempre es posible estar todos a la vez, un día a una hora y en un sitio determinado.</p>
<p>En este post, hablaremos de algunas de las <strong>herramientas TIC</strong> que usamos para coordinar proyectos de este tipo, en los que podemos trabajar con personas no localizadas en la misma oficina, aportando cada uno su valor al proyecto.<span id="more-154"></span></p>
<h2><strong><br />
REDMINE</strong></h2>
<p>Esta estupenda aplicación de software libre que podemos instalar en nuestro servidor, nos permite tener documentado varios proyectos a la vez. Disponemos de varias herramientas como foros, wikis, noticias, gestor de tareas, planificación, repositorio de archivos.</p>
<p>De esta manera, el cliente puede consultar las actas de las reuniones, las decisiones tomadas, el estado global del proyecto o tareas determinadas, aportar documentación o comentarios, etc.</p>
<p>Al grupo de trabajo nos facilita la consulta sobre la documentación del proyecto. Es como tener una archivador gigante en el que todos aportamos nuestro granito de hora.</p>
<p>Más información: <a href="http://www.redmine.org/" target="_blank">Página oficial <strong> Redmine</strong></a>.</p>
<h2><strong><br />
SKYPE</strong></h2>
<p><a href="http://www.opsou.com/blog/wp-content/uploads/2010/10/tic_02.jpg"><img class="alignleft size-full wp-image-891" style="border: 0; margin-bottom: 5px; margin-right: 20px;" title="Skype logo" src="http://www.opsou.com/blog/wp-content/uploads/2010/10/tic_02.jpg" alt="Skype logo" width="168" height="168" /></a>Creo que no es necesario hablar de esta herramienta de Voz IP que todos conocemos. Creo que lo interesante es el uso conceptual que se le pueda dar.</p>
<p>Evidentemente nos mantiene en contacto por voz a todo el equipo. Aparte de las charlas de uno a uno para resolver temas puntuales, también nos facilita las reuniones de estado de proyecto, creando una sala en la que todos podemos hablar desde el sitio que estemos con ordenador o teléfono móvil.</p>
<p>Una de las grandes ayudas que tiene ahora el <strong>Skype</strong> es la posibilidad de compartir el escritorio. Podemos presentar el diseño de la aplicación a distancia y hacer modificaciones al momento de la mano de nuestro cliente.</p>
<p>También supone un gran ahorro de costes el su uso para la formación on-line. Sin necesidad de desplazarse, ayudamos a el cliente a usar y entender el funcionamiento de los paneles de gestión.</p>
<p>Más información: <a href="http://www.skype.com" target="_blank">Página oficial <strong>Skype</strong></a>.</p>
<h2><strong><br />
DROPBOX</strong></h2>
<p><a href="http://www.opsou.com/blog/wp-content/uploads/2010/10/tic_03.jpg"><img class="alignleft size-full wp-image-891" style="border:0; margin-bottom: 5px; margin-right: 20px;" title="Dropbox logo" src="http://www.opsou.com/blog/wp-content/uploads/2010/10/tic_03.jpg" alt="Dropbox logo" width="168" height="168" /></a>Cuando de lo que se trata es de pasarnos archivos entre nosotros, resulta muy efectivo Dropbox. Al igual que todas las herramientas que usamos, son accesibles desde cualquier sistema: <strong>MacOSX</strong>, <strong>Windows</strong>, <strong>Linux</strong>, <strong>Android</strong> y <strong>iPhone/iPad</strong>.</p>
<p>Se trata de compartir una carpeta en tu sistema con una red de usuarios. Borres, copies o modifiques los archivos que contiene esta carpeta, se actualizará automáticamente en cada uno de los sistemas que componen el grupo y viceversa.</p>
<p>Tiene una versión gratuíta que te ofrecen 2Gb y otra de pago que te ofrece otros servicios y más espacio en el disco duro virtual.</p>
<p>Su uso es muy sencillo: creas una carpeta dentro de la que has asignado para <strong>Dropbox</strong>, y le envías una invitación al usuario con quién la quieras compartir. Si simplemente quieres que tu cliente se descargue, por ejemplo, un zip con las pantallas diseñadas, hay un modo de enviarle solo un link de descarga.</p>
<p>En cualquiera de los dos casos, si arrastras los archivos a esta carpeta compartida, en breve ya estarán disponibles para el usuario que elijas.</p>
<p>Más información: <a href="https://www.dropbox.com/" target="_blank">Página oficial <strong>Dropbox</strong></a>.</p>
<h2><strong><br />
YAMMER</strong></h2>
<p><a href="http://www.opsou.com/blog/wp-content/uploads/2010/10/tic_04.jpg"><img class="alignleft size-full wp-image-891" style="border:0; margin-bottom: 5px; margin-right: 20px;" title="Yammer logo" src="http://www.opsou.com/blog/wp-content/uploads/2010/10/tic_04.jpg" alt="Yammer logo" width="168" height="168" /></a>Por último, no podía faltar una red social. Yammer está a caballo entre <strong>Facebook</strong> y <strong>Twitter</strong>. Lo mejor de cada casa. Te permite crear múltiples canales con los usuarios que quieras. Teniendo un canal para cada proyecto y asignadas en éllas las personas que participan en él, nos sirve como hilo conductor de consultas importantes para el proyecto, conversaciones y comentarios.</p>
<p>Se puede usar a modo de <strong>twitter </strong>con mensajes cortos que recibes automáticamente en tu móvil, avisándote además con mediante mail cuando hay actividad en el canal. Si necesitas algo más completo, puede usarse como fuese un <strong>facebook</strong> subiendo archivos, replicando determinado comentario, etc.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/herramientas-tic-para-la-coordinacion-de-proyectos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2010/10/tic_04.jpg" length="39043" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2010/10/tic_04.jpg" width="168" height="168" medium="image" type="image/jpeg" />	</item>
		<item>
		<title>¿Quieres ser un BetaTester de chaXpert?</title>
		<link>http://www.opsou.com/blog/%c2%bfquieres-ser-un-betatester-de-chaxpert/</link>
		<comments>http://www.opsou.com/blog/%c2%bfquieres-ser-un-betatester-de-chaxpert/#comments</comments>
		<pubDate>Mon, 11 Oct 2010 13:18:19 +0000</pubDate>
		<dc:creator>Pedro Figueras</dc:creator>
				<category><![CDATA[Comunicación]]></category>
		<category><![CDATA[Gestión del conocimiento]]></category>
		<category><![CDATA[Labs]]></category>
		<category><![CDATA[Usabilidad]]></category>
		<category><![CDATA[beta testers]]></category>
		<category><![CDATA[chaxpert]]></category>
		<category><![CDATA[redes sociales]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=938</guid>
		<description><![CDATA[<img src="http://www.opsou.com/blog/wp-content/uploads/2010/10/chaXpert_opsou.jpg" alt="¿Quieres ser un BetaTester de chaXpert?" title="¿Quieres ser un BetaTester de chaXpert?" /> La semana pasada comenzó su andadura chaXpert, como ya os contamos hace unos meses, un nueva red social en el que el profesor se puede convertir en alumno y el alumno en profesor. Pues bien, si eres de los que disfrutan trasteando con las aplicaciones, esta es tu oportunidad de formar parte de un grupo...<a class="rmore" href="http://www.opsou.com/blog/%c2%bfquieres-ser-un-betatester-de-chaxpert/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<img src="http://www.opsou.com/blog/wp-content/uploads/2010/10/chaXpert_opsou.jpg" alt="¿Quieres ser un BetaTester de chaXpert?" title="¿Quieres ser un BetaTester de chaXpert?" /> <p></p>
<p>La semana pasada comenzó su andadura <strong><a href="http://www.chaxpert.com" target="_blank">chaXpert</a></strong>, como ya os contamos hace unos meses, un nueva red social en el que el profesor se puede convertir en alumno y el alumno en profesor.</p>
<p>Pues bien, si eres de los que disfrutan trasteando con las aplicaciones, esta es tu oportunidad de formar parte de un grupo exclusivo de personas que probarán <strong><a href="http://www.chaxpert.com" target="_blank">chaXpert</a></strong> estas semanas. Podrás aportar tu experiencia en redes sociales y aplicaciones web.</p>
<p><a href="http://www.chaxpert.com" target="_blank">Haz clic aquí para visitar su página y darte de alta</a>.</p>
<p>Tendrás una invitación para ser de los primeros.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 12px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; text-decoration: none; font-family: Helvetica, Arial, FreeSans; padding: 0px;"><strong><em><br />
Relacionados</em></strong>:</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 12px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; text-decoration: none; font-family: Helvetica, Arial, FreeSans; padding: 0px;"><a href="http://www.opsou.com/blog/2010/08/02/chaxpert-ya-tiene-imagen-corporativa/" target="_self">chaXpert, ya tiene imagen corporativa</a><a href="http://www.opsou.com/blog/2010/07/12/necesito-a-alguien-de-confianza-¿eres-tu/" target="_self"><br />
Necesito a alguien de confianza. ¿eres tú?</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/%c2%bfquieres-ser-un-betatester-de-chaxpert/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2010/10/chaXpert_opsou-300x159.jpg" length="21665" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2010/10/chaXpert_opsou-300x159.jpg" width="300" height="159" medium="image" type="image/jpeg" />	</item>
		<item>
		<title>Parse de elementos HTML desde PHP para carga con AJAX</title>
		<link>http://www.opsou.com/blog/parse-de-elementos-html-desde-php-para-carga-con-ajax/</link>
		<comments>http://www.opsou.com/blog/parse-de-elementos-html-desde-php-para-carga-con-ajax/#comments</comments>
		<pubDate>Thu, 09 Sep 2010 11:38:59 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Backstage]]></category>
		<category><![CDATA[Branding digital]]></category>
		<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=209</guid>
		<description><![CDATA[En algunas ocasiones nos hemos encontrado con la necesidad de dotar a la página de carga de elementos mediante ajax. Es importante partir de una web completamente funcional sin Javascript para no penalizar el SEO y a aquellos usuarios que no usan Javascript. La tentación es solicitar mediante AJAX el contenido global de la página...<a class="rmore" href="http://www.opsou.com/blog/parse-de-elementos-html-desde-php-para-carga-con-ajax/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-405" title="php_code" src="http://www.opsou.com/blog/wp-content/uploads/2010/04/php_code.jpg" alt="php_code" width="500" height="322" /></p>
<p>En algunas ocasiones nos hemos encontrado con la necesidad de dotar a la página de carga de elementos mediante ajax.  Es importante partir de una web completamente funcional sin Javascript para no penalizar el SEO y a aquellos usuarios que no usan Javascript.  La tentación es solicitar mediante AJAX el contenido global de la página a cargar y luego dejar que Jquery mediante selectores filtren la información que realmente vamos a actualizar en la web. Esto conlleva un exceso innecesario de trafico, ya que vamos a solicitar todo el contenido de la pagina para emplear solo una pieza de ella, ya que normalmente la cabecera, menú, etc.. son los mismos para cada una de las páginas.  Para resolver esto hemos valorado dos opciones:</p>
<ol>
<li>Construir un fichero php que solo devuelva la información que necesitamos.</li>
<li>Parsear directamente la salida de PHP para que solo envie a la red la información necesaria.</li>
</ol>
<p><span id="more-209"></span></p>
<p>El primero de los casos es optimo en cuanto a carga y trafico ya que solo genera la información necesaria y no genera consultas extra a la base de datos, pero tiene un inconveniente: el mantenimiento, cualquier cambio en la lógica de la aplicación se debe hacer por duplicado en la web convencional y en el script que envía la pieza para AJAX. Y esto es un problema sobre todo en grandes aplicaciones.  El segundo caso, resuleve este problema ya que partiendo del mismo código y con el paso de una variable get, PHP solo devuelve el contendido necesario eliminando el tráfico innecesario. Si empleamos algún sistema de cacheo de la salida de PHP, como es nuestro caso, eliminamos las consultas extras para componer el resto de la página que no vamos a necesitar.  Solo penalizaremos la carga de memoria y CPU del servidor necesaria para el parseo del XHTML.  Nosotros nos decantamos por la segunda opcion y para ello usamos <a href="http://simplehtmldom.sourceforge.net/">http://simplehtmldom.sourceforge.net/</a> una herramienta que nos permite trabajar con el DOM de forma similar a como podemos hacer con JQuery.  En nuestro PHP solo tenemos que añadir las siguientes lineas:
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">&quot;selector&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="re0">$html</span> <span class="sy0">=</span> str_get_html<span class="br0">&#40;</span><span class="re0">$globalHTML</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="kw1">echo</span> <span class="re0">$html</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>find<span class="br0">&#40;</span><span class="re0">$selector</span><span class="sy0">,</span>0<span class="br0">&#41;</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>innertext<span class="sy0">;</span> <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
</div>
<p> Donde <em>$globalHTML</em> es la variable que contiene todo el HTML de la páginba, nosotros usamos habitualmente <em><strong>Smarty</strong></em>, por lo que recuperar el HTML antes de enviarlo a la salida es muy sencillo usando <em>fetch</em> en lugar de <em>display</em> Y en nuestro javascript
<div class="codesnip-container" >
<div class="javascript codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1">$<span class="br0">&#40;</span><span class="st0">&quot;#seccionACargar&quot;</span><span class="br0">&#41;</span>.<span class="me1">load</span><span class="br0">&#40;</span><span class="st0">&quot;nuestraPagina.php?selector=#seccionACargar&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
</div>
<p> De esta forma al cargar <em>nuestraPagina.php?selector=#seccionACargar </em>el php no devolvera todo el HTML de la página si no que nos devolvera solo el contenido del selector ahorrando una buena candidad de bytes (o Kb) en la trasmisión de los datos.  Como ya he comentado esto supone un gran ahorro con respecto a la alternativa que nos ofrece jquery
<div class="codesnip-container" >
<div class="javascript codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1">$<span class="br0">&#40;</span><span class="st0">&quot;#seccionACargar&quot;</span><span class="br0">&#41;</span>.<span class="me1">load</span><span class="br0">&#40;</span><span class="st0">&quot;nuestraPagina.php #seccionACargar&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
</div>
<p> ya que Jquery recupera la página completa y luego realiza el parseo.  Nosotros hemos usado con éxito esta técnica en<a href="http:// www.berroguetto.com" target="_blank"> www.berroguetto.com</a> para cargar cada una de las secciones de la web, y elemento de ellas, como las noticias y cada una de las páginas de los paginadores.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/parse-de-elementos-html-desde-php-para-carga-con-ajax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interactuando. Tipos de códigos QR</title>
		<link>http://www.opsou.com/blog/interactuando-tipos-de-codigos-qr/</link>
		<comments>http://www.opsou.com/blog/interactuando-tipos-de-codigos-qr/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 16:34:33 +0000</pubDate>
		<dc:creator>Pedro Figueras</dc:creator>
				<category><![CDATA[Códigos QR]]></category>
		<category><![CDATA[Comunicación]]></category>
		<category><![CDATA[Labs]]></category>
		<category><![CDATA[Usabilidad]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=673</guid>
		<description><![CDATA[Dentro de los códigos QR existen varios tipos que ayudarán a nuestros usuarios a usar el móvil para realizar distintas acciones: visitar nuestra página web, que lea un texto, que conecte con nuestro facebook o twitter, una localización Google Maps, SMS, datos de contacto, etc. A continuación os mostramos algunas ejemplos: Tipo página web Si...<a class="rmore" href="http://www.opsou.com/blog/interactuando-tipos-de-codigos-qr/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-801" title="codigosQR_Opsou" src="http://www.opsou.com/blog/wp-content/uploads/2010/08/codigosQR_Opsou.jpg" alt="codigosQR_Opsou" width="600" height="270" /></p>
<p>Dentro de los códigos QR existen varios tipos que ayudarán a nuestros usuarios a usar el móvil para realizar distintas acciones: visitar nuestra página web, que lea un texto, que conecte con nuestro facebook o twitter, una localización Google Maps, SMS, datos de contacto, etc.</p>
<p><span id="more-673"></span></p>
<p>A continuación os mostramos algunas ejemplos:</p>
<div class="codesnip-container" >
<h2><strong>Tipo página web</strong></h2>
<h3 style="font-size: 1.17em;"><span style="font-weight: normal; font-size: 13px;">Si nuestro usuario, mediante su teléfono móvil, lee este código, se le abrirá en su navegador automáticamente y la web que hayamos codificado en el gráfico qr. En el ejemplo salta a </span><span style="font-size: 13px;"><a href="http://www.pedrofigueras.com" target="_self">www.pedrofigueras.com</a></span><span style="font-weight: normal; font-size: 13px;">.</span></h3>
<p style="text-align: center; "><img class="alignnone size-full wp-image-676" title="Código QR, Opsou: tipo web" src="http://www.opsou.com/blog/wp-content/uploads/2010/08/qr_www.png" alt="Código QR, Opsou: tipo web" width="230" height="230" /></p>
<h2 style="font-size: 1.5em;"><strong>Tipo servicio: Twitter</strong></h2>
<p style="text-align: left;">Con la misma facilidad podremos hacer que el usuario visite nuestro <strong>Twitter</strong>.</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-694" title="Código QR, Opsou: tipo Twitter" src="http://www.opsou.com/blog/wp-content/uploads/2010/08/qr_twitter.png" alt="Código QR, Opsou: tipo Twitter" width="230" height="230" /></p>
<h2><span style="font-size: small;"><span style="font-weight: normal;"><span style="font-size: x-large;"><span><strong><br />
</strong></span></span></span></span></h2>
<h2 style="font-size: 1.5em;"><strong>Tipo servicio: Linkedin</strong></h2>
<p style="text-align: left;">O nuestro perfil en la red profesional <strong>Linkedin</strong>.</p>
<p style="text-align: center; "><img class="alignnone size-full wp-image-703" title="Código QR, Opsou: tipo Linkedin" src="http://www.opsou.com/blog/wp-content/uploads/2010/08/qr_linkedin.png" alt="Código QR, Opsou: tipo Linkedin" width="230" height="230" /></p>
<p style="text-align: center;">
<h2 style="font-size: 1.5em;"><span style="font-size: small;"><span style="font-weight: normal;"><span style="font-size: x-large;"><span><strong><br />
</strong></span></span></span></span></h2>
<p style="text-align: left;">
<h2 style="font-size: 1.5em;"><strong>Tipo SMS</strong></h2>
<p style="text-align: left;">Qué nos envíen un SMS fácilmente, siempre con el consentimiento del usuario. No es un sistema automático.</p>
<p style="text-align: center;"><img class="size-full wp-image-704 aligncenter" title="Código QR, Opsou: tipo SMS" src="http://www.opsou.com/blog/wp-content/uploads/2010/08/sms.png" alt="Código QR, Opsou: tipo SMS" width="230" height="230" /></p>
<h2 style="font-size: 1.5em;"><span style="font-size: small;"><span style="font-weight: normal;"><span style="font-size: x-large;"><strong><br />
</strong></span></span></span></h2>
<p style="text-align: left;">
<h2 style="font-size: 1.5em;"><strong>Tipo Contacto</strong></h2>
<p style="text-align: left;">Aquello de&#8230; ¿Tienes una tarjeta tuya? &#8230;se queda obsoleto. Si quieres pasarle tus datos a la agenda de el teléfono móvil otra persona, solo tiene que acercar su móvil este gráfico qr y rápidamente tu ficha de contacto formará parte de su agenda. Esta operación dependerá en gran medida de el terminal y del software que uséis para leer éstos códigos.</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-710" title="Código QR, Opsou: tipo Contact" src="http://www.opsou.com/blog/wp-content/uploads/2010/08/qr_contact.png" alt="Código QR, Opsou: tipo Contact" width="230" height="230" /></p>
<h2 style="font-size: 1.5em;"><span style="font-size: small;"><span style="font-weight: normal;"><span style="font-size: x-large;"><span><strong><br />
</strong></span></span></span></span></h2>
<p style="text-align: left;">
<h2 style="font-size: 1.5em;"><strong>Tipo Google Maps.</strong></h2>
<p style="text-align: left;">Mostrar una situación sobre <strong>Google Maps</strong>.</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-711" title="Código QR, Opsou: tipo Geoposición" src="http://www.opsou.com/blog/wp-content/uploads/2010/08/qr_geo.png" alt="Código QR, Opsou: tipo Geoposición" width="230" height="230" /></p>
<p style="text-align: left;">
<p style="text-align: left;">
<h2 style="font-size: 1.5em;"><strong>Tipo Texto.</strong></h2>
<p style="text-align: left;">Podemos mostrar al usuario un párrafo de texto usando este tipo de código. Por ejemplo, información sobre algún producto.</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-715" title="Código QR, Opsou: tipo Texto" src="http://www.opsou.com/blog/wp-content/uploads/2010/08/qr_text.png" alt="Código QR, Opsou: tipo Texto" width="230" height="230" /></p>
<p style="text-align: left;">Como muestra, creo con los que hemos expuesto, tenemos mas que suficiente. En futuros post, iremos mostrando coomo para dejar rienda suelta a la creatividad a la hora del uso.</p>
</div>
<p style="text-align: left;">
<p style="text-align: left;">
<p style="text-align: left;">
<p style="text-align: left;"><strong>Relacionados</strong></p>
<p><a href="http://www.opsou.com/blog/2010/08/30/software-lector-de-codigos-qr/" target="_self">Software lector de códigos QR</a><br />
<a href="http://www.opsou.com/blog/2010/08/19/los-codigos-qr/" target="_self">Los códigos QR</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/interactuando-tipos-de-codigos-qr/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2010/08/qr_www.png" length="1136" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2010/08/qr_www.png" width="230" height="230" medium="image" type="image/png" />	</item>
		<item>
		<title>Usabilidad: Notificaciones en el título de la página</title>
		<link>http://www.opsou.com/blog/notificaciones-cambiantes-en-titulo-de-la-pagina/</link>
		<comments>http://www.opsou.com/blog/notificaciones-cambiantes-en-titulo-de-la-pagina/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 16:34:17 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Backstage]]></category>
		<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Usabilidad]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=644</guid>
		<description><![CDATA[Hoy en dia la mayoria de los usuarios cuando estamos navegando tenemos abiertas simultaneamente varias pestañas en el navegador. A veces nuestra aplicación web necesita llamar la atención del usuario para requerir de el una acción o simplemente hacerle sabes que ha recibido una notificación. Una buena manera de hacerlo es cambiar alternativamente el título...<a class="rmore" href="http://www.opsou.com/blog/notificaciones-cambiantes-en-titulo-de-la-pagina/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-648" title="chrome-blank-new-tab" src="http://www.opsou.com/blog/wp-content/uploads/2010/08/chrome-blank-new-tab.gif" alt="chrome-blank-new-tab" width="548" height="271" /></p>
<p>Hoy en dia la mayoria de los usuarios cuando estamos navegando tenemos abiertas simultaneamente varias pestañas en el navegador. A veces nuestra aplicación web necesita llamar la atención del usuario para requerir de el una acción o simplemente hacerle sabes que ha recibido una notificación.</p>
<p>Una buena manera de hacerlo es cambiar alternativamente el título de la página por un aviso, de la misma forma que hace facebook cuando recibimos una notificación de chat; el título de la página cambia 3 o 4 veces entre &#8220;Facebook&#8230;.&#8221; y &#8220;Fulanito te ha enviado un mensaje&#8221;.</p>
<p>Para facilitar esta, a simple vista tarea, hemos crado un plugin de jQuery muy sencillo de utilizar.<span id="more-644"></span> Solo tenemos que pasarle como parámetro, el mensaje de aviso que se va a alternar con el título original de la página.</p>
<p>Podemos pasarle como opciones el número de repeticiones del cambio y el tiempo (en milisegundos) entre cambios.</p>
<div class="codesnip-container" >$.titleBlink(&#8220;Tienes un nuevo correo&#8221;,{repeat: 10,delay: 1000});</div>
<p>Os dejo el código fuente del pluign o podeis <a title="Jquery Title Blink" href="http://opsou.com/blog/wp-content/uploads/2010/08/jquery.titleBlink.zip">descargarlo directamente aquí</a></p>
<div class="codesnip-container" >
<div class="javascript codesnip" style="font-family:monospace;">
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* Title blink for web pages that allow to change title page blinks like facebook chat notificacion</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* This file is part of jquery.titleBlink</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* jquery.titleBlink is free software: you can redistribute it and/or modify it under</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* the terms of the GNU Lesser General Public License as published by the Free</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* Software Foundation, either version 3 of the License, or (at your option)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* any later version.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* jquery.titleBlink is distributed in the hope that it will be useful, but WITHOUT ANY</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* more details.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* You should have received a copy of the GNU Lesser General Public License</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* along with jquery.titleBlink. If not, see .</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* @author &nbsp; &nbsp; &nbsp;Sergio Carracedo Martinez</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* @copyright &nbsp; 2010 Sergio Carracedo Martinez</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* @license &nbsp; &nbsp; http://www.gnu.org/licenses/lgpl-3.0.txt GNU LGPL 3.0</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">* @version &nbsp; &nbsp; SVN: $Id: jquery.titleBlink.js 1 2010-08-25 17:44:00Z gasman406f $</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">jQuery.<span class="me1">extend</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">titleBlink <span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span>title<span class="sy0">,</span>options<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> defaults <span class="sy0">=</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">repeat <span class="sy0">:</span> 5<span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">delay <span class="sy0">:</span> &nbsp;800</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> options <span class="sy0">=</span> $.<span class="me1">extend</span><span class="br0">&#40;</span>defaults<span class="sy0">,</span> options<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> repeatCount<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> currentTitle<span class="sy0">=</span>$<span class="br0">&#40;</span>document<span class="br0">&#41;</span>.<span class="me1">attr</span><span class="br0">&#40;</span><span class="st0">&quot;title&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">var</span> blinkInterval<span class="sy0">=</span>setInterval<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span>$<span class="br0">&#40;</span>document<span class="br0">&#41;</span>.<span class="me1">attr</span><span class="br0">&#40;</span><span class="st0">&quot;title&quot;</span><span class="br0">&#41;</span><span class="sy0">==</span>currentTitle<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">$<span class="br0">&#40;</span>document<span class="br0">&#41;</span>.<span class="me1">attr</span><span class="br0">&#40;</span><span class="st0">&quot;title&quot;</span><span class="sy0">,</span>title<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">$<span class="br0">&#40;</span>document<span class="br0">&#41;</span>.<span class="me1">attr</span><span class="br0">&#40;</span><span class="st0">&quot;title&quot;</span><span class="sy0">,</span>currentTitle<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">repeatCount<span class="sy0">++;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>repeatCount<span class="sy0">==</span>options.<span class="me1">repeat</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">clearInterval<span class="br0">&#40;</span>blinkInterval<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="sy0">,</span> options.<span class="me1">delay</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/notificaciones-cambiantes-en-titulo-de-la-pagina/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2010/08/chrome-blank-new-tab-300x148.gif" length="6646" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2010/08/chrome-blank-new-tab-300x148.gif" width="300" height="148" medium="image" type="image/gif" />	</item>
		<item>
		<title>Los códigos QR</title>
		<link>http://www.opsou.com/blog/los-codigos-qr/</link>
		<comments>http://www.opsou.com/blog/los-codigos-qr/#comments</comments>
		<pubDate>Thu, 19 Aug 2010 18:14:33 +0000</pubDate>
		<dc:creator>Pedro Figueras</dc:creator>
				<category><![CDATA[Códigos QR]]></category>
		<category><![CDATA[Labs]]></category>
		<category><![CDATA[QR Codes]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=633</guid>
		<description><![CDATA[Desde hace ya bastante tiempo, en Opsou hemos apostado por seguir los avances y aplicaciones de esta tecnología. Nos parece una magnífica puerta de enlace entre el mundo físico y el digital. Nos permitirá interactuar más fácil y rápidamente con nuestro entorno, solo con apuntar nuestro móvil contra algo que estemos viendo, accederemos a todo...<a class="rmore" href="http://www.opsou.com/blog/los-codigos-qr/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-636" title="Los códigos QR" src="http://www.opsou.com/blog/wp-content/uploads/2010/08/qr.jpg" alt="Los códigos QR" width="600" height="270" /></p>
<p>Desde hace ya bastante tiempo, en <a href="http://www.opsou.com" target="_blank">Opsou</a> hemos apostado por seguir los avances y aplicaciones de esta tecnología. Nos parece una magnífica puerta de enlace entre el mundo físico y el digital.</p>
<p>Nos permitirá interactuar más fácil y rápidamente con nuestro entorno, solo con apuntar nuestro móvil contra algo que estemos viendo, accederemos a todo un mundo de conocimiento relacionado con él.</p>
<p><span id="more-633"></span></p>
<p>Explicado de un modo muy básico, se trata de una imagen cuadrada llena de puntos blancos o negros, en la que hay codificada información. Dependiendo de el número de puntos o celdas y la redundancia elegida podremos almacenar entre 25 y 4.296 caracteres.</p>
<p>La redundancia es un parámetro que nos ayudará en el caso de que la imagen se deteriore. Cuanto mayor sea este nivel, menos caracteres podremos codificar, pero tendremos más posibilidades de recuperar el contenido de nuestro Código QR. Incluso con un 30% deteriorado nos permitiría acceder a los datos.</p>
<p>Una de las ventajas que ofrece este código bidimensional con respecto a otros similares, incluido el clásico código de barras, es su capacidad de almacenar gran número de caracteres, poder ser leído en cualquier sentido debido a sus puntos de detección que lo hacen gráficamente tan reconocible y su licencia de uso.</p>
<p>Los Códigos QR fueron desarrollados por la firma japonesa Denso-Wave en 1994, pasando en el año 2000 a ser el estándar internacional ISO (ISO/IEC 18004) y liberando posteriormente la patente.  Esto supone que podremos integrarlo en nuestros procesos tranquilamente sin miedo a que nadie en el futuro nos chantajee mediante el pago de licencias y así poner en peligro nuestra productividad.</p>
<p>Al Igual que hizo IBM en su tiempo permitiendo que cualquiera pudiera montar su PC y comercializarlo, el hecho de que la patente sea libre facilitará su rápida difusión.</p>
<p>Aunque su popularidad comenzó en Japón, gracias al desarrollo del software que permite leerlos con teléfono móvil y la apuesta de la operadora japonesa de móviles Do Co Mo por esta tecnología, su expansión hacia Europa se ha hecho imparable a raíz de su integración en campañas publicitarias. En los siguientes post iremos mostrando distintas aplicaciones en la vida real.</p>
<p>Existen muchas aplicaciones lectoras para móviles <strong>iPhone</strong>, <strong>Android</strong>, <strong>Nokia</strong>, <strong>Blackberry</strong>. Nosotros usamos <strong>QuickMark</strong> y <strong>Barcode Scanner</strong>. Tanto en <strong>iTunes</strong> como en <strong>Android Marquet</strong>, podéis encontrar varias gratuitas con los que hacer pruebas perfectamente.</p>
<p>Esto es el comienzo. En poco tiempo veremos estos códigos integrados en nuestro día a día.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/los-codigos-qr/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2010/08/qr-300x135.jpg" length="12161" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2010/08/qr-300x135.jpg" width="300" height="135" medium="image" type="image/jpeg" />	</item>
		<item>
		<title>La seguridad informática en la PYME</title>
		<link>http://www.opsou.com/blog/la-seguridad-informatica-en-la-pyme/</link>
		<comments>http://www.opsou.com/blog/la-seguridad-informatica-en-la-pyme/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 14:48:13 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Backstage]]></category>
		<category><![CDATA[Labs]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[nube]]></category>
		<category><![CDATA[seguridad]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=524</guid>
		<description><![CDATA[Recientemente me ha llegado el caso de una empresa, en la cual hay un equipo informático que hace funciones de POS,  además de usarse para correo electrónico, navegar por internet, y demas tareas administrativas. Un dia, y de repente (como suelen ocurrir estas cosas), el ordenador dejó de funcionar. Tras llevarlo a un servicio técnico...<a class="rmore" href="http://www.opsou.com/blog/la-seguridad-informatica-en-la-pyme/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone" title="Backup servers" src="http://www.cloner.cl/blog/wp-content/uploads/2009/01/online-backup-readerszone.jpg" alt="" width="402" height="299" /></p>
<p>Recientemente me ha llegado el caso de una empresa, en la cual hay un equipo informático que hace funciones de POS,  además de usarse para correo electrónico, navegar por internet, y demas tareas administrativas.</p>
<p>Un dia, y de repente (como suelen ocurrir estas cosas), el ordenador dejó de funcionar. Tras llevarlo a un servicio técnico el resultado fúe el de que el disco duro estaba irreparablemente dañado, y en ese momento empiezan los tirones de pelos, los problemas, el tener casi paralizado el negocio. Por supuesto no existian copias de seguridad, ni de los programas usados, ni de los datos (correos electronicos, tarifas, listados, etc)</p>
<p><span id="more-524"></span></p>
<p>Un problema de esta índole supone unos costes muy importantes para cualquier empresa, no solo en reposición de los equipos dañados, ni en asesoramiento tecnológico, si no en perdidas de datos y de productividad, en algunos casos estas perdidas de productividad pueden llegar a la paralización completa de la actividad y en los casos de perdidas de datos incluso podríamos incurrir en resposabilidades por incumplimientos con terceros. Imaginemos el caso de una asesoria que perdiera los datos de sus clientes, prefiriria ni pensarlo&#8230;</p>
<p>Esta situación me ha llevado a escribir este post, intentando fijar una serie de recomendaciones a seguir en las empresas para evitar tener que resolver el problema cuando este ya se ha producido.</p>
<ol>
<li>Identificar los lugares (carpetas y ficheros), donde se almacenan los datos sensibles.</li>
<li>Identificar y catalogar los programa usados que tendriamos que reinstalar si fuese necesario.</li>
<li>Si es posible duplicar los datos en la misma ubicación. Lo ideal seria tener un sistema de discos duros RAID en modo espejo, si un disco duro falla, podemos continuar trabajando con el otro (que tiene los mismo datos) y remplezar el averiado sin problemas, ni disminución de la productibidad.</li>
<li>Realizar al menos dos copias de seguridad (backups) diarias, una debe quedar almacenada en la mismo local, para acceder a ella rápidamente si es necesario y otra desubicada, a ser posible fuera de la misma ciudad. Explico por que: Si tenemos las copias de seguridad en el mismo local (aunque sea en una caja fuerte) si nos roban el ordenador y la copia o si se produce un incendio o inundación perderemos el original y la copia, por ello debe existir una copia lo más alejada geográficamente del local. Para esto podemos contratar una empresa especializada o usar servicio en la nube, como dropbox, ubuntu one, etc, que nos permiten almacenar los datos en sus servidores, y estos a su vez disponen de copias de seguridad.</li>
<li>Tener un buen personal o empresa de informática que pueda reaccionar y resolver el problema de forma rápida.</li>
</ol>
<p>Muchas empresas pensarán que todo esto en muy caro, pero no creo que supere los 100-200€/mes, os habeis parado a pensar cuanto le costaría a una empresa estar completamente paralizada 2 o 3 dias, porque sus sistema informático no funciona?</p>
<p>Antes de terminar me gustaria hacer recomendar el uso IMAP como protocolo de email, en lugar de POP. ya que IMAP nos permite sincronizar el correo entre varios equipos, móviles, etc y tener todos nuestros correos (recibidos y enviados) almacenados en el servidor.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/la-seguridad-informatica-en-la-pyme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Relaciones N:M:Ñ en Bases de datos</title>
		<link>http://www.opsou.com/blog/relaciones-nmn-en-sql/</link>
		<comments>http://www.opsou.com/blog/relaciones-nmn-en-sql/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 16:45:22 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=512</guid>
		<description><![CDATA[NOTA: Esta entrada esta extraida de una nota publicada en mi perfil de facebook el 20 de Marzo de 2009 La estructura clásica de las bases de datos relacionales nos permite establecer relaciones 1:1, 1:N y N:M (además de las reflexivas) entre tablas, esto fue un gran avance respecto a las bases de datos jerarquicas...<a class="rmore" href="http://www.opsou.com/blog/relaciones-nmn-en-sql/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<h1 style="font-family: Arial, Helvetica, sans-serif, 'Arial Black'; font-size: 13px; color: #111111; clear: both; font-weight: bold; padding: 0px; margin: 0px;"><img class="alignnone size-full wp-image-518" title="Database relationships" src="http://www.opsou.com/blog/wp-content/uploads/2010/07/CqG9TU.jpg" alt="Database relationships" width="560" height="410" /></h1>
<h1 style="font-family: Arial, Helvetica, sans-serif, 'Arial Black'; font-size: 13px; color: #111111; clear: both; font-weight: bold; padding: 0px; margin: 0px;"><em><span style="font-weight: normal; padding: 0px; margin: 0px;">NOTA: Esta entrada esta extraida de una nota publicada en mi perfil de facebook el 20 de Marzo de 2009</span></em></h1>
<p>La estructura clásica de las bases de datos relacionales nos permite establecer relaciones 1:1, 1:N y N:M (además de las reflexivas) entre tablas, esto fue un gran avance respecto a las bases de datos jerarquicas (muy usadas en la industria) que solo permitian relaciones 1:1 y 1:N.<br />
Con este paradigma tenemos una limitación que solo nos permite tener relaciones entre tablas de forma fija.</p>
<p>A veces nos interesa que una tabla se relacione con un número indeterminado de otras tablas. Podemos poner como ejemplo de esto una tabla de comentarios, estos comentarios serian sobre una tabla de entradas de noticias (por ejemplo), esto lo resolveriamos añadiendo una clave foranea a la tabla de noticias que relacione los comentarios con esto.</p>
<p>Si más adelante tuvieramos que permitir comentar al autor de la entrada (noticia), podriamos resolverlo creando un nueva tabla para los comentarios sobre el autor.</p>
<p>Si entendemos las tablas de una base de datos como entidades, adquien un significado más alla de las relaciones y de los datos que almacen. Imaginemos el caso en el que tengamos varias tablas (noticias, autores, usuarios, productos,&#8230;..) que ueremso que se puedan comentar, con el modo clásico tendriamos que crear una tabla de comentarios para cada una de estas tablas, pero ¿que sucede si en lugar de 4 tabla tenemos 10? ¿o 20? ¿o mañana podria habar 3 mas que deseamos que se puedan comentar?: La solución posible seria emplear una única tabla de comentarios para todas esas tablas que permita relacionar la tupla del comentario con la tabla correspoendiente.</p>
<p>Para ello el sistema que propongo se basa en no establecer una relacion directa entre tablas del modo clasico, si no que almacenariamos en la tupla del comentario la tabla y la clave foranea de esa tabla para poder relacionarla con una estrucfutra similar a esta:</p>
<p><em>CREATE TABLE `comentario` (<br />
`id_comentario` int(11) unsigned NOT NULL auto_increment,<br />
`id` int(11) unsigned default NULL,<br />
`tabla` char(100) default NULL,<br />
`comentario` longtext character set utf8<br />
PRIMARY KEY (`id_comentario`)<br />
) ENGINE=MyISAM</em></p>
<p>Donde id es el id de la entrada que se comentar relativo a la tabla que se alamacena en el campo tabla.</p>
<p>Para obterner los comentarios relativos a la tabla &#8216;noticias&#8217; y entrada 1000 bastaria con realizar una consulta como esta:</p>
<p><em>SELECT * FROM comentario WHERE tabla=&#8217;noticias&#8217; AND id=1000;</em></p>
<p>Podriamos incluso obtener los resultados de los comentarios en la consulta relacionada</p>
<p><em>SELECT * FROM noticia n INNER JOIN comentario c ON n.id_noticia=c.id WHERE tabla=&#8217;noticias&#8217; AND id=1000;</em></p>
<p>Obviamente la carga sobre la base de datos es algo mayor que en el uso del sistema clásico, pero la flexibilidad que nos aporta la supera con creces.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/relaciones-nmn-en-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2010/07/CqG9TU-300x219.jpg" length="23083" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2010/07/CqG9TU-300x219.jpg" width="300" height="219" medium="image" type="image/jpeg" />	</item>
		<item>
		<title>Consulta multitabla vs Multiples consultas monotabla</title>
		<link>http://www.opsou.com/blog/consulta-multitabla-vs-multiples-consultas-monotabla/</link>
		<comments>http://www.opsou.com/blog/consulta-multitabla-vs-multiples-consultas-monotabla/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 09:03:24 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=504</guid>
		<description><![CDATA[NOTA: Esta entrada esta extraida de una nota publicada en mi perfil de facebook el 3 de Diciembre de 2009 ¿Que es una consulta multitabla? Como su nombre indica es una consulta SQL que requiere del varias tablas para obtener los resultados, como ejemplo imagenimos que tenemos una tabal que contiene los post de un...<a class="rmore" href="http://www.opsou.com/blog/consulta-multitabla-vs-multiples-consultas-monotabla/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<h1 style="font-size: 13px; color: #111111; clear: both; font-weight: bold; padding: 0px; margin: 0px;"><img class="alignnone size-full wp-image-505" title="Database" src="http://www.opsou.com/blog/wp-content/uploads/2010/07/database.jpg" alt="Database" width="522" height="366" /></h1>
<h1 style="font-size: 13px; color: #111111; clear: both; font-weight: bold; padding: 0px; margin: 0px;"><em><span style="font-weight: normal;">NOTA: Esta entrada esta extraida de una nota publicada en mi perfil de facebook el 3 de Diciembre de 2009</span></em></h1>
<p><em><span style="font-weight: normal;"><br />
</span></em></p>
<h2>¿Que es una consulta multitabla?</h2>
<p>Como su nombre indica es una consulta SQL que requiere del varias tablas para obtener los resultados, como ejemplo imagenimos que tenemos una tabal que contiene los post de un blog y otra que contiene los autores. La consulta para obterner un post y los datos de sus autores seria algo como esto:</p>
<p><em>SELECT * FROM post P INNER JOIN autorPost as AP ON P.id_post=AP.id_post INNER JOIN autor A ON AP.id_autor=A.id_post WHERE P.id_post=1</em></p>
<p>Notese que hemos consultado a 3 tablas simultaneamente.</p>
<p>A nivel de código, es muy sencillo obtener los datos con una simple consulta multitabla.</p>
<h2>Consultas multiple monotabla</h2>
<p>Este tipo de consultas, más que un tipo se refiere a una filosofia, en un post anterior ya hable de encapsular cada tabla en una clase de PHP (u otro lenguaje), lo que nos permite una mayor consitencia en el acceso a los datos. En este caso lo que solemos hacer es que cada coluna de los resultados se parsea en la clase, añadiendo los datos de otras tablas si fuese necesario.</p>
<p>Veamos el ejemplo anterior siguiendo este método:</p>
<p>1º Consultamos los datos del post<br />
<em>SELECT * FROM post WHERE id_post=1</em><br />
Almacenamos los datos en un array: $post</p>
<p>2º Consultamos los autores del post (en este caso como hay una tabla intermedia al ser una relacion N:M) obtenemos sus id&#8217;s<br />
<em>SELECT id_autor FROM autorPost WHERE id_post=1</em><br />
Guardamos en un array los id&#8217;s de los autohres relacionados.</p>
<p>3º Consultamos a la tabla de autores los datos de los filtrados de la consulta anterior<br />
<em>SELECT * FROM autor WHERE id_autor=$id_autor</em><br />
Esta consulta se ejecutara tantas veces como autores devuelva la consulta del punto 2º, imaginemos que sean 3.</p>
<p><span>4º Ahora juntamos todo: en la varialbe que guarda los datos del post ($post) creamos un subarray que guarde los datos del autor, de forma que podriamos acceder a los datos de un autor del post de la forma $post["autores"][0]["nombr</span>e"].</p>
<p>Hemos realizado 5 consultas para lo mismo que en el método anterior requeria una única consulta.</p>
<p>Pero esto tiene varias ventajas:</p>
<ol style="padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 20px;">
<li>Tenemos una estructura mas accesible a los datos</li>
<li>Podemos repetir este proceso para recoger los datos de, por ejemplo, los comentarios, las fotos, &#8230; asociados a ese post repitiendo el método de una forma mucho mas sencilla</li>
<li>Y lo más importante: aunque pueda ser contradictorio, para grandes bases de dátos este método es más rápido y carga menos el servidor. ¿Por qué?.</li>
</ol>
<p>Pues porque mysql, como otros servidores de bases de datos, cachean las consultas, y es mas sencillo de cachear una simple consulta a una tabla, que una consulta multitabla, eso sin contar con que es mucho más probable que una consulta monotable, se pueda obtener de la cache que una multitabla.</p>
<p>Repito, aunque puede parecer contradictorio la experiencia me ha demostrado que son mucho más rápidas, ademas de ser mucho más facil crear una capa de abstraccion mediante clases de los datos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/consulta-multitabla-vs-multiples-consultas-monotabla/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2010/07/database-300x210.jpg" length="29217" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2010/07/database-300x210.jpg" width="300" height="210" medium="image" type="image/jpeg" />	</item>
		<item>
		<title>Objecto  &#8220;Options&#8221; como parámetro de funciones en PHP</title>
		<link>http://www.opsou.com/blog/objecto-options-como-parametro-de-funciones-en-php/</link>
		<comments>http://www.opsou.com/blog/objecto-options-como-parametro-de-funciones-en-php/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 09:18:12 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Backstage]]></category>
		<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=397</guid>
		<description><![CDATA[PHP es un lenguaje muy flexible que permite desarrollar desde aplicaciones muy sencillas a grandes aplicaciones como puede ser Facebook. Cuando desarrollamos una aplicación y esta va creciendo con el tiempo, nos podemos encontrar que  vamos añadiendo nuevos parámetros a nuestras funciones, siempre manteniendo los anteriores por compatibilidad, complicando cada vez más la legibilidad del...<a class="rmore" href="http://www.opsou.com/blog/objecto-options-como-parametro-de-funciones-en-php/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-405" title="php_code" src="http://www.opsou.com/blog/wp-content/uploads/2010/04/php_code.jpg" alt="php_code" width="500" height="322" /></p>
<p>PHP es un lenguaje muy flexible que permite desarrollar desde aplicaciones muy sencillas a grandes aplicaciones como puede ser Facebook.</p>
<p>Cuando desarrollamos una aplicación y esta va creciendo con el tiempo, nos podemos encontrar que  vamos añadiendo nuevos parámetros a nuestras funciones, siempre manteniendo los anteriores por compatibilidad, complicando cada vez más la legibilidad del código.</p>
<p><span id="more-397"></span></p>
<p>Imaginemos que tenemos la siguente función que hace una búsqueda en la base de datos</p>
<div class="codesnip-container" >function search($string) {<br />
//Do something<br />
}</div>
<p>Con el tiempo puede que necesitemos que sea más refinada y que nos permita hacer paginado, pero como es lógico necesitamos que sea compatible con todas las llamadas que ya tenemos en nuestro programa, entonces haríamos lo siguente:</p>
<div class="codesnip-container" >function search($string,$start=null,$count=null) {<br />
//Do something<br />
}</div>
<p>Lógicamente la función  maneja correctamente cunado estas nuevas variables tiene valor, si no se comporta como antes.</p>
<p>Vamos un poco más allá, ahora necesitamos que además podamos filtrar los resultados por fecha, añadiríamos entonces otro parámetro</p>
<div class="codesnip-container" >function search($string,$start=null,$count=null,$date=null) {<br />
//Do something<br />
}</div>
<p>La cosa se empieza a complicar, imaginemos ahora que queremos que nos devuelva los datos de una fecha, entonces la llamada a la función serian de lo más esperpentica:</p>
<div class="codesnip-container" >search(null,null,null,&#8221;2010/12/23&#8243;);</div>
<p>Imaginaros esto cuando la función sigue creciendo en parámetros, puede ser una locura.</p>
<p>Bien mi forma de resolver esto esta inspirada en Javascript, por ejemplo en como pasa JQuery los parámetros a los plugins, esto es pasando un objeto que a su vez contiene todos los parámetros, además podemos establecer los valores por defecto para cada parámetro.</p>
<p>PHP presenta un pequeño inconveniente, no se puede instanciar la clase base <em>Object</em>, es decir no podemos hacer un:</p>
<div class="codesnip-container" >$obj = new Object();</div>
<p>Tampoco podemos usar la notación de objectos de javascript:</p>
<div class="codesnip-container" >var obj = { param1 : 1, params2: 3, param4: 6}</div>
<p>Para resolver esto he creado una clase que resuelve estos contratiempo:</p>
<div class="codesnip-container" >&lt;?php<br />
class options {<br />
public function __construct($optionsArray=array()) {<br />
oreach($optionsArray as $paramName =&gt; $paramValue) {<br />
$this-&gt;$paramName=$paramValue;<br />
}<br />
}<br />
}<br />
?&gt;</div>
<p>Para aplicar a la función del ejemplo extenderíamos esta clase con los parámetros concretos de la función:</p>
<div class="codesnip-container" >class myFunctionOptions extends options {<br />
public $start= null;<br />
public $count= null;<br />
public $data = null;<br />
}</div>
<p>y rescribiríamos la función de la siguiente forma:</p>
<div class="codesnip-container" >function search($string,$option=null) {<br />
if (!isset($options)) {<br />
$options= new myFunctionOptions();<br />
}<br />
// Do something<br />
}</div>
<p>Y la llamada a la función sería de la siguiente forma:</p>
<div class="codesnip-container" >search(&#8220;string&#8221;,new myFunctionOptions(array(&#8220;start&#8221;=&gt;1,&#8221;count&#8221;=&gt;10,&#8221;date&#8221;=&gt;&#8221;2010/04/10&#8243;));</div>
<p>Fijémonos en dos puntos:</p>
<ul>
<li>Los parámetros obligatorios de la funcion se quedan fuera del objeto <em>options</em></li>
<li>No es necesario dar valor a todos los atributos del objeto <em>options</em>, si dejamos sin definir alguno de ellos, siempre estará definido con el valor por defecto de la definición de la clase.</li>
</ul>
<p>Si en el futuro nuestra función sigue necesitando añadir parámetros podremos hacerlo de forma sencilla en el objeto <em>myFunctionOptions</em>, manteniendo siempre una buena legibilidad del código fuente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/objecto-options-como-parametro-de-funciones-en-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2010/04/php_code-300x193.jpg" length="21596" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2010/04/php_code-300x193.jpg" width="300" height="193" medium="image" type="image/jpeg" />	</item>
		<item>
		<title>Tutorial: Retrato con tipografía</title>
		<link>http://www.opsou.com/blog/tutorial-retrato-con-tipografia/</link>
		<comments>http://www.opsou.com/blog/tutorial-retrato-con-tipografia/#comments</comments>
		<pubDate>Fri, 26 Mar 2010 13:28:38 +0000</pubDate>
		<dc:creator>Nieves Prado</dc:creator>
				<category><![CDATA[Backstage]]></category>
		<category><![CDATA[Diseño]]></category>
		<category><![CDATA[Labs]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=333</guid>
		<description><![CDATA[En este nuevo post os ayudaremos a crear ilustraciones con tipografías. Con motivo de la creación de la nueva web de Berrogüetto, creamos retratos de todos los integrantes del grupo. Con un trabajo de chinos, letra a letra fuimos formando cada personaje. En tres pasos intentaremos resumir como realizar este tipo de ilustraciones. El truco...<a class="rmore" href="http://www.opsou.com/blog/tutorial-retrato-con-tipografia/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<p>En este nuevo post os ayudaremos a crear ilustraciones con tipografías.</p>
<p>Con motivo de la creación de la nueva web de Berrogüetto, creamos retratos de todos los integrantes del grupo. Con un trabajo de chinos, letra a letra fuimos formando cada personaje.</p>
<p>En tres pasos intentaremos resumir como realizar este tipo de ilustraciones. El truco es técnica y paciencia.</p>
<p><img class="alignnone size-full wp-image-322" title="Retrato con tipografía" src="http://www.opsou.com/blog/wp-content/uploads/2010/03/012.jpg" alt="Retrato con tipografía" width="440" height="290" /></p>
<p><span id="more-333"></span></p>
<p><strong>Paso 1: Elección de la foto original</strong></p>
<p>Un original influye positivamente o negativamente sobre el resultado final del proyecto. Partir de una imagen de calidad, que tenga fuertes contrastes entre los volúmenes iluminados y ensombrecidos, ayudará a resaltar los detalles más importantes.</p>
<p>Es importante que el fondo se diferencie lo máximo posible de la figura con el que vamos a trabajar, tanto en luminosidad como en saturación.</p>
<p><img class="alignnone size-full wp-image-357" title="Retratos con letras" src="http://www.opsou.com/blog/wp-content/uploads/2010/03/031.jpg" alt="Retratos con letras" width="440" height="155" /></p>
<p><strong>Paso 2: Imagen de guía</strong></p>
<p>Si el fondo no se separa lo suficiente de la figura, tendremos que siluetear la figura y borrar el fondo.</p>
<p>Una vez hecho es paso, debemos aplicarle a la imagen un efecto Umbral. Ajustando manualmente el porcentaje crearemos una imagen más simple. Buscamos un efecto del tipo “Che Güevara” de toda la vida.</p>
<p>Puede que tengamos que corregir selectivamente algunas zonas que vemos que se pierden detalles, porque se oscurecen o se aclaran en exceso.</p>
<p><strong>Paso 3: La ilustración</strong></p>
<p>Para comenzar a crear la ilustración, necesitamos tener de fondo la imagen generada en el paso anterior. Si la ponemos de fondo y en color gris claro, nos servirá de guía.</p>
<p>Creamos distintos grupos de letras de varios tamaños y diferentes orientaciones, para ir formando tipos de manchas. Es importante que las letras nunca se toquen.</p>
<p>Teniendo varios elementos de este tipo, empezamos a cubrir toda la zona de sombra con estos grupos de letras. Para conseguir el efecto de volumen en la ilustración, usamos la técnica de que las partes más cercanas al observador van grandes y las más alejadas, más pequeñas.</p>
<p>Diferenciamos las zonas, compactando y juntando más las letras, sin llegar a que se superpongan. Los perfiles de línea, en las áreas muy claras, se consiguen con letras más separadas y pequeñas, intentando formar líneas manualmente.</p>
<p><img class="alignnone size-full wp-image-359" title="Retratos con Tipografía" src="http://www.opsou.com/blog/wp-content/uploads/2010/03/06.jpg" alt="Retratos con Tipografía" width="440" height="155" /></p>
<p>Como toque final, podemos romper la homogeneidad de la ilustración, introduciendo letras más grandes que la media (a). Tener en cuenta que el ojo tiende a hacer grupos con las letras, así que usar  pocas, separadas, giradas y sin sentido.</p>
<p>También podemos conseguir una imagen más suelta y menos estática si las letras no componen la figura cerrada, dejando al azar letras por zonas del contorno (b).</p>
<p>Espero que os ayude este tutorial y si necesitáis alguna aclaración no dudéis en preguntar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/tutorial-retrato-con-tipografia/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2010/03/012-300x225.jpg" length="24639" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2010/03/012-300x225.jpg" width="300" height="225" medium="image" type="image/jpeg" />	</item>
		<item>
		<title>Versi&#243;n iPhone / Android de una web</title>
		<link>http://www.opsou.com/blog/versin-iphone-android-de-una-web/</link>
		<comments>http://www.opsou.com/blog/versin-iphone-android-de-una-web/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 12:16:16 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Comunicación]]></category>
		<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=245</guid>
		<description><![CDATA[Recientemente nos surgió la necesidad de crear una versión para dispositivos móviles de la web de uno de nuestros clientes www.anosaterra.org. Pensamos en varias opciones, y en que dispositivos usarían los visitantes para navegar pos esta versión móvil. Sin querer dejar de lado  a nadie, observamos que la mayor parte de la navegación móvil del portal venia de...<a class="rmore" href="http://www.opsou.com/blog/versin-iphone-android-de-una-web/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone" title="Navegación movil" src="http://www.gadgetos.com/photos/3000/3049/001_small.jpg" alt="" width="459" height="318" /></p>
<p>Recientemente nos surgió la necesidad de crear una versión para dispositivos móviles de la web de uno de nuestros clientes <a href="http://www.anosaterra.org" target="_blank">www.anosaterra.org</a>. Pensamos en varias opciones, y en que dispositivos usarían los visitantes para navegar pos esta versión móvil.</p>
<p><span id="more-245"></span></p>
<p>Sin querer dejar de lado  a nadie, observamos que la mayor parte de la navegación móvil del portal venia de &#8220;iPhones&#8221; y &#8220;Androides&#8221;, y sabiendo que los navegadores de estos dispositivos son de la familia Webkit, decidimos crear una versión optimizada para los ellos.</p>
<p>Para la parte gráfica creemos que lo más conveniente era una interface familiar, por ello decidimos emplear el Framework CSS (<a href="http://code.google.com/p/iphone-universal/" target="_blank">UiUIKit</a>) que emula la interface gráfica de las aplicaciones nativas de  iphone, y aunque se navegue desde otro dispositivo no iphone la experiencia de usuarios sigue siendo muy buena.</p>
<p>Nuestra recomendación a nivel de portales web, donde el contenido prime sobre la gráfica, es crear siempre una versión móvil de la web, ya que en estos últimos años la navegación con dispositivos móviles a crecido espectacularmente, y lo seguira haciendo. Y desde luego si el usuario se encuentra cómodo leyendo su web desde el movil es más facil fidelizarlo y que se quede.</p>
<p>El resultado de este trabajo lo podeis comprobar en  <a href="http://www.anosaterra.org/iphone" target="_blank">http://www.anosaterra.org/iphone</a></p>
<p>Esperamos vuestros comentarios sobre la experiencia con otros dispositivos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/versin-iphone-android-de-una-web/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Etiquetado de fotos de forma similar a facebook con jquery</title>
		<link>http://www.opsou.com/blog/etiquetado-de-fotos-de-forma-similar-a-facebook-con-jquery/</link>
		<comments>http://www.opsou.com/blog/etiquetado-de-fotos-de-forma-similar-a-facebook-con-jquery/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 12:12:10 +0000</pubDate>
		<dc:creator>Sergio Carracedo</dc:creator>
				<category><![CDATA[Labs]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[phototag]]></category>

		<guid isPermaLink="false">http://www.opsou.com/blog/?p=247</guid>
		<description><![CDATA[<img src="http://www.opsou.com/blog/wp-content/uploads/2010/02/2010-02-27-13.06.45-1024x768.jpg" alt="Etiquetado de fotos de forma similar a facebook con jquery" title="Etiquetado de fotos de forma similar a facebook con jquery" /> Cuando se posee una gran cantidad de material multimedia, es necesario catalogarla y etiquetarla para que la búsqueda de cualquier recurso sea sencilla. Un gran paso que hemos visto en las redes como facebook, es el etiquetado de personas dentro de las fotos, en nuestro caso esto permite hacer búsquedas de personas dentro de nuestro mediacenter™. Para...<a class="rmore" href="http://www.opsou.com/blog/etiquetado-de-fotos-de-forma-similar-a-facebook-con-jquery/">&#160;Continuar leyendo</a>]]></description>
			<content:encoded><![CDATA[<img src="http://www.opsou.com/blog/wp-content/uploads/2010/02/2010-02-27-13.06.45-1024x768.jpg" alt="Etiquetado de fotos de forma similar a facebook con jquery" title="Etiquetado de fotos de forma similar a facebook con jquery" /> <p style="text-align: center;"><img class="alignnone size-medium wp-image-252" title="2010-02-27 13.06.45" src="http://www.opsou.com/blog/wp-content/uploads/2010/02/2010-02-27-13.06.45-300x225.jpg" alt="2010-02-27 13.06.45" width="300" height="225" /></p>
<p>Cuando se posee una gran cantidad de material multimedia, es necesario catalogarla y etiquetarla para que la búsqueda de cualquier recurso sea sencilla. Un gran paso que hemos visto en las redes como facebook, es el etiquetado de personas dentro de las fotos, en nuestro caso esto permite hacer búsquedas de personas dentro de nuestro mediacenter™.</p>
<p><span id="more-247"></span>Para llevar a cabo el etiquetado hemos desarrollado un plugin de jQuery que se integra a la perfección con jQueryUI y que permite realizar dicha función.</p>
<p>Es una versión alpha por lo que ciertas funcionalidades aún no están activas como:</p>
<ul>
<li>Soporte de idiomas</li>
<li>Estilo propio, independiente de jQueryUI</li>
</ul>
<p>Pinchar <a href="http://www.opsou.com/blog/wp-content/demo/jquery.phototag/index.html" target="_blank">aqui para ver la demo</a></p>
<p>En unas semanas iremos actualizando con las novedades.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opsou.com/blog/etiquetado-de-fotos-de-forma-similar-a-facebook-con-jquery/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	<enclosure url="http://www.opsou.com/blog/wp-content/uploads/2010/02/2010-02-27-13.06.45-300x225.jpg" length="20477" type="image/jpg" /><media:content url="http://www.opsou.com/blog/wp-content/uploads/2010/02/2010-02-27-13.06.45-300x225.jpg" width="300" height="225" medium="image" type="image/jpeg" />	</item>
	</channel>
</rss>
