<?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>Como Lo Hago &#187; Diseño Web</title>
	<atom:link href="http://www.comolohago.cl/category/diseno-web/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.comolohago.cl</link>
	<description>Si se puede, te lo enseñamos</description>
	<lastBuildDate>Tue, 10 Jan 2012 16:56:56 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Cómo hacer un gadget en Windows 7</title>
		<link>http://www.comolohago.cl/2010/08/09/como-hacer-un-gadget-en-windows-7-2/</link>
		<comments>http://www.comolohago.cl/2010/08/09/como-hacer-un-gadget-en-windows-7-2/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 02:22:32 +0000</pubDate>
		<dc:creator>Cri</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[Gadget]]></category>
		<category><![CDATA[sidebar]]></category>
		<category><![CDATA[windows 7]]></category>

		<guid isPermaLink="false">http://www.comolohago.cl/?p=3803</guid>
		<description><![CDATA[
 
Hola   amigos de Cómo Lo Hago, tratando de sorprenderlos día a día nos empeñamos en poder crear nuevos tutoriales y ayudarlos en adquirir un mayor conocimiento como también desenvolverse dentro de un nuevo tipo de desarrollo. Esta vez será la ocasión de crear un Gadget el cual nos puede servir para una [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><img class="alignnone" src="http://farm5.static.flickr.com/4076/4878538776_56444ce8d5.jpg" alt="" width="500" height="260" /></p>
<p style="text-align: justify;"><strong> </strong></p>
<p style="text-align: justify;">Hola   amigos de Cómo Lo Hago, tratando de sorprenderlos día a día nos empeñamos en poder crear nuevos tutoriales y ayudarlos en adquirir un mayor conocimiento como también desenvolverse dentro de un nuevo tipo de desarrollo. Esta vez será la ocasión de crear un <strong><em>Gadget</em></strong> el cual nos puede servir para una infinidad de cosas dependiendo del uso que le queramos dar, en este caso veremos como hacer uno con alimentacion RSS de los tutoriales que se hacen en CómoLoHago. Partiendo por una cosa, es muy importante recalcar que no hay que ser programador para poder realizar este tuto, pero sí tener harta paciencia para darle al clavo. Los invito a seguir en este entretenido tuto como siempre despues del salto&#8230;</p>
<p style="text-align: justify;"><span id="more-3803"></span></p>
<p style="text-align: justify;"><img title="Más..." src="http://www.comolohago.cl/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /></p>
<p style="text-align: justify;"><strong> </strong></p>
<p style="text-align: justify;"><strong> </strong></p>
<p style="text-align: justify;"><strong> </strong></p>
<h1 style="text-align: center;">Cómo hacer un gadget en Windows 7</h1>
<p style="text-align: justify;">1.  ¿Qué  necesitamos?</p>
<ul style="text-align: justify;">
<li>Sistema operativo Windows 7</li>
<li>Aprender un poco de HTML + CSS. Para esto puede recurrir a los siguientes tutoriales</li>
</ul>
<ol>
<li><a href="http://www.comolohago.cl/2010/02/11/como-convertirse-en-un-campeon-de-html-parte-1/">Aprender HTML</a><em><br />
</em></li>
<li><a href="http://www.comolohago.cl/2009/02/01/como-dominar-css-sin-salir-del-escritorio-parte-1/">Aprende CSS</a><em><br />
</em></li>
</ol>
<h2 style="text-align: justify;">2.  ¿Cómo  lo hago?</h2>
<p style="text-align: justify;"><strong>1. </strong>Manos a la obra, primero a buscar donde tenemos nuestros <strong><em>Gadgets</em></strong> los cuales se encontrarán siempre por <em>default</em> en <strong><em>Archivos de programa&gt;Windows Sidebar&gt;Gadgets</em></strong>. Una vez ubicados en esta carpeta procederemos a crear la carpta contenedora de nuestro futuro Gadget por desarrollar. Es muy importante que la extensión del nombre sea así:</p>
<p style="text-align: justify;"><strong>NOMBREDEMIGADGET.Gadget</strong></p>
<p style="text-align: justify;"><strong> </strong> <img class="alignnone" src="http://farm5.static.flickr.com/4094/4877930213_23b99c9738_z.jpg" alt="" width="640" height="493" /></p>
<p style="text-align: justify;"><strong>2. </strong>Una vez creada nuestra carpeta contenedora necesitaremos algunos archivos indispensables para poder personalisar y a la vez desarrollar:</p>
<p><img src="http://farm5.static.flickr.com/4082/4877930397_912a5736e3_z.jpg" alt="" width="640" height="493" /></p>
<ul style="text-align: justify;">
<li><em>MiGadget.html: Contiene el código principal para los ajustes de color, fondo, letras, links, feeders, etc</em>.</li>
</ul>
<blockquote style="text-align: justify;"><address>&lt;html xmlns=&#8221;http://www.w3.org/1999/xhtml&#8221;&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=iso-8859-1&#8243; /&gt;<br />
&lt;title&gt;ComoLoHago mi primer gadget&lt;/title&gt;<br />
&lt;!&#8211; Para llamar a nuestros Settings.js del gadget &#8211;&gt;<br />
&lt;script type=&#8221;text/javascript&#8221; src=&#8221;MiGadget.js&#8221;&gt;&lt;/script&gt;<br />
&lt;style type=&#8221;text/css&#8221;&gt;<br />
/*/ El cuerpo de nuestro Gadget /*/<br />
body<br />
{</address>
<address>width: 330px;<br />
height: 450px;<br />
font-family: verdana;<br />
font-weight: lighter;<br />
margin:0px;<br />
font-size: 10px;<br />
overflow-x:hidden;<br />
overflow-y:auto;<br />
background-color:#333333;<br />
scrollbar-face-color:#444444; /*/ Color del cuadro /*/<br />
scrollbar-arrow-color:#999999; /*/ Color de la flecha de nuestro scroll /*/<br />
scrollbar-track-color:#333333;  /*/ Color de la vía donde se mueve el scroll /*/<br />
scrollbar-highlight-color:#444444; /*/ Si queremos color desde un ángulo /*/<br />
scrollbar-darkshadow-color:#444444; /*/Color opuesto al lugar al Highlight-Color /*/<br />
scrollbar-shadow-color:#444444; /*/ Si queremos sombra /*/<br />
scrollbar-3dlight-color:#444444;  /*/ Si queremos color de luz 3d /*/</address>
<address>}</address>
<address>#ContenidoDeMiGadget</address>
<address>/*/Aqui se encuentra parte del contenido que se alimentará dentro de nuestro gadget/*/<br />
{</address>
<address>width: 318px;<br />
margin-left:1px;<br />
height:100px;<br />
vertical-align: middle;<br />
text-align:center;<br />
background-color:#333333;</address>
<address>}</address>
<address>/*/ Este es el codigo especial para poder editar todo dentro del contenido rss /*/<br />
/*/ ya sea colores de letras, colores de fondo, bordes, etc/*/</address>
<address>/*/1-Con esto le indicamos al contenido el ancho que ocupará/*/</address>
<address>.rssxpresschannel { width:318px; font-family: Verdana; }</address>
<address>.rssxpresstable {height:200px; width:318px;}</address>
<address>/*/2-Con esto le indicamos al subtitulo &#8220;Sí se puede, te lo enseñamos&#8221; lo que queremos/*/</address>
<address>.rssxpresschdesc {font-size:10px; background-color:#333333; color:99BBFF; font-style:italic;}</address>
<address>/*/3-Con esto le indicamos al título &#8220;Como Lo Hago&#8221; lo que queremos/*/</address>
<address>.rssxpresschtitle  {font-size:12px; font-family:Arial; color:#99BBFF;  background-color:#333333; background-position:right;  background-image:url(logo.png); background-repeat:no-repeat;  height:69px; width:88px;margin-top:10px;}</address>
<address>/*/4-Con esto le indicamos al título de cada tema lo que queremos/*/</address>
<address>.rssxpressittitle  {font-size:10px; margin-right:5px; background-color:#333333;  border-top-style:inset; border-top-color:#999999; border-width:thin; }</address>
<address>/*/5-Con esto le indicamos a la descripcion de cada contenido lo que queremos/*/</address>
<address>.rssxpressitdesc  {font-size:10px; background-color:#333333; color:#FFFFFF;  margin-top:5px; margin-bottom:5px; font-weight:lighter; }</address>
<address>A:link {text-decoration:none;color:#99BBFF;}</address>
<address>A:visited {text-decoration:none;color:#99BBFF;}</address>
<address>A:active {text-decoration:none;color:#99BBFF;}</address>
<address>A:hover {text-decoration:none;color:#00BBFF;}</address>
<address>&lt;/style&gt;<br />
&lt;/head&gt;</address>
<address>&lt;b style=&#8221;margin-left:210px&#8221; style=&#8221;color:#555555&#8243;&gt;ComoLoHago v1.0&lt;/b&gt;<br />
&lt;body&gt;<br />
&lt;!&#8211;Contenido de mi gadget&#8211;&gt;<br />
&lt;div id=&#8221;ContenidoDeMiGadget&#8221;&gt;<br />
&lt;!&#8211;Script alimentador del contenido Rss&#8211;&gt;<br />
&lt;script src=&#8221;http://rssxpress.ukoln.ac.uk/lite/viewer/?rss=http%3A%2F%2Fwww.comolohago.cl%2Ffeed&#8221;&gt;&lt;/script&gt;<br />
&lt;/div&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
</address>
</blockquote>
<ul style="text-align: justify;">
<li><em>Settings.html: Contiene el código para los ajustes de nuestro Gadget</em>.</li>
</ul>
<blockquote style="text-align: justify;"><address style="text-align: justify;">&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=iso-8859-1&#8243; /&gt;<br />
&lt;style type=&#8221;text/css&#8221;&gt;</p>
<p>body<br />
{</p>
</address>
<address style="text-align: justify;">/*/ ancho y alto de nuestro menu de ajustes /*/<br />
width:300px;<br />
height:250px;<br />
}</p>
<p>/*/un poco de CSS /*/<br />
#L_settingsTitle<br />
{<br />
font-family:Arial;<br />
font-size:15px;<br />
color:#FF0000;<br />
}</p>
<p>#L_settingsTitleLabel<br />
{<br />
font-family:Arial;<br />
font-size:8px;<br />
font-style:italic;<br />
color:#000000;<br />
}</p>
<p>&lt;/style&gt;</p>
<p>&lt;script type=&#8221;text/javascript&#8221; src=&#8221;MiGadget.js&#8221;&gt; &lt;/script&gt;</p>
<p>&lt;/head&gt;</p>
<p>&lt;body&gt;<br />
&lt;p&gt;Aqui agregan su contenido&lt;/p&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
</address>
</blockquote>
<ul style="text-align: justify;">
<li><em>MiGadget.js: Contiene el código especial para poder tener ajustes en nuestro Gadget.</em></li>
</ul>
<blockquote style="text-align: justify;"><address>// Importantisimo para poder tener los ajustes de nuestro Gadget<br />
</address>
<address>System.Gadget.settingsUI = &#8220;Settings.html&#8221;;</address>
<address>System.Gadget.onSettingsClosing = SettingsClosing;</address>
<p style="text-align: justify;">
</blockquote>
<ul style="text-align: justify;">
<li><em>Gadget.xml: Contiene el autor, nombre, descripción, ícono, logo. En sí es lo necesario para aparecer en el menú para seleccionar el Gadget</em>.</li>
</ul>
<blockquote style="text-align: justify;"><address>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243; ?&gt;</address>
<address>&lt;gadget&gt;</address>
<address> &lt;name&gt;CómoLoHago &#8211; Novedades&lt;/name&gt;</address>
<address> &lt;version&gt;1.0&lt;/version&gt;</address>
<address> &lt;author name=&#8221;CómoLoHago Team&#8221;&gt;</address>
<address> &lt;info url=&#8221;www.ComoLoHago.cl&#8221; /&gt;</address>
<address> &lt;/author&gt;</address>
<address> &lt;copyright&gt;&amp;#169; CómoLoHago 2010&lt;/copyright&gt;</address>
<address> &lt;description&gt;Novedades acerca de tutoriales nuevos en tu escritorio&lt;/description&gt;</address>
<address> &lt;icons&gt;</address>
<address> &lt;icon height=&#8221;48&#8243; width=&#8221;48&#8243; src=&#8221;icono.png&#8221;/&gt;</address>
<address> &lt;/icons&gt;</address>
<address> &lt;hosts&gt;</address>
<address> &lt;host name=&#8221;sidebar&#8221;&gt;</address>
<address> &lt;autoscaleDPI&gt;true&lt;/autoscaleDPI&gt;</address>
<address> &lt;base type=&#8221;HTML&#8221; apiVersion=&#8221;1.0.0&#8243; src=&#8221;MiGadget.html&#8221; /&gt;</address>
<address> &lt;permissions&gt;Full&lt;/permissions&gt;</address>
<address> &lt;platform minPlatformVersion=&#8221;1.0&#8243; /&gt;</address>
<address> &lt;defaultImage src=&#8221;imagenarrastrada.png&#8221;/&gt;</address>
<address> &lt;/host&gt;</address>
<address> &lt;/hosts&gt;</address>
<address>&lt;/gadget&gt;</address>
</blockquote>
<p style="text-align: justify;"><strong>2. </strong>La flecha blanca indica el ícono que aparecerá en el menú de <em><strong>Gadgets</strong></em>. Este ícono <em>(icono.png)</em> se direcciona desde nuestro archivo XML, en este caso Gadget.xml. También podemos agregar otra imagen para cuando arrastremos nuestro <em><strong>Gadget</strong></em> al escritorio <em>(imagenarrastrada.png)</em>.</p>
<p style="text-align: justify;"><img class="alignnone" src="http://farm5.static.flickr.com/4100/4878539210_3d1179ddee.jpg" alt="" width="500" height="260" /></p>
<p style="text-align: justify;"><img class="alignnone" src="http://farm5.static.flickr.com/4081/4878539308_5af141246a.jpg" alt="" width="500" height="260" /></p>
<p style="text-align: justify;"><strong>3. </strong>Finalmente nos podemos dar cuenta que nuestro <strong><em>Gadget</em></strong> va adquiriendo la forma que le damos con CSS y HTML ademas de las programaciones que cada uno le dé en javascript.</p>
<p style="text-align: justify;">Para poder mostrar el contenido RSS, tuve que recurrir a la página <a href="http://rssxpress.ukoln.ac.uk/lite/include/?t=1" target="_blank">http://rssxpress.ukoln.ac.uk/lite/include/?t=1</a> para obtener el script feeder el cual va inserto en <strong><em>MiGadget.html</em></strong>:</p>
<p style="text-align: justify;"><img class="alignnone" src="http://farm5.static.flickr.com/4123/4877930675_981c161b84.jpg" alt="" width="358" height="463" /></p>
<p style="text-align: justify;"><img class="alignnone" src="http://farm5.static.flickr.com/4094/4877930725_0e4a769418.jpg" alt="" width="358" height="463" /></p>
<p style="text-align: justify;"><img class="alignnone" src="http://farm5.static.flickr.com/4102/4877930919_d251acf20b.jpg" alt="" width="358" height="463" /></p>
<p style="text-align: justify;">Espero    les haya gustado, les motive para hacer sus propias creaciones y así poder compartirlas con los demas. Me despido</p>
<p style="text-align: justify;">Como   siempre exclusivamente  ha sido:</p>
<p style="text-align: justify;"><img src="http://farm4.static.flickr.com/3043/3056524059_ed7150e191_o.jpg" alt="" /></p>
<p style="text-align: justify;"><strong>Staff  CLH</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.comolohago.cl/2010/08/09/como-hacer-un-gadget-en-windows-7-2/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Cómo utilizar la API de Google Maps</title>
		<link>http://www.comolohago.cl/2010/08/08/como-utilizar-la-api-de-google-maps/</link>
		<comments>http://www.comolohago.cl/2010/08/08/como-utilizar-la-api-de-google-maps/#comments</comments>
		<pubDate>Sun, 08 Aug 2010 19:08:10 +0000</pubDate>
		<dc:creator>Xabadu</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[api de google maps]]></category>
		<category><![CDATA[como implementar los mapas de google en mi web]]></category>
		<category><![CDATA[como usar google maps en mi web]]></category>
		<category><![CDATA[como usar la api de google maps]]></category>
		<category><![CDATA[como usar los mapas de google]]></category>
		<category><![CDATA[google maps]]></category>

		<guid isPermaLink="false">http://www.comolohago.cl/?p=3795</guid>
		<description><![CDATA[
Google Maps, el dominador absoluto a la hora de buscar locaciones alrededor del mundo, tiene disponible hace bastante tiempo una API que podemos integrar en nuestras aplicaciones y sitios Web de manera bastante sencilla. Con esto, podemos entregar funcionalidades bastante interesantes a nuestros usuarios e interactuar de una nueva forma para hacer que su experiencia [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" src="http://farm5.static.flickr.com/4095/4871861019_ded7409785.jpg" alt="" width="450" height="136" /></p>
<p style="text-align: justify;">Google Maps, el dominador absoluto a la hora de buscar locaciones alrededor del mundo, tiene disponible hace bastante tiempo una API que podemos integrar en nuestras aplicaciones y sitios Web de manera bastante sencilla. Con esto, podemos entregar funcionalidades bastante interesantes a nuestros usuarios e interactuar de una nueva forma para hacer que su experiencia en nuestros sitios sea aún mejor.</p>
<p style="text-align: justify;">Hoy, en un rápido y sencillo tutorial, veremos como hacer uso de esta API en un sitio Web cualquiera y desplegar mediante un mapa una ubicación indicada mediante georeferencia.</p>
<p style="text-align: justify;">Para el detalle, como siempre, vamos después del salto.</p>
<p style="text-align: justify;"><span id="more-3795"></span></p>
<h1 style="text-align: center;">Cómo utilizar la API de Google Maps</h1>
<blockquote>
<h2><img src="http://www.comolohago.cl/wp-content/uploads/2010/03/search_page.png" alt="" width="27" height="27" />Detalles del tutorial</h2>
<ul>
<li><strong>Tiempo    aproximado de implementación: </strong>10 min.</li>
<li><strong>Dificultad:</strong> Intermedio.</li>
<li><strong>Conocimientos previos:</strong> HTML, Javascript.</li>
</ul>
<h2><img title="tools" src="http://www.comolohago.cl/wp-content/uploads/2010/03/tools.png" alt="tools" />Implementos necesarios:</h2>
<ul>
<li>Una clave de la API de Google Maps <em>(pueden obtenerla <a href="http://code.google.com/apis/maps/signup.html" target="_blank">aquí</a>).</em></li>
<li>Una página Web para desplegar el mapa <em>(puede ser de forma local o en un hosting)</em>.</li>
</ul>
</blockquote>
<p style="text-align: justify;">
<h2 style="text-align: justify;">Implementación Básica:</h2>
<p style="text-align: justify;">1.- Lo primero que debemos hacer, para poder utilizar la API, es obtener una clave de uso en el sitio de Google Maps. Para eso, nos dirigimos al <a href="http://code.google.com/apis/maps/signup.html" target="_blank">sitio de inscripción</a> y completamos los datos requeridos:</p>
<p style="text-align: justify;"><img class="aligncenter" src="http://farm5.static.flickr.com/4117/4872522412_53a128975e_z.jpg" alt="" width="600" height="436" />En la parte inferior, debemos tickear la opción <strong>&#8220;I have read and agree with the terms and conditions</strong>&#8220;, y luego en el campo de texto que está a continuación ingresar la URL del sitio donde utilizaremos la API.</p>
<p style="text-align: justify;">Sobre esto último es bueno tener en cuenta un par de cosas:</p>
<ul>
<li>Una clave de API es única para un dominio y funcionará solo en este. Por ello, si tenemos un servidor de desarrollo <em>(por ejemplo localhost)</em> y uno de producción <em>(por ejemplo www.ejemplo.com)</em>, deberemos obtener 2 claves y utilizar una en cada caso, de lo contrario no funcionará.</li>
<li>Al ingresar la URL de nuestro sitio, lo mejor es ingresar la raíz del dominio <em>(http://dominio.com)</em>. De esta forma, la clave funcionará con todos los subdominios y directorios del sitio.</li>
</ul>
<p>2.- Si hemos cumplido los requerimientos, al hacer click en el botón <strong>Generate API Key</strong>, nos devolverá la clave para utilizar la API en nuestro dominio:</p>
<p><img class="aligncenter" src="http://farm5.static.flickr.com/4139/4872609234_ec9782775b_z.jpg" alt="" width="600" height="291" /></p>
<p>Con esto, ya estamos listos para utilizar la API en nuestro sitio.</p>
<p style="text-align: justify;">3.- Para ello, generaremos en primer lugar, un archivo HTML, el cual llamaremos <strong>ejemplo.html</strong>. Aquí, incluiremos mediante etiquetas <em>&lt;script&gt;</em>, la llamada a la API, incluyendo los parámetros y la clave. Esto, dentro del encabezado del HTML.</p>
<pre class="html" title="code">&lt;script src="http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;sensor=false&amp;amp;key=ABQIAAAAHhzikxCQyRAS8ryQoB75mRT2yXp_ZAY8_ufC3CFXhHIE1NvwkxQiqBRnE1Iky5sZfKGxzYbUanZ0HA" type="text/javascript"&gt;&lt;/script&gt;
</pre>
<p style="text-align: justify;">Los parámetros incluidos en la URL son:</p>
<ul>
<li><strong>file:</strong> Mediante esto, indicamos que estamos haciendo un llamado a la API.</li>
<li><strong>v:</strong> Indica la versión de la API que estamos utilizando <em>(la más reciente es la 3)</em>.</li>
<li><strong>sensor:</strong> Indica si la aplicación está utilizando o no un dispositivo para detectar la posición del usuario <em>(como un GPS)</em>. Como es una página, lo dejamos en falso.</li>
<li><strong>key:</strong> Indica la clave de uso de la API, que obtuvimos en el paso 1.</li>
</ul>
<p>4.- Ahora, también dentro del encabezado, crearemos una función en Javascript, la cual inicializará el mapa y lo desplegará, una vez que hagamos el llamado:</p>
<pre class="html" title="code">&lt;script type="text/javascript"&gt;

function inicializar() {

    if (GBrowserIsCompatible()) {
        var map = new GMap2(document.getElementById("map"));
        map.setCenter(new GLatLng(37.4419, -122.1419), 15);
    }
}

&lt;/script&gt;
</pre>
<p>Analizando la función escrita anteriormente, nos encontramos con varias cosas a las que debemos ponerle atención:</p>
<ul>
<li style="text-align: justify;">Lo primero que hacemos, es preguntar si el navegador es compatible con la API. Esto lo obtenemos mediante la función <strong>GBrowserIsCompatible</strong>. Solo si la respuesta es positiva, se procederá con el resto de los procesos.</li>
<li style="text-align: justify;">Luego, se crea una variable llamada <strong>map</strong>, en la cual se crea el nuevo objeto que será manipulado con los métodos de la API. Este objeto, hará referencia a un elemento del documento HTML con la id de <strong>map</strong>. Ahí es donde se mostrará el mapa.</li>
<li style="text-align: justify;">Y finalmente, definimos el punto en donde aparecerá el mapa por primera vez. Esto es mediante el método <strong>setCenter</strong>, al cual le pasamos un set de coordenadas mediante el objeto <strong>GLatLng, </strong>entregando una latitud y longitud.</li>
<li style="text-align: justify;">El último parámetro <em>(en este caso el 15)</em>, indica el nivel de zoom inicial que tendrá el mapa. Pueden ajustarlo a gusto.</li>
</ul>
<p style="text-align: justify;">5.- Una vez que tenemos nuestra función definida, solo nos falta hacer la llamada desde el cuerpo del documento HTML. Para ello, deberemos crear un div con una id de map <em>(Si recuerdan, el objeto está enlazado a esa id)</em> para poder desplegarlo. Dentro de ese div, haremos la llamada a la función.</p>
<pre class="html" title="code">&lt;div id="map" style="width:600px; height:600px"&gt;
&lt;script type="text/javascript"&gt;inicializar();&lt;/script&gt;
&lt;/div&gt;</pre>
<p style="text-align: justify;">Le hemos dado un ancho y alto de 600px al div para que pueda mostrar el mapa de manera óptima. Para efectos del ejemplo hemos ajustado estilos CSS dentro de la etiqueta, pero es ideal trabajar con archivos externos.</p>
<p style="text-align: justify;">Si abrimos el archivo en nuestro navegador, nos debería desplegar el mapa, con la ubicación centrada en Palo Alto, CA. Hasta aquí vamos muy bien, pero sería genial poder personalizarlo un poco más, ¿no?.</p>
<h2 style="text-align: justify;">Personalizando el mapa</h2>
<p style="text-align: justify;">6.- Lo primero que haremos, será cambiar la ubicación por defecto del mapa. Para esto, reemplazaremos el set de coordenadas que habíamos incluido en el método <strong>setCenter</strong>. Nos vamos a Google Maps y buscamos una dirección cualquiera:</p>
<p style="text-align: justify;"><img class="aligncenter" src="http://farm5.static.flickr.com/4143/4872707348_c8162ba21e_z.jpg" alt="" width="600" height="273" /></p>
<p style="text-align: justify;">En la parte superior, la opción <strong>Enlace</strong> nos entrega una URL completa de la ubicación, la cual incluye las coordenadas correspondientes a la latitud y longitud del lugar. Las copiamos y reemplazamos en el método setCenter para obtener un nuevo mapa al actualizar la página.</p>
<p style="text-align: justify;">7.- Google Maps nos permite añadir diferentes tipos de controles al mapa, que le permitirán al usuario final interactuar sin problemas con él. Entre los controles que podemos agregar, están:<strong> </strong></p>
<ul>
<li style="text-align: justify;"><strong><strong>GMapTypeControl:</strong> </strong>Permite controlar el tipo de mapa a mostrar <em>(entre mapa, satelite e híbrido)</em>.</li>
<li style="text-align: justify;"><strong>GLargeMapControl:</strong> Añade controles de movimiento para el mapa.</li>
<li style="text-align: justify;"><strong>GScaleControl:</strong> Añade controles de zoom para el mapa.</li>
<li style="text-align: justify;"><strong>GOverviewMapControl:</strong> Añade una pequeña sobrevista en la esquina inferior derecha.</li>
</ul>
<p>Para incluirlos, solo añadimos las siguientes líneas a nuestra función <strong>inicializar</strong>:</p>
<pre class="javascript" title="code">map.addControl(new GMapTypeControl());
map.addControl(new GLargeMapControl());
map.addControl(new GScaleControl());
map.addControl(new GOverviewMapControl());</pre>
<p>Y si ahora actualizamos el mapa, veremos que se añadieron nuevos controles.</p>
<p><img class="aligncenter" src="http://farm5.static.flickr.com/4097/4872789820_3115ccccc6_z.jpg" alt="" width="600" height="596" /></p>
<p>8.- ¿Qué nos falta?. Claramente, añadir una marca en la ubicación que estamos indicando en el mapa, de lo contrario solo veremos un gran cuadro sin nada que destacar.</p>
<p style="text-align: justify;">Para esto, haremos uso de 3 métodos: <strong>GLatLng</strong> para establecer la ubicación de la marca, <strong>GMarker</strong> para crear la marca en ese lugar y <strong>addOverlay</strong> para añadirla sobre el mapa. Por ello, debemos añadir el siguiente código a la función <strong>inicializar</strong>:</p>
<pre class="javascript" title="code">map.addOverlay(new GMarker(new GLatLng(-33.43795,-70.603627)));</pre>
<p style="text-align: justify;">Y si actualizamos el mapa, veremos un marcador de color rojo sobre la ubicación.</p>
<p style="text-align: justify;"><img class="aligncenter" src="http://farm5.static.flickr.com/4115/4872182665_d99de4bdde_z.jpg" alt="" width="600" height="590" /></p>
<p style="text-align: justify;">9.- Y ahora como detalle final, crearemos un pequeño texto de información sobre la marca, para cuando un usuario haga click en ella. Para esto, modificaremos un poco el código creado en el punto anterior. Ahora haremos una función que creará la marca y relacionará la información mediante un eventListener, el cual reaccionará cuando se haga click. En resumen, añadimos el siguiente código a nuestra función <strong>inicializar</strong>:</p>
<pre class="javascript" title="code">function informacion(ubicacion, descripcion) {

   var marca = new GMarker(ubicacion);
   GEvent.addListener(marca, "click", function() {
     marca.openInfoWindowHtml(descripcion); } );

     return marca;

   }

var ubicacion = new GLatLng(-33.43795,-70.603627);
var descripcion = '&lt;b&gt;Texto ejemplo&lt;/b&gt;&lt;br/&gt;Para tutorial de CLH&lt;br /&gt;';
var marca = informacion(ubicacion, descripcion);

map.addOverlay(marca);</pre>
<p style="text-align: justify;">Lo que hacemos aquí es crear 3 variables: <strong>ubicacion</strong>, que genera un punto mediante latitud y longitud <em>(el mismo que habíamos generado antes)</em>, <strong>descripcion</strong> que contiene el texto explicativo y <strong>marca</strong> que llama a la función <strong>informacion</strong>, la cual genera la marca, y añade el evento en caso de click sobre ella, retornando el resultado final.</p>
<p style="text-align: justify;">Nuestro código completo queda de la siguiente forma:</p>
<pre class="html" title="code">&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"&gt;
&lt;title&gt;Ejemplo de uso - API Google Maps - CLH&lt;/title&gt;

&lt;script src="http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;sensor=false&amp;amp;key=ABQIAAAAHhzikxCQyRAS8ryQoB75mRT2yXp_ZAY8_ufC3CFXhHIE1NvwkxQiqBRnE1Iky5sZfKGxzYbUanZ0HA" type="text/javascript"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;

function inicializar() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(-33.43795,-70.603627), 15);
map.addControl(new GMapTypeControl());
map.addControl(new GLargeMapControl());
map.addControl(new GScaleControl());
map.addControl(new GOverviewMapControl());
//map.addOverlay(new GMarker(new GLatLng(-33.43795,-70.603627)));

function informacion(ubicacion, descripcion) {

var marca = new GMarker(ubicacion);
GEvent.addListener(marca, "click", function() {
marca.openInfoWindowHtml(descripcion); } );

return marca;

}

var ubicacion = new GLatLng(-33.43795,-70.603627);
var descripcion = '&lt;b&gt;Texto ejemplo&lt;/b&gt;&lt;br/&gt;Para tutorial de CLH&lt;br /&gt;';
var marca = informacion(ubicacion, descripcion);

map.addOverlay(marca);

}
}

&lt;/script&gt;

&lt;/head&gt;
&lt;body&gt;
&lt;div id="map" style="width:600px; height:600px"&gt;
&lt;script type="text/javascript"&gt;inicializar();&lt;/script&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p style="text-align: justify;">Si actualizamos nuestro mapa, y hacemos click en la marca, veremos el texto descriptivo:</p>
<p style="text-align: justify;"><img class="aligncenter" src="http://farm5.static.flickr.com/4138/4872871728_d965eb428c_z.jpg" alt="" width="600" height="590" /></p>
<p style="text-align: justify;">Y con eso finalizamos la personalización de nuestro mapa, obtenido a través de la API de Google Maps.</p>
<p style="text-align: justify;">Como se puede apreciar, la implementación es bastante rápida y presenta varias otras opciones que pueden ser analizadas a fondo en la documentación que nos entrega Google al respecto, la cual recomendamos explorar en caso de querer obtener resultados más avanzados.</p>
<p style="text-align: justify;">Por ahora, les recordamos que este tutorial ha sido:</p>
<p style="text-align: justify;"><img class="aligncenter" src="http://farm4.static.flickr.com/3043/3056524059_52d616c96c.jpg?v=0" alt="" width="400" height="314" />Cualquier duda o comentario que puedan tener, los invitamos a dejarnos unas líneas a continuación.</p>
<p style="text-align: justify;">Esperamos que este tutorial haya sido de utilidad para Uds.</p>
<p style="text-align: justify;">Muchas gracias por leer y será hasta una próxima oportunidad.</p>
<p style="text-align: center;"><strong>Staff CLH</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.comolohago.cl/2010/08/08/como-utilizar-la-api-de-google-maps/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Cómo hacer un formulario de ingreso desplegable</title>
		<link>http://www.comolohago.cl/2010/08/05/como-hacer-un-formulario-de-ingreso-desplegable/</link>
		<comments>http://www.comolohago.cl/2010/08/05/como-hacer-un-formulario-de-ingreso-desplegable/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 04:35:52 +0000</pubDate>
		<dc:creator>Jorge Nitales</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Destacado]]></category>
		<category><![CDATA[Diseño Web]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[desplegable]]></category>
		<category><![CDATA[formulario]]></category>
		<category><![CDATA[login]]></category>

		<guid isPermaLink="false">http://www.comolohago.cl/?p=3760</guid>
		<description><![CDATA[
Hoy vamos a ver un pequeño truquillo para mejorar tu sitio web, veremos como crear un formuario de ingreso desplegable al momento de hacer click en algún lugar y que además se esconda si volvemos a hacer click. Con esto evitaremos la carga de una página para que los usuarios puedan acceder al sitio.
Para ver [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-medium wp-image-3782" title="principal" src="http://www.comolohago.cl/wp-content/uploads/2010/08/principal-300x107.png" alt="" width="300" height="107" /></p>
<p style="text-align: justify;">Hoy vamos a ver un pequeño truquillo para mejorar tu sitio web, veremos como crear un formuario de ingreso desplegable al momento de hacer click en algún lugar y que además se esconda si volvemos a hacer click. Con esto evitaremos la carga de una página para que los usuarios puedan acceder al sitio.</p>
<p style="text-align: justify;">Para ver Cómo lo hago y que necesito, vamos después del salto.<br />
<span id="more-3760"></span></p>
<h1 style="text-align: center;">Cómo hacer un formulario de ingreso desplegable</h1>
<blockquote>
<h2>Información del Tutorial</h2>
<ul>
<li>Dificultad: Baja</li>
<li>Tiempo de Realizacíon: 30 min</li>
</ul>
</blockquote>
<blockquote>
<h2>¿Qué necesito?</h2>
<ul>
<li>Un editor web</li>
<li>Conocimiento básico en HTML. Recomendamos esta <a href="http://www.comolohago.cl/2010/02/11/como-convertirse-en-un-campeon-de-html-parte-1/">saga</a></li>
<li>Conocimiento básico en CSS. Recomendamos esta <a href="http://www.comolohago.cl/2009/02/01/como-dominar-css-sin-salir-del-escritorio-parte-1/">saga</a></li>
</ul>
</blockquote>
<h2 style="text-align: justify;">¿Cómo Lo Hago?</h2>
<p style="text-align: justify;">1.- Necesitamos crear una página HTML básica donde usemos hojas de estilo, que contenga nuestro menú donde una de las opciones sea &#8220;Login&#8221;, &#8220;Ingresar&#8221; o lo que ustedes prefieran.</p>
<p style="text-align: justify;">En este caso haremos lo siguiente:</p>
<p style="text-align: justify;">En HTML:</p>
<pre class="html" title="code">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;

&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
&lt;link rel="stylesheet" href="estilos.css" type="text/css" media="screen" title="no title" charset="utf-8"&gt;
&lt;title&gt;Untitled Document&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="#"&gt;Home&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="#"&gt;Galer&amp;iacute;a&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="#"&gt;Contacto&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="#"&gt;Log-in&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/body&gt;

&lt;/html&gt;</pre>
<p>en CSS</p>
<pre class="css" title="code">table
{
background:green;
margin:auto;
font-family:verdana,helvetica;
font-size:14px;
}

a:link,a:active,a:visited
{
color:white;
text-decoration:none;
}

a:hover
{
text-decoration:underline;
}</pre>
<p style="text-align: justify;">No ganará ningun concurso de diseño, pero para la explicación sirve.</p>
<p style="text-align: justify;">Con lo anterior tendremos algo<a href="http://www.comolohago.cl/uploads/demos/login/galeriabasico.html" target="_blank"> así</a>.</p>
<p style="text-align: justify;">2.- Ahora necesitamos crear nuestro formulario de ingreso, para esto usaremos un &#8220;&lt;div&gt;&#8221;, ya que este estará siempre en la página, pero se vera cuando nosotros los indiquemos.</p>
<p style="text-align: justify;">Para esto, creamos un div como el siguiente:</p>
<pre class="html" title="code">&lt;div id="login-form"&gt;
&lt;form action="ingreso.html" method="post"&gt;
&lt;input type="text" name="usuario" value="Usuario" id="usuario"/&gt;
&lt;input type="password" name="password" value="Password" id="password"/&gt;
&lt;input type="submit" value="Ingresar" /&gt;
&lt;/form&gt;</pre>
<p style="text-align: justify;">Como ven, este div tiene un &#8220;id&#8221; que es un identificador, adicionalmente a esto, agregamos una etiqueta &#8220;id&#8221; al link del menu que corresponde a &#8220;login&#8221;, quedando el HTML de la siguiente forma:</p>
<pre class="html" title="code">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;

&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
&lt;link rel="stylesheet" href="estilos.css" type="text/css" media="screen" title="no title" charset="utf-8"&gt;
&lt;title&gt;Untitled Document&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="#"&gt;Home&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="#"&gt;Galer&amp;iacute;a&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="#"&gt;Contacto&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="#" id="login"&gt;Log-in&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;div id="login-form"&gt;
&lt;form action="ingreso.html" method="post"&gt;
&lt;input type="text" name="usuario" value="Usuario" /&gt;
&lt;input type="password" name="password" value="Password" /&gt;
&lt;input type="submit" value="Ingresar" /&gt;
&lt;/form&gt;
&lt;/div&gt;
&lt;/body&gt;

&lt;/html&gt;</pre>
<p style="text-align: justify;">También debemos agregar un nuevo código a la hoja de estilos para darle forma a nuestro formulario, por lo que agregaremos a nuestro CSS lo siguiente:</p>
<pre class="css" title="code">#login-form
{
width:120px;
background:gray;
text-align:center;
}
#login-form input[type=text],#login-form [type=password]
{
background:black;
color:white;
display:block;
margin-left:10px;
width:100px;
}</pre>
<p style="text-align: justify;">Quedando nuestro sitio <a href="http://www.comolohago.cl/uploads/demos/login/galeriamedio.html">así</a>.</p>
<p style="text-align: justify;">Sigue sin ganar ningun premio, pero nuevamente es funcional para el ejemplo.</p>
<p style="text-align: justify;">En la hoja de estilos, al id del formulario, agregamos lo siguiente:</p>
<pre class="css" title="code">display:none;

margin:auto;</pre>
<p>quedando nuestro CSS de la siguiente manera:</p>
<pre class="css" title="code">table
{
background:green;
margin:auto;
font-family:verdana,helvetica;
font-size:14px;
}

a:link,a:active,a:visited
{
color:white;
text-decoration:none;
}

a:hover
{
text-decoration:underline;
}

#login-form
{
width:120px;
background:gray;
text-align:center;
margin:auto;
display:none;
}

#login-form input[type=text],#login-form [type=password]
{
background:black;
color:white;
display:block;
margin-left:10px;
width:100px;
}</pre>
<p style="text-align: justify;">Como verán, si es que estan haciendo esto a la vez que leen, nuestro formulario desapareció <span style="text-decoration: line-through;">y jamas volvera, así que fin del tutorial</span>. Lo que pasa que está inicialmente escondido, como necesitamos que este, además lo centramos, pero como no pueden ver, aun no lo sabe.</p>
<p style="text-align: justify;">De aquí en adelante empieza la magia.</p>
<p style="text-align: justify;">Primero que todo, como empezaremos a usar JQuery, necesitan bajar la librería y agregarla en el encabezado de su sitio.</p>
<p style="text-align: justify;">Para descargarla lo pueden hacer <a href="http://www.jquery.com" target="_blank">aquí</a></p>
<p style="text-align: justify;">y para agregarlo, ponen la siguiente linea en el encabezado de su sitio.</p>
<pre class="html" title="code">&lt;script src="jquery-1.4.2.min.js" type="text/javascript" &gt;&lt;/script&gt;</pre>
<p style="text-align: justify;">Y ahora, necesitamos crear un nuevo archivo, que para efectos de ejemplo, llamaremos &#8220;funciones.js&#8221;</p>
<p style="text-align: justify;">en el cual pondremos el siguiente código (se comentará el código para explicar su funcionamiento)</p>
<pre class="javascript" title="code">$(function(){
/* Con esto se esta diciendo "una vez que se cargue el sitio",
cuando eso se cumpla se sigue con lo demas */

$('#login').toggle(function(){
/* Usamos la funcion toggle, que sirve para hacer cierta acción con el primer click
y otra con el segundo. Los clicks se deben hacer sobre #login que es el
identificador de "login" en nuestro menu */

$('#login-form').slideDown();
/* Con el primer click, hacemos que el formulario se despliegue hacia abajo */

},function(){ 

//y con el segundo click...

$('#login-form').slideUp();
// hacemos que el formuario se "guarde" hacia arriba

}); //cerramos la funcion que realiza toggle

}); //cerramos las funciones</pre>
<p style="text-align: justify;">Es importante decir que la función Toggle tiene al menos 12 mil usos más. En verdad 12 mil fue un número al azar y quizás exagerado, pero si tiene muchas más.</p>
<p style="text-align: justify;">Ahora si vuelven a su sitio y hacen click en login.. ¡¡¡no pasará nada!!!</p>
<p style="text-align: justify;">Y esto es porque tenemos que agregar este archivo de funciones a la cabecera de nuestro sitio, de la siguiente manera <em>(a esta altura creo que debí hacer esto en video)</em></p>
<pre class="html" title="code">&lt;script src="jquery-1.4.2.min.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="funciones.js" type="text/javascript"&gt;&lt;/script&gt;</pre>
<p style="text-align: justify;">Como ven se agregó <strong>abajo</strong> de la librería de jquery, si lo agregar sobre esta, no funcionará nada. ¡Avisados!</p>
<p style="text-align: justify;">Ahora ya esta funcionando, pero antes de mostrar como quedó, agregaremos unas funciones más. ¿Para qué?</p>
<p style="text-align: justify;">Para que cuando alguien haga click en el input de usuario o contraseña, se borre el texto que por defecto esta y lo deje en blanco, lo hacemos agregando lo siguiente, debemos agregarlo despues del cierre de la funcion de toggle pero antes del cierre de todas las funciones.</p>
<pre class="javascript" title="code">$('#usuario').focus(function(){
// Esto quiere decir, que cuando se selecciones el input con id "usuario"...
$(this).val(''); 
// el valor, idetificado como val, que es lo que esta dentro del campo sea igual a.. nada.

}); // Cerramos la funcion y abajo repetimos lo mismo con el input password

$('#password').focus(function(){
$(this).val('');

});
});    
/* Cerramos las funciones, no lo hicimos 2 veces,
recuerden que esto va abajo de la funcion anterior y antes del cierre */</pre>
<p>Para evitar confusiones mostraremos todo el archivo de funciones sin comentarios.</p>
<pre class="javascript" title="code">$(function(){

$('#login').toggle(function(){

$('#login-form').slideDown();

},function(){

$('#login-form').slideUp();

});

$('#usuario').focus(function(){
$(this).val('');

});

$('#password').focus(function(){
$(this).val('');

});
});</pre>
<p style="text-align: justify;">Y como podemos ver, funciona si problemas, <a href="http://www.comolohago.cl/uploads/demos/login/galeriacasifinal.html">aquí</a></p>
<p style="text-align: justify;">Para terminar, agregaremos un &#8220;&lt;div&gt;&#8221; que contenga todo lo anterior, para poder centrarlo y que nuestro formulario quede a la derecha con CSS. Ahora mostraremos los códigos de todo, para que vean el resultado final.</p>
<p style="text-align: justify;">HTML</p>
<pre class="html" title="code">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;

&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
&lt;link rel="stylesheet" href="estilos.css" type="text/css" media="screen" title="no title" charset="utf-8"&gt;
&lt;script src="jquery-1.4.2.min.js" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;
&lt;script src="funciones.js" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;
&lt;title&gt;Untitled Document&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;div id="contenedor"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="#"&gt;Home&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="#"&gt;Galer&amp;iacute;a&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="#"&gt;Contacto&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="#" id="login"&gt;Log-in&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;div id="login-form"&gt;
&lt;form action="ingreso.html" method="post"&gt;
&lt;input type="text" name="usuario" value="Usuario" id="usuario"/&gt;
&lt;input type="password" name="password" value="Password" id="password"/&gt;
&lt;input type="submit" value="Ingresar" /&gt;
&lt;/form&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;

&lt;/html&gt;

});
});</pre>
<p>CSS</p>
<pre class="css" title="code">#contenedor
{
width:215px;
margin:auto;
}

table
{
background:green;
font-family:verdana,helvetica;
font-size:14px;
}

a:link,a:active,a:visited
{
color:white;
text-decoration:none;
}

a:hover
{
text-decoration:underline;
}

#login-form
{
width:120px;
background:gray;
text-align:center;
display:none;
float:right;
}

#login-form input[type=text],#login-form [type=password]
{
background:black;
color:white;
display:block;
margin-left:10px;
width:100px;
}</pre>
<p>JQuery</p>
<pre class="javascript" title="code">$(function(){

$('#login').toggle(function(){

$('#login-form').slideDown();

},function(){

$('#login-form').slideUp();

});

$('#usuario').focus(function(){
$(this).val('');

});

$('#password').focus(function(){
$(this).val('');
});
});</pre>
<p>El resultado final <a href="http://www.comolohago.cl/uploads/demos/login/galeria.html" target="_blank">aquí</a></p>
<p>Con esto, tienen listo su formulario desplegable. Solo queda hacer un diseño bonito para acompañar.</p>
<p>Cualquier duda que puedan tener, los invitamos a dejarnos un comentario a continuación.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://farm4.static.flickr.com/3043/3056524059_52d616c96c.jpg?v=0" alt="" width="400" height="314" /></p>
<p style="text-align: left;">Por ahora,</p>
<p style="text-align: left;">Me despido</p>
<p style="text-align: center;"><strong>Staff CLH</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.comolohago.cl/2010/08/05/como-hacer-un-formulario-de-ingreso-desplegable/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Cómo elegir un buen hosting para tu Web</title>
		<link>http://www.comolohago.cl/2010/08/01/como-elegir-un-buen-hosting-para-tu-web/</link>
		<comments>http://www.comolohago.cl/2010/08/01/como-elegir-un-buen-hosting-para-tu-web/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 00:37:41 +0000</pubDate>
		<dc:creator>Xabadu</dc:creator>
				<category><![CDATA[Hosting]]></category>
		<category><![CDATA[alojamiento web]]></category>
		<category><![CDATA[como elegir alojamiento]]></category>
		<category><![CDATA[como elegir un buen hosting]]></category>
		<category><![CDATA[hosting]]></category>
		<category><![CDATA[tips de hosting]]></category>
		<category><![CDATA[tips de web]]></category>

		<guid isPermaLink="false">http://www.comolohago.cl/?p=3753</guid>
		<description><![CDATA[
Una de las recomendaciones que nos solicitan más a menudo en nuestros tutoriales de Web es lo relativo a la selección de un buen alojamiento. Si bien la oferta es variada, el saber que criterios utilizar al momento de la elección es importante para distinguir entre lo que parece bueno y lo que realmente lo [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" src="http://farm5.static.flickr.com/4118/4850139239_20aa2ae30d.jpg" alt="" width="400" height="300" /></p>
<p style="text-align: justify;">Una de las recomendaciones que nos solicitan más a menudo en nuestros tutoriales de Web es lo relativo a la selección de un buen alojamiento. Si bien la oferta es variada, el saber que criterios utilizar al momento de la elección es importante para distinguir entre lo que parece bueno y lo que realmente lo es.</p>
<p style="text-align: justify;">Hoy, en CLH, veremos algunos tips que nos ayudarán a evaluar de mejor manera la próxima vez que necesitemos contratar uno de estos servicios.</p>
<p style="text-align: justify;">El detalle, como siempre, después del salto.</p>
<p style="text-align: justify;"><span id="more-3753"></span></p>
<p style="text-align: justify;">
<h1 style="text-align: center;">Cómo elegir un buen hosting para tu Web</h1>
<p>Antes de comenzar con los tips técnicos propiamente tal, es bueno analizar un par de cosas:</p>
<h2>¿Qué queremos hacer?</h2>
<p style="text-align: justify;">Suena obvio, pero muchas veces omitimos esta pregunta. Antes de adquirir un nuevo hosting e incluso la búsqueda del mismo, es bueno preguntarse y planificar el uso que le daremos.</p>
<p style="text-align: justify;">¿Por qué?. Simple. El uso que finalmente le demos al hosting que contrataremos definirá los requerimientos del mismo, y por ende tanto los criterios con los que evaluaremos como el precio que estaremos dispuestos a pagar y que finalmente desembolsaremos.</p>
<p style="text-align: justify;">No es lo mismo diseñar un sitio Web estático simple para 10 personas al año que un sitio dinámico con uso de bases de datos o un sistema de información en plataforma Web para el cual estimemos una demanda de cientos de miles personas por mes y por ende la necesidad de hosting variará dependiendo de cada uno de estos escenarios. Si bien con un hosting tremendamente potente podemos eventualmente cubrir todos estos escenarios, no siempre será necesario y estaremos perdiendo dinero. Por otro lado, si somos desarrolladores Web y nuestro interés es probar nuevas tecnologías, un hosting que cubra una gran demanda no nos servirá y si uno que soporte diferentes lenguajes.</p>
<p style="text-align: justify;">Por eso, primer paso: definir el objetivo y el uso que le daremos al hosting. Esto será la base de una buena elección.</p>
<h2 style="text-align: justify;"></h2>
<h2 style="text-align: justify;">Somos clientes comprando un producto</h2>
<p style="text-align: justify;">Tal como cuando vamos al supermercado, o estamos cotizando un nuevo televisor o un computador en una tienda, al momento de evaluar un hosting estamos realizando una serie de cotizaciones para finalmente decidirnos por el que más nos convenga.. Por ello, tenemos todo el derecho como futuros clientes a solicitar la información que estimemos necesaria para ayudar a nuestra decisión.</p>
<p style="text-align: justify;">Por lo general los proveedores presentan un buen detalle de información en sus sitios Web, pero hay algunos detalles que quizás puedan no quedarnos claros o en los que necesitemos saber un poco más, ya sea de aspectos técnicos o de la empresa propiamente tal. Para estos casos, no debemos dudar en contactarlos y preguntar al respecto. Adicionalmente, esto nos permitirá evaluar de manera preliminar como es su servicio al cliente, un punto para añadir a la decisión que tomaremos posteriormente.</p>
<p style="text-align: justify;">
<h1 style="text-align: center;">Aspectos a evaluar en un hosting</h1>
<h2 style="text-align: justify;"></h2>
<h2 style="text-align: justify;">1.- Uptime o disponibilidad</h2>
<p style="text-align: justify;">El uptime o disponibilidad de un hosting se refiere a la capacidad del mismo de operar de forma continuada sin caídas, tanto de sus sistemas como de sus conexiones a Internet.</p>
<p style="text-align: justify;">Todos los servicios de hosting ofrecen un porcentaje de uptime <em>(normalmente cercano al 99%)</em>, pero como usuarios dificilmente nos preocupamos de comprobarlo. Por ende, es bueno al momento de cotizar, contactar al proveedor y preguntarle que estadísticas tiene al respecto o bajo que cálculos llegó a ese porcentaje de disponibilidad para obtener una respuesta que sea verdaderamente satisfactoria.</p>
<p style="text-align: justify;">La disponibilidad del hosting que elijamos es esencial para nuestros proyectos, ya que es clave que cuando un usuario quiera acceder a nuestros sitios pueda hacerlo, por la razón que sea. Y por ello, debemos asegurarnos de elegir un proveedor que nos asegure una estabilidad acorde.</p>
<h2 style="text-align: justify;">2.- Transferencia mensual</h2>
<p style="text-align: justify;">La transferencia mensual que nos ofrece un proveedor de hosting se refiere a la cantidad de tráfico que podremos generar desde y hacia el sitio, tanto para descargas como para subidas.</p>
<p style="text-align: justify;">Por ejemplo, si nuestro sitio está compuesto de 100 páginas de 1 kb cada una, y cada usuario que entra ve el sitio completo, hará una descarga de este y por ende se descontarán 100kb de la cantidad de transferencia mensual ofrecida por el proveedor.</p>
<p style="text-align: justify;">Por esto es bueno asegurarnos de que la cantidad de transferencia mensual ofrecida sea suficiente para lo que requerimos, ya que si superamos la cantidad ofrecida ocurrirá una de dos cosas: o se nos cortará el servicio <em>(normalmente bajando el sitio)</em>, o bien se nos cobrará la diferencia, lo cual dependiendo de las tarifas, puede llegar a ser alto.</p>
<p style="text-align: justify;">Algo que es bueno recalcar. Varios proveedores ofrecen una <em>&#8220;transferencia ilimitada&#8221;</em> en la mayoría de los servicios, cuando realmente esto no es así. A lo que normalmente se refieren con transferencia ilimitada es siempre y cuando el sitio no supere las capacidad del servidor propiamente tal, por lo que realmente termina siendo una capacidad definida. Esto normalmente está indicado en los términos y condiciones del servicio, por lo que es bueno informarse ahí o bien preguntarlo directamente antes de contratar.</p>
<h2 style="text-align: justify;">3.- Almacenamiento</h2>
<p style="text-align: justify;">Este es probablemente el aspecto en que todos más nos fijamos, pero nunca está demás destacarlo. El almacenamiento que ofrece un hosting se refiere específicamente al espacio en disco que nos entregan para almacenar archivos.</p>
<p style="text-align: justify;">Como tal, debemos asegurarnos de que este espacio sea suficiente para nuestras necesidades, a pesar de que hoy es posible almacenar algunos tipos de archivos en otros servicios. Por ejemplo, si en nuestro sitio queremos mostrar imágenes y videos, podemos utilizar servicios como Flickr y YouTube y así no usar espacio en disco.</p>
<p style="text-align: justify;">Al igual que la transferencia, muchos proveedores ofrecen un <em>&#8220;espacio ilimitado&#8221;</em> que normalmente no es así, así que ojo con ese tema.</p>
<h2 style="text-align: justify;">4.- Correos</h2>
<p style="text-align: justify;">Varios proveedores de hosting ofrecen cuentas de correo asociadas al dominio que poseemos. Si bien no es un aspecto esencial, si es un buen adicional para fijarnos ya que sin duda le entregan valor agregado al servicio.</p>
<p style="text-align: justify;">El número de cuentas de correo disponibles, acceso a Webmail, herramientas para combatir spam y facilidad de configuración en otros clientes <em>(ej. Outlook)</em>, son aspectos en que fijarse.</p>
<p style="text-align: justify;">De todas formas, es importante pero no esencial, en caso de no ser ofrecido, siempre podemos utilizar otros servicios <a href="http://www.comolohago.cl/2010/06/27/como-habilitar-correos-a-traves-de-google-apps/" target="_blank">como Google Apps</a>.</p>
<h2 style="text-align: justify;">5.- Bases de datos</h2>
<p style="text-align: justify;">Hoy en día, practicamente todo lo que vayamos a utilizar en nuestros sitios eventualmente requerirá el uso de bases de datos. Ya sea implementando un administrador de contenidos como Wordpress o Joomla o bien para probar desarrollos propios, el uso y acceso de bases de datos es elemental para poder llevar todo a cabo.</p>
<p style="text-align: justify;">Afortunadamente, la gran mayoría, por no decir todos, los hostings actualmente ofrecen uso y acceso a bases de datos <em>(por lo general MySQL)</em>. Por esto, la comparación no entra en si ofrecen o no el servicio, sino que las características del mismo: número de bases de datos, tipos de sistemas de bases de datos <em>(a pesar de que MySQL sea lo más utilizado, puede que para algún proyecto en particular necesitemos de otra, como PostgreSQL), </em>conexiones remotas, aplicaciones para manejar los datos, etc.</p>
<p style="text-align: justify;">Ojo con este tema, ya que una mala elección puede darnos más de un dolor de cabeza.</p>
<h2 style="text-align: justify;">6.- Dominios</h2>
<p style="text-align: justify;">Cuando decidimos contratar un servicio de hosting, siempre se nos solicitará un nombre de dominio para asociarlo <em>(puede ser uno que ya poseamos o muchos proveedores nos entregan la posibilidad de registrar uno al momento de adquirir el hosting)</em>, que será el principal asociado.</p>
<p style="text-align: justify;">No obstante, algunos proveedores nos ofrecen un tipo de servicio hacia el que podemos asociar múltiples dominios y tenerlos alojados en la misma locación. Esto es tremendamente util si pensamos lanzar nuevos sitios en el corto y mediano plazo, ya que además de ser conveniente en términos monetarios, la administración de todos ellos se hace mucho más sencilla al tenerlos alojados en el mismo lugar.</p>
<p style="text-align: justify;">Lo mismo va en el caso de los sub-dominios. En caso de que el proveedor ofrezca la funcionalidad de habilitar varios de ellos, se vuelve interesante al momento de querer lanzar sub-secciones o derivados de un proyecto en particular.</p>
<p style="text-align: justify;">
<h2 style="text-align: justify;">7.- FTP</h2>
<p style="text-align: justify;">El acceso FTP al hosting es de suma importancia para poder subir y descargar archivos desde y hacia el servidor y por ende es bueno asegurarse que el proveedor ofrezca el acceso <em>(no todos lo hacen)</em>, así como las características de este referente al número de cuentas que entregan.</p>
<p style="text-align: justify;">
<h2 style="text-align: justify;">8.- Actualizaciones</h2>
<p style="text-align: justify;">A pesar de que los servicios de hosting ofrecen disponibilidades de las más importantes tecnologías del mercado, no siempre cuentan con las últimas versiones de estas, lo cual puede terminar por afectar el desarrollo que estemos haciendo o las aplicaciones que estemos instalando.</p>
<p style="text-align: justify;">Por eso, <strong>antes de contratar</strong>, es bueno averiguar si se está trabajando con la última versión de la tecnología que necesitemos, y si no es así, que factibilidad exista de realizar la actualización.</p>
<h2 style="text-align: justify;">9.- Soporte</h2>
<p style="text-align: justify;">A medida que vayamos trabajando en el hosting que contratemos, inevitablemente nos irán ocurriendo una serie de problemas que en algunas ocasiones podremos resolver, pero en otras no. Para aquellos momentos, o para cuando necesitemos acceder a información que no está disponible a primera vista, deberá ser necesario contactar al equipo de soporte y solicitar ayuda.</p>
<p style="text-align: justify;">Todos los proveedores de hosting ofrecen distintos servicios de soporte: mesas de ayuda mediante tickets, chat en vivo, formularios vía correo electrónico, MSN. A pesar de los distintos métodos que ofrezcan, lo más importante a evaluar es el tiempo de respuesta que ellos tengan, así como la efectividad de estas respuestas.</p>
<p style="text-align: justify;">Un buen soporte de hosting marcará grandes diferencias en la experiencia que tengamos utilizando el servicio, por lo que debe ser un punto esencial a poner en la balanza al momento de evaluar.</p>
<h2 style="text-align: justify;">10.- Sistema Operativo</h2>
<p style="text-align: justify;">Dependiendo del tipo de desarrollo que hagamos, el sistema operativo del servidor puede o no influir. Si estamos desarrollando en plataformas .NET, es necesario buscar hosting en Windows, los cuales son más escasos y por lo general un poco más costosos que los basados en Linux.</p>
<p style="text-align: justify;">Todo esto dependerá de las tecnologías que necesitemos.</p>
<h2 style="text-align: justify;">11.- Adicionales</h2>
<p style="text-align: justify;">Además de todos los aspectos antes mencionados, hay una serie de adicionales que es bueno considerar al momento de contratar. Si bien no los añadimos más arriba, principalmente porque para el uso mayoritario de hosting no son obligatorios de considerar, si es bueno tenerlos en cuenta en caso de que los queramos para usos en especial.</p>
<p style="text-align: justify;">Con esto nos referimos a:</p>
<ul>
<li style="text-align: justify;"><strong>Acceso SSH:</strong> Algunos planes de hosting ofrecen acceso al servidor vía SSH. Esto nos permite ingresar al servidor mediante una terminal y ejecutar comandos tal como si estuviésemos trabajando de forma local en el servidor. Podemos manipular archivos, ejecutarlos, copiarlos y editarlos de forma rápida y sencilla. Esto es tremendamente útil para realizar respaldos tanto de los archivos del sitio como de las bases de datos que este utilice.</li>
<li style="text-align: justify;"><strong>Aplicaciones extras:</strong> Muchos proveedores ofrecen dentro de sus paneles de control, una serie de packs de aplicaciones de fácil instalación que pueden ser muy útiles para ahorrarnos tiempo. Foros, administradores de contenidos, gestores de noticias y otros, nunca está demás tomar ventaja de esto.</li>
<li style="text-align: justify;"><strong>Respaldos automatizados:</strong> En algunos servicios de hosting se ofrecen funcionalidades de respaldos automatizados de información. A pesar de que podemos hacerlo de forma manual <em>(y muchas veces es preferible)</em>, es bueno tener la opción de respaldar archivos y contenido de bases de datos de forma rápida y automática en caso de que no sepamos como llevar a cabo esta tarea.</li>
<li style="text-align: justify;"><strong>Regalos:</strong> Lo bueno de que exista tanta competencia entre proveedores de hosting, es que para captar nuevos clientes ofrecen todo tipo de regalos. Ojo que si bien esto no puede ser una razón decidora al momento de elegir <em>(no porque nos den cosas seleccionaremos un servicio de dudosa calidad)</em>, es un buen adicional a tener en cuenta. Desde dominios gratis hasta cupones para utilizar en Google AdWords, son todos buenos incentivos.</li>
</ul>
<h2 style="text-align: justify;">Conclusiones</h2>
<p style="text-align: justify;">La elección de un hosting es seria y debe hacerse de manera informada. Para eso, es bueno evaluar cada criterio que sea importante para el uso que finalmente le daremos y los requerimientos que tengamos.</p>
<p style="text-align: justify;">Lo anterior es una pequeña lista de cosas a tener en consideración. Si bien hay una serie de puntos más que podrían evaluarse, estos son los considerados más importantes que nos llevarán a tomar una buena decisión.</p>
<p style="text-align: justify;">Antes de terminar les recordamos que, como siempre, este tutorial ha sido:</p>
<p style="text-align: justify;"><img class="aligncenter" src="http://farm4.static.flickr.com/3043/3056524059_ed7150e191_o.jpg" alt="" width="400" height="314" />Cualquier duda o comentario que tengan, los invitamos a dejarnos unas líneas a continuación.</p>
<p style="text-align: justify;">Esperamos que este tutorial haya sido de utilidad para Uds.</p>
<p style="text-align: justify;">Muchas gracias por leer y será hasta una próxima oportunidad.</p>
<p style="text-align: center;"><strong>Staff CLH</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.comolohago.cl/2010/08/01/como-elegir-un-buen-hosting-para-tu-web/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Cómo crear un contador de caracteres para tus formularios</title>
		<link>http://www.comolohago.cl/2010/07/04/como-crear-un-contador-de-caracteres-para-tus-formularios/</link>
		<comments>http://www.comolohago.cl/2010/07/04/como-crear-un-contador-de-caracteres-para-tus-formularios/#comments</comments>
		<pubDate>Sun, 04 Jul 2010 05:37:56 +0000</pubDate>
		<dc:creator>Xabadu</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[contador]]></category>
		<category><![CDATA[contador de caracteres]]></category>

		<guid isPermaLink="false">http://www.comolohago.cl/?p=3665</guid>
		<description><![CDATA[
Entre las tantas peticiones que nos han llegado ultimamente, una de las más recurrentes es sobre como crear un contador de caracteres para áreas de texto, similar a la funcionalidad que despliega Twitter en su sitio Web cada vez que enviamos una actualización (o tweet para nuestros amigos más 2.0). Pues bien, luego de analizarlo [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" src="http://farm5.static.flickr.com/4143/4759597594_0b97c066f3_o.png" alt="" width="450" height="341" /></p>
<p style="text-align: justify;">Entre las tantas <a href="http://www.comolohago.cl/peticiones/" target="_blank">peticiones</a> que nos han llegado ultimamente, una de las más recurrentes es sobre como crear un contador de caracteres para áreas de texto, similar a la funcionalidad que despliega <a href="http://twitter.com/" target="_blank">Twitter</a> en su sitio Web cada vez que enviamos una actualización <em>(o tweet para nuestros amigos más 2.0)</em>. Pues bien, luego de analizarlo y darle un par de vueltas, pudimos notar que es una utilidad bastante sencilla de lograr mediante HTML y nuestro siempre querido jQuery.</p>
<p style="text-align: justify;">Así que sin más, hoy mediante un sencillo y rápido tutorial, veremos el paso a paso para poder implementarlo en nuestros formularios.</p>
<p style="text-align: justify;">El detalle, como siempre, después del salto.</p>
<p style="text-align: justify;"><span id="more-3665"></span></p>
<h1 style="text-align: center;">Cómo crear un contador de caracteres para tus formularios</h1>
<blockquote style="text-align: justify;">
<h2><img src="http://www.comolohago.cl/wp-content/uploads/2010/03/search_page.png" alt="" width="27" height="27" />Detalles del tutorial</h2>
<ul>
<li><strong>Tiempo   aproximado de implementación: </strong>15 min.</li>
<li><strong>Dificultad:</strong> Básico.</li>
</ul>
<h2><img title="tools" src="http://www.comolohago.cl/wp-content/uploads/2010/03/tools.png" alt="tools" width="27" height="27" />Implementos necesarios:</h2>
<ul>
<li>jQuery.</li>
<li>Un editor Web <em>(recomendamos <a href="http://www.aptana.com/" target="_blank">Aptana Studio</a> o <a href="http://notepad-plus-plus.org/" target="_blank">Notepad++</a>).</em></li>
</ul>
<h2>¿Qué haremos?</h2>
<p style="text-align: justify;">Para llevar a cabo este contador de caracteres, partiremos por definir un pequeño formulario que contendrá un área de texto y un botón de envío para el mensaje.</p>
<p style="text-align: justify;">Ahora, si pensamos en el proceso propiamente tal, la lógica nos dice que debemos estar atentos a cada caracter que escriba el usuario, y en base a eso, ir generando el contador para advertirle cuanto más puede escribir. Esto último es posible hacerlo de manera muy sencilla mediante un método de jQuery llamado <strong>keydown</strong>, el cual detecta cada vez que se presiona una tecla dentro de un elemento en particular <em>(en este caso, el textarea)</em>.</p>
</blockquote>
<p style="text-align: justify;">Con eso claro, vamos, manos a la obra:</p>
<h2 style="text-align: justify;">HTML</h2>
<p style="text-align: justify;">Partiremos por definir un formulario sencillo, con un área de texto y un botón de envío. Esto lo envolveremos en un div, el cual contendrá este formulario y adicionalmente otro pequeño div, que es donde incluiremos el mensaje indicando los caracteres que restan.</p>
<pre class="html" title="code">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;
&lt;html&gt;
 &lt;head&gt;
 &lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"&gt;
 &lt;title&gt;Ejemplo contador de caracteres - CLH&lt;/title&gt;
 &lt;link href="css/estilos.css" rel="stylesheet" type="text/css"&gt;
 &lt;script type="text/javascript" src="js/jquery-1.4.2.min.js"&gt;&lt;/script&gt;
 &lt;script type="text/javascript" src="js/funciones.js"&gt;&lt;/script&gt;
 &lt;/head&gt;
 &lt;body&gt;
 &lt;div id="container"&gt;
 &lt;h1&gt;Escribe tu mensaje&lt;/h1&gt;

&lt;form name="formulario" id="formulario" action="" method="post"&gt;
 &lt;label for="mensaje"&gt;Mensaje:&lt;/label&gt;
 &lt;textarea name="mensaje" id="mensaje" rows="10" cols="50"&gt;&lt;/textarea&gt;
&lt;p&gt;&lt;input type="submit" name="publicar" id="publicar" value="Publicar" /&gt;
&lt;/p&gt;
 &lt;/form&gt;
 &lt;div id="contador"&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/body&gt;
&lt;/html&gt;</pre>
<h2 style="text-align: justify;">jQuery</h2>
<p style="text-align: justify;">Ahora que tenemos nuestro formulario armado, crearemos el código en jQuery que será responsable de detectar la inclusión de cada nuevo caracter y procederá a descontar de una cantidad que definimos a modo de ejemplo <em>(en este caso 150)</em>:</p>
<pre class="javascript" title="code">$(function(){

/* Definimos variables que utilizaremos

   valor: En ella almacenaremos cuantos caracteres hay en el
          área de texto.

   contador: Almacenará el número de caracteres restantes,
             descontando el valor actual desde el máximo (150).

   parrafo: Almacenará en que tipo de clase (estilo) se mostrará el
            mensaje (verde si no se ha pasado el límite, rojo si se
            sobrepasado).

*/

var valor, contador, parrafo;

// Mostramos un mensaje inicial y lo añadimos al div de id contador.
$('&lt;p class="indicador"&gt;Tienes 150 caracteres restantes&lt;/p&gt;').appendTo('#contador');

// Definimos el evento para que detecte cada vez que se presione una tecla.
$('#mensaje').keydown(function(){

// Redefinimos el valor de contador al máximo permitido (150).
contador = 150;

/* Quitamos el párrafo con clase advertencia o indicador, en caso de que ya se
   haya mostrado un mensaje */
$('.advertencia').remove();
$('.indicador').remove();

// Tomamos el valor actual del contenido del área de texto
valor = $('#mensaje').val().length;

// Descontamos ese valor al máximo.
contador = contador - valor;

/* Dependiendo de cuantos caracteres quedan, mostraremos el mensaje de una
   u otra forma (lo definiremos a continuación mediante CSS */
if(contador &lt; 0) {
   parrafo = '&lt;p class="advertencia"&gt;';
}
else {
   parrafo = '&lt;p class="indicador"&gt;';
}

// Mostramos el mensaje con el número de caracteres restantes.
$('#contador').append(parrafo + 'Tienes ' + contador + ' caracteres restantes&lt;/p&gt;');

});

});</pre>
<h2 style="text-align: justify;">CSS</h2>
<p style="text-align: justify;">Y finalmente estilizamos un poco nuestro formulario y mensajes <em>(esto último es opcional)</em>:</p>
<pre class="css" title="code">body {
font-family: Arial, Helvetica, sans-serif;
font-size: 11px;
}

h1 {
font-size: 20px;
}

label {
display: block;
}

#mensaje {
padding: 5px;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;

}

#publicar {
border: none;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
background: #999999;
padding: 10px;
font-weight: bold;
color: white;
}

#publicar:hover {
background: #666666;
cursor: pointer;
}

.advertencia {
color: red;
}

.indicador {
color: green;
}
</pre>
<p style="text-align: justify;">Con esto obtendríamos nuestro contador de caracteres, el cual según se puede apreciar, es posible construirlo de manera sencilla, con solo algunas líneas de codificación y entregando una funcionalidad más que interesante para nuestros usuarios.</p>
<p style="text-align: justify;">Antes de cerrar:</p>
<p style="text-align: center;"><a href="http://www.comolohago.cl/uploads/demos/contador/" target="_blank"><img class="aligncenter" style="border: 0pt none;" src="http://farm5.static.flickr.com/4043/4651670584_24037a9779_o.png" alt="" width="279" height="105" /></a></p>
<p style="text-align: center;"><a href="http://www.comolohago.cl/uploads/contador.rar" target="_blank"><img class="aligncenter" style="border: 0pt none;" src="http://farm5.static.flickr.com/4067/4651052375_0ca30dda48_o.png" alt="" width="279" height="105" /></a></p>
<p style="text-align: justify;">Y como siempre, les recordamos que este tutorial ha sido:</p>
<p style="text-align: justify;"><img class="aligncenter" src="http://farm4.static.flickr.com/3043/3056524059_ed7150e191_o.jpg" alt="" width="400" height="314" />Cualquier duda o comentario que puedan tener, los invitamos a dejarnos unas líneas en el área habilitada a continuación.</p>
<p style="text-align: justify;">Esperamos que este tutorial haya sido de utilidad para Uds.</p>
<p style="text-align: justify;">Muchas gracias por leer y será hasta una próxima oportunidad.</p>
<p style="text-align: center;"><strong>Staff CLH</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.comolohago.cl/2010/07/04/como-crear-un-contador-de-caracteres-para-tus-formularios/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Cómo crear un formulario de contacto &#8211; Versión 2.0</title>
		<link>http://www.comolohago.cl/2010/05/29/como-crear-un-formulario-de-contacto-version-2-0/</link>
		<comments>http://www.comolohago.cl/2010/05/29/como-crear-un-formulario-de-contacto-version-2-0/#comments</comments>
		<pubDate>Sun, 30 May 2010 02:16:33 +0000</pubDate>
		<dc:creator>Xabadu</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Diseño Web]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[formulario de contacto]]></category>

		<guid isPermaLink="false">http://www.comolohago.cl/?p=3557</guid>
		<description><![CDATA[
Hace algún largo tiempo ya, les trajimos un tutorial sobre como armar un formulario de contacto para nuestros sitios Web, en el cual vimos todo el proceso de creación, desde el armado  hasta el envío de los datos vía correo electrónico.
Pero como el tiempo pasa, y nos vamos poniendo viejos, y sabemos que las soluciones [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" src="http://farm5.static.flickr.com/4065/4650880553_ec664544f4_o.png" alt="" width="450" height="235" /></p>
<p style="text-align: justify;">Hace algún largo tiempo ya, les trajimos un tutorial sobre <a href="http://www.comolohago.cl/2008/10/07/como-hacer-un-formulario-de-contacto/" target="_blank">como armar un formulario de contacto</a> para nuestros sitios Web, en el cual vimos todo el proceso de creación, desde el armado  hasta el envío de los datos vía correo electrónico.</p>
<p style="text-align: justify;">Pero como el tiempo pasa, <span style="text-decoration: line-through;"><em>y nos vamos poniendo viejos</em></span>, y sabemos que las soluciones no son eternas ni apropiadas para estos tiempos, hoy hemos decidido sacar a relucir nuestros talentos <span style="text-decoration: line-through;"><em>musicales y poéticos</em></span> desarrollísticos <em>(¿desarrolladores?)</em> y traerles una nueva versión de este formulario, ahora con sabor a limón y algunas características que lo convierten en una versión mucho más óptima que la anterior.</p>
<p style="text-align: justify;">El detalle, como siempre, después del salto.</p>
<p style="text-align: justify;"><span id="more-3557"></span></p>
<h1 style="text-align: center;">Cómo crear un formulario de contacto &#8211; Versión 2.0</h1>
<p style="text-align: justify;">Como siempre, lo primero:</p>
<blockquote>
<h2><img src="http://www.comolohago.cl/wp-content/uploads/2010/03/search_page.png" alt="" width="27" height="27" />Detalles del tutorial</h2>
<ul>
<li><strong>Tiempo    aproximado de implementación: </strong>30 minutos.</li>
<li><strong>Dificultad:</strong> Básico <em>(para implementar tal cual)</em> &#8211; Intermedio <em>(para personalizar)</em>.</li>
<li><strong>Conocimientos previos requeridos: </strong>Entendimiento de HTML, CSS, jQuery y PHP.</li>
</ul>
<h2><img title="tools" src="http://www.comolohago.cl/wp-content/uploads/2010/03/tools.png" alt="tools" width="27" height="27" />Implementos necesarios:</h2>
<ul>
<li>Un editor Web <em>(Recomendamos Aptana Studio o Notepad++, ambos gratuitos)</em>.</li>
</ul>
</blockquote>
<p style="text-align: justify;">Ahora, la pregunta de rigor. ¿Qué trae de nuevo este formulario 2.0?:</p>
<ul>
<li>Validaciones de ingreso de datos en tiempo real mediante jQuery.</li>
<li>Validación del correo electrónico en tiempo real mediante expresiones regulares.</li>
<li>Envío de información de forma asincrónica <em>(sin recargar la página) </em>mediante el método .ajax de jQuery.</li>
<li>Mejoras de estilo y codificación.</li>
</ul>
<p>Así que con eso claro, vamos, manos a la obra:</p>
<h2>Procedimiento:</h2>
<p style="text-align: justify;">Separaremos este desarrollo en las siguientes partes:</p>
<ol>
<li style="text-align: justify;">Código HTML &#8211; Armado del formulario.</li>
<li style="text-align: justify;">Código CSS &#8211; Estilización del formulario.</li>
<li style="text-align: justify;">Código jQuery/Javascript &#8211; Validaciones.</li>
<li style="text-align: justify;">Código PHP &#8211; Envío de información.</li>
</ol>
<h2>1.- Código HTML</h2>
<p style="text-align: justify;">El armado del formulario es bastante estándar:</p>
<pre class="html" title="code">&lt;div id="container"&gt;
  &lt;form name="formulario" id="formulario" method="post" action="envio.php"&gt;
    &lt;fieldset&gt;&lt;h2&gt;Contacto&lt;/h2&gt;&lt;/fieldset&gt;

 &lt;div&gt;
 &lt;label for="nombre"&gt;Nombre: &lt;/label&gt;
 &lt;input type="text" name="nombre" id="nombre" size="60"&gt;
 &lt;span id="validar-nombre"&gt;&lt;/span&gt;
&lt;/div&gt;

 &lt;div&gt;
  &lt;label for="correo"&gt;Correo:&lt;/label&gt;
 &lt;input type="text" name="correo" id="correo" size="60"/&gt;
 &lt;span id="validar-correo"&gt;&lt;/span&gt;
 &lt;/div&gt;

&lt;div&gt;&lt;label for="sitio"&gt;Sitio Web:&lt;/label&gt;
 &lt;input type="text" name="sitio" id="sitio" size="60"/&gt;
 &lt;span id="validar-sitio"&gt;&lt;/span&gt;
&lt;/div&gt;

 &lt;div&gt;
 &lt;label for="mensaje"&gt;Mensaje: &lt;/label&gt;
 &lt;textarea name="mensaje" id="mensaje" rows="10" cols="56"&gt;&lt;/textarea&gt;
 &lt;span id="validar-mensaje"&gt;&lt;/span&gt;
 &lt;/div&gt; 

 &lt;p id="envio"&gt;
 &lt;input type="submit" name="enviar" id="enviar" value="Enviar" /&gt;
 &lt;/p&gt;    

&lt;/form&gt;
 &lt;/div&gt;</pre>
<p style="text-align: justify;">Con este código tendremos un formulario bastante estándar armado en nuestra página de contacto. Este contará con campos de texto para que el visitante ingrese su nombre, correo electrónico y sitio Web, así como un área de texto para que ingrese su mensaje. Y obviamente al final añadimos un botón para el envío.</p>
<p style="text-align: justify;">Como podrán fijarse, a continuación de cada campo de texto y área de texto, hemos añadido un <strong>span</strong> sin contenido. Esto lo hemos hecho para insertar mensajes y resultados de las validaciones posteriormente mediante jQuery.</p>
<p style="text-align: justify;">A continuación, haremos la estilización del formulario, mediante CSS.</p>
<h2 style="text-align: justify;">2.- Código CSS</h2>
<pre class="css" title="code">body {
 height: 100%;
 background: #348075;
 font-family: Arial;
 font-size: 11px;
 color: white;
}

#container {

 width: 1000px;
 margin: 0 auto;
 background: #5b5c5c;
 border: 1px solid white;
 -moz-border-radius: 20px;
 -webkit-border-radius: 20px;

}

#formulario {

 padding: 1em;

}

#formulario fieldset {

 width: 400px;
 padding: 0 0 0 0;
 border: 0;

}

#formulario label {

 display: block;
 padding: 5px 0 5px 0;

}

#formulario input[type=text], textarea {

 padding: 10px 0 10px 0;
 border: 1.5px solid black;
 color: #5b5c5c;
 font-family: inherit;
 font-size: inherit;
 -moz-border-radius: 5px;
 -webkit-border-radius: 3px;

}

#formulario input[type=text]:focus, textarea:focus {

 background: #f5f2c9;

}

#formulario input[type=submit] {

 border: none;
 margin-right: 1em;
 padding: 6px;
 text-decoration: none;
 font-size: 12px;
 font-weight: bold;
 -moz-border-radius: 4px;
 background: #348075;
 color: white;
 width: 100px;

}

#formulario input[type=submit]:hover {
 background: #287368;
 cursor: pointer;
}

#validar-nombre, #validar-correo, #validar-sitio, #validar-mensaje {
 position: absolute;
 width: 100px;
}

