<?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/"
	>

<channel>
	<title>Blog Xplorastudios - Diseño, Programación y mucho más...</title>
	<atom:link href="http://blog.xplorastudios.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.xplorastudios.com</link>
	<description>Artículos y tutoriales sobre PHP, Javascript, Jquery, Bases de datos, Linux, Diseño y Usabilidad.&#60;br&#62;Por Rubén Moraleda Ruano.</description>
	<pubDate>Fri, 29 Jan 2010 15:51:37 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Consultas comunes en MySQL y funciones útiles</title>
		<link>http://blog.xplorastudios.com/leer/327/consultas-comunes-en-mysql-y-funciones-utiles</link>
		<comments>http://blog.xplorastudios.com/leer/327/consultas-comunes-en-mysql-y-funciones-utiles#comments</comments>
		<pubDate>Fri, 22 Jan 2010 21:30:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Bases de datos]]></category>

		<category><![CDATA[consultas]]></category>

		<category><![CDATA[funciones]]></category>

		<category><![CDATA[levenshtein]]></category>

		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://blog.xplorastudios.com/?p=327</guid>
		<description><![CDATA[Casi por casualidad, buscando alguna forma de implementar el algoritmo de comparación de cadenas de levenshtein me he encontrado ésta web que no sólo me ha solucionado el problema sino que me ha parecido de lo más interesante.
Artfulsoftware: Common MySQL Queries / Extending Chapter 9 of Get it Done with MySQL 5&#038;6 (En inglés)
Recordad que [...]]]></description>
			<content:encoded><![CDATA[<p>Casi por casualidad, buscando alguna forma de implementar el algoritmo de comparación de cadenas de <strong>levenshtein</strong> me he encontrado ésta web que no sólo me ha solucionado el problema sino que me ha parecido de lo más interesante.</p>
<p><a href="http://www.artfulsoftware.com/infotree/queries.php?&#038;bw=1595#552" target='_blank'><strong>Artfulsoftware: Common MySQL Queries</strong> / Extending Chapter 9 of Get it Done with MySQL 5&#038;6 <small>(En inglés)</small></a></p>
<p>Recordad que para definir funciones a través de la consola de MySQL debemos primero cambiar el delimitador por defecto, definir la función, procedure, trigger o lo que corresponda, y volver a restablecer el delimitador por defecto:</p>
<p><code>DELIMITER $$<br />
(AQUÍ VA LA DEFINICIÓN DE LA FUNCIÓN, PROCEDURE O TRIGGER)<br />
$$<br />
DELIMITER ;</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xplorastudios.com/leer/327/consultas-comunes-en-mysql-y-funciones-utiles/feed</wfw:commentRss>
		</item>
		<item>
		<title>Bloques de IPs por continentes y paises</title>
		<link>http://blog.xplorastudios.com/leer/324/bloques-de-ips-por-continentes-y-paises</link>
		<comments>http://blog.xplorastudios.com/leer/324/bloques-de-ips-por-continentes-y-paises#comments</comments>
		<pubDate>Wed, 11 Nov 2009 20:21:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Seguridad]]></category>

		<category><![CDATA[bloques de ips]]></category>

		<category><![CDATA[ip blocks]]></category>

		<category><![CDATA[paises]]></category>

		<guid isPermaLink="false">http://blog.xplorastudios.com/?p=324</guid>
		<description><![CDATA[Listado de rangos de ips por país. Muy útiles para hacer baneos de paises completos:
http://www.countryipblocks.net/continents/
También hay .htaccess listos para descargar.
]]></description>
			<content:encoded><![CDATA[<p>Listado de rangos de ips por país. Muy útiles para hacer baneos de paises completos:</p>
<p><a href="http://www.countryipblocks.net/continents/">http://www.countryipblocks.net/continents/</a></p>
<p>También hay .htaccess listos para descargar.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xplorastudios.com/leer/324/bloques-de-ips-por-continentes-y-paises/feed</wfw:commentRss>
		</item>
		<item>
		<title>¿Puerto 25 bloqueado?: Usa otro y redirecciónalo fácilmente con IPTABLES</title>
		<link>http://blog.xplorastudios.com/leer/322/como-redireccionar-puertos-con-iptables</link>
		<comments>http://blog.xplorastudios.com/leer/322/como-redireccionar-puertos-con-iptables#comments</comments>
		<pubDate>Sat, 14 Mar 2009 17:52:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Seguridad]]></category>

		<category><![CDATA[Servidores]]></category>

		<category><![CDATA[Shell]]></category>

		<category><![CDATA[Unix]]></category>

		<category><![CDATA[iptables]]></category>

		<category><![CDATA[redireccion]]></category>

		<category><![CDATA[redirect]]></category>

		<guid isPermaLink="false">http://blog.xplorastudios.com/?p=322</guid>
		<description><![CDATA[Mi ISP tuvo hace meses la feliz idea de bloquearnos el puerto 25 por &#8220;motivos de seguridad&#8221; y para evitar el spam, debido a ésto, ya no puedo enviar correos por SMTP (recordemos que por defecto el smtp se configura el puerto 25).
La solución es muy sencilla si tenemos IPTABLES, mediante 2 comandos vamos a [...]]]></description>
			<content:encoded><![CDATA[<p>Mi ISP tuvo hace meses la feliz idea de bloquearnos el puerto 25 por &#8220;motivos de seguridad&#8221; y para evitar el spam, debido a ésto, ya no puedo enviar correos por SMTP (recordemos que por defecto el smtp se configura el puerto 25).</p>
<p>La solución es muy sencilla si tenemos IPTABLES, mediante 2 comandos vamos a configurar nuestro servidor para que permita acceder al SMTP a través del puerto 2525 y 25 de forma simultánea, como siempre, hemos usado Centos 5 para el ejemplo:</p>
<p><strong>1.</strong> Redireccionamos todo el tráfico entrante del puerto 2525 al puerto 25.<br />
<code>iptables -t nat -A PREROUTING -p tcp --dport 2525 -i eth0 -j REDIRECT --to-ports 25</code></p>
<p><strong>2(a).</strong> Almacenamos las reglas de iptables para hacerlas persistentes.<br />
<code>iptables-save > /etc/sysconfig/iptables</code></p>
<p><strong>2(b).</strong> ¿Usas debian?: Revisa la siguiente url para saber cómo guardar las reglas de iptables<br />
<a href="http://www.debian-administration.org/articles/445" target='_blank'>Getting IPTables to survive a reboot</a></p>
<p>Una vez hecho ésto, nuestro servidor ya está listo para recibir conexiones SMTP en el puerto 2525, tan sólo debemos modificar la configuración de nuestro cliente de correo para que use éste puerto en lugar del puerto por defecto (25).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xplorastudios.com/leer/322/como-redireccionar-puertos-con-iptables/feed</wfw:commentRss>
		</item>
		<item>
		<title>Altura automática de un iframe en función de su contenido.</title>
		<link>http://blog.xplorastudios.com/leer/301/altura-automatica-de-un-iframe-en-funcion-de-su-contenido</link>
		<comments>http://blog.xplorastudios.com/leer/301/altura-automatica-de-un-iframe-en-funcion-de-su-contenido#comments</comments>
		<pubDate>Wed, 25 Feb 2009 18:25:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Javascript]]></category>

		<category><![CDATA[Jquery]]></category>

		<category><![CDATA[Programación]]></category>

		<category><![CDATA[altura]]></category>

		<category><![CDATA[automatic]]></category>

		<category><![CDATA[automática]]></category>

		<category><![CDATA[height]]></category>

		<category><![CDATA[iframe]]></category>

		<guid isPermaLink="false">http://blog.xplorastudios.com/?p=301</guid>
		<description><![CDATA[Ya van varias veces que necesito que un iframe se escale automáticamente a la altura de la página que contiene, sobre todo en interfaces de administración. Cuando surgen estas dudas lo mejor es &#8220;googlear&#8221; en busca de respuestas, pero en éste caso, las primeras 10 páginas que he revisado contienen información errónea, que da errores [...]]]></description>
			<content:encoded><![CDATA[<p>Ya van varias veces que necesito que un iframe se escale automáticamente a la altura de la página que contiene, sobre todo en interfaces de administración. Cuando surgen estas dudas lo mejor es &#8220;googlear&#8221; en busca de respuestas, pero en éste caso, las primeras 10 páginas que he revisado contienen información errónea, que da errores en uno o varios navegadores.</p>
<p>Despues de varios intentos he dado con un código que funciona tanto en IE, como en Firefox como en Opera y/o Safari. (Requiere Jquery)<br />
<span id="more-301"></span><br />
<textarea cols="50" rows="25"><iframe id='myiframe' src='http://www.midominio.com/contenido.html' style="width:100%;"></iframe><br />
<script type="text/javascript"> 
$(function() {
	var myiframe = $("#myiframe");
	myiframe.hide().load(function() {
		if (myiframe.get(0).contentDocument) {
			iframebody=$(myiframe.get(0).contentDocument.body);
		} else {
			iframebody=$(myiframe.get(0).contentWindow.document.body);
		}
		myiframe.show().height(iframebody.height()+35);
	});
});
</script></textarea></p>
<p>En caso de que queramos hacerlo de forma automática según su contenido podemos realizar unos pequeños cambios y crear un timeout que redimensione el iframe cada X segundos. (Ojo, personalmente no recomiendo utilizar timeouts recurrentes en entornos de producción, pero funcionar, funciona.)</p>
<p><textarea cols="50" rows="35"><iframe id='myiframe' src='http://www.midominio.com/contenido.html' style="width:100%;"></iframe><br />
<script type="text/javascript">
function redimensionaIframe(myiframe) {
	if (myiframe.get(0).contentDocument) {
		iframebody=$(myiframe.get(0).contentDocument.body);
	} else {
		iframebody=$(myiframe.get(0).contentWindow.document.body);
	}
	myiframe.show().height(iframebody.height()+35);
	setTimeout(function() {
		redimensionaIframe(myiframe);
	},1000);
}
$(function() {
	var myiframe=$("#preview");
	myiframe.hide().load(function() {
		redimensionaIframe(myiframe);
	});
});
</script></textarea></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xplorastudios.com/leer/301/altura-automatica-de-un-iframe-en-funcion-de-su-contenido/feed</wfw:commentRss>
		</item>
		<item>
		<title>Cálculo de proporcionalidad de una imagen (aspect ratio).</title>
		<link>http://blog.xplorastudios.com/leer/279/calculo-de-proporcionalidad-de-una-imagen-o-aspect-ratio</link>
		<comments>http://blog.xplorastudios.com/leer/279/calculo-de-proporcionalidad-de-una-imagen-o-aspect-ratio#comments</comments>
		<pubDate>Mon, 23 Feb 2009 00:10:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[aspect ratio]]></category>

		<category><![CDATA[euclides]]></category>

		<category><![CDATA[maximo comun divisor]]></category>

		<category><![CDATA[proporcion]]></category>

		<guid isPermaLink="false">http://blog.xplorastudios.com/?p=279</guid>
		<description><![CDATA[Hace tiempo me encontré en la necesidad de calcular el índice de proporcionalidad de imágenes que eran subidas por los usuarios a través de un formulario web. A continuación explicaré en qué consiste éste índice, qué algoritmo debe aplicarse y cómo realizarlo en php. Pido clemencia en caso de cometer algun error garrafal, no soy [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-283" style="margin: 10px;" title="aspect_ratio" src="http://blog.xplorastudios.com/wp-content/uploads/aspect_ratio.gif" alt="aspect_ratio" width="181" height="355" />Hace tiempo me encontré en la necesidad de calcular el índice de proporcionalidad de imágenes que eran subidas por los usuarios a través de un formulario web. A continuación explicaré en qué consiste éste índice, qué algoritmo debe aplicarse y cómo realizarlo en php. Pido clemencia en caso de cometer algun error garrafal, no soy matemático <img src='http://blog.xplorastudios.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<h3>1. Introducción</h3>
<p>El índice de proporcionalidad (traducción no literal del inglés &#8220;<a href="http://en.wikipedia.org/wiki/Aspect_ratio" target="_blank">aspect ratio</a>&#8220;),  es el resultado de la división entre el ancho y el alto de una imagen, y nos indica la relación que hay entre ambas dimensiones.<br />
<span id="more-279"></span></p>
<h4 style='clear:left'>1.1 Ejemplos:</h4>
<p><small>Las unidades no son relevantes por tanto no se incluyen.</small></p>
<ul>
<li><strong>Imagen 1</strong> (100 ud. de ancho por 100 ud. de alto):<br />
indice = 100 / 100 = <strong>1</strong></li>
<li><strong>Imagen 2</strong> (200 ud. de ancho por 100 ud. de alto):<br />
indice = 400 / 300 = <strong>1,3333333333 &#8230;.</strong></li>
<li><strong>Imagen 3</strong> (1024 ud. de ancho por 576 ud. de alto):<br />
indice = 1024 / 576 = <strong>1,7777777777777 &#8230;..</strong></li>
</ul>
<p>De ésta forma, el ancho de la imagen multiplicado por éste índice nos proporcionará su altura.</p>
<p>Si bien es válido mostrar éste índice como un número decimal, matemáticamente <strong>la forma correcta de expresarlo es mediante x:y</strong> (ésta forma de notación también se utiliza para <a href="http://es.wikipedia.org/wiki/Escala_(cartograf%C3%ADa)" target="_blank">escalas cartográficas</a>). Por tanto, en nuestros ejemplos anteriores, el índice podría expresarse como 100:100, 400:300 y 1024:576 respectivamente.</p>
<p>El problema, es que dichos índices no nos darían una idea clara de la proporcionalidad de la imagen al ser cantidades muy elevadas, pero, en los dos primeros ejemplos, podemos ver claramente que sería muy fácil simplificar el índice dividiendo ambas cantidades por 100, por lo que ambos quedarían como 1:1 y 4:3, y, cuya división, produce exáctamente el mismo resultado (1 en el primer caso, y 1,333&#8230;.. en el segundo).</p>
<p>¿Qué sucede con el tercer caso?, al ser dimensiones mayores y no tan representativas nos sería muy dificil simplificarlo sin realizar cálculos adicionales, una opción obvia, sería al ver que ambas cifras son pares, dividir ambas entre 2 sucesivamente hasta que ya no sean divisibles por 2  (6 veces), el resultado sería entonces 16:9 (16/9 da como resultado exáctamente lo mismo que 1024/576: 1,7777777777&#8230;..)</p>
<p>Bien, ya hemos calculado el índice de las 3 imágenes, básicamente, lo que hemos hecho &#8220;de forma artesanal&#8221; es descubrir el número por el que podemos dividir ambas dimensiones sin alterar su proporción, es decir, calcular el máximo común divisor: el número entero más grande por el que pueden dividirse ambas cantidades. (En nuestros casos anteriores, el máximo común divisor ha sido 100 para la primera imagen, 100 para la segunda, y 128 en la tercera (128 es 2 elevado a 7 = 2&#215;2 6 veces).</p>
<p>Todo ésto está muy bien, pero ¿cómo podemos obtener fácilmente el máximo común divisor de 2 números para crear nuestra propia función que realize el cálculo?.</p>
<h3><a href="http://es.wikipedia.org/wiki/Algoritmo_de_Euclides" target="_blank">2. Algoritmo de Euclides</a></h3>
<blockquote><p>Definición en la wikipedia: El <strong>algoritmo de Euclides</strong> es un método antiguo y eficaz para calcular el <a title="Máximo común divisor" href="http://es.wikipedia.org/wiki/M%C3%A1ximo_com%C3%BAn_divisor">máximo común divisor</a> (<strong>MCD</strong>). Fue originalmente descrito por <a title="Euclides" href="http://es.wikipedia.org/wiki/Euclides">Euclides</a> en su obra <em><a title="Elementos de Euclides" href="http://es.wikipedia.org/wiki/Elementos_de_Euclides">Elementos</a></em>. El <strong>algoritmo de Euclides extendido</strong> es una ligera modificación que permite además expresar al máximo común divisor como una <a title="Combinación lineal" href="http://es.wikipedia.org/wiki/Combinaci%C3%B3n_lineal">combinación lineal</a>. Este algoritmo tiene aplicaciones en diversas áreas como <a title="Álgebra" href="http://es.wikipedia.org/wiki/%C3%81lgebra">álgebra</a>, <a title="Teoría de números" href="http://es.wikipedia.org/wiki/Teor%C3%ADa_de_n%C3%BAmeros">teoría de números</a> y <a title="Ciencias de la computación" href="http://es.wikipedia.org/wiki/Ciencias_de_la_computaci%C3%B3n">ciencias de la computación</a> entre otras. Con unas ligeras modificaciones suele ser utilizado en computadoras electrónicas debido a su gran eficiencia.</p></blockquote>
<p>Algoritmo de Euclides tradicional implementado de manera recurrente (recursiva):</p>
<p><code>Función mcd(a,b):<br />
Si b=0 entonces:<br />
El resultado es a<br />
En otro caso:<br />
El resultado es mcd(b,a mod b)</code></p>
<h3>3. Implementación del Algoritmo de Euclides en PHP:</h3>
<p><code>function calculaMcd($a,$b) {<br />
if ($b == 0) return $a;<br />
return calculaMcd($b, $a % $b);<br />
}</code></p>
<h3>4. Conclusión</h3>
<p>Mediante ésta función podemos calcular fácilmente el indice de proporcionalidad (aspect ratio) de una imagen:</p>
<p><code>$mcd = calculaMcd(1024,768);<br />
$proporcion = (1024/$mcd) . ":" . (768/$mcd); // 4:3</code></p>
<blockquote><p>Si no conoces las dimensiones de la imágen puedes obtenerlas fácilmente con la función <a href="http://es.php.net/manual/en/function.getimagesize.php" target='_blank'>getimagesize()</a> de php.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.xplorastudios.com/leer/279/calculo-de-proporcionalidad-de-una-imagen-o-aspect-ratio/feed</wfw:commentRss>
		</item>
		<item>
		<title>Evita los problemas de rendimiento modelando correctamente tu BBDD</title>
		<link>http://blog.xplorastudios.com/leer/275/evitar-problemas-de-rendimiento-en-la-bbdd</link>
		<comments>http://blog.xplorastudios.com/leer/275/evitar-problemas-de-rendimiento-en-la-bbdd#comments</comments>
		<pubDate>Wed, 11 Feb 2009 18:56:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Bases de datos]]></category>

		<category><![CDATA[Programación]]></category>

		<category><![CDATA[Servidores]]></category>

		<guid isPermaLink="false">http://blog.xplorastudios.com/?p=275</guid>
		<description><![CDATA[La creación y gestión de modelos de datos es una parte fundamental de un arquitecto/administrador de bbdd, el cual dispone de los conocimientos necesarios para desempeñar ésta tarea. Sin embargo, a pequeña escala ésta función suele estar desempeñada por los propios programadores, que en muchos casos tienden a restar importancia al modelado de datos y [...]]]></description>
			<content:encoded><![CDATA[<p>La creación y gestión de modelos de datos es una parte fundamental de un arquitecto/administrador de bbdd, el cual dispone de los conocimientos necesarios para desempeñar ésta tarea. Sin embargo, a pequeña escala ésta función suele estar desempeñada por los propios programadores, que en muchos casos tienden a restar importancia al modelado de datos y su tarea se reduce a crear algo que &#8220;funcione&#8221;.</p>
<p>Son muchos los casos en los que nos encontramos con aplicaciones y sistemas que se encuentran en producción con graves problemas de rendimiento debido a una mala planificación o mal diseño de su base de datos.</p>
<p><span id="more-275"></span>Cuando ésto sucede y nuestro/s servidor/es de bbdd se satura/n, generalmente el cliente pedirá explicaciones al especialista a cargo y éste probablemente le dará una de las siguientes respuestas en función del tipo que sea:</p>
<ol>
<li>La del <strong>administrador de servidores</strong>: <em>&#8220;Necesita un servidor nuevo con el doble de RAM y mejor procesador&#8221;</em>, <em>&#8220;Mysql no sirve para bases de datos grandes, deberia migrar todo a Oracle&#8221;</em>, <em>&#8220;Su aplicación está mal programada, hace demasiadas conexiones a la base de datos&#8221;</em>.</li>
<li>La del <strong>programador</strong>: <em>&#8220;Deberíamos modificar la aplicación para cachear todas las consultas posibles a la bbdd y reducir la carga de la base de datos&#8221;</em> o <em>&#8220;se necesita un servidor mejor, no tenemos infraestructura suficiente para que tantas personas accedan al sistema/web/aplicación de forma simultánea.&#8221;</em></li>
<li>La del <strong>administrador de bases de datos</strong>: <em>&#8220;Deberíamos realizar un estudio para analizar qué consultas estan produciendo el cuello de botella y ver si podemos optimizarlas&#8221;</em>, <em>&#8220;Podriamos instalar un servidor esclavo para las consultas más pesadas&#8221;</em>.</li>
</ol>
<p>Obviamente no hay una solución universal para éste problema, ya que dependerá de cada caso, de hecho, probablemente podrían conseguirse algunos resultados combinando todas las respuestas, pero de forma individual probablemente todas éstas acciones no serán efectivas y sólo conseguirán que el cliente malgaste su preciado dinero y nuestro preciado tiempo, además de que nuestra reputación acabará por los suelos.</p>
<blockquote><p>Un servidor de bases de datos saturado suele ser el producto de una mala planificación previa o incorrectas previsiones de crecimiento y de un mal diseño de su modelo de datos.</p></blockquote>
<p>La reestructuración y rediseño de un modelo de datos de un servicio ya en producción es inviable en la mayor parte de los casos, al requerir ésta de grandes cambios en la aplicación, por lo que éste paso debe ser siempre uno de los primeros a realizar a la hora de desarrollar una aplicación, mucho antes de haber escrito una sola línea de código fuente. Si bien la base de datos no es una de las partes más visibles del sistema, es la más importante de todas, debido a que es el almacen primario para nuestra información persistente.</p>
<blockquote><p><strong>En resúmen:</strong> Evítate problemas y dedica algo de tu tiempo a aprender a modelar correctamente tus bases de datos <img src='http://blog.xplorastudios.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p></blockquote>
<p>Próximamente intentare entrar más a fondo en éste tema, mientras tanto, aquí os dejo unas lecturas recomendas:</p>
<ul>
<li> ¿Qué es el modelado de datos? (En inglés): <a href="http://en.wikipedia.org/wiki/Data_modeling">http://en.wikipedia.org/wiki/Data_modeling</a></li>
<li> El modelo entidad-relación (En inglés): <a href="http://en.wikipedia.org/wiki/Entity-relationship_model">http://en.wikipedia.org/wiki/Entity-relationship_model</a></li>
<li> Modelado de datos 101 (En inglés, intentaré traducirla en un post más adelante): <a href="http://www.agiledata.org/essays/dataModeling101.html">http://www.agiledata.org/essays/dataModeling101.html</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.xplorastudios.com/leer/275/evitar-problemas-de-rendimiento-en-la-bbdd/feed</wfw:commentRss>
		</item>
		<item>
		<title>Esquema de base de datos de Wikipedia</title>
		<link>http://blog.xplorastudios.com/leer/273/esquema-de-base-de-datos-de-wikipedia</link>
		<comments>http://blog.xplorastudios.com/leer/273/esquema-de-base-de-datos-de-wikipedia#comments</comments>
		<pubDate>Wed, 11 Feb 2009 16:08:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Bases de datos]]></category>

		<category><![CDATA[bbdd]]></category>

		<category><![CDATA[datos]]></category>

		<category><![CDATA[modelado]]></category>

		<category><![CDATA[mysql]]></category>

		<category><![CDATA[wikipedia]]></category>

		<guid isPermaLink="false">http://blog.xplorastudios.com/?p=273</guid>
		<description><![CDATA[Leyendo el Blog de Luauf me encontré con éste interesante post en el que ha publicado el esquema del modelo de datos de la bbdd de la wikipedia.
Existen multitud de libros y recursos al respecto, pero si hay tiempo probablemente más adelante cree una serie de tutoriales y guías sobre el modelado de datos. Para [...]]]></description>
			<content:encoded><![CDATA[<p>Leyendo el <a href="http://www.luauf.com">Blog de Luauf</a> me encontré con <a href="http://luauf.com/2009/02/10/esquema-de-base-de-datos-de-la-wikipedia/">éste interesante post en el que ha publicado el esquema del modelo de datos de la bbdd de la wikipedia</a>.</p>
<p>Existen multitud de libros y recursos al respecto, pero si hay tiempo probablemente más adelante cree una serie de tutoriales y guías sobre el modelado de datos. Para los impacientes, aprovecho para poner aquí una web en la que podréis obtener diagramas de modelos de datos de una gran variedad de casos (videoclubs, hospitales, gestion de empleados, catálogo de producto, etc). de forma gratuita. Es uno de los mejores recursos que he encontrado al respecto:<br />
<a href="http://www.databaseanswers.org/data_models/index.htm" target='_blank'>http://www.databaseanswers.org/data_models/index.htm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xplorastudios.com/leer/273/esquema-de-base-de-datos-de-wikipedia/feed</wfw:commentRss>
		</item>
		<item>
		<title>Tutorial Jquery - Creando un debugger de javascript avanzado</title>
		<link>http://blog.xplorastudios.com/leer/255/tutorial-jquery-creando-un-debugger-de-javascript-avanzado</link>
		<comments>http://blog.xplorastudios.com/leer/255/tutorial-jquery-creando-un-debugger-de-javascript-avanzado#comments</comments>
		<pubDate>Tue, 13 Jan 2009 21:39:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Javascript]]></category>

		<category><![CDATA[Jquery]]></category>

		<category><![CDATA[Programación]]></category>

		<category><![CDATA[debug]]></category>

		<category><![CDATA[evaluar]]></category>

		<category><![CDATA[expresiones]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[jquery]]></category>

		<category><![CDATA[watch]]></category>

		<guid isPermaLink="false">http://blog.xplorastudios.com/?p=255</guid>
		<description><![CDATA[
Anteriormente comentamos como crear un sencillo debugger de javascript con Jquery. En ésta ocasión, y partiendo de esa base, crearemos un script para realizar debug de javascript más avanzado siguiendo los mismos principios: que sólo sea necesario incluir el script para habilitar el debugger, que éste nos permita seguir la evolución en tiempo real en [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-261" title="debugger2" src="http://blog.xplorastudios.com/wp-content/uploads/debugger2.gif" alt="debugger2" width="484" height="350" /></p>
<p>Anteriormente comentamos <a href="http://blog.xplorastudios.com/leer/231/tutorial-jquery-creando-un-simple-debugger-de-javascript">como crear un sencillo debugger de javascript con Jquery</a>. En ésta ocasión, y partiendo de esa base, <strong>crearemos un script para realizar debug de javascript más avanzado</strong> siguiendo los mismos principios: que sólo sea necesario incluir el script para habilitar el debugger, que éste nos permita seguir la evolución en tiempo real en la misma ventana de trabajo, y que pueda ser minimizado para que no nos moleste cuando no lo necesitemos.</p>
<p>Entre las características adicionales que he agregado destaca la implementación de un sistema de logging, que nos permitirá enviar información al log de forma muy sencilla al log a mediante la función <strong>jsdebugLog(&#8217;Texto a enviar al log&#8217;);</strong>, el debugger se encargará automáticamente de rotar el log para mostrarnos sólo los últimos eventos.</p>
<p>Adicionalmente, he incluido un interesante pero sencillo sistema para sugerir nombres de variables, funciones y objetos. En función de lo que escribamos en el campo de expresiones, se nos sugerirarn posibles valores que podemos añadir al evaluador de expresiones con tan solo hacer click.</p>
<p>Por último, se han incluido botones para poder vaciar tanto el evaluador de expresiones como el log y se han retocado un poco los estilos.</p>
<p><span id="more-255"></span></p>
<h3>1. El concepto</h3>
<h4>1.1 Evaluador de expresiones</h4>
<p>Para poder mostrar un listado de variables, funciones y objetos disponibles sensible al texto que estamos escribiendo, lo que haremos es iterar por &#8216;<strong>this</strong>&#8216; buscando coincidencias, una vez las encontremos, las iremos añadiendo a un array de palabras sugeridas.</p>
<pre name='code' class="javascript">suggested=new Array();
for (var s in this) {
   if (s.toLowerCase().indexOf(search.toLowerCase())&gt;=0) suggested.push(s);
}</pre>
<p>Una vez hecho esto, tan solo debemos comprobar el tamaño del array, y si es superior a 0, generaremos el código html con el listado de palabras sugeridas y las adjuntaremos al div correspondiente. En caso de que el array esté vacio, ocultaremos el div de palabras sugeridas. ¡Tan sencillo como eso!.</p>
<h4>1.2 Logger</h4>
<p>El logger es más sencillo si cabe, simplemente utilizaremos un array para almacenar ahí todos los datos que se envíen al log y en caso de que se exceda la capacidad del logger (indicada en una variable), se eliminará la entrada más antigua.</p>
<p>En cada intervalo de refresco, se regenerara el listado con los datos del array y se asignarán vínculos para poder eliminar registros del logger o vaciarlo por completo.</p>
<h3>2. El código</h3>
<p><strong><a href="http://blog.xplorastudios.com/wp-content/uploads/debug_avanzado.js" target='_blank'>Descargar debug_avanzado.js</a></strong></p>
<h3>3. Instalación</h3>
<p>Simplemente copiamos el archivo al directorio de nuestras librerias javascript y lo cargamos en la página de la que queramos hacer debug. Si no queremos que se muestre, podemos cambiar la variable <strong>jsdebugActive</strong> a false, llamar a la funcion <strong>jsdebugClose()</strong>, o simplemente, no cargar el archivo.</p>
<p>Podemos escribir manualmente las expresiones en el campo habilitado y añadirlas, o podemos agregarlas desde nuestro código mediante la función <strong>jsdebugWatch(expresion);</strong>. Para probar el funcionamiento podeis introducir la expresión 1+1 y tendrá que evaluarla como 2, también podéis probar a introducir alguna variable que esteis utilizando y os mostrará su valor.</p>
<p>Para agregar datos al logger, podemos usar la función <strong>jsdebugLog(texto);</strong>.</p>
<blockquote><p>Nota: Para que funcione, es necesario que las librerias de jquery estén cargadas</p></blockquote>
<blockquote><p>Nota: Los estilos utilizan position:fixed, no todos los navegadores soportan esta opcion, si vuestro navegador no la soporta, podeis utilizar position:absolute</p></blockquote>
<h3>4. Conclusión</h3>
<p>Ahora disponemos de un debugger un poco más avanzado que nos será de mucha utilidad a la hora de realizar debug de nuestras aplicaciones. Como siempre, aún puede mejorarse y ampliarse mucho más, pero por el momento lo dejaremos aquí ya que particularmente, cumple con todas mis espectativas.</p>
<p>Espero que os sea de tanta utilidad como a mi, estaré encantado de leer vuestras dudas o comentarios al respecto.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xplorastudios.com/leer/255/tutorial-jquery-creando-un-debugger-de-javascript-avanzado/feed</wfw:commentRss>
		</item>
		<item>
		<title>Tutorial Jquery - Creando un sencillo debugger de javascript</title>
		<link>http://blog.xplorastudios.com/leer/231/tutorial-jquery-creando-un-simple-debugger-de-javascript</link>
		<comments>http://blog.xplorastudios.com/leer/231/tutorial-jquery-creando-un-simple-debugger-de-javascript#comments</comments>
		<pubDate>Mon, 12 Jan 2009 04:14:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Javascript]]></category>

		<category><![CDATA[Jquery]]></category>

		<category><![CDATA[Programación]]></category>

		<category><![CDATA[debug]]></category>

		<category><![CDATA[evaluar]]></category>

		<category><![CDATA[expresiones]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[jquery]]></category>

		<category><![CDATA[watch]]></category>

		<guid isPermaLink="false">http://blog.xplorastudios.com/?p=231</guid>
		<description><![CDATA[ Me considero un fanático de Jquery, que no es más que un conjunto de librerías de javascript que nos permiten crear aplicaciones dinámicas de forma extremadamente sencilla, además nos libera de la tediosa tarea de tener que utilizar diferentes funciones y métodos en función del navegador. Existen otras librerias (DOJO, Yahoo, Prototype, Moo-tools &#8230;), [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-251" style="margin: 10px;" title="debugger" src="http://blog.xplorastudios.com/wp-content/uploads/debugger.gif" alt="debugger" width="283" height="200" /> Me considero un fanático de <a href="http://www.jquery.com" target="_blank">Jquery</a>, que no es más que un conjunto de librerías de javascript que nos permiten crear aplicaciones dinámicas de forma extremadamente sencilla, además nos libera de la tediosa tarea de tener que utilizar diferentes funciones y métodos en función del navegador. Existen otras librerias (<a href="http://mootools.net" target="_blank">DOJO</a>, <a href="http://developer.yahoo.com/yui/" target="_blank">Yahoo</a>, <a href="http://www.prototypejs.org/" target="_blank">Prototype</a>, <a href="http://mootools.net/" target="_blank">Moo-tools</a> &#8230;), pero para mi <a href="http://www.jquery.com" target="_blank">Jquery</a> es la mejor de todas con diferencia.</p>
<p>Por ello, he decidido ir creando una serie de tutoriales sobre algunos scripts que voy preparando y que creo que os pueden ser de mucha utilidad. Los tutoriales serán de nivel medio, por lo que no entraré a comentar temas básicos, pero si intentaré explicar el funcionamiento, si tenéis alguna duda, comentadlo y os intentaré echar una mano.</p>
<p><span id="more-231"></span></p>
<h3>1. Introducción</h3>
<p>Cada vez utilizo más la potencia que ofrece Jquery y Ajax para crear aplicaciones más complejas y usables, sobre todo a la hora de crear interfaces de gestión eficientes que de otro modo serían demasiado tediosas, por poner un ejemplo, al tener que trabajar con cientos de productos, imágenes, entradas o categorias.</p>
<p>Debido a esto, y dada la naturaleza de javascript, me encontraba a menudo con problemas a la hora de realizar debugging, localizar errores o simplemente realizar el seguimiento de deteminadas funciones. Soy consciente de que existen addons y plugins para realizar debug de javascript en varios navegadores pero todos me han parecido demasiado complejos y simplemente no se ajustan a mis necesidades, que son básicamente disponer de un pequeño cuadro en el que pueda evaluar código javascript y que la evaluación se muestre en tiempo real, para poder ver por ejemplo, <strong>cómo evoluciona el contenido de determinadas variables</strong>. Creo que no hay nada como hacer las cosas uno mismo y no depender de nadie, además, el debugger que vamos a crear a continuación es compatible con todos los navegadores y no se necesita instalar nada <img src='http://blog.xplorastudios.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>2. El concepto</h3>
<p>Básicamente lo que vamos a hacer es crear un div flotante que evalue constantemente las expresiones que añadamos a un array y muestre su resultado. Éste resultado se irá actualizando cada cierto tiempo para mostrarnos como evolucionan dichas evaluaciones. En la expresión a evaluar, podemos incluir cualquier tipo de código javascript, ya sea el nombre de una variable para ver su resultado, una asignación de un valor a una variable o incluso una expresión compleja con jquery.</p>
<p>Para añadir expresiones al array de evaluación, podremos hacerlo a través de un campo de texto habilitado para tal efecto, o a través de una función a la que le pasaremos la expresión a añadir al cuadro de evaluación, <em>jsdebugWatch(expresion);</em> Asimismo, crearemos diferentes botones para poder quitar expresiones del array y para poder minimizar-maximizar el cuadro de evaluación, que por defecto se mostrará en estado minimizado.</p>
<h3>3. El código</h3>
<p><strong><a href="http://blog.xplorastudios.com/wp-content/uploads/debug.js">Descargar debug.js</a></strong></p>
<h3>4. Instalación</h3>
<p>Simplemente copiamos el archivo al directorio de nuestras librerias y lo cargamos en la página de la que queramos hacer debug. Si no queremos que se muestre, podemos cambiar la variable jsdebugActive a false, o simplemente, no cargar el archivo.</p>
<p>Podemos escribir manualmente las expresiones en el campo habilitado y añadirlas, o podemos agregarlas desde nuestro código mediante la función jsdebugWatch(expresion);</p>
<p>Para probar el funcionamiento podeis introducir la expresión 1+1 y tendrá que evaluarla como 2, también podéis probar a introducir alguna variable que esteis utilizando y os mostrará su valor.</p>
<blockquote><p>Nota: Para que funcione, es necesario que las librerias de jquery estén cargadas</p></blockquote>
<blockquote><p>Nota: Los estilos utilizan position:fixed, no todos los navegadores soportan esta opcion, si vuestro navegador no la soporta, podeis utilizar position:absolute</p></blockquote>
<h3>5. Conclusión</h3>
<p>Ahora disponemos de un sencillisimo debugger que nos será de mucha utilidad a la hora de realizar debug de nuestras aplicaciones. Personalmente lo he usado en multitud de proyectos y me resulta de mucha utilidad, me olvido de tener que instalar nada y sólo tengo que incluir el debug.js para tener el debugger disponible.</p>
<p>Por supuesto, éste es un debugger muy simple, podría mejorarse, ampliarse y probablemente optimizarse, pero eso os lo dejo a vosotros <img src='http://blog.xplorastudios.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Y nada más, lo siento por la tremenda parrafada que me ha salido, intentaré para la próxima que el &#8220;tutorial&#8221; sea un poco más gráfico.</p>
<p>Espero que os sea de tanta utilidad como a mi, estaré encantado de leer vuestras dudas o comentarios al respecto.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xplorastudios.com/leer/231/tutorial-jquery-creando-un-simple-debugger-de-javascript/feed</wfw:commentRss>
		</item>
		<item>
		<title>FTP recursivo, ¿cómo descargar un ftp completo desde linea de comandos?</title>
		<link>http://blog.xplorastudios.com/leer/222/ftp-recursivo-como-descargar-un-ftp-completo-desde-shell</link>
		<comments>http://blog.xplorastudios.com/leer/222/ftp-recursivo-como-descargar-un-ftp-completo-desde-shell#comments</comments>
		<pubDate>Fri, 09 Jan 2009 00:52:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Backup]]></category>

		<category><![CDATA[General]]></category>

		<category><![CDATA[Servidores]]></category>

		<category><![CDATA[Shell]]></category>

		<category><![CDATA[Unix]]></category>

		<category><![CDATA[backup]]></category>

		<category><![CDATA[ftp]]></category>

		<category><![CDATA[mget]]></category>

		<category><![CDATA[recursivo]]></category>

		<guid isPermaLink="false">http://blog.xplorastudios.com/?p=222</guid>
		<description><![CDATA[En determinadas ocasiones surge la necesidad de descargar archivos de un ftp de forma recursiva en un servidor o en nuestro pc, y no tenemos un cliente de ftp a mano. La primera opción sería conectarse por ftp y usar mget, pero ésto no nos sirve porque no funciona recursivamente. Algunos servidores de ftp permiten [...]]]></description>
			<content:encoded><![CDATA[<p>En determinadas ocasiones surge la necesidad de descargar archivos de un ftp de forma recursiva en un servidor o en nuestro pc, y no tenemos un cliente de ftp a mano. La primera opción sería conectarse por ftp y usar <strong>mget</strong>, pero ésto no nos sirve porque no funciona recursivamente. Algunos servidores de ftp permiten el comando <strong>recursive mget</strong>, pero son los menos.</p>
<p>Entonces, ¿qué hacemos si queremos descargar en nuestro equipo o en nuestro servidor un ftp completo y no contamos con un cliente que no sea el típico ftp de toda la vida?.</p>
<p><strong>La solución está en nuestro queridisimo <a href="http://www.gnu.org/software/wget/">WGET</a></strong>.<br />
<span id="more-222"></span></p>
<pre>wget -r -m --follow-ftp -T {timeout_en_segundos} -c "ftp://usuario:password@host.dominio[/ruta]"</pre>
<p>(Nota: los parámetros entre corchetes son opcionales y entre llaves, obligatorios).</p>
<p>Éste comando nos permitirá descargar un ftp completo de forma muy sencillita, y nos queda tiempo para irnos a tomar un café mientras tanto <img src='http://blog.xplorastudios.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Como siempre, podemos lanzarlo en segundo plano si preveemos que sea una tarea muy extensa:</p>
<pre>nohup wget -r -m --follow-ftp -T [timeout_en_segundos] -c "ftp://usuario:password@host.dominio/ruta" &#038;</pre>
<p>Una vez terminado, wget nos habrá descargado el contenido completo del ftp. Junto con ello, nos habrá descargado también una serie de archivos .listing que contienen un listado de cada directorio que ha descargado. Podemos eliminar esos archivos fácilmente con:</p>
<pre>find . -name ".listing" | xargs rm -rf</pre>
<blockquote><p>Ojo: Usar con cuidado, aseguraos que estais en el directorio correcto porque éste comando no pide confirmación al eliminar archivos.</p></blockquote>
<p>Espero que os sea de utilidad, yo lo uso muy a menudo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xplorastudios.com/leer/222/ftp-recursivo-como-descargar-un-ftp-completo-desde-shell/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
