<?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>Boozox &#187; HOWTO/CóMO</title>
	<atom:link href="http://boozox.net/category/howtocomo/feed/" rel="self" type="application/rss+xml" />
	<link>http://boozox.net</link>
	<description>Blog de informática, programación, software libre, linux, y mucho más</description>
	<lastBuildDate>Fri, 16 Mar 2012 20:28:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Trucos para hacer diseños en CSS más rápido y mejor</title>
		<link>http://boozox.net/web/trucos-para-hacer-disenos-en-css-mas-rapido-y-mejor/</link>
		<comments>http://boozox.net/web/trucos-para-hacer-disenos-en-css-mas-rapido-y-mejor/#comments</comments>
		<pubDate>Sun, 17 Feb 2008 20:46:56 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Diseño]]></category>
		<category><![CDATA[Estándar]]></category>
		<category><![CDATA[HOWTO/CóMO]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://boozox.net/web/trucos-para-hacer-disenos-en-css-mas-rapido-y-mejor/</guid>
		<description><![CDATA[Enfrentarse a crear una plantilla de diseño desde cero puede ser muy duro y desmoralizante. Por eso he reunido una serie de trucos que conviene tener a mano, para agilizar el proceso, y hacerlo algo más agradable. Las tres reglas de oro Lo primero y principal antes de empezar a escribir la plantilla, es definir [...]]]></description>
			<content:encoded><![CDATA[<p>Enfrentarse a crear una plantilla de diseño <strong>desde cero</strong> puede ser muy duro y desmoralizante. Por eso he reunido una serie de trucos que conviene tener a mano, para agilizar el proceso, y hacerlo algo más <strong>agradable</strong>.</p>
<h2>Las tres reglas de oro</h2>
<p>Lo primero y principal antes de empezar a escribir la plantilla, es definir estas tres reglas de oro del CSS. Se colocan al principio del archivo CSS, y sirven para evitar las discrepancias principales entre navegadores. Así nos evitamos más de un susto al comprobar si se ve igual en todos los navegadores.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">* <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; padding<span class="re2">:<span class="nu0">0</span></span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; margin<span class="re2">:<span class="nu0">0</span></span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">body <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">font-size</span>: <span class="re3"><span class="nu0">76</span>%</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">img <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">border-width</span>: <span class="nu0">0</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Lo que hacen es inicializar todos los <strong>márgenes internos y externos a cero</strong> (de TODOS los elementos), prefijar un <strong>tamaño de letra uniforme</strong> para todos los navegadores, y <strong>eliminar el borde</strong> de las imágenes.</p>
<p><a href="http://zumbe.net/tutoriales/las_tres_reglas_basicas.html">Conocer más sobre las tres reglas de oro del CSS</a>.</p>
<p>Suelo añadir esta cuarta regla, que <strong>evita que salga un recuadro</strong> alrrededor de los enlaces al pulsarlos.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">a <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">outline-style</span>: <span class="kw2">none</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>(<a href="http://boozox.net/howtocomo/solucion-a-dos-pesadillas-del-css/">más info</a>)</p>
<h2>Centrar contenedores (elementos div) en CSS</h2>
<p>Para centrar un contenedor en CSS, además de definir un ancho determinado, debemos <strong>asignar el valor auto al margen izquierdo y derecho</strong> del contenedor. Esto no da resultado en Internet Explorer, que requiere de la propiedad <em>text-align: center</em>. Si usamos las dos, nos aseguramos la victoria.<br />
<strong>HTML:</strong></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">[...]&lt;body&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&lt;div id=&quot;contenedor&quot;&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &lt;h1&gt;Titulo&lt;/h1&gt;
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &lt;p&gt;Texto&#8230;&lt;/p&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;/div&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&lt;/body&gt;</div>
</li>
</ol>
</div>
<p><strong>CSS:</strong></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">body <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">text-align</span>: <span class="kw2">center</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">#contenedor</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">text-align</span>: <span class="kw1">left</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">margin</span>: <span class="re3">10px</span> <span class="kw2">auto</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">width</span>: <span class="re3"><span class="nu0">80</span>%</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>(<a href="http://zumbe.net/tutoriales/centrar_contenedores_en_css.html">más info</a>)</p>
<h2>Hacer columnas con CSS</h2>
<p>Para crear varias columnas en un skin, debemos colocar <strong>elementos de bloque</strong> (div, ul, form&#8230;) que las representen, de forma contigua (uno al lado de otro) en nuestro HTML. A continuación, en el CSS usaremos la <strong>propiedad float</strong>, que &#8220;flota&#8221; un elemento a la izquierda o a la derecha, <strong>sacándolo del flujo de contenido</strong>.</p>
<p>Hay varias formas de aprovechar la propiedad float para crear columnas, algunos ejemplos:</p>
<p><img src='http://boozox.net/wp-content/float-left-all.png' alt='Usando propiedad Float de CSS' /> <img src='http://boozox.net/wp-content/float-left-right.png' alt='Usando propiedad Float de CSS' /> <br /><img src='http://boozox.net/wp-content/float-left-left.png' alt='Usando propiedad Float de CSS' /> <img src='http://boozox.net/wp-content/float-left-small.png' alt='Usando propiedad Float de CSS' /></p>
<p>Las flechas indican si se ha flotado a <em>izquierda o a derecha</em>, aúnque resulta bastante obvio.</p>
<p><strong>Ejemplo</strong>, el código CSS para hacer que todos los elementos li de una lista, esté flotados a la izquierda, con un tamaño de 100&#215;100 px:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">li <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">width</span>: <span class="re3">100px</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">height</span>: <span class="re3">100px</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">float</span>: <span class="kw1">left</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h2>Evitar solapamiento en la propiedad Float</h2>
<p>Da definicion en el estándar de CSS, hace que la propiedad float <strong>saque al elemento del flujo</strong>, y provoca que el resto de elementos &#8220;lo ignoren&#8221; en muchos aspectos, como que el elemento que lo contiene no adapta su ancho para incluirlo.</p>
<p style="text-align: center">Lo que quiero: <br /> <img src='http://boozox.net/wp-content/float_lo_q_quiero.gif' alt='Lo que quiero' /><br />Lo que ocurre: <br /><img src='http://boozox.net/wp-content/float_lo_q_obtengo.gif' alt='Lo que ocurre' /></p>
<p>Esto lo podemos solventar muy fácilmente.</p>
<p>Si queremos que un elemento que va a continuación de un float, no se vea afectado, le podemos dar la <strong>propiedad clear: both</strong></p>
<p>Pero si el problema es que tenemos elementos &#8220;flotados&#8221;, y queremos que el contenedor <strong>los envuelva</strong>, nada más fácil que aplicar al contenedor la <strong>propiedad overflow: hidden</strong>. <a href="http://www.planseldon.com/blog/hasta-siempre-clearboth/">La explicación la encontraréis aquí</a></p>
<h2>Todas las propiedades a mano</h2>
<p>Es muy importante tener siempre las propiedades a mano, y sobretodo conocer las <strong>95 propiedades del CSS 2.1</strong> para conocer las herramientas de que disponemos. Podéis encontrar un agradable listado, muy bien explicado (en inglés) en <a href="http://www.culturedcode.com/css/reference.html">CulturedCode CSS 2.1 Reference</a> (<em>es un recurso alucinante, muy muy útil</em>)</p>
<h2>Usar estructuras prefabricadas</h2>
<p>Podremos <strong>ahorrarnos tiempo</strong>, si partimos de estructuras prefabricadas en CSS y HTML.</p>
<ul>
<li><a href="http://blog.html.it/layoutgala/">Layout Gala</a> contiene muchas estructuras combinando tres elementos principales, cabecera y pié de página.</li>
<li><a href="http://csseasy.com/">Css Easy</a> te ofrece las principales configuraciones para skins, listas para descargar y manipular.</li>
<li>En <a href="http://css.maxdesign.com.au/listamatic/">Listmatic</a> encontraréis muchos tipos de lista, para aplicar a menús, o a lo que queráis.</li>
<li>En <a href="http://alvit.de/css-showcase/css-navigation-techniques-showcase.php">CSS Showcase</a> podréis encontrar muchos ejemplos de barras de navegación.</li>
</ul>
<h2>Plantillas ya elaboradas</h2>
<p>Otro recurso es acudir a <strong>skins completamente elaborados</strong>, y extraer lo que nos interese de ellos. Algunos enlaces:<br />
<a href="http://oswd.org">OpenSourceWebDesigns</a>, <a href="http://www.freecsstemplates.org/">FreeCssTemplates</a>, <a href="http://www.free-css-templates.com/">Free-css-templates</a>, <a href="http://www.thestylearchive.com/">TheStyleArchive</a>, <a href="http://www.templateworld.com/free_templates.html">TemplateWorld</a></p>
<p>O recurrir a sitios donde muestran plantillas únicamente para inspirarte:<br />
<a href="http://designshack.co.uk/">Inspirational CSS</a>,  <a href="http://www.cssbeauty.com/">CSSBeauty</a>, <a href="http://www.smashingmagazine.com/2007/05/21/60-elegant-and-visually-appealling-designs/">Elegant Desighns</a></p>
<p>Por último, en <a href="http://del.icio.us/tag/css">del.icio.us (tag: css)</a> podéis encontrar muchos recursos interesantes de CSS, y en <a href="http://webeame.net/index.php?category=4">Webéame (categoria diseño)</a> otros tantos.</p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/web/trucos-para-hacer-disenos-en-css-mas-rapido-y-mejor/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Manual completo y sencillo de Expresiones Regulares en PHP</title>
		<link>http://boozox.net/php/manual-completo-y-sencillo-de-expresiones-regulares-en-php/</link>
		<comments>http://boozox.net/php/manual-completo-y-sencillo-de-expresiones-regulares-en-php/#comments</comments>
		<pubDate>Tue, 04 Dec 2007 20:42:46 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[HOWTO/CóMO]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://boozox.net/php/manual-completo-y-sencillo-de-expresiones-regulares-en-php/</guid>
		<description><![CDATA[Las expresiones regulares son una potente herramienta que nos permite contrastar un texto con un patrón de búsqueda. Esta tarea resulta fundamental en algunos programas, y en otros puede facilitarnos increíblemente el trabajo. PHP permite dos tipos principales de funciones para expresiones regulares: las de tipo ereg (Expresiones regulares POSIX) y las de tipo preg [...]]]></description>
			<content:encoded><![CDATA[<p>Las expresiones regulares son una potente herramienta que nos permite contrastar un texto con un <strong>patrón de búsqueda</strong>. Esta tarea resulta fundamental en algunos programas, y en otros puede facilitarnos increíblemente el trabajo.</p>
<p><img src='http://boozox.net/wp-content/regex.jpg' alt='Regex' style="float:right"/></p>
<p>PHP permite <strong>dos tipos principales de funciones</strong> para expresiones regulares: las de <a href="http://es.php.net/manual/es/ref.regex.php">tipo ereg</a> (<em>Expresiones regulares POSIX</em>) y las de <a href="http://es.php.net/manual/es/ref.pcre.php">tipo preg</a> (<em>Compatibles con Perl</em>). Son muy similares, aúnque las segundas llegan a ser algo más potentes.</p>
<blockquote><p>Una expresión regular, consiste en <strong>comparar un patrón frente a un texto</strong>, para comprobar si el texto contiene lo especificado en el patrón. </p></blockquote>
<p>Por poner un par de ejemplos:</p>
<p>Patrón: <strong>in</strong><br />
Coindicen:</p>
<ul>
<li><strong>in</strong>tensidad</li>
<li>c<strong>in</strong>ta</li>
<li><strong>in</strong>terior</li>
</ul>
<p>Patrón: <strong>[mp]adre</strong><br />
Coindicen:</p>
<ul>
<li>Mi <strong>madre</strong> se llama Luisa</li>
<li>Tu <strong>padre</strong> es jardinero</li>
</ul>
<p>A continuación voy a repasar la sintaxis básica de una expresión regular<br />
<span id="more-216"></span></p>
<h2>Sintaxis y metacaracteres</h2>
<h3>El punto</h3>
<p>El punto representa <strong>cualquier caracter</strong>. Escribiendo un punto en un patrón querrás decir que ahí hay un caracter, cualquiera. Desde la A a la Z (en minúscula y mayúscula), del 0 al 9, o algún otro símbolo.</p>
<p><strong>Ejemplos:</strong><br />
<em style="color:#0077BB">ca.a</em> coincide con <em style="color:darkgreen">ca<strong>n</strong>a</em>, <em style="color:darkgreen">ca<strong>m</strong>a</em>, <em style="color:darkgreen">ca<strong>s</strong>a</em>, <em style="color:darkgreen">ca<strong>j</strong>a</em>, etc&#8230;<br />
No coincide con <em style="color:red">ca<strong>st</strong>a</em> ni <em style="color:red">caa</em> </p>
<h3>Principio y fin de cadena</h3>
<p>Si queremos indicar al patrón qué es el principio de la cadena o qué es el final, debemos hacerlo con <strong>^ para inicio y $ para final</strong>.</p>
<p><strong>Ejemplos:</strong><br />
&#8220;<em style="color:#0077BB">^olivas</em>&#8221; coincide con &#8220;<em style="color:darkgreen"><strong>olivas</strong> verdes</em>&#8220;, pero no con &#8220;<em style="color:red">quiero olivas</em>&#8221;</p>
<h3>Cuantificadores</h3>
<p>Para indicar que cierto elemento del patrón va a repetirse un <strong>número indeterminado de veces</strong>, usaremos + o * . Usando + queremos decir que el elemento anterior aparece una o más veces. Usando * queremos decir que el elemento anterior aparece cero o más veces.</p>
<p><strong>Ejemplos:</strong><br />
&#8220;<em style="color:#0077BB">gafas+</em>&#8221; coincide con &#8220;<em style="color:darkgreen">gafa<strong>ssss</strong></em>&#8221; pero no con &#8220;<em style="color:red">gafa</em>&#8221;<br />
sin embargo<br />
&#8220;<em style="color:#0077BB">clo*aca</em>&#8221; coincide con &#8220;<em style="color:darkgreen">claca</em>&#8220;, &#8220;<em style="color:darkgreen">cloaca</em>&#8220;, &#8220;<em style="color:darkgreen">cloooooooaca</em>&#8220;, etc..</p>
<p>Si lo que queremos indicar al patrón es que un elemento <strong>puede que esté (una vez) o puede que no</strong>, lo haremos con el interrogante de la siguiente forma:<br />
&#8220;<em style="color:#0077BB">coches?</em>&#8221; coincide con <em style="color:darkgreen">&#8220;coche&#8221;</em> y con <em style="color:darkgreen">&#8220;coches&#8221;</em></p>
<p>Para definir la <strong>cantidad de veces que va a repetirse el elemento</strong>, tendremos que hacer uso de las llaves: { }, indicando en su interior el intervalo, o la cantidad exacta de veces que va a repetirse. </p>
<p><strong>Ejemplos:</strong><br />
&#8220;<em style="color:#0077BB">abc{4}</em>&#8221; coincide con &#8220;<em style="color:darkgreen">abcccc</em>&#8220;, pero no con &#8220;<em style="color:red">abc</em>&#8221; ni &#8220;<em style="color:red">abcc</em>&#8220;, etc&#8230;<br />
&#8220;<em style="color:#0077BB">abc{1,3}</em>&#8221; coincide con &#8220;<em style="color:darkgreen">abc</em>&#8220;, &#8220;<em style="color:darkgreen">abcc</em>&#8220;, &#8220;<em style="color:darkgreen">abccc</em>&#8220;, pero no con &#8220;<em style="color:red">abcccc</em>&#8221;</p>
<p>Si un parámetro queda vacío, significa &#8220;un <strong>número indeterminado</strong>&#8220;. Por ejemplo: &#8220;<em>x{5,}</em>&#8221; significa que la x ha de repetirse 5 veces, o más.</p>
<h3>Rangos</h3>
<p>Los corchetes [] incluidos en un patrón permiten especificar el <strong>rango de caracteres</strong> válidos a comparar. Basta que exista <em>cualquiera de ellos</em> para que se de la condición. Dentro de ellos pondremos cualquier cantidad de caracteres, uno a continuación del otro; o un rango del abecedario o de los números enteros del 0 al 9.</p>
<p><strong>Ejemplos:</strong><br />
&#8220;<em style="color:#0077BB">c[ao]sa</em>&#8221; coincide con &#8220;<em style="color:darkgreen">casa</em>&#8221; y con &#8220;<em style="color:darkgreen">cosa</em>&#8221;<br />
&#8220;<em style="color:#0077BB">[a-f]</em>&#8221; coincide con todos los caracteres alfabéticos de la &#8220;<em>a</em>&#8221; a la &#8220;<em>f</em>&#8221;<br />
&#8220;<em style="color:#0077BB">[0-9][2-6][ANR]</em>&#8221; coincide con &#8220;<em style="color:darkgreen">12A</em>&#8220;, &#8220;<em style="color:darkgreen">35N</em>&#8220;, &#8220;<em style="color:darkgreen">84R</em>&#8220;, etc..<br />
pero no con &#8220;<em>2<strong style="color:red">1</strong>A</em>&#8220;, ni &#8220;<em>33<strong style="color:red">L</strong></em>&#8220;, ni &#8220;<em style="color:red">3A</em>&#8220;, etc&#8230;</p>
<p>Dentro de los corchetes, hay que tener en cuenta que el símbolo ^ ya no significa inicio, sinó que es un negador, es decir: &#8220;[^a-Z]&#8221; coincidirá con cualquier texto que NO tenga ningún caracter alfabético (ni minúsculas ni mayúsculas), y &#8220;^@ &#8221; coincide con cualquier caracter excepto &#8220;@&#8221; y &#8220;<em>espacio</em>&#8221; </p>
<h3>Alternancia</h3>
<p>Para alternar entre varias opciones, usaremos el símbolo | (barra vertical, en los teclados suele ser &#8220;Alt Gr + 1&#8243;). Con este mecanismo haremos un disyuntor, que nos permitirá dar varias opciones. Si una de ellas coincide, el patrón será cierto.<br />
<strong><br />
Ejemplos:</strong><br />
&#8220;<em style="color:#0077BB">aleman(ia|es)</em>&#8221; coincide con &#8220;<em style="color:darkgreen">aleman<strong>ia</strong></em>&#8221; y con &#8220;<em style="color:darkgreen">aleman<strong>es</strong></em>&#8221;<br />
&#8220;<em style="color:#0077BB">(norte|sur|este|oeste)</em>&#8221; coincide con cualquiera de los puntos cardinales.</p>
<h3>Agrupadores</h3>
<p>Los paréntesis nos sirven para agrupar un subconjunto. Como hemos visto en el ejemplo anterior, nos es útil para definir la alternancia, pero agrupar un subpatrón nos permite trabajar con él como si fuera un único elemento.</p>
<p><strong>Ejemplos:</strong><br />
&#8220;<em style="color:#0077BB">(abc)+</em>&#8221; coincide con &#8220;<em style="color:darkgreen">abc</em>&#8220;, &#8220;<em style="color:darkgreen">abcabc</em>&#8220;, &#8220;<em style="color:darkgreen">abcabcabc</em>&#8220;, etc<br />
&#8220;<em style="color:#0077BB">ca(sca)?da</em>&#8221; coincide con &#8220;<em style="color:darkgreen">cascada</em>&#8221; y con &#8220;<em style="color:darkgreen">cada</em>&#8221;</p>
<h3>Escapar caracteres</h3>
<p>Si por ejemplo quisiéramos que en el patrón hubiese un punto, o un símbolo asterisco, sin que se interprete como metacaracter, tendremos que &#8220;escaparlo&#8221;. Esto se hace poniendo una barra invertida justo antes: \. o \*<br />
Esto puede hacerse con cualquier caracter que quieras introducir de <strong>forma literal</strong>, y no interpretada.</p>
<h2>Las funciones</h2>
<p>Una vez tenemos clara la sintaxis, nos pondremos manos a la obra con el código. En este caso usaremos las funciones que nos proporciona PHP, aúnque la sintaxis es común a muchos lenguajes.</p>
<h3>Funciones tipo POSIX</h3>
<p>Existen seis funciones de este tipo, que son las siguientes:</p>
<ul>
<li><strong><a href="http://es2.php.net/manual/es/function.ereg.php">ereg()</a></strong>. Devuelve true si se cumple el patrón, o false si no se cumple.</li>
<li><strong><a href="http://es2.php.net/manual/es/function.eregi.php">eregi()</a></strong>. Igual que ereg(), pero sin distinguir <em>mayúsculas y minúsculas</em></li>
<li><strong><a href="http://es2.php.net/manual/es/function.ereg-replace.php">ereg_replace()</a></strong>. Usando la potencia de las expresiones regulares, permite modificar una cadena de texto.</li>
<li><strong><a href="http://es2.php.net/manual/es/function.eregi-replace.php">eregi_replace()</a></strong>. Igual que la anterior, sin distinguir <em>minúsculas y mayúsculas</em>.</li>
<li><strong><a href="http://es2.php.net/manual/es/function.split.php">split()</a></strong>. Divide una cadena en un array, según un patrón REGEX. Hace la misma tarea que la función explode, pero indicando una expresión regular como separador.</li>
<li><strong><a href="http://es2.php.net/manual/es/function.spliti.php">spliti()</a></strong>. Igual que el anterior, sin diferenciar <em>minúscula y mayúscula</em>.</li>
</ul>
<h3>Funciones tipo PCRE</h3>
<p>Estas funciones son un poco más complejas, y consecuentemente más potentes. La diferencia más significativa en cuanto a sintaxis es que el patrón deberá estar <strong>delimitado por dos caracteres</strong>. Usualmente se usan barras ( / ), aunque podemos usar cualquier símbolo, como ( # ), sobretodo en un patrón que contenga barras. Otra diferencia importante son los <a href="http://es.php.net/manual/es/reference.pcre.pattern.modifiers.php">modificadores</a>.</p>
<ul>
<li><strong><a href="http://es2.php.net/manual/es/function.preg-match.php">preg_match()</a></strong>. Chequea el patrón en una cadena alfanumérica. Devuelve true si coincide, o false en caso contrario. Además captura las coincidencias en un array.</li>
<li><strong><a href="http://es2.php.net/manual/es/function.preg-match-all.php">preg_match_all()</a></strong>. Igual que preg_match, pero almacenando todas las subcadenas que coincidan con el patrón (no sólo una como es el caso de preg_match)</em></li>
<li><strong><a href="http://es2.php.net/manual/es/function.preg-replace.php">preg_replace()</a></strong>. Nos permite reemplazar textos mediante expresiones regulares. Los argumentos pueden ser arrays, con lo que se realiza más de una sustitución con una sola función.</li>
<li><strong><a href="http://es2.php.net/manual/es/function.preg-split.php">preg_split()</a></strong>. Separa la cadena dada mediante una expresión regular.</li>
<li><strong><a href="http://es2.php.net/manual/es/function.preg-grep.php">preg_grep()</a></strong>. Busca el patrón dentro de un array, y devuelve otro array con las ocurrencias.</li>
</ul>
<h2>Ejemplos prácticos</h2>
<p>A continuación muestro algunos ejemplos de uso de estas funciones:</p>
<p>Uso sencillo de preg_match.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Este código lee la variable $documento (HTML), y encuentra un numero en negrita</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$documento</span> = <span class="st0">&#8216;&lt;h1&gt;Numero&lt;/h1&gt; &lt;p&gt;El numero es &lt;strong&gt;720&lt;/strong&gt;, bla bla bla&lt;/p&gt;&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/preg_match"><span class="kw3">preg_match</span></a><span class="br0">&#40;</span><span class="st0">&quot;#&lt;strong&gt;([0-9]+)&lt;/strong&gt;#is&quot;</span>,<span class="re0">$documento</span>,<span class="re0">$num</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$numero</span> = <span class="re0">$num</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$numero</span>; <span class="co1">// Devuelve 720</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>Uso de la referencia hacia atrás en preg_match_all</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// El \\2 es un ejemplo de referencia hacia atrás. Este le dice a pcre</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// que debe buscar el segundo conjunto de paréntesis en la expresión</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// regular misma, que sería ([\w]+) en este caso. La barra invertida</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// extra es requerida ya que la cadena se encuentra entre comillas</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// dobles.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$html</span> = <span class="st0">&quot;&lt;b&gt;texto en negrilla&lt;/b&gt;&lt;a href=hola.html&gt;haga clic aquí&lt;/a&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/preg_match_all"><span class="kw3">preg_match_all</span></a><span class="br0">&#40;</span><span class="st0">&quot;/(&lt;([<span class="es0">\w</span>]+)[^&gt;]*&gt;)(.*)(&lt;<span class="es0">\/</span><span class="es0">\\</span>2&gt;)/&quot;</span>, <span class="re0">$html</span>, <span class="re0">$coincidencias</span>, PREG_SET_ORDER<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$coincidencias</span> <span class="kw1">as</span> <span class="re0">$val</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;coincidencia: &quot;</span> . <span class="re0">$val</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> . <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;parte 1: &quot;</span> . <span class="re0">$val</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> . <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;parte 2: &quot;</span> . <span class="re0">$val</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span> . <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;parte 3: &quot;</span> . <span class="re0">$val</span><span class="br0">&#91;</span><span class="nu0">4</span><span class="br0">&#93;</span> . <span class="st0">&quot;<span class="es0">\n</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>Simple comprobación con el patrón de IP</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Funcion que comprueba si el dato pasado es una IP correcta</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> ipValida<span class="br0">&#40;</span><span class="re0">$ip</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>!<a href="http://www.php.net/eregi"><span class="kw3">eregi</span></a><span class="br0">&#40;</span><span class="st0">&quot;^[0-9]{1,3}<span class="es0">\.</span>[0-9]{1,3}<span class="es0">\.</span>[0-9]{1,3}<span class="es0">\.</span>[0-9]{1,3}$&quot;</span>, <span class="re0">$ip</span><span class="br0">&#41;</span><span class="br0">&#41;</span> </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="re0">$tmp</span> = <a href="http://www.php.net/explode"><span class="kw3">explode</span></a><span class="br0">&#40;</span><span class="st0">&quot;.&quot;</span>, <span class="re0">$ip</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$tmp</span> <span class="kw1">as</span> <span class="re0">$sub</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$sub</span> = <span class="re0">$sub</span> * <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$sub</span>&lt;<span class="nu0">0</span> || <span class="re0">$sub</span>&gt;<span class="nu0">256</span><span class="br0">&#41;</span> <span class="kw1">return</span> <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<h2>Referencias</h2>
<ul>
<li><a href="http://www.ignside.net/man/php/regex.php">Expresiones Regulares (Ignside)</a>, lectura muy recomendada</li>
<li><a href="http://perl.plover.com/Regex/article.html">Funcionamiento interno de los RegEx (Inglés)</a>, si tienes curiosidad y entiendes inglés.</li>
<li><a href="http://regexlib.com/">Librería de expresiones regulares ya hechas</a>, para no reinventar la rueda.</li>
<li><a href="http://es.php.net/manual/es/reference.pcre.pattern.syntax.php">Referencia sintaxis de funciones PCRE</a> del manual oficial.</li>
<li><a href="http://es.php.net/manual/es/reference.pcre.pattern.modifiers.php">Referencia Modificadores</a> del manual oficial.</li>
<li><a href="http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular">Expresión Regular en Wikipedia</a></li>
<li><a href="http://www.wikilearning.com/introduccion_a_las_expresiones_regulares-wkc-419.htm">Tutorial de Expresiones Regulares en Wikilearning</a>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/php/manual-completo-y-sencillo-de-expresiones-regulares-en-php/feed/</wfw:commentRss>
		<slash:comments>39</slash:comments>
		</item>
		<item>
		<title>Formas de ejecutar funciones en PHP</title>
		<link>http://boozox.net/php/formas-de-ejecutar-funciones-en-php/</link>
		<comments>http://boozox.net/php/formas-de-ejecutar-funciones-en-php/#comments</comments>
		<pubDate>Sun, 11 Nov 2007 16:47:37 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[Comparativa]]></category>
		<category><![CDATA[Curioso]]></category>
		<category><![CDATA[HOWTO/CóMO]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://boozox.net/php/formas-de-ejecutar-funciones-en-php/</guid>
		<description><![CDATA[Aúnque a algunos les parezca extraño, existen tres formas distintas de ejecutar una función en PHP (por lo menos que yo conozca). Cada una puede venir bien en situaciones distintas. Lo primero de todo, crearemos un par de funciones. function menor&#40;$a,$b&#41;&#123; return $a&#60;$b ? $a : $b; &#125; function mayor&#40;$a,$b&#41;&#123; return $a&#62;$b ? $a : [...]]]></description>
			<content:encoded><![CDATA[<p>Aúnque a algunos les parezca extraño, existen <strong>tres formas distintas de ejecutar una función en PHP</strong> (por lo menos que yo conozca). Cada una puede venir bien en situaciones distintas.</p>
<p>Lo primero de todo, crearemos un par de funciones.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> menor<span class="br0">&#40;</span><span class="re0">$a</span>,<span class="re0">$b</span><span class="br0">&#41;</span><span class="br0">&#123;</span> <span class="kw1">return</span> <span class="re0">$a</span>&lt;<span class="re0">$b</span> ? <span class="re0">$a</span> : <span class="re0">$b</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> mayor<span class="br0">&#40;</span><span class="re0">$a</span>,<span class="re0">$b</span><span class="br0">&#41;</span><span class="br0">&#123;</span> <span class="kw1">return</span> <span class="re0">$a</span>&gt;<span class="re0">$b</span> ? <span class="re0">$a</span> : <span class="re0">$b</span>; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>La función <strong>menor</strong>() devuelve el menor de los dos números pasados como parámetros. La función <strong>mayor</strong>() hará lo contrario.</p>
<h2>La forma clásica</h2>
<p>La forma más típica de ejecutar una función, es símplemente <strong>escribiendo su nombre, seguido de unos paréntesis</strong>, con los parámetros separados por comas. De esta forma, al escribir:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$a</span> = <span class="nu0">12</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$b</span> = <span class="nu0">5</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Entre $a y $b, el menor es &quot;</span>,menor<span class="br0">&#40;</span><span class="re0">$a</span>,<span class="re0">$b</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Nos devolvería el siguiente texto:</p>
<blockquote><p>Entre 12 y 5, el menor es 5</p></blockquote>
<h2>Con la función call_user_func(_array)</h2>
<p>Las función <a href="http://es2.php.net/manual/es/function.call-user-func.php">call_user_func</a>  nos permite ejecutar una función, dado el nombre en cadena alfanumérica.</p>
<p>La diferencia con <a href="http://es2.php.net/manual/es/function.call-user-func-array.php">call_user_fucn_array</a>, es que en esta última los parámetros son pasados en un array.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">&#8216;comparacion&#8217;</span><span class="br0">&#93;</span> == <span class="st0">&#8216;menor&#8217;</span><span class="br0">&#41;</span> <span class="re0">$func</span> = <span class="st0">&#8216;menor&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">else</span> <span class="re0">$func</span> = <span class="st0">&#8216;mayor&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$a</span> = <span class="nu0">17</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$b</span> = <span class="nu0">32</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <a href="http://www.php.net/call_user_func"><span class="kw3">call_user_func</span></a><span class="br0">&#40;</span><span class="re0">$func</span>,<span class="re0">$a</span>,<span class="re0">$b</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Dependiendo de la variable GET comparación, se ejecutará una función u otra. La alternativa con call_user_func_array es:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">&#8216;comparacion&#8217;</span><span class="br0">&#93;</span> == <span class="st0">&#8216;menor&#8217;</span><span class="br0">&#41;</span> <span class="re0">$func</span> = <span class="st0">&#8216;menor&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">else</span> <span class="re0">$func</span> = <span class="st0">&#8216;mayor&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$a</span> = <span class="nu0">17</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$b</span> = <span class="nu0">32</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <a href="http://www.php.net/call_user_func_array"><span class="kw3">call_user_func_array</span></a><span class="br0">&#40;</span><span class="re0">$func</span>,<a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="re0">$a</span>,<span class="re0">$b</span><span class="br0">&#41;</span><span class="br0">&#41;</span>; <span class="co1">//parametros en forma de array</span></div>
</li>
</ol>
</div>
<h2>Directamente de una cadena</h2>
<p>Esta es una forma sorprendente de ejecutar funciones. Parte de lo mismo que la anterior, el nombre de la función en una <strong>variable alfanumérica</strong>. Pero en este caso puede ser tratada directamente como función, así por la cara.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$funcion</span> = <span class="st0">&#8216;menor&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$funcion</span><span class="br0">&#40;</span><span class="nu0">2</span>,<span class="nu0">5</span><span class="br0">&#41;</span>; <span class="co1">//Devuelve 2</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$funcion</span><span class="br0">&#40;</span><span class="nu0">8</span>,<span class="nu0">-12</span><span class="br0">&#41;</span>; <span class="co1">//Devuelve -12</span></div>
</li>
</ol>
</div>
<p>Esta libertad recuerda a <strong>JavaScript</strong>, donde pueden <em>igualarse</em> variables a funciones de forma muy sencilla.</p>
<p>Conocéis alguna forma más? Os parece útil disponer de diferentes métodos para llamar a funciones?</p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/php/formas-de-ejecutar-funciones-en-php/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>El aspecto de un correcto HTML</title>
		<link>http://boozox.net/web/el-aspecto-de-un-correcto-html/</link>
		<comments>http://boozox.net/web/el-aspecto-de-un-correcto-html/#comments</comments>
		<pubDate>Sun, 04 Nov 2007 18:26:52 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[HOWTO/CóMO]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://boozox.net/web/el-aspecto-de-un-correcto-html/</guid>
		<description><![CDATA[Via del.icio.us descubro esta imágen que transmite de una forma muy acertada todo lo que un buen documento HTML debe contener. Me gustaría transcribir y traducir este interesante recurso a continuación para todos vosotros: Doctype declarado correctamente Parece un galimatías, pero los DOCTYPE son importantes. No sólo hace que tu código sea válido, sinó que [...]]]></description>
			<content:encoded><![CDATA[<p>Via <a href="http://del.icio.us">del.icio.us</a> descubro <a href="http://css-tricks.com/examples/CleanCode/CleanCode.jpg">esta imágen</a> que transmite de una forma muy acertada todo lo que <strong>un buen documento HTML</strong> debe contener.</p>
<p>Me gustaría transcribir y traducir este interesante recurso a continuación para todos vosotros:</p>
<h2>Doctype declarado correctamente</h2>
<p>Parece un galimatías, pero los DOCTYPE son importantes. No sólo hace que tu código sea válido, sinó que dicen a tu navegador detalles de cómo debe renderizar tu página.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &nbsp;&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;</div>
</li>
</ol>
</div>
<h2>Encabezado ordenado</h2>
<p>Que conste de título, conjunto de caracteres, enlace a hojas de estilo (incluida la de impresión!) y scripts (enlazados, que NO incluidos).<br />
Los archivos externos (CSS o JavaScript) en carpetas propias (<em>css/</em> y <em>script/</em> por ejemplo).</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&lt;head&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &lt;title&gt;Titulo del documento&lt;/title&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &lt;link rel=&quot;stylesheet&quot; href=&quot;css/estilo.css&quot; type=&quot;text/css&quot; media=&quot;screen, projection&quot;/&gt;
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &lt;link rel=&quot;stylesheet&quot; href=&quot;css/print.css&quot; type=&quot;text/css&quot; media=&quot;print&quot;/&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &lt;script type=&quot;text/javascript&quot; src=&quot;script/javascript.js&quot;&gt;&lt;/script&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;/head&gt;</div>
</li>
</ol>
</div>
<h2>ID para Body</h2>
<p>El ponerle una id a la etiqueta body te permite crear propiedades CSS específicas para una página en concreto. Por ejemplo diferenciar los h2 del homepage, con un código similar a #home h2 {}, y así no afectar a ningún otro h2.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&lt;body id=&quot;home&quot;&gt;</div>
</li>
</ol>
</div>
<h2>Div principal para todo el contenido de la página</h2>
<p>El poner un div que contenga todo el contenido nos permite mantener el control del diseño sobre la página en su conjunto. Por ejemplo podemos determinar un ancho fijo de toda la página.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&lt;div id=&quot;contenedor&quot;&gt;</div>
</li>
</ol>
</div>
<h2>Menú limpio semánticamente</h2>
<p>Un menú debe tener este aspecto:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&lt;div id=&quot;menu&quot;&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &lt;ul&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;li&gt;&lt;a href=&quot;inicio.php&quot;&gt;Inicio&lt;/a&gt;&lt;/li&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;li&gt;&lt;a href=&quot;info.php&quot;&gt;Info&lt;/a&gt;&lt;/li&gt;
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;li&gt;&lt;a href=&quot;contacto.php&quot;&gt;Contacto&lt;/a&gt;&lt;/li&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &lt;/ul&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;/div&gt;</div>
</li>
</ol>
</div>
<h2>Incluir el contenido repetido</h2>
<p>Mucho contenido es común entre página y página. Menús, barras laterales, piés de página, etc. Este tipo de contenido debería ser incluido dinámicamente. Esto puede conseguirse con una simple instrucción de PHP.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span> <span class="kw1">include_once</span><span class="br0">&#40;</span><span class="st0">&quot;botonero.html&quot;</span><span class="br0">&#41;</span> <span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<h2>Contenido importante primero</h2>
<p>Es apropiado que incluyas tus contenidos más importantes al principio, como noticias, eventos, que pueden ser listadas al principio del HTML. Si tu barra lateral es sólo para navegación o cosas menos relevantes incluso, deberías ponerla al final del HTML.</p>
<h2>Código tabulado</h2>
<p>Si cada sección de código se presenta tabulada como un conjunto, la estructura del código queda mucho más comprensible. Cuando un código está completamente alineado a la izquierda es prácticamente imposible de comprender.</p>
<h2>Sin estilo!</h2>
<p>Tu HTML debe estar completamente orientado a la estructura y al contenido, <strong>no al estilo</strong>! Deja que el CSS se encargue de todo lo relacionado con el estilo, y por supuesto olvida la etiqueta <strong>font</strong></p>
<h2>Contenido, contenido, contenido</h2>
<p>Aquí has de insertar todo tu contenido, así que manos a la obra. No olvides separar los distintos párrafos con la etiqueta <strong>p</strong>. Utiliza listas dónde sea apropiado. Utiliza códigos para los símbolos (& copy; & iacute; etc). No abuses de los <strong>hr</strong> para el salto de línea. </p>
<h2>Etiquetas de cierre</h2>
<p>Empezaste con fuerza, ahora acaba con fuerza. No seas perezos@ y cierra todas las etiquetas que lo requieran, incluso si la página se renderiza bien sin ellas!</p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/web/el-aspecto-de-un-correcto-html/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Leer y escribir Zip en PHP sin complicarse la vida</title>
		<link>http://boozox.net/php/leer-y-escribir-zip-en-php-sin-complicarse-la-vida/</link>
		<comments>http://boozox.net/php/leer-y-escribir-zip-en-php-sin-complicarse-la-vida/#comments</comments>
		<pubDate>Fri, 02 Nov 2007 12:36:58 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Aplicaciones]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[HOWTO/CóMO]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://boozox.net/boozox/leer-y-escribir-zip-en-php-sin-complicarse-la-vida/</guid>
		<description><![CDATA[Lo que hoy quiero mostraros es una genial librería, que facilita increíblemente el manejo de archivos zip con PHP; únicamente habrá que incluir un archivo a nuestro código, para gozar de toda su funcionalidad para abrir, explorar y crear archivos de tipo Zip. Instanciación El primer paso para usar esta librería es siempre el mismo, [...]]]></description>
			<content:encoded><![CDATA[<p>Lo que hoy quiero mostraros es una <a href="http://www.phpconcept.net/pclzip/index.en.php">genial librería</a>, que facilita increíblemente el <strong>manejo de archivos zip con PHP</strong>; únicamente habrá que incluir un archivo a nuestro código, para gozar de toda su funcionalidad para <em>abrir,</em> <em>explorar</em> y <em>crear</em> archivos de tipo Zip.</p>
<h2>Instanciación</h2>
<p>El primer paso para usar esta librería es siempre el mismo, independientemente de lo que queramos hacer:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st0">&quot;pclzip.lib.php&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$archivo</span> = <span class="kw2">new</span> PclZip<span class="br0">&#40;</span><span class="st0">&quot;archivo.zip&quot;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Como se observa, hemos <strong>incluido</strong> el fichero de la librería, y hemos <strong>instanciado</strong> la clase PclZip, con un nombre de archivo.<br />
Este nombre de archivo puede ser uno <em>existente</em>, que queremos manipular, o uno <em>inexistente</em>, que queremos crear a continuación. Será más adelante cuando le indicamos lo que queremos hacer con archivo.zip (<em>leer o escribir</em>), hasta aquí únicamente lo hemos referenciado.</p>
<p><span id="more-171"></span><br />
<h2>Lectura</h2>
<p>En caso de que el archivo Zip sí exista, y queramos <strong>explorar</strong> su contenido, tenemos varias alternativas.</p>
<p>La primera es usar el método <strong><a href="http://www.phpconcept.net/pclzip/man/en/index.php?methods-listcontent">listContent()</a></strong>, el cual nos devuelve una lista de propiedades de los archivos y carpetas contenidos en el archivo zip.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">include_once</span><span class="br0">&#40;</span><span class="st0">&quot;pclzip.lib.php&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$zip</span> = <span class="kw2">new</span> PclZip<span class="br0">&#40;</span><span class="st0">&quot;test.zip&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$list</span> = <span class="re0">$zip</span>-&gt;<span class="me1">listContent</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="st0">&quot;Error : &quot;</span>.<span class="re0">$zip</span>-&gt;<span class="me1">errorInfo</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">for</span> <span class="br0">&#40;</span><span class="re0">$i</span>=<span class="nu0">0</span>; <span class="re0">$i</span>&lt;sizeof<span class="br0">&#40;</span><span class="re0">$list</span><span class="br0">&#41;</span>; <span class="re0">$i</span>++<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><a href="http://www.php.net/reset"><span class="kw3">reset</span></a><span class="br0">&#40;</span><span class="re0">$list</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span>; <span class="re0">$key</span> = <a href="http://www.php.net/key"><span class="kw3">key</span></a><span class="br0">&#40;</span><span class="re0">$list</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span>; <a href="http://www.php.net/next"><span class="kw3">next</span></a><span class="br0">&#40;</span><span class="re0">$list</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Archivo $i / [$key] = &quot;</span>.<span class="re0">$list</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="re0">$key</span><span class="br0">&#93;</span>.<span class="st0">&quot;&lt;br&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;&lt;br&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>Lo cual nos devuelve algo como esto:</p>
<pre>File 0 / [filename] = data/file1.txt
Archivo 0 / [stored_filename] = data/file1.txt
Archivo 0 / [size] = 53
Archivo 0 / [compressed_size] = 36
Archivo 0 / [mtime] = 1010440428
Archivo 0 / [comment] =
Archivo 0 / [folder] = 0
Archivo 0 / [index] = 0
Archivo 0 / [status] = ok

Archivo 1 / [filename] = data/file2.txt
Archivo 1 / [stored_filename] = data/file2.txt
Archivo 1 / [size] = 54
Archivo 1 / [compressed_size] = 53
Archivo 1 / [mtime] = 1011197724
Archivo 1 / [comment] =
Archivo 1 / [folder] = 0
Archivo 1 / [index] = 1
Archivo 1 / [status] = ok</pre>
<p>Si nos interesa más <strong>extraer</strong> el contenido descomprimiendo archivos y carpetas, tendremos que usar el método <strong><a href="http://www.phpconcept.net/pclzip/man/en/index.php?methods-extract">extract()</a></strong>, el cual nos brinda muchas opciones. Veamos un ejemplo:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">include</span><span class="br0">&#40;</span><span class="st0">&quot;pclzip.lib.php&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$archivo</span> = <span class="kw2">new</span> PclZip<span class="br0">&#40;</span><span class="st0">&quot;archivo.zip&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$archivo</span>-&gt;<span class="me1">extract</span><span class="br0">&#40;</span>PCLZIP_OPT_PATH, <span class="st0">&quot;data&quot;</span>,</div>
</li>
<li class="li2">
<div class="de2">PCLZIP_OPT_REMOVE_PATH, <span class="st0">&quot;install/release&quot;</span><span class="br0">&#41;</span> == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="st0">&quot;Error : &quot;</span>.<span class="re0">$archivo</span>-&gt;<span class="me1">errorInfo</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>En este ejemplo todos los archivos se extraen en la carpeta &#8220;data&#8221;. Todos los archivos cuya ruta empiece por &#8220;install/release&#8221;, serán extraidos directamente en &#8220;data&#8221;, y no en &#8220;data/install/release&#8221;.</p>
<p>Existen muchas opciones con las que indicar exactamente lo que queremos que haga al extraer nuestros archivos. Puedes consultarlas en la <strong><a href="http://www.phpconcept.net/pclzip/man/en/index.php?options">documentación</a></strong>.</p>
<h2>Escritura</h2>
<p>Si tu intención es <strong>crear</strong> un archivo zip &#8220;al vuelo&#8221;, esta librería también va a yudarte, gracias al método <strong><a href="http://www.phpconcept.net/pclzip/man/en/index.php?methods-create">create()</a></strong>, que creará un archivo zip con los archivos y carpetas que le indiquemos. Si le indicamos una carpeta, automáticamente incluirá todo el contenido en su interior. Además mantendrá la estructura de carpetas intacta dentro del archivo zip que creemos.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">include_once</span><span class="br0">&#40;</span><span class="st0">&quot;pclzip.lib.php&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$archivo</span> = <span class="kw2">new</span> PclZip<span class="br0">&#40;</span><span class="st0">&quot;archivo.zip&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$v_list</span> = <span class="re0">$archivo</span>-&gt;<span class="me1">create</span><span class="br0">&#40;</span><span class="st0">&quot;data/file.txt,data/text.txt&quot;</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; PCLZIP_OPT_REMOVE_PATH, <span class="st0">&quot;data&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; PCLZIP_OPT_ADD_PATH, <span class="st0">&quot;install&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$v_list</span> == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="st0">&quot;Error : &quot;</span>.<span class="re0">$archivo</span>-&gt;<span class="me1">errorInfo</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>En el anterior código los archivos &#8220;file.txt&#8221; y &#8220;text.txt&#8221;, que se encuentran en la carpeta &#8220;data&#8221;, en el archivo zip creado se encontrarán en la carpeta &#8220;install&#8221;.</p>
<p>La librería nos permite manipular archivos zip con toda comodidad, usando los métodos <strong><a href="http://www.phpconcept.net/pclzip/man/en/index.php?methods-add">add()</a></strong>, <strong><a href="http://www.phpconcept.net/pclzip/man/en/index.php?methods-delete">delete()</a></strong> o <strong><a href="http://www.phpconcept.net/pclzip/man/en/index.php?methods-merge">merge()</a></strong> , que añade archivos, elimina archivos, y fusiona archivos, respectivamente.</p>
<p>Ejemplo de añadir archivos:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st0">&quot;pclzip.lib.php&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$archivo</span> = <span class="kw2">new</span> PclZip<span class="br0">&#40;</span><span class="st0">&quot;archivo.zip&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$v_list</span> = <span class="re0">$archivo</span>-&gt;<span class="me1">add</span><span class="br0">&#40;</span><span class="st0">&quot;file.txt,data/text.txt,folder/&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$v_list</span> == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="st0">&quot;Error : &quot;</span>.<span class="re0">$archivo</span>-&gt;<span class="me1">errorInfo</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Como podéis ver, se trata de una librería <strong>completa</strong> y <strong>funcional</strong>. Recomiendo su uso frente a otras alternativas.</p>
<p>Si quieres ver un ejemplo de su uso, puedes echar un vistazo al <a href="http://codis.boozox.net/zip/URL::codis.boozox.net/bin/imaset_2-0.zip">explorador de archivos zip</a> que he incorporado en Codis.</p>
<p style="text-align:center;font-size:20px;"><a href="http://boozox.net/jaula/pclzip-2-6.zip">Descargar pclzip-2-6.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/php/leer-y-escribir-zip-en-php-sin-complicarse-la-vida/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>De Webmaster windowsero a Webmaster Linuxero, parte I</title>
		<link>http://boozox.net/web/de-webmaster-windowsero-a-webmaster-linuxero-parte-i/</link>
		<comments>http://boozox.net/web/de-webmaster-windowsero-a-webmaster-linuxero-parte-i/#comments</comments>
		<pubDate>Mon, 22 Oct 2007 22:50:30 +0000</pubDate>
		<dc:creator>José Cabo</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[HOWTO/CóMO]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://boozox.net/web/de-webmaster-windowsero-a-webmaster-linuxero-parte-i/</guid>
		<description><![CDATA[¿Eres webmaster, usas Windows, pero te sientes vacío y quieres ir a más y considerarte un webmaster de calidad? Pero ello te plantea dos posibles opciones: la primera consiste en abandonar todo lo que sabes y dedicarte a ver cómo crece tu jardín (que probablemente ni tengas) porque en Windows nunca serás &#8216;lo más cool&#8217; [...]]]></description>
			<content:encoded><![CDATA[<p><img style="float:right;" src='http://boozox.net/wp-content/20-xampp-logo-trio.jpg' alt='20-xampp-logo-trio.jpg' /><strong>¿Eres webmaster,  usas Windows, pero te sientes vacío y quieres ir a más y considerarte un webmaster de calidad?</strong> </p>
<p>Pero ello te plantea dos posibles opciones: la primera consiste en abandonar todo lo que sabes y dedicarte a ver cómo crece tu jardín (que probablemente ni tengas) porque <em>en Windows nunca serás &#8216;lo más cool&#8217; ni lo más &#8216;profesional&#8217; que querrías ser</em>.</p>
<p>La segunda opción es <strong>pasarte a GNU/Linux</strong>. Aprender a desarrollar en <strong>una verdadera plataforma de desarrollo</strong>, aprender a <strong>-trabajar- en un escritorio profesional de verdad</strong>, en un ordenador que realmente <strong>computa información de manera efectiva</strong>. <em>Seguro que al final, con insistencia, alguna de estas cualidades de GNU/Linux se te contagian y puedes completar tu formación de webmaster/administrador.</em></p>
<p>Para comenzar dividiremos nuestro cambio de sistema en dos partes: <strong>La primera y más importante será la referente al software</strong> y,<strong> la segunda</strong> será la referente a la <strong>&#8216;adaptación del entorno de escritorio a nuestro gusto&#8217;</strong>, es decir, la personalización del escritorio, con enlaces a las aplicaciones que más vamos a usar, uso de los diferentes escritorios, etc&#8230;</p>
<p>Una parte muy importante y necesaria para un buen webmaster es un <strong>&#8216;servidor de pruebas&#8217;</strong> en donde subiremos nuestros scripts web (html, php, etc&#8230;) antes de subirlos al hosting. <em>Hablo de software pero en realidad debería hablar de hardware</em>, el problema viene cuando nosotros somos pobres trabajadores explotados por la burguesía y no podemos permitirnos tener una sala especial para montar nuestro servidor para hacer pruebas así que nos limitaremos a usar nuestro propio ordenador. Por lo tanto lo primero que deberemos hacer es elegir una distribución &#8211; que en mi caso es <strong>Ubuntu GNU/Linux 7.10 Gutsy Gibbon</strong>, liberada el reciente 18 de Octubre, aunque puede servir cualquier distribución reciente de Linux (Fedora, Mandriva, OpenSuse, &#8230;). Obviamente, nuestro entorno de trabajo por defecto será Gnome (mi favorito&#8230; y para mi gusto el mejor, aunque siempre podéis probar con KDE o con Xfce entre otros montones).</p>
<p><span id="more-177"></span></p>
<p>Como decía, necesitamos un servidor de pruebas y lo vamos a localizar en nuestro propio ordenador. Es decir, que la &#8216;dirección&#8217; interna de nuestro servidor será <em>localhost</em> o <em>127.0.0.1</em>. Tenemos varias formas para instalar lo que necesitamos, pero la más rápida y cómoda (creo yo) es mediante un &#8220;pack&#8221; que incluya todo lo necesario: <em>(Apache, MySQL, PHP &#038; PEAR, Perl, ProFTPD, phpMyAdmin, OpenSSL, GD, Freetype2, libjpeg, libpng, gdbm, zlib, expat, Sablotron, libxml, Ming, Webalizer, pdf class, ncurses, mod_perl, FreeTDS, gettext, mcrypt, mhash, eAccelerator, SQLite e IMAP C-Client)</em>. Podremos tener todo gracias al <a href="http://www.apachefriends.org/es/xampp.html">instalador xampp</a> que podemos descargar desde <a href="http://www.apachefriends.org/en/xampp-linux.html#374">aquí</a> (lo siento&#8230; solo para 32bits). Iré al grano:</p>
<p>Descargamos el paquete <em>(XAMPP Linux 1.6.4)</em> y NO lo descomprimimos.<br />
<strong>Nos <em>logueamos</em> como root</strong> (debe ser como root, <strong>no vale sudo</strong>) en la terminal:<br />
<code>$ sudo su</code><br />
Nos movemos al directorio donde hemos descargado el paquete y ejecutamos tal y cual pone aquí:<br />
<code># tar xvfz xampp-linux-1.6.4.tar.gz -C /opt</code><br />
Esperamos un momento ya lo tendremos instalado en <em>/opt/lampp</em>. Ahora ya podemos volver a usar sudo. Ejecutamos xampp**:<br />
<code># /opt/lampp/lampp start</code><br />
<strong>Para pararlo:</strong> (no lo hagáis ahora)<br />
<code># /opt/lampp/lampp stop</code></p>
<p style="text-align:center;"><img src='http://boozox.net/wp-content/xampp1start.png' alt='xampp1start.png' /></p>
<p>Ahora ya lo tenemos instalado. Procederemos a configurarlo, es una operación realmente simple aunque yo os diré lo básico y que el programa te recuerda que lo hagas si no lo haces.<br />
En un navegador web (Mozilla Firefox, IE (bajo Wine) jeje, &#8230;) escribimos <em>http://localhost/</em> o <em>http://127.0.0.1/</em> . Si todo ha ido bien, nos saldrá el gestor de configuración de xampp. Nos dirigiremos a <strong>Status</strong> (izquierda) para ver lo que tenemos activo y desactivado para después irnos a <strong>Seguridad</strong> (izquierda) y <strong>solucionar todos esos fallos de seguridad</strong> (contraseñas casi todos). Una vez tengamos esto resuelto, ya tenemos todo lo básico configurado.</p>
<p>Para acceder a los diferentes programas podremos hacerlo por los siguientes enlaces desde el navegador (enlaces disponibles en el gestor de configuración):</p>
<ul>
<li><strong>phpmyadmin</strong>: http://localhost/phpmyadmin/</li>
<li><strong>phpSQLiteAdmin</strong>: http://localhost/phpsqliteadmin/</li>
<li><strong>Estadisticas del Servidor Apache del ordenador</strong>: http://localhost/webalizer/</li>
</ul>
<p>Para &#8220;ejecutar&#8221; aplicaciones web en el servidor (html, php, etc&#8230;) debemos tenerlas en <strong>/opt/lampp/htdocs/</strong> . Un ejemplo para abrir nuestro <em>index.html</em>(archivo ficticio) sería copiarlo a ese directorio y abrir desde el navegador: <em>file:///opt/lampp/htdocs/index.html/</em> o, su correspondiente (y el que se va a usar) <em>http://localhost/index.html/</em> .</p>
<p>Una vez tenemos nuestro servidor completamente funcional, podemos empezar a realizar nuestros scripts para &#8220;subirlos&#8221; al servidor vía ftp como usuario &#8216;nobody&#8217; (a no ser que administremos otras &#8216;cuentas&#8217;) (explicaré más adelante sobre clientes ftp). Para escribir necesitamos un programa editor de texto, básico o no, que nos permita guardar (ejem) el documento. Hace tiempo escribí una comparativa que podríamos usar para haceros una idea de los <a href="http://boozox.net/php/pequena-comparativa-de-editores-html-en-linux/">diferentes editores web más usados en Linux</a> (y en wine) y que recomiendo visitar. Según consulto a mi compañero Alex, a él el que más le gusta es <strong>gedit</strong> (el editor por defecto de Gnome aunque yo prefiero usar con wine el Adobe Dreamweaver 8 (ver post de la comparativa).</p>
<p>Con lo que respecta a los clientes FTP tenemos a nuestra disposición muchos y de varios gustos. Yo personalmente uso <strong>gFTP</strong> y el <strong>navegador FTP nautilus de Gnome</strong> (integrado con el navegador de ficheros nautilus).</p>
<p>Creo que ese es todo el software que nosotros necesitamos, en principio, para ser un buen administrador. Además, lógicamente, necesitaremos ciertos conocimientos (no necesariamente avanzados) de la consola (el entorno gráfico es bastante intuitivo), pero siempre puedes preguntar en internet o en este mismo blog por cualquier consulta que tengas.</p>
<p><strong>Troubleshooting&#8230;.</strong></p>
<p>Algunos de los programas extra que todo webmaster debe tener en cuenta son los que ayuden a crear contenido de calidad. Obviando que se debe <strong>usar Firefox</strong> (la versión de Windows instala en Wine también, así como <a href="http://www.tatanka.com.br/ies4linux/page/Es/P%C3%A1gina_Inicial">IE4Linux</a>) y también sería buena idea tener instalado Opera en Linux para comprobar compatibilidad (en gutsy está en los repositorios comerciales de Canonical). Además, por supuesto un buen diccionario para comprobar ortografía y vocabulario y una gran enciclopedia como es la <a href="http://es.wikipedia.org/wiki/Portada">Wikipedia</a> para consultar y contrastar información.<br />
Tampoco estaría de más hacer uso de <a href="http://es.wikipedia.org/wiki/GIMP">El Gimp</a>, el editor gráfico profesional de Linux (es multiplataforma). Todo diseñador debería usarlo. Y, ya que estamos un buen programa de mensajería instantánea como puede ser Pidgin (MultiRed) o el <a href="http://www.amsn-project.net/">amsn</a> (para la red MSN, mi favorito&#8230;). Y para ayudarnos a pensar de verdad no estaría de más un reproductor de audio (mi favorito es <strong>Amarok</strong> y solamente os puedo recomendar ese, es el mejor).</p>
<p><img src='http://boozox.net/wp-content/imagentotal1.png' alt='imagentotal1.png' /></p>
<p>Estad atentos a la segunda parte de este documento, vendrá en breve. Mientras tanto ¿por qué no comentas tus consejos para que los incluya?</p>
<p><strong><a href="http://boozox.net/linux/de-webmaster-windowsero-a-webmaster-linuxero-parte-ii/">Parte II</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/web/de-webmaster-windowsero-a-webmaster-linuxero-parte-i/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Conseguir comentarios en nuestro Blog</title>
		<link>http://boozox.net/php/comentarios-en-nuestro-blog/</link>
		<comments>http://boozox.net/php/comentarios-en-nuestro-blog/#comments</comments>
		<pubDate>Wed, 17 Oct 2007 18:25:24 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[Diseño]]></category>
		<category><![CDATA[HOWTO/CóMO]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://boozox.net/php/comentarios-en-nuestro-blog/</guid>
		<description><![CDATA[Todos los que tenemos un blog sabemos lo importante que son los comentarios. Te ayudan a continuar con tu labor, a corregir errores, a completar información, a conocer a tus lectrores, y sobre todo pasar un buen rato. Por eso es muy importante potenciar los comentarios, y darles el valor que se merecen. Voy a [...]]]></description>
			<content:encoded><![CDATA[<p>Todos los que tenemos un blog sabemos lo importante que son los <strong>comentarios</strong>. Te ayudan a continuar con tu labor, a corregir errores, a completar información, a conocer a tus lectrores, y sobre todo pasar un buen rato.</p>
<p>Por eso es muy importante <strong>potenciar los comentarios</strong>, y darles el valor que se merecen. Voy a explicar una serie de estrategias que pueden hacer que se comente más en tu blog, o por lo menos que sea más agradable hacerlo.</p>
<p><span id="more-161"></span></p>
<h2>Incitar textualmente</h2>
<p>Una buena forma de que te comenten es incitando a tus usuarios a que comenten. Esto puedes hacerlo tanto en los posts como en el propio theme.</p>
<p><strong>En el post:</strong><br />
Una idea es finalizar el post lanzando preguntas al aire, del tipo:</p>
<blockquote><p>Y vosotros, qué pensáis? Qué versión usaríais? Cuál os parece más (&#8230;)? </p></blockquote>
<p>Intenta implicar a los lectores en tu post. Olvida los formalismos (si tu blog te lo permite) y no dudes en nombrar a usuarios en tus posts, por ejemplo si se ha hecho una aporatción de información.</p>
<p><strong>En el theme:</strong><br />
También puedes llamar la atención a tus usuarios usando determinados textos en tu theme. </p>
<p>Por ejemplo, plantéate cambiar el clásico &#8220;<em>Dejar un comentario</em>&#8221; por algo más llamativo como &#8220;<em>Aporta tu sabiduría</em>&#8221; / &#8220;<em>Dinos algo</em>&#8221; / &#8220;<em>Queremos oirte</em>&#8221; / &#8220;<em>Nos interesa lo que tengas que decir</em>&#8221; / etc&#8230; </p>
<p>Lo fundamental es que sientan que realmente quieres oirles, que su comentario tiene un valor para el blog.</p>
<h2>Cuidar el Diseño</h2>
<p>Todos sabemos que el diseño es fundamental para el éxito de un blog. Hay que equilibrar siempre la estética con la usabilidad, y todo esto respetando estándares&#8230;</p>
<p>El theme de nuestro blog puede ser decisivo para obtener comentarios, o quedarnos en la más absoluta soledad. Algunas recomendaciones para conseguir comentarios pueden ser:</p>
<p><strong>No ocultarlos</strong><br />
Dejar un comentario ha de ser la tarea más fácil del mundo para el usuario. No tiene que encontrar trabas, y cuantos menos campos rellene mejor. Lo fundamental es que los comentarios sean como una prolongación del post, la reacción natural a haber acabado de leer.</p>
<p><strong>Facilitar lectura de comentarios</strong><br />
Los usuarios van a gastar parte de su tiempo en escribir un texto en tu blog, lo justo es que su mensaje quede claro, visible, y bien colocado. Una buena referencia al comentarista, con su web bien accesible, una fuente y unos colores que hagan fácil la lectura, y evitar recargar mucho esta zona.</p>
<p><strong>Distinguir lo uno de lo otro</strong><br />
Algo que facilita mucho la lectura es el sistema de &#8220;<em>uno sí uno no</em>&#8221; en la lista de comentarios. Es decir, distinguir los comentarios pares de los impares. </p>
<p>Así conseguimos facilitar la lectura, y además dar un toque un poco más personal a cada comentario. No es lo mismo que tu comentario sea igual que el resto, a que se diferencie de sus adyacentes.</p>
<p>También resulta interesante diferenciar pingbacks y trackbacks, dándoles un poco menos de importancia (pero manteniéndolos presentes)</p>
<p>Para hacer estas dos últimas cosas en wordpress, aquí tienes un script para el archivo comments.php del theme que estés usando. (Si no conoces algo de PHP y HTML, haz copias de seguridad, no vaya a ser que montes un estropicio)</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span> <span class="re0">$oddcomment</span> = <span class="st0">&quot;odd&quot;</span>; <span class="kw2">?&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span> <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$comments</span> <span class="kw1">as</span> <span class="re0">$comment</span><span class="br0">&#41;</span> : <span class="kw2">?&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">&lt;?php</span> <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$comment</span>-&gt;<span class="me1">comment_type</span> == <span class="st0">&quot;pingback&quot;</span> || <a href="http://www.php.net/ereg"><span class="kw3">ereg</span></a><span class="br0">&#40;</span><span class="st0">&quot;&lt;pingback /&gt;&quot;</span>, <span class="re0">$comment</span>-&gt;<span class="me1">comment_content</span><span class="br0">&#41;</span> || <a href="http://www.php.net/ereg"><span class="kw3">ereg</span></a><span class="br0">&#40;</span><span class="st0">&quot;&lt;trackback /&gt;&quot;</span>, <span class="re0">$comment</span>-&gt;<span class="me1">comment_content</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><span class="kw2">?&gt;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &lt;div <span class="kw2">class</span>=<span class="st0">&quot;ping&quot;</span>&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">&lt;?php</span> <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><span class="kw2">?&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &lt;div <span class="kw2">class</span>=<span class="st0">&quot;&lt;?php echo $oddcomment; ?&gt;&quot;</span>&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">&lt;?php</span> <span class="coMULTI">/* Changes every other comment to a different class */</span>&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="st0">&quot;odd&quot;</span> == <span class="re0">$oddcomment</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="re0">$oddcomment</span>=<span class="st0">&quot;even&quot;</span>;<span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span> <span class="re0">$oddcomment</span>=<span class="st0">&quot;odd&quot;</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">?&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">&lt;?php</span> <span class="br0">&#125;</span> <span class="kw2">?&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &lt;a name=<span class="st0">&quot;comment-&lt;?php comment_ID() ?&gt;&quot;</span>&gt;&lt;/a&gt;&lt;strong <span class="kw2">class</span>=<span class="st0">&quot;author&quot;</span>&gt;&lt;?php comment_author_link<span class="br0">&#40;</span><span class="br0">&#41;</span> ?&gt;&lt;/strong&gt; <span class="kw2">&lt;?php</span> comment_date<span class="br0">&#40;</span><span class="st0">&#8216;j <span class="es0">\d</span><span class="es0">\e</span> F&#8217;</span><span class="br0">&#41;</span> <span class="kw2">?&gt;</span> a las <span class="kw2">&lt;?php</span> comment_time<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw2">?&gt;</span> <span class="kw2">&lt;?php</span> edit_comment_link<span class="br0">&#40;</span><span class="st0">&#8216;Editar&#8217;</span>,<span class="st0">&#8221;</span>,<span class="st0">&#8221;</span><span class="br0">&#41;</span>; <span class="kw2">?&gt;</span> Ha dicho:</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">&lt;?php</span> comment_text<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw2">?&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &lt;/div&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">&lt;?php</span> <span class="kw1">endforeach</span>; <span class="coMULTI">/* end for each comment */</span> <span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>Ahora puedes dar el estilo que quieras en el archivo <em>style.css</em> a las clases <strong>.ping</strong> (para pingbacks y trackbacks), <strong>.odd</strong> (impares) y <strong>.even</strong> (pares).</p>
<h2>Hasta el último detalle</h2>
<p>Si quieres conseguir más posibilidades de fomentar comentarios, puedes recurrir por último a plugins. </p>
<p>Hay multitud de plugins orientados a los comentarios de nuestro blog. Yo destacaré dos, con enlaces para wordpress, pero puedes buscar tú mismo los que más te convenzan, y se adapten a tu blog.</p>
<p><strong>Últimos comentarios</strong><br />
Con este plugin puedes motivar a tus comentaristas, porque verán su texto expuesto en lugares muy visibles de la web. También puede servir para enganchar a un lector ocasional a algun hilo interesante que se haya generado en los comentarios.<br />
[<a href="http://www.pfadvice.com/wordpress-plugins/show-top-commentators/">Descargar plugin</a>]</p>
<p><strong>Premiar por comentarios</strong><br />
Otra forma de motivar a los usuarios a comentar, es premiándoles por sus comentarios. Para esto existe el plugin RPG WordPress creado por nuestro amigo Miquel Camps. Con este plugin puedes recompensar a tus usuarios cada x comentarios, con enlaces en un lugar importante de tu blog, a lo que el usuario en cuestión decida. Una buena idea para crear comunidad.<br />
[<a href="http://www.viciao2k3.net/blog/wordpress/%c2%bfcomo-conseguir-comentarios-en-tu-blog/">Descargar plugin</a>]</p>
<p>Por supuesto que la mejor forma de que se comente en tu blog es <strong>crear un contenido de calidad</strong>, <strong>implicarte</strong> diariamente, conseguir <strong>enlaces</strong>, etc. </p>
<p>Por descontado, si este artículo os ha gustado, no dudéis en <strong>comentarlo</strong>! <img src='http://boozox.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/php/comentarios-en-nuestro-blog/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sencillo sistema AntiBot en PHP con preguntas</title>
		<link>http://boozox.net/php/sencillo-sistema-antibot-en-php-con-preguntas/</link>
		<comments>http://boozox.net/php/sencillo-sistema-antibot-en-php-con-preguntas/#comments</comments>
		<pubDate>Mon, 01 Oct 2007 18:48:53 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Aplicaciones]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[HOWTO/CóMO]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Software libre]]></category>

		<guid isPermaLink="false">http://boozox.net/sin-categoria/sencillo-sistema-antibot-en-php-con-preguntas/</guid>
		<description><![CDATA[Seguramente ya conoceréis el clásico sistema Anti Robots que consiste en hacer una pregunta que requiera del &#8220;razonamiento humano&#8220;. Este sistema puede ser construido de una forma sencillísima con PHP, y os muestro cómo: Nuestra base de datos de preguntas y respuestas será un simple array. Además usaremos las sesiones, para verificar la respuesta en [...]]]></description>
			<content:encoded><![CDATA[<p>Seguramente ya conoceréis el clásico sistema <strong>Anti Robots</strong> que consiste en hacer una pregunta que requiera del &#8220;<em>razonamiento humano</em>&#8220;. Este sistema puede ser construido de una forma sencillísima con PHP, y os muestro cómo:</p>
<p>Nuestra base de datos de preguntas y respuestas será un <strong>simple array</strong>. Además usaremos las sesiones, para verificar la respuesta en el archivo de chequeo.</p>
<p>El array de preguntas y respuestas contendrá una pregunta <em>clara y legible para los humanos</em>, y una respuesta a modo de expresión regular, para considerar las variantes de respuesta. Por ejemplo:</p>
<p><strong>Pregunta</strong>: ¿Cuántos dedos tiene una mano?<br />
<strong>Respuesta</strong>: (5|cinco) // acepta mayúsculas y minúsculas</p>
<p>Una vez declarado esto, seleccionaremos una pregunta <em>al azar</em>, con la función <a href="http://es.php.net/manual/es/function.rand.php">rand</a>(). La parte de pregunta la imprimiremos por pantalla en el lugar adecuado junto a un campo de texto. </p>
<p>Lo siguiente es guardar la expresión regular que contiene la respuesta en una variable de sesión, para que quede accesible en el chequeo a continuación.</p>
<p>Por último, en el archivo de chequeo usaremos la función de que evalua expresiones regulares <a href="http://es.php.net/manual/es/function.eregi.php">eregi</a>(), sometiendo la respuesta del campo de texto a la expresión regular almacenada en sesión.</p>
<p>El concepto ya está definido, y es tan simple como eso. Ahora plasmémoslo en esas bonitas letras de colores que son el código:</p>
<p><strong>En el archivo del formulario:</strong></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><a href="http://www.php.net/session_start"><span class="kw3">session_start</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">//Al principio del todo!!!</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$preguntas</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$preguntas</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&#8216;Cuantos dedos tiene una mano?&#8217;</span>,<span class="st0">&#8216;(5|cinco)&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$preguntas</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&#8216;Resultado de sumar 2 y 4?&#8217;</span>,<span class="st0">&#8216;(6|seis)&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$preguntas</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&#8216;Cuantas ruedas tiene un coche?&#8217;</span>,<span class="st0">&#8216;(4|cuatro)&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$preguntas</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&#8216;Que animal es mas grande: elefante o caracol?&#8217;</span>,<span class="st0">&#8216;(primero|elefante)&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$preguntas</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&#8216;Cual es el color mas oscuro de todos?&#8217;</span>,<span class="st0">&#8216;negro&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$preguntas</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&#8216;Por favor, contesta: eres humano?&#8217;</span>,<span class="st0">&#8216;(si|claro)&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$preguntas</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&#8216;Con que mano escribe un zurdo?&#8217;</span>,<span class="st0">&#8216;(izquierda)&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$preguntas</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&#8216;Escribe pan dos veces.&#8217;</span>,<span class="st0">&#8216;^pan ?pan$&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// puedes escribir todas las que quieras</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$pregn</span> = <a href="http://www.php.net/rand"><span class="kw3">rand</span></a><span class="br0">&#40;</span><span class="nu0">0</span>,<span class="br0">&#40;</span><a href="http://www.php.net/count"><span class="kw3">count</span></a><span class="br0">&#40;</span><span class="re0">$preguntas</span><span class="br0">&#41;</span><span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>; <span class="co1">// numero al azar</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$_SESSION</span><span class="br0">&#91;</span><span class="st0">&#8216;pregregex&#8217;</span><span class="br0">&#93;</span> = <span class="re0">$preguntas</span><span class="br0">&#91;</span><span class="re0">$pregn</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>; <span class="co1">// Lo guardo en sesion</span></div>
</li>
<li class="li2">
<div class="de2"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&#8216;&lt;/p&gt;&#8217;</span>.<span class="re0">$preguntas</span><span class="br0">&#91;</span><span class="re0">$pregn</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>.<span class="st0">&#8216;&lt;/p&gt;&lt;br&gt;&lt;input type=&quot;text&quot; name=&quot;respuesta&quot; /&gt;&#8217;</span>;</div>
</li>
</ol>
</div>
<p><strong>Y en el archivo de chequeo:</strong></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><a href="http://www.php.net/session_start"><span class="kw3">session_start</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$_SESSION</span><span class="br0">&#91;</span><span class="st0">&#8216;pregregex&#8217;</span><span class="br0">&#93;</span> AND <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">&#8216;respuesta&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><a href="http://www.php.net/eregi"><span class="kw3">eregi</span></a><span class="br0">&#40;</span><span class="re0">$_SESSION</span><span class="br0">&#91;</span><span class="st0">&#8216;pregregex&#8217;</span><span class="br0">&#93;</span>,<span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">&#8216;respuesta&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;De acuerdo, no eres un robot&#8230;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Solo Bender puede superarte a robot !&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/unset"><span class="kw3">unset</span></a><span class="br0">&#40;</span><span class="re0">$_SESSION</span><span class="br0">&#91;</span><span class="st0">&#8216;pregregex&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p><strong>Inconvenientes:</strong></p>
<ul>
<li>El idioma importa (a no ser que sean preguntas aritmeticas)</li>
<li>Puedes toparte con una mente brillante, que le de por contestarte lo que no es</li>
<li>&#8230;ninguno más, que yo sepa&#8230; pregúntale a un robot.</li>
</ul>
<p>Podéis probar su funcionamiento en directo desde <a href="http://boozox.net/jaula/anti-bot.php">este ejemplo</a>.</p>
<p>Descargar ejemplo:<br />
<a href="http://www.viciao2k3.net/services/tagfile/link.php?url=http://boozox.net/jaula/anti-bot.zip" target="_blank"><img src="http://www.viciao2k3.net/services/tagfile/widget.php?url=http://boozox.net/jaula/anti-bot.zip&#038;bg=B9DFE6&#038;fc=000000&#038;lang=ES" alt="anti-bot.zip" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/php/sencillo-sistema-antibot-en-php-con-preguntas/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>&#8220;Escalado Líquido&#8221; para Gimp 2.2+ ya disponible como plugin</title>
		<link>http://boozox.net/software-libre/escalado-liquido-para-gimp-22-ya-disponible-como-plugin/</link>
		<comments>http://boozox.net/software-libre/escalado-liquido-para-gimp-22-ya-disponible-como-plugin/#comments</comments>
		<pubDate>Mon, 01 Oct 2007 13:09:28 +0000</pubDate>
		<dc:creator>José Cabo</dc:creator>
				<category><![CDATA[Diseño]]></category>
		<category><![CDATA[HOWTO/CóMO]]></category>
		<category><![CDATA[Imagen Digital]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Software libre]]></category>

		<guid isPermaLink="false">http://boozox.net/software-libre/escalado-liquido-para-gimp-22-ya-disponible-como-plugin/</guid>
		<description><![CDATA[Estoy seguro de que muchos de vosotros ya conoceréis un algoritmo para escalar imágenes casi sin deformar las figuras (personas, arboles, suelo&#8230;). Para los que no lo conozcáis, aquí un vídeo demostrativo: Pues para los usuarios de Gimp ya tenemos a nuestra disposición el algoritmo en forma de Plugin para poder usarlo a nuestro antojo. [...]]]></description>
			<content:encoded><![CDATA[<p>Estoy seguro de que muchos de vosotros ya conoceréis un algoritmo para escalar imágenes casi sin deformar las figuras (personas, arboles, suelo&#8230;). Para los que no lo conozcáis, aquí un vídeo demostrativo:</p>
<p style="text-align:center;">
<object width="425" height="350" type="application/x-shockwave-flash" data="http://www.youtube.com/v/6NcIJXTlugc"><param name="movie" value="http://www.youtube.com/v/6NcIJXTlugc" /></object>
</p>
<p>Pues <strong>para los usuarios de Gimp</strong> ya tenemos a nuestra disposición el algoritmo en forma de <strong>Plugin</strong> para poder usarlo a nuestro antojo. <a href="http://registry.gimp.org/plugin?id=10292">Aquí</a> tenéis algunos binarios para instalar en Ubuntu así como <a href="http://registry.gimp.org/file/gimp-lqr-plugin-0.2.1.tar.gz?action=download&#038;id=10295">el código fuente</a> para compilar en nuestra distribución de Linux favorita (./configure &#038;&#038; make &#038;&#038; sudo make install o sudo checkinstall).</p>
<p>El manejo es muy fácil. Una vez instalado el plugin abrimos en Gimp nuestra imagen que queremos retocar y <strong>nos vamos a la pestaña &#8220;Capas/Liquid Rescale&#8221;</strong>. En la nueva ventana simplemente <strong>ponemos la nueva resolución</strong> (podemos mirar en Advanced Options que hay más opciones, pero el &#8220;modo&#8221; que mejor me ha ido ha sido el que viene por defecto [transversal Absolute Value], así que mejor no tocar nada excepto si queremos probar los resultados) <strong>y le damos a &#8220;Aceptar&#8221;</strong>. Si la imagen es muy grande&#8230;. tardará un rato bastante (un minuto en hacer todos los procesos&#8230;), pero si es, por ejemplo, 1024 de anchura no creo que haya que esperar mucho tampoco.</p>
<p>Funciona bastante bien, un poco lento, pero cumple con su trabajo. Aunque no es perfecto el acabado está muy conseguido y mantiene prácticamente iguales las formas y figuras. Un ejemplo:</p>
<p>Original:<br />
<img src='http://boozox.net/wp-content/originalthumb.jpg' alt='originlthumb.jpg' /></p>
<p>En esta siguiente tenemos la imagen de arriba retocada. <strong>La primera es escalada tal cual</strong>; la segunda <strong>usando el plugin Liquid Rescale</strong> con las mismas medidas que la 1ª y con las opciones predefinidas; la tercera se ha <strong>hecho usando capas</strong> (creadas previamente y seleccionando que es lo que queremos que se escale y que es lo que &#8220;nos daría igual&#8221;, todo gestionado desde el plugin).</p>
<p style="text-align:center; border:none;">
<img src='http://boozox.net/wp-content/total-thump.jpg' alt='total-thump.jpg' /></p>
<p><strong>En definitiva, una verdadera maravilla.</strong></p>
<p><em><strong>Añadido a las 18:33 por Alex Barros</strong></em><br />
Al respecto también hay una web que aplica este filtro de forma online, aúnque con bastante lentitud, y problemas con archivos grandes (<a href="http://rsizr.com/">http://rsizr.com/</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/software-libre/escalado-liquido-para-gimp-22-ya-disponible-como-plugin/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Solución a dos pesadillas del CSS</title>
		<link>http://boozox.net/howtocomo/solucion-a-dos-pesadillas-del-css/</link>
		<comments>http://boozox.net/howtocomo/solucion-a-dos-pesadillas-del-css/#comments</comments>
		<pubDate>Sun, 30 Sep 2007 16:12:58 +0000</pubDate>
		<dc:creator>Alex Barros</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Diseño]]></category>
		<category><![CDATA[HOWTO/CóMO]]></category>

		<guid isPermaLink="false">http://boozox.net/boozox/solucion-a-dos-pesadillas-del-css/</guid>
		<description><![CDATA[Hoy he encontrado del tirón, en un mismo blog, la solución a dos de mis mayores pesadillas en la maquetación CSS. #1: Float y Clear Cuando queremos desplazar un elemento a la izquierda o a la derecha, solemos usar la propiedad float, que saca al elemento del flujo de contenido y lo desplaza a donde [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy he encontrado del tirón, en un mismo blog, la solución a dos de mis mayores pesadillas en la maquetación CSS.</p>
<p><strong>#1: Float y Clear</strong><br />
Cuando queremos desplazar un elemento a la izquierda o a la derecha, solemos usar la propiedad <em>float,</em> que saca al elemento del flujo de contenido y lo desplaza a donde queramos.</p>
<p>El problema viene cuando este elemento tiene un elemento padre (que lo contiene) y queremos que lo envuelva. </p>
<p><em>Esto es lo que yo quiero:</em><br />
<img src='http://boozox.net/wp-content/float_lo_q_quiero.gif' alt='float_lo_q_quiero.gif' /><br />
<em>Y esto lo que obtengo:</em><br />
<img src='http://boozox.net/wp-content/float_lo_q_obtengo.gif' alt='float_lo_q_obtengo.gif' /></p>
<p>(He de aclarar que no se trata de ningún error, sinó que el estándar CSS especifica su comportamiento de esta forma)</p>
<p>La solución tradicional es incluir un tercer div a continuación de los dos flotantes, y aplicarle la propiedad clear:both, pero esto nos hace meter un div sin razón de ser, y nos hace la página un poco menos semántica.</p>
<p>La solución que he encontrado ahora, mucho mejor, es aplicar al elemento padre la propiedad overflow:hidden. De esta forma evitamos tener que meter elementos y toquetear el flujo (que a veces trae problemas) y obtenemos el resultado deseado.</p>
<p>[<a href="http://www.planseldon.com/blog/hasta-siempre-clearboth/">para profundizar un poco más en este tema...</a>]</p>
<p><strong>#2: El marquito de los enlaces</strong><br />
Otro problema que encontraba, aúnque menos grave, era el marquito que aparece en los enlaces cuando pulsas en ellos, símplemente me parece antiestético.</p>
<p><a href="#ningunaparte" style="font-size:1.5em;" onClick="this.style.outline = '1px dotted #000';return false;">Clica aquí para verlo</a></p>
<p>Esta propiedad es outline, y podemos bloquearla simplemente introduciendo en nuestra hoja de estilos el siguiente código:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">a <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">outline-style</span>: <span class="kw2">none</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>[<a href="http://www.planseldon.com/blog/contornos-en-css-la-propiedad-outline/">para profundizar un poco más en este tema...</a>]</p>
<p>Ambas soluciones magistrales las he encontrado en el blog <a href="http://www.planseldon.com/blog/">PlanSeldon.com</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://boozox.net/howtocomo/solucion-a-dos-pesadillas-del-css/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