#validar-nombre img, #validar-correo img, #validar-mensaje img {
 padding:10px 0 0 5px;
}</pre>
<p style="text-align: justify;">Como podrán ver, en algunas partes hemos utilizado la propiedad <strong>border-radius</strong> <em>(con moz y webkit para apuntar a distintos navegadores)</em>. Esta propiedad, tal como hemos indicado anteriormente, es de CSS3, por lo que no está completamente soportada por todos los navegadores, especialmente los más antiguos. El efecto que logra es el de bordes redondeados, así que ojo, si utilizan IE o algún navegador de mayor antiguedad no lo podrán apreciar.</p>
<h2 style="text-align: justify;">3.- Código jQuery / Javascript</h2>
<p style="text-align: justify;">Acá debemos fijarnos en algunas cosas. Primero, debemos asegurarnos de descargar e incluir jQuery en la cabecera de nuestro formulario, y luego, crear un documento js en el que incluiremos el código en jQuery que hará las validaciones y el correspondiente a Javascript que contendrá la expresión regular que evaluará la dirección de correo ingresada para ver si es válida. Partamos con jQuery:</p>
<pre class="javascript" title="code">$(function(){

 var valor;
 var i = 0;

 $('#nombre').focus(function(){

     $('#resultado-nombre').remove();
     $('#validar-nombre').append('&lt;p&gt;* Obligatorio&lt;/p&gt;');

 });

 $('#nombre').blur(function(){

     $('.advertencia').remove();

     valor = $('#nombre').val();

     if(valor != '') {
         $('&lt;img src="imagenes/accept.png" id="resultado-nombre" /&gt;').appendTo('#validar-nombre');
     }
     else {
         $('&lt;img src="imagenes/delete.png" id="resultado-nombre" /&gt;').appendTo('#validar-nombre');
     }

 });

 $('#correo').focus(function(){

     $('#resultado-correo').remove();
     $('#validar-correo').append('&lt;p&gt;* Obligatorio&lt;/p&gt;');

 });

 $('#correo').blur(function(){

     $('.advertencia').remove();

     valor = $('#correo').val();

     if(valor != '') {

       if(validaCorreo(valor)){

          $('&lt;img src="imagenes/accept.png" id="resultado-correo" /&gt;').appendTo('#validar-correo');
          var valido = true;

       }
      else {
          $('&lt;span id="resultado-correo"&gt;Correo no valido&lt;/span&gt;').appendTo("#validar-correo");
      }
    }
    else {
         $('&lt;img src="imagenes/delete.png" id="resultado-correo" /&gt;').appendTo('#validar-correo');
    }

 });

 $('#sitio').focus(function(){

     $('#validar-sitio').append('&lt;p&gt;* Opcional&lt;/p&gt;');

 });

 $('#sitio').blur(function(){

      $('.advertencia').remove();

 });

 $('#mensaje').focus(function(){

      $('#resultado-mensaje').remove();
      $('#validar-mensaje').append('&lt;p&gt;* Obligatorio&lt;/p&gt;');

 });

 $('#mensaje').blur(function(){

     $('.advertencia').remove();

     valor = $('#mensaje').val();

     if(valor != '') {
          $('&lt;img src="imagenes/accept.png" id="resultado-mensaje" /&gt;').appendTo('#validar-mensaje');
     }
     else {
        $('&lt;img src="imagenes/delete.png" id="resultado-mensaje" /&gt;').appendTo('#validar-mensaje');
     }

 });

 $('#enviar').click(function(){

       if($('#nombre').val()!= '' &amp;&amp; $('#correo').val()!='' &amp;&amp; $('#mensaje').val()!='' &amp;&amp; valido) {

         $('.advertencia').remove();

         $('#envio').append('&lt;img src="imagenes/ajax-loader.gif" alt="Procesando envio" id="cargando" /&gt;');

         var nombre = $('#nombre').val();
         var correo = $('#correo').val();
         var sitio = $('#sitio').val();
         var mensaje = $('#mensaje').val();

       $.ajax({
           url: 'envio.php',
           type: 'POST',
           data: 'nombre=' + nombre + '&amp;correo=' + correo + '&amp;sitio=' + sitio + '&amp;mensaje=' + mensaje,

           success: function(resultado) {
               $('#respuesta').remove();
               $('#envio').append('&lt;span id="respuesta"&gt;' + resultado + '&lt;/span&gt;');
               $('#cargando').fadeOut(500, function() {
                   $(this).remove();
               });

           }
       });

       return false;

   }
   else {
       $('#envio').append('&lt;span&gt;Debe completar los datos requeridos.&lt;/span&gt;');
       return false;
    }

 });

});</pre>
<p style="text-align: justify;">Varias cosas a las que ponerle atención en el código anterior:</p>
<ul>
<li style="text-align: justify;">Utilizamos 3 imágenes en los procesos de validación y envío <em>(accept.png, delete.png, ajax-loader.gif</em>)<em>. </em>Estas imágenes son utilizadas para validar correcta e incorrectamente así como mostrar un pequeño cargador al momento de enviar los datos. Pueden obtenerlas en el código fuente que hemos adjuntado al final.</li>
<li style="text-align: justify;">Hacemos uso del método <strong>ajax</strong> de jQuery, el cual nos permite enviar asincrónicamente los datos a una página en PHP mediante un método como POST o GET y que esta se ejecute sin la necesidad de recargar la página. Como se puede apreciar, en caso de éxito de esta llamada <em>(el código correspondiente a success)</em>, hay un parámetro que es devuelto <em>(resultado)</em>, el cual corresponde a un mensaje desplegado por el script que ejecutamos, lo que podremos ver más adelante.</li>
<li style="text-align: justify;">Hemos incluido en 2 partes un <strong>return false</strong>. Esto se ha hecho para que el formulario no ejecute el action <em>(de enviar a la página envio.php)</em> de forma normal, sino que ejecute todo de forma asincrónica. Si el usuario tiene desactivado Javascript en su navegador, se ejecutará todo de forma normal.</li>
<li style="text-align: justify;">En la validación del correo se hace un llamado a una función que lo evaluará, esa la incluiremos a continuación.</li>
</ul>
<p style="text-align: justify;">El código básicamente ejecuta acciones cada vez que se selecciona un campo de texto <em>(focus)</em> y/o se sale de el <em>(blur)</em>. Ahí evalua de acuerdo a los parámetros que hemos definido <em>(que existan datos)</em> y en base a eso muestra un resultado de la validación. Luego, al final, cuando se hace click en el botón de envío, evalúa que existan datos en todos los campos y en ese caso envía. De lo contrario, despliega un mensaje indicando la necesidad de completar el formulario.</p>
<p style="text-align: justify;">Luego, a continuación del código jQuery, incluiremos una función en Javascript que evaluará el correo mediante una expresión regular para verificar que tenga el formato correcto:</p>
<pre class="javascript" title="code">function validaCorreo(correo) {

 var expresion = new RegExp(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)
|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})
\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.
|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.)
{2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i);
 return expresion.test(correo);

}</pre>
<p style="text-align: justify;">Entre estos 2 códigos se encargan de toda la validación del formulario, tal como indicamos, en tiempo real. Lo que nos queda hacer ahora es crear nuestro script en PHP para el envío final de los datos.</p>
<h2 style="text-align: justify;">4.- Código PHP</h2>
<pre class="php" title="code">&lt;?php

 /* Recepcionamos los datos enviados asincrónicamente */

 $nombre = $_POST['nombre'];
 $correo = $_POST['correo'];
 $sitio = $_POST['sitio'];
 $mensaje = $_POST['mensaje'];

 /* Definimos el correo donde enviaremos el mensaje y el asunto */

 $destino = "correo@ejemplo.com";
 $asunto = "Contacto sitio Web";

 /* Definimos el formato del mensaje a enviar */

 $cuerpo = "&lt;strong&gt;Nombre: &lt;/strong&gt;".$nombre."&lt;br /&gt;
 &lt;strong&gt;Correo: &lt;/strong&gt;".$correo."&lt;br /&gt;
 &lt;strong&gt;Sitio Web: &lt;/strong&gt;".$sitio."&lt;br /&gt;
 &lt;strong&gt;Mensaje: &lt;/strong&gt;".$mensaje;

 /* Definimos las cabeceras del mensaje */

 $cabecera = "MIME-Version: 1.0\r\n";
 $cabecera .= "Content-type:text/html; charset=iso-8859-1\r\n";
 $cabecera .= "From: $correo\r\n";
 $cabecera .= "Reply-to: $correo\r\n";
 $cabecera .= "Cc: $correo\r\n";

 /* Enviamos vía correo, devolviendo un mensaje en caso de éxito o falla */ 

 if(mail($destino, $asunto, $cuerpo, $cabecera)) {
    echo 'Su mensaje ha sido enviado.
     De ser necesario, nos pondremos en contacto con Ud.';
 }
 else {
    echo 'No se pudo enviar el mensaje. Int&amp;eacute;ntelo nuevamente';
 }

