<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Tutoriales de Desarrollo y Diseño Web | Web.Ontuts</title>
	
	<link>http://web.ontuts.com</link>
	<description>Tutoriales y Recursos Web de Calidad en Español</description>
	<lastBuildDate>Tue, 15 May 2012 15:40:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/web-ontuts" /><feedburner:info uri="web-ontuts" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>web-ontuts</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Introducción a Backbone.js</title>
		<link>http://feedproxy.google.com/~r/web-ontuts/~3/wIrC-n_ZDik/</link>
		<comments>http://web.ontuts.com/tutoriales/introduccion-a-backbone-js/#comments</comments>
		<pubDate>Tue, 15 May 2012 15:39:24 +0000</pubDate>
		<dc:creator>Iván Guardado</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[backbone]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://web.ontuts.com/?p=7530</guid>
		<description><![CDATA[Han pasado unos pocos meses sin nuevas publicaciones y qué mejor forma de volver al ruedo que con un tutorial sobre una de esas tecnologías que están en pleno auge y que están cambiando la forma de desarrollar las nuevas aplicaciones web. Vamos con Backbone y javascript.


Related posts:<ol><li><a href='http://web.ontuts.com/tutoriales/monografico-mvc-introduccion/' rel='bookmark' title='Permanent Link: Monográfico MVC: Introducción'>Monográfico MVC: Introducción</a></li>
<li><a href='http://web.ontuts.com/tutoriales/introduccion-y-primeros-pasos-con-prototype-libreria-javascript/' rel='bookmark' title='Permanent Link: Introducción y Primeros pasos con Prototype, librería javascript'>Introducción y Primeros pasos con Prototype, librería javascript</a></li>
<li><a href='http://web.ontuts.com/tutoriales/introduccion-a-object-relational-mapping-orm/' rel='bookmark' title='Permanent Link: Introducción a Object-Relational Mapping (ORM)'>Introducción a Object-Relational Mapping (ORM)</a></li>
<li><a href='http://web.ontuts.com/tutoriales/introduccion-a-cookies-en-la-web/' rel='bookmark' title='Permanent Link: Introducción a Cookies en la Web'>Introducción a Cookies en la Web</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Cada vez más, las aplicaciones web tienden a dejar de lado el antigüo modelo de “hago click y espero a que cargue una nueva página” para enfocarse en un modelo más interactivo e instantáneo, en el que <strong>las acciones de usuario tienen una respuesta inmediata</strong>, imitando así las aplicaciones de escritorio. Como sabrás, para conseguir esto, se necesita delegar el control de nuestra aplicación a Javascript.</p>
<p>En un principio, la simple idea de gestionar una aplicación completa en Javascript nos puede desbordar, pero no te preocupes, ya que existen múltiples frameworks que nos ayudan a llevar a cabo esta tarea, y uno de ellos es Backbone.js.</p>
<h3>¿Qué puedo hacer con Backbone.js?</h3>
<p>Backbone te permite <strong>estructurar tu aplicación</strong> mediante modelos (que es la forma de organizar tus datos en objetos), colecciones y vistas, y conecta todo con tu API del servidor a través de una interfaz JSON. Tambien te permite tener <strong>vinculado un modelo con su vista de forma sincronizada</strong>, así, si cambia una propiedad del modelo, cambiará también su representación en la interfaz. </p>
<p>Eso&#8230; ¡y muchas cosas más! Enumero ahora las características más importantes poniendo ejemplos para cada una de ellas.</p>
<h3>Backbone.Model</h3>
<p>Es el núcleo del framework, ya que es la forma que tienes de organizar los datos con los que va a trabajar tu aplicación. Un modelo puede representar, por ejemplo, la información de una tarea, con sus atributos y métodos, y se define de la siguiente forma:</p>
<pre name="code" class="javascript">
var Task = Backbone.Model.extend({
    defaults: {
        title: 'Tarea sin título',
        status: 'Open'
    },
    close: function(){
        this.set('status', 'Closed');
    },
    open: function(){
         this.set('status', 'Open');
    }
});

window.mytask = new Task({
    'title': 'Ir al super',
    'text': 'Comprar leche y patatas'
});
</pre>
<p>En el ejemplo anterior creamos el modelo para una tarea, que tiene dos atributos por defecto (title y status) y dos métodos (close y open). Al crear una instancia de un modelo, le pasamos los <strong>valores de inicialización en el constructor</strong>, tal como se muestra en el ejemplo.</p>
<p>Para acceder a los valores de los atributos del modelo, no se hace de forma directa, si no que se hace a través del <strong>método get()</strong>:</p>
<p><a href="http://web.ontuts.com/wp-content/uploads/2012/05/Pantallazo-Testing-Chromium.png"><img src="http://web.ontuts.com/wp-content/uploads/2012/05/Pantallazo-Testing-Chromium.png" alt="" title="Console1" width="636" height="209" class="alignnone size-full wp-image-7539" /></a></p>
<h4>save</h4>
<p>Llama a este método cuando desees guardar el estado actual del modelo en la base de datos. Si es un modelo nuevo, es decir, no se había creado antes en la base de datos, el método enviará una llamada tipo <strong>POST</strong> a la url encargada de gestionar dicho modelo. En el caso de que el modelo ya exista, se hará una llamada de tipo <strong>PUT</strong></p>
<pre name="code" class="javascript">
var Task = Backbone.Model.extend({
    urlRoot: '/tasks'
});
window.mytask = new Task({title: 'Ir al super', 'text': 'Comprar leche y patatas'});
window.mytask.save();
</pre>
<p>Hace una llamada AJAX de tipo POST al servidor.</p>
<h4>destroy</h4>
<p>Envía una llamada AJAX de tipo <strong>DELETE</strong> al servidor para eliminar el modelo de la base de datos y lanza el evento <i>destroy</i> a través de todo el modelo y colecciones para mantenerlos sincronizados.</p>
<h4>validate</h4>
<p>Necesitas sobreescribir este método en el modelo si necesitas <strong>validar los datos antes de hacer un set o un save</strong>. La función recibe por parámetro los nuevos valores de los atributos, y si los datos son correctos, la función no devolverá nada, en caso contrario, puede devolver una cadena de texto con el error, un número de error, o lo que quieras y no se continuará con la ejecución del <i>set</i> o <i>save</i>.</p>
<pre name="code" class="javascript">
var Task = Backbone.Model.extend({
    validate: function(attrs){
        if(attrs.status !== 'Open' || attrs.status !== 'Closed'){
            return 'Invalid task status!';
        }
    }
});
</pre>
<h3>Backbone.Collection</h3>
<p>Una colección es un <strong>conjunto ordenados de modelos</strong> sobre la que se pueden añadir listeners para eventos como change, add, remove o ejecutar métodos como fetch, que carga la colección desde el servidor. Para definir una colección, se usa igualmente el método extend pero de la clase Backbone.Collection:</p>
<pre name="code" class="javascript">
var TaskList = Backbone.Collection.extend({
    model: Task,
    url: '/tasklist',
    closed: function(){
        return this.filter(function(task){ return task.get('status') == 'Closed' });
    }
});
window.taskList = new TaskList();
</pre>
<p>En el código anterior, se crea un colección para modelos de tipo Task, cuya url para manejar la persistencia es /tasklist. Además añade un método propio para filtrar la colección por las tareas cuyo estado es ‘Closed’.</p>
<h4>add</h4>
<p>Añade un modelo o un array de modelos a la colección. Si has especificado el atributo model puedes directamente añadir los atributos de cada objeto.</p>
<p><a href="http://web.ontuts.com/wp-content/uploads/2012/05/Pantallazo-Testing-Chromium1.png"><img src="http://web.ontuts.com/wp-content/uploads/2012/05/Pantallazo-Testing-Chromium1.png" alt="" title="Console2" width="640" height="195" class="alignnone size-full wp-image-7551" /></a></p>
<p>Como ves, no es necesario que crees el objeto antes de añadirlo, puedes directamente especificar sus atributos</p>
<h4>remove</h4>
<p>Elimina un modelo de la colección. Si deseas eliminar todo rastro de dicho modelo, esta es la forma recomendada:</p>
<pre name="code" class="javascript">
Task.bind("remove", function(){
    this.destroy();
}
var task = new Task();
taskList.add(task);
taskList.remove(task);
</pre>
<p>Al llamar al método <i>remove</i> de la colección se lanza el evento <i>remove</i> en el modelo sobre que se está eliminando, y luego, desde dicho modelo llamamos al método destroy para que se borre tambien del server (si es lo que queremos).</p>
<h4>fetch</h4>
<p>Este método se encarga de <strong>traer el conjunto de modelos del servidor</strong> y cargarlos en la colección, reseteándola. El server debe de encargarse de devolver la colección de los modelos en formato JSON, si estás trabajando sobre una API del servidor antigüa y no puedes generar dicha respuesta, te interesará sobreescribir el método parse</p>
<h4>parse</h4>
<p>Este método es llamado por Backbone cuando esta necesita <strong>convertir una respuesta del servidor</strong> en un conjunto de modelos. Por lo tanto, es útil sobreescribir este método si no estás trabjando con la API que Backbone espera por defecto. </p>
<p>Por ejemplo, imagina que el server en lugar de devolver directamente el array con los modelos, devuelve un objeto que contiene más información. Puedes sobreescribir el método para pasarle a backbone cuales son los datos que debe usar.</p>
<pre name="code" class="javascript">
var TaskList = Backbone.Collection.extend({
    parse: function(response){
        //response es el objeto JSON que devuelve el server
	//y podría, por ejemplo contener otros atributos como:
	//response.status, response.message,...
	return response.models;
    }
});
</pre>
<h4>reset</h4>
<p>Este método sirve tanto para limpiar el contenido de la collección, como para reemplazar el contenido por los nuevos modelos especificados por parámetro.</p>
<p>Además de estos métodos, existen muchos más métodos para trabajar con las colecciones, como: push, pop, shift, unshift, sort, pluck, where&#8230; Échale un vistazo a la <a href="http://documentcloud.github.com/backbone/#Collection-models">documentación oficial</a> para conocerlos a fondo.</p>
<h3>Backbone.View</h3>
<p>Las vistas en Backbone tienen la misión de <strong>organizar las distintas partes de la interfaz</strong> de la aplicación y mantenerlas actualizadas con el modelo. Backbone no hace suposiciones sobre nuestro HTML / CSS ni sobre el sistema de templates que queremos usar, por eso, las vistas en Backbone tienen más que ver con organización que con código. El siguiente ejemplo muestra la típica estructura de una vista:</p>
<pre name="code" class="javascript">
var TaskView = Backbone.View.extend({
    tagName: "li",
    className: "task",

    initialize: function(){
        this.model.on('change', this.render, this);
    },

    render: function(){
        this.$el.html(_.template($('#taskTemplate').html(),this.model.toJSON()));
	return this;
    },

    events: {
        'click .delete': 'deleteAction'
    },

    deleteAction: function(){
        this.model.destroy();
        return false;
    }
});
var taskView = new TaskView({model: mytask, id: 'task-'+mytask.id});
</pre>
<h4>constructor</h4>
<p>El constructor para la vista acepta como en el caso de los modelos y las colecciones, un conjunto de atributos que se fijarán en el objeto. Lo común es especificar el modelo con los datos que van a ser representados y un id único que será usado como atributo en el DOM.</p>
<h4>tagName y className</h4>
<p>Son los atributos que nos permiten decirle a Backbone cual será el elemento raíz que contendrá la vista, en el caso anterior, se traducirá en: &lt;li class=&#8221;task&#8221;&gt;&lt;/li&gt;
</pre>
<h4>el y $el</h4>
<p>Son los atributos que almacenan la referencia a la raíz HTML de la vista. Siguiendo con el ejemplo, el sería un objeto DOM que representa &lt;li class="task"&gt;&lt;/li&gt;. $el  es el objeto el encapsulado por jQuery para poder trabajar de forma más cómoda.</p>
<h4>initialize</h4>
<p>Es el método llamado en el momento de la creación del objeto, en el ejemplo, añadimos un listener para el evento change del modelo vinculado, de forma que cuando cambie un atributo del modelo, se vuelva a renderizar la vista, sin tener que preocuparnos de nada más.</p>
<h4>render</h4>
<p>Esta función se necesita sobreescribir para especificar <strong>como se va a mostrar la vista</strong> en la interfaz. Tienes total libertad de hacerlo como quieras, por ejemplo, puedes concatenar todo el contenido HTML en una string para luego añadirlo, o usar document.createElement o cualquier framework que gustes. Lo más aconsejable, es <strong>usar un sistema de templating</strong> como <a href="http://github.com/janl/mustache.js">Mustache.js</a>, <a href="http://github.com/creationix/haml-js">Haml-js</a>, <a href="http://github.com/sstephenson/eco">Eco</a> o <a href="http://api.jquery.com/category/plugins/templates/">jQuery Templates</a>. </p>
<p>En el ejemplo anterior he usado <a href="http://documentcloud.github.com/underscore/">Underscore.js</a> y para que funcione, necesitas tener una template con el id <i>taskTemplate</i> en tu HTML. Tal que así:</p>
<pre name="code" class="html">
<script id="taskTemplate" type="text/template">
<div>
<div class="title"><%= title %></div>
<div class="status"><%= status %></div>
<div class="text"><%= text %></div>

        <a class="delete" href="#">Borrar</a>
    </div>

</script>
</pre>
<h4>events</h4>
<p>Definiendo este atributo podemos especificar los distintos <strong>eventos del usuario sobre el DOM que representa la vista</strong>. La forma de definir un evento es <i>"evento selector": "callback"</i>.  Es importante tener en cuenta que el selector solo buscará en los nodos pertenecientes a <i>this.el</i>. En caso de omitir el selector, el evento se aplicará a <i>this.el</i>.</p>
<p>En el ejemplo, definimos el evento de cuando el usuario hace click en el link de Borrar, cuya clase CSS es <i>delete</i>, y le asignamos el callback <i>deleteAction</i>, la cual definimos en la siguiente línea.</p>
<h3>Hasta aquí...</h3>
<p>Hasta aquí la introducción a Backbone.js, creo que más o menos he listado las cosas más importantes, ¡pero hay más! Échale un vistazo a la <a href="http://documentcloud.github.com/backbone/">documentación original</a>.</p>
<p>¿Qué os ha parecido? ¿Creeis que Backbone.js va a ser un <strong>MUST</strong> como ya prácticamente lo es ahora jQuery, o conocéis otras librerías que le puedan arrebatar ese privilegio? </p>
<p>Este es el primero de una serie de tutoriales orientados a Backbone.js y desarrollo de aplicaciones en Javascript, así que estate atento, ¡proximamente más y mejor!</p>


<p>Related posts:<ol><li><a href='http://web.ontuts.com/tutoriales/monografico-mvc-introduccion/' rel='bookmark' title='Permanent Link: Monográfico MVC: Introducción'>Monográfico MVC: Introducción</a></li>
<li><a href='http://web.ontuts.com/tutoriales/introduccion-y-primeros-pasos-con-prototype-libreria-javascript/' rel='bookmark' title='Permanent Link: Introducción y Primeros pasos con Prototype, librería javascript'>Introducción y Primeros pasos con Prototype, librería javascript</a></li>
<li><a href='http://web.ontuts.com/tutoriales/introduccion-a-object-relational-mapping-orm/' rel='bookmark' title='Permanent Link: Introducción a Object-Relational Mapping (ORM)'>Introducción a Object-Relational Mapping (ORM)</a></li>
<li><a href='http://web.ontuts.com/tutoriales/introduccion-a-cookies-en-la-web/' rel='bookmark' title='Permanent Link: Introducción a Cookies en la Web'>Introducción a Cookies en la Web</a></li>
</ol></p><img src="http://feeds.feedburner.com/~r/web-ontuts/~4/wIrC-n_ZDik" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://web.ontuts.com/tutoriales/introduccion-a-backbone-js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://web.ontuts.com/tutoriales/introduccion-a-backbone-js/</feedburner:origLink></item>
		<item>
		<title>En la Conferencia Rails 2011: las conferencias 1/2</title>
		<link>http://feedproxy.google.com/~r/web-ontuts/~3/L4FOfbKcQqU/</link>
		<comments>http://web.ontuts.com/general/en-la-conferencia-rails-2011-las-conferencias-12/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 15:57:46 +0000</pubDate>
		<dc:creator>Roberto Luis Bisbé</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[conferenciaror]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://web.ontuts.com/?p=7480</guid>
		<description><![CDATA[Roberto nos resume el segundo día de la Conferenciaror en Madrid. En esta ocasión comienzan las ponencias relacionadas mayormente con Ruby on Rails... ¡no tienen desperdicio!


Related posts:<ol><li><a href='http://web.ontuts.com/general/en-la-conferencia-rails-2011-los-talleres/' rel='bookmark' title='Permanent Link: En la Conferencia Rails 2011: los talleres'>En la Conferencia Rails 2011: los talleres</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<h3>Segundo día: Empiezan las conferencias</h3>
<p>Seguimos cubriendo la serie de la conferencia Rails, esta vez ya cubriendo las conferencias en sí, fueron muchas así que intentaré ser conciso:</p>
<h4>Introducción y estado de Ruby on Rails</h4>
<p>Primeramente, y tras el proceso de inscripción que dio como resultado una camiseta (para todos) y una taza (solo para los más previsores), tomamos asiento en el Florida Park, un sitio interesante situado dentro de ese enorme lugar que es el Parque del Retiro en Madrid, Javier Ramirez nos dio la bienvenida comentando el estado de Rails, y la contribución de la comunidad española a la causa, fue una charla muy interesante que nos permitió ver un poco cómo evolucionaban a la par el framework y los eventos relacionados.</p>
<h4>Julian Fischer: hay que actualizarse a la última versión</h4>
<p>Tras esta breve introducción al estado de Rails, Julian Fischer nos estuvo hablando, primeramente de cómo vino desde Alemania en moto para darse el paseíllo, y más adelante de cómo migraron sus aplicaciones (y más importante, sus desarrolladores) a rails 3.x. Nos habló de la necesidad de actualizar, de convencernos que tenemos que hacerlo y de convencer a nuestros clientes de tener los productos funcionando con la última versión disponible. También destacó la idea de tener (desde el punto de vista de un jefe de proyectos) a nuestra gente también actualizada (dar opciones a la formación e incentivarla).</p>
<h4>CofeeScript con Nicolás Sanguinetti</h4>
<p>Tras el cofee-break, una sesión de CofeeScript, impartida por Nicolás Sanguinetti, donde nos comentó las deficiencias de Javascript, y cómo CofeeScript ayudaba a paliarlas, usando una sintaxis más simple, y con varios ejemplos que nos ayudaron a tener una idea en general de la herramienta. Para gente con conocimientos de Javascript, era una de las charlas más recomendable.</p>
<h4>How I learned to smell code</h4>
<p>La última charla de la mañana se titulaba &#8220;How I Learned to Smell Code&#8221; que podemos traducir por &#8220;Cómo he aprendido a oler el código&#8221;, una charla impartida por Renée de Voursney, donde tras explicarnos su trayectoria profesional, nos comentó cómo sus capacidades iban evolucionando desde la universidad (donde tu código no se escribe para ser mantenible), primeros trabajos (donde, pese a mayor control, tu código era apenas reutilizado), hasta llegar a la comunidad Rails, viendo cientos de proyectos, y aprendiendo crear código que fuera usable por el resto de desarrolladores.</p>
<p>Finalmente nos comentó varios puntos a tener en cuenta a la hora de aprender:</p>
<ul>
<li>Intentar enseñarselo a alguien</li>
<li>Hacer katas (ejercicios de código)</li>
<li>Leer libros (concretamente nos propuso The Pragmatic Programmer y Clean Code: a handbook of agile software craftsmanship)</li>
<li>Tener un hobby, a ser posible que no tenga que ver nada con tu trabajo</li>
</ul>
<h4>Después de comer: introducción a 5 lenguajes diferentes</h4>
<p>Tras la comida, la primera sesión de la tarde fue una introducción en poco más de una hora, a 5 lenguajes de programación diferentes, por Sergio Gil: <strong>erlang</strong>, un lenguaje funcional, orientado a la concurrencia y a la tolerancia a errores, <strong>haskell</strong>, un lenguaje puramente funcional, con un sistema de tipos interesante, y extremadamente eficiente, <strong>common lisp</strong>, un lenguaje de programación funcional donde se mezclan indistintamente código y datos, la sintaxis no existe y se presta bastante a la metaprogramación (hacer programas que manipulan código, a que suena bien?), <strong>clojure</strong>, que es una versión más adecuada al siglo XXI de Lisp, más funcional si cabe y con el soporte de la máquina virtual java.</p>
<p>Finalmente <strong>ujfalusi</strong>, un lenguaje de programación ofuscado creado por el ponente, que nos dio la idea de crear nuestro propio lenguaje de programación, y tener la idea de cómo funcionan por dentro, y hacer algo realmente &#8220;geek&#8221; (No, ¡con esto no se liga!).</p>
<h4>Paolo Perrota desde una perspectiva de Java o C#</h4>
<p>La última sesión de la tarde, preparada, estuvo a cargo de Paolo Perrota, nos acercó a Rails desde la perspectiva de un programador Java o C# (estos bichos raros que <del>venimos</del> vienen de un mundo estático), comentó las principales diferencias, en las herramientas, en el diseño, en el uso de la línea de comandos como herramienta de programación VS uso de un IDE &#8220;grande y poderodo&#8221; como Eclipse, Netbeans o Visual Studio.</p>
<p>Fue una charla intensa y muy interesante que nos enseñó a ver con otros ojos otros lenguajes, a sentirnos incómodos con lo que hacemos y tengamos la necesidad de buscar algo más, y de tener un pensamiento más generalista a la hora de aprender un lenguaje nuevo, y que lo menos importante es la sintaxis.</p>
<h4>Mini-sesiones como colofón final</h4>
<p>Como colofón, tuvimos la oportunidad de ver mini-sesiones que surgieron a lo largo de la mañana donde vimos cosas como:</p>
<ul>
<li>Crear una historia, contarla y vivirla, por Luismi Cavallé (pronunciado KAH-BAH-YEAH!) altamente recomandado si veis algo suyo.</li>
<li>Trucos para la shell de OSX, atajos de teclado que nos hacen la vida más fácil, por Jorge Dias</li>
<li>ElasticSearch, un motor de búsqueda interesante que podemos incorporar a nuestros proyectos, por Eli Kroumova</li>
<li>Sergio Arbeo nos presentó su &#8220;<strong>Alternative Programming Languages Interest Group</strong>&#8220;</li>
<li>Nacho Coloma habló de <strong>hashBang</strong> y<strong> pushState</strong> dos características que pueden dar bastante de que hablar (para recargar la web y cambiar de url sin hacer un refresco completo de la página)</li>
<li>Josh Kalderimis nos invitó a unirnos a su grupo <strong>Social Charity Collective</strong>, y donar el resultado de un fin de semana de trabajo a obras de caridad, hay mucha gente que puede estar necesitando nuestro código.</li>
<li>Fernando Martinez, también hizo de las suyas invitandonos a trabajar con él en su empresa <img src='http://web.ontuts.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> , así que ya sabeis, si buscais trabajo Rails en Madrid, puede ser una oportunidad.</li>
</ul>
<p>Mañana terminará el evento, y tendréis otro resumen como este,</p>
<p>¡Nos vemos entonces!</p>


<p>Related posts:<ol><li><a href='http://web.ontuts.com/general/en-la-conferencia-rails-2011-los-talleres/' rel='bookmark' title='Permanent Link: En la Conferencia Rails 2011: los talleres'>En la Conferencia Rails 2011: los talleres</a></li>
</ol></p><img src="http://feeds.feedburner.com/~r/web-ontuts/~4/L4FOfbKcQqU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://web.ontuts.com/general/en-la-conferencia-rails-2011-las-conferencias-12/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://web.ontuts.com/general/en-la-conferencia-rails-2011-las-conferencias-12/</feedburner:origLink></item>
		<item>
		<title>En la Conferencia Rails 2011: los talleres</title>
		<link>http://feedproxy.google.com/~r/web-ontuts/~3/96AW2qWSGx4/</link>
		<comments>http://web.ontuts.com/general/en-la-conferencia-rails-2011-los-talleres/#comments</comments>
		<pubDate>Thu, 14 Jul 2011 10:45:02 +0000</pubDate>
		<dc:creator>Roberto Luis Bisbé</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[backbone]]></category>
		<category><![CDATA[node]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://web.ontuts.com/?p=7478</guid>
		<description><![CDATA[Roberto nos cuenta cómo está desarrollándose la Conferencia Rails 2011 en Madrid. Talleres, ponencias y mucho networking en Madrid. Esta vez le ha tocado el turno a Ruby on Rails y Backbone.js... ¡no os lo perdáis!


Related posts:<ol><li><a href='http://web.ontuts.com/general/en-la-conferencia-rails-2011-las-conferencias-12/' rel='bookmark' title='Permanent Link: En la Conferencia Rails 2011: las conferencias 1/2'>En la Conferencia Rails 2011: las conferencias 1/2</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<h3>El primer día: talleres</h3>
<p>Hoy hemos podido difrutar de tres workshops que se presentan como introducción a la Conferencia Rails 2011, un evento que reúne profesionales del universo RoR para comentarnos sus experiencias, revelarnos trucos, pasar un buen rato y compartir.</p>
<h4>Rompiendo el hielo con Ruby on Rails</h4>
<p>La primera sesión estuvo a cargo de <strong>Raimond García</strong>, quien nos ayudó a romper el hielo con Rails, con un <em>hola mundo</em> desde 0, pasando por una introducción al modelo mvc, y a las particularidades de Rails, hasta el despliegue completo usando los servicios en la nube de Heroku. Una charla amena y entretenida, que nos permitió una vez terminada, probar por nosotros mismos cosas como enviar un e-mail a un usuario cuando se registre.</p>
<h4>Programación funciona sobre Ruby</h4>
<p>La segunda sesión fue un poco más fuerte, ya que estaba enfocada a las ventajas de usar programación funcional sobre Ruby. <strong>Arnau Sanchez</strong> nos mostró, entre otras cosas cómo implementar una versión muy básica de quicksort (uno de los algoritmos de ordenación por excelencia) en apenas 4 líneas, además enseñaba trucos para lograr un procesamiento paralelo de las operaciones. En mi opinión fue tremendamente interesante a pesar de mi falta de experiencia en Ruby. Como deberes me apunté aprender Haskell y F# (para un posible futuro artículo, tal vez).</p>
<h4>Backbone.js</h4>
<p>Tras la comida, una sesión de Backbone.js, un framework MVC basado en javascript, en el que estuvimos construyendo, bajo la tutela de <strong>Javier Arce</strong> una pequeña aplicación para calificar películas, tras una introducción a javascript desde el punto de vista del programador Ruby, impartida por <strong>Simon Tokumine</strong>, quien después estuvo explicando las particularidades de node.js, un framework que permite programación basada en eventos, y pudimos ver algunos ejemplos de uso (un servidor web, o un servidor de chat entre otros).</p>
<h4>Mañana más y mejor</h4>
<p>Felicitar a la organización de la conferencia, así como a los chicos de <strong>Madrid On Rails</strong>, por proporcionar las instalaciones para estas sesiones, y a los ponentes por su altísimo nivel técnico y la calidad de las ponencias.</p>
<p>¡Mañana más, desde Florida Park (El Retiro)!</p>


<p>Related posts:<ol><li><a href='http://web.ontuts.com/general/en-la-conferencia-rails-2011-las-conferencias-12/' rel='bookmark' title='Permanent Link: En la Conferencia Rails 2011: las conferencias 1/2'>En la Conferencia Rails 2011: las conferencias 1/2</a></li>
</ol></p><img src="http://feeds.feedburner.com/~r/web-ontuts/~4/96AW2qWSGx4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://web.ontuts.com/general/en-la-conferencia-rails-2011-los-talleres/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://web.ontuts.com/general/en-la-conferencia-rails-2011-los-talleres/</feedburner:origLink></item>
		<item>
		<title>Monográfico MVC: Introducción</title>
		<link>http://feedproxy.google.com/~r/web-ontuts/~3/Z3W1fnh2M5M/</link>
		<comments>http://web.ontuts.com/tutoriales/monografico-mvc-introduccion/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 16:51:50 +0000</pubDate>
		<dc:creator>Roberto Luis Bisbé</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[ror]]></category>

		<guid isPermaLink="false">http://web.ontuts.com/?p=7345</guid>
		<description><![CDATA[La semana pasada me surgió la necesidad de hacer un sistema de gestión de eventos para el DotNetClub del que formo parte y, aprovechando que lo estábamos estudiando en la carrera, decidí emplear el patrón Modelo-Vista-Controlador (MVC) y crear esta serie de artículos.


Related posts:<ol><li><a href='http://web.ontuts.com/tutoriales/introduccion-a-backbone-js/' rel='bookmark' title='Permanent Link: Introducción a Backbone.js'>Introducción a Backbone.js</a></li>
<li><a href='http://web.ontuts.com/tutoriales/introduccion-a-object-relational-mapping-orm/' rel='bookmark' title='Permanent Link: Introducción a Object-Relational Mapping (ORM)'>Introducción a Object-Relational Mapping (ORM)</a></li>
<li><a href='http://web.ontuts.com/tutoriales/tutorial-introduccion-zend-framework-php/' rel='bookmark' title='Permanent Link: Introducción a Zend Framework PHP'>Introducción a Zend Framework PHP</a></li>
<li><a href='http://web.ontuts.com/tutoriales/grails-introduccion-a-desarrollo-web-java-para-dummies/' rel='bookmark' title='Permanent Link: Grails: Introducción a desarrollo web Java para &#8216;dummies&#8217;'>Grails: Introducción a desarrollo web Java para &#8216;dummies&#8217;</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<h3>¿Por qué esta serie?</h3>
<p>La semana pasada me surgió la necesidad de hacer un sistema de gestión de eventos para el DotNetClub del que formo parte y, aprovechando que lo estábamos estudando en la carrera, decidí emplear el patrón Modelo-Vista-Controlador (MVC).</p>
<p><center><img src="http://web.ontuts.com/wp-content/uploads/2011/06/ror1.jpg" alt="Ror" /></center></p>
<p>El problema era que no me decidía si desarrollarlo en ASP.net o en Ruby on Rails, así que se me ha ocurrido hacer una pequeña implementación de la misma interfaz en los dos modelos para ver las diferencias, y ya que estaba, compartirlo con vosotros.</p>
<p>Como en un solo artículo es imposible dar siquiera una primera aproximación a cada una de las herramientas, lo hemos dividido en una serie, titulada <strong>Monográfico MVC</strong>.</p>
<p><center><img src="http://web.ontuts.com/wp-content/uploads/2011/06/asp.jpg" alt="ASP.net MVC" /></center></p>
<p>A lo largo de esta serie, veremos cómo partiendo de un diseño básico, podemos agregar la lógica MVC, y apreciar las diferencias entre dos tecnologías concretas, y muy diferentes:</p>
<ul>
<li><strong>Ruby on Rails</strong></li>
<li><strong>ASP.net MVC3</strong></li>
</ul>
<p>Comencemos pues la introducción al patrón MVC.</p>
<h3>Introducción: ¿Qué es MVC?</h3>
<p>De acuerdo con la definición de Wikipedia es:</p>
<blockquote><p>Patrón de arquitectura de software que separa los datos de una aplicación, la interfaz de usuario, y la lógica de control en tres componentes distintos.</p></blockquote>
<p>Esto significa que tendremos tres componentes principales en nuestra aplicación:</p>
<h4>Modelo</h4>
<p>El modelo lo podemos ver como la base de datos, o el sistema relacional que controla cómo se leen y se guardan los datos, así como cierta lógica de validación y relaciones entre ellos (Lo podemos llamar modelo relacional, si estamos trabajando con bases de datos)</p>
<h4>Vista</h4>
<p>La vista es lo que se muestra al usuario o a un servicio web, es decir, una vista puede ser una página HTML para que el usuario acceda a los datos, una interfaz en Silverlight, o incluso un fichero XML que se consuma desde un programa externo.</p>
<h4>Controlador</h4>
<p>El controlador es el enlace entre la vista y el modelo, se encarga de recibir los eventos desde la vista (por ejemplo un botón “Enviar” de un formulario o de un cuadro de login) y de exponer a la vista los datos desde el modelo.</p>
<p>Este modelo no es nuevo, sino que fue introducido en 1987 en el lenguaje de programación SmallTalk, si quereis echar un vistazo a la especificación original, la podeis encontrar aquí: <a href="http://st-www.cs.illinois.edu/users/smarch/st-docs/mvc.html">http://st-www.cs.illinois.edu/users/smarch/st-docs/mvc.html</a></p>
<p><a href="http://st-www.cs.illinois.edu/users/smarch/st-docs/mvc.html"></a>Con el auge de las aplicaciones web, se ha demostrado ser un modo de programación que encaja bastante bien con internet, siendo tanto el modelo y el controlador ejecutados del lado del servidor, y la vista ejecutada del lado del cliente.</p>
<h3>Diseño inicial</h3>
<p>Para poder centrarnos en los diferentes sistemas y no centrarnos tanto en el diseño, partimos de un diseño HTML ya construido que contiene dos páginas:</p>
<ul>
<li><strong>Lista de eventos</strong></li>
<li><strong>Ventana de detalles</strong></li>
</ul>
<p>La lista de eventos contendrá la fecha, el título del evento, el ponente y una descripción.</p>
<p>La ventana de detalles contendrá, además, el edificio, el aula, y la hora, así como dos opciones para editar y/o borrar el evento.</p>
<p>Visto este diseño podemos extraer el conjunto de datos necesario, y su tipo:</p>
<ul>
<li>Id: <strong>Integer</strong></li>
<li>Titulo: <strong>String</strong></li>
<li>Fecha: <strong>Date</strong></li>
<li>Edificio:<strong> String</strong></li>
<li>Ponente: <strong>String</strong></li>
<li>Descripcion: <strong>String</strong></li>
</ul>
<p>A partir de este diseño, y usando técnicas de scaffolding, comprobaremos lo sencillo que puede ser empezar a trabajar.</p>
<p>En la próxima entrega veremos cómo agregamos lógica a esta web usando el primero de los jugadores: <em><strong>Ruby on Rails</strong></em>.</p>
<p>¡Nos vemos en la próxima publicación!</p>


<p>Related posts:<ol><li><a href='http://web.ontuts.com/tutoriales/introduccion-a-backbone-js/' rel='bookmark' title='Permanent Link: Introducción a Backbone.js'>Introducción a Backbone.js</a></li>
<li><a href='http://web.ontuts.com/tutoriales/introduccion-a-object-relational-mapping-orm/' rel='bookmark' title='Permanent Link: Introducción a Object-Relational Mapping (ORM)'>Introducción a Object-Relational Mapping (ORM)</a></li>
<li><a href='http://web.ontuts.com/tutoriales/tutorial-introduccion-zend-framework-php/' rel='bookmark' title='Permanent Link: Introducción a Zend Framework PHP'>Introducción a Zend Framework PHP</a></li>
<li><a href='http://web.ontuts.com/tutoriales/grails-introduccion-a-desarrollo-web-java-para-dummies/' rel='bookmark' title='Permanent Link: Grails: Introducción a desarrollo web Java para &#8216;dummies&#8217;'>Grails: Introducción a desarrollo web Java para &#8216;dummies&#8217;</a></li>
</ol></p><img src="http://feeds.feedburner.com/~r/web-ontuts/~4/Z3W1fnh2M5M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://web.ontuts.com/tutoriales/monografico-mvc-introduccion/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://web.ontuts.com/tutoriales/monografico-mvc-introduccion/</feedburner:origLink></item>
		<item>
		<title>Cuestamenos, ahorra y gana dinero con tus compras y amigos</title>
		<link>http://feedproxy.google.com/~r/web-ontuts/~3/aooxkFu1Vu8/</link>
		<comments>http://web.ontuts.com/noticias/cuestamenos-ahorra-y-gana-dinero-con-tus-compras-y-amigos/#comments</comments>
		<pubDate>Wed, 18 May 2011 09:19:11 +0000</pubDate>
		<dc:creator>Adrián Mato</dc:creator>
				<category><![CDATA[noticias]]></category>
		<category><![CDATA[cuestamenos]]></category>
		<category><![CDATA[proyectos]]></category>

		<guid isPermaLink="false">http://web.ontuts.com/?p=7418</guid>
		<description><![CDATA[Presentamos el proyecto Cuestamenos, de Enrique Medina uno de nuestros colaboradores en Ontuts. Si realmente queréis hacer uso de las promociones de distintas marcas conocidas, ahorrar y participar en diversos premios... ¡no dejéis de echarle un vistazo al artículo!


No related posts.]]></description>
			<content:encoded><![CDATA[<h3>¿Ya estáis vendiendo patrocinados y spameando?</h3>
<p>No, al igual que he publicado un artículo sobre <a href="http://web.ontuts.com/general/glibox-o-como-obtener-wordpress-themes-a-bajo-coste/">Glibox</a> hace ya algunas semanas mi idea con este tipo de publicaciones es <strong>echar un cable a todos los proyectos nacionales</strong> que quieran promocionarse. En realidad no publicamos cualquier cosa que nos manden, pero sí que lo hacemos con aquellos proyectos que realmente tienen un trabajo y una planificación detrás.</p>
<p>En esta ocasión el proyecto es <a href="http://cuestamenos.com/">Cuestamenos</a> de <a href="http://web.ontuts.com/author/enrique/">Enrique Medina</a> que ya ha colaborado anteriormente con Ontuts con alguna publicación sobre Grails.</p>
<h3>¿Qué es Cuestamenos y qué ofrece?</h3>
<p>El proyecto se resume en <strong>ahorra y gana dinero comprando e invitando a tus amigos</strong>. Ya ha sido presentado hace un tiempo en <a href="http://loogic.com/cuestamenos-com-y-el-negocio-del-cashback/">Loogic</a> y me comentan que les ha sorprendido para bien la aceptación y acogimiento que ha recibido entre los usuarios que realizan sus compras a través de Internet.</p>
<p><center><img alt="Cuestamenos" src="http://web.ontuts.com/wp-content/uploads/2011/05/cuestamenos.png" title="Cuestamenos" class="alignnone" width="512" height="225" /></center></p>
<p>Sin embargo, y gracias al feedback de la comunidad de usuarios, no han tardado en vislumbrar la necesidad de dotar de mayor usabilidad y visibilidad a la oferta de tiendas, productos y promociones, por lo que hace unas semanas han decidido ponerse manos a la obra y &#8220;reinventar&#8221; la web focalizando todos sus esfuerzos en una <strong>mayor facilidad</strong> a la hora de <strong>encontrar</strong> la <strong>información</strong> que buscamos.</p>
<p>El resultado según me comentan &#8220;ha sido espectacular a juzgar por las opiniones y comentarios de nuestros usuarios y el creciente volumen de nuevos registros&#8221;.</p>
<h3>¿Cuáles son las novedades que nos encontramos?</h3>
<p>Son muchas y variadas por lo que os las listo en secciones para que os sea más cómodo de entender:</p>
<ul>
<li><strong>Usuarios</strong>: ¿Por qué no premiar a los usuarios más activos? El programa de referidos permite a los &#8220;padrinos&#8221; beneficiarse también de las compras y registros de sus referidos. Por ejemplo, si tú como usuario recomiendas a varios conocidos que terminan dándose de alta en cuestamenos.com, por cada compra o registro que estos referidos tuyos hagan, tú te llevas un porcentaje adicional de esa ganancia.
</li>
<li><strong>Home</strong>: Una &#8220;fotografía&#8221; inmediata y clara de &#8220;qué está pasando&#8221;, así no se le escapara ni una sola oportunidad de ahorrar y ganar dinero al usuario. Para ello han rediseñado la home para que se asemeje a un &#8220;dashboard&#8221; o cuadro de mandos desde donde poder ver las últimas ofertas y tiendas. Además, han rediseñado los menús para hacerlos más intuitivos y manejables.
</li>
<li><strong>Ganancias</strong>: Hasta ahora podíamos comprobar nuestras ganancias dentro de nuestra cuenta, pero era bastante difícil tener una visión global de si realmente estábamos ahorrándonos dinero o no. Han añadido gráficos y una tabla mucho más dinámica para el detalle de las ganancias que permite ordenar, filtrar, etc.
</li>
<li><strong>Comunicación</strong>: Conscientes de que no todos los usuarios pueden entrar a la web en cualquier momento, han mejorado el detalle de información que se manda en nuestras comunicaciones por correo, de forma que ahora. Más detalle, más información, más transparencia, mejor control.
</li>
<li><strong>Productos</strong>: Aunque la anterior versión de la web ya proporcionaba una búsqueda básica de productos, la calidad de los resultados era bastante mejorable. Así, han incorporado una nueva búsqueda más rápida, certera y, sobre todo, que te permite navegar por los resultados, filtrarlos, ordenarlos, para que ningún producto se te escape y puedas encontrar sólo lo que buscas.
</li>
<li><strong>Promociones</strong>: De la misma forma que ahora se pueden buscar productos con un buen nivel de detalle, también han querido añadir esta funcionalidad a las promociones, de forma que puedas encontrar el cupón, descuento o ganga que estés buscando sin esfuerzo.
</li>
</ul>
<p><center><img src="http://web.ontuts.com/wp-content/uploads/2011/05/cuestamenos2.png" alt="" /></center></p>
<h3>Todo esto está muy bien pero&#8230; ¿por qué Cuestamenos y no otros?</h3>
<p>Ha sido una de las preguntas que se me han venido a la cabeza, y su respuesta en resumen es que hay otras web que aparentemente ofrecen el mismo tipo de servicio, pero aún así creen firmemente que <a href="http://cuestamenos.com">cuestamenos.com</a> está varios pasos por delante de ellas, no sólo por madurez y facilidad de uso, sino porque:</p>
<ul>
<li>Ofrece el <strong>mayor porcentaje de ganancias</strong>, y si eres VIP, el 100%.</li>
<li><strong>Búsqueda avanzada</strong> por precios, categorías y tiendas con más de 6 millones de productos. Cuestamenos ofrece un programa de referidos con el que ganas directamente si ellos compran o se registran en las tiendas.</li>
<li>Sistema avanzado de <strong>control de ganancias</strong> mediantes gráficas y otras herramientas. Además ofrece la posibilidad de cobrar tus ganancias bien por Paypal bien por transferencia directa en cuenta dentro de España, y sin absolutamente ningún tipo de comisión para ti.</li>
<li>Sólo Cuestamenos ofrece un <strong>servicio de atención gratuito</strong> al usuario que responde en pocas horas, incluso en minutos.</li>
</ul>
<p><center><img src="http://web.ontuts.com/wp-content/uploads/2011/05/cuestamenos3.png" alt="" /></center></p>
<h3>Pero aquí no acaba todo&#8230;</h3>
<p>Porque para celebrar la nueva web <strong>regalan a todos los nuevos usuarios 1€ sólo por registrarse</strong>, sin tener que hacer ninguna compra, sólo porque estamos convencidos de que una vez que nos pruebes, ya no sabrás comprar online si no es a través de <a href="http://cuestamenos.com">cuestamenos.com</a>.</p>
<p>Por mi parte sólo me queda felicitar a Enrique y todo el equipo y desearos mucha suerte, ¡dadle caña al proyecto!</p>
<p>¡Probadlo y no dudéis en enviarles feedback via comentarios!</p>


<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/web-ontuts/~4/aooxkFu1Vu8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://web.ontuts.com/noticias/cuestamenos-ahorra-y-gana-dinero-con-tus-compras-y-amigos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://web.ontuts.com/noticias/cuestamenos-ahorra-y-gana-dinero-con-tus-compras-y-amigos/</feedburner:origLink></item>
		<item>
		<title>Marcas de agua en imágenes usando PHP (I)</title>
		<link>http://feedproxy.google.com/~r/web-ontuts/~3/IVKyA-J3D3Q/</link>
		<comments>http://web.ontuts.com/tutoriales/marcas-de-agua-en-imagenes-usando-php-i/#comments</comments>
		<pubDate>Tue, 10 May 2011 16:26:02 +0000</pubDate>
		<dc:creator>Gonzalo Ayuso</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://web.ontuts.com/?p=7156</guid>
		<description><![CDATA[En este tutorial aprenderemos a crear marcas de agua en nuestras imágenes utilizando PHP y mod_rewrite. Como siempre paso a paso, bien explicado y con imágenes del resultado final. ¡No os lo perdáis!


Related posts:<ol><li><a href='http://web.ontuts.com/tutoriales/creando-servicios-de-red-tcp-con-php-y-xinetd/' rel='bookmark' title='Permanent Link: Creando servicios de red TCP con PHP y xinetd'>Creando servicios de red TCP con PHP y xinetd</a></li>
<li><a href='http://web.ontuts.com/tutoriales/acelerando-los-tiempos-de-carga-uniendo-archivos-javascript-con-php/' rel='bookmark' title='Permanent Link: Acelerando los tiempos de carga uniendo archivos Javascript con PHP'>Acelerando los tiempos de carga uniendo archivos Javascript con PHP</a></li>
<li><a href='http://web.ontuts.com/tutoriales/aprendiendo-a-utilizar-la-libreria-curl-en-php/' rel='bookmark' title='Permanent Link: Aprendiendo a utilizar la librería cURL en PHP'>Aprendiendo a utilizar la librería cURL en PHP</a></li>
<li><a href='http://web.ontuts.com/tutoriales/tutorial-introduccion-zend-framework-php/' rel='bookmark' title='Permanent Link: Introducción a Zend Framework PHP'>Introducción a Zend Framework PHP</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<h3>Imaginando una biblioteca de imágenes&#8230; ¡Demasiado trabajo!</h3>
<p>Imaginemos que tenemos un biblioteca de imágenes y que queremos añadirles una marca de agua a todas ellas. Podemos abrir un editor de imágenes (Gimp o Photoshop, por ejemplo) y crear nuestra marca de agua manualmente a todas ellas.</p>
<p>Es un <strong>trabajo sencillo</strong> pero si nuestra biblioteca de imágenes es <strong>muy grande el trabajo</strong> se convierte en algo más duro. Podemos <strong>automatizar</strong> esta tarea, pero si las marcas de agua que queremos poner son dinámicas, tenemos que buscar otra solución. Como ejemplo imaginemos que lo que queremos poner es la fecha/hora en la que el usuario solicita la imagen al servidor. Para hacer esto vamos a usar la librería GD y PHP. Empecemos:</p>
<blockquote><p>Gracias a la librería GD podemos añadir de manera sencilla marcas de agua a nuestras imágenes. Esto Unido a mod_rewrite nos permite hacer el trabajo al vuelo.</p></blockquote>
<h3>¡Automaticemos el trabajo!</h3>
<p>La idea es simple. En lugar de abrir directamente la imagen, lo que vamos a hacer es crear un script PHP que modifique la imagen original con la función <a href="http://www.php.net/manual/en/function.imagecreatefromjpeg.php">imagecreatefromjpeg</a> y le añada un footer con la fecha/hora . Después le entregaremos al navegador la imagen modificada con las cabeceras necesarias.</p>
<p>Esta solución nos implica modificar todas nuestras etiquetas img y pasar de algo así:</p>
<pre name="code" class="html">
&lt;img src=&#039;/ruta/de/la/imagen.jpg&#039; alt=&#039;img&#039; /&gt;
</pre>
<p>A algo así:</p>
<pre name="code" class="html">
&lt;img src=&#039;/ruta/del/script.php&#039; alt=&#039;img&#039; /&gt;
</pre>
<p>Para evitar esto vamos a usar un pequeño truco que consiste en usar el módulo mod_rewrite de apache (los demás servidores Web tienen módulos similares). Creando este simple archivo .htaccess en la carpeta donde tengamos nuestras imágenes jpg, podemos redirigir cada petición de la imagen original a nuestro script PHP que la modifica y le añade la marca de agua.</p>
<pre name="code" class="php">
RewriteEngine on
RewriteRule !\.(php)$ watermark.php
</pre>
<p>Ahora creamos nuestro script watermark.php para hacer la modificación.</p>
<pre name="code" class="php">
&lt;?php
$uri = $_SERVER[&#039;REQUEST_URI&#039;];
$documentRoot = $_SERVER[&#039;DOCUMENT_ROOT&#039;];
$filename = $documentRoot . $uri;
if (realpath(__FILE__) == realpath($filename)) {
    exit();
}
$stringSize = 3;
$footerSize = ($stringSize==1) ? 12 : 15;
$footer = date(&#039;d/m/Y H:i:s&#039;);

list($width, $height, $image_type) = getimagesize($filename);
$im = imagecreatefromjpeg($filename);
imagefilledrectangle (
        $im,
        0,
        $height,
        $width,
        $height - $footerSize, imagecolorallocate($im, 49, 49, 156));

imagestring($im,
        $stringSize,
        $width-(imagefontwidth($stringSize)*strlen($footer)) - 2,
        $height-$footerSize,
        $footer,
        imagecolorallocate($im, 255, 255, 255));

header( &#039;Content-Type: image/jpeg&#039; );
imagejpeg($im);
</pre>
<p>Como vemos el script es muy sencillo. Podemos modificarlo y cambiarlo por nuestro logotipo, o introducir nuevos valores. Para que esto funcione tenemos que tener nuestra instalación de PHP compilada con soporte <a href="http://www.php.net/manual/en/image.installation.php">GD</a>.</p>
<p>Imagen Original:<br />
<center><img src="http://gonzalo123.files.wordpress.com/2011/02/original.jpg?w=300" alt="" /></center></p>
<p>Imagen transformada:<br />
<center><img src="http://gonzalo123.files.wordpress.com/2011/02/after.png?w=300" alt="" width="300" height="225" /></center></p>
<h3>Una pequeña reflexión final</h3>
<p>Y eso es todo. ¿Qué pega tiene esta técnica? Pues que estamos usando unos <strong>recursos del servidor elevados</strong>. Estamos transformando la imagen cada vez que la solicitamos. Si el volumen de peticiones es pequeño no hay problema, pero si crece podemos tirar el servidor.</p>
<p>Una solución sencilla es <strong>cachear la imagen resultante</strong>. De este modo liberamos al servidor, pero ¿que pasa si la marca de agua es dinámica?. En el siguiente artículo de esta mini serie veremos una posible solución al problema.</p>
<p>¡Nos vemos en el próximo capítulo!</p>


<p>Related posts:<ol><li><a href='http://web.ontuts.com/tutoriales/creando-servicios-de-red-tcp-con-php-y-xinetd/' rel='bookmark' title='Permanent Link: Creando servicios de red TCP con PHP y xinetd'>Creando servicios de red TCP con PHP y xinetd</a></li>
<li><a href='http://web.ontuts.com/tutoriales/acelerando-los-tiempos-de-carga-uniendo-archivos-javascript-con-php/' rel='bookmark' title='Permanent Link: Acelerando los tiempos de carga uniendo archivos Javascript con PHP'>Acelerando los tiempos de carga uniendo archivos Javascript con PHP</a></li>
<li><a href='http://web.ontuts.com/tutoriales/aprendiendo-a-utilizar-la-libreria-curl-en-php/' rel='bookmark' title='Permanent Link: Aprendiendo a utilizar la librería cURL en PHP'>Aprendiendo a utilizar la librería cURL en PHP</a></li>
<li><a href='http://web.ontuts.com/tutoriales/tutorial-introduccion-zend-framework-php/' rel='bookmark' title='Permanent Link: Introducción a Zend Framework PHP'>Introducción a Zend Framework PHP</a></li>
</ol></p><img src="http://feeds.feedburner.com/~r/web-ontuts/~4/IVKyA-J3D3Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://web.ontuts.com/tutoriales/marcas-de-agua-en-imagenes-usando-php-i/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://web.ontuts.com/tutoriales/marcas-de-agua-en-imagenes-usando-php-i/</feedburner:origLink></item>
		<item>
		<title>vanilla: theme corporativo y portfolio para WordPress</title>
		<link>http://feedproxy.google.com/~r/web-ontuts/~3/tx2907eq7Ak/</link>
		<comments>http://web.ontuts.com/recursos/vanilla-theme-corporativo-y-portfolio-para-wordpress/#comments</comments>
		<pubDate>Fri, 22 Apr 2011 12:07:43 +0000</pubDate>
		<dc:creator>Adrián Mato</dc:creator>
				<category><![CDATA[Recursos web]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[diseño]]></category>
		<category><![CDATA[themes]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://web.ontuts.com/?p=7363</guid>
		<description><![CDATA[Presentamos nuestra última creación en Wordpress. vanilla es un theme corporativo y portfolio para aquellos que trabajan con el gestor de contenidos Wordpress. ¡Descubre todas sus características y entérate de cómo conseguirlo!


Related posts:<ol><li><a href='http://web.ontuts.com/recursos/7-themes-wordpress-para-fotografos-gratis/' rel='bookmark' title='Permanent Link: 7 Themes WordPress para Fotógrafos Gratis'>7 Themes WordPress para Fotógrafos Gratis</a></li>
<li><a href='http://web.ontuts.com/recursos/nes-theme-9-increibles-iconos-tematicos-de-videojuegos/' rel='bookmark' title='Permanent Link: NES Theme: 9 increíbles iconos temáticos de videojuegos'>NES Theme: 9 increíbles iconos temáticos de videojuegos</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<h3>¿Qué es vanilla?</h3>
<p><center><a href="http://themeforest.net/item/vanilla-corporate-portfolio-wordpress-theme/234588?ref=adrianmg"><img src="http://web.ontuts.com/wp-content/uploads/2011/04/vanilla_01.png" alt="vanilla WordPress theme" /></a></center><br />
<a href="http://themeforest.net/item/vanilla-corporate-portfolio-wordpress-theme/234588?ref=adrianmg"><strong>vanilla</strong></a> es un <strong>theme corporativo y portfolio</strong> para aquellos que trabajan con el gestor de contenidos <strong>WordPress</strong>. Anteriormente WordPress era meramente utilizado para blogs pero es un hecho que el paso del tiempo y su popular aceptación lo hayan reconvertido en el CMS referencia para mucho tipo de proyectos.</p>
<blockquote><p>No creo que WordPress valga para todo pero realmente para proyectos pequeños y medianos aporta mucha versatilidad y sobretodo rapidez.</p></blockquote>
<p>El theme ha sido creado por un servidor y viene acompañado de un <strong>sistema de rotación de imágenes en la portada</strong> permitiendo mostrar nuestros últimos trabajos con un montón de efectos diferentes para captar la atención del visitante.</p>
<p>No importa si tus conocimientos de WordPress son escasos o amplios, el theme cubre ambos perfiles. ¿Cómo? Pues porque viene acompañado de un <strong>panel de administración</strong> de forma que rellenando formularios puedes <strong>personalizar y configurarlo a tu gusto</strong>.</p>
<p><center><a href="http://themeforest.net/item/vanilla-corporate-portfolio-wordpress-theme/234588?ref=adrianmg"><img src="http://web.ontuts.com/wp-content/uploads/2011/04/02_splash.png" alt="vanilla WordPress theme" /></a></center></p>
<p>De esta forma podrás por ejemplo <strong>añadir diapositivas</strong> al sistema de rotación de imágenes de portada, añadir <strong>proyectos a la galería</strong>, entradas en el <strong>blog</strong>, configurar tu cuenta de <strong>twitter</strong>, galería de <strong>flickr</strong>, dos <strong>sidebars</strong> completamente configurables mediante widgets y todo esto y mucho más sin tocar una línea de código.</p>
<p><center><a href="http://themeforest.net/item/vanilla-corporate-portfolio-wordpress-theme/234588?ref=adrianmg"><img src="http://web.ontuts.com/wp-content/uploads/2011/04/04_gallery.png" alt="vanilla WordPress theme" /></a></center></p>
<p>Además viene acompañado de <strong>8 archivos PSD</strong> por lo que podrás personalizar colores y el &#8220;look &#038; feel&#8221; general si algo no te convence de forma fácil y cómoda.</p>
<h3>Algunas características destacadas de vanilla</h3>
<p>Como os comentaba al inicio el theme viene cargado de opciones y características algunas de las más destacadas son las siguientes que os listo a continuación:</p>
<ul>
<li><strong>Rotación de diapositivas en portada</strong> completamente configurable.</li>
<li><strong>Galería de proyectos</strong>: imágenes y vídeos soportados.</li>
<li><strong>Página de contacto</strong> PHP lista para utilizar sin código.</li>
<li>Un montón de <strong>shortcodes</strong> personalizados.</li>
<li><strong>Menú desplegable</strong> completamente personalizable.</li>
<li>Habilitado para el <strong>uso de widgets</strong>.</li>
<li><strong>Template</strong> de <strong>páginas de ancho completo</strong> sin columnas adicionales.</li>
<li><strong>Página de error 404</strong> personalizada.</li>
<li>Posibilidad de añadir <strong>imágenes destacadas</strong> a las entradas del blog.</li>
<li>Comentarios anidados.</li>
<li>Último mensaje publicado en <strong>Twitter</strong>.</li>
<li>Galería de <strong>imágenes flickr</strong> como widget.</li>
<li><strong>Compatible con la mayoría de navegadores actuales</strong> (incluyendo <strong>IE7</strong> y <strong>IE8</strong>).</li>
<p></lu></p>
<p>Seguramente se me escapen algunas pero espero haberme acordado de las más importantes.</p>
<h3>¿Cómo puedo conseguir el theme?</h3>
<p>En esta ocasión el theme no viene en forma de recurso gratuíto como acostumbramos a publicar. La forma en la que lo hemos publicado ha sido mediante el marketplace de los chicos de Envato llamado como <a href="http://themeforest.net/?ref=adrianmg">Themeforest</a>.</p>
<p><center><a href="http://themeforest.net/item/vanilla-corporate-portfolio-wordpress-theme/234588?ref=adrianmg"><img src="http://web.ontuts.com/wp-content/uploads/2011/04/03_services.png" alt="vanilla WordPress theme" /></a></center></p>
<p>El precio del theme es de <strong>35$</strong> <a href="http://themeforest.net/item/vanilla-corporate-portfolio-wordpress-theme/234588?ref=adrianmg"><strong>pudiendo ser comprado aquí mismo</strong></a>. Además del propio theme hemos incluído una completa documentación para seguir paso a paso a la hora de configurar todas las distintas opciones en caso de que no encontréis lo que buscáis.</p>
<p><center><a href="http://themeforest.net/item/vanilla-corporate-portfolio-wordpress-theme/234588?ref=adrianmg"><img src="http://web.ontuts.com/wp-content/uploads/2011/04/05_blog.png" alt="vanilla WordPress theme" /></a></center></p>
<p><strong>¿Por qué no hemos publicado el theme de forma gratuíta?</strong> Sinceramente porque ha costado muchas horas de diseño, maquetación y programación y el resultado final me ha hecho convencerme que debía cobrar por ello <img src='http://web.ontuts.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><center><a href="http://themeforest.net/item/vanilla-corporate-portfolio-wordpress-theme/234588?ref=adrianmg"><img src="http://web.ontuts.com/wp-content/uploads/2011/04/07_styles.png" alt="vanilla WordPress theme" /></a></center></p>
<p>Espero que os haya gustado y si tenéis alguna crítica o sugerencia para mejorar este o próximos diseños&#8230; ¡no dudéis en compartirla por favor!</p>


<p>Related posts:<ol><li><a href='http://web.ontuts.com/recursos/7-themes-wordpress-para-fotografos-gratis/' rel='bookmark' title='Permanent Link: 7 Themes WordPress para Fotógrafos Gratis'>7 Themes WordPress para Fotógrafos Gratis</a></li>
<li><a href='http://web.ontuts.com/recursos/nes-theme-9-increibles-iconos-tematicos-de-videojuegos/' rel='bookmark' title='Permanent Link: NES Theme: 9 increíbles iconos temáticos de videojuegos'>NES Theme: 9 increíbles iconos temáticos de videojuegos</a></li>
</ol></p><img src="http://feeds.feedburner.com/~r/web-ontuts/~4/tx2907eq7Ak" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://web.ontuts.com/recursos/vanilla-theme-corporativo-y-portfolio-para-wordpress/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://web.ontuts.com/recursos/vanilla-theme-corporativo-y-portfolio-para-wordpress/</feedburner:origLink></item>
		<item>
		<title>Las tres opciones del emprendedor: El bueno, el feo y el malo</title>
		<link>http://feedproxy.google.com/~r/web-ontuts/~3/ewXMh7DOWbI/</link>
		<comments>http://web.ontuts.com/opinion/las-tres-opciones-del-emprendedor-el-bueno-el-feo-y-el-malo/#comments</comments>
		<pubDate>Fri, 08 Apr 2011 09:07:36 +0000</pubDate>
		<dc:creator>Javier López</dc:creator>
				<category><![CDATA[Opinión]]></category>
		<category><![CDATA[emprendedores]]></category>
		<category><![CDATA[opinión]]></category>

		<guid isPermaLink="false">http://web.ontuts.com/?p=7229</guid>
		<description><![CDATA[A la hora de emprender, y si simplificamos el asunto, cualquier emprendedor que comienza a dar sus primeros pasos tiene tres opciones: El bueno, el feo y el malo. 


No related posts.]]></description>
			<content:encoded><![CDATA[<p>A la hora de emprender, y si simplificamos el asunto, cualquier emprendedor que comienza a dar sus primeros pasos tiene tres opciones: El bueno, el feo y el malo.</p>
<h3>El Bueno</h3>
<p><strong>&#8220;El Bueno&#8221;</strong>, y lo llamo así porque para mí es lo ideal para alguien que salta a la piscina por primera vez, consiste en hacer algo <strong>hoy</strong> y ponerlo a la venta <strong>ayer</strong>. Haz algo, ponle un precio y véndelo cuanto antes. </p>
<p>Tan pronto como lo hayas movido un poco y estés ganando tus primeros euros, <strong>vuelve al primer paso y crea otro producto</strong>. O bien<strong> itera sobre él</strong> para que genere aún más dinero.</p>
<p><center><img src="http://web.ontuts.com/wp-content/uploads/2011/04/elbueno.jpg" alt="" title="elbueno" width="437" height="139" class="alignleft size-full wp-image-7253" /></center></p>
<p>Así de simple. Crea un<strong> producto completo</strong>, en el mínimo tiempo posible, y véndelo en internet. Te vale casi cualquiera cosa. Por ejemplo: </p>
<ul>
<li>Mini-videojuegos: para Flash, Iphone, Adroid, PC, etc.</li>
<li>Aplicaciones para móviles</li>
<li>Themes para webs y WordPress</li>
<li>Ebooks</li>
<li>Fotografías</li>
<li>Iconos</li>
<li>Loops de música o sonidos FX</li>
<li>Servicios web con diferentes planes y precios. Rey de los ejemplos: <a href="http://basecamphq.com/">BaseCamp</a></li>
<li>Etc&#8230;</li>
</ul>
<p>Hay tantas opciones como imaginación tengas.</p>
<blockquote><p>
Código fuente filtrado de origen desconocido con el algoritmo en cuestión. ¡Úsalo bajo tu propio riesgo!<br />
<br />
10 Haz un producto<br />
20 Ponlo en venta<br />
30 Múevelo<br />
40 GOTO 10
</p></blockquote>
<p>¿Te suena la palabra &#8220;<strong>passive incoming</strong>&#8220;? Lleva de moda varios años. Cualquiera de los productos que te he comentado puede convertirse en un passive incoming. Simplemente es un producto que pones a la venta, y mientras trabajas en el siguiente, el anterior está generando beneficio.</p>
<p>Si insistes en esa mecánica (crear producto nuevo mientras vendes el anterior) la bola de nieve irá creciendo, y aunque productos antiguos vayan decayendo con el tiempo, si haces una gráfica en modo campana, verás que con constancia irás teniendo unos ingresos remanentes incrementales que pueden hacer que vivas muy, pero que muy, bien.</p>
<blockquote><p>¿Acaso no hiciste negocios en el cole vendiendo fotocopias de las Tortugas Ninja? (Verídico en mi caso, sólo que yo encima puse a mi hermana a dibujar láminas de monstruos que luego fotocopiaba y vendía). Pues &#8220;El Bueno&#8221; es casi lo mismo.</p></blockquote>
<p>Algunos detalles a tener en cuenta:</p>
<ul>
<li>El producto que hagas, tiene que ser un <strong>producto acabado</strong>, o al menos <a href="http://www.minecraft.net/">una beta que merezca la pena pagar por usar</a>.</li>
<li>Es mejor sacar algo en 3 meses que no esté del todo perfecto y luego iterar sobre él. Que tardar 6 meses y sacarlo perfecto. &#8220;Perfecto&#8221; es muy relativo. Será perfecto para ti&#8230; pero sería mucho mejor haberlo sacado 3 meses antes y estar 3 meses iterando sobre él, recibiendo <em>feedback</em> constante de los usuarios, siendo ellos los que marquen el rumbo de la nueva <em>release</em>.</li>
<li>Ponte un <strong>tiempo de desarrollo muy estricto</strong> y que sea el menor tiempo posible.</li>
<li>Si el tiempo de desarrollo que calculas es mayor de 6 meses, piénsatelo mucho. Lo ideal sería algo que pudieras tener terminado en <strong>3 meses</strong>. Al menos si es la primera vez que vas a vender algo.</li>
<li>Si lo empiezas, acabalo. &#8220;<a href="http://www.youtube.com/watch?v=q3hn6fFTxeo">Hazlo, o no lo hagas, pero no lo intentes</a>&#8220;.</li>
</ul>
<p>Con &#8220;El Bueno&#8221; puede que no te hagas multimillonario, pero si que puede darte para un sueldo muy decente. Además, estarás continuamente haciendo proyectos nuevos y sacando nuevas ideas. Esta opción es muy entretenida.</p>
<p>¡Qué haces leyendo esto aún! ¡Ve y hazlo!</p>
<h3>El Feo</h3>
<p>Otra opción, &#8220;<strong>El Feo</strong>&#8220;, muy socorrida cuando a una startup está intentado que &#8220;El Malo&#8221; funcione y le falta liquidez (o al menos ese es nuestro caso), es <strong>hacer trabajos para terceros</strong>. Es decir, diseño y desarrollo web, aplicaciones para móviles, etc&#8230; todas esas cosas que por suerte o por desgracia ofrecemos en <a href="http://cokidoo.com/">Cokidoo</a>. </p>
<p><center><img src="http://web.ontuts.com/wp-content/uploads/2011/04/elfeo.jpg" alt="" title="elfeo" width="437" height="139" class="alignleft size-full wp-image-7254" /></center></p>
<p>Vale, da de comer, pero <strong>se parece demasiado a trabajar en una empresa con un sueldo</strong>&#8230; o como diría mi socio Iván&#8230; ¡es peor! Al menos si trabajas en una empresa como diseñador gráfico asalariado no tienes que preocuparte de si la empresa va bien o mal, o de si entran más o menos clientes&#8230; ¡ya está el jefe para eso!</p>
<p>Pero si empiezas a hacer trabajos para terceros, de pronto tu universo de preocupaciones se llenará de:</p>
<ul>
<li>Encontrar nuevos clientes</li>
<li>Trabajar en las ideas de otros&#8230; ¡eso no mola!</li>
<li>Entregar todos los curros a tiempo, echando tantas horas extra como hagan falta.</li>
<li>Que los clientes que tardan en pagar, paguen.</li>
<li>Tener poco tiempo para &#8220;El Bueno&#8221; o &#8220;El Malo&#8221;.
</ul>
<p>Partiendo de la base de que no quieres trabajar en una empresa con un sueldo, sino que quieres ser tu propio jefe y desarrollar tus propias ideas, esta opción, puede que te permita aguantar durante una temporada en la que &#8220;El Bueno&#8221; o &#8220;El Malo&#8221; no te dan de comer, pero a la larga, no hará más que quemarte.</p>
<p>Vale, hay excepciones. Hay freelancers que viven contentos haciendo esto y les va muy bien&#8230; pero más contentos estarían seguro si hubieran conseguido lo que <a href="http://envato.com/">Envato</a>, que partiendo de un <a href="http://freelanceswitch.com/">blog para freelancers</a> han acabado creando marketplaces, redes de blogs de tutoriales y literalmente forrándose.</p>
<p><a href="http://dribbble.com/">Dribbble</a> debe estar cargadito de freelancers muy felices haciendo sus cosas, pero cuando un cliente les aprieta, fijo que muchos de ellos preferirían echar horas extra trabajando en un proyecto propio que invertirlas en un cliente.</p>
<h3>El Malo</h3>
<p>&#8220;<strong>El Malo</strong>&#8221; es ese proyecto que los inversores están cansados de ver, pero que por otra parte es el único en el que merece la pena invertir, porque a largo plazo podría ser un pelotazo.</p>
<p><center><img src="http://web.ontuts.com/wp-content/uploads/2011/04/elmalo.jpg" alt="" title="elmalo" width="437" height="139" class="alignleft size-full wp-image-7255" /></center></p>
<p>Es un proyecto que <strong>va a necesitar mucho de tu tiempo y mínimo dos o tres años para empezar a ser rentable</strong>, si es que alguna vez lo es. Tiempo durante el cuál tus opciones se reducen a <strong>buscar financiación</strong>, con lo que tendrás uno o dos años para tu equipo aseguradas si la primera ronda de inversión es mínimamente decente&#8230; o bien <strong>apretarte el cinturón</strong> y salir de copas con &#8220;El Feo&#8221;. Es decir, trabajar en tu proyecto a la vez que para terceros&#8230; cuando los clientes aprietan por las entregas y a la misma vez intentas sacar adelante tu propio proyecto, te aseguro por experiencia, se hace duro.</p>
<p>Lo llamo &#8220;El Malo&#8221; porque <strong>muy pocos triunfan con este modelo</strong>. Muy pocas redes sociales o comunidades llegan a ser rentables, por no decir casi ninguna.</p>
<p>No obstante, si tienes muy claro lo que vas a vender, y no está basado en la mera publicidad (generar tráfico y esperar ganar dinero con publicidad o afiliados es muy complicado), puede que te salga bien. A empresas como Atrapalo, Privalia o Buyvip no las habría categorizado antes de empezar como &#8220;El Malo&#8221;. Esas empresas desde el día uno tenían algo para vender, y luego ya tenían que preocuparse de generar visitas y comunidad para vender aún más. Es muy distinto de por ejemplo hacer una web o comunidad de contenido útil como <a href="http://www.erasmusu.com/es/">Erasmusu.com</a> y luego intentar sacar dinero con publicidad o afiliados. Erasmusu es la leche en cuanto a comunidad, visitas y páginas vistas se refiere&#8230; pero no ha sido nada fácil empezar a que sea rentable.</p>
<p>Y si buscas inversión porque no quieres perder el tiempo trabajando para terceros y quieres enfocarte totalmente en tu proyecto, olvídate de que inviertan en una idea&#8230; como mínimo deberás tener un prototipo&#8230; y un buen &#8220;exit plan&#8221;, cuya traducción a la lengua de Cervantes o lo que el inversor ve en su cabeza es: &#8220;¿cómo pijos voy yo a sacar pasta de este asunto?&#8221;. Recuerda, al inversor le podrá motivar más o menos tu proyecto, pero lo que el quiere, es ganar dinero. Ni más, ni menos. Así que si no ve claramente lo que vas a vender, a quién se lo vas a vender y cómo lo vas a vender&#8230; ¡olvídate! Aparte, conozco gente que ha estado año y medio únicamente buscando financiación&#8230; ¡no es fácil!</p>
<blockquote><p>Con &#8220;El Malo&#8221; me refiero pues a aquellos proyectos que de por sí, no venden nada concreto, y que <strong>necesitan una gran cantidad de visitas</strong> para desarrollar modelos de negocio en torno a ellos y empezar a ser rentables. Me refiero a las redes sociales, comunidades online, foros, etc.</p></blockquote>
<p>¡Ojo! Cualquier <a href="http://themeforest.net/">marketplace</a> de Envato tiene una comunidad y foros detrás. Pero no me refiero a este tipo de comunidad. Esa comunidad está ahí para comprar o crear nuevos productos y empezaron primero como marketplace, luego como comunidad.</p>
<p>En contraposición al &#8220;El Malo&#8221; está &#8220;El Bueno&#8221;. Si haces un theme para <a href="http://themeforest.net/">ThemeForest</a> hoy y lo consigues poner en venta&#8230; durante la siguiente semana ya estarás teniendo tus primeros ingresos y la bola de nieve comenzará a rodar.</p>
<p>&#8220;El Bueno&#8221; podría convertirse también en un pelotazo digno de que algún inversor hubiera puesto pasta&#8230; por ejemplo <a href="http://itunes.apple.com/us/app/tiny-wings/id417817520?mt=8">este videojuego</a> de Iphone hecho por una sola persona debe haber generado muchísimo dinero. Pero lo normal es que los productos que crees, si eliges la opción del &#8220;El Bueno&#8221; te den un muy buen sueldo, pero no atraigan a ningún inversor&#8230; ¿y quién los necesita?</p>
<p>Claro esta, si te sale bien, &#8220;El Malo&#8221; es el que <strong>podría hacerte rico, muy rico</strong>. Como le has pasado a Twitter, Facebook, etc. ¡No quiero ser yo el que te desilusione!</p>
<p>Pero aún así, aún existiendo esa posibilidad, <strong>es mejor que empieces por &#8220;El Bueno&#8221;</strong>, durante como mínimo dos años, porque aprenderás mucho en el camino y podrás utilizarlo más adelante para arriesgarte en &#8220;tu gran proyecto&#8221;.</p>
<p>See you in another life!</p>


<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/web-ontuts/~4/ewXMh7DOWbI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://web.ontuts.com/opinion/las-tres-opciones-del-emprendedor-el-bueno-el-feo-y-el-malo/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://web.ontuts.com/opinion/las-tres-opciones-del-emprendedor-el-bueno-el-feo-y-el-malo/</feedburner:origLink></item>
		<item>
		<title>¡Concursa y Gana una Camiseta del equipo Cokidoo!</title>
		<link>http://feedproxy.google.com/~r/web-ontuts/~3/ENEYbkEXFLU/</link>
		<comments>http://web.ontuts.com/general/%c2%a1concursa-y-gana-una-camiseta-del-equipo-cokidoo/#comments</comments>
		<pubDate>Fri, 25 Mar 2011 12:44:11 +0000</pubDate>
		<dc:creator>Adrián Mato</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[camiseta]]></category>
		<category><![CDATA[cokidoo]]></category>
		<category><![CDATA[concursos]]></category>

		<guid isPermaLink="false">http://web.ontuts.com/?p=7194</guid>
		<description><![CDATA[Sorteamos 3 fantásticas camisetas personalizadas con la imagen de Cokidoo de la mano de LolaCamisetas. Es muy fácil concursar tan sólo debes dejar tu mensaje de participación en Facebook o Twitter. ¡Suerte a todos!


Related posts:<ol><li><a href='http://web.ontuts.com/general/concursa-y-gana-el-juego-slide-colors-para-xbox-360-y-pc/' rel='bookmark' title='Permanent Link: Concursa y gana el juego Slide Colors para Xbox 360 y PC'>Concursa y gana el juego Slide Colors para Xbox 360 y PC</a></li>
<li><a href='http://web.ontuts.com/general/sorteamos-10-cupones-de-descuento-para-basekit/' rel='bookmark' title='Permanent Link: Sorteamos 10 Cupones de Descuento para BaseKit'>Sorteamos 10 Cupones de Descuento para BaseKit</a></li>
<li><a href='http://web.ontuts.com/general/sorteamos-23-invitaciones-para-google-wave/' rel='bookmark' title='Permanent Link: Sorteamos 23 Invitaciones para Google Wave'>Sorteamos 23 Invitaciones para Google Wave</a></li>
<li><a href='http://web.ontuts.com/general/sorteamos-20-invitaciones-para-google-wave/' rel='bookmark' title='Permanent Link: Sorteamos 20 Invitaciones para Google Wave'>Sorteamos 20 Invitaciones para Google Wave</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<h3>Actualización: ¡Ya tenemos a los 3 ganadores!</h3>
<p>Nos gustaría dar las gracias a todos los participantes, han sido muchos más de los esperado y la verdad estamos muy contentos de la respuesta de todos en los distintos canales: facebook, twitter o el propio blog.</p>
<p>Y ahora vamos con lo que os interesa, estos han sido los <strong>3 ganadores</strong>:</p>
<ul>
<li><strong><a href="http://twitter.com/#!/pasku1">@pasku</a></strong></li>
<li><strong><a href="http://www.facebook.com/profile.php?id=100000751335799">José Daniel</a></strong></li>
<li><strong><a href="http://twitter.com/#!/RaulSimon">@RaulSimon</a></strong></li>
</ul>
<p>Enhorabuena alos tres, en breves nos pondremos en contacto con vosotros para pedir vuestra talla de camiseta y la dirección de envío.</p>
<p>¡Gracias a todos por participar y suerte para el próximo! <img src='http://web.ontuts.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Sorteamos 3 camisetas de Cokidoo</h3>
<p>De la mano de los chicos de <a href="http://lolacamisetas.com">LolaCamisetas</a> esta vez sorteamos tres fantásticas, impresionantes, galácticas y exclusivas camisetas de <a href="http://cokidoo.com">Cokidoo</a>.</p>
<p><center><img src="http://web.ontuts.com/wp-content/uploads/2011/03/lolacamisetas.png" alt=""/></center></p>
<p>Los ganadores serán anunciados el <strong>4 de Abril</strong> y recibirán una de las camisetas con la talla que deseen en su domicilio, lógicamente sin gastos de ningún tipo <img src='http://web.ontuts.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<h3>¿Cómo puedo participar?</h3>
<p>Para participar tan sólo tienes que comentar en <strong>twitter</strong> por qué te gustaría ganar la camiseta <strong>mencionando al usuario</strong> <a href="http://twitter.com/ontuts">@ontuts</a> o bien en <a href="http://www.facebook.com/ontuts">nuestro Facebook</a> dejando también un pequeño mensaje con el que convencernos de que debas ser el elegido.</p>
<blockquote><p><strong>Ejemplo:</strong> Debo ganar una de las camisetas que sortea @ontuts porque nadie les ha hecho tanto la pelota como yo!</p></blockquote>
<p>¡Mucha suerte a todos!</p>
<h3>Acerca de LolaCamisetas</h3>
<p>Para los que no los conozcáis os recomendamos que <a href="http://www.lolacamisetas.com/">visitéis su web</a> en la que podréis encontrar todo tipo de <strong>camisetas originales y divertidas</strong>, llegando incluso a poder <strong>personalizar vuestras propias camisetas</strong>.</p>
<p><center><a href="http://lolacamisetas.com"><img src="http://web.ontuts.com/wp-content/uploads/2011/03/lolalogo.png" alt=""/></a></center></p>
<p>Desde Ontuts queremos dar las gracias a LolaCamisetas por el interés en participar en el concurso con nosotros, ¡da gusto tratar con gente así de agradable!</p>


<p>Related posts:<ol><li><a href='http://web.ontuts.com/general/concursa-y-gana-el-juego-slide-colors-para-xbox-360-y-pc/' rel='bookmark' title='Permanent Link: Concursa y gana el juego Slide Colors para Xbox 360 y PC'>Concursa y gana el juego Slide Colors para Xbox 360 y PC</a></li>
<li><a href='http://web.ontuts.com/general/sorteamos-10-cupones-de-descuento-para-basekit/' rel='bookmark' title='Permanent Link: Sorteamos 10 Cupones de Descuento para BaseKit'>Sorteamos 10 Cupones de Descuento para BaseKit</a></li>
<li><a href='http://web.ontuts.com/general/sorteamos-23-invitaciones-para-google-wave/' rel='bookmark' title='Permanent Link: Sorteamos 23 Invitaciones para Google Wave'>Sorteamos 23 Invitaciones para Google Wave</a></li>
<li><a href='http://web.ontuts.com/general/sorteamos-20-invitaciones-para-google-wave/' rel='bookmark' title='Permanent Link: Sorteamos 20 Invitaciones para Google Wave'>Sorteamos 20 Invitaciones para Google Wave</a></li>
</ol></p><img src="http://feeds.feedburner.com/~r/web-ontuts/~4/ENEYbkEXFLU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://web.ontuts.com/general/%c2%a1concursa-y-gana-una-camiseta-del-equipo-cokidoo/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://web.ontuts.com/general/%c2%a1concursa-y-gana-una-camiseta-del-equipo-cokidoo/</feedburner:origLink></item>
		<item>
		<title>Creando servicios de red TCP con PHP y xinetd</title>
		<link>http://feedproxy.google.com/~r/web-ontuts/~3/dQ5CJ1YvO1I/</link>
		<comments>http://web.ontuts.com/tutoriales/creando-servicios-de-red-tcp-con-php-y-xinetd/#comments</comments>
		<pubDate>Thu, 17 Mar 2011 13:15:21 +0000</pubDate>
		<dc:creator>Gonzalo Ayuso</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tcp]]></category>
		<category><![CDATA[xinetd]]></category>

		<guid isPermaLink="false">http://web.ontuts.com/?p=7053</guid>
		<description><![CDATA[Presentamos un nuevo y sencillo tutorial para crear servicios de red en Linux, usando PHP y el daemon xinet.d. Como siempre explicaciones paso a paso y fáciles de seguir.


Related posts:<ol><li><a href='http://web.ontuts.com/tutoriales/creando-una-capa-de-conexion-abstracta-a-base-de-datos-con-php/' rel='bookmark' title='Permanent Link: Creando una capa de conexión abstracta a base de datos con PHP'>Creando una capa de conexión abstracta a base de datos con PHP</a></li>
<li><a href='http://web.ontuts.com/tutoriales/acelerando-los-tiempos-de-carga-uniendo-archivos-javascript-con-php/' rel='bookmark' title='Permanent Link: Acelerando los tiempos de carga uniendo archivos Javascript con PHP'>Acelerando los tiempos de carga uniendo archivos Javascript con PHP</a></li>
<li><a href='http://web.ontuts.com/tutoriales/marcas-de-agua-en-imagenes-usando-php-i/' rel='bookmark' title='Permanent Link: Marcas de agua en imágenes usando PHP (I)'>Marcas de agua en imágenes usando PHP (I)</a></li>
<li><a href='http://web.ontuts.com/tutoriales/mini-aplicaciones-web-con-python-y-juno-parte-ii/' rel='bookmark' title='Permanent Link: Mini Aplicaciones Web con Python y Juno: Parte II'>Mini Aplicaciones Web con Python y Juno: Parte II</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<h3>Introducción</h3>
<p>No todo en PHP es Web y HTTP. Podemos usar PHP para muchas otras cosas. Por ejemplo podemos crear de una forma muy sencilla servicios de red. Cuando creamos servicios de red necesitamos obviamente un <strong>servidor de red</strong> (bien sea TCP o UDP).</p>
<p>Cuando trabajamos con Web y HTTP este servidor suele ser Apache (o similares), pero si queremos crear un servicio específico (no HTTP), además del servicio de red que queramos crear, necesitaríamos <strong>crear un servidor</strong>.</p>
<blockquote><p>No todo en PHP es Web y HTTP. Podemos usar PHP para muchas otras cosas. Por ejemplo podemos crear de una forma muy sencilla servicios de red.</p></blockquote>
<p>Esto lo podemos hacer con C, Java e incluso con PHP, pero cuando trabajamos en entornos Linux existe un daemon que nos permite <strong>desplegar servicios de red</strong> de una forma muy sencilla, encargándose de la parte del servidor y dejándonos a nosotros la parte del servicio de red. Este daemon es <a href="http://www.xinetd.org/">xinetd</a>.</p>
<p>Vamos a ver cómo crear un sencillo servicio de red TCP con xinetd y PHP&#8230; ¡Empecemos!</p>
<h3>Creando el servicio de red TCP con Xinetd y PHP</h3>
<p>El ejemplo que vamos a realizar escuchará del puerto 69321, e inicialmente dirá &#8220;Hola&#8221; cuando alguien realice una petición TCP a dicho puerto. El script del ejemplo es sumamente complicado:</p>
<pre name="code" class="php">
// /home/gonzalo/tests/test1.php
echo "HELLO\n";
</pre>
<p>Bien. Ahora lo que queremos es que nuestro servicio de red escuche el puerto tcp 60321. Para esto tenemos que definir en nuestro archivo /etc/services el puerto en cuestión:</p>
<pre name="code" class="c">
// /etc/services
...
myService   60321/tcp # my hello service
</pre>
<p>Y finalmente creamos la configuración en el daemon xinetd. Para ello creamos el archivo /etc/xinetd.d/myService:</p>
<pre name="code" class="c">
# default: on
# description: my test service

service myService
{
        socket_type = stream
        protocol = tcp
        wait = no
        user = gonzalo
        server = /usr/local/bin/php-cli
        server_args = /home/gonzalo/tests/test1.php
        log_on_success += DURATION
        nice = 10
        disable = no
}
</pre>
<p>Reiniciamos el daemon para que lea la nueva configuración del servicio que hemos creado:</p>
<pre name="code" class="c">
sudo /etc/init.d/xinetd restart
</pre>
<p>Y listo. Ya tenemos nuestro servicio de red operativo y funcionando. Para probarlo podemos usar un simple telnet al puerto definido:</p>
<pre name="code" class="c">
telnet localhost 60321
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hola
Connection closed by foreign host.
</pre>
<p>¿Fácil, no? Sí pero útil, no mucho. Por esto vamos a cambiar un poco es script para que acepte variables de entrada. Esto no es HTTP por lo que no podemos usar las típicas variables $_POST y $_GET.</p>
<p>Lo que tenemos que hacer es leer del stdin. En PHP, al igual que con otros lenguajes, esto es muy sencillo:</p>
<pre name="code" class="php">
$handle = fopen('php://stdin','r');
$input = fgets($handle);
fclose($handle);

echo "Hola {$input}";
</pre>
<p>Reiniciamos el xinetd y tenemos nuestro servicio listo</p>
<pre name="code" class="c">
telnet localhost 60321
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
</pre>
<p>Vemos que el telnet se nos quedará a la espera que introduzcamos un texto. Escribimos: &#8220;<em>gonzalo</em>&#8221; y obtenemos:</p>
<pre name="code" class="c">
gonzalo
Hola gonzalo
Connection closed by foreign host.
</pre>
<h3>Conclusión</h3>
<p>Y esto es todo. Con este sencillo script vemos que, si bien PHP es un lenguaje destinado principalmente para el desarrollo Web, podemos usarlo para otras cosas, manteniendo su punto fuerte: la sencillez.</p>
<p>¿Para qué nos puede servir esto? Bueno. Para empezar nos sirve para <strong>leer datos de dispositivos de red</strong> que tengamos por ahi, como báculas, lectores de tarjetas, sensores&#8230; Muchos de estos dispositivos suelen permitirnos en su configuración establecer una IP/puerto a la que van a enviar información en forma de trama TCP.</p>
<p>También podemos usarlo para <strong>comunicar procesos de una manera simple</strong>, sin necesidad de meternos con servidores XMLRPC/Soap y demás. En fin que es una herramienta más que tenemos a nuestra disposición para afrontar nuestros desarrollos.</p>
<p>¡Nos vemos en el próximo artículo!</p>


<p>Related posts:<ol><li><a href='http://web.ontuts.com/tutoriales/creando-una-capa-de-conexion-abstracta-a-base-de-datos-con-php/' rel='bookmark' title='Permanent Link: Creando una capa de conexión abstracta a base de datos con PHP'>Creando una capa de conexión abstracta a base de datos con PHP</a></li>
<li><a href='http://web.ontuts.com/tutoriales/acelerando-los-tiempos-de-carga-uniendo-archivos-javascript-con-php/' rel='bookmark' title='Permanent Link: Acelerando los tiempos de carga uniendo archivos Javascript con PHP'>Acelerando los tiempos de carga uniendo archivos Javascript con PHP</a></li>
<li><a href='http://web.ontuts.com/tutoriales/marcas-de-agua-en-imagenes-usando-php-i/' rel='bookmark' title='Permanent Link: Marcas de agua en imágenes usando PHP (I)'>Marcas de agua en imágenes usando PHP (I)</a></li>
<li><a href='http://web.ontuts.com/tutoriales/mini-aplicaciones-web-con-python-y-juno-parte-ii/' rel='bookmark' title='Permanent Link: Mini Aplicaciones Web con Python y Juno: Parte II'>Mini Aplicaciones Web con Python y Juno: Parte II</a></li>
</ol></p><img src="http://feeds.feedburner.com/~r/web-ontuts/~4/dQ5CJ1YvO1I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://web.ontuts.com/tutoriales/creando-servicios-de-red-tcp-con-php-y-xinetd/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://web.ontuts.com/tutoriales/creando-servicios-de-red-tcp-con-php-y-xinetd/</feedburner:origLink></item>
	</channel>
</rss>

