<?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>Asier Marqués &#187; Desarrollo Web</title>
	<atom:link href="http://asiermarques.com/category/desarrollo-web/feed/" rel="self" type="application/rss+xml" />
	<link>http://asiermarques.com</link>
	<description>apuntes personales, arquitectura web y negocios en internet</description>
	<lastBuildDate>Thu, 26 Jan 2012 16:01:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Backbone.js es sexo</title>
		<link>http://asiermarques.com/2012/01/26/backbone-js-es-sexo/</link>
		<comments>http://asiermarques.com/2012/01/26/backbone-js-es-sexo/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 13:39:14 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Aplicaciones Web]]></category>
		<category><![CDATA[Desarrollo Web]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=2109</guid>
		<description><![CDATA[Desde hace un par de años se viene dando un cambio en la forma de desarrollar sitios web que necesitan arquitecturas que contemplen la escalabilidad al máximo. En el 2005 vimos cómo la introducción de XMLHttpRequest, más conocido como ajax, &#8230; <a href="http://asiermarques.com/2012/01/26/backbone-js-es-sexo/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/anapplebed/4819248759"><img class="alignleft" title="bite your lips, tease your hair." src="http://farm5.staticflickr.com/4076/4819248759_ab62346b46_m.jpg" alt="bite your lips, tease your hair." width="240" height="157" /></a>Desde hace un par de años se viene dando un cambio en la forma de desarrollar sitios web que necesitan arquitecturas que contemplen la escalabilidad al máximo.</p>
<p>En el 2005 vimos cómo la introducción de <a href="http://es.wikipedia.org/wiki/XMLHttpRequest" target="_blank">XMLHttpRequest</a>, más conocido como <strong>ajax</strong>, cambiaba las reglas del juego y elevaba las posibilidades del desarrollo web de una forma más que considerable, propiciando la creación de herramientas que facilitaban mucho más la interacción y que, junto a otras formas no técnicas de pensar y concebir los sitios web, desataron la fiebre web 2.0.</p>
<p>Desde esa época hemos visto aparecer un sinfin de nuevas tecnologías tanto de frontend como de backend que nos permiten hacer crecer nuestros sitios web usando buenas prácticas y con relativamente pocos recursos, al menos muchos menos que los que necesitábamos hace diez años.</p>
<p>De entre todas las opciones que van apareciendo, las tecnologías que más me han interesado recientemente son las permiten implementar patrones mvc o mvvm con javascript, separando totalmente el html + css + js que usamos en el frontend del backend.</p>
<p>Algunas de estas tecnologías aparecen motivadas por técnicas usadas en los frontend de Facebook o Tuenti por ejemplo, que cargaban diferentes partes de su contenido de forma asíncrona al cambiar de sección y sin refrescar todo el layout, mejorando la experiencia de usuario notablemente.</p>
<p>Existen varias opciones: <a href="http://javascriptmvc.com/" target="_blank">javascriptMVC</a>, <a href="http://knockoutjs.com/">knockout</a> y <a href="http://documentcloud.github.com/backbone/" target="_blank">backbone</a>, entre otros. Yo me he decidido finalmente por <strong>backbone</strong>, básicamente porque me parecía más cercano a la forma que tengo de trabajar con soluciones de frameworks mvc para web y he visto que cuenta con un gran apoyo por parte de desarrolladores frontend.</p>
<p>No hace falta tener mucha experiencia en el desarrollo web para ver las tremendas posibilidades que ofrece backbone en cuanto arquitectura y escalabilidad.</p>
<p>La ventaja más evidente es que nos libramos de tener vistas html mezcladas con código de servidor en el backend. Las vistas se procesan y parsean en el cliente, con javascript, pudiendo usar cualquier motor de plantillas para javascript como <a href="http://mustache.github.com/mustache.5.html" target="_blank">mustache</a>.</p>
<p>Mustache parece la mejor opción ya que cada vez más se viene asumiendo como estándar la sintaxis de django para templates html, que se ha adoptado en motores de plantillas de otros lenguajes como en el caso de php en el que disponemos de <a href="http://twig.sensiolabs.org/" target="_blank">Twig</a> (usado en Symfony2) o <a href="http://haanga.org/" target="_blank">Haanga</a>. Es importante esto si queremos dar compatibilidad a clientes que no tengan habilitado javascript en el navegador, <a href="http://duganchen.ca/single-page-web-app-architecture-done-right/" target="_blank">una buena práctica</a> que en algunos casos puede ser totalmente necesaria aplicar.</p>
<p>Esto nos permite tener en un sólo directorio y servir directamente como estático el código html de todas las plantillas de la aplicación web, con las ventajas evidentes de que los maquetadores y diseñadores puedan trabajar con ellas directamente sin tener que conocer el lenguaje de servidor que la web está utilizando, además de poder servir todo el html como estático, reduciendo los recursos necesarios de procesador en nuestra aplicación web y pudiendo cachear todo desde en el cliente con HTTP Cache, usando las directivas de caducidad max-age y s-max-age.</p>
<p>Las plantillas pueden recibir información a través de un objeto json, que normalmente incluirá el Modelo. El modelo se puede integrar <a href="http://coenraets.org/blog/2011/12/backbone-js-wine-cellar-tutorial-part-2-crud/" target="_blank">muy fácilmente</a> con nuestra API de servicios en el backend, permitiéndonos hacer un CRUD desde el cliente de forma transparente y sin importar la tecnología o tecnologías escogidas en el backend.</p>
<p>Como en todo buen framework MVC para web, disponemos de <a href="http://documentcloud.github.com/backbone/#Router" target="_blank">un router</a> en el que podremos definir las urls de nuestra aplicación siguiendo un esquema de urls ajax basadas en hashbang (utilizando el símbolo #) perfectamente <a href="http://code.google.com/intl/es-ES/web/ajaxcrawling/docs/getting-started.html" target="_blank">indexable por buscadores</a>.</p>
<p>Cada ruta dispara un evento al que podemos suscribirnos para cargar el contenido necesario en el layout de cada vista. Estas peticiones se hacen mediante ajax, por lo que podemos pensar en las siguientes ventajas:</p>
<p><strong>Primera ventaja: </strong>Utilizando correctamente <a href="https://developer.mozilla.org/En/HTTP_access_control" target="_blank">HTTP access control</a> podremos distribuir como queramos, y en base a nuestras necesidades, cada recurso o parte de nuestra aplicación en servidores, clusters o servicios cloud distintos, teniendo cada uno en su propio dominio o subdominio.</p>
<p>Al poder ser nuestro frontend totalmente estático (se basa en html, js y css), podemos utilizar frontales web que únicamente sirvan html o incluso servicios de storage cloud, como Amazon S3 con CloudFront, teniendo distribuida nuestra aplicación geográficamente con un coste inicial bastante bajo si tenemos implamentada una buena estrategia de caché en el cliente y en el backend.</p>
<p><strong>Segunda ventaja:</strong> Podemos utilizar diferentes tecnologías para cada parte de nuestra web. Esto lo podíamos hacer ya utilizando <a href="https://www.varnish-cache.org/docs/trunk/tutorial/esi.html" target="_blank">Edge Side Includes a nivel de proxy con Varnish</a> por ejemplo, ahora no es necesario aunque podría ser completamente complementario.</p>
<p><strong>Tercera ventaja:</strong> Nos obliga a desarrollar la capa de servicios desde el principio, teniéndo nuestra arquitectura frontend-backend desacoplada, respetando totalmente REST, permitiéndonos de una forma cómoda en un futuro usar clientes diferentes al navegador sin tener que plantear hacer una api como una problemática adicional.</p>
<p><strong>Cuarta ventaja:</strong> Podemos usar el <a href="http://documentcloud.github.com/backbone/#History" target="_blank">histórico de Backbone</a> o directamente el <a href="http://www.w3.org/TR/html5/history.html" target="_blank">History de HTML5</a> para cachear la navegación del usuario en el navegador, haciendo cosas tan interesantes como el <a href="https://github.com/blog/760-the-tree-slider" target="_blank">Tree Slider de Github</a>.</p>
<p>Backbone nos da más opciones y herramientas útiles para el desarrollo con javascript, pero creo que las que he mencionado son lo suficientemente interesantes como para motivarnos a pensar en otras formas de plantear nuestros sitios web en el futuro.</p>
<p>Incluso en algunos casos podremos plantear prototipos de nuestros productos, perfectamente testables en html, antes de tomar ninguna decisión tecnológica de backend e incluso antes de tener que desarrollarlos.</p>
<p>Las posibilidades son increíblemente atractivas.</p>
<p>PD: El título es sólo para llamar vuestra atención, actualmente prefiero el sexo a backbone.js.</p>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2012/01/26/backbone-js-es-sexo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Una reflexión sobre Symfony2 y sus componentes</title>
		<link>http://asiermarques.com/2011/11/04/una-reflexion-sobre-symfony2-y-sus-componentes/</link>
		<comments>http://asiermarques.com/2011/11/04/una-reflexion-sobre-symfony2-y-sus-componentes/#comments</comments>
		<pubDate>Fri, 04 Nov 2011 13:12:34 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=2061</guid>
		<description><![CDATA[Me ha alegrado leer la noticia que resume la reunión de ayer día 3 de Noviembre en symfony.es, proyecto que mantiene Javier Eguiluz, en la que dice que Fabien Potencier, autor y líder del proyecto Symfony, quiere dar prioridad a la &#8230; <a href="http://asiermarques.com/2011/11/04/una-reflexion-sobre-symfony2-y-sus-componentes/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Me ha alegrado leer <a href="http://www.symfony.es/2011/11/04/resumen-de-la-reunion-de-desarrolladores-3-11-2011/" target="_blank">la noticia que resume la reunión de ayer día 3 de Noviembre en symfony.es</a>, proyecto que mantiene <a href="http://javiereguiluz.com" target="_blank">Javier Eguiluz</a>, en la que dice que <a href="http://fabien.potencier.org/" target="_blank">Fabien Potencier</a>, autor y líder del proyecto <a href="http://symfony.com" target="_blank">Symfony</a>, quiere dar prioridad a la documentación de los Componentes del framework.</p>
<p>Es una gran noticia que se considere documentar cada componente para final de año, y va muy en la línea de <a href="http://fabien.potencier.org/article/49/what-is-symfony2" target="_blank">lo que comentaba Fabien en su blog sobre qué es Symfony2 y qué no</a>.</p>
<p>Fabien quiere dar mucha importancia a los Componentes ya que es la única forma de que Symfony2 esté presente en el mayor número de proyectos posibles.</p>
<p>En mi opinión, y como ya he expresado en otras ocasiones, Symfony2 es un framework enorme, que intenta solucionar demasiada problemática, y en mi experiencia, cuanto más grande sea la aplicación y cuanta más problemática se intente cubrir, más complejo después será encontrar un posible fallo en entornos que no se hayan tenido en cuenta para la misma. En aplicaciones orientadas a internet, el entorno de sistemas puede que no sea el estándar LAMP, sobre todo si nos enfrentamos a webs de alto tráfico.</p>
<p>Otro problema, que para otros es una virtud, es que el framework intenta hacer configurable todo, con el objetivo de que los proyectos sean lo más automatizables, mantenibles y dotarles de una capacidad de reutilización en la que llegue a ser innecesario tocar una línea de código. Esto en teoría, suma más horas de desarrollo al principio y luego hace el mantenimiento más barato. Sin embargo, en proyectos que se orientan a internet, la teoría queda muchas veces en evidencia.</p>
<p>Hay que tener en cuenta que el mundo php5 no es como el mundo .net o java. Es complicado que desarrolladores web de php, aun con experiencia, se conviertan tan puristas de repente (más teniendo en cuenta los presupuestos tan ajustados económicamente y en tiempo que se barajan en proyectos web para internet) como para adoptar y entender todas las buenas prácticas que te obliga a usar Symfony2.</p>
<p>Para la mayoría de desarrolladores, el disponer de componentes, no les obliga a comprender el funcionamiento de todo el framework y pueden usarlos en desarrollos más simples o que ya tengan hechos.</p>
<p>De hecho, viendo estas direcciones en el proyecto Symfony2, en mi propio proyecto <a href="http://asiermarques.com/2011/05/18/leophard-concepto/" target="_blank">Leophard</a>, un framework mvc ligero para php que por diversas razones de peso he tenido que retrasar su desarrollo, usaré algunos de estos componentes como el <a href="https://github.com/symfony/EventDispatcher" target="_blank">EventDispatcher</a>, <a href="https://github.com/symfony/ClassLoader" target="_blank">UniversalClassLoader</a>, el <a href="https://github.com/symfony/Routing" target="_blank">Routing</a>, <a href="https://github.com/fabpot/Pimple" target="_blank">Pimple</a> o el <a href="https://github.com/symfony/HttpFoundation" target="_blank">HttpFoundation</a>, que son ligeros y resuelven problemática muy importante del proyecto.</p>
<p>La gente de <a href="http://drupalcode.org/project/drupal.git/commit/c85d62c" target="_blank">Drupal está usando</a> algunos de estos componentes también en la próxima versión de su cms.</p>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2011/11/04/una-reflexion-sobre-symfony2-y-sus-componentes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jugando con ips y redes en php</title>
		<link>http://asiermarques.com/2011/09/30/jugando-con-ips-y-redes-en-php/</link>
		<comments>http://asiermarques.com/2011/09/30/jugando-con-ips-y-redes-en-php/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 21:24:40 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=1978</guid>
		<description><![CDATA[Por la naturaleza de mi entorno profesional, lidio con conceptos de IT y redes en mi día a día que me ayudan a tener frescos conceptos que aprendí hace ya algún tiempo cursando el temario del programa CCNA de Cisco &#8230; <a href="http://asiermarques.com/2011/09/30/jugando-con-ips-y-redes-en-php/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Por la naturaleza de mi entorno profesional, lidio con conceptos de IT y redes en mi día a día que me ayudan a tener frescos conceptos que aprendí hace ya algún tiempo cursando el temario del programa <a href="http://www.cisco.com/web/learning/netacad/course_catalog/CCNAexploration.html" target="_blank">CCNA</a> de Cisco y del <a href="http://www.microsoft.com/learning/en/us/certification/mcse.aspx" target="_blank">MCSE</a> de Microsoft.</p>
<p>Concretamente en el área de redes, es muy útil saber cómo hacer subredes o saber a qué red pertenece una ip en concreto haciendo operaciones AND binarias con las máscaras y direcciones a evaluar.</p>
<h3>Refresco de conceptos</h3>
<p>Las direcciones ip se clasifican en lo que llamamos &#8220;clases de red&#8221; según el número de hosts que dichas redes puedan soportar (siendo un host un ordenador, impresora o cualquier cacharro que conectemos a dicha red).</p>
<p>Usamos comúnmente las siguientes clases de red:</p>
<ul>
<li>Clase C, la más común, que puede tener hasta 254 dispositivos host conectados.</li>
<li>Clase B, que puede tener hasta 65.534 dispositivos host conectados.</li>
<li>Clase A, que puede tener hasta 16.777.214 dispositivos host conectados.</li>
</ul>
<p>Para saber de qué clase es una red o una dirección ip, usamos <a href="http://es.wikipedia.org/wiki/M%C3%A1scara_de_red" target="_blank">máscaras de red</a>. Las máscaras de red se componen de 4 fracciones y en cada una podemos rellenar hasta 8bits.</p>
<p><span style="font-family: Georgia, 'Bitstream Charter', serif; line-height: 24px;">En una dirección de clase C tendremos un total de 24bits, en binario podríamos expresarla entonces como 11111111.11111111.11111111.00000000 (24bits = 8bits + 8 bits +8bits + 0bits) y en decimal como 255.255.255.0 .</span></p>
<p><span style="font-family: Georgia, 'Bitstream Charter', serif; line-height: 24px;">No necesitamos escribir la máscara completa para indicar que la ip 192.168.1.2 es de clase C por ejemplo, bastaría con indicar al final de la misma que su máscara tiene 24bits de la siguiente forma: 192.168.1.2/24 .</span></p>
<p><span style="font-family: Georgia, 'Bitstream Charter', serif; line-height: 24px;">En el resto de clases, tendríamos 8bits para las redes de clase A y 16bits para las de clase B.</span></p>
<p><span style="font-family: Georgia, 'Bitstream Charter', serif; line-height: 24px;">Sin embargo, aunque en entornos domésticos o de mediana empresa se usen estas clases de red para crear las redes a las cuales se conecten los ordenadores, servidores e impresoras de la organización, en una empresa que provee servicios de internet o que tiene muchos departamentos, le es muy útil poder partir esas redes en subredes.</span></p>
<p><span style="font-family: Georgia, 'Bitstream Charter', serif; line-height: 24px;">Hay escenarios en los que nos interesa tener varias subredes con un número concreto de equipos en cada una de ellas. De esta forma aislamos a qué recursos puede acceder uno o varios equipos de una determinada subred.</span></p>
<p><span style="font-family: Georgia, 'Bitstream Charter', serif; line-height: 24px;">Para hacer subredes lo que se suele hacer es usar máscaras de red personalizadas. </span>Por ejemplo, si tenemos la ip 192.168.129.3/18, tal y como hemos visto antes sabemos que su máscara de red tiene 18bits, es decir en binario 11111111.11111111.11000000.00000000 y en decimal 255.255.192.0. Ahora bien, al no tener una máscara de 16bits o de 24, ya que tenemos una fracción de las 4 sin rellenar totalmente por bits en la máscara de subred, no podríamos decir que esa ip pertenece a la red 192.168.129.0/24, ya que esta sería una dirección de red de clase C y la nuestra no pertenece a esa clase.</p>
<p>Para saber a qué dirección de red pertenece tenemos que hacer una operación AND a nivel de bits binarios entre la dirección ip y su máscara de red.</p>
<p>En este caso la operación quedaría así:</p>
<p><img class="size-full wp-image-1985" title="Operación con ips" src="http://asiermarques.com/wp-content/uploads/2011/09/and-ips.jpg" alt="Operación con ips" width="559" height="97" /></p>
<p>Al final deducimos que la dirección de red a la que pertenece la ip 192.168.129.3 es 192.128.0.0.</p>
<p>También podemos realizar operaciones para saber la cantidad de dispositivos que se pueden conectar a una determinada red o calcular una red que pueda albergar un determinado número de equipos.</p>
<p>Para calcular el número de dispositivos usamos la función <span style="color: #990000;"><strong>2</strong><sup>x</sup><strong> -2 </strong><span style="color: #000000;">donde X es la cantidad de bits disponibles en una subred es decir, el número de ceros que quedan al final de la misma. En la máscara de 18 bits que hemos usado en el ejemplo (11111111.11111111.11<span style="color: #800000;">000000.00000000</span>) serían 14 los bits disponibles (32bits posibles totales &#8211; 18 que estamos usando). </span></span></p>
<p><span style="color: #990000;"><span style="color: #000000;">Aplicando la fórmula nos daría un total de 16.382 cacharros que podríamos conectar a nuestra red.</span></span></p>
<h3>Utilizando php para realizar estos cálculos.</h3>
<p>En php disponemos de una serie de funciones y operadores que nos hacen muy sencillo realizar cálculos de este tipo y automatizar este trabajo que de hacerlo manual nos haría consumir tiempo y estaría propenso a errores.</p>
<p>En este escenario utilizaremos tan sólo dos cosas:</p>
<ul>
<li>La función <strong><a href="http://php.net/manual/es/function.ip2long.php" target="_blank">ip2long</a></strong> para pasar una dirección ip separada por puntos a su representación numérica para poder realizar operaciones posteriores con ella.</li>
<li>La función <strong><a href="http://es.php.net/manual/es/function.decbin.php" target="_blank">decbin</a></strong>, para pasar de decimal a binario.</li>
<li>El operador bitwise <strong>&amp;</strong> que es el que realizará la <strong>operación AND</strong> a nivel binario.</li>
</ul>
<p>Volviendo al anterior ejemplo, podemos saber a qué dirección de red pertenece la ip 192.168.129.3/18 de la siguiente forma:</p>
<pre class="brush: php;">

$ip_en_binario        = decbin( ip2long( &quot;192.168.129.3&quot; ) );

$mascara_en_binario   = decbin( ip2long( &quot;255.255.192.0&quot; ) );

$resultado_en_binario = $ip_en_binario &amp; $mascara_en_binario;

echo long2ip( bindec( $resultado_en_binario ) );
</pre>
<p>Tal y como esperábamos, el resultado que nos devuelve este script es 192.168.128.0, que es la dirección de red a la que pertenece la ip 192.168.129.3/18.</p>
<p>Con este sencillo ejemplo vemos el juego que le podemos sacar a todo esto.</p>
<p>Por un lado se ve de forma clara que si queremos saber a qué red pertenece una ip dada de todas las que tenemos en nuestra empresa, las cuales almacenamos en una base de datos, bastaría con pasar a binario cada ip y compararla al resultado de la operación efectuada en el ejemplo.</p>
<p>Pero lo realmente útil es saber que podemos guardar en base de datos la dirección directamente en binario, ahorrando un espacio importante en la tabla al evitarnos usar un campo tipo texto (clave para el rendimiento con índices en motores como inndb de mysql) y realizar directamente la búsqueda contra el registro que necesitemos.</p>
<p>También podríamos conocer muy fácilmente con la formula que hemos visto antes, el número de equipos que puedo conectar a una red seleccionada y en base a las ips que podríamos tener registradas, los &#8220;huecos&#8221; e ips disponibles para los equipos nuevos que tenga que conectar a esa red en un futuro.</p>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2011/09/30/jugando-con-ips-y-redes-en-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Leophard, próximos pasos y dos dudas</title>
		<link>http://asiermarques.com/2011/08/17/leophard-proximos-pasos-y-dos-dudas/</link>
		<comments>http://asiermarques.com/2011/08/17/leophard-proximos-pasos-y-dos-dudas/#comments</comments>
		<pubDate>Tue, 16 Aug 2011 22:46:31 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[leophard]]></category>
		<category><![CDATA[proyectos]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=1907</guid>
		<description><![CDATA[A principios de verano os adelanté una primera aproximación sobre lo que iba a ser Leophard, un framework para el desarrollo web con php (sí, otro más). Pensaba que podría tener una primera versión para Septiembre pero como todo lo que &#8230; <a href="http://asiermarques.com/2011/08/17/leophard-proximos-pasos-y-dos-dudas/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A principios de verano os adelanté <a href="http://asiermarques.com/2011/05/18/leophard-concepto/" target="_blank">una primera aproximación sobre lo que iba a ser Leophard</a>, un framework para el desarrollo web con php (sí, otro más).</p>
<p>Pensaba que podría tener una primera versión para Septiembre pero como todo lo que puede complicarse se complica, no voy a poder alcanzar esta meta.</p>
<p>En parte no voy a poder alcanzarla, además de por estar hasta arriba de trabajo (no he podido tomarme ni un fin de semana de vacaciones todavía), va a ser por una serie de cambios que voy a asumir en mi forma de trabajar en general a partir de ahora.</p>
<h3>TDD</h3>
<p>El cambio más importante que voy a adoptar es aplicar sin excusas <a href="http://es.wikipedia.org/wiki/Desarrollo_guiado_por_pruebas" target="_blank">TDD</a> es decir, desarrollo guiado por tests. Y lo primero que he empezado a hacer es a escribir los test sin escribir todavía una sola línea de código.</p>
<p>Es cierto que tenía un prototipo funcional con un sistema de enrutamiento, de vistas y controladores muy básicos ya funcionando. Sin embargo, me he dado cuenta de que ningún desarrollo y en especial un desarrollo de este tipo, debe ejecutarse sin asegurarse la calidad que te permiten obtener los test unitarios, siempre que un proyecto se plantee de esta forma desde el principio.</p>
<p>En teoría esto debería hacerme ir más lento al principio, pero creo que merecerá la pena para obtener una arquitectura de calidad y evitar problemas en el futuro.</p>
<h3>Ciclos cortos de desarrollo</h3>
<p>Cuando me puse a desglosar la complejidad de un framework de este tipo, aun queriendo hacer algo simple y ligero, las posibilidades de complicarlo para intentar cubrir posibles necesidades son difíciles de ignorar.</p>
<p>Por suerte cada vez tengo más control sobre mí mismo acerca de evitar ser demasiado previsor para problemas que no tocan y el objetivo principal del proyecto, que es conseguir un framework ligero y ante todo simple, me ayuda en esta meta.</p>
<p>Dividiré el desarrollo en fases muy cortas para evitar caer en la resolución de problemas no críticos y tener cuanto antes una versión que se pueda usar aunque no cubra todos los problemas que puedan cubrir otros frameworks como Symfony o Kohana.</p>
<h3>Propel</h3>
<p>Desde un principio he descartado el desarrollo de un orm propio ligero, es una auténtica locura y casi prefiero hacer un gestor de conexiones para PDO que intentar hacer un orm para el mismo.</p>
<p><a href="http://www.propelorm.org/" target="_blank">Propel</a> desde la versión 1.3 tiene una capa orm sobre PDO que funciona muy bien y es bastante más ligera y rápida que Doctrine2. También prefiero Propel a Doctrine2 porque lo encuentro más simple y porque al menos yo, me siento más cómodo usándolo.</p>
<p>De Propel hay dos cosas que no me gustan: la dependencia de Phing (que tiene los días contados) y por tanto de Pear (que lo odio) junto a que los esquemas y configuraciones se escriben en xml. Para esto último me haré una implementación para que estos xml puedan generarse desde php de forma sencilla y menos tediosa.</p>
<p>No obstante dejaré la puerta abierta para otras opciones.</p>
<h3>Dudas en formularios y en la vista</h3>
<h4><strong>Sobre la vista</strong></h4>
<p>Tengo una duda en la vista y es que no se por qué modelo decantarme, si por el <a href="http://symfony.com/doc/current/book/templating.html" target="_blank">modelo de herencia de Symfony2</a> o por el tipo de<a href="http://librosweb.es/jobeet_1_3/capitulo4/el_layout.html" target="_blank"> implementación decorator que teníamos en Symfony1.x</a>.</p>
<p>Por ejemplo, en Symfony 1 teníamos un layout donde cargábamos el contenido de cada controlador en una variable llamada $sf_content. En las platillas usábamos include_component o include_partial para dividir las partes de nuestra aplicación web en la capa de vista. Por defecto la plantilla asociada a un controlador era contenida en la variable $sf_content que se incrustaba en el layout que indicásemos o se devolvía si indicábamos que esa vista no tenía layout.</p>
<p>En Symfony2 vemos un modelo basado en la herencia de vistas, algo que podemos encontrar en otros framework como asp.net mvc. En cada vista se indica el parent, en el que se ha definido un esqueleto de bloques, y se escribe el código html que su parent debe insertar en cada bloque.</p>
<p>Yo prefiero la opción que teníamos en Symfony1.x, pero no las tengo todas conmigo si este es el mejor modelo.</p>
<p>La vista usará la última versión de Smarty, que actualmente es el motor de plantillas más extendido y que más desarrolladores php conocen.</p>
<h4><strong>Sobre los formularios</strong></h4>
<p>Este es un tema que tengo que analizar con calma pero tengo una cosa clara: quiero que sea simple crear y validar formularios.</p>
<p>En la creación y validación tengo que pensar muy bien cómo hacerlo para evitar que el programador tenga que escribir mucho código o al menos tanto como en Symfony1.4.</p>
<p>Quiero simplificar el proceso a la hora de recibir los datos, hacer el binding y comprobar si es válido.</p>
<p>En symfony deberíamos hacer lo siguiente en el controlador:</p>
<ul>
<li>Comprobar el tipo de método http para procesar el formulario en caso de que sea POST (en el más del 90% de los casos)</li>
<li>Hacer un $form-&gt;bind($array); para obtener y filtrar los datos</li>
<li>Hacer un $form-&gt;isValid() para comprobar que el formulario es válido.</li>
</ul>
<p>Yo prefiero tener algo así en un sólo paso:</p>
<ul>
<li>$form-&gt;validate(Request $request, $method=&#8221;post&#8221;);</li>
</ul>
<p>Otra opción es que los formularios se validen en el mismo request de la petición, de una forma similar a como se hace con el <a href="http://weblogs.asp.net/imranbaloch/archive/2011/02/19/understanding-request-validation-in-asp-net-mvc-3.aspx" target="_blank">request validation de asp.net mvc 3</a>.</p>
<p>Es decir, la validación se haría en el mismo request del action del fomulario y no habría que ejecutarla de forma explícita en el controlador.</p>
<p>Tengo que dar unas vueltas a todo esto, sobre todo a la hora de crear los widgets y validadores.</p>
<p>Este será el último post de este tipo sobre Leophard que haga en este blog, intentaré montar un sitio web en las próximas semanas dedicado al proyecto.</p>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2011/08/17/leophard-proximos-pasos-y-dos-dudas/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>We love Front-end code</title>
		<link>http://asiermarques.com/2011/06/27/we-love-front-end-code/</link>
		<comments>http://asiermarques.com/2011/06/27/we-love-front-end-code/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 12:59:20 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Innovación]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[anuncios]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=1821</guid>
		<description><![CDATA[En The Cocktail, una empresa que ha demostrado ser un ejemplo de cómo se hacen las cosas bien en internet, han hecho un vídeo homenaje para aquellas personas y profesionales que trabajan como desarrolladores web de FrontEnd. Os adjunto el &#8230; <a href="http://asiermarques.com/2011/06/27/we-love-front-end-code/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>En <a href="http://the-cocktail.com" target="_blank">The Cocktail</a>, una empresa que ha demostrado ser un ejemplo de cómo se hacen las cosas bien en internet, han hecho un vídeo homenaje para aquellas personas y profesionales que trabajan como desarrolladores web de FrontEnd.</p>
<p><a href="http://the-cocktail.com/es/blog/we-love-front-end-code-178"><img src="http://asiermarques.com/wp-content/uploads/2011/06/i_love_frontend_code_2.gif" alt="" title="i_love_frontend_code_2" width="562" height="125" class="aligncenter size-full wp-image-1824" /></a></p>
<p>Os adjunto el vídeo, pero <a href="http://the-cocktail.com/es/blog/we-love-front-end-code-178" target="_blank">no dejéis de leer el post original</a>, muy inspirador y además regalan pegatinas!!</p>
<p><iframe src="http://player.vimeo.com/video/25652250?title=0&amp;byline=0&amp;portrait=0" width="600" height="400" frameborder="0"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2011/06/27/we-love-front-end-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Para mí el diseño es</title>
		<link>http://asiermarques.com/2011/01/15/para-mi-el-diseno-es/</link>
		<comments>http://asiermarques.com/2011/01/15/para-mi-el-diseno-es/#comments</comments>
		<pubDate>Sat, 15 Jan 2011 23:14:39 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Diseño]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=1536</guid>
		<description><![CDATA[Para mí el diseño es el arte de cuidar de los detalles. Y un buen diseño web es el que cuida de esos detalles, minimizando la cantidad de ruido al máximo, dando importancia siempre a la usabilidad y a la &#8230; <a href="http://asiermarques.com/2011/01/15/para-mi-el-diseno-es/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Para mí el diseño es el arte de cuidar de los detalles. Y un buen diseño web es el que cuida de esos detalles, minimizando la cantidad de ruido al máximo, dando importancia siempre a la usabilidad y a la funcionalidad.</p>
<p>Aquí van <a href="http://vimeo.com/17995436" target="_blank">otras opiniones</a>:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="650" height="400" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=17995436&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" /><embed type="application/x-shockwave-flash" width="650" height="400" src="http://vimeo.com/moogaloop.swf?clip_id=17995436&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><a href="http://vimeo.com/17995436">To me, design is&#8230;</a> from <a href="http://vimeo.com/vostok">Vostok</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2011/01/15/para-mi-el-diseno-es/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Symfony, wordpress o php desde 0</title>
		<link>http://asiermarques.com/2010/12/29/symfony-wordpress-o-php-desde-0/</link>
		<comments>http://asiermarques.com/2010/12/29/symfony-wordpress-o-php-desde-0/#comments</comments>
		<pubDate>Wed, 29 Dec 2010 02:04:29 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Mis Proyectos]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=1508</guid>
		<description><![CDATA[Este post es una reflexión sobre si realmente utilizar un framework es el camino para desarrollar aplicaciones web o es mejor utilizar un cms como WordPress o quizá una estructura de clases propia que reutilicemos en los futuros proyectos que &#8230; <a href="http://asiermarques.com/2010/12/29/symfony-wordpress-o-php-desde-0/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Este post es una reflexión sobre si realmente utilizar un framework es el camino para desarrollar aplicaciones web o es mejor utilizar un cms como WordPress o quizá una estructura de clases propia que reutilicemos en los futuros proyectos que afrontemos.</p>
<h3>Utilizar un framework como Symfony</h3>
<p>Para mí, adoptar <strong><a href="http://symfony-project.org/" target="_blank">Symfony</a> como framework</strong> ha sido una de las mejores decisiones que he tomado en mi historia como desarrollador web.</p>
<p>Symfony es un framework excelente, muy personalizable, extendible y automatizado que además, te enseña a programar bien.</p>
<p>¿Qué es programar bien? Para empezar, usar <strong>patrones de diseño</strong>, aprovechar todas las ventajas que ofrece la POO al máximo posible ademas de, por encima de todo, evitar repetirte.</p>
<p>Symfony no es el único framework que permite esto, también <a href="http://framework.zend.com/" target="_blank">Zend</a> es otra opción excelente.</p>
<p>Sin embargo, en los últimos meses he tenido la oportunidad de participar en proyectos fuera de las necesidades comunes. Ya sea por rendimiento o por la naturaleza de la aplicación, teníamos que especializar bastante funcionalidad del core de symfony, aprender casi de memoria los parámetros de <a href="http://www.symfony-project.org/reference/1_4/" target="_blank">los archivos .yml de configuración</a> o incluso, extender el framework para que cumpliese con los requisitos de la arquitectura de sistemas.</p>
<p>Esto supone en algunos casos muchas horas más que en un proyecto de php digamos &#8220;sin framework&#8221;, pero una vez conseguido el tiempo se reduce en la próxima ocasión que te encuentras con el mismo problema, si lo haces.</p>
<p>Hay pequeñas situaciones en las que debemos invertir tiempo para desarrollar pensando en el framework para obtener funcionalidad que sería trivial en un entorno sin framework. Sin embargo en general compensa porque nuestro código queda totalmente integrado con una arquitectura que tiene un nivel muy alto de calidad.</p>
<p>Pero otro problema aparece cuando de repente se anuncia una nueva versión del framework y empiezas a ver que todo lo que has aprendido en la versión 1, es completamente distinto <a href="http://www.symfony-reloaded.org/" target="_blank">en la versión 2</a>. Esto es algo bastante costoso de asumir para los desarrolladores ya que algunas de las ventajas más importantes de utilizar un framework son precisamente las que en este caso, se ha puesto en contra de todos nosotros:</p>
<ol>
<li>Todos habíamos aprendido a programar en nuestro día a día pensando en symfony, con sus configuraciones y la nomenclatura de sus clases.</li>
<li>Todos conocíamos perfectamente los nombres de los directorios, archivos de configuración y comportamientos de los métodos que se usan en las clases más importantes del framework, así como dónde teníamos que encontrar los recursos de documentación necesarios para nuestro día a día.</li>
<li>Habíamos desarrollado código reutilizable como plugins, concepto que desaparece en la próxima versión.</li>
</ol>
<p>Estos puntos son los más negros que quizá se puedan encontrar a la hora de decidirse por un framework que no sea uno nuestro propio. Sin embargo y a pesar de los mismos, creo que en general es una decisión muy buena el optar por un framework de desarrollo.</p>
<h3>Utilizar un CMS como WordPress</h3>
<p>Otra opción que existe es optar por un cms como <a href="http://wordpress.org" target="_blank">WordPress</a>. Hablo de WordPress porque es el que más conozco a &#8220;bajo nivel&#8221;. Si estás acostumbrado a utilizar un framework como Symfony, tienes la sensación al desarrollar bajo una plataforma para nada óptima (en cuanto a rendimiento se refiere) y que se salta a la torera cientos de recomendaciones sobre cómo desarrollar en un entorno POO.</p>
<p>Sin embargo el sistema funciona para la mayoría de proyectos medios o básicos, los diseñadores están encantados con él y ya lo conocen debido a la facilidad de uso de su sistema de themes, funciona sin tener que tocar prácticamente nada en la mayoría de plataformas de hosting y cubre con la necesidad funcional de todo sitio medio que no tenga necesidad de un desarrollo continuado.</p>
<p>Aunque sea una opción poco óptima fuera de la caja, en <a href="http://blackslot.com" target="_blank">Blackslot</a> tenemos corriendo varios sitios con decenas de miles de visitas al día basados en esta plataforma, con ayuda de soluciones de caché internas, teniendo aún margen para escalar a bastante más tráfico sin demandar grandes cantidades de recursos de servidor.</p>
<p>El problema reside más bien en el tipo de funcionalidad que quieres afrontar con el cms y la calidad que esperas obtener con el mismo. Yo no desarrollaría una intranet en WordPress por ejemplo, ni una plataforma de tienda electrónica para un negocio que dependa exclusivamente de esta plataforma para funcionar.</p>
<h3>Utilizar PHP desde 0</h3>
<p>Aunque durante muchos años he defendido el utilizar php sin frameworks hoy en día lo desaconsejo por completo.</p>
<p>Hace años no existía ninguna opción seria para php equiparable a un entorno .net por ejemplo. Hoy en día hay tantos que cuesta elegir.</p>
<p>No digo que debas elegir una de las opciones más maduras disponibles (que para mí sólo hay dos: Zend o Symfony). Lo que digo es que a menos que tu negocio sea una sola web y tengas el foco y todo tu tiempo puesta en ella, necesitas un framework para conseguir sobre todo estos puntos:</p>
<ol>
<li>Desarrollar con más programadores en el mismo proyecto sin que sea un caos.</li>
<li>Trabajar con más gente en el mismo proyecto. A diferencia del punto 1, tienes que tener en cuenta a diseñadores, maquetadores, analistas, gente de sistemas..</li>
<li>Tener una base reutilizable que os ahorre, a medida que desarrolléis con la misma, más y más tiempo.</li>
<li>Conseguir automatizar las tareas más repetitivas y centrarte en el código específico de la aplicación que te ocupe en ese momento.</li>
</ol>
<p>Aunque creas que lo mejor es ponerte a desarrollar un framework propio desde el principio, merece la pena conocer los frameworks que existen para aprender de miles de desarrolladores que han tenido muchos más problemas y por lo tanto tienen más experiencia que tú.</p>
<p>Desarrollar un framework sin haber utilizado otro antes como Symfony o asp.net mvc es una tarea muy compleja que puede hacerte perder mucho tiempo. Actualmente no es casualidad que Ruby On Rails, Symfony, asp.net mvc y otras opciones para desarrollo web escritas en diferentes lenguajes se parezcan entre sí. Esto es porque los problemas que nos solemos encontrar en el día a día son los mismos y es muy bueno conocer alguno de estos frameworks al detalle para orientarte sobre cómo debes organizar la arquitectura de una aplicación web seria.</p>
<p>En mi caso, incentivado por el cambio de versión de Symfony y por algunas de las cosas que no me han gustado o que he visto demasiado complejas en el mismo para solucionar determinados problemas, he empezado a diseñar y desarrollar en mis tiempos muertos un framework mucho más ligero y simple que Symfony pero pensado tanto para entornos tanto de hosting compartido como para arquitecturas más complejas.</p>
<p>Sin embargo no voy a dejar de utilizar ni Symfony ni WordPress. Me encanta Symfony y muchas de las cosas que he aprendido con este framework las estoy aplicando en este proyecto e incluso utilizo alguno de <a href="http://components.symfony-project.org/" target="_blank">sus componentes</a>. WordPress por su parte es la mejor opción para reducir costes en determinados proyectos que no requieran ni complejidad ni funcionalidad fuera de lo que se espera de un sistema de publicación.</p>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2010/12/29/symfony-wordpress-o-php-desde-0/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Idea: sistema de recomendación de contactos en Twitter</title>
		<link>http://asiermarques.com/2010/09/20/sistema-de-recomendacion-de-contactos-en-twitter/</link>
		<comments>http://asiermarques.com/2010/09/20/sistema-de-recomendacion-de-contactos-en-twitter/#comments</comments>
		<pubDate>Mon, 20 Sep 2010 01:34:54 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Emprendedores]]></category>
		<category><![CDATA[Innovación]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Mis Proyectos]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[[Pe]n[sa]n[do]]]></category>
		<category><![CDATA[ideas de proyectos]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=1440</guid>
		<description><![CDATA[Desde hace un tiempo he estado dándole vueltas a un sistema de recomendación de contactos en twitter. Filtrar por listas es efectivo para seguir las actualizaciones de las personas que más me interesa lo que suelen decir, pero de vez &#8230; <a href="http://asiermarques.com/2010/09/20/sistema-de-recomendacion-de-contactos-en-twitter/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Desde hace un tiempo he estado dándole vueltas a un sistema de recomendación de contactos en twitter.</p>
<p>Filtrar por listas es efectivo para seguir las actualizaciones de las personas que más me interesa lo que suelen decir, pero de vez en cuando suelo consultar el stream del resto para captar nuevos contactos o enterarme de cosas que no veo en estas listas privadas.</p>
<p>He observado que podría automatizar el flujo de entrada y salida de contactos en las listas que he creado, para ello necesitaría crear un sistema que en base a ciertos patrones me sugiriese qué usuarios debo dejar de seguir en mis listas y cuales debo agregar.</p>
<p>Existen herramientas como <a href="http://www.muuter.com/" target="_blank">http://www.muuter.com/</a> (gracias <a href="http://cesarodas.com/" target="_blank">César</a> por la <a href="http://twitter.com/crodas/statuses/24875166684" target="_blank">recomendación</a>), que permiten silenciar actualizaciones que contengan palabras que no quiero leer. Esto no me termina de convencer, ya que es posible que no me moleste que puntualmente un contacto diga &#8220;goool&#8221; (no me gusta el fútbol), o que mencione lo bueno que es su trabajo como SEO/socialmedia (bueno quizá en estos casos si que me vería tentado a dejar de seguirle :)</p>
<p>El sistema que propongo se basaría principalmente en lo contrario, es decir sería un sistema de recomendación basado principalmente en <a href="http://es.wikipedia.org/wiki/Lista_negra" target="_blank">listas blancas</a>.</p>
<p>De entrada se me ocurren los siguientes requisitos:</p>
<ul>
<li>Dado que el sistema no me podría dar la información nada más registrarme, debería guardar mis contactos en su base de datos y evaluar sus updates cada cierto tiempo para compararlos a los criterios que he especificado en mis listas blancas y negras. Cada semana me podría sugerir nuevos cambios en mis listas privadas es decir, si debo agregar o quitar a alguien de las mismas.</li>
<li>Ya que la aplicación seguiría updates de mis contactos, y de los contactos de los demás usuarios, no estaría mal que me recomendase contactos que no esté siguiendo actualmente.</li>
<li>La aplicación analizaría mis propios updates, extrayendo las palabras que más repito usando estas como un criterio para distinguir una posible afinidad con respecto a otros usuarios. Podría tomar dichas palabras como criterios para una lista blanca y las que estén tageadas (es decir con #) en un update con la etiqueta #ironic en una lista negra.</li>
<li>La aplicación me permitiría poner una serie de filtros basados en expresiones regulares. Las <a href="http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular" target="_blank">expresiones regulares</a>, aunque son difíciles para un usuario normal, permiten una mayor precisión de filtrado, que es lo que más me interesa. Gracias a ellas podría filtrar mucho más fácilmente usuarios que les guste el fútbol, hagan retweets sin aportar nada sobre temas que no quiero seguir o al revés, el sexo del contacto en base a las terminaciones sintácticas de ciertas palabras e infinidad de filtros mucho más flexibles que pudiese tener con simples palabras clave o la api del propio twitter. Estos filtros podría aplicarlos tanto en listas blancas como en listas negras.</li>
<li>Para dar más precisión a las listas blancas, la aplicación me permitiría especificar palabras clave y <a href="http://search.twitter.com/advanced" target="_blank">otros criterios</a> más típicos en una aplicación de este tipo.</li>
</ul>
<p>El algoritmo que evalúe qué contactos de twitter deben estar en las listas que sigo o cuales no, deberá calcular estas prioridades según los criterios descritos anteriormente y su recurrencia en los updates de estos usuarios. Es decir, si un usuario tiene muchos updates seguidos con criterios en una lista negra, se irá antes de mi bandeja de entrada que un usuario que tenga los mismos updates pero en intervalos de tiempo más largos y con otros updates de por medio que sí me interesen.</p>
<p>Pienso que podría ser una aplicación muy útil, si tenéis alguna sugerencia u os parece una tontería, dejad comentario.</p>
<p style="text-align: center;"><a href="http://www.flickr.com/photos/monkeyjenn/2801833980/"><img class="aligncenter" title="Domo-kun and devil ducks" src="http://farm4.static.flickr.com/3263/2801833980_2e5d6215bd.jpg" alt="Domo-kun and devil ducks" width="500" height="375" /></a></p>
<p>Siempre es interesante ver otros puntos de vista y aportaciones :)</p>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2010/09/20/sistema-de-recomendacion-de-contactos-en-twitter/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Se necesita algo más que tecnología</title>
		<link>http://asiermarques.com/2010/02/21/se-necesita-algo-mas-que-tecnologia/</link>
		<comments>http://asiermarques.com/2010/02/21/se-necesita-algo-mas-que-tecnologia/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 17:32:34 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Citas]]></category>
		<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Emprendedores]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=1302</guid>
		<description><![CDATA[&#8220;Software is a conversation, between the software developer and the user. But for that conversation to happen requires a lot of work beyond the software development. It takes marketing, yes, but also sales, and public relations, and an office, and &#8230; <a href="http://asiermarques.com/2010/02/21/se-necesita-algo-mas-que-tecnologia/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h3 style="text-align: center;"><span style="color: #808080;">&#8220;Software is a conversation, between the software developer and the user.  But for that conversation to happen requires a lot of work beyond the  software development. </span></h3>
<h3 style="text-align: center;"><span style="color: #808080;">It takes marketing, yes, but also sales, and  public relations, and an office, and a network, and infrastructure, and  air conditioning in the office, and customer service, and accounting,  and a bunch of other support tasks.&#8221;</span></h3>
<p style="text-align: center;">Joel Spolsky en su artículo <a href="http://www.joelonsoftware.com/articles/DevelopmentAbstraction.html" target="_blank">The Development Abstraction Layer</a></p>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2010/02/21/se-necesita-algo-mas-que-tecnologia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tú, tu propio usuario</title>
		<link>http://asiermarques.com/2009/12/08/tu-tu-propio-usuario/</link>
		<comments>http://asiermarques.com/2009/12/08/tu-tu-propio-usuario/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 00:30:03 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Emprendedores]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[[Pe]n[sa]n[do]]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=1238</guid>
		<description><![CDATA[En el desarrollo de proyectos web, sobre todo en el desarrollo de proyectos que lideran emprendedores en internet, existe un factor con el que me encuentro a menudo y  que lleva a la mayoría de los mismos, al más contundente &#8230; <a href="http://asiermarques.com/2009/12/08/tu-tu-propio-usuario/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>En el desarrollo de proyectos web, sobre todo en el desarrollo de proyectos que lideran <strong>emprendedores en internet</strong>, existe un factor con el que me encuentro a menudo y  que lleva a la mayoría de los mismos, al más contundente de los <strong>fracasos</strong>. Es un factor que es muy fácil de reconocer y que puede darte la cualidad de adivinar qué proyecto puede pasar de una primera fase y cuál no, en el 95% de los casos.</p>
<p>Dicho factor radica, en que <strong>el promotor del proyecto</strong> (que raramente coincide con el desarrollador del mismo) no sea, ni tenga el interés de ser, <strong>usuario del mismo</strong>.</p>
<p>Y es un factor muy típico, algo que lleva a muchas personas o empresas a <strong>forzar la innovación</strong> en áreas que ni conocen ni les interesa conocer.</p>
<p>Para muchas personas, el éxito de su proyecto en internet depende exclusivamente de los medios tecnológicos que lo sirven a los usuarios finales. Se habla de tecnologías, de metodologías de desarrollo, de financiación, de seo, de marketing&#8230; pero desde mi punto de vista por muy bien que se haga el trabajo en esas áreas, no sirve de nada si no se comparte el punto de vista de la demanda y en lugar de eso, nos encerramos en los argumentos que hemos creado para respaldar nuestra oferta. Sinceramente pienso que eso no tiene base alguna y cae, tarde o temprano, por su propio peso.</p>
<p><strong>Es muy difícil</strong>, si no has trabajado en un área concreta antes o si no has consumido/disfrutado de los servicios o productos que buscabas en dicho área, que puedas detectar una forma de <strong>cambiar las reglas de juego</strong>. Es evidente que puede haber excepciones, pero sin duda veo necesario que al menos se parta de una base o de experiencia en otro área directamente relacionada a la que se pretende atacar.</p>
<p><strong>Esto hace precisamente que la idea carezca de valor</strong>, por mucho que se invierta en ella económica o tecnológicamente. Y se nota claramente cuando <strong>un emprendedor se sabe desenvolver en el área por el que apuesta</strong>, conoce y le apasiona, ya que <strong>rompe las barreras que otros no saben detectar</strong>, con pequeños o grandes detalles que demuestran la solidez de su proyecto.</p>
<p>Sin más, esto era una pequeña reflexión que siempre me hace echar el freno cuando pienso en desarrollar algo en un campo sobre el cual no tengo ni idea.</p>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2009/12/08/tu-tu-propio-usuario/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

