<?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>AlvaroVeliz &#187; Desarrollo</title>
	<atom:link href="http://blog.alvaroveliz.cl/category/desarrollo/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.alvaroveliz.cl</link>
	<description>Recetas de Desarrollo</description>
	<lastBuildDate>Wed, 01 Feb 2012 15:41:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>WebServicio a la comunidad: Donaré dos sitios web durante el año 2012 (Actualizado)</title>
		<link>http://blog.alvaroveliz.cl/2012/01/webservicio-a-la-comunidad-donare-dos-sitios-web-durante-el-ano-2012/</link>
		<comments>http://blog.alvaroveliz.cl/2012/01/webservicio-a-la-comunidad-donare-dos-sitios-web-durante-el-ano-2012/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 16:29:02 +0000</pubDate>
		<dc:creator>alvaroveliz</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Destacados]]></category>
		<category><![CDATA[Personales]]></category>
		<category><![CDATA[comunidad]]></category>
		<category><![CDATA[diseño]]></category>
		<category><![CDATA[donación]]></category>
		<category><![CDATA[gracias]]></category>
		<category><![CDATA[perkins]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.alvaroveliz.cl/?p=256</guid>
		<description><![CDATA[Amigos, para este año 2012 haré un servicio de utilidad a ustedes mis lectores y amigos, ya que ésta es la forma que tengo para devolver los favores que la comunidad de Intenet me ha entregado. Este servicio de utilidad se trata de una donación de dos sitios web durante el año 2012, uno por [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2012%2F01%2Fwebservicio-a-la-comunidad-donare-dos-sitios-web-durante-el-ano-2012%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2012%2F01%2Fwebservicio-a-la-comunidad-donare-dos-sitios-web-durante-el-ano-2012%2F&amp;source=alvaroveliz&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Amigos,</p>
<p>para este año 2012 haré un servicio de utilidad a ustedes mis lectores y amigos, ya que ésta es la forma que tengo para devolver los favores que la comunidad de Intenet me ha entregado.</p>
<p>Este servicio de utilidad se trata de una donación de dos sitios web durante el año 2012, uno por cada semestre. Mi intención es regalar y retribuir de la mejor forma que tengo.</p>
<p>Para ésto necesito que me comenten sus proyectos en este post, los ganadores o benificiados serán declarados el día 1 de Marzo de 2012 en el blog.<br />
El criterio de elección será en base a las características del proyecto y de la importancia que tenga para ustedes, es bien subjetiva la elección así que no pierdan cuidado en detallar bien de que se tratará su sitio web y para que lo necesitan.</p>
<p>Las características de la &#8220;donación&#8221; son las siguientes:</p>
<ul>
<li>Sitio Web</li>
<li>Hosting gratis por 1 año (con db y todo eso, es de dreamhost)</li>
<li>Wireframes de recuerdo</li>
<li>Tips básicos acordes a la creación y mantención del sitio web</li>
</ul>
<p>El diseño va por parte mía pero claramente le pediré ayuda a mi amigo <a title="@carloselias" href="http://twitter.com/carloselias" target="_blank">@carloselias</a> para que me entregue mejores soluciones. El desarrollo puede ser desde un sitio web estático, theme de WordPress o algo autoadministrable (depende de lo que se necesite).</p>
<p>Lo único que necesito es la colaboración de ustedes y las ganas de mejorar la web.</p>
<p>Gracias a todos por sus comentarios y sus visitas.</p>
<p>Atte.</p>
<p>Alvaro Véliz</p>
<p><strong>Chef de aplicaciones</strong></p>
<hr />
<div class="notice">
<h6>ATENCIÓN!</h6>
<p><strong>El 1 de marzo del presente seleccionaré el primer sitio web a donar, luego en Julio haré otra selección para los que no tienen la idea ahora puedan desarrollarla hasta el segundo semestre.</strong>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvaroveliz.cl/2012/01/webservicio-a-la-comunidad-donare-dos-sitios-web-durante-el-ano-2012/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Perkins a la Node</title>
		<link>http://blog.alvaroveliz.cl/2012/01/perkins-a-la-node/</link>
		<comments>http://blog.alvaroveliz.cl/2012/01/perkins-a-la-node/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 03:03:42 +0000</pubDate>
		<dc:creator>alvaroveliz</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Destacados]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[less]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[perkins]]></category>

		<guid isPermaLink="false">http://blog.alvaroveliz.cl/?p=241</guid>
		<description><![CDATA[Ha pasado mucho tiempo desde mi último artículo y hoy quiero partir bien el año presentando una nueva receta: &#8220;Perkins a la node&#8220;. Ustedes recordarán a Perkins, el framework css basado en less que permite diseñar sitios web de una forma muy rápida. Este framework ha seguido con su desarrollo y la última característica incluye [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2012%2F01%2Fperkins-a-la-node%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2012%2F01%2Fperkins-a-la-node%2F&amp;source=alvaroveliz&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Ha pasado mucho tiempo desde mi último artículo y hoy quiero partir bien el año presentando una nueva receta: &#8220;<strong>Perkins <em>a la</em> node</strong>&#8220;.</p>
<p>Ustedes recordarán a <a title="Perkins Framework" href="http://p.erkins.com">Perkins</a>, el framework css basado en less que permite diseñar sitios web de una forma muy rápida. Este <em>framework</em> ha seguido con su desarrollo y la última característica incluye una integración con <a title="node.js" href="http://nodejs.org/">node.js</a> el cual&#8230;.epa! Les voy a mostrar paso a paso a que se refiere esta integración.</p>
<p><span id="more-241"></span></p>
<p>Antes de partir les voy a contar que <strong>node.js </strong>es un entorno de desarrollo en el servidor basado en V8, es decir, JavaScript! Con node.js solamente basta saber JavaScript para programar, cuenta con un <a title="npm" href="http://npmjs.org/">gestor de paquetes</a> que permite expandir sus funciones y una<a title="Search npm" href="http://search.npmjs.org/"> lista interminable de utilidades</a>.</p>
<p>Sobre este entorno fue que <del>el equipo de hamsters entrenados</del> los programadores de Perkins desarrollo un package que agrega un servidor de pruebas y un asistente de creación de sitios web.</p>
<h2>Ingredientes</h2>
<ul>
<li>node.js</li>
<li>npm</li>
</ul>
<h2>Preparación</h2>
<h3>Instalar node</h3>
<p>Dirígete a la página de node.js y sigue los pasos de instalación para tu sistema operativo.</p>
<p style="text-align: center;"><a href="http://nodejs.org"><img class="aligncenter size-medium wp-image-243" title="Instalación node.js" src="http://blog.alvaroveliz.cl/wp-content/uploads/2012/01/nodejs-300x159.png" alt="" width="300" height="159" /></a></p>
<h3>Instalar npm</h3>
<p>Luego instala el gestor de paquetes de node desde su <a title="npm" href="http://npmjs.org/">sitio web</a>.</p>
<p style="text-align: center;"><a href="http://npmjs.org"><img class="aligncenter size-medium wp-image-244" title="npm" src="http://blog.alvaroveliz.cl/wp-content/uploads/2012/01/npm-300x120.png" alt="" width="300" height="120" /></a></p>
<h3>Instalar perkins</h3>
<p>Luego de haber instalado npm vamos a instalar perkins con el siguiente comando:</p>
<pre class="brush: bash; title: ; notranslate"> user@~:$ npm install -g perkins </pre>
<p>El modificador -g instala el paquete de forma global en el sistema, en caso de que no quieras hacerlo global solo basta con omitirlo.</p>
<p>Al instalar Perkins aparcerá el siguiente mensaje:</p>
<pre class="brush: bash; title: ; notranslate"> perkins@2.0.1 ./node_modules/perkins
├── paperboy@0.0.3
└── commander@0.5.1</pre>
<p>Este comando también instalará &#8220;Paperboy&#8221; y &#8220;Commander&#8221;. El primero es una utilidad de servidor de web que permitirá ver los resultados de perkins sin tener que instalar otro servidor web. El segundo paquete permite la interacción con comandos en línea.</p>
<h3>Dejar a Perkins que sirva</h3>
<p>Ahora que tenemos a perkins en nuestra mesa podemos pedirle con nos sirva lo mejor del menú, veamos un ejemplo de uso. Para ésto vamos a ver el modo de uso con el comando &#8220;&#8211;help&#8221;</p>
<pre class="brush: bash; title: ; notranslate">perkins --help
Usage: perkins [command] --options &lt;dir&gt;

Commands:

preview [path]
This option create a Perkins Preview HTTP Server

setup &lt;path&gt;
Just relax let me take care of building a version of ... well me.

Options:

-h, --help         output usage information
-V, --version      output the version number
-p, --port &lt;port&gt;  specify the port [8000]
</pre>
<p>Vamos a crear un sitio utilizando el comando &#8220;setup&#8221;:</p>
<pre class="brush: bash; title: ; notranslate">perkins setup receta</pre>
<p>Esto nos entrega una estructura básica, archivos de perkins y luego nos pregunta si nos interesa subir un servidor para previsualizar el sitio web. Si respondemos &#8220;Yes&#8221; nos dirá lo siguiente:</p>
<pre class="brush: bash; title: ; notranslate">Perkins: Now... did you want me to execute the Perkins Preview HTTP Server? Yes
Perkins: Your preview server for receta is ready, Sir. on port 8000</pre>
<p>Vamos a revisar nuestro servidor en http://localhost:8000/</p>
<p style="text-align: center;"><a class="thickbox" href="http://blog.alvaroveliz.cl/wp-content/uploads/2012/01/perkinsserver.png"><img class="aligncenter size-medium wp-image-248" title="Server" src="http://blog.alvaroveliz.cl/wp-content/uploads/2012/01/perkinsserver-300x38.png" alt="" width="300" height="38" /></a>Y luego solo nos resta modificar los archivos que nos ha creado Perkins en el directorio &#8220;receta&#8221;.</p>
<p style="text-align: center;"><a class="thickbox" href="http://blog.alvaroveliz.cl/wp-content/uploads/2012/01/estructura.png"><img class="aligncenter size-medium wp-image-249" title="estructura" src="http://blog.alvaroveliz.cl/wp-content/uploads/2012/01/estructura-300x125.png" alt="" width="300" height="125" /></a>Finalmente comenzamos a editar index.html y veremos automáticamente los cambios en nuestro servidor. Es perfecto para comenzar a hacer maquetas de sitios web sin tener que depender de descargas ni servidores.</p>
<p>Bon apetit!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvaroveliz.cl/2012/01/perkins-a-la-node/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tutorial : Comenzando con Perkins Framework</title>
		<link>http://blog.alvaroveliz.cl/2011/05/tutorial-comenzando-con-perkins-framework/</link>
		<comments>http://blog.alvaroveliz.cl/2011/05/tutorial-comenzando-con-perkins-framework/#comments</comments>
		<pubDate>Mon, 16 May 2011 19:48:55 +0000</pubDate>
		<dc:creator>alvaroveliz</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://blog.alvaroveliz.cl/?p=213</guid>
		<description><![CDATA[Una de las premisas de Perkins Framework es que es una herramienta que te ayudará a hacer Sitios Web de manera rápida. Mi misión en este tutorial es cocinar demostrar lo anterior, y de paso ayudar al proyecto con una receta guía de uso. Como estoy acostumbrado haré este tutorial como si fuese una receta, [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2011%2F05%2Ftutorial-comenzando-con-perkins-framework%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2011%2F05%2Ftutorial-comenzando-con-perkins-framework%2F&amp;source=alvaroveliz&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Una de las premisas de Perkins Framework es que es una herramienta que te ayudará a hacer Sitios Web de manera rápida.<br />
Mi misión en este tutorial es cocinar <del>demostrar</del> lo anterior, y de paso ayudar al proyecto con una receta <del>guía de uso</del>.</p>
<p>Como estoy acostumbrado haré este tutorial como si fuese una receta, asi que tomen sus implementos y comencemos.<br />
<span id="more-213"></span></p>
<h2>Ingredientes</h2>
<ul>
<li>Explorador Web estándar  (FF3.6+, Chrome, Safari, Opera, Webkit gecko, IE9+)</li>
<li>Tener conocimientos de HTML4/5, CSS y Javascript</li>
<li>Estar relacionado con tipografías web (<a href="http://www.google.com/webfonts">@font-face</a>) y de alguna manera, saber como funciona <a href="http://lesscss.org/">LESS.js</a></li>
<li>La última versión del framework, ubicable en Google Code (<a href="http://code.google.com/p/perkins-less/">http://code.google.com/p/perkins-less/</a>)</li>
</ul>
<h2>Preparación</h2>
<p>Para comenzar debemos descargar la última versión de Perkins y descomprimir sus contenidos. Dentro del paquete nos encontramos con la siguiente estructura :</p>
<p><a href="http://blog.alvaroveliz.cl/wp-content/uploads/2011/05/perkins-1-files.png"><img class="aligncenter size-full wp-image-218" title="Perkins - Estructura de archivos" src="http://blog.alvaroveliz.cl/wp-content/uploads/2011/05/perkins-1-files.png" alt="" width="189" height="171" /></a></p>
<p>La lista de archivos que nos entrega <strong>Perkins</strong> es básicamente una estructura estándar para Sitios Web, divide sus contenidos según su tipo organizando las <em>imágenes</em> en <strong>images</strong>, librerías <em>javascript</em> en <strong>javascripts</strong> y los <em>estilos</em> css en  <strong>stylesheets</strong>.</p>
<p>Acá haremos nuestro primer apunte:</p>
<blockquote><p>Como Perkins se apoya en LESS para gestionar los estilos, en la carpeta <strong>stylesheets</strong> encontraremos archivos de extensión &#8220;less&#8221;, que son equivalentes a los de extensión &#8220;css&#8221;. El objetivo es utilizar archivos &#8220;.less&#8221; para nuestros estilos nuevos, sin embargo, eso no quita la posibilidad de seguir utilizando los archivos &#8220;css&#8221;.</p></blockquote>
<p>Nuestro siguiente paso es ver que nos entrega el archivo index.html, ¿No están intrigados? Veamos:</p>
<p><a href="http://blog.alvaroveliz.cl/wp-content/uploads/2011/05/perkins-2-reference.png"><img class="aligncenter size-medium wp-image-220" title="Perkins - Referencia" src="http://blog.alvaroveliz.cl/wp-content/uploads/2011/05/perkins-2-reference-177x300.png" alt="" width="177" height="300" /></a></p>
<p><strong>OMG! Es toda una referencia a los estilos, mixins y herramientas de Perkins</strong></p>
<p>Siendo sincero, la primera vez que vi este archivo no entendí mucho que era Perkins, pero como soy precavido supe que en algún momento lo utilizaría. Así que lo que hice después fue renombrarlo a <strong>help.html</strong> para poder accederlo cuando quiera. (Aquí es cuando ustedes también renombran el archivo para que no pierdan la referencia como alguna vez lo hice, sí, en realidad la perdí)</p>
<h2>Creando nuestro index</h2>
<p>El siguiente paso es crear nuestro <strong>index.html</strong> para comenzar con el diseño. Acá haré otro alto ya que probablemente <a href="http://twitter.com/carloselias">@carloselias</a> me hubiese dicho que copiase el archivo <em>index.html</em> a <em>help.html</em> y borrara todos los contenidos de <em>index.html</em>, pero mi intención es explicarles como funciona <strong>desde cero</strong> la creación de un sitio incluyendo las configuraciones y cabeceras necesarias, sabiendo que posteriormente crearán otros sitio del mismo modo.</p>
<p>Para crear nuestro index haremos lo siguiente:</p>
<h3>Crear la estructura básica</h3>
<p>Se recomienda que utilicen una estructura básica HTML5, como la siguiente:</p>
<pre class="brush: xml; title: ; notranslate">

&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;es&quot;&gt;
&lt;head&gt;
 &lt;meta charset=&quot;utf-8&quot;&gt;
 &lt;title&gt;Mi sitio web en perkins&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<h3>Incluir las librerías en la cabecera</h3>
<p>Acá debemos incluir liberías básicas como : less.js y el archivo app.less.<br />
Opcionalmente agregaré la cabecera de google chrome frame para el soporte en IE, y una librería para que IE9 reconozca los tags de HTML5.<br />
Además debemos agregar las tipografías y la configuración de tipografías utilizando Google Web Font.</p>
<pre class="brush: xml; title: ; notranslate">

&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;es&quot;&gt;
&lt;head&gt;
 &lt;meta charset=&quot;utf-8&quot;&gt;
 &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge,chrome=1&quot;&gt;
 &lt;title&gt;Mi sitio web en perkins&lt;/title&gt;
 &lt;link href=&quot;http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;&gt;
 &lt;link href=&quot;http://fonts.googleapis.com/css?family=PT+Sans+Narrow:regular,bold&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;&gt;
 &lt;link href=&quot;stylesheets/app.less&quot; media=&quot;all&quot; rel=&quot;stylesheet/less&quot; type=&quot;text/css&quot; /&gt;
 &lt;script src=&quot;javascripts/less-1.0.41.js&quot;&gt;&lt;/script&gt;
 &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;
 // Under development you should uncomment the following lines,
 // to make the browser refresh the changes that you are makeing in your app.less file.
 less.env = &quot;development&quot;;
 less.watch();
 &lt;/script&gt;
 &lt;!--[if lt IE 9]&gt;
 &lt;script src=&quot;http://html5shiv.googlecode.com/svn/trunk/html5.js&quot;&gt;&lt;/script&gt;
 &lt;![endif]--&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<h3>Configurar Perkins</h3>
<p>El siguiente y último paso es configurar perkins. Para esto abriremos el archivo &#8220;<strong>stylesheets/perkins.config.less</strong>&#8221; que contiene entre otras cosas la configuración de:</p>
<ul>
<li>Grillas (grids) : En las tres primeras configuraciones (@width, @columns, @margin)</li>
<li>Tipografías (@font-face): En las cuatro siguientes configuraciones</li>
<li>Colores (@color) : Donde se puede definir el color del sistema (@system), links y otros de rápido uso</li>
<li>Iconos (mnml.icons) : Una tipografía que viene con perkins que funciona para convertir texto en iconos</li>
<li>Core (p-core.less) : La librería core del sistema</li>
</ul>
<p>Luego de haber pasado por nuestra simple instalación de perkins podemos crear el sitio web, teniendo en cuenta que los estilos del sitio que desarrollemos deben estar alojados en el archivo &#8220;stylesheets/app.less&#8221;, que por cierto, podemos borrarlo o renombrarlo.</p>
<h2>Creando nuestro sitio</h2>
<p>Aprovechando los nuevos tags que nos entrega HTML5 haremos un sitio rápidamente y mostraré algunas de las cosas que podemos hacer utilizando <strong>Perkins</strong>.</p>
<h3>Header</h3>
<pre class="brush: xml; title: ; notranslate">
&lt;header&gt;
 &lt;div&gt;
 &lt;div&gt;
 &lt;h1&gt;
 Mi primer sitio con Perkins
 &lt;/h1&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/header&gt;
</pre>
<p>ZenCoding: header&gt;div.row&gt;div.grid16.column&gt;h1</p>
<h3>Seccion de contenido</h3>
<pre class="brush: xml; title: ; notranslate">

&lt;section id=&quot;content&quot;&gt;
 &lt;div class=&quot;row&quot;&gt;
   &lt;div class=&quot;grid-10 column&quot;&gt;Que locura de sitio web&lt;/div&gt;
   &lt;div class=&quot;grid-6 column&quot;&gt;Acá podría existir un nav o algo así no?&lt;/div&gt;
 &lt;/div&gt;
 &lt;/section&gt;
</pre>
<p>ZenCoding: section#content&gt;div.row&gt;div.grid-10.column+div.grid-6.column</p>
<h3>Footer</h3>
<pre class="brush: xml; title: ; notranslate">

&lt;footer&gt;
 &lt;div class=&quot;row&quot;&gt;
   &lt;div class=&quot;grid-16 column&quot;&gt;Served by Perkins&lt;/div&gt;
 &lt;/div&gt;
&lt;/footer&gt;
</pre>
<p>Zencoding: footer&gt;div.row&gt;div.grid-16.column</p>
<h3>Sal</h3>
<p>Editamos el archivo app.less y agregamos sal:</p>
<pre class="brush: css; title: ; notranslate">

body {
 background: @yellow;
}

header {
 background: @gray;
 height: 100px;
 color: @white;
}

#content {
 height: 300px;
}

footer {
 background: lighten(@gray, 20%);
 height: 100px;
}
</pre>
<h3>Pimienta</h3>
<p>Al header</p>
<pre class="brush: css; title: ; notranslate">
header {
 background: @gray;
 height: 100px;
 color: @white;
 .bs();
 h1 {
 border: 1px solid lighten(@gray, 15%);
 background: @green;
 .radius();
 padding: 10px;
 }
}
</pre>
<p>Al Footer</p>
<pre class="brush: css; title: ; notranslate">

footer {
 background: lighten(@gray, 20%);
 height: 100px;
 .bs();
 .ts();
 .tac();
}
</pre>
<p>&nbsp;</p>
<h3>Otras especias</h3>
<p>Agregamos un menu nav en donde decía &#8220;Acá podría existir un nav o algo así no?&#8221; (Línea 36 del index.html)</p>
<pre class="brush: xml; title: ; notranslate">

&lt;nav&gt;
  &lt;ul class=&quot;v-menu&quot;&gt;
   &lt;li&gt;&lt;a href=&quot;&quot;&gt;Inicio&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;&quot;&gt;Noticias&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;&quot;&gt;Contacto&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
 &lt;/nav&gt;
</pre>
<p>ZenCoding: nav&gt;ul.v-menu&gt;li*3&gt;a</p>
<p>Y le damos un poco de paprica :</p>
<pre class="brush: css; title: ; notranslate">

nav {
 ul {
 a {
 background: @green;
 color: @white;

 }
 }
}
</pre>
<h2>Acompañe con algo light y sirva a punto</h2>
<p>Encontraremos muchas más cosas si nos ponemos a revisar los archivos dentro de la carpeta perkins. Próntamente les tendré más tutoriales para que podamos adentrarnos en la herramienta, por ahora me despido y que tengan buen provecho!</p>
<p>By the way, if you need this tutorial in English use the Google Translator Toolbar or wait for the translation in Google Code.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvaroveliz.cl/2011/05/tutorial-comenzando-con-perkins-framework/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Instalar plugins en WordPress con un solo &#8220;click&#8221;</title>
		<link>http://blog.alvaroveliz.cl/2010/09/instalar-plugins-en-wordpress-con-solo-un-click/</link>
		<comments>http://blog.alvaroveliz.cl/2010/09/instalar-plugins-en-wordpress-con-solo-un-click/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 07:47:32 +0000</pubDate>
		<dc:creator>alvaroveliz</dc:creator>
				<category><![CDATA[Tips]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.alvaroveliz.cl/?p=172</guid>
		<description><![CDATA[Cuando tienes un blog de WordPress en tu dominio personal siempre tienes la posibilidad de cambiar los themes (como en mi caso, que dicho sea de paso fué actualizado), instalar plugins, entre otras cosas. Pero el problema está en que por defecto WordPress no viene con la posibilidad de hacerlo automáticamente, por lo tanto, incurrimos [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2010%2F09%2Finstalar-plugins-en-wordpress-con-solo-un-click%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2010%2F09%2Finstalar-plugins-en-wordpress-con-solo-un-click%2F&amp;source=alvaroveliz&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Cuando tienes un blog de <strong>WordPress</strong> en tu dominio personal siempre tienes la posibilidad de cambiar los themes (como en mi caso, que dicho sea de paso fué actualizado), instalar plugins, entre otras cosas.</p>
<p>Pero el problema está en que por defecto WordPress no viene con la posibilidad de hacerlo automáticamente, por lo tanto, incurrimos a subirlos <abbr title="Mediante FTP">&#8220;a mano&#8221;</abbr> al hosting, luego descomprimirlo y posteriormente activarlo y configurarlo.</p>
<p>Este problema puede ser solucionado con 3 simples pasos&#8230;<span id="more-172"></span></p>
<h2>Primer paso</h2>
<p>Dar permisos de escritura (777) a la carpeta &#8220;wp-content&#8221;</p>
<h2>Segundo paso</h2>
<p>Modificar el filtro &#8220;<em>filesystem_method</em>&#8221; editando el archivo &#8220;<strong>wp-config.php</strong>&#8221; y agregando las siguientes lineas al final del archivo:</p>
<pre class="brush: php; title: ; notranslate"> if(is_admin()) {
  add_filter('filesystem_method', create_function('$a', 'return &quot;direct&quot;;' ));
  define( 'FS_CHMOD_DIR', 0751 );
} </pre>
<h2>Tercer paso</h2>
<p>Los engañé, no existe un tercer paso.</p>
<p>Con esto ya podremos instalar themes, actualizar e instalar plugins automáticamente.</p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvaroveliz.cl/2010/09/instalar-plugins-en-wordpress-con-solo-un-click/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial: Crear un Plugin de jQuery (aSliderText)</title>
		<link>http://blog.alvaroveliz.cl/2010/05/tutorial-crear-un-plugin-de-jquery/</link>
		<comments>http://blog.alvaroveliz.cl/2010/05/tutorial-crear-un-plugin-de-jquery/#comments</comments>
		<pubDate>Wed, 26 May 2010 15:00:03 +0000</pubDate>
		<dc:creator>alvaroveliz</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Destacados]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[setBio]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.alvaroveliz.cl/?p=144</guid>
		<description><![CDATA[Luego de terminar la primera versión de setBio comenzamos a mejorar la aplicación, partiendo por el holder! El holder (el home cuando no estás logeado en la aplicación) tiene dos listas de biografías en la parte inferior de la página, ahí quize innovar implementando un plugin de jQuery que hiciera el efecto &#8220;slide&#8221; para cada [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2010%2F05%2Ftutorial-crear-un-plugin-de-jquery%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2010%2F05%2Ftutorial-crear-un-plugin-de-jquery%2F&amp;source=alvaroveliz&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Luego de terminar la primera versión de <a href="http://setbio.com"><strong>setBio</strong></a> comenzamos a mejorar la aplicación, partiendo por el holder!<br />
El holder (el home cuando no estás logeado en la aplicación) tiene dos listas de biografías en la parte inferior de la página, ahí quize innovar implementando un plugin de jQuery que hiciera el efecto &#8220;slide&#8221; para cada biografía.</p>
<p>El tema es que no encontré el plugin, es decir, lo encontré&#8230;pero eran demasiado para una función tan simple. Es por eso que tomé la decisión de hacerlo a mi modo, pero para hacerlo interesante me propuse aprender como es la <strong>creación de un plugin de jQuery</strong>.</p>
<p><span id="more-144"></span></p>
<h2>Idea principal</h2>
<p>Para crear el <strong>plugin de jQuery</strong> hice algunas pruebas &#8220;en duro&#8221; (hardcode) en el <a href="http://api.jquery.com/ready/"><em>document ready</em></a>.</p>
<p>La idea principal fué al siguiente:</p>
<ul>
<li>Sacar el último elemento de una lista (UL-LI) y luego dejarlo como primer elemento</li>
<li>Realizar la función anterior cada cierto tiempo utilizando <a href="http://www.w3schools.com/jsref/met_win_setinterval.asp">setInterval</a></li>
</ul>
<p>El html es una lista simple como la siguiente:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;ul id=&quot;biographies&quot;&gt;
  &lt;li&gt;Lorem ipsum dolor sit am...&lt;/li&gt;
  &lt;li&gt;Lorem ipsum dolor sit am...&lt;/li&gt;
  &lt;li&gt;Lorem ipsum dolor sit am...&lt;/li&gt;
  &lt;li&gt;Lorem ipsum dolor sit am...&lt;/li&gt;
  &lt;li&gt;Lorem ipsum dolor sit am...&lt;/li&gt;
  &lt;li&gt;Lorem ipsum dolor sit am...&lt;/li&gt;
  &lt;li&gt;Lorem ipsum dolor sit am...&lt;/li&gt;
  &lt;li&gt;Lorem ipsum dolor sit am...&lt;/li&gt;
  &lt;li&gt;Lorem ipsum dolor sit am...&lt;/li&gt;
  &lt;li&gt;Lorem ipsum dolor sit am...&lt;/li&gt;
&lt;/ul&gt;
</pre>
<p>y el código que hace el efecto slider es el siguiente:</p>
<pre class="brush: jscript; title: ; notranslate">
$(document).ready(function(){
  // Agrego un overflow para ocultar algunos resultados
  $('#biographies').css('height', 470).css('overflow', 'hidden');
  setInterval(&quot;sliderText()&quot;, 5000);
});

function sliderText() {
  $('#biographies').prepend('&lt;li&gt;' + $('li:last', $('#biographies')).html() + '&lt;/li&gt;');
  $('li:first-child', $('#biographies')).hide().fadeIn('slow');
  $('li:last', $('#biographies')).remove();
}
</pre>
<h2>Creando el plugin</h2>
<p>Ahora, para convertir esto en plugin no hubo demasiada ciencia. <strong>jQuery</strong> nos dice cómo es que se debe crear un plugin en su sitio web y al final nos da la clave de <a href="http://docs.jquery.com/Plugins/Authoring#Putting_It_All_Together"><strong>cómo debemos comenzar</strong></a></p>
<p>Utilizando esta información nos resulta algo como lo siguiente:</p>
<pre class="brush: jscript; title: ; notranslate">
(function($){
 	$.fn.extend({
 		aSliderText: function(options) {
			var defaults = {
				updateTime: 6000,
				height: 0,
				element: 'li'
			}
			var options = $.extend(defaults, options);

    	return this.each(function() {
				var o = options;
				var obj = $(this);

				if (o.height &gt; 0) {
					obj.css('height', o.height).css('overflow', 'hidden');
				}

	 			var updateSlider = function() {
					obj.prepend('&lt;'+o.element+'&gt;' + $(o.element+':last', obj).html() + '&lt;/'+o.element+'&gt;');
					$(o.element + ':first-child', obj).hide().fadeIn('slow');
					$(o.element + ':last', obj).remove();
	 			};

				window.setInterval(updateSlider, options.updateTime);
    	});

    }
	});
})(jQuery);
</pre>
<p>Acá utilicé un truco para crear el setInterval e utilizar la función de jQuery. Se entrega como parametro una función como tal, es por eso que creamos la variable updateSlider como función.</p>
<p>Luego, se utiliza el plugin del siguiente modo:</p>
<pre class="brush: jscript; title: ; notranslate">
$('#biographies').aSliderText({updateTime:7000, height: 560});
</pre>
<h2>Descarga y Demo</h2>
<p>El plugin está bajo la <a href="http://www.opensource.org/licenses/mit-license.php">Licencia MIT</a> que puede ser descargado acá: <a href="http://alvaroveliz.cl/aslidertext/jquery.aslidertext.zip">jQuery aSliderText v0.1</a> y si quieren ver el <strong>DEMO</strong>, revisen aquí: <a href="http://alvaroveliz.cl/aslidertext/">jQuery aSliderText DEMO</a></p>
<p><a href="http://blog.alvaroveliz.cl/wp-content/uploads/2010/05/jqueryplugin.png" class="thickbox"><img class="alignright size-medium  wp-image-160" style="margin-left: 10px; margin-right: 10px;" title="jQuery plugins" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/05/jqueryplugin-300x217.png" alt="" width="300" height="217" /></a></p>
<p>También pueden visitar la página de plugin en <a href="http://plugins.jquery.com/project/aSliderText"><strong>jQuery Plugins</strong></a></p>
<p>Aún estoy haciendo pruebas con este plugin con el objetivo de publicar una versión más estable, así que si lo descargan deben saber que aún puede tener bugs o no funcionar con versiones antiguas de jQuery.</p>
<p>Saludos y suerte con esos <strong>plugins</strong>!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvaroveliz.cl/2010/05/tutorial-crear-un-plugin-de-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les presento &#8220;setBio.com&#8221;</title>
		<link>http://blog.alvaroveliz.cl/2010/05/setbio/</link>
		<comments>http://blog.alvaroveliz.cl/2010/05/setbio/#comments</comments>
		<pubDate>Tue, 25 May 2010 15:00:42 +0000</pubDate>
		<dc:creator>alvaroveliz</dc:creator>
				<category><![CDATA[Aplicaciones]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Personales]]></category>
		<category><![CDATA[app]]></category>
		<category><![CDATA[setBio]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.alvaroveliz.cl/?p=127</guid>
		<description><![CDATA[setBio es una aplicación que permite que tus amigos te escriban una biografía que defina tu perfil en Twitter. Cómo nace la idea? La idea nace de la necesidad de aquellas personas que no tienen la capacidad de definirse a sí mismos o que simplemente no están interesados en escribir alguna información que los describa. [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2010%2F05%2Fsetbio%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2010%2F05%2Fsetbio%2F&amp;source=alvaroveliz&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><strong><a href="http://setbio.com">setBio</a></strong> es una aplicación que permite que tus amigos te escriban una biografía que defina tu perfil en <a href="http://twitter.com">Twitter</a>.</p>
<p><a href="http://setbio.com"><img class="aligncenter size-medium wp-image-128" title="setBio" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/05/setbio-300x83.png" alt="Deja que tus seguidores te describan" width="300" height="83" /></a></p>
<h3>Cómo nace la idea?</h3>
<p>La idea nace de la necesidad de aquellas personas que no tienen la capacidad de definirse a sí mismos o que simplemente no están interesados en escribir alguna información que los describa. Junto a <a href="http://carloselias.cl">Carlos Elías</a> desarrollamos el concepto, lo comenzamos hace 3 meses y se terminó en 3 días. Yo desarrollé la aplicación y él creo el diseño.<span id="more-127"></span></p>
<h3>Cómo se ocupa?</h3>
<p>Es bien simple, debes ingresar a la aplicación con tu cuenta <a href="http://setbio.com/account/signup">Twitter</a>, luego presionar el boton &#8220;Escribir una Bio&#8221; y rellenar el formulario para enviar biografías a tus amigos. El formulario te permitirá seleccionar el amigo al cual quieres escribirle la biografía y definir un mensaje para que le avises a través de Twitter.</p>
<p>Cuando tu amigo reciba el mensaje e ingrese, podrá ver las biografías que le hayan enviado y también podrá compartir biografías con sus propios amigos.</p>
<h3>Por qué es útil?</h3>
<p>Sabes por qué es útil? Pues porque Twitter utiliza la Biografía del usuario como descripción del perfil (a nivel de página) y eso permite la indexación de tu perfil de Twitter en los buscadores en base a lo que dice tu descripción.</p>
<p>Por ejemplo, veamos el perfil de Twitter de <a href="http://twitter.com/edoapp">@edoApp</a></p>
<p style="text-align: left;"><img class="size-full wp-image-129 aligncenter" style="border: 1px solid black;" title="Perfil de edo en Twitter" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/05/edoapp1.png" alt="" width="251" height="228" /></p>
<p>El código que encontramos es el siguiente:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;meta content=&quot;Un pequeño muy bien educado, te ayudará a editar tus sitios web de forma muy rápida. — @alvaroveliz&quot; name=&quot;description&quot; /&gt;
</pre>
<p><strong>Y ESTO QUE SIGNIFICA?</strong>.<br />
Significa que mientras mejor esté descrito el <strong>meta description</strong> de la página del perfil, mejor será indexada. Es como hacer <abbr title="Search Engine Optimization">SEO</abbr> con la ayuda de tus amigos&#8230;.se entiende?</p>
<h3>Cómo ayudar?</h3>
<p>No se preocupen, no les voy a pedir donaciones, solamente necesito que me ayuden utilizando la aplicación, enviando sus comentarios, sugerencias y errores a <a href="http://setbio.com">@setBio</a>&#8230;AH! y claro, <strong>envíando todas las biografías que quieran!</strong></p>
<p>Muchas gracias por utilizar la aplicación, sinceramente. <img src='http://blog.alvaroveliz.cl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvaroveliz.cl/2010/05/setbio/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Twitter en sidebar de Firefox sin extensiones</title>
		<link>http://blog.alvaroveliz.cl/2010/05/twitter-en-sidebar-de-firefox-sin-extensiones/</link>
		<comments>http://blog.alvaroveliz.cl/2010/05/twitter-en-sidebar-de-firefox-sin-extensiones/#comments</comments>
		<pubDate>Tue, 11 May 2010 17:32:07 +0000</pubDate>
		<dc:creator>alvaroveliz</dc:creator>
				<category><![CDATA[Tips]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.alvaroveliz.cl/?p=114</guid>
		<description><![CDATA[Una forma muy simple de usar Twitter en Firefox sin instalar extensiones es sacando el provecho de su versión mobile: Ingresa con tu cuenta a http://m.twitter.com Arrastra la pestañana a tus favoritos Presiona el botón derecho en el favorito arrastrado y seleciona la opción &#8220;Propiedades&#8221;, ahí seleciona &#8220;Cargar este marcador en el panel lateral&#8221; Ahora [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2010%2F05%2Ftwitter-en-sidebar-de-firefox-sin-extensiones%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2010%2F05%2Ftwitter-en-sidebar-de-firefox-sin-extensiones%2F&amp;source=alvaroveliz&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Una forma muy simple de usar Twitter en Firefox sin instalar extensiones es sacando el provecho de su versión mobile:</p>
<p><strong>Ingresa con tu cuenta a <a href="http://m.twitter.com">http://m.twitter.com</a></strong></p>
<p style="text-align: center;"><a href="http://blog.alvaroveliz.cl/wp-content/uploads/2010/05/mobile.png" class="thickbox"><img class="size-medium wp-image-116 aligncenter" title="Twitter mobile" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/05/mobile-169x300.png" alt="" width="155" height="274" /></a></p>
<p><strong>Arrastra la pestañana a tus favoritos</strong></p>
<p style="text-align: center;"><a href="http://blog.alvaroveliz.cl/wp-content/uploads/2010/05/marcador.png" class="thickbox"><img class="size-medium wp-image-115 aligncenter" title="Arrastrar marcador" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/05/marcador-300x143.png" alt="" width="210" height="100" /></a></p>
<p><strong>Presiona el botón derecho en el favorito arrastrado y seleciona la opción &#8220;Propiedades&#8221;, ahí seleciona &#8220;Cargar este marcador en el panel lateral&#8221;</strong></p>
<p style="text-align: center;"><a href="http://blog.alvaroveliz.cl/wp-content/uploads/2010/05/propiedades.png" class="thickbox"><img class="size-medium wp-image-117 aligncenter" title="Propiedades de  marcador" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/05/propiedades-300x224.png" alt="" width="300" height="224" /></a></p>
<p><strong>Ahora cierra la pestaña de twitter mobile y presiona el marcador </strong></p>
<p style="text-align: center;"><a href="http://blog.alvaroveliz.cl/wp-content/uploads/2010/05/sidebar.png" class="thickbox"><img class="size-medium wp-image-118 aligncenter" title="Sidebar firefox" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/05/sidebar-132x300.png" alt="" width="132" height="300" /></a></p>
<p>Fácil no? <img src='http://blog.alvaroveliz.cl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvaroveliz.cl/2010/05/twitter-en-sidebar-de-firefox-sin-extensiones/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TOL: Tweet out Loud</title>
		<link>http://blog.alvaroveliz.cl/2010/04/tol-tweet-out-loud/</link>
		<comments>http://blog.alvaroveliz.cl/2010/04/tol-tweet-out-loud/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 18:18:07 +0000</pubDate>
		<dc:creator>alvaroveliz</dc:creator>
				<category><![CDATA[Aplicaciones]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[app]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[tol]]></category>

		<guid isPermaLink="false">http://blog.alvaroveliz.cl/?p=109</guid>
		<description><![CDATA[Ayer, fué un día de revelación y motivación. Me disponía a irme a la Universidad cuándo de la nada se me ocurrió mezclar Twitter con un TTS, es decir, crear una aplicación leyera los tweets. Lo encontré entretenido, así que en el camino modelé y diseñe la solución a mi problema. Ya estando en clases, [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2010%2F04%2Ftol-tweet-out-loud%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2010%2F04%2Ftol-tweet-out-loud%2F&amp;source=alvaroveliz&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Ayer, fué un día de revelación y motivación. Me disponía a irme a la Universidad cuándo de la nada se me ocurrió mezclar Twitter con un <a href="http://es.wikipedia.org/wiki/Conversor_texto-voz">TTS</a>, es decir, crear una aplicación leyera los tweets. Lo encontré entretenido, así que en el camino modelé y diseñe la solución a mi problema.</p>
<p>Ya estando en clases, el profesor nos hablaba sobre &#8220;<em>recursos, requerimientos y bloqueos</em>&#8221; mientras yo programaba usando <a href="http://kohanaphp.com/">Kohana</a> lo que iba a ser mi aplicación. Cuando terminaron las clases ya tenía el <strong>50%</strong> de la aplicación, podía hacer un registro y login con Twitter usando <a href="http://es.wikipedia.org/wiki/OAuth">oAuth</a>. Llamé a mi amigo <a href="http://carloselias.cl">Carlos Elías</a> para que pensara en una &#8220;<strong>UI</strong>&#8221; para la aplicación.</p>
<p>A las 12 de la noche estaba lista la interfaz y solo faltaba coordinar el <a href="http://lifehacker.com/5426797/google-translate-url-generates-instant-text+to+speech-mp3-files">TTS de Google Translate</a> con el player de <a href="http://googlesystem.blogspot.com/2006/07/embed-mp3-files-into-your-website.html">Google Reader</a>.</p>
<p>Hoy, 16 de Abril de 2010, he lanzado <a href="http://utolus.com">TOL: Tweet out Loud</a> en versión beta.</p>
<p>Los invito a usarla!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvaroveliz.cl/2010/04/tol-tweet-out-loud/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial: Crear una aplicación para Facebook (FBML)</title>
		<link>http://blog.alvaroveliz.cl/2010/03/tutorial-crear-una-aplicacion-para-facebook-fmbl-2/</link>
		<comments>http://blog.alvaroveliz.cl/2010/03/tutorial-crear-una-aplicacion-para-facebook-fmbl-2/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 14:00:20 +0000</pubDate>
		<dc:creator>alvaroveliz</dc:creator>
				<category><![CDATA[Destacados]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[fracework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.alvaroveliz.cl/?p=68</guid>
		<description><![CDATA[Una vez estaba en la cocina preparándome un café cuando de repente me bajó la inspiración y decidí hacer una aplicación Facebook. La investigación fue ardua, hice las pruebas de concepto respectivas y logré mi cometido. Sin embargo, por cosas de tiempo no  terminé la aplicación para variar y quedó stand by hasta el próximo [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2010%2F03%2Ftutorial-crear-una-aplicacion-para-facebook-fmbl-2%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2010%2F03%2Ftutorial-crear-una-aplicacion-para-facebook-fmbl-2%2F&amp;source=alvaroveliz&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Una vez estaba en la cocina preparándome un café cuando de repente me bajó la inspiración y decidí hacer una aplicación <strong>Facebook</strong>. La investigación fue ardua, hice las <a href="http://blog.alvaroveliz.cl/2009/11/las-pruebas-de-concepto-en-el-desarrollo-de-software/" target="_self">pruebas de concepto</a> respectivas y logré mi cometido. Sin embargo, por cosas de tiempo no  terminé la aplicación <span style="text-decoration: line-through;">para variar</span> y quedó <em>stand by</em> hasta el próximo semestre.</p>
<p>Hace unos días, me pidieron ayuda para hacer lo mismo usando lenguaje <strong>FBML</strong> y recordé lo que ya había realizado. Pero como la memoria es frágil decidí utilizar a nuestro amigo Google para resolver algunas dudas que tenía. Para mi sorpresa, no encontré lo que necesitaba, así que por lo tanto decidí hacer un Tutorial en <strong>lenguaje humano</strong> para que todos <span style="text-decoration: line-through;">los desarrolladores</span> entendamos como es que debemos hacer una aplicación para Facebook compatible con la versión actual. Así que, manos a la obra!<br />
<span id="more-68"></span></p>
<h2>Como funciona una aplicacion Facebook?</h2>
<p><strong>Facebook</strong> soporta dos formatos de aplicaciones externas, aplicaciones creadas usando <a href="http://wiki.developers.facebook.com/index.php/FBML" target="_self"><strong>FBML</strong></a> y las que usan <span style="text-decoration: line-through;">el no estandar</span> iframe. Para este tutorial nos enfocaremos en la creación de aplicaciones usando <strong>FBML</strong>, ya que es una opción importante cuando se necesita usar las gráficas y herramientas de Facebook nativas.</p>
<p>Antes de seguir les recomiendo leer el <a href="http://developers.facebook.com/get_started.php?tab=tutorial">Tutorial que Facebook dispone como introducción</a> para que entiendan con mayor claridad, luego de eso, sigan con la este tutorial.</p>
<h2>Ingredientes</h2>
<ul>
<li>Tener conocimientos de HTML, CSS y de PHP</li>
<li>Contar con un hosting y dominio para subir la aplicación</li>
<li>Librerias cliente PHP de Facebook &#8211; <a href="http://svn.facebook.com/svnroot/platform/clients/packages/facebook-platform.tar.gz">Que puedes descargar aquí</a></li>
<li>Ser parte de Facebook Developers &#8211; Si no eres parte, debes ingresar en <a href="http://www.facebook.com/developers/">App Developers</a></li>
<li>Un objetivo de aplicación, por ejemplo: &#8220;Una aplicación para mostrar <strong>mi último mensaje de twitter</strong>!&#8221;</li>
</ul>
<h2>Creando la aplicacion</h2>
<p>Como ya contamos con todos estos nuestros ingredientes podemos comenzar con la <strong>creación de la aplicación</strong>.</p>
<p>Lo primero en el menú es <a href="http://www.facebook.com/developers/createapp.php">Configurar una nueva aplicación</a>, esto lo podemos hacer en la App de Developers de Facebook  haciendo click en el botón &#8220;<strong>+ Configurar una nueva aplicación</strong>&#8221; o, si estás más atento, haciendo click en el link anterior.<br />
Acá entraré en detalle para guiarlos mejor:</p>
<ul>
<li>Escribimos el nombre de nuestra aplicación y aceptamos los términos y condiciones.<br />
<a class="thickbox" href="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/Paso1_fb.png"><img class="size-medium wp-image-84 alignnone" style="border: 1px solid #dddddd; padding: 4px;" title="Paso 1 - Creación Facebook App" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/Paso1_fb-300x139.png" alt="" width="300" height="139" /></a></li>
<li>La siguiente pantalla nos entrega información relacionada con nuestra aplicación y que ocuparemos para el desarrollo: <strong>Application ID, API Key, Secret</strong>. Estos valores son los que nos identifican con Facebook como aplicación y que nos permite interactuar con Facebook y los usuarios. Estos datos son sumamente importantes y nunca deben ser revelados, bueno, el nombre sí.<br />
<a class="thickbox" href="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/Paso2_fb.png"><img class="size-medium wp-image-85 alignnone" style="border: 1px solid #dddddd; padding: 4px;" title="Paso 2 - Creación facebook app" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/Paso2_fb-300x209.png" alt="" width="300" height="209" /></a></li>
<li>A la izquierda tenemos un menú de configuración donde nos enfocaremos en los siguientes puntos: <strong>&#8220;Auth (Autencación)&#8221;</strong>, &#8220;<strong>Profiles (Perfiles)</strong>&#8220;, &#8220;<strong>Advanced (Avanzado)</strong>&#8221; y &#8220;<strong>Canvas (Lienzo)</strong>&#8220;.</li>
<li>En  <strong>&#8220;Auth (Autencación)&#8221; </strong>seleccionamos &#8220;Disponible para usuarios&#8221; y en Post-Authorize Callback URL escribimos la URL de retorno, es decir, &#8220;<strong>http://apps.facebook.com/ultimotwitterupdate/</strong>&#8220;</li>
<li>En &#8220;<strong>Profiles (Perfiles)</strong>&#8221; debemos escribir el <em>Tab Name</em> y el <em>Tab URL.</em><br />
En el Tab Name debemos escribir un nombre de no más de 16 caracteres (&#8220;<strong>Ultimo Update</strong>&#8220;) y en el Tab URL debemos definir la URL donde se encuentra la vista de nuestra aplicación para los perfiles (&#8220;<strong>tab</strong>&#8220;).<br />
El Profile Box es la forma en que se mostrara en las cajas del perfil por defecto, por ejemplo &#8220;<strong>Narrow</strong>&#8220;.</li>
<li>La seccion de &#8220;<strong>Advanced (Avanzado)</strong>&#8221; nos sirve para dejar nuestra aplicación en &#8220;<strong>Sandbox Mode</strong>&#8221; y así solo los desarrolladores podrán verla. Debemos activar esta opción antes de seguir.</li>
<li>En la sección &#8220;<strong>Canvas (Lienzo)</strong>&#8221; se define la URL que contiene el despliegue (layout) de la aplicación y de donde Facebook debe obtenerlo para mostrarlo. Para configurarlo vamos a escribir &#8220;<strong>ultimotwitterupdate</strong>&#8221; en la URL de la página y <strong>http://www.midominio.com/ultimotwitterupdate/</strong> en <strong>Canvas Callback URL</strong>. Para ver los cambios realizados debemos desarrollar en forma local y subir mediante FTP.<br />
Luego, en la sección donde dice &#8220;<strong>Render Method (Método de renderización)</strong>&#8221; debemos seleccionar <strong>FBML</strong>, los otros datos quedan por defecto.</li>
<li>Guardamos los cambios.</li>
</ul>
<h2>A ensuciarse las manos</h2>
<p>Ahora es cuando viene la parte mas entretenida de la historia, el desarrollo de la aplicación.</p>
<p>Pero, un momento&#8230;<strong>no tengo idea de que debe hacer la aplicación</strong>! Mejor investigo todo lo necesario en base al objetivo planteado y luego, defino la conclusión.</p>
<p>El proceso anteriormente nombrado dio como resultado dos objetivos más específicos:</p>
<ul>
<li><strong>&#8220;Debo usar la API de Twitter para traer el último mensaje de un usuario en formato JSON&#8221;</strong><br />
Pero, y cómo? Del siguiente modo, usamos la API de Twitter para llegar a la información de algún usuario:<br />
<em>http://api.twitter.com/1/statuses/user_timeline.json?screen_name=<strong>USUARIO_TWITTER</strong>&amp;count=1</em></li>
<li><strong>&#8220;El usuario Facebook elige el nombre de usuario y se almacena en una base de datos (SQLite)&#8221;.</strong><br />
Listo! Ahora que tengo claro lo que debo hacer voy a dedicarme al layout en Facebook, porque si quiero realizar la aplicación primero debo saber verla funcionando.</li>
</ul>
<p>Para esto, tenemos que conocer un poco más de <strong>FBML</strong>, así que les dejo la misión de leer sobre este lenguaje en el <a href="http://wiki.developers.facebook.com/index.php/Main_Page" target="_self">Wiki de Facebook</a>.</p>
<h3>Preparar bien la mesa</h3>
<p>Antes de partir con el sitio debemos configurar un archivo que permita la comunicación entre Facebook y la aplicación. Dicho archivo se llama &#8220;<strong>xd_receiver.htm</strong>&#8221; y es un archivo que va en la raiz del sitio. Su contenido es el siguiente:</p>
<pre class="brush: xml; title: ; notranslate">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; &gt;
&lt;head&gt;
&lt;title&gt;Cross-Domain Receiver Page&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;script src=&quot;http://static.ak.facebook.com/js/api_lib/v0.4/XdCommReceiver.js?2&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Si quieren leer más sobre esto pueden hacerlo en el <a href="http://wiki.developers.facebook.com/index.php/Cross_Domain_Communication_Channel">Wiki de Facebook: Cross-Domain Communication Channel</a></p>
<h3>&#8220;Aunque no venia preparado&#8221;</h3>
<p>Ahora viene lo importante. Yo sé que ustedes esperan que explique todo el código de conexión y de configuración para la App Facebook, pero les quiero contar que me adelanté y les traje una especie de <em>framework</em> que les facilitará muchas de las tareas. Este <em>framework</em> se creó en base a otras aplicaciones que tenía desarrolladas y que me hicieron pensar en la <strong>real ayuda</strong> de este tutorial, su nombre es &#8220;<strong>Fracework</strong>&#8221; y lo pueden revisar en: <a href="http://code.google.com/p/fracework/">http://code.google.com/p/fracework/</a></p>
<p>Esta suerte de <em>framework, </em>permite configurar la aplicación y crear las vistas. Probablemente cuando lo vean no va a ser lo que esperan <span style="text-decoration: line-through;">a nivel de código</span>, pero estoy seguro que les va a ser muy útil.</p>
<p>El contenido de <strong>Fracework</strong> tiene la siguiente estructura de archivos:</p>
<ul>
<li>client/ : Libreria cliente PHP de Facebook</li>
<li>config/ : Archivo de configuraciones de la aplicación</li>
<li>includes/ : Conexión con facebook, instancia de clase clientes</li>
<li>modules/ : Modulos de la aplicación</li>
<li>views/ : Vistas de la aplicación</li>
<li>index.php : Archivo que muestra las distintas vistas</li>
<li>xd_receiver.htm : Cross-Domain Communication Channel</li>
</ul>
<p>Para utilizarlo solo deben descomprimir el archivo en la carpeta de la aplicación y comenzar a desarrollar.</p>
<h3>Configuracion</h3>
<p>En la carpeta &#8220;<strong>config</strong>&#8220;, de nuestra aplicación, nos encontramos con el archivo de configuraciones de la aplicación &#8220;<strong>facebook.php</strong>&#8220;, acá editamos los datos de nuestra aplicación y guardamos:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
/**
* Facebook App client
* @author @alvaroveliz
**/

$fb_apikey        = '...'; // Configurar API KEY
$fb_secret        = '...'; // Secret Key
$app_callbackurl  = 'http://www.midominio.com/ultimotwitterupdate/'; // APP Canvas URL
$canvas_url       = 'http://apps.facebook.com/ultimotwitterupdate/'; // Canvas URL

?&gt;</pre>
<p>Recuerdan que les comente en la creación de la aplicación sobre los datos &#8220;importantes&#8221;, bueno, acá es donde se deben configurar.</p>
<h3>Hello World</h3>
<p>En la carpeta &#8220;<strong>views</strong>&#8221; encontramos 3 archivos:</p>
<ul>
<li>default.php: Vista general de la aplicación</li>
<li>profile.php: Vista de caja caja en el perfil</li>
<li>global.php: Vista de tab  (cuadro) en el perfil (narrow y wide)</li>
<li>Las vistas personalizadas se agregan en la carpeta &#8220;views&#8221; y se ven usando el parámetro &#8220;section&#8221;. Por ejemplo &#8220;index.php?section=help&#8221; mostrará la vista help.php</li>
</ul>
<p>Ahora, para hacer la prueba de &#8220;Hello world&#8221;, editamos el archivo <strong>default.php</strong> y agregamos &#8220;&lt;h1&gt;Hello facebook app&lt;/h1&gt;&#8221; como dice el código:</p>
<pre class="brush: xml; title: ; notranslate">&lt;fb:fbml version=&quot;1.0&quot;&gt;
&lt;h1&gt;Hello facebook app&lt;/h1&gt;
&lt;/fb:fbml&gt;</pre>
<p>Subimos al servidor nuestra aplicación y vamos a la dirección http://apps.facebook.com/ultimotwitterupdate/, en esta dirección vamos a ver nuestra aplicación creada, pero antes debemos agregarla a nuestro perfil.</p>
<p>Luego de agregarla, la aplicación nos mostrará el siguiente resultado:</p>
<p><a class="thickbox" href="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/develop_fb.png"><img class="alignnone size-medium wp-image-86" style="border: 1px solid #dddddd; padding: 4px;" title="Facebook App Hello World" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/develop_fb-300x158.png" alt="" width="300" height="158" /></a></p>
<h3>Agregando el boton para perfil</h3>
<p>Como ya tenemos nuestra aplicación andando, podemos agregar un código FBML que nos permitirá llegar más lejos aún. Por ejemplo, con la siguiente linea podremos agregar un botón que permitirá agregar nuestra aplicación como caja en el perfil.</p>
<p>Editamos el archivo de vistas &#8220;<strong>default.php</strong>&#8221; y agregamos:</p>
<pre class="brush: xml; title: ; notranslate">&lt;fb:add-section-button section=&quot;profile&quot; /&gt;</pre>
<p>Esto nos da el siguiente resultado:</p>
<p><a class="thickbox" href="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/dev2_popup.png"><img class="alignnone size-medium wp-image-87" style="padding: 4px;" title="Facebook app Agregar a perfil" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/dev2_popup-300x212.png" alt="" width="300" height="212" /></a> <a class="thickbox" href="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/dev2_fb.png"><img class="alignnone size-medium wp-image-88" style="padding: 4px;" title="Facebook app Cuadros" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/dev2_fb-300x119.png" alt="" width="300" height="119" /></a></p>
<h3>&#8220;Guayerfreims&#8221;</h3>
<p>Ahora que tenemos andando la aplicación, nos vamos a enfocar en nuestro ejemplo.</p>
<p>El layout de nuestro ejemplo debe preguntar cual es el nick del usuario en twitter, para que traiga dinámicamente el último update, luego deberá mostrarlo. (Como consideración, el usuario no debe tener sus updates protegidos)</p>
<p>Está sería la disposición del despliegue:</p>
<p><a class="thickbox" href="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/wireframe_facebook_1.jpg"><img class="alignnone size-medium wp-image-91" style="padding: 4px;" title="Facebook app Wireframe 1" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/wireframe_facebook_1-225x300.jpg" alt="" width="225" height="300" /></a> <a class="thickbox" href="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/wireframe_facebook_2.jpg"><img class="alignnone size-medium wp-image-92" style="padding: 4px;" title="Facebook app Wireframe 2" src="http://blog.alvaroveliz.cl/wp-content/uploads/2010/03/wireframe_facebook_2-225x300.jpg" alt="" width="225" height="300" /></a></p>
<h3>El modelo de datos</h3>
<p>Luego que hicimos nuestros layouts en papel, nos debemos enfocar en el modelo de datos. En nuestra base de datos debemos guardar la información que nos permita relacionar usuario de facebook y usuario twitter, esta podría ser la mejor opción: &#8220;id de usuario de facebook&#8221;, &#8220;nombre usuario de twitter&#8221;, &#8220;mensaje ultimo update&#8221;, &#8220;fecha y hora de ultima consulta&#8221;.</p>
<p>La única tabla que necesito la nombraremos como &#8220;<strong>last_updates</strong>&#8220;:</p>
<ul>
<li>id:integer(11), PK</li>
<li>facebook_user:integer(11)</li>
<li>twitter_username:varchar(30)</li>
<li>last_update:varchar(140)</li>
<li>last_query:datetime</li>
</ul>
<p>La instrucción SQL sería del siguiente modo:</p>
<pre class="brush: sql; title: ; notranslate">CREATE  TABLE &quot;last_updates&quot; (&quot;id&quot; INTEGER PRIMARY KEY  NOT NULL , &quot;facebook_user&quot; INTEGER NOT NULL , &quot;twitter_username&quot; VARCHAR(30) NOT NULL , &quot;last_update&quot; VARCHAR(140) NOT NULL , &quot;last_query&quot; DATETIME NOT NULL )</pre>
<h3>El código da App</h3>
<p>De acuerdo a los &#8220;<em>wireframes</em>&#8221; el código de la vista por defecto será del siguiente modo:</p>
<p><strong>Vista default.php</strong></p>
<pre class="brush: xml; title: ; notranslate">&lt;fb:fbml version=&quot;1.0&quot;&gt;

	&lt;fb:dashboard&gt;
		&lt;fb:help href=&quot;index.php?section=help&quot;&gt;Ayuda&lt;/fb:help&gt;
	&lt;/fb:dashboard&gt;

	Ingrese el nick del usuario (el usuario no debe tener los updates protegidos)
	&lt;br /&gt;
	&lt;form name=&quot;save_user&quot; method=&quot;post&quot; action=&quot;&quot;&gt;
		&lt;input type=&quot;text&quot; id=&quot;twitter_user&quot; name=&quot;twitter_user&quot; size=&quot;20&quot; /&gt; &lt;input type=&quot;submit&quot; value=&quot;Definir usuario&quot; /&gt;
	&lt;/form&gt;

	&lt;div id=&quot;update-quote&quot;&gt;
	&lt;/div&gt;

	&lt;br /&gt;
	&lt;fb:add-section-button section=&quot;profile&quot; /&gt;

&lt;/fb:fbml&gt;</pre>
<p><strong>Vista global.php</strong></p>
<pre class="brush: xml; title: ; notranslate">&lt;fb:narrow&gt;

	&lt;div id=&quot;update-quote&quot;&gt;
		Narrow View
	&lt;/div&gt;

&lt;/fb:narrow&gt;

&lt;fb:wide&gt;

	&lt;div id=&quot;update-quote&quot;&gt;
		Wide View
	&lt;/div&gt;

&lt;fb:wide&gt;</pre>
<p><strong>Vista profile.php</strong></p>
<pre class="brush: xml; title: ; notranslate">&lt;div id=&quot;update-quote&quot;&gt;
&lt;/div&gt;</pre>
<p>Con un poco de estilos podríamos llegar a nuestro objetivo con mayor efectividad, pero por el momento solo haré el ejemplo con una aplicación <span style="text-decoration: line-through;">casi</span> por defecto.</p>
<h3>El módulo &#8220;app.php&#8221;</h3>
<p>Para habilitar los módulos que vamos creando, se debe editar el archivo &#8220;config/app.php&#8221; y agregar al arreglo el nombre de la app, por ejemplo:</p>
<pre class="brush: php; title: ; notranslate">$modules = array(
'app', // Modulo de Aplicacion
);</pre>
<p>Este módulo se encarga de realizar todas las conexiones con Twitter y la base de datos para almacenar la información.A grandes rasgos se compone de funciones como:</p>
<ul>
<li>get_twitter_data : Que obtiene la información de Twitter usando cURL</li>
<li>set_user_data : Que guarda la información del usuario que agrego la aplicación</li>
<li>get_user_data : Que obtiene la información de un usuario</li>
<li>update_user_data  : Que actualiza la información del usuario utilizando la información de Twitter.</li>
</ul>
<h3>A probar la aplicación</h3>
<p>Luego, que está todo listo, subo a producción y hago las pruebas necesarias para evitar errores. No está demás decir que a medida que realizo el diseño y el desarrollo siempre se deben hacer updates, porque es como estar trabajando a ciegas.</p>
<p>Para probar la aplicación ingresen a: <a href="http://app.facebook.com/ultimotwitterupdate/">http://apps.facebook.com/ultimotwitterupdate/</a></p>
<h2>Deje reposar 5 minutos y sirva</h2>
<p>Luego de todo este desarrollo podemos sacar como conclusión que <strong>Facebook</strong> es una de las Redes Sociales más potentes por la facilidad en que se pueden desarrollar aplicaciones y la capacidad de integración que se puede obtener.</p>
<p>Si bien el desarrollo no es muy cómodo, es muy simple la forma en que se pueden agregar elementos propios de Facebook, esto lo hace una herramienta ágil.</p>
<p>Finalmente, les dejo la misión de leer mucho sobre lo nuevo que se viene para el desarrollo de aplicaciones en Facebook y además de que le pierdan el miedo a crear aplicaciones nuevas.</p>
<p>Muchas gracias por su tiempo, espero que este <em>plato</em> haya sido de su agrado.</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">http://www.facebook.com/developers/F</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvaroveliz.cl/2010/03/tutorial-crear-una-aplicacion-para-facebook-fmbl-2/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>Tutorial: Configurar Apache 2.+ con VirtualHost</title>
		<link>http://blog.alvaroveliz.cl/2010/03/tutorial-configurar-apache-con-virtualhost/</link>
		<comments>http://blog.alvaroveliz.cl/2010/03/tutorial-configurar-apache-con-virtualhost/#comments</comments>
		<pubDate>Sat, 13 Mar 2010 16:50:11 +0000</pubDate>
		<dc:creator>alvaroveliz</dc:creator>
				<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://blog.alvaroveliz.cl/?p=71</guid>
		<description><![CDATA[Una de las cosas más cómodas que tiene Apache 2.+ es el módulo de host virtuales (VirtualHost), puesto que con éste módulo podemos simular con mejor calidad un servidor de producción. Por ejemplo, digamos que quiero subir un Blog de WordPress a una dirección http://www.miblogdewordpress.com pero aún no cuento con el Hosting ni el dominio. [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2010%2F03%2Ftutorial-configurar-apache-con-virtualhost%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.alvaroveliz.cl%2F2010%2F03%2Ftutorial-configurar-apache-con-virtualhost%2F&amp;source=alvaroveliz&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Una de las cosas más cómodas que tiene Apache 2.+ es el módulo de host virtuales (VirtualHost), puesto que con éste módulo podemos simular con mejor calidad un servidor de producción.</p>
<p>Por ejemplo, digamos que quiero subir un Blog de WordPress a una dirección http://www.miblogdewordpress.com pero aún no cuento con el Hosting ni el dominio. En este caso es cuando podemos utilizar nuestro módulo de VirtualHost y personalizar la dirección que aún no existe.</p>
<h2>Configurar Apache</h2>
<p>Lo primero es configurar Apache 2.+ habilitando este módulo (por lo general viene habilitado por defecto):</p>
<pre class="brush: bash; title: ; notranslate">sudo a2enmod vhost_alias</pre>
<p>Luego se debe crear nuestro nuevo &#8220;sitio&#8221; creando el archivo de configuración necesario, pero como somos inteligentes vamos a copiar el sitio por defecto y configurarlo. Todo esto ocurre en la carpeta de apache2 que para nuestro ejemplo será &#8220;/etc/apache2/sites-available/&#8221;:</p>
<pre class="brush: bash; title: ; notranslate">sudo cp default miblogdewordpress
sudo vim miblogdewordpress</pre>
<p>Al editar este archivo nos encontramos con lo siguiente:</p>
<pre class="brush: bash; title: ; notranslate">&lt;VirtualHost *:80&gt;
ServerAdmin webmaster@localhost

DocumentRoot /var/www
&lt;Directory /&gt;
Options FollowSymLinks
AllowOverride None
&lt;/Directory&gt;
&lt;Directory /var/www/&gt;
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
&lt;/Directory&gt;

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
&lt;Directory &quot;/usr/lib/cgi-bin&quot;&gt;
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
&lt;/Directory&gt;

ErrorLog /var/log/apache2/error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

CustomLog /var/log/apache2/access.log combined

Alias /doc/ &quot;/usr/share/doc/&quot;
&lt;Directory &quot;/usr/share/doc/&quot;&gt;
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
&lt;/Directory&gt;

&lt;/VirtualHost&gt;</pre>
<p>Lo que debemos hacer es agregar una línea que defina el nombre del servidor, y luego recortar la configuración con lo necesario:</p>
<pre class="brush: bash; title: ; notranslate">
&lt;VirtualHost *:80&gt;
  ServerAdmin webmaster@localhost
  ServerName www.miblogdewordpress.com

  DocumentRoot /var/www/miblogdewordpress/
  &lt;Directory /&gt;
    Options FollowSymLinks
    AllowOverride None
  &lt;/Directory&gt;
  &lt;Directory /var/www/miblogdewordpress/&gt;
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
  &lt;/Directory&gt;

  ErrorLog /var/log/apache2/miblogdewordpress-error.log
  LogLevel warn
  CustomLog /var/log/apache2/miblogdewordpress-access.log combined
</pre>
<p>Si se dan cuenta, lo que hice fue agregar &#8220;ServerName&#8221; y especificar donde tengo mis documentos &#8220;/var/www/miblogdewordpress/&#8221; en el DocumentRoot y además en el &#8220;Directory&#8221;. Finalmente, especifiqué un archivo de logs y acceso para el dominio en anteponiendo &#8220;miblogdewordpress-&#8221; en los archivos de &#8220;ErrorLog&#8221; y &#8220;CustomLog&#8221;.</p>
<p>Lo siguiente es ahora, activar nuestro sitio y recargar las configuraciones de Apache:</p>
<pre class="brush: bash; title: ; notranslate">sudo a2ensite miblogdewordpress
sudo /etc/init.d/apache2 reload</pre>
<p>El comando a2ensite utiliza como parámetro el nombre del archivo que acabamos de crear, es decir, &#8220;miblogdeworpress&#8221;.</p>
<p>Luego de que tenemos nuestro Apache configurado, terminamos el trabajo configurando el host local.</p>
<h2>Configurar tabla de Hosts</h2>
<p>La tabla de host es muy simple de configurar, solo debemos agregar nuestro dominio creado apuntado a &#8220;localhost&#8221;. Para esto, editamos &#8220;/etc/hosts&#8221; y agregamos la siguiente linea:</p>
<pre class="brush: bash; title: ; notranslate">127.0.0.1    www.miblogdewordpress.com</pre>
<p>Para probarlo entramos por nuestro explorador a http://www.miblogdewordpress.com y estará listo para utilizar.</p>
<p>Cabe mencionar que cuando se suba a producción debemos eliminar esta linea de la tabla de host para no resolver el sitio que tenemos en nuestro servidor.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvaroveliz.cl/2010/03/tutorial-configurar-apache-con-virtualhost/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