?&gt;</pre>
<p style="text-align: justify;">Los mensajes desplegados en el <strong>if</strong> y <strong>else</strong> cuando enviamos el correo son aquellos que son devueltos al método <strong>.ajax</strong> de jQuery <em>(el parámetro resultado del que hablamos anteriormente)</em>, los cuales son desplegados en el formulario.</p>
<h2 style="text-align: justify;">Conclusión</h2>
<p style="text-align: justify;">Y con eso tenemos nuestro formulario de contacto terminado, el cual valida en tiempo real y envía los datos de forma asincrónica. En caso de que el visitante tenga Javascript desactivado en su navegador, esto se ejecutará de forma normal, es decir, el script PHP se cargará al momento de presionar el botón Enviar y no habrá validación en tiempo real.</p>
<p style="text-align: justify;">Antes de terminar:</p>
<p style="text-align: center;"><a href="http://www.comolohago.cl/uploads/demos/formulario/contacto.html" target="_blank"><img class="aligncenter" style="border: 0pt none;" src="http://farm5.static.flickr.com/4043/4651670584_24037a9779_o.png" alt="" width="279" height="105" /></a></p>
<p style="text-align: center;"><a href="http://www.comolohago.cl/uploads/formulario.rar" target="_blank"><img class="aligncenter" style="border: 0pt none;" src="http://farm5.static.flickr.com/4067/4651052375_0ca30dda48_o.png" alt="" width="279" height="105" /></a></p>
<p style="text-align: justify;">Y como siempre, les recordamos que este tutorial ha sido:</p>
<p style="text-align: justify;"><img class="aligncenter" src="http://farm4.static.flickr.com/3043/3056524059_ed7150e191_o.jpg" alt="" width="400" height="314" />Cualquier duda o comentario que puedan tener, los invitamos a dejarnos unas líneas en el área habilitada a continuación.</p>
<p style="text-align: justify;">Esperamos que este tutorial haya sido de utilidad para Uds.</p>
<p style="text-align: justify;">Muchas gracias por leer y será hasta una próxima oportunidad.</p>
<p style="text-align: center;"><strong>Staff CLH</strong></p>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://www.comolohago.cl/2010/05/29/como-crear-un-formulario-de-contacto-version-2-0/feed/</wfw:commentRss>
		<slash:comments>34</slash:comments>
		</item>
		<item>
		<title>Cómo crear un cuadro de información de autores en Wordpress</title>
		<link>http://www.comolohago.cl/2010/05/22/como-crear-un-cuadro-de-informacion-de-autores-en-wordpress/</link>
		<comments>http://www.comolohago.cl/2010/05/22/como-crear-un-cuadro-de-informacion-de-autores-en-wordpress/#comments</comments>
		<pubDate>Sun, 23 May 2010 02:33:05 +0000</pubDate>
		<dc:creator>Xabadu</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[informacion de autores]]></category>

		<guid isPermaLink="false">http://www.comolohago.cl/?p=3507</guid>
		<description><![CDATA[
Es común que cuando tenemos múltiples autores escribiendo en un sitio, querramos mostrar la información del responsable de cada artículo para que los usuarios puedan conocer quien está detrás de cada cosa que se escribe. Si bien en CLH en un principio optamos por no mostrar la información, y luego hacer una pequeña referencia al [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" src="http://farm5.static.flickr.com/4065/4630128565_59468f80c9_o.png" alt="" width="451" height="184" /></p>
<p style="text-align: justify;">Es común que cuando tenemos múltiples autores escribiendo en un sitio, querramos mostrar la información del responsable de cada artículo para que los usuarios puedan conocer quien está detrás de cada cosa que se escribe. Si bien en CLH en un principio optamos por no mostrar la información, y luego hacer una pequeña referencia al comienzo de cada artículo, eventualmente hemos llegado al punto de incluirlo <em>(principalmente por Dexter, que quiere ser famoso <img src='http://www.comolohago.cl/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  )</em></p>
<p style="text-align: justify;">En la búsqueda de alternativas, dimos con varios plugins que ayudan a automatizar la tarea, pero nada que nos satisfaciera por completo en cuanto a diseño y personalización. Luego de analizar el tema más a fondo fue posible darse cuenta que armar un cuadro de información desde cero no es una tarea compleja, y si entrega una gran flexibilidad para el armado, por lo que echamos manos a la obra y hoy, en un sencillo y rápido tutorial, les enseñaremos el proceso paso a paso.</p>
<p style="text-align: justify;">El detalle, como siempre, después del salto.</p>
<p style="text-align: justify;"><span id="more-3507"></span></p>
<h1 style="text-align: center;">Cómo crear un cuadro de información de autores en Wordpress</h1>
<p style="text-align: justify;">Antes de todo, como siempre:</p>
<blockquote>
<h2><img src="http://www.comolohago.cl/wp-content/uploads/2010/03/search_page.png" alt="" width="27" height="27" />Detalles del tutorial</h2>
<ul>
<li><strong>Tiempo    aproximado de implementación: 10</strong> minutos.</li>
<li><strong>Dificultad:</strong> Básico <em>(para implementar tal cual)</em> &#8211; Intermedio <em>(para personalizar)</em>.</li>
<li><strong>Conocimientos previos requeridos: </strong>Entendimiento de HTML, CSS, PHP y las funciones de Wordpress.</li>
</ul>
<h2><img title="tools" src="http://www.comolohago.cl/wp-content/uploads/2010/03/tools.png" alt="tools" width="27" height="27" />Implementos necesarios:</h2>
<ul>
<li>Un sitio con Wordpress.</li>
</ul>
</blockquote>
<p style="text-align: justify;">
<h2 style="text-align: justify;">Procedimiento:</h2>
<p style="text-align: justify;">La implementación de un cuadro de información de autores, cuenta con varias partes:</p>
<ul>
<li style="text-align: justify;">Código HTML para crear el cuadro.</li>
<li style="text-align: justify;">Código CSS para estilizarlo.</li>
<li style="text-align: justify;">Código PHP para insertar las funciones de Wordpress.</li>
</ul>
<p style="text-align: justify;">Así que vamos, a implementar:</p>
<h2 style="text-align: justify;">Código HTML</h2>
<p style="text-align: justify;">Con esto armaremos la estructura de nuestro cuadro de información de autores, el <em>esqueleto</em> por ponerlo de alguna forma. En el, incluiremos principalmente 3 cosas:</p>
<ol>
<li>Imagen del autor.</li>
<li>Información del autor <em>(nombre y sitio Web)</em>.</li>
<li>Bio del autor.</li>
</ol>
<p style="text-align: justify;">Para verlo de forma más gráfica, armaremos algo de la siguiente forma:</p>
<p style="text-align: justify;"><img class="aligncenter" src="http://farm5.static.flickr.com/4028/4630191997_2f99d2eb43_o.png" alt="" width="600" height="263" /></p>
<p style="text-align: justify;">Como podemos ver, no es demasiado complejo. Desarmando esa imagen es posible apreciar que necesitamos un Div para el cuadro completo que debe contener a su vez 2 Div&#8217;s: Uno para la imagen del autor y una para la bio e información del autor. Así que viendo esto en código, sería algo de la siguiente forma:</p>
<pre class="html" title="code">&lt;div id="cuadro-info"&gt;
   &lt;div id="imagen-autor"&gt;
        Aqui iría la imagen del autor
   &lt;/div&gt;
   &lt;div id="info-bio-autor"&gt;
       Aquí iría la información y bio del autor
   &lt;/div&gt;
&lt;/div&gt;</pre>
<p style="text-align: justify;">Vamos viendo. En el código anterior está claro que irá contenido dentro de cada Div, por lo que rellenarlo es bastante sencillo. Podríamos agregar una etiqueta para imágenes y luego abajo escribir el texto que querramos que aparezca. Sin embargo, ¿qué pasa si tenemos múltiples autores?, o más bien ¿cómo le decimos a Wordpress que incluya la información del autor del artículo y no de otra persona?. Ahí es donde entran las funciones de Wordpress.</p>
<h2 style="text-align: justify;">Código PHP</h2>
<p style="text-align: justify;">Afortunadamente, Wordpress trae funciones incorporadas que nos permiten referenciar de manera muy sencilla la información de un autor en particular y relacionarla al artículo desde donde se está haciendo la llamada. Así, si Dexter escribe un artículo, aparece el cuadro con la información de Dexter, pero si el artículo lo escribe Topher, aparecerá su información, ya que WP sabe diferenciar de acuerdo a la ID de cada artículo y recupera los datos en base a eso.</p>
<p style="text-align: justify;">Así que, listando, la información que debemos rescatar es:</p>
<ul>
<li>Imagen del autor.</li>
<li>Su nombre o pseudónimo.</li>
<li>Un enlace a su sitio Web.</li>
<li>Su bio.</li>
</ul>
<p style="text-align: justify;">Si se fijan, los 3 últimos parámetros están incluidos en el perfil de cada autor en Wordpress, por lo que es sumamente sencillo recuperarlos. Ahora, el primero, correspondiente a la imagen es un poco más complejo, ya que el perfil en si no está asociado a ninguna imagen.</p>
<p style="text-align: justify;">¿La solución?, Wordpress incluye una función que nos permite referenciar el <strong>gravatar</strong> asociado a la cuenta de correo del autor. Así que si el autor tiene un gravatar, este será mostrado en el cuadro.</p>
<p style="text-align: justify;">O sea, en base al listado anterior, llamaremos a las siguientes funciones de Wordpress:</p>
<ul>
<li>get_avatar( ), entregando como parámetro la función the_author_meta y como parámetro a esta última <strong>user_email</strong>.</li>
<li>the_author_link( ), sin parámetros.</li>
<li>the_author_meta( ) , entregando como parámetro <strong>user_url</strong>.</li>
<li>the_author_meta( ), entregando como parámetro <strong>description</strong>.</li>
</ul>
<p style="text-align: justify;">Donde:</p>
<p style="text-align: justify;">La función <strong>get_avatar</strong> nos permite recuperar el gravatar asociado a una cuenta de correo. Por eso pasamos como parámetro el correo electrónico del autor del artículo.</p>
<p style="text-align: justify;">La función <strong>the_author_link</strong> nos entrega el nombre o pseudónimo del autor, enlazado a una enumeración de todos los artículos que ha escrito en el sitio.</p>
<p style="text-align: justify;">La función <strong>the_author_meta</strong> nos entrega información relacionada al autor del artículo, dependiendo del parámetro enviado, por eso al enviar <strong>user_url</strong> nos entrega el sitio Web asociado a la cuenta del autor, y si enviamos <strong>description</strong> nos entrega la bio que está en su perfil.</p>
<p style="text-align: justify;">Así que con eso, el código quedaría de la siguiente forma <em>(incluyendo el HTML anterior)</em>:</p>
<pre class="php" title="code">&lt;div id="cuadro-info"&gt;
   &lt;div id="imagen-autor"&gt;
     &lt;a href="&lt;?php the_author_meta('user_url'); ?&gt;"&gt;
    &lt;?php echo get_avatar( get_the_author_meta('user_email'), '80', '' );
      ?&gt;
     &lt;/a&gt;
   &lt;/div&gt;
   &lt;div id="info-bio-autor"&gt;
       &lt;h4&gt;Escrito por &lt;?php the_author_link(); ?&gt;&lt;/h4&gt;
       &lt;p&gt;&lt;?php the_author_meta('description'); ?&gt;&lt;/p&gt;
   &lt;/div&gt;
&lt;/div&gt;</pre>
<p style="text-align: justify;">Como pueden ver, hicimos uso de las funciones destacadas anteriormente para rescatar el gravatar del autor, su nombre, sitio Web y bio del perfil.</p>
<p style="text-align: justify;">Ahora, si se fijan, hay un parámetro que incluimos en la función <strong>get_avatar</strong> que no indicamos anteriormente, el cual tiene un valor de <strong>80</strong>. Este parámetro corresponde al tamaño de la imagen. Como los avatars son cuadrados, este valor se toma como ancho y alto de la imagen, la cual en este caso será de 80 pixeles.</p>
<p style="text-align: justify;">Con eso ya tenemos nuestro cuadro armado en estructura y con la información del autor mostrándose, pero probablemente si lo vemos en el navegador, se verá desordenado y bastante horrible, ya que no hemos estilizado nada. Eso, precisamente, será nuestro próximo paso:</p>
<h2 style="text-align: justify;">Código CSS</h2>
<p style="text-align: justify;">Mediante CSS vamos a encargarnos de posicionar los elementos dentro de cada bloque y de estilizar para hacerlo más agradable a la vista. El código que entregamos aquí es referencial, de acuerdo a lo que utilizamos para los cuadros de este sitio, así que siéntanse libres de modificar de acuerdo al estilo de su sitio:</p>
<pre class="css" title="code">div#info-autor {
 background: #f7f7fa; padding: 10px;
 margin: 0 0 15px 0;
 -moz-border-radius: 8px;
 -webkit-border-radius: 8px;
 border-radius: 8px;
 overflow: auto;
}
div#info-autor div#imagen-autor {
 float: left;
 margin: 0 10px 5px 0;
 border: 3px solid #626263;
}
div#info-autor div#imagen-autor a img{
 border: none;
}
div#info-autor p{
 text-align: justify;
 font-style: italic;
}
div#info-autor h4{
 font-weight: bold;
 padding-bottom: 5px;
 color: #403f3a;
 letter-spacing: -1px;
 line-height: 1em;
 font-size: 18px;
}</pre>
<p style="text-align: justify;">Algunos detalles a tener en consideración:</p>
<ul>
<li>La propiedad border-radius <em>(-moz-border-radius para Firefox y -webkit-border-radius para navegadores basados en Webkit)</em>, corresponde a CSS3, por lo que navegadores más antiguos o algunos modernos que no soporten CSS3 por completo <em>(IE)</em> no desplegarán correctamente el efecto. ¿Qué efecto se preguntarán?, esquinas redondeadas para los bloques.</li>
<li>Los últimos 2 bloques de código <em>(para párrafos y para encabezados h4)</em> los incluímos para que el estilo fuera distinto al que por defecto tiene la hoja de estilo en otros sectores del sitio. Sin embargo, esto es opcional.</li>
</ul>
<p style="text-align: justify;">Y con esos ajustes de CSS tenemos terminado nuestro cuadro de información de autores. ¿Se preguntan como queda el resultado? Fácil de ver, siguiendo más abajo, luego de la calificación del tutorial pueden verlo completamente implementado.</p>
<p style="text-align: justify;">Nuevamente, los parámetros tanto de estilo como de estructura, son los que utilizamos acá. Si quieren armarlo de forma distinta, o posicionar y estilizar de manera más acorde a su sitio, no tengan miedo en jugar con el código. Esa es la base, pero todo lo que se puede lograr depende de cada uno <img src='http://www.comolohago.cl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify;">Por ahora, les recordamos que como siempre este tutorial ha sido:</p>
<p style="text-align: justify;"><img class="aligncenter" src="http://farm4.static.flickr.com/3043/3056524059_ed7150e191_o.jpg" alt="" width="400" height="314" /></p>
<p style="text-align: justify;">Cualquier duda o comentario que puedan tener, los invitamos a dejarnos unas líneas en el área habilitada a continuación.</p>
<p style="text-align: justify;">Esperamos que este tutorial haya sido de utilidad para Uds.</p>
<p style="text-align: justify;">Muchas gracias por leer y será hasta una próxima oportunidad.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.comolohago.cl/2010/05/22/como-crear-un-cuadro-de-informacion-de-autores-en-wordpress/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Cómo crear un identificador de teléfonos móviles</title>
		<link>http://www.comolohago.cl/2010/05/09/como-crear-un-identificador-de-telefonos-moviles/</link>
		<comments>http://www.comolohago.cl/2010/05/09/como-crear-un-identificador-de-telefonos-moviles/#comments</comments>
		<pubDate>Sun, 09 May 2010 04:00:27 +0000</pubDate>
		<dc:creator>Xabadu</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Celular]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[telefonia movil]]></category>

		<guid isPermaLink="false">http://www.comolohago.cl/?p=3455</guid>
		<description><![CDATA[
¿Cuántas veces nos hemos encontrado con la siguiente situación?:
Nuestro plan de telefonía móvil nos entrega X cantidad de minutos a la Compañía 1, Y cantidad de minutos a la Compañía 2 y Z cantidad de minutos a la compañía 3. Agotamos una de las opciones y necesitamos hacer una llamada urgente, pero empezamos a pensar [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" src="http://farm5.static.flickr.com/4011/4590072739_edb6b4e49c_o.png" alt="" width="450" height="177" /></p>
<p style="text-align: justify;">¿Cuántas veces nos hemos encontrado con la siguiente situación?:</p>
<p style="text-align: justify;">Nuestro plan de telefonía móvil nos entrega X cantidad de minutos a la Compañía 1, Y cantidad de minutos a la Compañía 2 y Z cantidad de minutos a la compañía 3. Agotamos una de las opciones y necesitamos hacer una llamada urgente, pero empezamos a pensar <em>¿Y si es de los minutos que ya no me quedan? Me cobrarán extra o no podré hacer la llamada</em>. Y ante la duda, una oportunidad pasa.</p>
<p style="text-align: justify;">Hoy en Internet es posible encontrar algunas aplicaciones que nos permiten reconocer la compañía a la que pertenece un número móvil. Sin embargo,  algunas de ellas presentan requisitos específicos o son de licencia comercial, lo que no las hace accesibles para cualquier persona.</p>
<p style="text-align: justify;">Pero que no panda el cúnico amigos nuestros, que hoy en CLH, mediante un realmente simple y rápido tutorial <em>(siempre lo decimos, pero este en verdad es muy simple)</em>, les enseñaremos a construir un identificador de teléfonos móviles de forma gratuita y en la comodidad de su hogar.</p>
<p style="text-align: justify;">¿Qué hacer? Solo seguirnos después del salto <img src='http://www.comolohago.cl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify;"><span id="more-3455"></span></p>
<p style="text-align: justify;">
<h1 style="text-align: center;">Cómo crear un identificador de teléfonos móviles</h1>
<p style="text-align: justify;">
<blockquote>
<h2 style="text-align: justify;"><img class="alignnone" src="http://www.comolohago.cl/wp-content/uploads/2010/03/search_page.png" alt="" width="27" height="27" />Detalles del tutorial</h2>
<ul style="text-align: justify;">
<li><strong>Tiempo  aproximado de implementación: </strong>30 minutos.</li>
<li><strong>Dificultad:</strong> Básico.</li>
</ul>
<h2 style="text-align: justify;"><img class="alignnone size-full    wp-image-3161" title="tools" src="http://www.comolohago.cl/wp-content/uploads/2010/03/tools.png" alt="tools" width="27" height="27" />Implementos necesarios:</h2>
<ul style="text-align: justify;">
<li><span lang="ES-CL"><span style="font-size: small;">Un servidor Web que ejecute archivos PHP y un sistema de gestión de bases de datos MySQL <em>(Recomendamos <a href="http://www.apachefriends.org/en/xampp.html" target="_blank">XAMPP</a>)</em>.</span></span></li>
<li><span lang="ES-CL"><span style="font-size: small;">La base de numeración telefónica móvil publicada por la Subtel. Pueden descargarla en formato PDF desde el <a href="http://www.subtel.cl/prontus_subtel/site/artic/20061230/asocfile/20061230210846/base_numeracion_oct09.pdf" target="_blank">siguiente enlace</a>.</span></span></li>
<li><span lang="ES-CL"><span style="font-size: small;">Un editor para la codificación <em>(Recomendamos <a href="http://notepad-plus.sourceforge.net/es/site.htm" target="_blank">Notepad++</a>)</em>.</span></span></li>
</ul>
<p><strong>Notas sobre el proceso:</strong></p>
<p style="text-align: justify;">Probablemente en este punto se preguntarán: ¿Cómo funciona esto? Bastante sencillo. La Subsecretaría de Telecomunicaciones en Chile define una serie de prefijos los cuales son asignados en rangos a las distintas compañías que entregan servicios de telefonía móvil. Estos prefijos están compuestos por <strong>4 dígitos</strong> y van desde el 6200 hasta el 9999.</p>
<p style="text-align: justify;">Ahora, ¿qué tienen que ver estos prefijos? Son ellos los que forman la primera mitad de nuestros números de teléfonos móviles. En consecuencia, cada prefijo tiene 4 dígitos más que forman un número único completo. Si nuestras matemáticas no fallan, podemos deducir que eso significa que existe un total de 9999 números de teléfonos móviles únicos por cada prefijo. Considerando que son 3799 prefijos en total, en Chile tenemos 37.986.201 posibles combinaciones de números.</p>
<p style="text-align: justify;">¿Eso significa que eventualmente habrán 37 millones de celulares dando vuelta en el país?. Puede ser, pero de momento no, ya que como podrán fijarse en la base de numeración, hay prefijos asignados a compañías que actualmente no ofrecen servicios de telefonía móvil de libre acceso al público general&#8230; pero nunca se sabe. Adicionalmente, hay algunos rangos de prefijos que no están asignados, lo que deja un total 2620 prefijos y por ende 26.197.380 combinaciones. Pero eso es un dato anecdótico más que nada.</p>
<p style="text-align: justify;">Con esa información, ya tenemos la lógica clara para realizar nuestra aplicación, así que manos a la obra.</p>
</blockquote>
<p style="text-align: justify;">
<h2 style="text-align: justify;">Procedimiento:</h2>
<p style="text-align: justify;">1.- Lo primero que debemos hacer, y que es el paso más crítico, es transformar la base de numeración telefónica a un formato adecuado, ya que la que descargamos esta en formato PDF y no podremos acceder a ella de forma normal, así que nuestro objetivo es traspasarla a nuestra base de datos MySQL con el fin de poder consultarla mediante el script que desarrollaremos.</p>
<p style="text-align: justify;">Para esto tenemos varias opciones:</p>
<ul>
<li style="text-align: justify;">Podemos copiar el contenido de la base y traspasarlo a una planilla Excel, en la cual debemos eliminar las XXXX que aparecen en el campo suscriptor y solo mantener el prefijo y en otra columna la compañía a la que pertenece ese prefijo. Adicionalmente, es bueno que al menos para las tres compañías más conocidas, cambiemos sus nombres completos o razones sociales a nombres más amigables y reconocibles para el usuario <em>(por ej. ENTEL PCS TELECOMUNICACIONES S.A. a ENTEL PCS)</em>.</li>
<li style="text-align: justify;">Una vez que tenemos nuestro Excel armado con el formato que queremos, lo traspasamos a MySQL. ¿Dudas sobre como hacerlo? No se preocupen, en el pasado hemos hecho <a href="http://www.comolohago.cl/2009/05/24/como-importar-a-mysql-desde-excel/" target="_blank">un tutorial que cubre el proceso de forma completa</a>.</li>
</ul>
<p style="text-align: justify;">Pero, equipo de CLH, este proceso es largo y tedioso, ¿pueden echarnos una mano por favor?. Bueno, bueno, pero solo porque lo pidieron por favor. Si hacen click <a href="http://www.comolohago.cl/uploads/numeracion.sql" target="_blank">en este enlace</a>, pueden descargar la base de datos completa lista para importar a MySQL. Pero no le cuenten a nadie, ¿ya?.</p>
<p style="text-align: justify;">El archivo que les dejamos es un fiel reflejo de la base de datos que creamos, llamada<strong> moviles</strong>, la cual tiene una tabla llamada <strong>numeracion</strong>. Esta a su vez tiene 2 campos: <strong>prefijo</strong> (INT) y <strong>empresa</strong> (TEXT). Más sencillo imposible.</p>
<p style="text-align: justify;">2.- Ahora que hemos ordenado nuestros datos, podemos empezar a codificar lo que será nuestra pequeña aplicación. Para empezar, haremos un formulario el cual contendrá un campo de texto para que el usuario ingrese el número de teléfono móvil a consultar y un botón para enviar la consulta. Para esto, crearemos un archivo en formato PHP, llamado <strong>consulta.php</strong>, el cual contendrá además de lo anterior, un autollamado donde se ejecutará el script y consultaremos la base de datos. Pero primero, el formulario:</p>
<pre class="html" title="code">&lt;div id="formulario"&gt;
 &lt;form name="formulario-consulta" id="formulario-consulta" action="consulta.php" method="post"&gt;
 &lt;label for="numero"&gt;Ingrese el n&amp;uacute;mero a consultar:&lt;/label&gt;
 &lt;input type="text" name="numero" id="numero" /&gt;
 &lt;p&gt;&lt;input type="submit" id="submit" name="submit"
value="Consultar n&amp;uacute;mero" /&gt;
 &lt;/form&gt;
&lt;/div&gt;</pre>
<p style="text-align: justify;">3.- Luego de codificar nuestro formulario, procedemos a hacer el código PHP, el cual validará el número ingresado y luego hará cortará los primeros 4 caracteres de la cadena ingresada <em>(para igualarlo al prefijo)</em>, hará la consulta en la base de datos y desplegará el resultado de acuerdo a lo que se obtenga:</p>
<pre class="php" title="code">if($_POST) {

 if($_POST['numero'] == '') {

     $mensaje = "&lt;span id='error'&gt;Debe ingresar un n&amp;uacute;mero para
     consultar.&lt;/span&gt;";

 }
 else {

          if(!$conexion = mysqli_connect("localhost", "usuario", "clave", "bd")) {

              $mensaje = "&lt;span id='error'&gt;No se pudo conectar
              a la base de datos.&lt;/span&gt;";

          }
          else {

                     $numero = substr(trim($_POST['numero']), 0, 4);

                     $consulta = "SELECT empresa FROM numeracion WHERE prefijo = ".$numero;

                     if($resultado = mysqli_query($conexion, $consulta)) {

                           if(mysqli_num_rows($resultado) == 0) {

                               $mensaje = "&lt;span id='error'&gt;No hay coincidencias para el
                               n&amp;uacute;mero ".$_POST['numero'].".&lt;/span&gt;";

                           }
                           else {

                               $datos = mysqli_fetch_array($resultado, MYSQL_ASSOC);

                               $mensaje = "&lt;span id='exito'&gt;El n&amp;uacute;mero ".$_POST['numero']."
                               pertenece a ".$datos['empresa']."&lt;/span&gt;";

                           }

                     }
                     else {

                         $mensaje = "&lt;span id='error'&gt;Ocurri&amp;oacute; un error al ejecutar
                         la consulta. Int&amp;eacute;ntelo nuevamente.&lt;/span&gt;";

                      }

       }

    }

 }</pre>
<p style="text-align: justify;">
<p style="text-align: justify;">4.- El código en si es bastante autoexplicativo. Comprobamos primero si se enviaron datos, conectamos a la base de datos y ejecutamos la consulta. En cada paso creamos una variable llamada <strong>mensaje</strong>, la cual almacena información correspondiente al resultado de la operación. Este mensaje lo añadiremos al final del formulario para que le informe al usuario que sucedió:</p>
<pre class="php" title="code">&lt;div id="mensaje"&gt;&lt;?php 

       if(isset($mensaje)) {

          echo $mensaje;

        }

 ?&gt;&lt;/div&gt;</pre>
<p style="text-align: justify;">5.- De forma opcional, si así lo deseamos, podemos estilizar un poco esta pequeña aplicación, creando un archivo <strong>estilos.css</strong> y añadiéndolo a la cabecera de <strong>consulta.php</strong>:</p>
<pre class="css" title="code">#formulario {

 width: 450px;
 margin: 0 auto;
 font-family: Arial;
 font-size: 11px;
 border: solid 1px black;
 padding: 20px;
 background-color: #fac519;

}

#formulario-consulta {

 margin-left: 150px;

}

#submit {

 font-family: inherit;
 font-size: 11px;

}

