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

<channel>
	<title>Consultoría informática: obras selectas &#187; Soluciones</title>
	<atom:link href="http://xand.es/category/soluciones/feed" rel="self" type="application/rss+xml" />
	<link>http://xand.es</link>
	<description>¿Tonterías? Todas las que quieras</description>
	<lastBuildDate>Tue, 18 May 2010 19:54:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Validar formularios con Javascript</title>
		<link>http://xand.es/validar-formularios-con-javascript_20100402</link>
		<comments>http://xand.es/validar-formularios-con-javascript_20100402#comments</comments>
		<pubDate>Fri, 02 Apr 2010 14:20:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Soluciones]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://xand.es/?p=324</guid>
		<description><![CDATA[Validar formularios con JavaScript mediante las expresiones regulares es una solución bastante elegante, fiable y requiere muy poco código en comparación con otras vías.
Por ejemplo, si necesitamos comprobar un número de la tarjeta de crédito podemos hacerlo de la siguiente forma:





var numTarjetaPattern=/^[0-9]{16}$/;  
var numTarjeta=document.getElementById(&#8220;numTarjeta&#8221;);
 if(!numTarjeta.match(numTarjetaPattern)){
 alert(&#8220;Compruebe el número de la tarjeta.&#8221;);
 return false;
 }else{
 return true;
 }




Existe multitud de tutoriales sobre cómo usar [...]]]></description>
			<content:encoded><![CDATA[<p>Validar formularios con JavaScript mediante las expresiones regulares es una solución bastante elegante, fiable y requiere muy poco código en comparación con otras vías.</p>
<p>Por ejemplo, si necesitamos comprobar un número de la tarjeta de crédito podemos hacerlo de la siguiente forma:</p>
<div class="java">
<table border="0" cellspacing="0" cellpadding="3" bgcolor="#ffffff">
<tbody>
<tr><!-- start source code --></p>
<td align="left" valign="top"><code><br />
<span style="color: #000000;">var numTarjetaPattern=/^</span><span style="color: #000000;">[</span><span style="color: #990000;">0</span><span style="color: #000000;">-</span><span style="color: #990000;">9</span><span style="color: #000000;">]{</span><span style="color: #990000;">16</span><span style="color: #000000;">}</span><span style="color: #000000;">$/;</span></code><span style="color: #ffffff;"> </span><span style="color: #000000;"> </span></p>
<p><span style="color: #000000;">var numTarjeta=document.getElementById</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">&#8220;numTarjeta&#8221;</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>if</strong></span><span style="color: #000000;">(</span><span style="color: #000000;">!numTarjeta.match</span><span style="color: #000000;">(</span><span style="color: #000000;">numTarjetaPattern</span><span style="color: #000000;">)){</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #000000;">alert</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">&#8220;Compruebe el número de la tarjeta.&#8221;</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>return false</strong></span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #000000;">}</span><span style="color: #7f0055;"><strong>else</strong></span><span style="color: #000000;">{</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>return true</strong></span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #000000;">}</span></td>
<p><!-- end source code --></tr>
</tbody>
</table>
</div>
<p>Existe multitud de tutoriales sobre cómo usar expresiones regulares, por ejemplo <a href="http://www.desarrolloweb.com/articulos/2033.php">aquí</a> y <a href="http://boozox.net/php/manual-completo-y-sencillo-de-expresiones-regulares-en-php/">aquí</a>. El problema viene cuando en el campo que tenemos que comprobar aparecen caractéres que no están incluidos en la tabla ASCII. Hablando de castellano estos caractéres primeramente son las letras acentuadas y la eñe. No obstante, en JavaScript se pueden poner como códigos hexadecimales. Abajo pongo la tabla de correspondencia:</p>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>Á</td>
<td>\uC1</td>
</tr>
<tr>
<td>á</td>
<td>\uE1</td>
</tr>
<tr>
<td>É</td>
<td>\uC9</td>
</tr>
<tr>
<td>é</td>
<td>\uE9</td>
</tr>
<tr>
<td>Í</td>
<td>\uCD</td>
</tr>
<tr>
<td>í</td>
<td>\uED</td>
</tr>
<tr>
<td>Ñ</td>
<td>\uD1</td>
</tr>
<tr>
<td>ñ</td>
<td>\uF1</td>
</tr>
<tr>
<td>Ó</td>
<td>\uD3</td>
</tr>
<tr>
<td>ó</td>
<td>\uF3</td>
</tr>
<tr>
<td>Ú</td>
<td>\uDA</td>
</tr>
<tr>
<td>ú</td>
<td>\uFA</td>
</tr>
<tr>
<td>Ü</td>
<td>\uDC</td>
</tr>
<tr>
<td>ü</td>
<td>\uFC</td>
</tr>
<tr>
<td>¿</td>
<td>\uBF</td>
</tr>
<tr>
<td>¡</td>
<td>\uA1</td>
</tr>
<tr>
<td>€</td>
<td>\u80</td>
</tr>
</tbody>
</table>
<p>Entonces, si queremos usar estas secuencias lo único que tenemos que hacer es incluirlas en el patrón, por ejemplo:</p>
<p>var pattern=/^[\u00f1]{1}$/;</p>
<p>Sólo permitirá un sólo caracter que será la Ñ.</p>
<p>Para permitir todas las letras del castellano posibles, además del espacio se puede usar la siguiente sentencia:</p>
<p>var pattern=/^/^[A-Za-z\s\u00c1\u00e1\u00c9\u00e9\u00cd\u00ed\u00d1\u00f1\u00d3\u00f3\u00da\u00fa\u00dc\u00fc]+$/;$/;</p>
]]></content:encoded>
			<wfw:commentRss>http://xand.es/validar-formularios-con-javascript_20100402/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Paginación en Java</title>
		<link>http://xand.es/paginacion-en-java_20100320</link>
		<comments>http://xand.es/paginacion-en-java_20100320#comments</comments>
		<pubDate>Sat, 20 Mar 2010 11:28:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Soluciones]]></category>

		<guid isPermaLink="false">http://xand.es/?p=311</guid>
		<description><![CDATA[Muchas veces lo que se necesita es implementar la paginación en Java. Tengo una forma genérica en implementar cualquier tipo de paginación en cualquier sitio. Sin cargar mucho la base de datos, ni utilizar mucha memoria una vez que se devuelven los datos. Supongamos que tenemos una tabla con muchos registros (100 000, por ejemplo) [...]]]></description>
			<content:encoded><![CDATA[<p>Muchas veces lo que se necesita es implementar la paginación en Java. Tengo una forma genérica en implementar cualquier tipo de paginación en cualquier sitio. Sin cargar mucho la base de datos, ni utilizar mucha memoria una vez que se devuelven los datos. Supongamos que tenemos una tabla con muchos registros (100 000, por ejemplo) y queremos mostrarle a los usuarios 1 000 páginas con 100 registros por página.</p>
<p>Pongo un ejemplo genérico para un Servlet, pero en los demás casos la situación sería parecida.</p>
<div class="java">
<table border="0" cellspacing="0" cellpadding="3" bgcolor="#ffffff">
<tbody>
<tr><!-- start source code --></p>
<td align="left" valign="top"><code><br />
<span style="color: #7f0055;"><strong>public class </strong></span><span style="color: #000000;">PaginacionServlet </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">HttpServlet </span><span style="color: #000000;">{</span></code></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>private static final </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">REGISTROS_POR_PAGINA = </span><span style="color: #990000;">100</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;"> </span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #000000;">SqlMapClient SQL;</span></p>
<p><span style="color: #ffffff;"> </span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">doGet</span><span style="color: #000000;">(</span><span style="color: #000000;">HttpServletRequest request, HttpServletResponse response</span><span style="color: #000000;">) </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">ServletException, IOException </span><span style="color: #000000;">{</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #3f7f5f;">// para simplificar todo va dentro de bloque try..catch</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #3f7f5f;">// calculo la cantidad de contactos en todas las páginas</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>try </strong></span><span style="color: #000000;">{</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #3f7f5f;">// calculo el total de las entradas que tenemos</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">total = </span><span style="color: #000000;">(</span><span style="color: #000000;">Integer</span><span style="color: #000000;">)</span><span style="color: #000000;">SQL.queryForObject</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">&#8220;&#8221;</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;"> </span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #3f7f5f;">// calculo la cantidad de páginas total que vamos a mostrar al usuario</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">mod = total % REGISTROS_POR_PAGINA;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">diff = total - mod;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">totalPaginas = diff / REGISTROS_POR_PAGINA;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>if</strong></span><span style="color: #000000;">(</span><span style="color: #000000;">mod != </span><span style="color: #990000;">0</span><span style="color: #000000;">) </span><span style="color: #3f7f5f;">// si la división no es exacta habrá una página más</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #000000;">totalPaginas++;</span></p>
<p><span style="color: #ffffff;"> </span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #3f7f5f;">// obtengo la página actual en la que estamos</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #000000;">String sPage = request.getParameter</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">&#8220;p&#8221;</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">page = </span><span style="color: #990000;">0</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #3f7f5f;">// si no está presente el parámetro asumo que estamos en la página cero (la primera)</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>if</strong></span><span style="color: #000000;">(</span><span style="color: #000000;">sPage != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">) {</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #000000;">page = Integer.parseInt</span><span style="color: #000000;">(</span><span style="color: #000000;">sPage</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #000000;">page&#8211;;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;"> </span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #3f7f5f;">// calculo el límite y el offset que pasaremos a la BBDD en la consulta</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">offset = page * REGISTROS_POR_PAGINA;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">limit = REGISTROS_POR_PAGINA;</span></p>
<p><span style="color: #ffffff;"> </span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #3f7f5f;">// la página actual &#8221;de cara al usuario&#8221;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">paginaActual = page + </span><span style="color: #990000;">1</span><span style="color: #000000;">; </span><span style="color: #3f7f5f;">// el usuario empieza a contar de 1, no de 0</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">paginaAnterior = page; </span><span style="color: #3f7f5f;">// aquí se debería de controlar el valor de 0</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">paginaSiguiente = page + </span><span style="color: #990000;">2</span><span style="color: #000000;">; </span><span style="color: #3f7f5f;">// la misma razón</span></p>
<p><span style="color: #ffffff;"> </span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #3f7f5f;">// en la lista objects estará lo que queremos</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #000000;">List objects = SQL.queryForList</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">&#8220;queryConElLimitYElOffsetPuestos&#8221;</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;"> </span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #000000;">}</span><span style="color: #7f0055;"><strong>catch</strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Exception e</span><span style="color: #000000;">){}</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #000000;">}</span></p>
<p><span style="color: #000000;">}</span></td>
<p><!-- end source code --></tr>
</tbody>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://xand.es/paginacion-en-java_20100320/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Codificaciones en los servlets</title>
		<link>http://xand.es/codificaciones-en-los-servlets_20100318</link>
		<comments>http://xand.es/codificaciones-en-los-servlets_20100318#comments</comments>
		<pubDate>Thu, 18 Mar 2010 12:57:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Soluciones]]></category>

		<guid isPermaLink="false">http://xand.es/?p=306</guid>
		<description><![CDATA[Muchas veces, cuando trabajamos con caractéres que no están en la tabla ASCII (castellano incluído) pueden surgir problemas a la hora de tratar las cadenas en los servlets. Por ejemplo, muchas veces aparecen caractéres extraños en vez de las eñes, letras acentuadas, etc. La forma más sencilla de evitar esto es trabajar con UTF-8 (Unicode) [...]]]></description>
			<content:encoded><![CDATA[<p>Muchas veces, cuando trabajamos con caractéres que no están en la tabla ASCII (castellano incluído) pueden surgir problemas a la hora de tratar las cadenas en los servlets. Por ejemplo, muchas veces aparecen caractéres extraños en vez de las eñes, letras acentuadas, etc. La forma más sencilla de evitar esto es trabajar con UTF-8 (Unicode) a todos los niveles. Para lograrlo basta con seguir unas simples reglas a la hora de enviar los formularios:</p>
<ol>
<li>En la página HTML desde la que se envía el formulario hay que poner el meta, exactamente: <strong><em>&lt;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=UTF-8&#8243;&gt;</em></strong></li>
<li>En el servlet que trata la página enviada, <strong>la primera (esto es super-importante) llamada</strong> tiene que ser: <strong><em>request.setCharacterEncoding(&#8220;UTF-8&#8243;);</em></strong></li>
<li>No estaría demás (pero no es obligatorio) incluir en la página HTML el tipo de documento que es, por ejemplo: <strong><em>&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Transitional//EN&#8221; &#8220;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#8221;&gt;.</em></strong></li>
</ol>
<p>Siguiendo estas sencillas reglas se puede evitar muchos quebraderos de cabeza.</p>
]]></content:encoded>
			<wfw:commentRss>http://xand.es/codificaciones-en-los-servlets_20100318/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Integrar phpbb en cualquier sitio web</title>
		<link>http://xand.es/integrar-phpbb-en-cualquier-sitio-web_20100307</link>
		<comments>http://xand.es/integrar-phpbb-en-cualquier-sitio-web_20100307#comments</comments>
		<pubDate>Sun, 07 Mar 2010 21:38:41 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Soluciones]]></category>

		<guid isPermaLink="false">http://xand.es/?p=257</guid>
		<description><![CDATA[Resulta que hace unas semanas decidimos incluir un foro en la página tuseuros.com &#8211; nuestro pequeño sistema de monetización de  tráfico web. Aunque el sistema está hecho en Java el foro que se ha decidido poner es phpBB por ser la solución gratuita más completa disponible.
El problema con el que me he encontrado es que [...]]]></description>
			<content:encoded><![CDATA[<p>Resulta que hace unas semanas decidimos incluir un foro en la página <a href="http://tuseuros.com">tuseuros.com</a> &#8211; nuestro pequeño sistema de monetización de  tráfico web. Aunque el sistema está hecho en Java el foro que se ha decidido poner es <a href="http://phpbb.com">phpBB</a> por ser la solución gratuita más completa disponible.</p>
<p>El problema con el que me he encontrado es que la integración es un poco compleja teniendo en cuenta que no hay ningún módulo destinado para tal fin. Hay que tener en cuenta que el sitio ya tiene una base de datos de usuarios y lo que tenía que conseguir es que la autenticación sea común en ambos sitios. También el objetivo es evitar que los usuarios tengan que registrarse de nuevo.</p>
<p>Para conseguir esto he decidido modificar directamente la tabla de la base de datos contra la que se conecta el foro phpbb. Claro está que para ello se necesita tener el acceso pero es un tema menor ya que no presenta ningún problema.</p>
<p>Para hacer la tarea más fácil creamos un usuario de prueba para poder coger los valores específicas para la tabla.</p>
<h3><strong><span style="text-decoration: underline;">Dar de alta a los usuarios.</span></strong></h3>
<p>Para dar de alta a los usuarios tenemos que insertar un registro en las tablas <em>users</em> y <em>user_group</em> (las tablas llevan un prefijo delante).</p>
<p>Primero se actualiza la tabla <em>users</em>. Los campos que tenemos que poner son los siguientes:</p>
<ul>
<li><span style="text-decoration: underline;">user_type</span> &#8211; copiar del usuario de prueba</li>
<li><span style="text-decoration: underline;">group_id</span>- copiar del usuario de prueba</li>
<li><span style="text-decoration: underline;">user_permissions</span>- copiar del usuario de prueba</li>
<li><span style="text-decoration: underline;">user_ip</span> &#8211; se puede poner una dirección ip cualquiera</li>
<li><span style="text-decoration: underline;">user_regdate</span> &#8211; poner la fecha de registro en formato unix timestamp</li>
<li><span style="text-decoration: underline;">username</span> &#8211; nombre de usuario (este nombre aparecerá en los posts del usuario)</li>
<li><span style="text-decoration: underline;">username_clean</span> &#8211; nombre de usuario</li>
<li><span style="text-decoration: underline;">user_password</span> &#8211; dejar vacío</li>
<li><span style="text-decoration: underline;">user_email</span> &#8211; correo electrónico del usuario</li>
<li><span style="text-decoration: underline;">user_email_hash</span> &#8211; hash del correo electrónico (crc32 hash del correo hay que concatenarlo con la longitud del correo)</li>
</ul>
<p>El valor <span style="text-decoration: underline;">user_id</span> se generará sólo por la base de datos. Este valor tenemos que obtenerlo para guardarlo en nuestra base de datos principal, será necesario para autenticar al usuario dentro del foro.</p>
<p>Ahora hay que añadir una entrada en la tabla <em>user_group</em>.</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Tenemos que insertar una entrada con los siguientes campos:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">user_id &#8211; id del usuario que acabamos de insertar.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">group_id &#8211; lo mismo que en el caso de usuario de prueba</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Autenticar a los usuarios.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">El proceso de autenticación de los usuarios para phpbb consiste en crear una entrada en la tabla sessions. Los campos que tenemos que tocar son los siguientes:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">session_id &#8211; id de la sesión generado (un hash de 32 caracteres)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">session_user_id &#8211; del usuario que pretendemos autenticar</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">session_start &#8211; hora actual en format unix timestamp</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">session_time &#8211; hora actual en format unix timestamp</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">session_ip &#8211; ip del usuario</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">session_browser &#8211; navegador del usuario. Se puede obtener a partir de la cabecera User-Agent.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Rederigir al usuario autenticado al foro.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">phpBB determina que el usuario esta en función de dos cookies:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">prefijo_u &#8211; id del usuario.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">prefijo_sid &#8211; identificador de sesión que hemos insertado en la tabla.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">El prefijo se configura en el panel de administración del foro. Para hacer este paso más sencillo he creado un sencillo script en PHP y lo he guardado como sess.php en el directorio raíz del foro.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;?php$u=$_GET["u"];$sid=$_GET["sid"];setcookie(&#8220;phpbb3_oxwyp_u&#8221;, &#8220;&#8221;, 1, &#8220;/&#8221;, &#8220;foro.tuseuros.com&#8221;);setcookie(&#8220;phpbb3_oxwyp_sid&#8221;, &#8220;&#8221;, 1, &#8220;/&#8221;, &#8220;foro.tuseuros.com&#8221;);setcookie(&#8220;phpbb3_oxwyp_u&#8221;, $u, time()+360000, &#8220;/&#8221;, &#8220;foro.tuseuros.com&#8221;);setcookie(&#8220;phpbb3_oxwyp_sid&#8221;, $sid, time()+360000, &#8220;/&#8221;, &#8220;foro.tuseuros.com&#8221;);header(&#8216;Location: http://foro.tuseuros.com/&#8217;);?&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;?php</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">$u=$_GET["u"];</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">$sid=$_GET["sid"];</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">setcookie(&#8220;prefijo_u&#8221;, &#8220;&#8221;, 1, &#8220;/&#8221;, &#8220;url_del_foro&#8221;);</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">setcookie(&#8220;prefijo_sid&#8221;, &#8220;&#8221;, 1, &#8220;/&#8221;, &#8220;url_del_foro&#8221;);</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">setcookie(&#8220;prefijo_u&#8221;, $u, time()+360000, &#8220;/&#8221;, &#8220;url_del_foro&#8221;);</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">setcookie(&#8220;prefijo_sid&#8221;, $sid, time()+360000, &#8220;/&#8221;, &#8220;url_del_foro&#8221;);</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">header(&#8216;Location: http://url_del_foro/&#8217;);</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">?&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 180px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">De esta forma rederigir el usuario al foro se transforma simplemente en enviarlo a la url /sess.php?sid=id_sesion&amp;u=usuario_id.</div>
<p>Tenemos que insertar una entrada con los siguientes campos:</p>
<ul>
<li><span style="text-decoration: underline;">user_id</span> &#8211; id del usuario que acabamos de insertar.</li>
<li><span style="text-decoration: underline;">group_id</span> &#8211; lo mismo que en el caso de usuario de prueba</li>
</ul>
<h3><span style="text-decoration: underline;">Autenticar a los usuarios.</span></h3>
<p>El proceso de autenticación de los usuarios para phpbb consiste en crear una entrada en la tabla sessions. Los campos que tenemos que tocar son los siguientes:</p>
<ul>
<li><span style="text-decoration: underline;">session_id</span> &#8211; id de la sesión generado (un hash de 32 caracteres)</li>
<li><span style="text-decoration: underline;">session_user_id</span> &#8211; del usuario que pretendemos autenticar</li>
<li><span style="text-decoration: underline;">session_start</span> &#8211; hora actual en format unix timestamp</li>
<li><span style="text-decoration: underline;">session_time</span> &#8211; hora actual en format unix timestamp</li>
<li><span style="text-decoration: underline;">session_ip</span> &#8211; ip del usuario</li>
<li><span style="text-decoration: underline;">session_browser</span> &#8211; navegador del usuario. Se puede obtener a partir de la cabecera User-Agent.</li>
</ul>
<h3><span style="text-decoration: underline;">Rederigir al usuario autenticado al foro.</span></h3>
<p>phpBB determina que el usuario esta en función de dos cookies:</p>
<ul>
<li><em>prefijo</em>_u &#8211; id del usuario.</li>
<li><em>prefijo</em>_sid &#8211; identificador de sesión que hemos insertado en la tabla.</li>
</ul>
<p>El prefijo se configura en el panel de administración del foro. Para hacer este paso más sencillo he creado un sencillo script en PHP y lo he guardado como <em>sess.php</em> en el directorio raíz del foro.</p>
<p>&lt;?php</p>
<p>$u=$_GET["u"];</p>
<p>$sid=$_GET["sid"];</p>
<p>setcookie(&#8220;<em>prefijo</em>_u&#8221;, &#8220;&#8221;, 1, &#8220;/&#8221;, &#8220;<em>url_del_foro</em>&#8220;);</p>
<p>setcookie(&#8220;<em>prefijo</em>_sid&#8221;, &#8220;&#8221;, 1, &#8220;/&#8221;, &#8220;<em>url_del_foro</em>&#8220;);</p>
<p>setcookie(&#8220;<em>prefijo</em>_u&#8221;, $u, time()+360000, &#8220;/&#8221;, &#8220;<em>url_del_foro</em>&#8220;);</p>
<p>setcookie(&#8220;<em>prefijo</em>_sid&#8221;, $sid, time()+360000, &#8220;/&#8221;, &#8220;<em>url_del_foro</em>&#8220;);</p>
<p>header(&#8216;Location: http://<em>url_del_foro</em>/&#8217;);</p>
<p>?&gt;</p>
<p>De esta forma rederigir el usuario al foro se transforma simplemente en enviarlo a la url /sess.php?sid=<em>id_sesion</em>&amp;u=<em>usuario_id</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://xand.es/integrar-phpbb-en-cualquier-sitio-web_20100307/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Enviar SMS de forma completamente gratuita</title>
		<link>http://xand.es/enviar-sms-de-forma-completamente-gratuita_20100114</link>
		<comments>http://xand.es/enviar-sms-de-forma-completamente-gratuita_20100114#comments</comments>
		<pubDate>Thu, 14 Jan 2010 15:34:27 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Soluciones]]></category>

		<guid isPermaLink="false">http://xand.es/?p=209</guid>
		<description><![CDATA[Hace poco estaba buscando un proveedor para poder enviar muchos SMS para un cliente. Googleando encontré la página mjoy.com. Es una página que permite enviar mensajes de forma completamente gratuita en todo el mundo. Sin coñas, lo he probado y funciona perfectamente. Lo único que hacen es incluir en el pie del mensaje algo así [...]]]></description>
			<content:encoded><![CDATA[<p>Hace poco estaba buscando un proveedor para poder enviar muchos SMS para un cliente. Googleando encontré la página <a href="http://mjoy.com">mjoy.com</a>. Es una página que permite enviar mensajes de forma completamente gratuita en todo el mundo. Sin coñas, lo he probado y funciona perfectamente. Lo único que hacen es incluir en el pie del mensaje algo así como &#8220;Mensajes gratuitos con mjoy.com&#8221;.</p>
<p>El problema es que sólo lo permiten utilizar desde el navegador del móvil, cosa que podemos arreglar (y poder enviar SMS desde nuestro navegador de toda la vida) siguiendo los pasos de este mini manual.</p>
<p>1. Nos registramos en mjoy.com con nuestro número de teléfono.</p>
<p>2. Nos llega un mensaje con el link de activación.</p>
<p>3. Tenemos que hacer para que la página piense que accedemos desde un móvil. Para lograr esto tenemos que cambiar la cabecera User-Agent del navegador. En Mozilla Firefox se hace de la siguiente forma. Abrimos about:config, pinchamos con el botón derecho y creamos una nueva propiedad de tipo String con el nombre general.useragent.override. A la propiedad le podemos asignar cualquier nombre que coincida con el user-agent de algún navegador móvil. En esta <a href="http://wiki.forum.nokia.com/index.php/User-Agent_headers_for_Nokia_devices">página</a> hay unos cuantos, yo he cogido el siguiente: <tt>NokiaN73-2/2.0626 S60/3.0 Profile/MIDP-2.0 Configuration/CLDC-1.1.</tt></p>
<p>4. Ahora ya podemos entrar con el User-Agent cambiado al enlace que nos acaban de mandar los de mjoy.</p>
<p>5. Completamos un simple proceso de registro y voila. Ya podemos enviar los SMS gratuitos desde nuestro navegador.</p>
]]></content:encoded>
			<wfw:commentRss>http://xand.es/enviar-sms-de-forma-completamente-gratuita_20100114/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>En qué consiste la elaboración de un proyecto</title>
		<link>http://xand.es/en-que-consiste-la-elaboracion-de-un-proyecto_20090915</link>
		<comments>http://xand.es/en-que-consiste-la-elaboracion-de-un-proyecto_20090915#comments</comments>
		<pubDate>Tue, 15 Sep 2009 08:38:53 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Opinión]]></category>
		<category><![CDATA[Soluciones]]></category>

		<guid isPermaLink="false">http://xand.es/?p=197</guid>
		<description><![CDATA[Muchas veces me preguntan como se elabora el presupuesto para un proyecto web (o más generalmente &#8212; cualquier proyecto informático). Pues muy sencillo. Un proyecto pasa por las siguientes fases:

Elaboración de los requisitos.
Elaboración del contrato basándose en los requisitos (precios/plazos).
Diseño de la página de inicio.
Diseño de las páginas interiores.
Maquetación.
Elaboración del modelo de datos.
Programación del sistema.
Preparación [...]]]></description>
			<content:encoded><![CDATA[<p>Muchas veces me preguntan como se elabora el presupuesto para un proyecto web (o más generalmente &#8212; cualquier proyecto informático). Pues muy sencillo. Un proyecto pasa por las siguientes fases:</p>
<ol>
<li>Elaboración de los requisitos.</li>
<li>Elaboración del contrato basándose en los requisitos (precios/plazos).</li>
<li>Diseño de la página de inicio.</li>
<li>Diseño de las páginas interiores.</li>
<li>Maquetación.</li>
<li>Elaboración del modelo de datos.</li>
<li>Programación del sistema.</li>
<li>Preparación del dominio y hosting.</li>
<li>Instalación del sistema.</li>
<li>Elaborar y/o subir el contenido.</li>
<li>Preparar y/o comprar las fotos.</li>
<li>Arranque de la versión beta.</li>
<li>Primera vuelta para completar algunas funcionalidades.</li>
<li>Arranque de la versión RC.</li>
<li>Segunda vuelta de implementación.</li>
<li>Arranque del proyecto.</li>
<li>SEO y promoción en los buscadores.</li>
</ol>
<p>Basicamente, con algunas variaciones, este es el proceso que se sigue cuando se crea una página web cualquiera.</p>
]]></content:encoded>
			<wfw:commentRss>http://xand.es/en-que-consiste-la-elaboracion-de-un-proyecto_20090915/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Seleccionar fecha con jQuery UI Datepicker</title>
		<link>http://xand.es/seleccionar-fecha-con-jquery-ui-datepicker_20090825</link>
		<comments>http://xand.es/seleccionar-fecha-con-jquery-ui-datepicker_20090825#comments</comments>
		<pubDate>Tue, 25 Aug 2009 16:25:36 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Soluciones]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://xand.es/?p=167</guid>
		<description><![CDATA[Hoy en día hay muchas librerías que nos pueden hacer la vida mucho más sencilla cuando se trata de JavaScript. Todos conocemos bibliotecas como jQuery, Prototype y otras. En esta entrada voy a hablar sobre una extensión de la librería jQuery llamada jQuery UI.

Esta biblioteca ofrece varios componentes gráficos que podemos usar en nuestras páginas, [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy en día hay muchas librerías que nos pueden hacer la vida mucho más sencilla cuando se trata de <strong>JavaScript</strong>. Todos conocemos bibliotecas como <strong>jQuery, Prototype</strong> y otras. En esta entrada voy a hablar sobre una extensión de la librería jQuery llamada <strong>jQuery UI</strong>.</p>
<p><img src="http://xand.es/wp-content/uploads/cal.png" alt="jQuery UI Datepicker" /></p>
<p>Esta biblioteca ofrece varios componentes gráficos que podemos usar en nuestras páginas, entre ellos podemos destacar, <strong>datepicker</strong> &#8212; seleccionador de fecha (<strong>calendario</strong>), <strong>dialog</strong> &#8212; ventanas modales, <strong>progressbar</strong> &#8212; barra de progreso y muchos otros. Voy a explicar como podemos usar <strong>datepicker</strong> adaptado al entorno nuestro, es decir, a España con sus correspondientes días de la semana, nombres de meses, etc.</p>
<p>Antes que nada tenemos que <a href="http://docs.jquery.com/Downloading_jQuery">descargar la última versión de jQuery</a> e incluirla en nuestras páginas:</p>
<div align="left" class="java">
<table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
<tr>
  <!-- start source code --></p>
<td nowrap="nowrap" valign="top" align="left">
    <code><br />
<font color="#000000">&lt;script&nbsp;type=</font><font color="#2a00ff">&#34;text/javascript&#34;&nbsp;</font><font color="#000000">src=</font><font color="#2a00ff">&#34;jquery.js&#34;</font><font color="#000000">&gt;&lt;/script&gt;</font></code></p>
</td>
<p>  <!-- end source code --><br />
   </tr>
</table>
</div>
<p>Una vez que tengamos jQuery instalado, descargamos <strong>jQueryUI</strong> desde esta <a href="http://jqueryui.com/download">página</a>. Como podéis ver ofrecen las versiones completamente personalizadas para cada gusto. Yo aconsejaría descargar la versión de la librería completa, al menos para las pruebas.</p>
<p>Desempaquetamos todos, en este punto vamos a tener tres grupos de ficheros, el propio <strong>JavaScript</strong>, las imágenes y el css, en un principios las imágenes tienen que ir en el directorio /images, no he mirado las opciones para poder cambiar esto, pero estoy casi seguro que se podrá hacer de alguna forma. En cuanto al resto, lo incluímos en la cabecera de la página web.</p>
<div align="left" class="java">
<table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
<tr>
  <!-- start source code --></p>
<td nowrap="nowrap" valign="top" align="left">
    <code><br />
<font color="#000000">&lt;link&nbsp;type=</font><font color="#2a00ff">&#34;text/css&#34;&nbsp;</font><font color="#000000">href=</font><font color="#2a00ff">&#34;jquery-ui.css&#34;&nbsp;</font><font color="#000000">rel=</font><font color="#2a00ff">&#34;stylesheet&#34;&nbsp;</font><font color="#000000">/&gt;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">&lt;script&nbsp;type=</font><font color="#2a00ff">&#34;text/javascript&#34;&nbsp;</font><font color="#000000">src=</font><font color="#2a00ff">&#34;jquery-ui.js&#34;</font><font color="#000000">&gt;&lt;/script&gt;</font></code></p>
</td>
<p>  <!-- end source code --><br />
   </tr>
</table>
</div>
<p>Una vez hecho esto ya podemos instanciar el datepicker. La forma más sencilla de hacerlo es creado un input de tipo texto:</p>
<div align="left" class="java">
<table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
<tr>
  <!-- start source code --></p>
<td nowrap="nowrap" valign="top" align="left">
    <code><br />
<font color="#000000">&lt;input&nbsp;type=</font><font color="#2a00ff">&#34;text&#34;&nbsp;</font><font color="#000000">id=</font><font color="#2a00ff">&#34;date-start&#34;&nbsp;</font><font color="#000000">name=</font><font color="#2a00ff">&#34;date-start&#34;&nbsp;</font><font color="#000000">/&gt;</font></code></p>
</td>
<p>  <!-- end source code --><br />
   </tr>
</table>
</div>
<p>Una vez que lo tengamos definido, podemos instanciar el datepicker en el bloque head de la siguiente manera:</p>
<div align="left" class="java">
<table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
<tr>
  <!-- start source code --></p>
<td nowrap="nowrap" valign="top" align="left">
    <code><br />
<font color="#000000">&lt;script&nbsp;type=</font><font color="#2a00ff">&#34;text/javascript&#34;</font><font color="#000000">&gt;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">$</font><font color="#000000">(</font><font color="#000000">function</font><font color="#000000">()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">$</font><font color="#000000">(</font><font color="#2a00ff">&#34;#date-start&#34;</font><font color="#000000">)</font><font color="#000000">.datepicker</font><font color="#000000">({</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">dateFormat:&nbsp;</font><font color="#ff6100">'dd</font><font color="#000000">/mm/yy</font><font color="#ff6100">',&nbsp;</font><font color="#3f7f5f">//&nbsp;formato&nbsp;de&nbsp;fecha&nbsp;que&nbsp;se&nbsp;usa&nbsp;en&nbsp;Espa&ntilde;a</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">dayNames:&nbsp;</font><font color="#000000">[</font><font color="#ff6100">'Do</font><font color="#000000">mingo</font><font color="#ff6100">',&nbsp;'Lu</font><font color="#000000">nes</font><font color="#ff6100">',&nbsp;'Ma</font><font color="#000000">rtes</font><font color="#ff6100">',&nbsp;'Mi</font><font color="#000000">&eacute;rcoles</font><font color="#ff6100">',&nbsp;'Ju</font><font color="#000000">eves</font><font color="#ff6100">',&nbsp;'Vi</font><font color="#000000">ernes</font><font color="#ff6100">',&nbsp;'Sa</font><font color="#000000">bado</font><font color="#ff6100">'],&nbsp;</font><font color="#3f7f5f">//&nbsp;d&iacute;as&nbsp;de&nbsp;la&nbsp;semana</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">dayNamesMin:&nbsp;</font><font color="#000000">[</font><font color="#990000">'D'</font><font color="#000000">,&nbsp;</font><font color="#990000">'L'</font><font color="#000000">,&nbsp;</font><font color="#990000">'M'</font><font color="#000000">,&nbsp;</font><font color="#990000">'X'</font><font color="#000000">,&nbsp;</font><font color="#990000">'J'</font><font color="#000000">,&nbsp;</font><font color="#990000">'V'</font><font color="#000000">,&nbsp;</font><font color="#990000">'S'</font><font color="#000000">]</font><font color="#000000">,&nbsp;</font><font color="#3f7f5f">//&nbsp;d&iacute;as&nbsp;de&nbsp;la&nbsp;semana&nbsp;(versi&oacute;n&nbsp;super-corta)</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">dayNamesShort:&nbsp;</font><font color="#000000">[</font><font color="#ff6100">'Do</font><font color="#000000">m</font><font color="#ff6100">',&nbsp;'Lu</font><font color="#000000">n</font><font color="#ff6100">',&nbsp;'Ma</font><font color="#000000">r</font><font color="#ff6100">',&nbsp;'Mi</font><font color="#000000">e</font><font color="#ff6100">',&nbsp;'Ju</font><font color="#000000">e</font><font color="#ff6100">',&nbsp;'Vi</font><font color="#000000">e</font><font color="#ff6100">',&nbsp;'Sa</font><font color="#000000">b</font><font color="#ff6100">'],&nbsp;</font><font color="#3f7f5f">//&nbsp;d&iacute;as&nbsp;de&nbsp;la&nbsp;semana&nbsp;(versi&oacute;n&nbsp;corta)</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">firstDay:&nbsp;</font><font color="#990000">1</font><font color="#000000">,&nbsp;</font><font color="#3f7f5f">//&nbsp;primer&nbsp;d&iacute;a&nbsp;de&nbsp;la&nbsp;semana&nbsp;(Lunes)</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">maxDate:&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">Date</font><font color="#000000">()</font><font color="#000000">,&nbsp;</font><font color="#3f7f5f">//&nbsp;fecha&nbsp;m&aacute;xima</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">minDate:&nbsp;</font><font color="#ff6100">'-2</font><font color="#000000">y</font><font color="#ff6100">',</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">monthNames:&nbsp;</font><font color="#000000">[</font><font color="#ff6100">'En</font><font color="#000000">ero</font><font color="#ff6100">',&nbsp;'Fe</font><font color="#000000">brero</font><font color="#ff6100">',&nbsp;'Ma</font><font color="#000000">rzo</font><font color="#ff6100">',&nbsp;'Ab</font><font color="#000000">ril</font><font color="#ff6100">',&nbsp;'Ma</font><font color="#000000">yo</font><font color="#ff6100">',&nbsp;'Ju</font><font color="#000000">nio</font><font color="#ff6100">',&nbsp;'Ju</font><font color="#000000">lio</font><font color="#ff6100">',&nbsp;'Ag</font><font color="#000000">osto</font><font color="#ff6100">',&nbsp;'Se</font><font color="#000000">ptiembre</font><font color="#ff6100">',&nbsp;'Oc</font><font color="#000000">tubre</font><font color="#ff6100">',&nbsp;'No</font><font color="#000000">viembre</font><font color="#ff6100">',&nbsp;'Di</font><font color="#000000">ciembre</font><font color="#ff6100">'],&nbsp;</font><font color="#3f7f5f">//&nbsp;meses</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">monthNamesShort:&nbsp;</font><font color="#000000">[</font><font color="#ff6100">'En</font><font color="#000000">e</font><font color="#ff6100">',&nbsp;'Fe</font><font color="#000000">b</font><font color="#ff6100">',&nbsp;'Ma</font><font color="#000000">r</font><font color="#ff6100">',&nbsp;'Ab</font><font color="#000000">r</font><font color="#ff6100">',&nbsp;'Ma</font><font color="#000000">y</font><font color="#ff6100">',&nbsp;'Ju</font><font color="#000000">n</font><font color="#ff6100">',&nbsp;'Ju</font><font color="#000000">l</font><font color="#ff6100">',&nbsp;'Ag</font><font color="#000000">o</font><font color="#ff6100">',&nbsp;'Se</font><font color="#000000">p</font><font color="#ff6100">',&nbsp;'Oc</font><font color="#000000">t</font><font color="#ff6100">',&nbsp;'No</font><font color="#000000">v</font><font color="#ff6100">',&nbsp;'Di</font><font color="#000000">c</font><font color="#ff6100">'],&nbsp;</font><font color="#3f7f5f">//&nbsp;meses</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">navigationAsDateFormat:&nbsp;true,</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">})</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">})</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">&lt;/script&gt;</font></code></p>
</td>
<p>  <!-- end source code --><br />
   </tr>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://xand.es/seleccionar-fecha-con-jquery-ui-datepicker_20090825/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Ser autónomo en España</title>
		<link>http://xand.es/ser-autonomo-en-espana_20090818</link>
		<comments>http://xand.es/ser-autonomo-en-espana_20090818#comments</comments>
		<pubDate>Tue, 18 Aug 2009 18:37:41 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Soluciones]]></category>

		<guid isPermaLink="false">http://xand.es/?p=161</guid>
		<description><![CDATA[Presiamente hoy he estado hablando con mi gestor sobre cómo ser autónomo en España. Más concretamente sobre los impuestos y la seguridad social que tiene que pagar uno. Para todas aquellas personas que quieren dar el paso dejo aquí esta pequeña referencia.
Un autónomo paga la Seguridad Social, la cotización mínima que puede escoger es de [...]]]></description>
			<content:encoded><![CDATA[<p>Presiamente hoy he estado hablando con mi gestor sobre cómo <strong>ser autónomo en Españ</strong>a. Más concretamente sobre <strong>los impuestos y la seguridad social</strong> que tiene que pagar uno. Para todas aquellas personas que quieren dar el paso dejo aquí esta pequeña referencia.</p>
<p>Un autónomo paga la <strong>Seguridad Social</strong>, la <strong>cotización mínima</strong> que puede escoger es de 250 euros si la persona es mayor de 30 años y un 75% de esta cantidad (lo que viene a ser unos 187,50 euros) si es menor de 30 años. Este pago es sagrado y tiene que realizarse mensualmente.</p>
<p>Otro gasto que va a tener es el <strong>IRPF</strong>, es decir que va a pagar <strong>un 20% sobre todos los beneficios</strong> obtenidos. Un autónomo puede tener <strong>gastos y beneficios</strong>, pongamos por caso que has hecho un proyecto por el que has cobrado 1000 euros, pero para hacerlo has tenido que pagar un ordenador que cuesta 800 euros. Pués tu <strong>ganancia neta</strong> ha sido de 200 euros. Tendrás que pagar de <strong>IRPF</strong> unos 40 euros. Este pago es anual (corregidme si me equivoco).</p>
<p>Por último un  autónomo tiene que <strong>declarar el IVA trimestralmente</strong>. Aquí viene lo gracioso y lo que más quebraderos de cabeza nos da. En cada factura que emitamos se añade un <strong>16% de IVA</strong>. Por ejemplo, si emites una facutra por un importe de 1000, el total será de 1160 (1000 euros + 16%). Pero claro, en nuestra vida cotidiana para desarrollar nuestras funciones como autónomo necesitamos luz, internet, coche, comer, etc. Pués todo este IVA que pagas en cada factura se puede <strong>deducir</strong> ya que la declaración la tienes que hacer sobre la diferencia de lo que has pagado y lo que has percibido. Si has pagado más IVA de lo que percibiste, la hacienda tiene que devolverte la diferencia, pero si has pagado menos de lo que has percibido, como dice mi socio, tienes un problema.</p>
]]></content:encoded>
			<wfw:commentRss>http://xand.es/ser-autonomo-en-espana_20090818/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Java2HTML &#8212; una utilidad para colorear Java</title>
		<link>http://xand.es/java2html-una-utilidad-para-colorear-java_20090817</link>
		<comments>http://xand.es/java2html-una-utilidad-para-colorear-java_20090817#comments</comments>
		<pubDate>Mon, 17 Aug 2009 18:43:17 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Descargas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Soluciones]]></category>

		<guid isPermaLink="false">http://xand.es/?p=159</guid>
		<description><![CDATA[Ya que siempre estoy poniendo el código en estas páginas voy a pensar más en los usuarios que lean esto. He encontrado una utilidad muy buena llamada Java2HTML. Se puede instalar o bien como una aplicación aparte o bien como un plugin de Eclipse. Colorea el código bastante bien (podeis ver ejemplos en este mismo [...]]]></description>
			<content:encoded><![CDATA[<p>Ya que siempre estoy poniendo el código en estas páginas voy a pensar más en los usuarios que lean esto. He encontrado una utilidad muy buena llamada <strong>Java2HTML</strong>. Se puede instalar o bien como una aplicación aparte o bien como un <strong>plugin de Eclipse</strong>. <strong>Colorea el código</strong> bastante bien (podeis ver ejemplos en este mismo blog) y es muy sencilla de instalar, aquí dejo los enlaces:</p>
<p><a href="http://www.java2html.com">Java2HTML</a> &#8212; aplicación standalone.<br />
<a href="http://www.java2html.de/eclipse.html">Java2HTML</a> &#8212; plugin para Eclipse (probado con Ganymede).</p>
]]></content:encoded>
			<wfw:commentRss>http://xand.es/java2html-una-utilidad-para-colorear-java_20090817/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ejecutar comandos Linux desde Java (II)</title>
		<link>http://xand.es/ejecutar-comandos-linux-desde-java-ii_20090817</link>
		<comments>http://xand.es/ejecutar-comandos-linux-desde-java-ii_20090817#comments</comments>
		<pubDate>Mon, 17 Aug 2009 18:11:47 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Soluciones]]></category>

		<guid isPermaLink="false">http://xand.es/?p=147</guid>
		<description><![CDATA[La primera parte se encuentra aquí.
En la entrada anterior vimos un ejemplo sencillo sobre cómo podíamos ejecutar un comando externo desde el código Java. Voy a intentar construir algo más complejo que esto, concretamente me interesa hacer una clase que pueda lanzar un comando Linux sin bloquear el hilo que lo origina. Es decir, lanzar [...]]]></description>
			<content:encoded><![CDATA[<p>La primera parte se encuentra <a href="http://xand.es/ejecutar-comandos-linux-desde-java_20090816">aquí</a>.</p>
<p>En la entrada anterior vimos un ejemplo sencillo sobre cómo podíamos <strong>ejecutar un comando externo desde el código Java</strong>. Voy a intentar construir algo más complejo que esto, concretamente me interesa hacer una clase que pueda <strong>lanzar un comando Linux sin bloquear el hilo</strong> que lo origina. Es decir, <strong>lanzar un comando como si fuera un Thread</strong> más de la máquina virtual.</p>
<p>La forma más sencilla que conozco para hacerlo sin ningún tipo de bloqueos es mediante un <strong>Listener</strong>. A mi me interesa <strong>ver en tiempo real la STDOUT y STDERR del comando externo</strong>. También quiero saber cuando acaba y cuál es el código de salida. Construyo una interfaz:</p>
<div align="left" class="java">
<table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
<tr>
  <!-- start source code --></p>
<td nowrap="nowrap" valign="top" align="left">
    <code><br />
<font color="#7f0055"><b>public&nbsp;interface&nbsp;</b></font><font color="#000000">ProcessListener&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;se&nbsp;llama&nbsp;cuando&nbsp;se&nbsp;actualiza&nbsp;la&nbsp;salida&nbsp;est&aacute;ndar</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#7f0055"><b>void&nbsp;</b></font><font color="#000000">updateStdOut</font><font color="#000000">(</font><font color="#7f0055"><b>byte</b></font><font color="#000000">[]&nbsp;</font><font color="#000000">b</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;se&nbsp;llama&nbsp;cuando&nbsp;se&nbsp;actualiza&nbsp;StdErr</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#7f0055"><b>void&nbsp;</b></font><font color="#000000">updateStdErr</font><font color="#000000">(</font><font color="#7f0055"><b>byte</b></font><font color="#000000">[]&nbsp;</font><font color="#000000">b</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;se&nbsp;llama&nbsp;cuando&nbsp;el&nbsp;proceso&nbsp;termina</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#7f0055"><b>void&nbsp;</b></font><font color="#000000">processFinish</font><font color="#000000">(</font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">exitCode,&nbsp;</font><font color="#7f0055"><b>byte</b></font><font color="#000000">[]&nbsp;</font><font color="#000000">stdOut,&nbsp;</font><font color="#7f0055"><b>byte</b></font><font color="#000000">[]&nbsp;</font><font color="#000000">stdErr</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#000000">}</font></code></p>
</td>
<p>  <!-- end source code --><br />
   </tr>
</table>
</div>
<p>Esta será la interfaz que implementaremos en una clase que será la responsable de realizar ciertas operaciones en función de las distintas salidas del comando exterior. Ahora necesitamos una clase que será la encargada de lanzar el proceso propiamente dicho:</p>
<div align="left" class="java">
<table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
<tr>
  <!-- start source code --></p>
<td nowrap="nowrap" valign="top" align="left">
    <code><br />
<font color="#7f0055"><b>public&nbsp;class&nbsp;</b></font><font color="#000000">ProcessLauncher&nbsp;</font><font color="#7f0055"><b>implements&nbsp;</b></font><font color="#000000">Runnable&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">String&nbsp;Command;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">ExitCode&nbsp;=&nbsp;Integer.MIN_VALUE;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">Thread&nbsp;MyThread;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">Vector&nbsp;StdOut;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">Vector&nbsp;StdErr;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">ProcessListener&nbsp;MyProcessListener;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">Object&nbsp;Lock&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">Object</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">Process&nbsp;MyProcess;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#000000">ProcessLauncher</font><font color="#000000">(</font><font color="#000000">String&nbsp;command,&nbsp;ProcessListener&nbsp;pl</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Command&nbsp;=&nbsp;command;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyProcessListener&nbsp;=&nbsp;pl;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">StdOut&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">Vector</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">StdErr&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">Vector</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyThread&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">Thread</font><font color="#000000">(</font><font color="#7f0055"><b>this</b></font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyThread.start</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#7f0055"><b>boolean&nbsp;</b></font><font color="#000000">isFinished</font><font color="#000000">()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>return&nbsp;</b></font><font color="#000000">ExitCode&nbsp;!=&nbsp;Integer.MIN_VALUE;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#7f0055"><b>void&nbsp;</b></font><font color="#000000">run</font><font color="#000000">()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>try&nbsp;</b></font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;arranco&nbsp;el&nbsp;proceso</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyProcess&nbsp;=&nbsp;startProcess</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;creo&nbsp;un&nbsp;controlador&nbsp;del&nbsp;proceso</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">ProcessController&nbsp;pc&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">ProcessController</font><font color="#000000">(</font><font color="#000000">MyProcess,&nbsp;</font><font color="#7f0055"><b>this</b></font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;ahora&nbsp;hasta&nbsp;que&nbsp;no&nbsp;finalice&nbsp;el&nbsp;m&eacute;todo&nbsp;voy&nbsp;leyendo&nbsp;la&nbsp;salida</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>while</b></font><font color="#000000">(</font><font color="#000000">ExitCode&nbsp;==&nbsp;Integer.MIN_VALUE</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>synchronized</b></font><font color="#000000">(</font><font color="#000000">Lock</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;de&nbsp;esta&nbsp;forma&nbsp;me&nbsp;aseguro&nbsp;que&nbsp;nadie&nbsp;m&aacute;s&nbsp;est&aacute;&nbsp;leyendo&nbsp;la&nbsp;salida</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">readStreams</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Thread.sleep</font><font color="#000000">(</font><font color="#990000">500</font><font color="#000000">)</font><font color="#000000">;&nbsp;</font><font color="#3f7f5f">//&nbsp;duermo&nbsp;un&nbsp;poco&nbsp;para&nbsp;liberar&nbsp;los&nbsp;recursos</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><font color="#7f0055"><b>catch</b></font><font color="#000000">(</font><font color="#000000">Exception&nbsp;e</font><font color="#000000">){</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">e.printStackTrace</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#7f0055"><b>void&nbsp;</b></font><font color="#000000">readStreams</font><font color="#000000">()&nbsp;</font><font color="#7f0055"><b>throws&nbsp;</b></font><font color="#000000">Exception&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">InputStream&nbsp;stdout&nbsp;=&nbsp;MyProcess.getInputStream</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">InputStream&nbsp;stderr&nbsp;=&nbsp;MyProcess.getErrorStream</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>byte</b></font><font color="#000000">[]&nbsp;</font><font color="#000000">b;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">size;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">size&nbsp;=&nbsp;stdout.available</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>if</b></font><font color="#000000">(</font><font color="#000000">size&nbsp;!=&nbsp;</font><font color="#990000">0</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">b&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#7f0055"><b>byte</b></font><font color="#000000">[</font><font color="#000000">size</font><font color="#000000">]</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">stdout.read</font><font color="#000000">(</font><font color="#000000">b</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyProcessListener.updateStdOut</font><font color="#000000">(</font><font color="#000000">b</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>for</b></font><font color="#000000">(</font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">i&nbsp;=&nbsp;</font><font color="#990000">0</font><font color="#000000">;&nbsp;i&nbsp;&lt;&nbsp;b.length;&nbsp;i++</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">StdOut.add</font><font color="#000000">(</font><font color="#000000">b</font><font color="#000000">[</font><font color="#000000">i</font><font color="#000000">])</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">size&nbsp;=&nbsp;stderr.available</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>if</b></font><font color="#000000">(</font><font color="#000000">size&nbsp;!=&nbsp;</font><font color="#990000">0</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">b&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#7f0055"><b>byte</b></font><font color="#000000">[</font><font color="#000000">size</font><font color="#000000">]</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">stderr.read</font><font color="#000000">(</font><font color="#000000">b</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyProcessListener.updateStdErr</font><font color="#000000">(</font><font color="#000000">b</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>for</b></font><font color="#000000">(</font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">i&nbsp;=&nbsp;</font><font color="#990000">0</font><font color="#000000">;&nbsp;i&nbsp;&lt;&nbsp;b.length;&nbsp;i++</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">StdErr.add</font><font color="#000000">(</font><font color="#000000">b</font><font color="#000000">[</font><font color="#000000">i</font><font color="#000000">])</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">Process&nbsp;startProcess</font><font color="#000000">()&nbsp;</font><font color="#7f0055"><b>throws&nbsp;</b></font><font color="#000000">Exception&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Process&nbsp;proc&nbsp;=&nbsp;Runtime.getRuntime</font><font color="#000000">()</font><font color="#000000">.exec</font><font color="#000000">(</font><font color="#000000">Command</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>return&nbsp;</b></font><font color="#000000">proc;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#7f0055"><b>void&nbsp;</b></font><font color="#000000">notifyExit</font><font color="#000000">(</font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">exitCode</font><font color="#000000">)&nbsp;</font><font color="#7f0055"><b>throws&nbsp;</b></font><font color="#000000">Exception&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;me&nbsp;notifican&nbsp;que&nbsp;se&nbsp;el&nbsp;proceso&nbsp;se&nbsp;ha&nbsp;terminado</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">ExitCode&nbsp;=&nbsp;exitCode;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;leo&nbsp;por&nbsp;&uacute;ltima&nbsp;vez&nbsp;las&nbsp;salidas,&nbsp;por&nbsp;si&nbsp;se&nbsp;ha&nbsp;quedado&nbsp;algo</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>synchronized&nbsp;</b></font><font color="#000000">(</font><font color="#000000">Lock</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">readStreams</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;notifico&nbsp;al&nbsp;listener</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>byte</b></font><font color="#000000">[]&nbsp;</font><font color="#000000">stdOut&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#7f0055"><b>byte</b></font><font color="#000000">[</font><font color="#000000">StdOut.size</font><font color="#000000">()]</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>for</b></font><font color="#000000">(</font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">i&nbsp;=&nbsp;</font><font color="#990000">0</font><font color="#000000">;&nbsp;i&nbsp;&lt;&nbsp;stdOut.length;&nbsp;i++</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">stdOut</font><font color="#000000">[</font><font color="#000000">i</font><font color="#000000">]&nbsp;</font><font color="#000000">=&nbsp;</font><font color="#000000">((</font><font color="#000000">Byte</font><font color="#000000">)</font><font color="#000000">StdOut.get</font><font color="#000000">(</font><font color="#000000">i</font><font color="#000000">))</font><font color="#000000">.byteValue</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>byte</b></font><font color="#000000">[]&nbsp;</font><font color="#000000">stdErr&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#7f0055"><b>byte</b></font><font color="#000000">[</font><font color="#000000">StdErr.size</font><font color="#000000">()]</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>for</b></font><font color="#000000">(</font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">i&nbsp;=&nbsp;</font><font color="#990000">0</font><font color="#000000">;&nbsp;i&nbsp;&lt;&nbsp;stdErr.length;&nbsp;i++</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">stdErr</font><font color="#000000">[</font><font color="#000000">i</font><font color="#000000">]&nbsp;</font><font color="#000000">=&nbsp;</font><font color="#000000">((</font><font color="#000000">Byte</font><font color="#000000">)</font><font color="#000000">StdErr.get</font><font color="#000000">(</font><font color="#000000">i</font><font color="#000000">))</font><font color="#000000">.byteValue</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyProcessListener.processFinish</font><font color="#000000">(</font><font color="#000000">exitCode,&nbsp;stdOut,&nbsp;stdErr</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#000000">}</font></code></p>
</td>
<p>  <!-- end source code --><br />
   </tr>
</table>
</div>
<p>Esta clase se encargará de <strong>leer periodicamente los flujos de salida del proceso</strong> e ir tanto guardándolo en memoria como pasándolo al Listener en tiempo real. Pero claro, aquí nos encontramos con otra dificultad y es que resulta que queremos saber a ciencia cierta y en el momento exacto cuando termina nuestro proceso, para ello definimos un controlador de proceso (ProcessController):</p>
<div align="left" class="java">
<table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
<tr>
  <!-- start source code --></p>
<td nowrap="nowrap" valign="top" align="left">
    <code><br />
<font color="#7f0055"><b>public&nbsp;class&nbsp;</b></font><font color="#000000">ProcessController&nbsp;</font><font color="#7f0055"><b>implements&nbsp;</b></font><font color="#000000">Runnable&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">Process&nbsp;MyProcess;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">Thread&nbsp;MyThread;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">ProcessLauncher&nbsp;MyProcessLauncher;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#000000">ProcessController</font><font color="#000000">(</font><font color="#000000">Process&nbsp;proc,&nbsp;ProcessLauncher&nbsp;pl</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyProcess&nbsp;=&nbsp;proc;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyProcessLauncher&nbsp;=&nbsp;pl;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyThread&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">Thread</font><font color="#000000">(</font><font color="#7f0055"><b>this</b></font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyThread.start</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#7f0055"><b>void&nbsp;</b></font><font color="#000000">run</font><font color="#000000">()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>try&nbsp;</b></font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">code&nbsp;=&nbsp;MyProcess.waitFor</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;notificar&nbsp;al&nbsp;padre</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyProcessLauncher.notifyExit</font><font color="#000000">(</font><font color="#000000">code</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><font color="#7f0055"><b>catch</b></font><font color="#000000">(</font><font color="#000000">Exception&nbsp;e</font><font color="#000000">){</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">e.printStackTrace</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#000000">}</font></code></p>
</td>
<p>  <!-- end source code --><br />
   </tr>
</table>
</div>
<p>El objeto de esta clase se ejecutará en un hilo aparte que se quedará <strong>bloqueado hasta que el proceso termine</strong>. En cuanto termina el proceso el código de salida es comunicado a ProcessLauncher para que este pueda tomar las acciones oportunas. Para la próxima vez pondré ejemplos de utilización y si me da tiempo prepararé un <strong>JAR</strong> para que se pueda bajar y usar tranquilamente como si fuera una librería.</p>
]]></content:encoded>
			<wfw:commentRss>http://xand.es/ejecutar-comandos-linux-desde-java-ii_20090817/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
