<?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>mjcarrascosa.com</title>
	<atom:link href="http://mjcarrascosa.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://mjcarrascosa.com</link>
	<description>Desarrollo web y otras hierbas</description>
	<lastBuildDate>Fri, 08 Jul 2011 07:41:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Descargar fotos de facebook y de otras redes sociales</title>
		<link>http://mjcarrascosa.com/descargar-fotos-de-facebook-y-de-otras-redes-sociales/</link>
		<comments>http://mjcarrascosa.com/descargar-fotos-de-facebook-y-de-otras-redes-sociales/#comments</comments>
		<pubDate>Thu, 30 Jun 2011 11:13:51 +0000</pubDate>
		<dc:creator>Manuel Jesús Carrascosa de la Blanca</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Facebook]]></category>

		<guid isPermaLink="false">http://mjcarrascosa.com/?p=756</guid>
		<description><![CDATA[Las redes sociales, como facebook o tuenti, cada vez lo ponen más difícil para que podamos descargarnos las fotografías que suben sus usuarios.  Sin embargo hay una forma bien sencilla para poder descargar las fotos: 1-. Ve a la página donde está la imagen. 2-. Pega lo siguiente en la barra de direcciones: javascript: for [...]]]></description>
			<content:encoded><![CDATA[<p>Las redes sociales, como facebook o tuenti, cada vez lo ponen más difícil para que podamos descargarnos las fotografías que suben sus usuarios.  Sin embargo hay una forma bien sencilla para poder descargar las fotos:</p>
<p>1-. Ve a la página donde está la imagen.<br />
2-. Pega lo siguiente en la barra de direcciones:</p>
<pre class="brush:javascript">javascript: for ( i=0; i&lt;document.styleSheets.length; i++) void(document.styleSheets.item(i).disabled=true);</pre>
<p>3-. Ya puedes descargar la imagen normalmente.</p>
<p>Con esto lo que hacemos es eliminar las hojas de estilo, lo que nos facilita la descarga de las imágenes.</p>
]]></content:encoded>
			<wfw:commentRss>http://mjcarrascosa.com/descargar-fotos-de-facebook-y-de-otras-redes-sociales/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MongoDB: Un paradigma alternativo para bases de datos</title>
		<link>http://mjcarrascosa.com/mongodb-un-paradigma-alternativo-para-bases-de-datos/</link>
		<comments>http://mjcarrascosa.com/mongodb-un-paradigma-alternativo-para-bases-de-datos/#comments</comments>
		<pubDate>Thu, 02 Jun 2011 23:51:16 +0000</pubDate>
		<dc:creator>Manuel Jesús Carrascosa de la Blanca</dc:creator>
				<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[MongoDB]]></category>

		<guid isPermaLink="false">http://mjcarrascosa.com/?p=741</guid>
		<description><![CDATA[MongoDB es una de las llamadas bases de datos NoSQL, aunque sería más exacto decir que es una base de datos no relacional, o según la definición que hacen en su web: &#8220;Una BD documental sin esquema, escalable y de alto rendimiento&#8221;. En MongoDB nos podemos ir olvidando de las tablas, tenemos algo parecido denominado [...]]]></description>
			<content:encoded><![CDATA[<p><a title="MongoDB" href="http://www.mongodb.org/">MongoDB</a> es una de las llamadas bases de datos <em>NoSQL</em>, aunque sería más exacto decir que es una base de datos no relacional, o según la definición que hacen en su web: &#8220;Una BD documental sin esquema, escalable y de alto rendimiento&#8221;. En <em>MongoDB</em> nos podemos ir olvidando de las tablas, tenemos algo parecido denominado colecciones, y de los registros, en las colecciones lo que se almacenan son documentos, y también nos tenemos que olvidar del lenguaje <em>SQL</em>. Otra particularidad es la forma en que almacena los documentos. <em>MongoDB</em> los guarda en formato BJSON (<em>Binary JSON</em>), aunque nosotros los veremos y los trataremos en formato <em>JSON</em>.</p>
<p>En la <a title="Documentación de MongoDB" href="http://www.mongodb.org/display/DOCS/Home">documentación de <em>MongoDB</em></a> aparece <a title="MongoDB quickstart" href="http://www.mongodb.org/display/DOCS/Quickstart">como instalarla para varios sistemas operativos</a>. Yo personalmente he decidido bajarme un archivo <em>zip</em> y descomprimirlo, luego me he creado un <em>script</em> para lanzar el servidor con un archivo de configuración, donde le indico en que ruta están las bases de datos.</p>
<p>Ahora toca arrancar el servidor. Yo he hecho uso del <em>script</em> pero si no se ejecutaría el programa<em> mongod</em>. Nos aparece la siguiente ventana:</p>
<div id="attachment_742" class="wp-caption aligncenter" style="width: 595px"><a href="http://mjcarrascosa.com/wp-content/uploads/2011/06/cp.png"><img class="size-full wp-image-742" title="Arrancando MongoDB" src="http://mjcarrascosa.com/wp-content/uploads/2011/06/cp.png" alt="Captura de pantalla del arranque de MongoDB" width="585" height="446" /></a><p class="wp-caption-text">MongoDB</p></div>
<p>Ahora toca conectarnos al servidor. Para ello ejecutamos el programa <em>mongo</em>. Por defecto se nos conecta a la base de datos test, pero podemos indicar a que base de datos conectarnos al iniciar o posteriormente desde la consola:</p>
<p><a href="http://mjcarrascosa.com/wp-content/uploads/2011/06/cp1.png"><img class="aligncenter size-full wp-image-744" title="Cliente de MongoDB" src="http://mjcarrascosa.com/wp-content/uploads/2011/06/cp1.png" alt="Captura de pantalla del cliente de MongoDB" width="585" height="446" /></a>Desde esta consola podemos ejecutar una serie de comandos para trabajar con las bases de datos y con las colecciones. Por ejemplo vamos a crear una base de datos llamada biblioteca, vamos a crear una colección llamada libros y vamos a insertar el primer libro:</p>
<p><a href="http://mjcarrascosa.com/wp-content/uploads/2011/06/cp2.png"><img class="aligncenter size-full wp-image-746" title="Primera prueba con MongoDB" src="http://mjcarrascosa.com/wp-content/uploads/2011/06/cp2.png" alt="" width="585" height="446" /></a>Parece un tanto extraño. No vemos que haya instrucciones para crear la base de datos o la colección, tampoco hemos definido la estructura de esta última. ¿Qué es lo que está pasando? Con el comando use le indicamos a <em>MongoDB</em> que vamos a usar una base de datos, y si esta no existe la crea. Luego mediante <em>db.nombreDeColección</em> podemos acceder a una colección. Esta se crea automáticamente cuando insertamos el primer documento.</p>
<p>¿Y dónde definimos la estructra del documento en la colección? En ningún sitio, los documentos en una colección pueden tener cualquier estructura, no hay una prefijada como ocurre con las tablas en los gestores relacionales.</p>
<p>Después hemos llamado al método <em>find</em>, que nos permite realizar consultas sobre una colección. En este caso nos devuelve todos los documentos, puesto que no le hemos indicado ningún parámetro, que en la colección que tenemos es solo uno. Podemos ver que además de los campos que hemos definido al insertar el documento, hay también uno llamado <em>_id</em>. Este es el identificador del documento, que es único y autogenerado por <em>MongoDB</em>.</p>
<p>Con esto se termina esta breve introducción a <em>MongoDB</em>, que tiene como objetivo dar una visión general de este gestor de bases de datos. Si queremos profundizar más es recomendable leer la propia documentación de <em>MongoDB</em>, donde podemos ver conceptos más avanzados como por ejemplo <em>clustering</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mjcarrascosa.com/mongodb-un-paradigma-alternativo-para-bases-de-datos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Autofocus en campos de formulario</title>
		<link>http://mjcarrascosa.com/autofocus-en-campos-de-formulario/</link>
		<comments>http://mjcarrascosa.com/autofocus-en-campos-de-formulario/#comments</comments>
		<pubDate>Mon, 23 May 2011 11:12:24 +0000</pubDate>
		<dc:creator>Manuel Jesús Carrascosa de la Blanca</dc:creator>
				<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[autofocus]]></category>

		<guid isPermaLink="false">http://mjcarrascosa.com/?p=732</guid>
		<description><![CDATA[Las webs pueden usar JavaScript para situar el foco en un campo concreto de un formulario, normalmente el primero, como por ejemplo hace Google. Para facilitar esto, HTML 5 introduce una nueva propiedad en los campos de formulario, la propiedad autofocus, que nos permite hacer que un campo de formulario tenga el foco por defecto. [...]]]></description>
			<content:encoded><![CDATA[<p>Las webs pueden usar JavaScript para situar el foco en un campo concreto de un formulario, normalmente el primero, como por ejemplo hace Google. Para facilitar esto, HTML 5 introduce una nueva propiedad en los campos de formulario, la propiedad autofocus, que nos permite hacer que un campo de formulario tenga el foco por defecto.</p>
<p>Veamos como se usa esta propiedad:</p>
<pre class="brush:html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
 &lt;title&gt;Autofocus&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
 &lt;form&gt;
 &lt;input type="text" name="buscar" id="buscar" autofocus/&gt; &lt;input type="submit" value="buscar"/&gt;
 &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Sencilla de usar, pero ¿qué pasa si el navegador no soporta esta propiedad? Podemos hacer uso de JavaScript para ello:</p>
<pre class="brush:html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
 &lt;title&gt;Autofocus&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
 &lt;form&gt;
 &lt;input type="text" name="buscar" id="buscar" autofocus/&gt; &lt;input type="submit" value="buscar"/&gt;
 &lt;script&gt;
 if( ! ("autofocus" in document.createElement( "input" ) ) )
 {
 document.getElementById( "buscar" ).focus();
 }
 &lt;/script&gt;
 &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Comprobamos si el elemento input soporta la propiedad &#8220;autofocus&#8221; y si no la soporta se asignamos el foco al elemento mediante JavaScript.</p>
<p>Si usamos jQuery como framework JavaScript podemos hacer:</p>
<pre class="brush:html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
 &lt;title&gt;Autofocus&lt;/title&gt;
 &lt;script src="jquery.min.js"&gt;&lt;/script&gt;
 &lt;script&gt;
 $(document).ready(function() {
 if( ! ("autofocus" in document.createElement( "input" ) ) )
 {
 $( "#buscar" ).focus();
 }
 });
 &lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
 &lt;form&gt;
 &lt;input type="text" name="buscar" id="buscar" autofocus/&gt; &lt;input type="submit" value="buscar"/&gt;
 &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Como podemos es muy fácil implementar esta funcionalidad, tanto si el navegador soporta esta propiedad como si no. Como suele ser habitual esta funcionalidad no es una panacea que haya que implementar en todos los proyectos, dependerá de las características del mismo y tendremos que saber cuando es conveniente y cuando no utilizarla.</p>
]]></content:encoded>
			<wfw:commentRss>http://mjcarrascosa.com/autofocus-en-campos-de-formulario/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Filtrando datos con filter_input</title>
		<link>http://mjcarrascosa.com/filtrando-datos-con-filter_input/</link>
		<comments>http://mjcarrascosa.com/filtrando-datos-con-filter_input/#comments</comments>
		<pubDate>Mon, 16 May 2011 23:21:39 +0000</pubDate>
		<dc:creator>Manuel Jesús Carrascosa de la Blanca</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Filtros]]></category>
		<category><![CDATA[XSS]]></category>

		<guid isPermaLink="false">http://mjcarrascosa.com/?p=723</guid>
		<description><![CDATA[Algo que hay que tener en cuenta a la hora de desarrollar cualquier tipo de software, tanto web como de otro tipo, es que los datos que introduce el usuario no tienen porque ser los correctos, y en algunos casos pueden llegar a ser incluso maliciosos. Veamos un pequeño ejemplo: Supongamos que tenemos el siguiente [...]]]></description>
			<content:encoded><![CDATA[<p>Algo que hay que tener en cuenta a la hora de desarrollar cualquier tipo de software, tanto web como de otro tipo, es que los datos que introduce el usuario no tienen porque ser los correctos, y en algunos casos pueden llegar a ser incluso maliciosos. Veamos un pequeño ejemplo:</p>
<p>Supongamos que tenemos el siguiente formulario:</p>
<p>formulario.php</p>
<pre class="brush:php">&lt;html&gt;
&lt;head&gt;
  &lt;title&gt;Formulario&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;form method="post" action="mensaje.php"&gt;
   &lt;label for="mensaje"&gt;Mensaje:&lt;/label&gt;
   &lt;input type="text" name="mensaje" id="mensaje"/&gt;
   &lt;input type="submit" value="Enviar mensaje"/&gt;
  &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Al pulsar el botón de enviar este nos lleva al siguiente script:</p>
<p>mensaje.php</p>
<pre class="brush:php">&lt;?php
  $mensaje = $_POST['mensaje'];
?&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;title&gt;Ver mensaje&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;El mensaje es:&lt;/p&gt;
&lt;p&gt;&lt;?php echo $mensaje;?&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Si no tenemos cuidado puede ocurrir que un atacante malintencionado insertara como mensaje algo como:</p>
<pre class="brush:html">&lt;script src="script-dañino.js"&gt;&lt;/script&gt;</pre>
<p>Con lo que el código de ese script-dañino.js se ejecutaría, lo que podría hacer que cambiara el contenido de la página, que instalará algún tipo de malware, etc.</p>
<p>Podemos evitar esto con una función, que está presente desde PHP 5.2.0, que nos permite filtrar los datos que recibe el servidor por parte del navegador, la función <em>filter_input</em>. Veamos como quedaría el archivo mensaje.php una vez corregido:</p>
<p>mensaje.php</p>
<pre class="brush:php">&lt;?php
  $mensaje = filter_input(INPUT_POST, 'mensaje', FILTER_SANITIZE_SPECIAL_CHARS);
?&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;title&gt;Ver mensaje&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;El mensaje es:&lt;/p&gt;
&lt;p&gt;&lt;?php echo $mensaje;?&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Y de esta sencilla forma hemos conseguido filtrar la variable mensaje. Este método no nos serviría si esperamos que la entrada venga en formato HTML, por ejemplo, pero si nos puede venir bien para otros tipos de datos.</p>
<p>Para ver una descripción completa de esta función es recomendable <a title="Documentación de filter_input" href="http://es2.php.net/manual/es/function.filter-input.php">ver su documentación</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mjcarrascosa.com/filtrando-datos-con-filter_input/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Midiendo el tiempo que tarda en ejecutarse una porción de código en PHP</title>
		<link>http://mjcarrascosa.com/midiendo-el-tiempo-que-tarda-en-ejecutarse-una-porcion-de-codigo-en-php/</link>
		<comments>http://mjcarrascosa.com/midiendo-el-tiempo-que-tarda-en-ejecutarse-una-porcion-de-codigo-en-php/#comments</comments>
		<pubDate>Thu, 05 May 2011 10:26:33 +0000</pubDate>
		<dc:creator>Manuel Jesús Carrascosa de la Blanca</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[microtime]]></category>

		<guid isPermaLink="false">http://mjcarrascosa.com/?p=698</guid>
		<description><![CDATA[Algunas veces nos puede resultar útil saber cuanto tiempo tarda en ejecutarse una porción de código en PHP, por ejemplo para realizar pruebas de rendimiento. Para ello podemos usar la función de PHP microtime, que nos devuelve la fecha con microsegundos, de la siguiente manera: $time_start = microtime(true); /* Porción de código que queremos ejecutar [...]]]></description>
			<content:encoded><![CDATA[<p>Algunas veces nos puede resultar útil saber cuanto tiempo tarda en ejecutarse una porción de código en PHP, por ejemplo para realizar pruebas de rendimiento. Para ello podemos usar la función de PHP microtime, que nos devuelve la fecha con microsegundos, de la siguiente manera:</p>
<pre class="brush:php">$time_start = microtime(true);

/* Porción de código que queremos ejecutar */

$time_end = microtime(true);
$time_total = $time_end - $time_start;

echo "El código se ha ejecutado en $time_total segundos";
</pre>
<p>A partir de PHP 5.0.0 la función microtime admite un parámetro booleano, que puede ser verdadero o falso, para indicar que el resultado se devuelva como un  número real, en lugar de como una cadena, que era como se retornaba en versiones anteriores.</p>
<p>Si estamos usando una versión anterior a la 5.0.0 podemos hacerlo de la siguiente forma:</p>
<pre class="brush:php">function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}
$time_start = microtime_float();

/* Porción de código que queremos ejecutar */

$time_end = microtime_float();
$time_total = $time_end - $time_start;

echo "El código se ha ejecutado en $time_total segundos";</pre>
]]></content:encoded>
			<wfw:commentRss>http://mjcarrascosa.com/midiendo-el-tiempo-que-tarda-en-ejecutarse-una-porcion-de-codigo-en-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