label {
 display: block;
}

#mensaje {

 font-family: Arial;
 font-size: 11px;
 padding: 3px;
 border: 1px dashed black;

}

#exito {

 background-color: #6ad11b;

}

#error {

 background-color: #f51414;

}</pre>
<p style="text-align: justify;">
<p style="text-align: justify;">6.- Finalmente, nuestro consulta.php quedaría de la siguiente forma:</p>
<pre class="php" title="code">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;
&lt;html&gt;
 &lt;head&gt;
 &lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"&gt;
 &lt;link rel="stylesheet" href="estilos.css" /&gt;
 &lt;title&gt;Identificador de tel&amp;eacute;fonos m&amp;oacute;viles&lt;/title&gt;
 &lt;/head&gt;
 &lt;body&gt;
 &lt;?php
 if($_POST) {

 if(empty($_POST['numero'])) {

 $mensaje = "&lt;span id='error'&gt;Debe ingresar un n&amp;uacute;mero para consultar.&lt;/span&gt;";

 }
 else {

 if(!$conexion = mysqli_connect("localhost", "root", "dumbass", "movil")){

 $mensaje = "&lt;span id='error'&gt;No se pudo conectar a la base de datos.&lt;/span&gt;";

 }
 else {

 $numero = substr(trim($_POST['numero']), 0, 4);

 $consulta = "SELECT empresa FROM numeracion WHERE prefijo = ".$numero;

 if($resultado = mysqli_query($conexion, $consulta)) {

 if(mysqli_num_rows($resultado) == 0) {

 $mensaje = "&lt;span id='error'&gt;No hay coincidencias para el n&amp;uacute;mero ".$_POST['numero'].".&lt;/span&gt;";

 }
 else {

 $datos = mysqli_fetch_array($resultado, MYSQL_ASSOC);

 $mensaje = "&lt;span id='exito'&gt;El n&amp;uacute;mero ".$_POST['numero']." pertenece a ".$datos['empresa']."&lt;/span&gt;";

 }

 }
 else {

 $mensaje = "&lt;span id='error'&gt;Ocurri&amp;oacute; un error al ejecutar la consulta. Int&amp;eacute;ntelo nuevamente.&lt;/span&gt;";

 }

 }

 }

 }
 ?&gt;
 &lt;div id="formulario"&gt;
 &lt;form name="formulario-consulta" id="formulario-consulta" action="consulta.php" method="post"&gt;
 &lt;label for="numero"&gt;Ingrese el n&amp;uacute;mero a consultar:&lt;/label&gt;
 &lt;input type="text" name="numero" id="numero" /&gt;
 &lt;p&gt;&lt;input type="submit" id="submit" name="submit" value="Consultar n&amp;uacute;mero" /&gt;
 &lt;/form&gt;
 &lt;div id="mensaje"&gt;&lt;?php 

 if(isset($mensaje)) {

 echo $mensaje;

 }

 ?&gt;&lt;/div&gt;
 &lt;/div&gt;

 &lt;/body&gt;
