<?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>Joan Ballester Moragues &#187; Programación</title>
	<atom:link href="http://joanballestermoragues.com/category/programacion-desarrollo/feed" rel="self" type="application/rss+xml" />
	<link>http://joanballestermoragues.com</link>
	<description>Joan Ballester Moragues &#124; Programación, Software libre, GNU/Linux</description>
	<lastBuildDate>Tue, 07 Feb 2012 10:09:22 +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>Igualar altura de columnas con jQuery</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/igualar-altura-de-columnas-con-jquery.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/igualar-altura-de-columnas-con-jquery.html#comments</comments>
		<pubDate>Tue, 13 Dec 2011 12:00:46 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Embat Consultors]]></category>
		<category><![CDATA[Experimentos]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[LABS]]></category>

		<guid isPermaLink="false">http://joanballestermoragues.com/?p=1143</guid>
		<description><![CDATA[Como hicimos en la anterior entrada (Geolocalización mediante el Api de Google Maps), vamos a seguir subiendo algunos ejemplos, snipets o pruebas que tenemos en local y que pueden servir a alguien. Este es rapidito y fácil, pero muchas veces cuando maquetas algo con columnas tienes el problemilla de los fondos&#8230; que no sabes el [...]]]></description>
			<content:encoded><![CDATA[<p>Como hicimos en la anterior entrada (<a title="Geolocalización mediante el Api de Google Maps" href="http://joanballestermoragues.com/programacion-desarrollo/geolocalizacion-mediante-el-api-de-google-maps.html" target="_blank">Geolocalización mediante el Api de Google Maps</a>), vamos a seguir subiendo algunos ejemplos, snipets o pruebas que tenemos en local y que pueden servir a alguien.</p>
<p>Este es rapidito y fácil, pero muchas veces cuando maquetas algo con columnas tienes el problemilla de los fondos&#8230; que no sabes el contenido que meterán en cada una de las columnas y resulta complicado que queden de la misma altura&#8230; pues bien, como de momento CSS3 está un poco lejano en este aspecto (algunos navegadores nos traerán problemas con ello), con un rápido jquery lo solucionamos, bueno bonito barato, aquí tenéis, tiene poco secreto pero es útil, os dejo el código:</p>
<pre>$(document).ready(function() {
    var altMax = 0;
    ajustarAlturas(altMax, '.contenedor div');
});
function ajustarAlturas(altMax, elemento) {
    $(elemento).each(function(i) {
        var xL = $(this).height();
        if (xL &gt; altMax) {
            altMax = xL;
        }
    });
    $(elemento).css('height', altMax);
}</pre>
<p>HTML y CSS simplemente para resaltar las columnas y ver que está correcto:</p>
<pre>
&lt;div class="contenedor"&gt;
    &lt;div class="ajustable"&gt;lorem ipsum lorem lorem&lt;/div&gt;
    &lt;div class="ajustable"&gt;lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem&lt;/div&gt;
    &lt;div class="ajustable"&gt;lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem lorem ipsum lorem lorem&lt;/div&gt;
&lt;/div&gt;
</pre>
<pre>
.contenedor{
    position:relative;
    overflow:hidden;
    border:1px solid #DDD;
    background-color:#EFEFEF;
}
.ajustable{
    position:Relative;
    float:left;
    padding:1%;
    margin:1%;
    width:29.3%;
    background-color:#FAFAFA;
    font-size:13px;
}
</pre>
<p>Podéis ver <a href="http://labs.embatconsultors.com/jquery-igualar-columnas/" target="_blank">el ejemplo funcionando aquí</a>.</p>
<p>Un saludo, espero que vayamos subiendo <a href="http://labs.embatconsultors.com" target="_blank">más experimientos</a> :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/igualar-altura-de-columnas-con-jquery.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Geolocalización mediante el Api de Google Maps</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/geolocalizacion-mediante-el-api-de-google-maps.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/geolocalizacion-mediante-el-api-de-google-maps.html#comments</comments>
		<pubDate>Wed, 30 Nov 2011 15:00:00 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Embat Consultors]]></category>
		<category><![CDATA[Experimentos]]></category>
		<category><![CDATA[Google Maps]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[LABS]]></category>

		<guid isPermaLink="false">http://joanballestermoragues.com/?p=1131</guid>
		<description><![CDATA[Como hicimos en la anterior entrada (subir ficheros con la ayuda de la API de HTML5), vamos a seguir subiendo algunos ejemplos, snipets o pruebas que tenemos en local y que pueden servir a alguien. Hoy  se trata de geolocalización mediante el Api de Google Maps (con sensor true). Esta sí que no tiene secreto [...]]]></description>
			<content:encoded><![CDATA[<p>Como hicimos en la anterior entrada (<a href="http://labs.embatconsultors.com/html5-uploader/" target="_blank">subir ficheros con la ayuda de la API de HTML5</a>), vamos a seguir subiendo algunos ejemplos, snipets o pruebas que tenemos en local y que pueden servir a alguien.</p>
<p>Hoy  se trata de <a href="http://labs.embatconsultors.com/google-maps-geolocalizacion/" target="_blank">geolocalización mediante el Api de Google Maps (con sensor true)</a>.</p>
<p>Esta sí que no tiene secreto ninguno, como veréis no es más que activar el sensor (true) y un pequeño método de unas líneas.</p>
<pre>var map;
function initialize() {
    var myOptions = {
        zoom: 6,
        center: new google.maps.LatLng(38.977029166667,1.5129795833333),
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById('mapa'), myOptions);
    if(navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function(position) {
            var posicion = new google.maps.LatLng(position.coords.latitude,
                position.coords.longitude);
            map.setCenter(posicion);
            var marker = new google.maps.Marker({
                position: posicion,
                map: map,
                icon: "http://negociosenibiza.com/web_img/red.png"
            });
        }, function() { handleNoGeolocation(true); });
    } else {
        handleNoGeolocation(false);
    }
}
function handleNoGeolocation(errorFlag) {
    if (errorFlag) { alert("El servicio de Geolocalización ha fallado"); }
    else { alert("Tu navegador no soporta Geolocalización"); }
}
google.maps.event.addDomListener(window, 'load', initialize);</pre>
<p>Podéis ver <a href="http://labs.embatconsultors.com/google-maps-geolocalizacion/" target="_blank">el ejemplo funcionando aquí</a>.</p>
<p>Un saludo, espero que vayamos subiendo <a href="http://labs.embatconsultors.com" target="_blank">más experimientos</a> :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/geolocalizacion-mediante-el-api-de-google-maps.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Subir imágenes con el API de HTML5</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/subir-imagenes-con-el-api-de-html5.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/subir-imagenes-con-el-api-de-html5.html#comments</comments>
		<pubDate>Thu, 24 Nov 2011 11:00:33 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Embat Consultors]]></category>
		<category><![CDATA[Experimentos]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[LABS]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://joanballestermoragues.com/?p=1122</guid>
		<description><![CDATA[En Embat Consultors, estamos haciendo un pequeño tutorial de html5, para aprender html5 rápidamente. Son entradas muy breves, de distinta índole (Estructura, Elementos, etc&#8230;) que luego podremos ir recuperando y crear un gran tutorial, pero paralelamente a eso, vamos a empezar a hacer algunos pequeños scripts y publicarlos. La verdad es que en local tenemos [...]]]></description>
			<content:encoded><![CDATA[<p>En <a href="http://embatconsultors.com" target="_blank">Embat Consultors</a>, estamos haciendo un pequeño <a href="http://embatconsultors.com/blog/tag/html5" target="_blank">tutorial de html5</a>, para <a href="http://embatconsultors.com/blog/tag/fast-html5" target="_blank">aprender html5 rápidamente</a>.</p>
<p>Son entradas muy breves, de distinta índole (Estructura, Elementos, etc&#8230;) que luego podremos ir recuperando y crear un gran tutorial, pero paralelamente a eso, vamos a empezar a hacer algunos pequeños scripts y publicarlos.</p>
<p>La verdad es que en local tenemos miles de pruebas que vamos haciendo cuando sale algo nuevo, y el otro día pensamos&#8230; ya que igualmente lo hacemos en local, porque no subirlo y lo compartimos, siempre podemos ganar algo más (comentarios, mejoras, etc&#8230;).</p>
<p>El primero que voy a subir, se trata de <a href="http://labs.embatconsultors.com/html5-uploader/" target="_blank">subir ficheros con la ayuda de la API de HTML5</a>.</p>
<p>El ejemplo está en PHP, pero podéis pasarlo rápidamente al lenguaje que os haga falta, realmente la forma de recibir los ficheros y subirlos es lo de menos, lo interesante es ver cómo los almacena el cliente y los pasa al fichero de servidor.</p>
<p>En realidad el código no tiene demasiado secreto, el HTML es simplemente un formulario con un input file</p>
<pre>&lt;form method="post" enctype="multipart/form-data"  action="upload.php"&gt;
    &lt;input type="file" name="imgs" id="imgs" multiple /&gt;
&lt;/form&gt;
&lt;div id="ajax"&gt;&lt;/div&gt;
&lt;div id="imagenes"&gt;&lt;/div&gt;</pre>
<p>Y el javascript, también es bastante claro, únicamente utilizamos <strong>FormData()</strong>, añadimos un evento y vamos añadiendo ficheros, leyéndolos con <strong>FileReader()</strong>, al final un ajax para mandar todo al PHP, pero también es irrelevante para mostrar esto&#8230;</p>
<pre>var formdata = new FormData();
document.getElementById("imgs").addEventListener("change", function (evt) {
    $("#ajax").html("Subiendo");
    var i = 0, len = this.files.length, img, reader, file;
    for ( ; i &lt; len; i++ ) {
        file = this.files[i];
        if (!!file.type.match(/image.*/)) {
            if ( window.FileReader ) {
                reader = new FileReader();
                reader.onloadend = function (e) {
                    $('#imagenes').append('&lt;img src="' +e.target.result+ '" /&gt;');
                };
                reader.readAsDataURL(file);
            }
            formdata.append("imgs[]", file);
        }
    }
}, false);</pre>
<p>El PHP en realidad da igual, simplemente recibe los ficheros y los copia en el servidor.</p>
<p>La idea me vino de <a href="http://hacks.mozilla.org/2011/03/the-shortest-image-uploader-ever/" target="_blank">este experimento de mozilla</a>.</p>
<p>Un saludo, espero que vayamos subiendo <a href="http://labs.embatconsultors.com" target="_blank">más experimientos</a> :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/subir-imagenes-con-el-api-de-html5.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>¿Cliente como conejillo de indias?</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/%c2%bfcliente-como-conejillo-de-indias.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/%c2%bfcliente-como-conejillo-de-indias.html#comments</comments>
		<pubDate>Mon, 31 Oct 2011 16:45:37 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Aprender]]></category>
		<category><![CDATA[Cliente]]></category>
		<category><![CDATA[Proyecto]]></category>

		<guid isPermaLink="false">http://joanballestermoragues.com/?p=1103</guid>
		<description><![CDATA[Debo reconocer que hace un tiempo jamás hubiera pensado así. Ni por asomo&#8230; Pero también debo reconocer, que en algunos casos, creo que no hay otro modo de avanzar. Y no solo de avanzar en el trabajo, o de avanzar tú, individualmente como desarrollador&#8230; Hablo de avanzar en general, de avanzar todos los desarrolladores, los [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-medium wp-image-1104" title="Testing at home" src="http://joanballestermoragues.com/wp-content/uploads/4974020028_df23f13c3f-400x266.jpg" alt="" width="400" height="266" /></p>
<p>Debo reconocer que hace un tiempo jamás hubiera pensado así. Ni por asomo&#8230;</p>
<p>Pero también debo reconocer, que en algunos casos, creo que no hay otro modo de avanzar. Y no solo de avanzar en el trabajo, o de avanzar tú, individualmente como desarrollador&#8230; Hablo de avanzar en general, de avanzar todos los desarrolladores, los estándares, la web como parte de un todo.</p>
<p>Puede que unos ya hayáis llegado a esta conclusión, puede que otros no, o que simplemente alguna vez os hagáis una serie de preguntas.</p>
<p>Pues bien, esas preguntas para mi ya tienen respuesta.</p>
<p>No hay modo alguno de trabajar, y sacar adelante los proyectos, y a la vez estudiar y practicar las novedades que trae el mundo web, pulirlos y luego aplicarlos, que, parece el procedimiento lógico&#8230; el problema empieza a ser realmente serio cuando cada semana hay nuevos cambios y novedades, que tienes que probar y aprender si no te quieres quedar cada vez más descolgado, cosa que te mataría profesionalmente, pero no solo eso&#8230; si no que a la vez, los clientes que tienes pasarían a estar todos desactualizados&#8230; y en el fondo, ya no serías el desarrollador que quieres ser, que está a la última, que aprende cada día, etc&#8230;</p>
<p>Yo antes, sin ninguna duda era de esos de aprender, probar, dominar totalmente, y luego ejecutar en clientes, ejecutarlo primero en los nuevos, aprovechando desarrollos desde 0, y luego poco a poco, ir reemplazando los antiguos hasta que más o menos todo estaba controlado.</p>
<p>Pero claro, ¿ahora cómo lo haces?, si estás puesto en el html5 y lo sigues, verás como cada día hay novedades, en el mundo css3 también, en las compatibilidades de navegadores&#8230; ya es que ni lo menciono, pero es uno de los quebraderos de cabeza que parecía que tarde o temprano se arreglaría, y lo único que sucede es que se agrava ese problema.</p>
<p>Y claro está, el mundo móvil ;-) Que aquí sí que es para darles de comer aparte&#8230; porque si básicamente te centras en apple/android, aún te salvas, pero como quieras llegar más allá&#8230; ya puedes empezar a prepararte cafés.</p>
<p>Por tanto, ¿solución? No queda otra que los proyectos de tus clientes pasen a ser tu campo de aprendizaje, si no lo haces así, amigo&#8230; <strong>estás jodido</strong>.</p>
<p>A la larga, también tus clientes, porque no puedes darles ese plus de innovación, o de estar totalmente a la última, por tanto no les costará entenderlo&#8230; siempre que tengas un buen sistema de tickets o de control de proyectos y puedas monitorizar todos los errores y solucionarlos, es decir,<strong> organízate</strong>, o estás vendido.</p>
<p>Ah, y luego viene lo peor de todo&#8230; mirar atrás. Una vez que has pasado a NodeJS este proyecto (o <a href="http://embatconsultors.com/blog/post-tecnico/jade-la-elegancia-y-sencillez-en-el-html.html" target="_blank">JADE</a>, o <a href="http://embatconsultors.com/blog/post-tecnico/stylus-una-forma-diferente-de-cssear.html" target="_blank">STYLUS</a>), HTML5 bien trabajado&#8230; ahora mira atrás, a los otros proyectos, y llora ;-)</p>
<p><strong>En resumen</strong>, que si estás en esto porque te gusta, porque es tu vocación, porque te apasiona y vives el día a día como más te gusta&#8230; que es programando y aprendiendo: <strong>ENHORABUENA</strong>, y si no es así&#8230; <strong>ESTÁS JODIDO</strong>, cambia de trabajo YA. Os lo dice alguien del primer grupo ;-)</p>
<p>Un saludo!</p>
<p><a href="http://www.flickr.com/photos/konch/4974020028/sizes/m/in/photostream/">Imagen de Flickr (konch)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/%c2%bfcliente-como-conejillo-de-indias.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>phone App Vs web App</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/phone-app-vs-web-app.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/phone-app-vs-web-app.html#comments</comments>
		<pubDate>Thu, 28 Oct 2010 10:00:07 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[App]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[phone App]]></category>
		<category><![CDATA[Usabilidad]]></category>
		<category><![CDATA[web App]]></category>

		<guid isPermaLink="false">http://www.joanballestermoragues.com/?p=837</guid>
		<description><![CDATA[¿Quién, a día de hoy, no tiene un smartphone? ¿Quién, a día de hoy, no tiene instalada alguna app en su smartphone? Una de las cosas que me cuesta entender en la mayoría de ocasiones (hay otras en las que sí lo entiendo), es el porque molestarse en programar una App para móvil, pudiendo adaptar [...]]]></description>
			<content:encoded><![CDATA[<p>¿Quién, a día de hoy, no tiene un smartphone?</p>
<p>¿Quién, a día de hoy, no tiene instalada alguna app en su smartphone?</p>
<p><img class="alignnone size-full wp-image-845" title="firefox-movil" src="http://www.joanballestermoragues.com/wp-content/uploads/firefox-movil.jpg" alt="firefox-movil" width="294" height="292" />Una de las cosas que me cuesta entender en la mayoría de ocasiones (hay otras en las que sí lo entiendo), es el porque molestarse en programar una App para móvil, pudiendo adaptar la web. Es más, no solo porque molestarse en programarla, si no también el usuario en instalarla&#8230; Si te lías a instalar Apps, te quedas solo, no termino de entender el propósito, exceptuando algunas que realmente si son útiles.</p>
<p>Desde el punto de vista del desarrollador, pasa un poco lo mismo, ya que tienes que programar específicamente con determinados lenguajes en función del móvil para el que vas a desarrollar la aplicación.</p>
<p>Por poner un ejemplo sencillo&#8230; ¿Para qué una app móvil que busca hoteles según tus preferencias de búsqueda, si tuya tienes una web de búsqueda de hoteles?&#8230; ¿No es má sencillo (tanto para tí como para el usuario) utilizar la web, y prepararla para la versión móvil? ;-)</p>
<p><strong>Conclusión</strong></p>
<p>Desde mi punto de vista, y siempre que puedo, prefiero desarrollar web para dispositivo móvil antes que app para el móvil, así se aprovecha más la infraestctura montada.</p>
<p>Es más, lo veo mejor desde 3 puntos de vista:</p>
<ul>
<li>El usuario, que no se va a instalar cientos y cientos de aplicaciones.</li>
<li>El desarrollador, que &#8220;simplemente&#8221; (que también tiene trabajo&#8230;) tendrá que adaptar el visionado de la web o aplicación web.</li>
<li>La marca y/o web, que compartirá bases de datos y funcionalidades, y centralizará un poco el control (al dispersar más, siempre pierdes algo de control y dependes de más factores)</li>
</ul>
<p>PS: Ojo, estoy hablando siempre desde el punto de vista en que el app pertenece a una web o similar pudiendo compartir funcionalidades, bases de datos, llamadas, etc&#8230; Es decir, no veo extraño programar y utilizar una app para jugar al ajedrez, por poner un ejemplo :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/phone-app-vs-web-app.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zend Framework: Algo más sobre su MVC</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/zend-framework-mvc-2.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/zend-framework-mvc-2.html#comments</comments>
		<pubDate>Tue, 29 Jun 2010 09:00:54 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.joanballestermoragues.com/?p=744</guid>
		<description><![CDATA[Las últimas 2 entradas sobre Zend Framework fueron &#8220;Antes de empezar con ZF&#8221; y &#8220;Hello world en ZF&#8220;, hoy continuaremos algunos  conceptos muy básicos del MVC de Zend Framework. Por ejemplo, vamos a crear una vista de un listado con el controlador index: En &#8220;application/controllers/&#8221; tenemos nuestro &#8220;indexController.php&#8221;, no vamos a crear otros controladores de [...]]]></description>
			<content:encoded><![CDATA[<p>Las últimas 2 entradas sobre Zend Framework fueron &#8220;<a href="http://www.joanballestermoragues.com/programacion-desarrollo/zend-framework-antes-de-empezar.html" target="_blank">Antes de empezar con ZF</a>&#8221; y &#8220;<a href="http://www.joanballestermoragues.com/programacion-desarrollo/zend-framework-hello-world.html" target="_blank">Hello world en ZF</a>&#8220;, hoy continuaremos algunos  <strong>conceptos muy básicos del MVC</strong> de Zend Framework.</p>
<p>Por ejemplo, vamos a crear una vista de un listado con el controlador index:</p>
<p>En &#8220;application/controllers/&#8221; tenemos nuestro &#8220;indexController.php&#8221;, no vamos a crear otros controladores de momento, vamos a ir a lo básico.<br />
En &#8220;application/views/scripts/index/&#8221; tenemos &#8220;index.phtml&#8221; y vamos a crear &#8220;lista.phtml&#8221; de momento vacío, más abajo le metemos mano.<br />
Luego, en  &#8221;application/layouts/scripts/&#8221; tenemos nuestro &#8220;layout.phtml&#8221;, que puede quedarse igual de momento.</p>
<p>Let&#8217;s go:</p>
<p><strong>application/controllers/indexController.php</strong></p>
<p>Dentro de esta clase, meteríamos este método:</p>
<pre>public function listaAction()
    {
		$this-&gt;view-&gt;listado = "Listado...";
		$this-&gt;render();
    }</pre>
<p>Evidentemente cuando hacemos el &#8220;$this-&gt;view-&gt;listado&#8221; ya nos ocuparíamos de recoger ese listado de base de datos, o de sesión, etc&#8230; pero por ahora vamos con lo básico.</p>
<p>Si os fijáis simplemente renderizamos.</p>
<p><strong>application/views/scripts/index/lista.phtml</strong></p>
<pre>echo $this-&gt;listado;</pre>
<p>Y en la vista (&#8220;lista.phtml&#8221;) no hay más historia que pintar el listado que le pasamos desde el controlador.</p>
<p>Desde el controlador, más adelante, accederemos a la base de datos, sesión, etc&#8230; lo único que nos tiene que preocupar ahora mismo, es entender que al ejecutar en el navegador:</p>
<pre>http://localhost/nombredelaaplicacion/index/lista</pre>
<p>Se ejecutará dentro del indexController.php el método listaAction() y sacará su resultado (si lo tiene, renderizado&#8230;) en la vista index/lista.phtml</p>
<p>Si ejecutáramos:</p>
<pre>http://localhost/nombredelaaplicacion/index/test</pre>
<p>Se ejecutará dentro del indexController.php el método testAction() y sacará su resultado (si lo tiene, renderizado&#8230;) en la vista index/test.phtml, como no tenemos ni uno ni otro, saltaría error (que también aprenderemos a atraparlos y configurarlos)</p>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/zend-framework-mvc-2.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>La guerra de los Frameworks o la moda de los frameworks</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/la-guerra-de-los-frameworks-o-la-moda-de-los-frameworks.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/la-guerra-de-los-frameworks-o-la-moda-de-los-frameworks.html#comments</comments>
		<pubDate>Wed, 12 May 2010 23:37:28 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Framework]]></category>

		<guid isPermaLink="false">http://www.joanballestermoragues.com/?p=704</guid>
		<description><![CDATA[¡En la programación también hay modas! Pues sí, ahí donde parece que los programadores de moda ni idea, no es así. Aquí también influyen las modas. Estas últimas semanas he estado leyendo muchas opiniones en la red acerca de diferentes lenguajes de programación, y frameworks. Es un tema del que se habla hace años, pero parece [...]]]></description>
			<content:encoded><![CDATA[<p><strong>¡En la programación también hay modas! <span style="font-weight: normal;">Pues sí, ahí donde parece que los programadores de moda ni idea, no es así. Aquí también influyen las modas.</span></strong></p>
<p>Estas últimas semanas he estado leyendo muchas opiniones en la red acerca de diferentes lenguajes de programación, y frameworks. Es un tema del que se habla hace años, pero parece que ahora está muy en auge, y eso me ha animado a pensar en ello un poco más, y dejarlo a modo de opinión.</p>
<p>No deja de ser curioso la forma que tienen muchos de defender &#8220;lo suyo&#8221;. Sea un sistema operativo, un lenguaje de programación, o un framework. A veces nos ponemos de un tonto que no veas, y me incluyo, porque con el tema &#8220;GNU/Linux Vs Windows Vs Mac&#8221; siempre acabo dando la brasa, y en ocasiones me convierto en un auténtico talibán, cosa que por otra parte odio. Curioso, ¿no? :-)</p>
<p>Me he dado cuenta que este defecto muchas veces no nos deja ver más allá, y entender que motiva a otra gente a utilizar algo que a tí no te gusta, o que no es tu predilecta. Y &#8220;cosa&#8221; puede ser, como he dicho antes, un sistema operativo, una marca de ordenadores, un lenguaje de programación, librería, framework&#8230; Lo que queráis.</p>
<p>Cuando necesitas elegir algo de lo anteriormente citado, en que puntos basarse para la elección:</p>
<ul>
<li>1. Lo que tu necesitas del mismo, es decir, para que vas a utilizarlo</li>
<li>2. Las características que tiene</li>
<li>3. El conocimiento/comunidad que hay en la red, para poder consultar, preguntar, etc&#8230;</li>
<li>4. Tu conocimiento del mismo (esta opción, es evidente que al inicio de la elección es nulo, pero cuando has probado varios, tus conocimientos del mismo son importantes)</li>
<li>5. Gustirrinín (Tu sensación al utilizarlo)</li>
</ul>
<p>¿Por qué? Pues muy simple, analizando sobretodo los puntos 1 y 2, te das cuenta de que muchas elecciones jamás se darían, porque habría muchos &#8220;empates&#8221; (elecciones que cumplen ambos puntos porque tienen lo que necesitas). Ahí ya entra el criterio personal de cada uno, lo a gusto que se siente uno eligiendo esa opción (El &#8220;gustirrinín&#8221;)</p>
<p>Yo puedo sentirme más cómodo con GNU/Linux y otro con Windows, y en realidad, que cada uno tenga lo que quiere del mismo. Si, es muy raro que defienda la elección de windows, pero qué coño&#8230; pensadlo fríamente, si alguien necesita el word, un navegador y el msn messenger, tampoco le va a hundir utilizar windows.</p>
<p>¿Que si lo probara con ubuntu (por la facilidad de uso comparada a windows) acabaría haciéndose con ello? Pues si, pero tiene que querer hacerlo, no a todos nos gusta cacharrear, probar, cambiar&#8230; (Ojo, el tema de windows es solo un ejemplo).</p>
<p>Con un lenguaje y/o framework pasa igual, puedes probar varios y cuando das con uno que te gusta y cumple tus necesidades lo acabas adoptando, y al final, ¡defendiendo!</p>
<p>Hace un tiempo, pidiendo consejo a alguien que considero de los mejores programadores a mi alcance sobre que opción elegir, me acabó diciendo&#8230; Muchos de ellos tienen ventajas similares, al final, &#8220;decídete por el que te parezca más sexy&#8221;.</p>
<p>Interesante forma de decirlo, pero no deja de ser la verdad, siéntete cómodo, es tu herramienta.</p>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/la-guerra-de-los-frameworks-o-la-moda-de-los-frameworks.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Zend Framework: Hello world</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/zend-framework-hello-world.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/zend-framework-hello-world.html#comments</comments>
		<pubDate>Mon, 05 Apr 2010 18:48:12 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Hello world]]></category>
		<category><![CDATA[Software Libre]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.joanballestermoragues.com/?p=679</guid>
		<description><![CDATA[En el apunte anterior expliqué un poco la estructura básica de los directorios de Zend Framework y el patrón MVC, en este apunte haremos un &#8220;hello world&#8221; sencillito. Advertencia: A la hora de instalar el Zend Framework (para instalarlo debería bastar con un aptitude, os recuerdo las diferencias entre apt-get y aptitude) os daréis cuenta de que [...]]]></description>
			<content:encoded><![CDATA[<p>En el <a href="http://www.joanballestermoragues.com/programacion-desarrollo/zend-framework-antes-de-empezar.html" target="_blank">apunte anterior</a> expliqué un poco la estructura básica de los directorios de Zend Framework y el patrón MVC, en este apunte haremos un &#8220;hello world&#8221; sencillito.</p>
<p><span style="text-decoration: underline;">Advertencia</span>: A la hora de instalar el Zend Framework (para instalarlo debería bastar con un aptitude, os recuerdo las <a href="http://www.joanballestermoragues.com/gnu-linux/gnulinux-aptitude-o-apt.html" target="_blank">diferencias entre apt-get y aptitude</a>) os daréis cuenta de que las librerías se pueden llamar desde diferentes sitios. Podéis optar por duplicarlas en todas vuestras aplicaciones, y tenerlas en la carpeta &#8220;library&#8221; dentro de &#8220;application&#8221; o podéis nutriros de las librerías en un directorio común, es muy sencillo y no os dará ningún problema.</p>
<p>Lo siguiente que yo haría sería un alias apuntando al Zend Framework  en mi máquina queda así:</p>
<blockquote><p>$&gt; alias zf=&#8217;/usr/share/php/ZendFramework-1.10.0/bin/zf.sh&#8217;</p></blockquote>
<p>Para que al pulsar &#8220;zf&#8221; en vuestra shell se ejecute el comando directamente, para saber si está bien instalado, bastaría con hacer un:</p>
<blockquote><p>$&gt; zf</p></blockquote>
<p>De este modo os debería salir una ayuda de Zend en la que os explica los comandos que podéis utilizar, etcétera.</p>
<p>Una vez instalado el Zend Framework os váis a vuestro directorio donde tengáis localhost y hacéis:</p>
<blockquote><p>$&gt; cd /var/www/<br />
$&gt; zf create project aplicacion<br />
$&gt; ls aplicacion</p></blockquote>
<p>Al hacer el &#8220;ls&#8221; veréis como Zend ya os crea la estructura básica de Zend Framework:<br />
application/<br />
—— configs/<br />
—— controllers/<br />
—— models/<br />
—— views/<br />
library/<br />
—— Zend/<br />
public/<br />
tests /</p>
<p>Bien, vamos por buen camino, para que lo sepáis, el navegador tiene que apuntar a &#8220;public&#8221; para que se ejecute la aplicación web, por tanto, id a vuestro navegador (explorer no lo es) y teclead:</p>
<blockquote><p>http://localhost/aplicacion/public/</p></blockquote>
<p>Debería saliros el hello world de Zend, si no os saliera y obtuviérais un error en el que os dice que no encuentra &#8220;Zend/Application.php&#8221; es porque no encuentra las librerías (las que os expliqué al inicio), en ese caso o las ponéis dentro de &#8220;library&#8221; (y os quedaría library/Zend) o cambiáis las rutas.</p>
<p>En el próximo apunte destriparemos un poco la aplicación y haremos un layout (por ejemplo).</p>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/zend-framework-hello-world.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zend Framework: Antes de empezar</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/zend-framework-antes-de-empezar.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/zend-framework-antes-de-empezar.html#comments</comments>
		<pubDate>Mon, 29 Mar 2010 19:24:49 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software Libre]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.joanballestermoragues.com/?p=669</guid>
		<description><![CDATA[Vamos a presuponer que quien abre este apunte es porque ya tiene conocimientos de programación, y supongo, que también del lenguaje PHP (Zend Framework está programado en PHP), por tanto vamos a obviar muchos términos.. Objetivo del apunte: 1. Refrescar la memoria con el patrón MVC. 2. Mostrar el Árbol de archivos en una aplicación básica [...]]]></description>
			<content:encoded><![CDATA[<p>Vamos a presuponer que quien abre este apunte es porque ya tiene conocimientos de programación, y supongo, que también del lenguaje PHP (<a href="http://framework.zend.com/" target="_blank">Zend Framework</a> está programado en <a href="http://php.net/" target="_blank">PHP</a>), por tanto vamos a obviar muchos términos..</p>
<p>Objetivo del apunte:</p>
<ul>
<li>1. Refrescar la memoria con el patrón MVC.</li>
<li>2. Mostrar el Árbol de archivos en una aplicación básica de Zend Framework.</li>
</ul>
<p><strong>1. Patrón MVC</strong></p>
<p>Para quien no haya trabajado con el <strong>patrón MVC</strong> (<a href="http://es.wikipedia.org/wiki/Modelo_Vista_Controlador" target="_blank">modelo vista controlador</a>) lo explicaré un poco por encima, y así a partir de aquí será más sencillo entenderlo todo.</p>
<p>La lógica a la hora de programar nos dice que el interfaz de usuario cambia con más frecuencia que los almacenamientos de datos y la lógica de negocio, por tanto si mezclamos en nuestras aplicaciones los componentes de interfaz, los de negocio y los de almacenamiento tendremos como consecuencia <strong>las famosísimas ñapas[1]</strong> ya que cuando queramos cambiar la interfaz tendremos que modificar muchos componentes de negocio (o todos!).</p>
<p>El patrón MVC se basa en la reusabilidad y la facilidad de cambios (mantenimiento del software) y separa los datos, la interfaz y la lógica de negocio en tres componentes: Modelos, Vistas y Controladores.</p>
<ul>
<li>Modelo: El modelo se limita a lo relativo de la vista y su controlador facilitando las presentaciones visuales complejas. El sistema también puede operar con más datos no relativos a la presentación, haciendo uso integrado de otras lógicas de negocio y de datos afines con el sistema modelado.</li>
<li>Vista: Este presenta el modelo en un formato adecuado para interactuar, usualmente la interfaz de usuario. En el caso de Zend Framework se compone básicamente de archivos .phtml que se podrán reutilizar a modo de plantillas (o no, a gusto del consumidor)</li>
<li>Controlador: Este responde a eventos, usualmente acciones del usuario, e invoca peticiones al modelo y, probablemente, a la vista.</li>
</ul>
<p><strong>2. Árbol de archivos en una aplicación básica de Zend Framework.</strong></p>
<p>Os dejo la estructura básica de archivos que se utiliza en el Zend Framework:</p>
<p><span style="text-decoration: underline;">Aplicación</span><br />
application/<br />
&#8212;&#8212; configs/<br />
&#8212;&#8212; controllers/<br />
&#8212;&#8212; forms/<br />
&#8212;&#8212; layouts/<br />
&#8212;&#8212; models/<br />
&#8212;&#8212; modules/<br />
&#8212;&#8212; views/<br />
library/<br />
&#8212;&#8212; Zend/<br />
public/<br />
tests /</p>
<p>Como podéis apreciar, a primera vista ya se ve el MVC: controllers, models, views.<br />
Más adelante explico detalladamente el corazón de una aplicación.</p>
<p>En el próximo post de Zend Framework haremos nuestro &#8220;hello world&#8221; ;p</p>
<p><strong>[1] </strong><em>Que si, que también hay y habrá ñapas con el patrón MVC, pero os aseguro que os facilitará la vida a la hora de detectar errores.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/zend-framework-antes-de-empezar.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>La triste involución de un proyecto</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/la-triste-involucion-de-un-proyecto.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/la-triste-involucion-de-un-proyecto.html#comments</comments>
		<pubDate>Thu, 07 Jan 2010 08:30:06 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Cliente]]></category>
		<category><![CDATA[Proyecto]]></category>

		<guid isPermaLink="false">http://www.joanballestermoragues.com/blog/?p=529</guid>
		<description><![CDATA[Involución, fea palabra. Horrorosa. Pero este post va dedicado a ello, a la involución que suele tener un proyecto. Digo suele, pero tampoco hay que ser pesimista, simplemente me gusta más ser duro en mis palabras, aunque sea para esforzarme más en que no suceda&#8230; Sé que en estos tiempos que corren, se vende mucho [...]]]></description>
			<content:encoded><![CDATA[<p>Involución, fea palabra.</p>
<p>Horrorosa.</p>
<p>Pero este post va dedicado a ello, a la involución que suele tener un proyecto. Digo suele, pero tampoco hay que ser pesimista, simplemente me gusta más ser duro en mis palabras, aunque sea para esforzarme más en que no suceda&#8230;</p>
<p>Sé que en estos tiempos que corren, se vende mucho &#8220;humo&#8221; (quien no lo entienda otro día lo explico), y no es muy habitual encontrar empresas de software serias que no intenten venderle la moto al primero que pasa por su lado.</p>
<p>Aún así, vamos a presuponer que un cliente contacta con una empresa de software competente. ¿Qué sucede?</p>
<p>Bien, voy a intentar explicar que es lo que suele pasar, y que hay que evitar, claro&#8230; Lo explicaré desde mi experiencia personal, de lo que veo a diario, de lo que oigo, me cuentan, leo, etcétera, y evidentemente no es el abecedario, ni pretende serlo, simplemente me gusta contar la experiencia, a veces hasta ayuda, otras simplemente te ríes, y algunas otras, pierdes el tiempo por leerme ;-p</p>
<p>En ocasiones lo que sucede es que al inicio hay mucha alegría por parte de la empresa de desarrollo y del cliente, todo es entusiasmo, ilusión en el proyecto que va a salir. Unos pensando en hacer un buen trabajo y los otros pensando en los resultados.</p>
<p>El problema, es cuando la creación se está gestando, y el empresario por X razonas hace cosas tipo&#8230;</p>
<ul>
<li>&#8220;Es que a mí me gustaría más la barra lateral aquí&#8221; (Ya tenemos a míster usabilidad que sabe dónde están mejor las cosas)</li>
<li>&#8220;Es que se lo enseñé a mi tía del pueblo y dice que es muy gris, que no le termina de gustar&#8221; (me gustaría saber que llevaba puesto&#8230; Y no, no va por ahí ;p)</li>
<li>&#8220;Es que creo que deberíamos meter más imágenes&#8221; (vamos, ahora resulta que quieres un flickr)</li>
<li>&#8220;Es que no quiero que salga scroll&#8221; (el scroll te va a matar)</li>
<li>&#8220;Es que en mi pantalla se ve un poco vacío&#8221; (no me extraña, tienes un pedazo pantallón)</li>
<li>Lo contrario&#8230; &#8220;Es que no quiero que salga esta barra (scroll)&#8221; (no me extraña, tienes la resolución a 800&#8230; Ahora explícale que cada persona tiene una diferente)</li>
<li>&#8220;Es que he leído que&#8230;&#8221; (el listo de turno)</li>
</ul>
<p>Aquí ya empezamos el declive, lo que era magnífico y entusiasmaba a ambas partes una de las partes empieza a verle pegas y la otra (tu) empieza a cuestionarse si el proyecto va a salir bien, porque como tengas que hacer todos los cambios que quiere lo que saldrá será un &#8220;myspace&#8221; (fantásticos algunos de ellos&#8230; supongo que sabéis a qué me refiero, <em>la antiweb</em>).</p>
<p>Todo esto, puede suceder por muchas razones:</p>
<ol>
<li><strong>El aburrido.</strong> Se aburre, y quiere &#8220;colaborar&#8221;. Te aseguro que no termina de comprender el significado de &#8220;colaborar&#8221;.</li>
<li><strong>El de &#8220;tengo un amigo que me ha dicho&#8221;</strong>. Tiene el típico amigo que lo sabe todo, le ha enseñado las demos y ha &#8220;opinado&#8221;. Obviamente te vas a tragar su opinión lo quieras o no.</li>
<li><strong>El/Los CEO.</strong> Si es una empresa mediana/grande la has cagado, porque no sólamente tratarás con 1 persona, tratarás con 20 cargos intermedios, y todas ellas pagadas por hacer algo, por tanto, todas querrán opinar. Si, he dicho opinar. Tienen que justificar su trabajo de algún modo, y te aseguro que &#8220;su modo&#8221; es teniendo ideas&#8230; Tómate una tila el día de las reuniones (que habrá, y muchas) porque vas a salir de ellas tirándote de los pelos.</li>
<li><strong>Don amigos.</strong> Si es una empresa pequeña, tendrá muchos amigos &#8220;que saben del tema&#8221;, y cada 5 minutos lo enseñará a alguien, y cada 10, te llamará por teléfono. &#8220;¿Te acuerdas la barra de la derecha? Es que mehan dicho que&#8230;&#8221;. En este caso harás pocas reuniones, en lugar de ello te llamará cuando y como quiera, eres su esclavo, esto es así. (No sé que es peor)</li>
<li><strong>Culo veo, culo quiero.</strong> Danger&#8230; Este es especialmente difícil, porque se dedica 8 horas al día a mirar webs, especialmente competencias directas, y entonces viene y te dice, quiero que sea más una mezcla entre facebook y flikr, pero que sea muy rápida y fácil, tipo google. (Luego le dices el precio y el tiempo que necesitas y tienes que recojer sus ojos del suelo, porque se le salen de las órbitas&#8230;)</li>
<li><strong>El indeciso.</strong> ¡Cuidado! Este especímen realmente te hará trabajar mucho. Nunca le hagas caso a la primera, madura su idea, habla con el 20 veces antes de cambiar nada, nunca hagas nada a la primera, en serio&#8230; Cúidate de este o te retirarás en unos meses del negocio.</li>
<li><strong>El &#8220;Ya que&#8221;.</strong> Otro peligroso. &#8220;Ya que dijimos que haríamos un buscador en esta página, porque no ponemos tal, tal, tal&#8230;&#8221;. &#8220;Ya que dijimos de cambiar de lado este botón, porque no ponemos 20 más que hagan tal y tal y tal&#8221;. Nunca, nunca, nunca, pero nunca digas delante de esta persona que algo es fácil, o que algo te va a llevar poco tiempo en hacerlo, porque a partir de ahí vas a oír &#8220;ya que&#8221; miles de veces&#8230;</li>
<li><strong>El yo no sé que quiero, pero esto no.</strong> Uf&#8230; He llegado a oír cosas increíbles. Una de las últimas ha sido un (literal) &#8220;Es que tiene que ser un banner pero sin serlo&#8221;. Apaga el ordenador y vete a dormir, en serio&#8230; Porque no vas a entender lo que quiere ni hoy ni mañana. ¿Por qué? Porque no lo sabe ni el. Esta persona jamás te dará argumentos, simplemente verá lo que le has preparado y dirá&#8230; &#8220;Uhmmm, no termina de ser lo que quiero&#8221;&#8230; Pero, ¿Qué quieres? No lo sabe, pero esto no xD</li>
</ol>
<p>En fin&#8230; De todos los colores y sabores, un par de consejillos:</p>
<ul>
<li>Dejad siempre claro quien es el que sabe del tema, no irá al cirujano a decirle, mueva el bisturí más a la izquierda, es que me han dicho que&#8230;</li>
<li>Dejad claro que su empresa, es su empresa, no es la del vecino. No facturan lo que factura Amazon, ni pagarán lo mismo por su sistema. Por tanto, que no quieran ser Amazon.</li>
<li>No le déis nada a probar si no está realmente probado por vosotros y aprobado (y firmado) que tiene que ser así, porque trabajaréis doble, triple&#8230;</li>
<li>Si hace propuetas, jamás digás &#8220;vale&#8221;, discutidlas, pensadlas, no digas que si, vete a tu casa y valóralo, luego en la siguiente reunión/email/tfn/wave/loquesea le dices lo que piensas</li>
<li>No actúes en caliente. Nunca.</li>
<li>Si utilizáis trac (o cualquier sistema de tiquets) enseñadle bien qué se pone y porque. O encontraréis cosas del tipo &#8220;Incidencia, la cabecera no me gusta&#8221;.</li>
<li>Todo es complicado, pero tu sabes hacerlo. Nunca menciones que algo es fácil. El interpretará que estás a su merced, y que es igual de fácil cambiar un color que hacer una funcionalidad entera. Todo se valora, Todo se estima en horas, si no lo haces así vas a entrar en una espiral muy fea.</li>
<li>Advertidle que la web es para los usuarios que la van a visitar, no es su jueguete en el que pone el color morado porque le gusta ese color&#8230; No. Cuando lo que el quiere es vender más, la web tiene que gustar al cliente potencial, no a el (este punto a veces es verdaderamente complicado explicarlo).</li>
</ul>
<p>Seguiría horas y horas, pero tampoco es plan&#8230; Creo que se capta bien así.</p>
<p>En fín, ¡otro día sigo!</p>
<p>Saludos, y ¡feliz año!</p>
<p><!-- RSS:IMPORT:0k5d21o93q3cnn8ydtu1xaguqhoysq6bopnmd1qx --></p>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/la-triste-involucion-de-un-proyecto.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>¿Cómo crear Widgets para WordPress?</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/como-crear-widgets-para-wordpress.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/como-crear-widgets-para-wordpress.html#comments</comments>
		<pubDate>Tue, 27 Oct 2009 09:00:49 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Widget]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.joanballestermoragues.com/blog/?p=491</guid>
		<description><![CDATA[Vayamos por partes (como dijo Jack El Destripador :-)) ¿Qué es un Widget?: Pequeña aplicación o programa, usualmente presentado en archivos o ficheros pequeños que son ejecutados por un motor de widgets o Widget Engine. Entre sus objetivos están los de dar fácil acceso a funciones frecuentemente usadas y proveer de información visual. WordPress: ¿Todavía [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-493" style="margin: 0pt 10px 5px 0pt; width: 140px; height: auto; float: left;" title="wordpress" src="http://www.joanballestermoragues.com/blog/wp-content/uploads/wordpress-400x400.jpg" alt="wordpress" width="400" height="400" /></p>
<p>Vayamos por partes (como dijo Jack El Destripador :-))</p>
<p><a href="http://es.wikipedia.org/wiki/Widget" target="_blank">¿Qué es un Widget?</a>: Pequeña aplicación o programa, usualmente presentado en archivos o ficheros pequeños que son ejecutados por un motor de widgets o Widget Engine. Entre sus objetivos están los de dar fácil acceso a funciones frecuentemente usadas y proveer de información visual.</p>
<p><a href="http://wordpress.org/" target="_blank">WordPress</a>: ¿Todavía alguien no sabe qué es WordPress? Es un sistema de gestión de contenido enfocado a la creación de blogs (sitios web periódicamente actualizados).</p>
<p>Como todos sabéis, su desarrollo se basa principalmente en PHP y MySQL, vayamos pues a montar un widget.</p>
<p>Atención a este Widget para WordPress:</p>
<pre>/*
Plugin Name: Test Plugin
Plugin URI: http://www.widgetifyr.com
Description: Test Plugin
Author: widgetifyr.com
Version: 0.01
Author URI: http://www.widgetifyr.com

*/

// We're putting the plugin's functions inside the init function to ensure the
// required Sidebar Widget functions are available.

  function widget_test_init()
	  {
	  /* Your custom code starts here */
	  /* ---------------------------- */

	  /* Your Function */
	  function test()
	  {

		  /* Your Code ----------------- */ 

		  echo 'hello world';

		  /* End of Your Code ---------- */

	  }

	  /* -------------------------- */
	  /* Your custom code ends here */

	  function widget_test($args)
	  {

	  	  // Collect our widget's options, or define their defaults.
		  $options = get_option('widget_test');
		  $title = empty($options['title']) ? __('test') : $options['title'];

		  extract($args);
		  echo $before_widget;
		  echo $before_title;
		  echo $title;
		  echo $after_title;
		  test();
		  echo $after_widget;
	  }  

	  // This is the function that outputs the form to let users edit
	  // the widget's title. It's an optional feature, but were're doing
	  // it all for you so why not!

	  function widget_test_control()
	  {

		// Collect our widget options.
		$options = $newoptions = get_option('widget_test');

		// This is for handing the control form submission.
		if ( $_POST['widget_test-submit'] )
		{
			// Clean up control form submission options
			$newoptions['title'] = strip_tags(stripslashes($_POST['widget_test-title']));
		}

		// If original widget options do not match control form
		// submission options, update them.
		if ( $options != $newoptions )
		{
			$options = $newoptions;
			update_option('widget_test', $options);
		}

		$title = attribute_escape($options['title']);

		echo '
		&lt;label for="test-title"&gt;';
		echo 'Title: &lt;input id="widget_test-title" style="width: 250px;" name="widget_test-title" type="text" value="';
		echo $title;
		echo '" /&gt;';
		echo '
		';
		echo '&lt;input id="widget_test-submit" name="widget_test-submit" type="hidden" value="1" /&gt;';
	  }

	// This registers the widget.
    register_sidebar_widget('test', 'widget_test');

	// This registers the (optional!) widget control form.
    register_widget_control('test', 'widget_test_control');

  }

  add_action('plugins_loaded', 'widget_test_init');</pre>
<p>?&gt;</p>
<p>Interesante, ¿verdad?</p>
<p>Ahora me vendrá alguien y dirá&#8230; ¡pero si eso sólamente hace un &#8220;Hello world&#8221;!</p>
<p>Cierto.</p>
<p>Hace unos días estuve ojeando <a href="http://widgetifyr.com" target="_blank">http://widgetifyr.com</a>, en esta web nos ayudan a generar Widgets a partir de código nuestro. No está nada mal, hice un par de cosillas y funcionaron bastante bien. Sin duda ahorras algo de tiempo :-)</p>
<p>Os animo a montar los vuestros, yo llevo unos días montando algunos (ahora los estoy testeando) y es bastante interesante.</p>
<p>Espero que os sirva la URL de referencia :-)</p>
<p><!-- RSS:IMPORT:0k5d21o93q3cnn8ydtu1xaguqhoysq6bopnmd1qx --></p>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/como-crear-widgets-para-wordpress.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Productividad, ¿cuándo y cómo eres más productivo?</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/productividad-cuando-y-como-eres-mas-productivo.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/productividad-cuando-y-como-eres-mas-productivo.html#comments</comments>
		<pubDate>Fri, 16 Oct 2009 10:00:29 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Música]]></category>
		<category><![CDATA[Productividad]]></category>

		<guid isPermaLink="false">http://www.joanballestermoragues.com/blog/?p=377</guid>
		<description><![CDATA[Este es un tema que siempre preocupa, o al menos a mí siempre me ha preocupado. Intentar que si estás trabajando 2 horas, sean 2 horas productivas a veces no es tarea sencilla&#8230;Os contaré &#8220;mi secreto&#8221;, y vosotros el vuestro, claro. Aquí no damos nada gratis! ;-) Antes que nada, todo esto es personal, es [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-378" title="engranajes" src="http://www.joanballestermoragues.com/blog/wp-content/uploads/engranajes.jpg" alt="engranajes" width="450" height="267" style="margin: 0pt 25px 5px 0pt; position: relative; float: left; width: 180px; height: auto;" />Este es un tema que siempre preocupa, o al menos a mí siempre me ha preocupado. Intentar que si estás trabajando 2 horas, sean 2 horas productivas a veces no es tarea sencilla&#8230;Os contaré &#8220;mi secreto&#8221;, y vosotros el vuestro, claro. Aquí no damos nada gratis! ;-)</p>
<p>Antes que nada, todo esto es personal, es &#8220;my way&#8221;, que como siempre, no tiene porque coincidir nadie, es más, espero que nadie coincida, porque si alguien lo hace tiene un grave y serio problema ;-</p>
<p><strong>Horas</strong></p>
<p>Durante el día tengo &#8220;rachas&#8221; de productividad, y poco a poco me voy dando cuenta de qué me funciona, y cuándo me funciona.</p>
<p>Tengo una franja de unas 4 horas por la mañana, sobretodo cuando estoy en la oficina (algunos días trabajo desde casa, en función de n parámetros que un día ya contaré), digamos que de 9 a 13 soy absolutamente productivo, mis dedos van solos, jeje, antes de eso me informo de qué ha pasado el día anterior vía Google Reader y etiqueto las noticias que me interesa seguir luego más detenidamente y los enlaces que creo convenientes los meto en <a href="http://www.delicious.com/joanballester" target="_blank">mi delicious</a>.</p>
<p>Otra cosa que me activa, es <a href="http://www.twitter.com/joanballester" target="_blank">mi twitter</a>, normalmente me marco con el iphone unas franjas de trabajo, por ejemplo 30/5, así me suena una alarma cada 30 minutos, y me obligo a tener 5 minutos de twitter, links, beber agua, etc&#8230; Estos 30/5 pueden ir variando en función de tí mismo, claro.</p>
<p>Por la tarde también tengo mi racha buena, pero cuando realmente rindo, y no puedo evitarlo, es por la noche, no sé que pasa que cuando dan las 22.00 (aprox) y hasta las 3, 4, 5, 6, 7&#8230; Rindo triple por hora, es algo increíble y sorprendente la cantidad de código que puedo crear a esas horas.</p>
<p><strong>Ayudas Externas</strong></p>
<p>Como menciono arriba, hay cosas que necesito como el agua para poder programar tranquilo. Necesito estar conectado para motivarme, ver cosas, ver enlaces, posts interesantes sobre las cosas en las que trabajo, comentarios&#8230; Y para ello es imprescindible mi Google Reader, mi Twitter y sobretodo Delicious. Delicious es una fuente enorme de información para mí, y la reviso a diario muchas veces (me encanta su sistema de tags :-))</p>
<p><strong>Música</strong></p>
<p>El 90% de tiempo que estoy trabajando tengo música puesta. En la oficina hay un subwoofer para escuchar bien los bajos (soy bajista, faltaría más xD) y en casa cascos, qué remedio&#8230;</p>
<p>Os pongo unos grupos así a bote pronto, normalmente los divido por intensidades, en función de lo que tengo que hacer&#8230; Si tengo que picar como un cabrón o tengo que pensar más.</p>
<p>Muse, Interpol, Incubus, Coldplay, a perfect circle, tool, Radiohead, U2, The cure, Vetusta morla, Queen.</p>
<p><strong>Bebida</strong></p>
<p>No puede faltar cola light con hielo al lado del ordenador, en su defecto una botella de agua, pero necesito hidratarme cada X tiempo, y para evitar &#8220;paseítos&#8221;, lo mejor es tenerlo a mano nada más empezar.</p>
<p><strong>En referencia al título, y resumiendo, ¿Cuándo y cómo eres más productivo?</strong></p>
<p>De noche, con música y marcándome intervalos de unos 50/10 (50 de programación de 1 tarea concreta y 10 de descanso obligado de esa tarea concreta).</p>
<p>¿Y tú qué? ¿Cómo te lo montas?</p>
<p><!-- RSS:IMPORT:0k5d21o93q3cnn8ydtu1xaguqhoysq6bopnmd1qx --></p>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/productividad-cuando-y-como-eres-mas-productivo.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Internet y el I+D+I</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/internet-y-el-i-d-i.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/internet-y-el-i-d-i.html#comments</comments>
		<pubDate>Thu, 15 Oct 2009 10:00:06 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Innovar]]></category>

		<guid isPermaLink="false">http://www.joanballestermoragues.com/blog/?p=370</guid>
		<description><![CDATA[¿Qué me decís del I+D o del I+D+I? ¿Realmente existe, o es una leyenda urbana? I+D = Investigación + Desarrollo I+D+I = Investigación + Desarrollo + Innovación tecnológica Investigación = búsqueda intencionada de conocimientos o de soluciones a problemas de carácter científico. También existe la investigación tecnológica, que es la utilización del conocimiento científico para [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-390" style="margin: 0pt 25px 5px 0pt; position: relative; float: left; width: 150px; height: auto;" title="idi" src="http://www.joanballestermoragues.com/blog/wp-content/uploads/idi.jpg" alt="idi" width="525" height="280" />¿Qué me decís del I+D o del I+D+I? ¿Realmente existe, o es una leyenda urbana?</p>
<ul>
<li><strong>I+D</strong> = Investigación + Desarrollo</li>
<li><strong>I+D+I</strong> = Investigación + Desarrollo + Innovación tecnológica</li>
<li><strong>Investigación</strong> = búsqueda intencionada de conocimientos o de soluciones a problemas de carácter científico. También existe la investigación tecnológica, que es la utilización del conocimiento científico para el desarrollo de &#8220;Tecnologías blandas o duras&#8221;.</li>
<li><strong>Desarrollo</strong> = La que me parece más acertada para el caso: Llevar a cabo, realizar una idea, proyecto&#8230;</li>
<li><strong>Innovación</strong> = aplicación de nuevas ideas, conceptos, productos, servicios y prácticas, con la intención de ser útiles para el incremento de la productividad. Un elemento esencial de la innovación es su aplicación exitosa de forma comercial. No solo hay que inventar algo, sino, por ejemplo, introducirlo en el mercado para que la gente pueda disfrutar de ello.</li>
</ul>
<p>Lo que veo actualmente, es que se menciona demasiado la frase &#8220;es que eso ya está hecho&#8221;, es que &#8220;todo está pensado&#8221;, &#8220;no se puede sorprender&#8221;, etc&#8230; No sé muy bien la solución de todo esto, es decir, este no es un post para solucionar nada (o intenar hacerlo), simplemente es una reflexión a casos con los que me encuentro a diario.</p>
<p>Proyectos como <a href="http://www.soopbook.com" target="_blank">SoopBook</a>, por ejemplo, me parecen sorprendentemente innovadores (suerte chicos ;-)).</p>
<p>Creo que también se puede obtener cierta innovación completando otros proyectos, o complementándolos. Día a día nacen nuevas herramientas, webs, servicios, y quizá alguno de los que se utiliza normalmente se está quedando algo desfasado, o no avance lo rápido que avanza la tecnología, por tanto&#8230; me sigue pareciendo innovador &#8220;resucitar&#8221; algunos servicios añadiendo algo actual, haciéndolos más &#8220;usables&#8221;, etcétera&#8230;</p>
<p>De hecho, esto sucede mucho en internet, y normalmente se le tacha de &#8220;copia&#8221;. No niego que muchas veces es una copia burda, con algún añadido evidente, pero no me refería estos casos en mi anterior párrafo.</p>
<p>En fín&#8230; que parece que se nos han &#8220;secado&#8221; las ideas a los desarrolladores, y que existiendo google, facebook, etcétera&#8230; se nos agotaron las ideas! ¿Por qué? ¿Porque todo está hecho? Venga ya! ;p</p>
<p>PS: Oh&#8230; se me olvidaba, ahora con google wave tendremos ocupadas otro tiempo las mentes para integrar websites con wave&#8230; como este último tiempo con Facebook ;pppp</p>
<p>Ánimo chic@s ;-)</p>
<p><!-- RSS:IMPORT:0k5d21o93q3cnn8ydtu1xaguqhoysq6bopnmd1qx --></p>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/internet-y-el-i-d-i.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Los huevos de pascua no son lo que eran</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/los-huevos-de-pascua-no-son-lo-que-eran.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/los-huevos-de-pascua-no-son-lo-que-eran.html#comments</comments>
		<pubDate>Tue, 13 Oct 2009 10:00:07 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Huevo de pascua]]></category>
		<category><![CDATA[Yahoo!]]></category>

		<guid isPermaLink="false">http://www.joanballestermoragues.com/blog/?p=351</guid>
		<description><![CDATA[Pues no, el concepto de huevo de pascua ha cambiado :-) Desde la wikipedia: &#8220;Un huevo de pascua virtual es un mensaje oculto, o una capacidad escondida, contenido en un objeto, como una película, un disco compacto, DVD, programa informático, o videojuego [...]el videojuego de Atari: Adventure de 1978, contenía el primer huevo de pascua [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-357" style="margin: 0pt 25px 5px 0pt; position: relative; float: left; width: 100px; height: auto;" title="huevo_de_pascua12" src="http://www.joanballestermoragues.com/blog/wp-content/uploads/huevo_de_pascua12.jpg" alt="huevo_de_pascua12" width="300" height="315" />Pues no, el concepto de huevo de pascua ha cambiado :-)</p>
<p>Desde la <a href="http://es.wikipedia.org/wiki/Huevo_de_pascua_(virtual)" target="_blank">wikipedia</a>: &#8220;<em>Un huevo de pascua virtual es un mensaje oculto, o una capacidad escondida, contenido en un objeto, como una película, un disco compacto, DVD, programa informático, o videojuego [...]el videojuego de Atari: Adventure de 1978, contenía el primer huevo de pascua virtual que se conoce [...] Entre los programadores, parece haber una motivación en dejar una marca personal, casi un toque artístico sobre un producto intelectual, el cual es por naturaleza estándar y funcional.[...]</em>&#8221;</p>
<p><img class="alignnone size-full wp-image-359" style="margin: 0pt 25px 5px 0pt; position: relative; float: left; width: 100px; height: auto;" title="google_reader_enlarged" src="http://www.joanballestermoragues.com/blog/wp-content/uploads/google_reader_enlarged.gif" alt="google_reader_enlarged" width="200" height="150" />En Google Reader tenemos un huevo de pascua muy interesante, y divertido :-)</p>
<p>El NINJA!!!! jajaja</p>
<p>Entrad en vuestro GReader y teclead:</p>
<p>arriba, arriba, abajo, abajo, izquierda, derecha, izquierda, derecha, b, a</p>
<p><img class="alignnone size-full wp-image-352" style="margin: 0pt 25px 5px 0pt; position: relative; float: left; width: 100px; height: auto;" title="logo_plain" src="http://www.joanballestermoragues.com/blog/wp-content/uploads/logo_plain.png" alt="logo_plain" width="276" height="110" />Abrid la página de <a href="http://www.google.es" target="_blank">google</a>, teclead este listado en la caja de búsqueda y presionad &#8220;Voy a tener suerte&#8221; ;-)</p>
<ul>
<li>Mecánico serio y fiable</li>
<li>Un aparcamiento</li>
<li>Trabajo digno con un sueldo decente</li>
<li>Vivienda a precio razonable</li>
<li>Encontrar a Wally</li>
<li>Candidato convincente</li>
<li>Encontrar a Bin Laden</li>
<li>Una razón para esta barbarie</li>
<li>Responsables del desastre del Prestige</li>
<li>Armas de destrucción masiva</li>
</ul>
<p><img class="alignnone size-full wp-image-353" style="margin: 0pt 25px 5px 0pt; position: relative; float: left; width: 100px; height: auto;" title="yahoo_logo_es_061509" src="http://www.joanballestermoragues.com/blog/wp-content/uploads/yahoo_logo_es_061509.png" alt="yahoo_logo_es_061509" width="202" height="50" />En <a href="http://yahoo.com" target="_blank">yahoo!</a> parece que han quitado su huevo de pascua</p>
<p>Hasta hace &#8220;relativamente&#8221; poco, al clickar sobre el punto de la exclamación, salía un sonido.</p>
<p>Era interesante :-)</p>
<p><img class="alignnone size-full wp-image-344" style="margin: 0pt 25px 5px 0pt; position: relative; float: left; width: 100px; height: auto;" title="1197058039896debian2dn" src="http://www.joanballestermoragues.com/blog/wp-content/uploads/1197058039896debian2dn.jpg" alt="1197058039896debian2dn" width="350" height="467" /> Si disponéis de una <a href="http://www.debian.org" target="_blank">Debian</a> o de <a href="http://www.ubuntu.com" target="_blank">Ubuntu</a>, podéis abrir la shell y teclear:&#8221;apt-get moo&#8221; si no, os digo lo que sale, aunque &#8220;spoileo a quién lo tenga ;p</p>
<p>[02:31:38] embat@~ &gt; apt-get moo<br />
(__)<br />
(oo)<br />
/&#8212;&#8212;/<br />
/ |    ||<br />
*  /&#8212;/<br />
~~   ~~<br />
&#8230;.&#8221;Have you mooed today?&#8221;&#8230;</p>
<p>Vamos&#8230; una vaca! :D</p>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/los-huevos-de-pascua-no-son-lo-que-eran.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Symfony minuto 0: Empezando</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/symfony-minuto-0-empezando.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/symfony-minuto-0-empezando.html#comments</comments>
		<pubDate>Wed, 02 Sep 2009 15:07:51 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.joanballestermoragues.com/blog/?p=318</guid>
		<description><![CDATA[Gracias a @mariotux y a su blog pensandoenred.com, me entró el gusanillo de probar symfony. Pero de probarlo de verdad, ya que a veces hacemos incursiones con algún framework pero no llegamos a investigar como funciona realmente, ni porque. Por tanto a partir de esta noche, voy a empezar a investigar sus entrañas y practicar [...]]]></description>
			<content:encoded><![CDATA[<p>Gracias a <a href="http://www.twitter.com/mariotux" target="_blank">@mariotux</a> y a su blog <a href="http://www.pensandoenred.com/" target="_blank">pensandoenred.com</a>, me entró el gusanillo de probar <a href="http://www.symfony-project.org/" target="_blank">symfony</a>. Pero de probarlo de verdad, ya que a veces hacemos incursiones con algún <a href="http://es.wikipedia.org/wiki/Framework" target="_blank">framework</a> pero no llegamos a investigar como funciona realmente, ni porque.</p>
<p>Por tanto a partir de esta noche, voy a empezar a investigar sus entrañas y practicar un poco con este framework (<a href="http://es.wikipedia.org/wiki/Symfony" target="_blank">symfony</a>).</p>
<p><img class="alignnone size-full wp-image-319" title="jobeet_pmn" src="http://www.joanballestermoragues.com/blog/wp-content/uploads/jobeet_pmn.jpg" alt="jobeet_pmn" width="188" height="260" /></p>
<p>De primeras hay muchos frameworks, y en realidad, si te pones a leer sus descripciones todos hacen lo mismo, o quieren hacerlo. Supongo que las diferencias entre ellos estriban en:</p>
<ul>
<li>Facilidad de aprendizaje</li>
<li>Rapidez de uso</li>
<li>Modularidad para meter otros componentes</li>
<li>Rendimientos en el servidor</li>
</ul>
<p>Como siempre, sólamente puedes opinar &#8220;desde dentro&#8221;, es decir, sabiendo de verdad como actúa, y en resumen, eso haremos, investigarlo desde dentro :)</p>
<p>Os iré informando, a medida que vaya terminando los pasos del tutorial miraré de montar un post con las dificultades o facilidades que me he ido encontrando.</p>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/symfony-minuto-0-empezando.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Patrones de diseño creacionales: Singleton</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/patrones-de-diseno-creacionales-singleton.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/patrones-de-diseno-creacionales-singleton.html#comments</comments>
		<pubDate>Sun, 26 Jul 2009 02:28:11 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Patrones OO]]></category>

		<guid isPermaLink="false">http://www.joanballestermoragues.com/blog/?p=254</guid>
		<description><![CDATA[Singleton (o instancia única) está diseñado para restringir la creación de objetos que pertenecen a una clase. Intentando que una clase tenga solo 1 instancia y proporcionando un punto de acceso global a ella. Este patrón realmente es bastante sencillo, y sería fácil imaginar situaciones. Evidentemente, habrá que vigilar si el programa crea hilos de [...]]]></description>
			<content:encoded><![CDATA[<p>Singleton (o instancia única) está diseñado para restringir la creación de objetos que pertenecen a una clase. Intentando que una clase tenga solo 1 instancia y proporcionando un punto de acceso global a ella.</p>
<p>Este patrón realmente es bastante sencillo, y sería fácil imaginar situaciones.</p>
<p>Evidentemente, habrá que vigilar si el programa crea hilos de ejecución, ya que sólo uno de los hilos logrará crear el objeto&#8230;</p>
<p>Vamos con un ejemplo sencillito en php (5):</p>
<p>&lt;?php
<pre>
class Ejemplo
{
    private static $instance;
    // privado, para prevenir la creacion de objetos via "new"
    private function __construct()
    {
        echo 'Soy el constructor';
    } 

    public static function singleton()
    {
        // Se chequea que no haya instancia del objeto antes
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }

        return self::$instance;
    }

    // Clone no permitido
    public function __clone()
    {
        trigger_error('Clone no se permite.', E_USER_ERROR);
    }

}</pre>
<p>?&gt;</p>
<p>Voy a construir una aplicación, probablemente en php o en Java, utilizando unos u otros, y también montaré los UML&#8217;s antes de ponerme a ello, así podemos ir comprobando los caminos y buscar los patrones más óptimos.</p>
<p>Saludos, sed felices ^^</p>
<p><strong>Actualización para aclarar un comentario de JuanSa</strong> (<a href="http://www.twitter.com/savermsx">su twitter</a>):</p>
<p>Algunos ejemplos donde el singleton sería una opción:</p>
<ul>
<li>Clases Login: Son implementadas como singletons, y proporcionan un registro de punto de acceso global sin que sea necesario crear un objeto cada vez que se lleva a cabo.</li>
<li>Configuración de Clases: Para diseñar las clases que proporcionan los ajustes de configuración de na aplicación. No sólo proporcionan un punto de acceso global, ya que también mantienen la instancia como un objeto de caché. </li>
<li>Acceso a recursos compartidos: Si necesitas trabajar con el puerto serie puedes limitarlo con el singleton.</li>
<li>Y para mí, el que está claro es el de la Factoría aplicando Singletons: Si diseñas una aplicación con una factoría (los 2 siguientes posts serán para factoría) para generar nuevos objetos, con sus identificaciones, en un entorno multihilo&#8230; Podrías utilizar el singleton para no superponer identificadores para 2 objetos distintos. (Pero lo vemos más adelante, eso sí, para mí es el momento más claro de utilizar el Singleton</li>
</ul>
<p>Sed felices!</p>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/patrones-de-diseno-creacionales-singleton.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Clasificación de los patrones de diseño en el software orientado a objetos</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/clasificacion-de-los-patrones-de-diseno-en-el-software-orientado-a-objetos.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/clasificacion-de-los-patrones-de-diseno-en-el-software-orientado-a-objetos.html#comments</comments>
		<pubDate>Sun, 26 Jul 2009 01:33:20 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Patrones OO]]></category>

		<guid isPermaLink="false">http://www.joanballestermoragues.com/blog/?p=246</guid>
		<description><![CDATA[Después de los 5 principios anteriores (LSP, SRP, ISP, DIP, OCP), me toca hacerlo del desto de patrones de diseño. Empezaremos viendo las clasificaciones y luego nos ponemos manos a la obra: Clasificación de los patrones (los que iré posteando, claro): Creacional (Object Pool Pattern, Prototype Pattern, Factory Method Pattern, Builder Pattern, Factory Pattern, Abstract [...]]]></description>
			<content:encoded><![CDATA[<p>Después de los 5 principios anteriores (<a href="http://www.joanballestermoragues.com/blog/analisis-sistemas/patrones-de-diseno-lsp.html">LSP</a>, <a href="http://www.joanballestermoragues.com/blog/analisis-sistemas/patrones-de-diseno-srp.html">SRP</a>, <a href="http://www.joanballestermoragues.com/blog/analisis-sistemas/patrones-de-diseno-isp.html">ISP</a>, <a href="http://www.joanballestermoragues.com/blog/analisis-sistemas/patrones-de-diseno-dip.html">DIP</a>, <a href="http://www.joanballestermoragues.com/blog/analisis-sistemas/patrones-de-diseno-ocp.html">OCP</a>), me toca hacerlo del desto de patrones de diseño.<br />
Empezaremos viendo las clasificaciones y luego nos ponemos manos a la obra:</p>
<p>Clasificación de los patrones (los que iré posteando, claro):</p>
<ul>
<li>Creacional (Object Pool Pattern, Prototype Pattern, Factory Method Pattern, Builder Pattern, Factory Pattern, Abstract Factory Pattern, Singleton Pattern)</li>
<li>Estructural (Adapter, Bridge, Composite, Decorator, Flyweight, Memento, Proxy)</li>
<li>de Comportamiento (Chain of Responsibility, Command, Interpreter, Iterator, Mediator, Observer, Strategy, Template Method, Visitor, Null Object)</li>
</ul>
<p>Bien, manos a la obra, intentaré ir uno a uno ^^</p>
<p>Nos vemos en los siguientes posts :)</p>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/clasificacion-de-los-patrones-de-diseno-en-el-software-orientado-a-objetos.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Patrones de diseño: LSP</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/patrones-de-diseno-lsp.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/patrones-de-diseno-lsp.html#comments</comments>
		<pubDate>Tue, 21 Jul 2009 08:09:32 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Patrones OO]]></category>

		<guid isPermaLink="false">http://www.joanballestermoragues.com/blog/?p=240</guid>
		<description><![CDATA[Vamos con LSP: Liskov Substitution Principle (Principio de Sustitución de Liskov) ¿En qué se basa este principio? He encontrado un par de frases que nos podrían servir como definición: &#8220;Las funciones que usan punteros o referencias a clases base deben ser capaces de utilizar objetos de las clases derivadas sin tener conocimiento de ello&#8221; (Martin96b), [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Vamos con LSP</strong>:</p>
<p>Liskov Substitution Principle (Principio de Sustitución de Liskov) </p>
<p>¿En qué se basa este principio?</p>
<p>He encontrado un par de frases que nos podrían servir como definición:</p>
<p>&#8220;Las funciones que usan punteros o referencias a clases base deben ser capaces de utilizar objetos de las clases derivadas sin tener conocimiento de ello&#8221; (Martin96b), también: &#8220;Las clases derivadas deben ser utilizables a través de la interfaz de la clase base, sin necesidad de que el usuario conozca la diferencia&#8221;</p>
<p>Y Liskov, dijo la que para mí es la más entendible: &#8220;Debe ser posible utilizar cualquier objeto instancia de una subclase en lugar de cualquier objeto instancia de su superclase sin que la semántica del programa escrito en los términos de la superclase se vea afectado&#8221; :)</p>
<p>Como siempre, con los ejemplos es como se ve más claro:</p>
<pre>// cuando deja de cumplirse este principio, se hace más evidente
public class Figura
{
// ...
public void dibujar()
{
if (this instanceof Poligono) dibujarPoligono();
else if (this instanceof Circulo) dibujarCirculo();
}
}</pre>
<p>El error es más que evidente. dibujar() viola el principio de sustitución de Liskov, si quisiéramos trabajar con una elipse, por ejemplo, ¿cómo lo haríamos? (FAIL) (Además, si os fijáis también se viola el OCP)</p>
<p>La solución: Polimorfismo. (cada tipo de figura se encargará de implementar dibujar())</p>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/patrones-de-diseno-lsp.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Patrones de diseño: SRP</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/patrones-de-diseno-srp.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/patrones-de-diseno-srp.html#comments</comments>
		<pubDate>Mon, 20 Jul 2009 16:36:00 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Patrones OO]]></category>

		<guid isPermaLink="false">http://www.joanballestermoragues.com/blog/?p=238</guid>
		<description><![CDATA[Vamos con SRP: Single Responsibility Principle (Principio de Responsabilidad Única) Como frase, nos quedaremos con esta: Una clase debe tener una única razón para cambiar. Asumamos que necesitamos un objeto que guarde un email. Utilizaremos la interface IEmail del ejemplo. A primera vista todo funciona. Pero podemos ver como IEmail y Email tienen 2 razones [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Vamos con SRP</strong>:</p>
<p>Single Responsibility Principle (Principio de Responsabilidad Única)</p>
<p>Como frase, nos quedaremos con esta: Una clase debe tener una única razón para cambiar.</p>
<p>Asumamos que necesitamos un objeto que guarde un email. Utilizaremos la interface IEmail del ejemplo.<br />
A primera vista todo funciona. Pero podemos ver como IEmail y Email tienen 2 razones para cambiar.</p>
<p>Si guardamos una clase, cada cambio de responsabilidad afectará a la otra.</p>
<pre>// SRP - Mal ejemplo

interface IEmail {
	public void setSender(String sender);
	public void setReceiver(String receiver);
	public void setContent(String content);
}

class Email implements IEmail {
	public void setSender(String sender) {// set sender; }
	public void setReceiver(String receiver) {// set receiver; }
	public void setContent(String content) {// set content; }
}</pre>
<p>Podemos crear una nueva interface IContent y Content para repartir las responsabilidades.</p>
<pre>// SRP - Buen ejemplo
interface IEmail {
	public void setSender(String sender);
	public void setReceiver(String receiver);
	public void setContent(IContent content);
}

interface Content {
	public String getAsString(); // used for serialization
}

class Email implements IEmail {
	public void setSender(String sender) {// set sender; }
	public void setReceiver(String receiver) {// set receiver; }
	public void setContent(IContent content) {// set content; }
}
</pre>
<p><strong>Conclusión</strong>:</p>
<p>El SRP representa una buena forma de identificar clases durante la fase de diseño de una aplicación, y nos recuerda pensar en todas las vías en las que una clase puede evolucionar. Se necesita una buena separación de responsabilidades.</p>
<pre></pre>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/patrones-de-diseno-srp.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Patrones de diseño: ISP</title>
		<link>http://joanballestermoragues.com/programacion-desarrollo/patrones-de-diseno-isp.html</link>
		<comments>http://joanballestermoragues.com/programacion-desarrollo/patrones-de-diseno-isp.html#comments</comments>
		<pubDate>Mon, 20 Jul 2009 16:20:16 +0000</pubDate>
		<dc:creator>joanballester</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Patrones OO]]></category>

		<guid isPermaLink="false">http://www.joanballestermoragues.com/blog/?p=236</guid>
		<description><![CDATA[Vamos con ISP: Interface Segregation Principle (Principio de Segregación de Interfaces) Este ejemplo viola el principio ISP, tenemos una clase Manager que representa la persona que dirije a los trabajadores. Y tenemos 2 tipos de trabajadores, algunos muy eficientes. Ambos tipos necesitan un break para comer. Ahora, también hay algunos robots y éstos no necesitan [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Vamos con ISP</strong>:<br />
Interface Segregation Principle (Principio de Segregación de Interfaces)</p>
<p>Este ejemplo viola el principio ISP, tenemos una clase Manager que representa la persona que dirije a los trabajadores. Y tenemos 2 tipos de trabajadores, algunos muy eficientes. Ambos tipos necesitan un break para comer. Ahora, también hay algunos robots y éstos no necesitan comer.<br />
Si conservamos el diseño, la clase robots se ve forzada a implementar el método eat().</p>
<pre>// ISP - Mal ejemplo
interface IWorker {
	public void work();
	public void eat();
}

class Worker implements IWorker{
	public void work() {
		// ....working
	}
	public void eat() {
		// ...... eating in launch break
	}
}

class SuperWorker implements IWorker{
	public void work() {
		//.... working much more
	}

	public void eat() {
		//.... eating in launch break
	}
}

class Manager {
	IWorker worker;

	public void setWorker(IWorker w) {
		worker=w;
	}

	public void manage() {
		worker.work();
	}
}
</pre>
<p>A continuación tenemos el código siguiendo ISP. La interface IWorker la dividimos en 2.</p>
<pre>// ISP - Correcto
interface IWorker extends Feedable, Workable {
}

interface IWorkable {
	public void work();
}

interface IFeedable{
	public void eat();
}

class Worker implements IWorkable, IFeedable{
	public void work() {
		// ....working
	}

	public void eat() {
		//.... eating in launch break
	}
}

class Robot implements IWorkable{
	public void work() {
		// ....working
	}
}

class SuperWorker implements IWorkable, IFeedable{
	public void work() {
		//.... working much more
	}

	public void eat() {
		//.... eating in launch break
	}
}

class Manager {
	Workable worker;

	public void setWorker(Workable w) {
		worker=w;
	}

	public void manage() {
		worker.work();
	}
}</pre>
<p><strong>Conclusion</strong></p>
<p>Como resumen:</p>
<p>&#8220;Los clientes no deberían ser obligados a depender de interfaces que no utilizan&#8221;<br />
o&#8230;<br />
&#8220;Muchas interfaces muy especializadas son preferibles a una interfaz general en la que se agrupen todas las interfaces&#8221;</p>
<p>Ambas son buenas&#8230;</p>
<p>Saludos,<br />
Sed felices ^^</p>
]]></content:encoded>
			<wfw:commentRss>http://joanballestermoragues.com/programacion-desarrollo/patrones-de-diseno-isp.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