&lt;/html&gt;</pre>
<p style="text-align: justify;">Probamos y todo debiese funcionar sin problemas.</p>
<p style="text-align: justify;">Y así de simple tenemos un identificador de números móviles para cuando lo necesitemos. Si nos fijamos, el proceso es bastante simple de implementar, por lo que los incentivamos a animarse, en solo minutos tendrán una muy útil aplicación para compartir.</p>
<p style="text-align: justify;"><strong>Notas antes del cierre:</strong></p>
<p style="text-align: justify;">1.- Para nuestros amigos de fuera del país, lamentablemente este proceso sirve para Chile. Sin embargo, nos imaginamos que afuera debe ser bastante similar, por lo que los invitamos a compartir sus experiencias con otros usuarios.</p>
<p style="text-align: justify;">Antes de terminar:</p>
<p style="text-align: justify;"><a href="http://www.comolohago.cl/uploads/moviles.rar" target="_blank"><img class="aligncenter" src="http://farm3.static.flickr.com/2749/4471629680_c89163fa14_o.png" alt="" width="279" height="105" border="0" /></a></p>
<p style="text-align: justify;">Y como siempre les recordamos que este tutorial ha sido:</p>
<p style="text-align: justify;"><img class="aligncenter" src="http://farm4.static.flickr.com/3043/3056524059_ed7150e191_o.jpg" alt="" width="400" height="314" />Cualquier duda que puedan tener, los invitamos a dejar un comentario a continuación.</p>
<p style="text-align: justify;">Esperamos que este tutorial haya sido de utilidad para Uds.</p>
<p style="text-align: justify;">Muchas gracias por leer y será hasta una próxima oportunidad.</p>
<p style="text-align: center;"><strong>Staff CLH</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.comolohago.cl/2010/05/09/como-crear-un-identificador-de-telefonos-moviles/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Cómo incrementar la seguridad de Wordpress en 10 pasos</title>
		<link>http://www.comolohago.cl/2010/05/03/como-incrementar-la-seguridad-de-wordpress-en-10-pasos/</link>
		<comments>http://www.comolohago.cl/2010/05/03/como-incrementar-la-seguridad-de-wordpress-en-10-pasos/#comments</comments>
		<pubDate>Mon, 03 May 2010 14:08:09 +0000</pubDate>
		<dc:creator>Xabadu</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[seguridad]]></category>

		<guid isPermaLink="false">http://www.comolohago.cl/?p=3412</guid>
		<description><![CDATA[
Continuando con nuestros tutoriales sobre Wordpress, sin duda el CMS favorito a la hora de levantar blogs e incluso sitios de distinto tipo, hoy les traemos un nuevo listado de tips y consejos sobre como incrementar la seguridad de nuestra implementación y de esta forma evitar, o al menos hacer más difícil, posibles ataques que [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" src="http://farm3.static.flickr.com/2592/4131150508_09003ac297_o.png" alt="" width="400" height="113" /></p>
<p style="text-align: justify;">Continuando con nuestros tutoriales sobre Wordpress, sin duda el CMS favorito a la hora de levantar blogs e incluso sitios de distinto tipo, hoy les traemos un nuevo listado de tips y consejos sobre como incrementar la seguridad de nuestra implementación y de esta forma evitar, o al menos hacer más difícil, posibles ataques que nos dejen sin nada en las manos.</p>
<p style="text-align: justify;">Hemos recopilado 10 buenas prácticas a tener en cuenta, ya sea antes de instalar, o cuando tenemos nuestro sitio andando. Todas son bastante sencillas de implementar y sin duda que nos ahorrarán más de un dolor de cabeza en caso de que ocurra algún problema.</p>
<p style="text-align: justify;">Los invitamos a leer el detalle, como siempre, después del salto.</p>
<p style="text-align: justify;"><span id="more-3412"></span></p>
<h1 style="text-align: center;">Cómo incrementar la seguridad de Wordpress en 10 pasos</h1>
<p style="text-align: justify;">
<blockquote>
<h2 style="text-align: justify;"><img class="alignnone" src="http://www.comolohago.cl/wp-content/uploads/2010/03/search_page.png" alt="" width="27" height="27" />Detalles del tutorial</h2>
<ul style="text-align: justify;">
<li><strong>Tiempo  aproximado de implementación: </strong>1 hora.</li>
<li><strong>Dificultad:</strong> Intermedio.</li>
</ul>
<h2 style="text-align: justify;"><img class="alignnone size-full    wp-image-3161" title="tools" src="http://www.comolohago.cl/wp-content/uploads/2010/03/tools.png" alt="tools" width="27" height="27" />Implementos necesarios:</h2>
<ul style="text-align: justify;">
<li><span lang="ES-CL"><span style="font-size: small;">Un sitio con Wordpress.</span></span></li>
<li><span lang="ES-CL"><span style="font-size: small;">Un cliente FTP.</span></span></li>
<li><span lang="ES-CL"><span style="font-size: small;">Un editor Web.</span></span></li>
<li><span lang="ES-CL"><span style="font-size: small;">Accesos al panel de control de nuestro hosting y/o base de datos.</span></span></li>
</ul>
<p><strong>Nota: </strong>Este artículo es una recopilación de tips, consejos y buenas prácticas encontrados en una serie de sitios y basados principalmente en un ensayo creado por la gente de <a href="http://blogsecurity.net/" target="_blank">BlogSecurity</a>, a los cuales hemos añadido algunas otras cosas que encontramos bastante útiles para tener en cuenta.</p></blockquote>
<p style="text-align: justify;">Con eso claro, vamos, manos a la obra:</p>
<h2 style="text-align: justify;">1.- Cambiar el prefijo de las tablas</h2>
<p style="text-align: justify;">Al momento de empezar el proceso de una nueva instalación de Wordpress, es necesario hacer algunas ediciones en el archivo <strong>wp-config.php</strong>, el cual, como su nombre lo indica, contiene parámetros de configuración que permitirán la correcta implementación y posterior funcionamiento del CMS.</p>
<p style="text-align: justify;">Entre las ediciones que se deben hacer, se nos solicita indicar un prefijo para las tablas que se crearán en la base de datos, las cuales contendrán toda la información relativa a nuestros artículos, comentarios de los usuarios, opciones y más.  Por defecto, Wordpress nos indica el prefijo <strong>wp_</strong>, el cual a pesar de que se nos recomienda cambiar, mucha gente opta por dejarlo, teniendo como resultado tablas en la base de datos como: <strong>wp_comments, wp_options</strong> y más.</p>
<p style="text-align: justify;">Está demás decir que este prefijo se debe cambiar por alguna cadena de texto aleatoria que decidamos <em>(por ej: iehr23_)</em>. Esto hará más difícil el acceso a posibles atacantes, ya que al asumir que hay un prefijo por defecto definido como wp_, existen hoy en día múltiples scripts preparados para detectar esa falla de seguridad.</p>
<p style="text-align: justify;">Ahora, lo importante, ¿Cómo cambiarlo?</p>
<p style="text-align: justify;"><strong>a) Previo a la instalación de Wordpress</strong>:</p>
<p style="text-align: justify;">Es el caso más sencillo. Tan simple como ir al archivo <strong>wp-config</strong>.<strong>php</strong> <em>(en caso de que recién hayamos descargado, es wp-config-sample.php que posteriormente se renombra a wp-config.php)</em> donde veremos aproximadamente en la línea 56:</p>
<pre class="php" title="code">$table_prefix = 'wp_';</pre>
<p style="text-align: justify;">Y cambiar <strong>wp_</strong> por la cadena que hayamos ideado. Por ej, si nuestra cadena fuera <strong>iehr23</strong>, lo dejaríamos como:</p>
<pre class="php" title="code">$table_prefix = 'iehr23_';</pre>
<p style="text-align: justify;">Y luego seguimos con el proceso normal de instalación.</p>
<p style="text-align: justify;"><strong>b) Posterior a la instalación de Wordpress:</strong></p>
<p style="text-align: justify;">Este proceso es un poco más largo, pero no presenta una gran dificultad, por lo que si es su caso, recomendamos seguirlo.</p>
<p style="text-align: justify;">Ya que nuestra instalación de Wordpress está completa y corriendo, debemos hacer varias ediciones para asegurarnos de que todas las referencias al prefijo por defecto sean cambiadas al nuevo que vamos a definir.</p>
<ol style="text-align: justify;">
<li>Al igual que para el caso previo a la instalación, debemos editar la misma línea del archivo <strong>wp-config.php</strong>, pero en este caso el que ya está arriba en nuestro hosting corriendo y hacer el cambio del prefijo por el nuevo.</li>
<li>Luego, debemos acceder a nuestra base de datos <em>(a través de un interfaz de administración, como por ejemplo phpMyAdmin)</em> y debemos renombrar todas las tablas que contienen el prefijo <strong>wp</strong> y cambiarlos al nuevo. Por ejemplo, la tabla <strong>wp_comments</strong> pasaría a ser <strong>iehr23_comments</strong> si elegimos ese prefijo como nuevo.</li>
<li>A continuación, debemos entrar a editar valores en la tabla <strong>wp_options </strong><em>(que ya a este punto debe estar con el nuevo prefijo)</em> y buscar en el campo <strong>option_name</strong> el valor <strong>wp_user_roles</strong> y cambiarlo a nuestro nuevo prefijo, o sea, para el caso del ejemplo sería <strong>iehr23_user_roles</strong>.</li>
<li>Y finalmente debemos entrar a editar valores en la tabla <strong>wp_usermeta</strong> <em>(o iehr23_usermeta si ya cambiamos los prefijos)</em> y buscar en el campo <strong>meta_key</strong> los valores <strong>wp_autosave_draft_ids</strong>, <strong>wp_capabilities</strong> y <strong>wp_user_level</strong> y cambiarlos por los nuevos prefijos, o sea, para el caso del ejemplo serían: <strong>iehr23_autosave_draft_ids</strong>, <strong>iehr23_capabilities</strong> e <strong>iehr23_user_level</strong>. En algunos casos encontrarán también en la misma tabla otros valores con el prefijo <strong>wp</strong>. Asegúrense de cambiarlos al nuevo prefijo.</li>
</ol>
<p>Y listo. Así de simple.</p>
<p><strong>c) Automatizando el proceso:</strong></p>
<p>Si nos complica mucho hacer los cambios de forma manual, la gente de BlogSecurity ha creado un plugin que se encarga de llevar a cabo todo el proceso. Este plugin se llama WP Prefix Table Changer y pueden descargarlo del <a href="http://blogsecurity.net/projects/prefix-changer.zip" target="_blank">siguiente enlace</a>.</p>
<h2>2.- Accesos a la base de datos</h2>
<p style="text-align: justify;">Un aspecto que por lo general se descuida mucho, pero que es de tremenda importancia. Para acceder a la base de datos donde tenemos nuestra instalación de Wordpress, es necesario contar con un usuario, el cual a su vez tiene una serie de privilegios para operar sobre ella <em>(crear tablas, insertar datos, seleccionar, actualizar, eliminar, etc.)</em>, con el fin de poder cumplir los procedimientos básicos de Wordpress, como la creación y despliegue de artículos, recepción de comentarios y más.</p>
<p style="text-align: justify;">Es de tremenda importancia que a este usuario le dejemos habilitados <strong>solo los privilegios necesarios</strong> y nada más que eso. De la misma manera, el usuario debiese tener acceso solo a la base de datos donde tenemos nuestra instalación de Wordpress y no a otras que pudiesemos tener <em>(en caso de que nuestro proveedor de hosting nos entregue múltiples bases de datos o schemas)</em>.  La razón de esto es que si tenemos una vulnerabilidad que le permita a un atacante acceder a la base de datos con ese usuario, no solo afectará la base de datos correspondiente a Wordpress, si no que pudiese afectar otros proyectos que tuviésemos alojados ahí, haciendo el daño mucho mayor.</p>
<p style="text-align: justify;">De la misma forma, nunca, pero <strong>nunca</strong> debemos dejar el usuario <strong>root</strong> para nuestra instalación de Wordpress, ya que el por defecto tiene accesos y privilegios para hacer cualquier cosa. Siempre debemos crear un nuevo usuario y restringir sus privilegios.</p>
<p style="text-align: justify;">En caso de que se nos permita tener un solo usuario en nuestro sistema de gestión de bases de datos, con que habilitemos los siguientes permisos basta y sobra:</p>
<ul style="text-align: justify;">
<li><strong>Para manipulación de datos:</strong> SELECT, INSERT, UPDATE, DELETE.</li>
<li><strong>Para definición de datos:</strong> CREATE, ALTER, DROP.</li>
</ul>
<p style="text-align: justify;">Ahora, si es que nuestro proveedor de hosting nos permite crear múltiples usuarios, lo que podemos hacer es habilitar uno nuevo para tareas rutinarias y habilitarle los siguientes permisos:</p>
<ul>
<li><strong>Para manipulación de datos:</strong> SELECT, INSERT, UPDATE, DELETE.</li>
<li><strong>Para definición de datos:</strong> ALTER.</li>
</ul>
<p style="text-align: justify;">Y luego cambiamos el usuario en el archivo <strong>wp-config.php</strong>. Ojo que este usuario nos limitará la creación de tablas, por lo que si implementamos algún plugin que requiera crear una nueva tabla en la base de datos, deberemos habilitar el privilegio.</p>
<p style="text-align: justify;">Para manejar nuestros usuarios, debemos acceder a algún interfaz de administración como phpMyAdmin y dirigirnos a la pestaña <strong>Privilegios</strong>, en donde podremos definir todo lo anteriormente descrito.</p>
<h2>3.- Eliminar archivos de instalación</h2>
<p style="text-align: justify;">Hemos comentado en numerosas ocasiones lo sencillo que es hacer una instalación de Wordpress. Mediante su interfaz, solo agregando algunos datos podemos contar con nuestro CMS implementado y funcional en solo minutos.</p>
<p style="text-align: justify;">No obstante, posterior a la instalación, normalmente dejamos los archivos de instalación ahí, en nuestro servidor, lo cual puede provocar fallas de seguridad. Por ende, una vez que tengamos nuestro sitio corriendo, es bueno quitarlos, con la ayuda de algún cliente FTP y dirigiéndonos al directorio <strong>wp-admin</strong>, en donde debemos eliminar los siguientes archivos:</p>
<ul>
<li>install.php</li>
<li>install-helper.php</li>
<li>upgrade.php</li>
</ul>
<h2>4.- Cambiar el usuario por defecto</h2>
<p style="text-align: justify;">Al instalar Wordpress, se nos crea un usuario por defecto <em>(admin)</em>, el cual tiene todos los privilegios habilitados para administrar la plataforma por completo. Al igual que en el caso de los prefijos, al ser un usuario por defecto, es tremendamente vulnerable para scripts automatizados, tanto por su nombre como por su id <em>(el cual siempre es 1)</em>. Es por esto que es tremendamente recomendable habilitar un nuevo usuario con privilegios de administración y eliminar este usuario admin, con el fin de no caer en las vulnerabilidades antes indicadas.</p>
<p style="text-align: justify;">En caso de que tengamos una instalación de Wordpress  andando y ya hayamos utilizado el usuario admin para publicar artículos y/o comentarios, luego de crear el nuevo usuario, debemos actualizar las tablas <strong>wp_posts</strong> y <strong>wp_comments</strong> y cambiar los id por el nuevo.</p>
<h2>5.- Elección de contraseñas</h2>
<p style="text-align: justify;">Algo que va mucho más allá de Wordpress, pero de la misma forma aplicable. Creo que nunca se puede hablar lo suficiente de la importancia de definir contraseñas fuertes y dificiles de descifrar. Hace algún tiempo una importante red de medios sufrió un ataque debido a que sus principales administradores poseían contraseñas débiles y que además utilizaban en otros servicios, lo que hizo que los ataques sufridos las descifraran de manera bastante sencilla.</p>
<p style="text-align: justify;">Es por esto que hay que poner especial cuidado al momento de definir las contraseñas para nuestros usuarios. Algunos tips importantes para tener en consideración:</p>
<ol>
<li>No repetir la contraseña con la que usemos en otros servicios.</li>
<li>Definir una cadena de texto de mínimo 8 a 10 caracteres.</li>
<li>Mezclar letras y números.</li>
<li>No utilizar palabras facilmente reconocibles en algún lenguaje.</li>
<li>No utilizar palabras relacionadas al nombre de usuario, nombre del blog o contenido.</li>
</ol>
<p style="text-align: justify;">Adicionalmente, debemos preocuparnos de cambiar las contraseñas de forma frecuente.</p>
<p style="text-align: justify;">Un buen consejo es utilizar algún servicio como <a href="http://www.passwordmeter.com/" target="_blank">The Password Meter</a> , el cual nos informará sobre la seguridad de nuestra contraseña y los aspectos de ella que la hacen vulnerable.</p>
<h2>6.- Usuarios independientes para publicar y administrar</h2>
<p style="text-align: justify;">Ya que hemos hablado bastante de los usuarios y sus accesos, es importante recordar que Wordpress nos permite definir roles y privilegios para cada uno de ellos. Desde el más bajo <em>(suscriptor)</em> hasta el más alto <em>(administrador)</em>, cada uno de ellos tiene distintos accesos y se les permite diferentes funcionalidades.</p>
<p style="text-align: justify;">Considerando que el usuario que utilizamos para publicar está expuesto y puede ser visto facilmente por todos aquellos que visitan nuestro sitio, es importante que este no tenga accesos como administrador y que solo tenga los permisos necesarios para publicar. Así, en caso de que este usuario sea utilizado como base para algún tipo de ataque, es posible limitar el daño que finalmente se haga.</p>
<p style="text-align: justify;">Por otro lado dejamos un usuario administrador para tareas de mantención en el sitio, el cual no es conocido ni visto publicamente por nuestros visitantes.</p>
<p style="text-align: justify;">Un plugin muy útil para hacer esto es <a href="http://www.im-web-gefunden.de/wordpress-plugins/role-manager/" target="_blank">Role Manager</a>, el cual además de fijar niveles, nos permite añadir o quitar privilegios a cada usuario de forma independiente.</p>
<h2>7.- Restringir accesos a wp-admin, wp-content y wp-includes</h2>
<p style="text-align: justify;">Los tres directorios principales de Wordpress son wp-admin, wp-content y wp-includes, ellos manejan tanto el aspecto de administración, como las plantillas, plugins y archivos necesarios para el funcionamiento normal del CMS.</p>
<p style="text-align: justify;">Por ende, es importante restringir el acceso a ellos y solo habilitar lo que sea necesario, para así impedir que estos puedan ser vistos por usuarios malintencionados.</p>
<p style="text-align: justify;"><strong>a) Restringiendo el acceso a wp-admin:</strong></p>
<p style="text-align: justify;">Aquí se puede aplicar una utilidad muy buena, en caso de que tengamos acceso a Internet mediante una IP fija <em>(todo depende del método que utilice nuestro proveedor de servicios de Internet)</em>, ya que podemos bloquear el acceso a este directorio a todas las direcciones IP excepto la nuestra, solo añadiendo lo siguiente a nuestro archivo <strong>.htaccess</strong>:</p>
<blockquote>
<p style="text-align: justify;">Order deny, allow<br />
Allow from 127.0.0.1<br />
Deny from all</p>
</blockquote>
<p style="text-align: justify;">Reemplazamos 127.0.0.1 por nuestra <strong>IP Pública</strong> y eso restringirá el acceso a cualquier dirección IP que no sea la nuestra.</p>
<p style="text-align: justify;"><strong>b) Restringiendo el acceso a wp-content y wp-includes:</strong></p>
<p style="text-align: justify;">Otra restricción que podemos habilitar es a nuestros directorios wp-content y wp-includes, los cuales contienen nuestra plantilla, plugins y otros archivos de importancia para el funcionamiento normal de Wordpress. Mediante una pequeña restricción en el <strong>.htaccess</strong> podemos definir que se limite el acceso a los directorios y que solo se acepten peticiones por cierto tipo de archivos, como hojas de estilo, imágenes y scripts de Javascript, los que serán requeridos para mostrar la plantilla.</p>
<p style="text-align: justify;">Para esto, deberemos crear un archivo <strong>.htaccess</strong> dentro de cada directorio en el cual incluiremos:</p>
<blockquote>
<p style="text-align: justify;">Order Allow,Deny<br />
Deny from all<br />
&lt;Files ~ &#8220;.(css|jpe?g|png|gif|js)$&#8221;&gt;<br />
Allow from all<br />
&lt;/Files&gt;</p>
</blockquote>
<p style="text-align: justify;">
<p style="text-align: justify;">
<h2>8.- Restricciones de autentificación</h2>
<p style="text-align: justify;">Junto a lo anterior, también es posible realizar restricciones y exigir una autentificación adicional para poder acceder a ciertos directorios, como wp-admin. Esto lo haremos creando 2 archivos, un <strong>.htaccess</strong> que ubicaremos dentro de <strong>wp-admin</strong> y un <strong>.htpasswd</strong> que ubicaremos en algún directorio fuera de la raíz de nuestro sitio <em>(usualmente un nivel más arriba que el directorio public_html o www)</em>.</p>
<p style="text-align: justify;">En el archivo <strong>.htaccess</strong> incluiremos:</p>
<blockquote>
<p style="text-align: justify;">AuthUserFile ruta absoluta hacia nuestro archivo/.htpasswd<br />
AuthType Basic<br />
AuthName “Algun nombre para nuestro sitio”<br />
require user nombre-de-usuario-que-pediremos</p>
</blockquote>
<p style="text-align: justify;">La primera línea corresponde a la ruta, <strong>en nuestro servidor</strong>, donde tenemos el archivo .htpasswd. Si la desconocemos podemos verla facilmente subiendo un archivo .php que contenga el siguiente código:</p>
<pre class="php" title="code">&lt;?php
  die($_SERVER["DOCUMENT_ROOT"]);
?&gt;</pre>
<p style="text-align: justify;">La linea 4 es donde debemos indicar que usuario se pedirá y se buscará en el .htpasswd.</p>
<p style="text-align: justify;">Luego, debemos crear un archivo <strong>.htpasswd</strong> y almacenarlo en la misma ruta que indicamos en AuthUserFile de nuestro .htaccess y esta archivo debe contener el usuario y contraseña que podrá ser autentificado en formato <em>usuario:contraseña<strong>. </strong></em>Eso si, la contraseña debe estar codificada. Para ayudarnos, podemos acceder <a href="http://www.e2.u-net.com/htaccess/make.htm" target="_blank">a este sitio</a> que nos permite ingresar los datos en texto plano y nos entrega el resultado directo a pegar en nuestro .htpasswd.</p>
<p style="text-align: justify;">Por ejemplo, si tuviésemos un usuario <strong>ejemplo</strong> y una contraseña <strong>1234</strong>, el resultado a pegar en el .htpasswd sería:</p>
<blockquote><p>ejemplo:Dmrb3P4VUgfdw</p></blockquote>
<p>Con eso, cada vez que ingresemos al directorio <strong>wp-admin</strong> nos solicitará una autentificación adicional, que será validada con el archivo .htpasswd.</p>
<p>Como consejo adicional, en lo posible traten de darle un nombre distinto al archivo .htpasswd , por ejemplo .jeio23 , haciendo el cambio respectivo en la primera línea del .htaccess. Eso hará aún más difícil la detección.</p>
<h2>9.- Actualizar, actualizar y actualizar</h2>
<p style="text-align: justify;">Adicionalmente a todas las medidas indicadas, una muy básica y que siempre debemos tener en cuenta: <strong>Siempre actualizar a la última versión disponible de Wordpress</strong>. Este CMS, como cualquier software existente en el mercado, siempre se le detectan fallas o posibles vulnerabilidades que son corregidas con una nueva versión, por lo que estando siempre actualizados disminuimos el riesgo de ser víctimas de alguna de esas fallas.</p>
<p style="text-align: justify;">Para eso es conveniente estar al tanto de las noticias en el sitio oficial de Wordpress o ver en nuestro mismo tablero, donde se nos avisa apenas se ha lanzado una nueva versión.</p>
<h2>10.- Plugins</h2>
<p style="text-align: justify;">Los queridos y nunca bien ponderados plugins. Es realmente sorprendente la cantidad de funcionalidades y su extensibilidad, además de la simpleza para nosotros como administradores de plataforma.</p>
<p style="text-align: justify;">Sin embargo, hay que tener 2 cosas en cuenta que nos ayudarán a mantener todo de forma mucho más segura.</p>
<p style="text-align: justify;"><strong>a) No abusar de los plugins</strong>:</p>
<p style="text-align: justify;">Es cierto, nos ayudan de sobremanera, pero tal como eso es que no debemos abusar e implementar todo lo que se nos ocurra. Además de sobrecargar innecesariamente el sitio, siempre debemos recordar que cada plugin es un script que se ejecuta, el cual puede poseer vulnerabilidades que pueden afectar nuestro sistema. Por eso, debemos ser cuidadosos con cual de ellos utilizar, fijándonos principalmente en el tipo de operaciones que ejecutan y las referencias/revisiones que hayan tenido por parte de los usuarios.</p>
<p style="text-align: justify;">¿Qué tipo de plugins evitar? Por una parte los que ejecuten operaciones automáticas sobre nuestras bases de datos, como el caso de los respaldos. En caso de que estos plugins presenten alguna vulnerabilidad, estaríamos otorgando acceso directo a lo más preciado de nuestro sistema, por lo que hay que ser cuidadosos. Sabemos que es tremendamente cómodo automatizar nuestros respaldos, pero hay veces que ciertas operaciones es mejor hacerlas de forma manual.</p>
<p style="text-align: justify;"><strong>b) Actualizar siempre a la última versión:</strong></p>
<p style="text-align: justify;">El mismo caso que Wordpress. Al incluir scripts, es muy probable que presenten vulnerabilidades que son corregidas mediante lanzamientos de nuevas versiones. Así que a estar atentos y siempre utilizar las versiones más recientes.</p>
<h2>Bonus #1 &#8211; Respaldos</h2>
<p style="text-align: justify;">La primera recomendación, que si bien no tiene mucho que ver con seguridad propiamente tal, nos ahorrará un buen dolor de cabeza en caso de sufrir algún ataque. Es de extrema importancia realizar respaldos constantes, tanto de nuestra base de datos como de los archivos de nuestro sitio.</p>
<p style="text-align: justify;">Ya hemos cubierto en el pasado la importancia de esto y como hacerlo, por lo que si tienen dudas, les recomendamos revisar <a href="http://www.comolohago.cl/2008/11/30/como-respaldar-wordpress/" target="_blank">este artículo</a>.</p>
<h2 style="text-align: justify;">Bonus #2 &#8211; Mantener una copia local</h2>
<p style="text-align: justify;">Esta es una opción similar y paralela al tema de los respaldos que nunca está demás considerar: Mantener una copia legítima del sitio en nuestro equipo corriendo un servidor local.</p>
<p style="text-align: justify;">Si podemos hacerlo, es tremendamente recomendable, ya que además de servirnos de ayuda en caso de querer probar modificaciones, nuevos plugins o actualizaciones, la tendremos disponible y a mano en caso de que nuestro sitio sufra un ataque para reestablecerlo lo antes posible.</p>
<p style="text-align: justify;">Si tienen dudas de como hacer esto, nuestro buen Jorge Nitales hizo un tutorial al respecto hace algún tiempo. Los invitamos a <a href="http://www.comolohago.cl/2010/02/14/como-instalar-wordpress-en-localhost/" target="_blank">revisarlo</a>.</p>
<h2 style="text-align: justify;">Conclusiones</h2>
<ol style="text-align: justify;">
<li>Con la seguridad nunca se puede ser demasiado paranoico. Por eso es recomendable siempre aplicar la mayor cantidad de medidas posibles y siempre estar al tanto de fallas de seguridad que sean encontradas para corregirlas. A veces un descuido puede llevarnos a perder información realmente valiosa.</li>
<li>A pesar de todas las medidas que podamos aplicar, siempre existe la posibilidad que un ataque sea exitoso. Por ende, denle suma importancia a los bonus que incluimos, ya que es lo único que en la peor instancia nos podrá ayudar.</li>
</ol>
<p>Y con eso damos por terminado este pequeño tutorial sobre como incrementar la seguridad de tu blog en Wordpress. Esperamos que estos tips sean de utilidad y cualquier duda que puedan tener, los invitamos a dejarnos un comentario a continuación.</p>
<p>Como siempre, este tutorial ha sido:</p>
<p><img class="aligncenter" src="http://farm4.static.flickr.com/3043/3056524059_ed7150e191_o.jpg" alt="" width="400" height="314" /></p>
<p>Muchas gracias por leer y será hasta una próxima oportunidad.</p>
<p style="text-align: center;"><strong>Staff CLH</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.comolohago.cl/2010/05/03/como-incrementar-la-seguridad-de-wordpress-en-10-pasos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cómo hacer un efecto estilo The Matrix</title>
		<link>http://www.comolohago.cl/2010/05/01/como-hacer-un-efecto-estilo-the-matrix/</link>
		<comments>http://www.comolohago.cl/2010/05/01/como-hacer-un-efecto-estilo-the-matrix/#comments</comments>
		<pubDate>Sun, 02 May 2010 02:31:18 +0000</pubDate>
		<dc:creator>Cri</dc:creator>
				<category><![CDATA[Computacion]]></category>
		<category><![CDATA[Diseño]]></category>
		<category><![CDATA[Diseño Web]]></category>
		<category><![CDATA[Photoshop]]></category>
		<category><![CDATA[efecto]]></category>
		<category><![CDATA[matrix]]></category>

		<guid isPermaLink="false">http://www.comolohago.cl/?p=3422</guid>
		<description><![CDATA[
 
Hola  amigos!
Retomando nuestro amigo photoshop aqui les mostraré un tutorial super simple para poder &#8220;hacer una similitud&#8221; respecto al efecto de los códigos que van cayendo en matrix.
Como es costumbre los invito a leer más acerca del tema despues del   salto&#8230;

 
 
 
Cómo hacer un efecto estilo The Matrix
 
 [...]]]></description>
			<content:encoded><![CDATA[<p><strong><img src="http://farm4.static.flickr.com/3511/4570650146_496d386450_o.jpg" alt="" width="500" height="400" /></strong></p>
<p><strong> </strong></p>
<p>Hola  amigos!</p>
<p>Retomando nuestro amigo photoshop aqui les mostraré un tutorial super simple para poder &#8220;hacer una similitud&#8221; respecto al efecto de los códigos que van cayendo en matrix.</p>
<p>Como es costumbre los invito a leer más acerca del tema despues del   salto&#8230;</p>
<p><img title="Más..." src="http://www.comolohago.cl/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /><span id="more-3422"></span></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<h1>Cómo hacer un efecto estilo The Matrix</h1>
<p><span style="text-decoration: underline;"> </span></p>
<p><span style="text-decoration: underline;"> </span></p>
<h2>1.  ¿Qué necesitamos?</h2>
<ul>
<li>Nuestro querido y fiel compañero Adobe Photoshop</li>
</ul>
<h2>2.   ¿Cómo  lo  hago?</h2>
<p>Fácil, para comenzar debemos crear un nuevo documento en blanco con las dimensiones a nuestra elección <em>(en este caso usaré 500&#215;400 pixeles)</em>, en modo <strong>RGB Color</strong>.</p>
<p>Para crear un nuevo documento, recuerden que debemos dirigirnos a Archivo <em>(o File)</em> y luego escoger la opción Nuevo <em>(o new). </em></p>
<p>Nos aparecerá la siguiente ventana donde debemos escoger las dimensiones.</p>
<p><img class="alignnone" src="http://farm4.static.flickr.com/3488/4570649990_00be6f53f8_o.jpg" alt="" width="416" height="330" /></p>
<p>3. Luego de tener el documento creado y ajustado para nuestro trabajo nos dirigiremos a la tabla de herramientas <em>(para los que no ven la tabla de herramientas, deben dirigirse a Ventana o Window y luego seleccionar Herramientas o Tools)</em>. Como lo indica la flecha <strong><em>BLANCA </em></strong>debemos seleccionar el color negro<em> (pinchando en ese cuadro negro, seleccionamos color y luego OK)</em>, y luego dirigirnos hacia donde apunta la flecha <strong><em>ROJA</em></strong> y elegir el balde de pintura <em>(Letra G)</em> para pintar nuestro fondo de color negro.</p>
<p><img class="alignnone" src="http://farm5.static.flickr.com/4022/4570650170_a691fefd1d_o.jpg" alt="" width="86" height="428" /></p>
<p><em>Nota: Si les aparece otra herramienta en ese lugar, dejen pulsado el boton izquierdo un segundo y les aparecerá para elegir la opción del balde de pintura.</em></p>
<p>4.  Siguiendo con los pasos ahora nos dirigiremos a</p>
<p><strong>Filtro &gt; Textura &gt; Granulado</strong></p>
<p><strong><img class="alignnone" src="http://farm5.static.flickr.com/4023/4570649894_31a2d82bd1_o.jpg" alt="" width="293" height="389" /><br />
</strong></p>
<p><strong> </strong></p>
<p><em>Intensidad: 60</em></p>
<p><em>Contraste: 40</em></p>
<p><em>Tipo de granulado: Vertical</em></p>
<p><em> </em></p>
<p><em> </em></p>
<p>5. Ahora falta agregarle el detalle a nuestro granulado para que vaya obteniendo el estilo <strong>Matrix</strong>, para esto nos iremos a <strong>Filtro &gt; Trazos de pincel &gt; Bordes Acentuados</strong></p>
<p><img class="alignnone" src="http://farm4.static.flickr.com/3456/4570013867_e6ca8b01a9_o.jpg" alt="" width="294" height="400" /></p>
<p><em>Ancho Borde: 1</em></p>
<p><em> Brillo Borde: 26</em></p>
<p><em>Suavidad: 1</em></p>
<p>6. Dándo los toques finales como a los “códigos” que se ven caer en este efecto Matrix ahora nos dirigiremos a <strong>Filtro &gt; Textura &gt; Azulejo de mosaico</strong></p>
<p><img class="alignnone" src="http://farm4.static.flickr.com/3444/4570649942_4d9ef0de53_o.jpg" alt="" width="290" height="404" /></p>
<p><strong> </strong></p>
<p><em>Tamaño azulejo: 2</em></p>
<p><em>Grout Width(no se como es en espanish): 2</em></p>
<p><em>Lighten Grout: 1</em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p>7. Ahora, procederemos a copiar nuestra capa<em> (en mi caso duplicate layer)</em> y luego ajustaremos las opciones de esta en <strong>Opciones de Fusión</strong> <em>(en mi caso Blending options)</em> sobre la capa recién copiada.</p>
<p><img class="alignnone" src="http://farm5.static.flickr.com/4057/4570649790_f909f3d762_o.jpg" alt="" width="221" height="235" /></p>
<p>8. Dentro de las <strong>Opciones de Fusión </strong>debemos dirigirnos a la siguiente sección y seleccionar lo siguiente.</p>
<p><img class="alignnone" src="http://farm5.static.flickr.com/4001/4570013705_72139d4fef_o.jpg" alt="" width="594" height="440" /></p>
<p><em>Color Overlay: Superposición de colores</em></p>
<p><em> Modo fusión: Superposición</em></p>
<p><em> Color: #0CFF00 (o algo similar)</em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p>9. Finalmente, solo para retocar más y dar unos pocos efectos de luz iremos a</p>
<p><strong>Filtro &gt; Interpretar &gt; Efectos de iluminación</strong></p>
<p><strong><img class="alignnone" src="http://farm5.static.flickr.com/4066/4570014051_9d64ab6f6f_o.jpg" alt="" width="507" height="375" /></strong></p>
<p><strong><img class="alignnone" src="http://farm4.static.flickr.com/3511/4570650146_496d386450_o.jpg" alt="" width="500" height="400" /><br />
</strong></p>
<p><strong> </strong></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p>10. Clickeamos OK y estaríamos listos con nuestro efecto.</p>
<p>Espero les haya gustado y servido para vuestra utilidad. Los invitamos a dejar su comentario.<br />
Como siempre exclusivamente ha sido.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://farm4.static.flickr.com/3043/3056524059_ed7150e191_o.jpg" alt="" /></p>
<p style="text-align: center;"><strong>Staff    CLH</strong></p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 4666px; width: 1px; height: 1px; overflow: hidden;"><!--[if !mso]> <mce:style><!  v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} --> <!--[endif]--><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:HyphenationZone>21</w:HyphenationZone> <w:PunctuationKerning /> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>ES-CL</w:LidThemeOther> <w:LidThemeAsian>X-NONE</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val=" " /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:"Cambria Math"; 	panose-1:2 4 5 3 5 4 6 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:roman; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1107304683 0 0 415 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman","serif"; 	mso-fareast-font-family:"Times New Roman"; 	mso-ansi-language:ES-TRAD; 	mso-fareast-language:ES-TRAD;} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	font-size:10.0pt; 	mso-ansi-font-size:10.0pt; 	mso-bidi-font-size:10.0pt;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 3.0cm 70.85pt 3.0cm; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]> <mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Tabla normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman","serif";} --> <!--[endif]--><span style="font-size: 10pt; font-family: &amp;amp;amp;"><!--[if gte vml 1]><v:shapetype id="_x0000_t75"  coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"  filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:399.75pt;  height:314.25pt'> <v:imagedata src="file:///C:\Users\Cri\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg" mce_src="file:///C:\Users\Cri\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg"   o:title="3056524059_ed7150e191_o" /> </v:shape><![endif]--><!--[if !vml]--><img src="file:///C:/Users/Cri/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg" alt="" width="533" height="419" /><!--[endif]--></span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.comolohago.cl/2010/05/01/como-hacer-un-efecto-estilo-the-matrix/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

