<?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>Init Developers</title>
	<atom:link href="http://blog.theinit.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.theinit.com</link>
	<description>coding and blogging</description>
	<lastBuildDate>Tue, 24 Apr 2012 12:53:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Introducción a NO-SQL: Cassandra y CouchDB</title>
		<link>http://blog.theinit.com/2012/04/24/introduccion-a-no-sql-cassandra-y-couchdb/</link>
		<comments>http://blog.theinit.com/2012/04/24/introduccion-a-no-sql-cassandra-y-couchdb/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 10:11:39 +0000</pubDate>
		<dc:creator>ggaray</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Destacados]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=1340</guid>
		<description><![CDATA[Esta semana pasada nos hemos dado un pequeño baño de NO-SQL. Supongo que a estas alturas todo el mundo sabe que el &#8220;NO&#8221; no significa &#8220;no&#8221;, sino &#8220;not-only&#8221;, de manera que esto del NO-SQL en realidad es algo así como &#8220;esas cosas que siempre quisiste hacer con SQL y nunca te atreviste a configurar&#8221;&#8230; Sin...<a href="http://blog.theinit.com/2012/04/24/introduccion-a-no-sql-cassandra-y-couchdb/" class="read"> Continuar </a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.theinit.com/wp-content/uploads/2012/04/CAP.gif"><img class="alignleft size-medium wp-image-1348" title="CAP" src="http://blog.theinit.com/wp-content/uploads/2012/04/CAP-300x211.gif" alt="" width="300" height="211" /></a>Esta semana pasada nos hemos dado un pequeño baño de NO-SQL. Supongo que a estas alturas todo el mundo sabe que el &#8220;NO&#8221; no significa &#8220;no&#8221;, sino &#8220;not-only&#8221;, de manera que esto del NO-SQL en realidad es algo así como &#8220;esas cosas que siempre quisiste hacer con SQL y nunca te atreviste a configurar&#8221;&#8230;</p>
<p>Sin una idea preconcebida más allá de lo indicado, nos fuimos a que nos hablaran de <a href="http://cassandra.apache.org/" target="_blank">Cassandra</a> y <a href="http://couchdb.apache.org/" target="_blank">CouchDB</a>. Ya hemos tocado a veces algo de <a href="http://www.mongodb.org/" target="_blank">MongoDB</a>, de manera que el tema no podía ser más complementario.</p>
<p>La teoría, básicamente, se centra en otra visión del <a href="http://es.wikipedia.org/wiki/Teorema_CAP" target="_blank">Teorema de CAP</a>, que viene a decir que no puedes tener más de 2 de las 3 gracias que todo sistema computacional distribuido puede aportarte: Consistency, Avalilability, Partition.</p>
<p>Es decir, el SQL de siempre se ha centrado mucho en la C y en la A, dejando la P para sistemas tan grandes que no había probablemente en aquel entonces. Hoy (varios años atrás en realidad), la P empieza a tener más importancia, dadas las ingentes cantidades de datos a procesar de manera suficientemente rápida, en aplicaciones web tales como Facebook o Twitter.</p>
<p>En los casos que nos ocupan, ganamos un mucho de P, penalizando un poco de C, de manera que es habitual que las bases de datos NO-SQL tengan lo que viene a llamarse &#8220;consistencia eventual&#8221;, algo así como &#8220;puede que lo que ves no sea lo que debes ver, pero si te esperas unos milisegundos, entonces seguro que sí&#8221;.</p>
<p>Además, prácticamente todas las NO-SQL tienen un punto en común: son orientadas a documento, y no existen las joins (que consumen demasiado en consultas sobre volúmenes de datos gigantescos).</p>
<p><strong>Cassandra</strong></p>
<p>Originalmente creada por Facebook y donada a Apache como software libre, se trata de una de las más relevantes a nivel mundial, usada por el propio Facebook, Twitter, Digg, entre otros.</p>
<p>Funciona mediante la creación de clusters de bases de datos a partir de nodos que pueden añadirse como nuevas instalaciones en nuevos servidores en cualquier momento. Modificando el fichero &#8220;conf/cassandra.yaml&#8221;, podremos configurar los distintos nodos, indicando, por ejemplo:</p>
<p>- Nombre del Cluster: Si dos nodos tienen el mismo nombre de cluster, son del mismo cluster. Fácil, no?</p>
<p>- Nodos Seed: Nodos especiales que se encargan de la comunicación y propagación de los datos entre todos ellos. Se recomienda que haya al menos 2 por cluster.</p>
<p>- Replication Factor: ¿Cuántas copias de la misma información quieres tener? Algo así como responder a &#8220;a cuántos fallos quieres ser inmune?&#8221;.</p>
<p>Con pocos parámetros más, a funcionar con un &#8220;cassandra -f&#8221; (si queremos ver los logs en foreground), incluso con un sólo nodo <img src='http://blog.theinit.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Una vez levantado el servidor, podremos hacer uso del comando &#8220;cassandra-cli&#8221;, con el que podremos conectarnos a nuestra base de datos y tirar comandos como:</p>
<p>- show keyspaces: lo que sería análogo a un &#8220;show databases&#8221;</p>
<p>Los conceptos de guardado de &#8220;documentos&#8221; en Cassandra son los siguientes:</p>
<p>- keyspace: viene a ser un espacio de datos a nivel de base de datos de sql.</p>
<p>- columnfamily: viene a ser un conjunto de columnas que definen datos de un registro. Viene a ser algo similar a una tabla en sql, por la salvedad de que cada fila (row) puede tener unas columnas u otras. (Imaginad toda una base de datos sql condensada en una super-tabla con todos los campos nullables para poder dar salida a cualquier entidad).</p>
<p>- column: campo de dato de una fila, que se agrupan en columnfamilies. Viene a ser como un campo (field) de una tabla de sql, con la salvedad de que contiene siempre un nombre, un valor, y un timestamp.</p>
<p>- supercolumn: columna especial que permite tener dentro a otras columnas (no se pueden mezclar con columnas en un columnafamiliy, y hay dos niveles a anidamiento).</p>
<p>- Orden: cada columnfamily tiene configurado a priori sobre qué campo se va a poder ordenar</p>
<p>En general, la idea es que primero pienses qué consultas quieres realizar, y en base a ellas generes el modelo de datos como si fueran tablas denormalizadas de sql, y cada tabla responde a &#8220;su&#8221; consulta. Esto se puede hacer con sql, porque eres tú el encargado de mantener un determinado dato si está en varias columns, de manera que, por qué Cassandra? Porque si necesitas más rendimiento, aprovechas la &#8220;P&#8221; y con meter un nuevo nodo de manera muy sencilla lo vas a tener.</p>
<p>Programáticamente, se accede a Cassandra vía <a href="http://thrift.apache.org/" target="_blank">Thrift</a>, una interfaz de comunicación que tiene implementaciones en casi todos los lenguajes. En particular, para Java, tenemos la librería Hector, que nos permite realizar las típicas acciones CRUD, etc&#8230; Se habla de que Avro será la nueva interfaz que entierre a Thrift, ya que parece que no tienen demasiado movimiento como proyecto libre.</p>
<p>Por último, a partir de la versión 0.8, disponemos de <a href="http://www.datastax.com/docs/0.8/dml/using_cql" target="_blank">CQL</a> (Cassandra Query Language) que nos acerca la sintaxis de Casssandra a SQL, que los que usamos HQL no podemos otra cosa que agradecer <img src='http://blog.theinit.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>CouchDB</strong></p>
<p>En la misma situación que Cassandra en cuanto a importancia de la A y la P del Teorema del CAP, CouchDB es una sorprendente implementación de base de datos NO-SQL, por su total orientación web. Desde su gestión a través de documentos JSON, hasta su interfaz RESTful, sorprende el diseño de esta base de datos.</p>
<p>Se instala en nodos, de manera distribuida, y se posibilita el uso offline de los mismos, de manera que si un nodo se cae de la red, puede seguir operando y sincronizarse con el resto cuando esté de nuevo online (esto hace su uso especialmente indicado para plataformas móviles). Para la sincronización de datos, se usa un modelo tipo SVN (<a href="http://en.wikipedia.org/wiki/Multiversion_concurrency_control" target="_blank">MVCC</a>), en el que se van marcando las versiones de los documentos guardados. Ojo a datos muy cambiantes que pueden hacer crecer la base de datos demasiado para nuestros intereses; por suerte, se puede configurar el número de históricos a guardar.</p>
<p>A diferencia de Cassandra, el cliente de CouchDB no es otro que cualquier cosa que implemente el protocolo HTTP, con el siguiente mapeo simple de acciones:</p>
<p>- GET: Es un &#8220;read&#8221; de CRUD.</p>
<p>- POST: Es un &#8220;create&#8221; de CRUD</p>
<p>- PUT: Es un &#8220;update&#8221; de CRUD</p>
<p>- DELETE: Es un &#8220;delete&#8221; de CRUD</p>
<p>Es decir, <a href="http://en.wikipedia.org/wiki/RESTful" target="_blank">RESTful</a>.</p>
<p>Casi cualquier lenguaje de programación tiene implementados estos métodos HTTP, de manera que, por ejemplo, podríamos generar aplicaciones vía AJAX directamente contra la base de datos sin la necesidad de una capa servidora (:-O). De hecho, como CouchDB es un servidor HTTP en sí mismo, es posible &#8220;subir&#8221; aplicaciones html+javascript y hacerlas funcionar directamente en la base de datos.</p>
<p>Otra de las gracias que tiene es que la &#8220;programación&#8221; es vía javascript. Todo.</p>
<p>Es posible generar &#8220;vistas&#8221; (en cierto modo análogas a las de SQL) definiendo un método map que determinará si un documento (las vistas se aplican primero a tooooodos los documentos y luego incremental, como si fueran vistas materializadas de SQL) entra en dicha vista o no. Esto nos permite generar respuestas a consultas que no tienen por qué estar directamente mapeadas en los datos, pero además, si acompañamos a la función map con una función reduce, podemos realizar distintos tipos de agregaciones, desde counts, sums, etc&#8230; hasta lo que se nos ocurra que podamos hacer con una función javascript. Esto nos da muchas posibilidades <img src='http://blog.theinit.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Es posible generar validadores javascript para controlar un determinado valor de un campo obligatorio o cosas así.</p>
<p>Es posible generar show/list que permitirán ver respuestas diferentes a JSON (por ejemplo, HTML, XML, etc&#8230;) de un determinado documento o conjunto de los mismos.</p>
<div class="wp-caption alignleft" style="width: 372px"><img title="NO-SQL, no relations" src="http://lh6.ggpht.com/-PeltmZ9Lmf4/TuBoBLb1vyI/AAAAAAAAA04/pO4nF8xkjIc/The%252520Hard%252520Life%252520Of%252520A%252520NoSQL%252520Coder%252520-%252520Geek%252520Poke.jpg" alt="NO-SQL, no relations" width="362" height="512" />
<p class="wp-caption-text">NO-SQL, no relations</p>
</div>
<p>Es posible generar funciones update que creará o modificará documentos.</p>
<p>&#8230;</p>
<p>Todo esto se puede gestionar vía navegador, o un cliente http cualquier tipo <a href="http://curl.haxx.se/" target="_blank">curl</a>, pero una de las mayores gracias que tiene CouchDB es su &#8220;<a href="http://wiki.apache.org/couchdb/Getting_started_with_Futon" target="_blank">Futón</a>&#8220;, que nos hará la vida más sencilla. Se trata de una interfaz web que nos permitirá gestionar las bases de datos, documentos, vistas y demás elementos de nuestra instancia.</p>
<p>En particular, nos ayudará mucho a gestionar un tipo de documento especial, los documentos &#8220;de diseño&#8221;, que contienen todos los elementos anteriores.</p>
<p>Como la sintaxis de su definición no es simple, y se trata de objetos json no demasiado intuitivos, la guinda del pastel de CouchDB: <a href="http://couchapp.org/page/index" target="_blank">CouchApp</a>.</p>
<p>CouchApp es un framework de creación de aplicaciones que permite generar documentos de diseño de CouchDB de manera mucho más sencilla.</p>
<p>En fin, que a modo de resumen y de primer contacto con estas NO-SQL, espero que os pueda servir para que os hagáis una idea. En general, me parece que la mayor gracia está en las posibilidades de escalabilidad horizontal que nos dan estas bases de datos (la P del CAP), así como su rendimiento, pero a cierto coste computacional en las aplicaciones que generemos sobre ellas.</p>
<p>¿Trabajáis habitualmente con NO-SQL? ¿Tenéis alguna aplicación donde os hubiera gustado usarlas? ¿Os habéis encontrado con problemas de escalabilidad SQL que compense migrarlo todo a una NO-SQL? ¿Pensáis que no todo el monte es orégano y que no es para tanto? ¿Una moda pasajera tal vez?</p>
 <img src="http://blog.theinit.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1340" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2012/04/24/introduccion-a-no-sql-cassandra-y-couchdb/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Actualizacion / Upgrading MongoDB a 2.0.3</title>
		<link>http://blog.theinit.com/2012/03/12/actualizacion-upgrading-mongodb-a-2-0-3/</link>
		<comments>http://blog.theinit.com/2012/03/12/actualizacion-upgrading-mongodb-a-2-0-3/#comments</comments>
		<pubDate>Mon, 12 Mar 2012 12:12:32 +0000</pubDate>
		<dc:creator>jmarti</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Destacados]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=1323</guid>
		<description><![CDATA[El día 28 de febrero, MongoDB se actualizó a la versión 2.0.3. Para los usuarios que utilizamos la 2.0.2, los cambios más significativos que nos encontraremos en esta nueva versión son: Arreglo de bugfixes, muchos relacionados con la autenticación. En nuestro caso, no nos habíamos encontrado con ninguno. Ya se puede utilizar logrotate con windows...<a href="http://blog.theinit.com/2012/03/12/actualizacion-upgrading-mongodb-a-2-0-3/" class="read"> Continuar </a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.theinit.com/wp-content/uploads/2012/03/bc358_MongoDB.png"><img class="alignleft size-full wp-image-1334" title="bc358_MongoDB" src="http://blog.theinit.com/wp-content/uploads/2012/03/bc358_MongoDB.png" alt="" width="300" height="300" /></a>El día 28 de febrero, MongoDB se actualizó a la versión 2.0.3. Para los usuarios que utilizamos la 2.0.2, los cambios más significativos que nos encontraremos en esta nueva versión son:</p>
<ul>
<li>Arreglo de bugfixes, muchos relacionados con la autenticación. En nuestro caso, no nos habíamos encontrado con ninguno.</li>
<li>Ya se puede utilizar logrotate con windows (¿alguien usa windows con mongodb?)</li>
<li>Mejoras con capped collections y replica.</li>
</ul>
<p>Se puede ver todo el ChangeLog en su JIRA: https://jira.mongodb.org/browse/SERVER/fixforversion/11001</p>
<p>Se puede actualizar sin ningún problema desde la versión 2.0.2 a la versión 2.0.3, utilizando vuestro gestor de actualizaciones favorito.</p>
<p>Se recomienda empezar con los SECONDARY, y luego con los PRIMARY. Por último, actualizad vuestro cliente, y ala, ya tenemos mongo actualizado sin dolores de cabeza.</p>
 <img src="http://blog.theinit.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1323" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2012/03/12/actualizacion-upgrading-mongodb-a-2-0-3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Instalando un certificado SSL con el balanceador ELB en Amazon AWS</title>
		<link>http://blog.theinit.com/2012/02/21/instalar-certificado-ssl-balanceador-elb-en-amazon-aws/</link>
		<comments>http://blog.theinit.com/2012/02/21/instalar-certificado-ssl-balanceador-elb-en-amazon-aws/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 15:51:04 +0000</pubDate>
		<dc:creator>jmarti</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Destacados]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=1309</guid>
		<description><![CDATA[Una de las funcionalidades que incluye el servicio Amazon es la posibilidad de configurar el certificado SSL directamente en el balanceador ELB, extrayendo de esa &#8220;carga&#8221; al servidor web (apache, por ejemplo). De este modo, el proceso de configuración del servidor web se simplifica, y el procesado de SSL lo realiza el ELB. Sin embargo,...<a href="http://blog.theinit.com/2012/02/21/instalar-certificado-ssl-balanceador-elb-en-amazon-aws/" class="read"> Continuar </a>]]></description>
			<content:encoded><![CDATA[<p>Una de las funcionalidades que incluye el servicio Amazon es la posibilidad de configurar el certificado SSL directamente en el balanceador ELB, extrayendo de esa &#8220;carga&#8221; al servidor web (apache, por ejemplo). De este modo, el proceso de configuración del servidor web se simplifica, y el procesado de SSL lo realiza el ELB. Sin embargo, si has configurado anteriormente SSL en servidores web  Apache o Tomcat, al principio puedes sentirte desorientado, al no saber  qué parámetros de configuración debes introducir. Es por eso que hemos realizado esta guía.<br />
<span id="more-1309"></span></p>
<p>A continuación mostramos una guía paso a paso. Esta guía se ha realizado en Febrero de 2012, y puede que en un futuro el panel haya modificado (por ejemplo, recientemente han incorporado la posibilidad de indicar tu c<a href="http://blog.theinit.com/wp-content/uploads/2012/02/images.jpeg"><img class="alignright size-full wp-image-1312" title="amazon ssl security" src="http://blog.theinit.com/wp-content/uploads/2012/02/images.jpeg" alt="amazon ssl security" width="259" height="195" /></a>ifrado SSL). Allá vamos:</p>
<p>- Primero vas a necesitar el certificado público y la clave privada, para que el ELB lo muestre. El certificado, lógicamente, lo debes pedir a tu suministrador de certificados (verisign, geotrust, rapidssl, etc.). Generalmente te piden el CSR, y con ello, te devuelven el certificado en formato PEM. Eso es lo que necesitas. El único punto a tener en cuenta es que al generar el CSR, debes exportar también la clave privada. Para ello, puedes hacerlo como se indica a continuación:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Bash"><div class="devcodeoverflow"><ol><li>openssl req <span style="color: #660033;">-nodes</span> <span style="color: #660033;">-newkey</span> rsa:<span style="color: #000000;">2048</span> <span style="color: #660033;">-keyout</span> claveprivada.key <span style="color: #660033;">-out</span> midominio.csr</li><li>openssl rsa <span style="color: #660033;">-in</span> .<span style="color: #000000; font-weight: bold;">/</span>claveprivada.key <span style="color: #660033;">-out</span> claveprivada.pem</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>- Como puedes ver, primero se genera el CSR (te pedirá los datos del certificado), y en segundo lugar, se convierte la clave privada a formato PEM (formato necesario para Amazon).</p>
<p>- Haz la petición de tu certificado a tu entidad certificadora.</p>
<p>- En el servicio ELB (dentro de EC2, del panel de Amazon AWS), pulsa sobre &#8220;Crear Nuevo Balanceador&#8221;.</p>
<p>- Configura los listeners. Verás uno configurado inicialmente (http 80 &gt; http 80). Aquí tienes dos opciones:</p>
<ul>
<li>Agregar https (443) &gt; http (80) [ SSL desde cliente a ELB, pero NO SSL desde ELB a servidor ]</li>
<li>Agregar https (443) &gt; http (443) [ SSL total, desde cliente a servidor ]</li>
</ul>
<p>La diferencia está en lo que el servidor web verá, ya que lo que hace el ELB es transformar la petición HTTPS y traspasarla a HTTP (primer caso) o HTTPS (segundo caso). En el primero de los casos, el servidor web pensará que está dando un servicio HTTP (aunque hasta el balanceador llega con SSL), y en el segundo un servicio HTTPS. De ese modo, piensa qué es lo que más te interesa a tí (la segunda opción tendrá como desventaja que el servidor web también tendrá que procesar el desencriptado SSL).</p>
<p>- Pulsa &#8220;save&#8221; y continuar.</p>
<p>- Ahora te pedirá los datos del certificado: la clave privada (el contenido del archivo &#8220;claveprivada.pem&#8221;), el certificado público (lo que te envíe la entidad certificadora) y cualquier certificado intermedio (idem).</p>
<p>- Una vez que los introduces, te pedirá escoger el conjunto de cifrados SSL que deseas proporcionar desde la terminación ELB. En principio, la selección inicial por defecto es suficiente para un buen balance entre el rango más común de navegadores y la seguridad del cifrado. Si aun así, necesitas gestionar más concretamente dichos cifrados, el balanceador lo permite. Aquí puedes obtener más información sobre <a title="Modificación Cifrados SSL en el ELB" href="http://docs.amazonwebservices.com/ElasticLoadBalancing/latest/DeveloperGuide/elb-security-features.html#using-elb-cipher-settings" target="_blank">cómo modificar los cifrados SSL de tu ELB.</a></p>
<p>- Y el resto de parámetros, son los mismos que en un ELB normal.</p>
<p>Esperamos que esta guía te haya servido. A nosotros lo que nos faltó inicialmente fue la conversión de la clave privada al formato PEM que requiere el ELB (sino te indica que &#8220;Private Key not valid&#8221;).</p>
<p>Si tienes dudas, pregunta pregunta <img src='http://blog.theinit.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
 <img src="http://blog.theinit.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1309" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2012/02/21/instalar-certificado-ssl-balanceador-elb-en-amazon-aws/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando Gearman y su extensión PHP en CentOS 5</title>
		<link>http://blog.theinit.com/2012/02/06/instalando-gearman-y-su-extension-php-en-centos-5-2/</link>
		<comments>http://blog.theinit.com/2012/02/06/instalando-gearman-y-su-extension-php-en-centos-5-2/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 09:14:10 +0000</pubDate>
		<dc:creator>jmarti</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Destacados]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[Utilidades]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[gearman]]></category>
		<category><![CDATA[hilos]]></category>
		<category><![CDATA[tareas paralelas]]></category>
		<category><![CDATA[threads]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=1177</guid>
		<description><![CDATA[En un post anterior os comentábamos como instalar Gearman y su extensión PHP en ubuntu, ya que existía un problema de compatibilidades de librerías. En CentOS también ocurre, ya que la versión que hay en EPEL de gearman es la 0.14. Por lo tanto, se recomienda descargar gearman e instalar. Pero al hacerlo, nos encontraremos...<a href="http://blog.theinit.com/2012/02/06/instalando-gearman-y-su-extension-php-en-centos-5-2/" class="read"> Continuar </a>]]></description>
			<content:encoded><![CDATA[<p>En un post anterior os <a title="Instalando Gearman y su extensión PHP en Ubuntu" href="http://blog.theinit.com/2011/12/13/instalando-distribuidor-procesos-gearman-php-ubuntu/" target="_blank">comentábamos como instalar Gearman y su extensión PHP en ubuntu</a>, ya que existía un problema de compatibilidades de librerías.</p>
<p>En CentOS también ocurre, ya que la versión que hay en EPEL de gearman   es   la 0.14. Por lo tanto, se recomienda descargar gearman e instalar.</p>
<p>Pero al hacerlo, nos encontraremos con un problema que también nos hemos encontrado con Ubuntu:</p>
<p><pre>checking Boost headers version >=1.39.0...no
 configure: error: cannot find Boost headers version >=1.39.0</pre></p>
<p>El problema aquí es que la versión de boost en CentOS 5 es la 1.33, y por tanto, no nos vale para Gearman.</p>
<p>Para resolverlo: </p>
<p>- Añadir el repositorio EPEL si no lo tenemos ya <a href="http://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F" target="_blank">(instrucciones aquí)</a></p>
<p>- Instalar boost141 boost141-devel mediante yum (yum install boost141-devel boost141)</p>
<p>Si ahora intentamos ejecutar &#8220;configure&#8221;; nos dará todavía el mismo    error,  y es que boost141 se instala en otra ruta. Se puede solucionar    gracias  al <a href="http://groups.google.com/group/gearman/browse_thread/thread/fa552d98db87b5cf/2e6205a362f8b773?lnk=gst&amp;q=boost141#2e6205a362f8b773" target="_blank">mail de google-groups localizado aquí. </a></p>
<p>Además de lo indicado, yo tuve que ir a la carpeta /usr/lib/boost141 y copiar todo su contenido a la carpeta /usr/lib para que lo encontrara el configure.</p>
<p>¡ Esperamos que os funcione !</p>
 <img src="http://blog.theinit.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1177" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2012/02/06/instalando-gearman-y-su-extension-php-en-centos-5-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Phonegap, turbo desarrollo de aplicaciones móviles.</title>
		<link>http://blog.theinit.com/2012/01/31/phonegap-turbo-desarrollo-de-aplicaciones-moviles/</link>
		<comments>http://blog.theinit.com/2012/01/31/phonegap-turbo-desarrollo-de-aplicaciones-moviles/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 15:10:04 +0000</pubDate>
		<dc:creator>afernandez</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Destacados]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Utilidades]]></category>
		<category><![CDATA[agile mobile application development]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[Phonegap]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=1221</guid>
		<description><![CDATA[¿Qué es Phonegap? Sencillo, Phonegap es un framework para desarrollar aplicaciones móviles que es un claro sinónimo de sencillo. Basándose en tecnologías como HTML, CSS, Javascript, JQuery o Sencha Touch entre otras podremos realizar nuestras aplicaciones móviles en muy poco tiempo, todo depende de los conocimientos de programación web de los que dispongas, desde luego...<a href="http://blog.theinit.com/2012/01/31/phonegap-turbo-desarrollo-de-aplicaciones-moviles/" class="read"> Continuar </a>]]></description>
			<content:encoded><![CDATA[<h2 style="text-align: justify;">¿Qué es Phonegap?</h2>
<p style="text-align: justify;">Sencillo, Phonegap es un framework para desarrollar aplicaciones móviles que es un claro sinónimo de sencillo. Basándose en tecnologías como HTML, CSS, Javascript, <a href="http://jquerymobile.com/">JQuery</a> o <a href="http://www.sencha.com/products/touch">Sencha Touch</a> entre otras podremos realizar nuestras aplicaciones móviles en muy poco tiempo, todo depende de los conocimientos de programación web de los que dispongas, desde luego la curva de aprendizaje de Javascript o HTML siempre son mucho menos pronunciadas que aprender <a href="http://developer.apple.com/technologies/ios/cocoa-touch.html">Cocoa</a> y <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html">Objetive C</a>.</p>
<div class="mceTemp mceIEcenter" style="text-align: justify;">
<dl id="attachment_1254" class="wp-caption aligncenter" style="width: 664px;">
<dt class="wp-caption-dt"><a href="http://blog.theinit.com/wp-content/uploads/2012/01/build4.png"><img class="size-full wp-image-1254" title="Phonegap" src="http://blog.theinit.com/wp-content/uploads/2012/01/build4.png" alt="Phonegap" width="654" height="290" /></a></dt>
<dd class="wp-caption-dd">Phonegap</dd>
</dl>
</div>
<h2 style="text-align: justify;">¿Qué hace?</h2>
<p style="text-align: justify;">Este conjunto de herramientas, porta casi cualquier código HTML, CSS, Javascript y demás en código nativo listo para compilar en el SDK. Abstrayendo al programador de aprender código nuevo y/o más complejo, agilizando así el desarrollo y el mantenimiento de las aplicaciones.</p>
<h2 style="text-align: justify;">¿Cómo?</h2>
<p style="text-align: justify;">Phonegap basa todo su potencial en un fichero javascript y una librería que se encargan de hacer el port de un lenguaje a otro. Aparte, dispone de varias API´s para poder interactuar con elementos nativos del dispositivo como la cámara de fotos o vídeo, el acelerómetro, las redes, etc. Si queremos usar los elementos propios de la interfaz gráfica del SO (pj: En iOS los navigation tool bar o los tab bars) también es posible acceder a los mismos mediante la instalación de plugins como NativeControls.</p>
<h2 style="text-align: justify;">¿En qué me beneficia?</h2>
<p style="text-align: justify;">El tiempo de desarrollo es menor, bastante menor. Posiblemente sea más sencillo encontrar un programador web que un programador de iOS o Android. Es más probable disponer de un trabajador en plantilla que pueda desarrollar código HTML, Javascript y JQuery.<br />
Y por último, pero no por ello menos importante, podremos disponer de una web basada en la aplicación móvil sin muchas dificultades o portar un proyecto web a aplicación móvil en tiempo récord.</p>
<h2 style="text-align: justify;">¿Es fácil de usar?</h2>
<p style="text-align: justify;">Sí. Necesitarás bajarte el SDK correspondiente a la plataforma para la que estés desarrollando, yo pondré por ejemplo Android e iOS que son con las que he estado trabajando, así que, Eclipse y XCode 4  respectivamente. En el caso de eclipse podremos descargarnos el siguiente plugin:</p>
<blockquote><p>https://svn.codespot.com/a/eclipselabs.org/mobile-web-development-with-phonegap/tags/r1.2/download</p></blockquote>
<p style="text-align: justify;">Esto nos generará un icono para poder realizar proyectos con phonegap de manera sencilla, dándonos la posibilidad de introducir las librerías de JQuery o Sencha directamente. Por defecto nos dirá para usar una versión que el plugin considera la última para crear el proyecto, si no estamos de acuerdo, siempre podremos introducir el Path de fichero de Phonegap que nosotros queramos.</p>
<p style="text-align: justify;">En el caso del XCode, cuando nos descargamos los archivos de la web de Phonegap, tendremos en la carpeta de iOS un .dmg que nos instalará el plugin directamente en el XCode, con esto cuando creemos nuestra aplicación usaremos la opción &#8220;Phonegap Based Aplication&#8221;.</p>
<p style="text-align: justify;">En ambos casos es necesaria una caperta &#8220;www&#8221; en el proyecto donde meteremos nuestros ficheros .html, .css y .js así como el fichero phonegap-version.js.</p>
<p style="text-align: justify;"><a href="http://www.youtube.com/watch?v=E0UV5i5jY50&amp;#038">Video oficial de Phonegap @ YouTube</a></p>
<h2 style="text-align: justify;">Venga, va&#8230; ¿No serás comercial de Phonegap, no?</h2>
<p style="text-align: justify;">La verdad es que no. Como siempre, no es oro todo lo que reluce y Phonegap tiene sus carencias. En principio no tiene trazas, y hacer debug de una app móvil se puede convertir en un verdadero incordio por mucho &#8220;console.log()&#8221; o &#8220;alert()&#8221; que tengamos en javascript.<br />
Por otro lado Phonegap es rápido, pero código puramente nativo es más rápido aún.</p>
<p style="text-align: justify;">Por último, si nuestro proyecto es de una complejidad muy elevada, deberíamos de plantearnos si usar este framework o no, ya que las API´s se nos podrían quedar algo limitadas, como por ejemplo el uso de la cámara del dispositivo u controles nativos específicos a los cuales no podamos acceder mediante los plugins de terceros.</p>
<h2 style="text-align: justify;">¿Existe alguna alternativa?</h2>
<p style="text-align: justify;">Si nos ponemos un poco frente a Google, encontraremos AppGeiser o Titanum. Yo personalmente me quedo con Phonegap ya que el resultado que nos está dando es muy satisfactorio.<br />
<a href="http://blog.theinit.com/wp-content/uploads/2012/01/titanium_logo.png"><img class="aligncenter size-full wp-image-1268" title="titanium_logo" src="http://blog.theinit.com/wp-content/uploads/2012/01/titanium_logo.png" alt="" width="175" height="148" /></a></p>
<blockquote>
<p style="text-align: center;"><a href="http://www.appcelerator.com/products//">Appcelerator Titanium</a></p>
</blockquote>
<p style="text-align: justify;"><a href="http://blog.theinit.com/wp-content/uploads/2012/01/appsgeyser_log_beta.png"><img class="aligncenter size-full wp-image-1269" title="appsgeyser_log_beta" src="http://blog.theinit.com/wp-content/uploads/2012/01/appsgeyser_log_beta.png" alt="" width="247" height="61" /></a></p>
<blockquote>
<p style="text-align: center;"><a href="http://www.appsgeyser.com/">AppGeyser</a></p>
</blockquote>
<p style="text-align: justify;">¿Conocéis algún otro framework? ¿Habéis trabajado con Phonegap o cualquier otra herramienta de este tipo? Cuéntanos tus experiencias con este tipo de herramientas en los comentarios.</p>
<p style="text-align: justify;">Un saludo!</p>
 <img src="http://blog.theinit.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1221" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2012/01/31/phonegap-turbo-desarrollo-de-aplicaciones-moviles/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>AB, duelo al sol con Apache HTTP Server</title>
		<link>http://blog.theinit.com/2012/01/20/apache-benchmark-ab-rendimiento/</link>
		<comments>http://blog.theinit.com/2012/01/20/apache-benchmark-ab-rendimiento/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 07:50:47 +0000</pubDate>
		<dc:creator>ggaray</dc:creator>
				<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[Utilidades]]></category>
		<category><![CDATA[sistemas]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=1232</guid>
		<description><![CDATA[Siguiendo con las pruebas de rendimiento de los entornos que tenemos entre manos, y una vez que JMeter ya nos ha dado cierta tranquilidad en cuanto a los contenedores de aplicaciones, ahora toca poner a prueba al servidor HTTP Apache, que estará delante de los primeros (si eso puede ser posible) en la arquitectura de...<a href="http://blog.theinit.com/2012/01/20/apache-benchmark-ab-rendimiento/" class="read"> Continuar </a>]]></description>
			<content:encoded><![CDATA[<p>Siguiendo con las pruebas d<a href="http://blog.theinit.com/wp-content/uploads/2012/01/images.jpeg"><img class="alignleft size-full wp-image-1234" title="images" src="http://blog.theinit.com/wp-content/uploads/2012/01/images.jpeg" alt="" width="257" height="196" /></a>e rendimiento de los entornos que tenemos entre manos, y una vez que <a title="Jmeter: Pruebas de carga en páginas logueadas" href="http://blog.theinit.com/2011/12/28/tutorial-jmeter-login-cookie-variabl/" target="_blank">JMeter ya nos ha dado cierta tranquilidad</a> en cuanto a los contenedores de aplicaciones, ahora toca poner a prueba al servidor HTTP Apache, que estará delante de los primeros (si eso puede ser posible) en la arquitectura de red y por tanto tendrá que soportar todas las peticiones que luego se derivarán a cada contenedor, así como su respuesta.</p>
<p>Para los tests, hemos elegido a &#8220;ab&#8221;, que como ya se tiene directamente en Ubuntu, parecía la opción más &#8220;normal&#8221;.</p>
<p>Si bien es muy sencillo de usar, <a title="AB Apache benchmarking" href="http://httpd.apache.org/docs/2.0/programs/ab.html" target="_blank">os dejo el enlace a su página oficial</a>, donde podéis consultar el detalle de cada opción.</p>
<p>Nosotros hemos tirado la siguiente prueba:</p>
<p>ab -n 10000 -c 1000 <a href="http://vitallogistics.es/">http://vitallogistics.es/</a></p>
<p>Es decir, hemos tirado un total de 10000 peticiones, con 1000 de ellas concurrentes, con un ssh abierto al servidor por lo que pudiera pasar.</p>
<p>Los resultados que nos da ab son los siguientes:</p>
<p><em>This is ApacheBench, Version 2.3 &lt;$Revision: 655654 $&gt;<br />
Copyright 1996 Adam Twiss, Zeus Technology Ltd,       <a href="http://www.zeustech.net/">http://www.zeustech.net/</a><br />
Licensed to The Apache Software Foundation, <a href="http://www.apache.org/">http://www.apache.org/</a><br />
</em><br />
<em> Benchmarking vitallogistics.es (be patient)<br />
Completed 1000 requests<br />
Completed 2000 requests<br />
Completed 3000 requests<br />
Completed 4000 requests<br />
Completed 5000 requests<br />
Completed 6000 requests<br />
Completed 7000 requests<br />
Completed 8000 requests</em><br />
<em> Completed 9000 requests<br />
Completed 10000 requests<br />
Finished 10000 requests</em></p>
<p><em>Server Software:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Apache/2.2.3<br />
Server Hostname:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vitallogistics.es<br />
Server Port:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 80</em></p>
<p><em>Document Path:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /<br />
Document Length:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 55 bytes</em></p>
<p><em> </em></p>
<p><em>&nbsp;</em></p>
<p><em>&nbsp;</em></p>
<p><em>Concurrency Level:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000<br />
Time taken for tests:&nbsp;&nbsp; 73.232 seconds<br />
Complete requests:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10000<br />
Failed requests:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
Write errors:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
Non-2xx responses:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </em><em>10000<br />
Total transferred:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4890000 bytes<br />
HTML transferred:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 550000 bytes<br />
Requests per second:&nbsp;&nbsp;&nbsp; 136.55 [#/sec] (mean)<br />
Time per request:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7323.236 [ms] (mean)<br />
Time per request:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7.323 [ms] (mean, across all concurrent       requests)<br />
Transfer rate:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 65.21 [Kbytes/sec] received</em></p>
<p><em>Connection Times (ms)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; min&nbsp; mean[+/-sd] median&nbsp;&nbsp; max<br />
Connect:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24&nbsp; 817 2848.3&nbsp;&nbsp;&nbsp;&nbsp; 51&nbsp;&nbsp; 25652<br />
Processing:&nbsp;&nbsp;&nbsp; 24 1271 3818.2&nbsp;&nbsp;&nbsp;&nbsp; 89&nbsp;&nbsp; 59049<br />
Waiting:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24 1249 3763.0&nbsp;&nbsp;&nbsp;&nbsp; 89&nbsp;&nbsp; 59049<br />
Total:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 53 2088 4879.3&nbsp;&nbsp;&nbsp; 185&nbsp;&nbsp; 62111</em></p>
<p><em> </em></p>
<p><em>&nbsp;</em></p>
<p><em>Percentage of the requests served within a certain time (ms)<br />
&nbsp; 50%&nbsp;&nbsp;&nbsp; 185<br />
&nbsp; 66%&nbsp;&nbsp;&nbsp; 420<br />
&nbsp; 75%&nbsp;&nbsp;&nbsp; 931</em><br />
<em> &nbsp; 80%&nbsp;&nbsp; 3126<br />
&nbsp; 90%&nbsp;&nbsp; 7301<br />
&nbsp; 95%&nbsp; 11156<br />
&nbsp; 98%&nbsp; 14142<br />
&nbsp; 99%&nbsp; 24905<br />
&nbsp;100%&nbsp; 62111 (longest request)</em></p>
<p>Es decir, nos da un buen número de datos generales, como el tiempo totales invertidos en la prueba, el tamaño total descargado, número de errores, tiempos medios de respuesta y velocidad media de la respuesta .</p>
<p>Pero lo interesante, creemos, de interpretar, viene al final.</p>
<p>Podemos ver en qué parte de la petición se está consumiendo qué tiempo. Si es en la conexión y procesamiento de la petición, puede que nuestro equipo sea el cuello de botella (desde donde hacemos las peticiones), pero si el tiempo está en la espera, entonces tenemos un potencial de mejora en la configuración del apache.</p>
<p>Finalmente, podemos ver qué porcentaje de peticiones han sido atendidas en un determinado tiempo. Tiene una interpretación muy interesante. En nuestro caso, por ejemplo, el 75% de las peticiones se respondieron en menos de un segundo, un 95% antes de once segundos (ya es mucho, pero en un escenario de 1000 concurrentes significa que a 950 se les responde antes de 11 segundos) y sólo a un 2% se les responde en más de catorce.</p>
<p>Un ejercicio paralelo interesante mientras se hace la prueba es tirar un &#8220;top&#8221; en el servidor de destino para ver los hilos del apache multiplicarse para atender las peticiones, y ver si el consumo de memoria se acerca al barranco del <a href="http://es.wikipedia.org/wiki/Espacio_de_intercambio" target="_blank">swapping</a>, donde tendremos un descenso acusado del rendimiento (añade RAM para evitarlo), o si estamos llevando al límite a la CPU (añade otra&#8230;).</p>
<p>En fin, que una prueba sencilla, de un par de minutos, puede darnos suficiente información como para dejar tranquilos a los clientes o realizar acciones preventivas antes de llegar a tener caídas de rendimiento significativas sin control.</p>
<p>¿Hacéis pruebas de este tipo habitualmente sobre vuestros entornos de producción o son los departamentos de sistemas de vuestros clientes quienes se encargan? ¿Tenéis algún software de testing similar? ¿Es el rendimiento final algo que se tiene en cuenta en vuestros desarrollos o suele quedar para el mantenimiento / fase 2?</p>
 <img src="http://blog.theinit.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1232" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2012/01/20/apache-benchmark-ab-rendimiento/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jmeter: Pruebas de carga en páginas logueadas</title>
		<link>http://blog.theinit.com/2011/12/28/tutorial-jmeter-login-cookie-variabl/</link>
		<comments>http://blog.theinit.com/2011/12/28/tutorial-jmeter-login-cookie-variabl/#comments</comments>
		<pubDate>Wed, 28 Dec 2011 21:58:50 +0000</pubDate>
		<dc:creator>ggaray</dc:creator>
				<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Utilidades]]></category>
		<category><![CDATA[jmeter]]></category>
		<category><![CDATA[pruebas de carga]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=1199</guid>
		<description><![CDATA[Necesitábamos, para una nueva aplicación de una conocida empresa con millones de usuarios, testear el entorno de producción para evitar el crujir y rechinar de dientes cuando tengamos chorrocientos accesos simultáneos. Para ello, tras las habituales y típicas tareas de generación de índices en la base de datos, lo que nos ha permitido agilizar los...<a href="http://blog.theinit.com/2011/12/28/tutorial-jmeter-login-cookie-variabl/" class="read"> Continuar </a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.theinit.com/wp-content/uploads/2011/12/teststres.jpg"><img class="alignleft size-medium wp-image-1209" title="teststres" src="http://blog.theinit.com/wp-content/uploads/2011/12/teststres-300x168.jpg" alt="" width="300" height="168" /></a>Necesitábamos, para una nueva aplicación de una conocida empresa con millones de usuarios, testear el entorno de producción para evitar el crujir y rechinar de dientes cuando tengamos chorrocientos accesos simultáneos.</p>
<p>Para ello, tras las habituales y típicas tareas de generación de índices en la base de datos, lo que nos ha permitido agilizar los tiempos únicos de acceso a diferentes pantallas (esto daría para otro post, si me animáis me animo&#8230;), nos encontramos con la necesidad de medirnos y hacer previsiones de cuánta carga podremos soportar. Es decir, más allá de lentitudes de acceso de datos, ¿el servidor aguantará? ¿a cuántos usuarios concurrentes podemos dar servicio? ¿estamos exprimiendo todo lo que podemos a la máquina?</p>
<p>Estas y otras preguntas surgen naturalmente ante el alud que esperamos tener (seguro que nos va bien, equipo!) en forma de requests a responder; y una de las formas de responderla utiliza esta herramienta de Apache que se llama <a href="http://jmeter.apache.org" target="_blank">Jmeter</a>.</p>
<p>Si bien el funcionamiento, una vez hechas un par de cosas, es bastante sencillo, los inicios siempre son difíciles, de manera que paso a comentaros las diferentes fuentes de información que hemos utilizado para llevar a buen puerto nuestras pruebas de carga. Si bien la <a href="http://jmeter.apache.org/usermanual/index.html" target="_blank">documentación oficial</a> es estupenda, se queda un poco a medias cuando te enfrentas con el programa de nuevas, como en esos libros de cocina que en realidad saben previamente la conversión al sistema métrico decimal de otras curiosas unidades como: pizca, vaso, puñado, etc&#8230; si se me entiende la analogía.</p>
<p>Pues bien, lo primero que hacemos es instalarnos el cliente. Queda fuera del objetivo de este post, pero básicamente, descargar y siguiente, siguiente, siempre y cuando tengamos la versión 6 de java (¿de qué pensabais que era la &#8220;J&#8221; de &#8220;Jmeter&#8221;?). Si a alguien le interesa, se puede descargar directamente con apt-get en ubuntu.</p>
<p>Una vez instalado, arrancamos y vemos una pantalla tal que así:</p>
<p><a href="http://blog.theinit.com/wp-content/uploads/2011/12/Apache-JMeter-2.3.4_3761.png"><img class="aligncenter size-medium wp-image-1205" title="Apache JMeter (2.3.4)_376" src="http://blog.theinit.com/wp-content/uploads/2011/12/Apache-JMeter-2.3.4_3761-300x167.png" alt="" width="300" height="167" /></a></p>
<p>Fría e inhóspita, esperando a que comencemos a configurar. Inicialmente, un nombre para el proyecto, definir variables globales, y la posibilidad de incluir librerías externas (para ejecutar algo que hayamos programado nosotros, por ejemplo, dentro de un plan).</p>
<p>Como asusta un poco, los primeros pasos los podemos ver en el siguiente vídeo y luego comentamos su contenido:</p>
<p><iframe src="http://player.vimeo.com/video/4025715?title=0&amp;byline=0&amp;portrait=0" frameborder="0" height="225" width="400"></iframe></p>
<p><a href="http://vimeo.com/4025715">Apache JMeter &#8211; The basics tutorial</a> from <a href="http://vimeo.com/user1381705">Jörg Erdmenger</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>Básicamente, nos enseña a crearnos un &#8220;grupo de hilos&#8221; (conjunto de tests a ejecutar) sobre un &#8220;plan de pruebas&#8221; (se pueden cambiar todos estos nombres para organizarlos por proyecto, etc&#8230;), para incluir en él diferentes tests y definir cómo se van a ejecutar. Podemos elegir el número de hilos (accesos concurrentes), <a href="http://opendoorhispano.blogspot.com/2009/09/consejos-jmeter.html" target="_blank">tiempo de &#8220;ramp-up&#8221;</a> y planificar la ejecución para una hora determinada (si no la queremos hacer en el momento).</p>
<p>El que hemos utilizado esta vez es el &#8220;HTTP Request&#8221;, porque vamos a testear el rendimiento de una aplicación web, pero los hay de todo tipo disponibles según versiones (desde conexiones a bases de datos hasta consumición de web-services).</p>
<p>Le damos un nombre, le ponemos la ruta (path) que queremos sobre el servidor (nombre o IP) en cuestión (nunca mejor dicho), y listo, ya podemos correr el plan de pruebas. Opcionalmente, podemos incluir parámetros a enviar por get o post (incluso ficheros adjuntos), esta parte es bastante intuitiva.</p>
<p>Dentro de cada test, nos creamos un elemento de aserción que queramos. Esto determina cuándo una prueba se considera buena o no. Podemos poner desde aserciones de respuesta (un 200 OK, el contenido del resultado contiene la palabra &#8220;OK&#8221; o &#8220;no contiene 404&#8243;, etc&#8230;), que es la que hemos usado nosotros, pero nos ha quedado la gusa de probar las aserciones HTML, XML, XPath y MD5, que permiten, en cada caso, inspeccionar el documento html de respuesta como html, xml, una determinada ruta XPath, y el MD5 de la página resultante. Esta última me resulta especialmente curiosa (es esa página, y SÓLO ESA!!).</p>
<p>Bien, pero demasiado manual. Lo más recomendable es generarnos, además,  dentro de los elementos de configuración, unos &#8220;valores por defecto para  peticiones HTTP&#8221;. De esta manera, podemos configurar parámetros como el  servidor, el puerto, protocolo, etc de una vez y reutilizarlos para  todas las peticiones que tengamos. Así, por ejemplo, será fácil  cambiarlo para hacer el mismo test en diferentes máquinas de un  balanceo, o para entornos de desarrollo, pre-producción y producción,  etc&#8230;</p>
<p>Lo mismo ocurre con un &#8220;manager de cabeceras http&#8221;, que permite identificarnos como un determinado navegador (si la aplicación en cuestión tiene comportamientos diferentes según este parámetro), con un determinado idioma, etc&#8230;</p>
<p>Muy bien, corremos el test&#8230; ¿y? ¿La primera en la frente? Bueno, en realidad no, pero si no creamos un &#8220;listener de resultados&#8221;, jmeter ejecuta, pero no muestra. Lo generamos. Por ejemplo un &#8220;informe agregado&#8221;, que nos mostrará cada uno de los tests con un porcentaje de éxito (en función de la aserción indicada en cada test), tiempos de carga, etc&#8230; Podemos generarnos listeners/informes de muchos tipos, con gráficas de lo más completo sólo con incluirlos dentro del plan.</p>
<p>Hasta aquí nada que no se diga en el vídeo, de manera que vamos a lo interesante. Nuestra aplicación, como casi todas, tiene un login y prácticamente el 95% de las páginas están ocultas tras él, de manera que necesitamos, por este orden:</p>
<p>- Hacer login; que seguro ya adivináis que se hace enviando los parámetros user/pass a la url que corresponda.</p>
<p>- Mantener el login para los accesos a las páginas ocultas. Es decir, la session.</p>
<p>Para el primer punto, ciertamente enviamos las credenciales, pero como se trata de una aplicación sobre <em>Grails</em> con <em>Spring Security</em>, se deben enviar <em>j_username</em> y <em>j_password</em> a la url &#8220;<em>/contexto/j_spring_security_check</em>&#8221; por POST <strong>o no funcionará</strong>. Spring es así de listo, así que ojo a cambiar el método de GET a POST.</p>
<p>Para el segundo punto, debemos mantener el login como una cookie de session, por lo que necesitamos un nuevo elemento de configuración: Gestor de Cookies. Simplemente con ponerlo en el proyecto, listo, él se encargará de recopilar los datos que nos devuelva el login (la cookie de session) y mantenerlo para las páginas que lo necesiten. No es necesario incluir nada, a menos que tengamos una cookie fija, especial para las pruebas o algo así.</p>
<p>Si alguien se lo ha preguntado, todo tiene una estructura jerárquica, de manera que cada elemento influye en sus hermanos/padres, pero no em sus tíos. Es decir, si pongo un elemento de valores por defecto DEBAJO de un test, dichas variables sólo afectarán a dicho test, y no a los demás. Así pues, el gestor de cookies debería ir al mismo nivel que los tests.</p>
<p>Para finalizar, en nuestros tests, necesitamos generar datos dinámicos para enviar como parámetros, de manera que necesitamos un nuevo elemento de configuración &#8220;contador&#8221; que nos permita tener valores tipo &#8220;midato0001&#8243;, &#8220;midato0002&#8243;, etc&#8230; Como lo queremos para todo el plan, lo pondremos al mismo nivel que el resto. En el contador podemos configurar un nombre, un valor inicial y un incremento hasta un valor final. En nuestro caso no hemos necesitado ningún formato especial, pero si lo necesitáis, se define como los de la clase <a href="http://docs.oracle.com/javase/1.5.0/docs/api/java/text/DecimalFormat.html" target="_blank">DecimalFormat</a>.</p>
<p>Ahora estaríais deseosos de incluir la variable en el valor del campo en cuestión (&#8220;user${contador}&#8221;), pero no. Resulta que no funciona. En <a href="http://sheldonrules.blogspot.com/2011/03/jmeter-variables-compuestas-con-counter.html" target="_blank">esta página</a> lo explican bastante bien, tiene que ver con cuándo se declaran e inicializan las variables en el momento de la ejecución. La forma de hacerlo es con un elemento nuevo, un pre-procesador de variables de usuario, que se inicializan cuando las variables del contador ya están definidas e inicializadas. Ahí sí funciona la original idea.</p>
<p>Con lo cual, ya tendremos el plan preparado para acceder con distintos logins / passwords generados dinámicamente (user01/pass01, etc&#8230;) a pantallas que requieren logueo previo.</p>
<p>Al final, el plan ha quedado de esta forma:</p>
<p><a href="http://blog.theinit.com/wp-content/uploads/2011/12/Selección_382.png"><img class="aligncenter size-medium wp-image-1208" title="Selección_382" src="http://blog.theinit.com/wp-content/uploads/2011/12/Selección_382-300x159.png" alt="" width="300" height="159" /></a></p>
<blockquote>
<p style="text-align: center;"><strong>¡Mission accomplished!</strong></p>
</blockquote>
<p>¿Os habéis encontrado con algún problema similar en Jmeter? ¿No os pasa siempre que todos los how-to, tutoriales, etc parecen recopilaciones para gente experimentada con la herramienta en cuestión y lo más básico se queda en el aire?</p>
<p>¿Nos recomendáis alguna otra herramienta que tenga menos de estos pequeños trucos que tener en cuenta?</p>
 <img src="http://blog.theinit.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1199" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2011/12/28/tutorial-jmeter-login-cookie-variabl/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Montar un disco EBS en una Amazon AMI de EC2</title>
		<link>http://blog.theinit.com/2011/12/27/montar-un-disco-ebs-en-una-amazon-ami-ec2/</link>
		<comments>http://blog.theinit.com/2011/12/27/montar-un-disco-ebs-en-una-amazon-ami-ec2/#comments</comments>
		<pubDate>Tue, 27 Dec 2011 17:54:21 +0000</pubDate>
		<dc:creator>jmarti</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[ami]]></category>
		<category><![CDATA[ebs]]></category>
		<category><![CDATA[ec2]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mount]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=1191</guid>
		<description><![CDATA[Una de las cosas más irritantes que encontramos en Amazon EBS es que el disco no está directamente &#8220;disponible&#8221; en una máquina EC2 cuando se attachea a ésta. Se puede crear un EBS a través del panel de control, y asignarlo a una máquina de forma manual, pero luego, hay que entrar manualmente a la...<a href="http://blog.theinit.com/2011/12/27/montar-un-disco-ebs-en-una-amazon-ami-ec2/" class="read"> Continuar </a>]]></description>
			<content:encoded><![CDATA[<p>Una de las cosas más irritantes que encontramos en Amazon EBS es que el disco no está directamente &#8220;disponible&#8221; en una máquina EC2 cuando se attachea a ésta. Se puede crear un EBS a través del panel de control, y asignarlo a una máquina de forma manual, pero luego, hay que entrar manualmente a la máquina y crear el filesystem y montarlo, del siguiente modo:</p>
<p>- Suponiendo directorio donde se montará &#8220;/data&#8221;, y de tipo ext4</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>sudo mkfs -t ext4 /dev/xvdf</li><li>sudo mkdir /data</li><li>sudo mount /dev/xvdf /data</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Esto realmente no cuesta mucho, pero a veces suele ser una lata, y sobretodo, si se quiere automatizar la creación de las máquinas, de los EBS y de su montaje.</p>
<p>Para resolver esto, los chicos de Turnkey, han generado un proyecto EBSmount, que permite hacerlo de forma automática.<br />
Más info en: <a href="http://www.turnkeylinux.org/blog/ebsmount">http://www.turnkeylinux.org/blog/ebsmount</a></p>
<p>Entre las funcionalidades de esta utilidad, queremos destacar que permite:<br />
- Montar las unidades tan pronto como perciba que están attacheadas.<br />
- Configurar los filesystems que se usarán<br />
- Que se monten en directorios cuyo nombre será unívocamente identificable<br />
- Que se ejecuten hook-scripts al montarse (por ejemplo, para recoger un backup, crear enlace simbólico para un acceso directo, etc.)</p>
 <img src="http://blog.theinit.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1191" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2011/12/27/montar-un-disco-ebs-en-una-amazon-ami-ec2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando Gearman y su extensión PHP en Ubuntu</title>
		<link>http://blog.theinit.com/2011/12/13/instalando-distribuidor-procesos-gearman-php-ubuntu/</link>
		<comments>http://blog.theinit.com/2011/12/13/instalando-distribuidor-procesos-gearman-php-ubuntu/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 14:21:53 +0000</pubDate>
		<dc:creator>jmarti</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[Utilidades]]></category>
		<category><![CDATA[asincrono]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[ec2]]></category>
		<category><![CDATA[gearman]]></category>
		<category><![CDATA[hilos]]></category>
		<category><![CDATA[paralelas]]></category>
		<category><![CDATA[threads]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=1161</guid>
		<description><![CDATA[Gearman es un distribuidor de procesos. La verdad es que es una aplicación / programa / proceso que no ha llamado mucho la atención, y que silenciosamente, ha conseguido resolver una problemática bastante común de forma muy elegante. Gearman consigue distribuir procesos que se le encolan o se le piden a través de clientes, a...<a href="http://blog.theinit.com/2011/12/13/instalando-distribuidor-procesos-gearman-php-ubuntu/" class="read"> Continuar </a>]]></description>
			<content:encoded><![CDATA[<p>Gearman es un distribuidor de procesos. La verdad es que es una aplicación / programa / proceso que no ha llamado mucho la atención, y que silenciosamente, ha conseguido resolver una problemática bastante común de forma muy elegante. Gearman consigue distribuir procesos que se le encolan o se le piden a través de clientes, a sus workers, de una forma distribuida, escalable y sin failure-points.</p>
<p><span id="more-1161"></span></p>
<div class="wp-caption alignright" style="width: 232px"><a href="http://gearman.org"><img title="Gearman" src="http://gearman.org/lib/tpl/default/images/gearman80_title.gif" alt="Gearman" width="222" height="37" /></a>
<p class="wp-caption-text">Gearman in gearman.org</p>
</div>
<p>Estamos trabajando para un proyecto con Gearman, y algunas pruebas las hemos lanzado en nuestros servidores locales Ubuntu 11.04 y Ubuntu 11.10. Sin embargo, la instalación nos ha fallado estrepitosamente, y sin mucha mención por internet del error que nos daba. Así que nos hemos lanzado a contarlo a través del blog.</p>
<p>El objetivo era instalar Gearman y la extensión Gearman para PHP.</p>
<p>La primera instalación la hemos podido cumplir sin problemas:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Bash"><div class="devcodeoverflow"><ol><li><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> gearman libgearman-dev</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Sin ningún problema, instalación realizada.</p>
<p>La segunda parte era instalar la extensión Gearman para PHP:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Bash"><div class="devcodeoverflow"><ol><li><span style="color: #c20cb9; font-weight: bold;">sudo</span> pecl <span style="color: #c20cb9; font-weight: bold;">install</span> gearman</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Y el fatídico error que nos devuelve el phpize es:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>checking for gearman_client_set_context in -lgearman... yes</li><li>checking for gearman_worker_set_server_option in -lgearman... no</li><li>configure: error: libgearman version 0.21 or later required</li><li>ERROR: `/tmp/pear/temp/gearman/configure' failed</li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Con lo que se comprueba, que la versión en los repositorios de Ubuntu son diferentes a la versión que el pecl te intenta instalar.</p>
<p>Así que procedemos a instalar directamente compilando la última versión del repositorio launchpad (en nuestro caso, gearman-1.0.1)</p>
<p>Al descargarlo y hacer el make, nos devuelve este error:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>configure: error: cannot find the flags to link with Boost program_options</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p><a href="https://answers.launchpad.net/gearmand/+question/149856" target="_blank">Que según aquí,</a> nos dice que tenemos que instalar la librería libboost-program-options-dev.</p>
<p>Avisamos que además de libboost-program-options-dev, también nos ha sido necesario instalar uuid-dev.</p>
<p>Una vez realizadas las instalaciones, procedemos al configure, make y make install. Ahora sí, todo funciona perfectamente.</p>
<p>Sin embargo, nos pasa algo curioso, y es que al instalar con APT el gearman, se nos ha quedado en /usr/lib/libgearman.so una librería que hemos tenido que apuntar manualmente a /usr/local/lib/libgearman.so.</p>
<p>Ahora sí, si ejecutamos gearman y gearmand, funciona perfectamente.</p>
<p>Una vez instalado el servidor, instalamos la extensión PHP como indicábamos anteriormente, y si todo funciona bien, leeréis las últimas líneas:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Bash"><div class="devcodeoverflow"><ol><li><span style="color: #c20cb9; font-weight: bold;">sudo</span><span style="color: #000000; font-weight: bold;">&amp;</span>nbsp;pecl<span style="color: #000000; font-weight: bold;">&amp;</span>nbsp;<span style="color: #c20cb9; font-weight: bold;">install</span><span style="color: #000000; font-weight: bold;">&amp;</span>nbsp;gearman</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>install ok: channel://pecl.php.net/gearman-1.0.1</li><li>configuration option &quot;php_ini&quot; is not set to php.ini location</li><li>You should add &quot;extension=gearman.so&quot; to php.ini</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Felicidades. En posts siguientes os contaremos cómo han ido los procesos en Gearman. Sinceramente, parece una buenísima y sencilla utilidad. Echadle un ojo. Por cierto, ¿utilizáis alguna otra aplicación para el envío, sincronización y distribución de procesos?</p>
<p><strong>ACTUALIZACION</strong>: Si tenéis problemas con que un ubuntu no encuentra las headers de boost necesarias, ejecutad <em>sudo apt-get install libboost-all-dev</em></p>
 <img src="http://blog.theinit.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1161" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2011/12/13/instalando-distribuidor-procesos-gearman-php-ubuntu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Android 4.0 Ice Cream Sandwich</title>
		<link>http://blog.theinit.com/2011/11/23/android-4-0-ice-cream-sandwich/</link>
		<comments>http://blog.theinit.com/2011/11/23/android-4-0-ice-cream-sandwich/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 15:11:32 +0000</pubDate>
		<dc:creator>afernandez</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Destacados]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Ice Cream Sandwich]]></category>
		<category><![CDATA[Nexus]]></category>
		<category><![CDATA[SO]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=1124</guid>
		<description><![CDATA[La madrugada del 19 de octubre Google anunció la nueva versión de Android que al fin conseguiría fusionar la interfaz de los móviles con versiones 2.x y los tablets con versiones 3.x. Esto supone un ahorro de tiempo y código a la hora de desarrollar versiones nuevas para ambos tipos de dispositivos. Apple ya realizó...<a href="http://blog.theinit.com/2011/11/23/android-4-0-ice-cream-sandwich/" class="read"> Continuar </a>]]></description>
			<content:encoded><![CDATA[<p>La madrugada del 19 de octubre Google anunció la nueva versión de Android que al fin conseguiría fusionar la interfaz de los móviles con versiones 2.x y los tablets con versiones 3.x. Esto supone un ahorro de tiempo y código a la hora de desarrollar versiones nuevas para ambos tipos de dispositivos. Apple ya realizó la misma jugada con la versión 4.0 de iOS y ahora le ha tocado a Android.</p>
<p>Esta nueva versión no es solo un lavado de cara a la interfaz de los teléfonos sino también un añadido considerable de nuevas características que hacen de Android un SO aún más codiciado. Realizaremos un repaso por las características y cambios más importantes en esta entrada.</p>
<h2>System Bar y Action Bar</h2>
<p>Android 4.0 aporta unos cuantos botones virtuales en la parte inferior de la pantalla que permite al usuario poder visualizar areas tales como los contactos o las llamadas. Estas están siempre presentes pero se atenúan ante la necesidad de una aplicación de ejecutarse a pantalla completa.<br />
También podremos acceder a otras opciones contextuales de cada aplicaciones mediante la barra situada en la parte superior de la pantalla.</p>
<h2>Voice Control</h2>
<p>Se ha introducido un nuevo motor de introducción de texto por voz, una vez introducido el texto tendremos la posibilidad de añadir las palabras desconocidas al diccionario del teléfono haciendo click sobre las palabras subrayadas.</p>
<div id="attachment_1133" class="wp-caption alignleft" style="width: 178px"><a href="http://blog.theinit.com/wp-content/uploads/2011/11/tasks-lg-250-100.jpg"><img class="size-medium wp-image-1133" src="http://blog.theinit.com/wp-content/uploads/2011/11/tasks-lg-250-100-168x300.jpg" alt="Multitask" width="168" height="300" /></a>
<p class="wp-caption-text">Multitask</p>
</div>
<h2>Multitasking</h2>
<p>Que nuestro dispositivo disponga de multitarea ya no es nada nuevo, pero Google ha conseguido renovar este concepto introduciendo una pequeña preview a modo de captura de pantalla de aquellas aplicaciones que estemos ejecutando en el momento. Esto ya lo vimos en las versiones 3.x de los tablets y es una de las funcionalidades que ha migrado hacia los teléfonos móviles.<br />
De esta manera tenemos una multitarea más visual y agradable con la que navegar entre las aplicaciones.</p>
<h2>Face Unlock</h2>
<p>Es posible acceder a la cámara del dispositivo sin necesidad de desbloquear el terminal, esto nos permite realizar un desbloqueo del mismo usando la herramienta de reconocimiento facial que nos brinda Ice Cream Sandwich. Realmente no se si esta nueva funcionalidad es comoda para usar pero desde luego es bastante curiosa.</p>
<h2>Home Screen folders</h2>
<p>Ahora es posible crear carpeta al estilo iOS arrastrando el icono de una aplicación sobre otra en la pantalla principal de aplicaciones. Desde el punto de vista organizativo deberíais plantearos si os compensa el tener que buscar entre carpetas aquella aplicación que andeis buscando, si usais muchas aplicaciones sería una buena idea.</p>
<h2>Notificaciones</h2>
<p>También se han mejorado las notificaciones, pudiendo visualizarlas desde la pantalla de bloqueo o como tradicionalmente hemos estado haciendo desde la barra de notificaciones en la parte superior de la pantalla.</p>
<h2>Widgets</h2>
<p>Si algo caracteriza a Android son los widgets, es algo que por ahora en iOS no podemos encontrar. En esta nueva versión, se nos permite redimensionarlos y se vuelven más interactivos (controles para la música, navegar entre las tareas, etc.).</p>
<h2>Datos</h2>
<p>En versiones anteriores podríamos encontrar ciertas aplicaciones en el Market que nos ayudaban a tener un control sobre el gasto de datos que teníamos, cuanto tiempo estábamos hablando por teléfono, uso de la batería, etc. Ahora todo ese control pasa a ser nativo de Android, mostrando de una manera muy detalla y con un diseño y acabado estupendos.</p>
<div id="attachment_1135" class="wp-caption aligncenter" style="width: 178px"><a href="http://blog.theinit.com/wp-content/uploads/2011/11/usage-maps-lg-250-100.jpg"><img class="size-medium wp-image-1135" src="http://blog.theinit.com/wp-content/uploads/2011/11/usage-maps-lg-250-100-168x300.jpg" alt="Control sobre los datos" width="168" height="300" /></a>
<p class="wp-caption-text">Control sobre los datos</p>
</div>
<div id="attachment_1134" class="wp-caption aligncenter" style="width: 178px"><a href="http://blog.theinit.com/wp-content/uploads/2011/11/usage-all-lg-250-100.jpg"><img class="size-medium wp-image-1134" src="http://blog.theinit.com/wp-content/uploads/2011/11/usage-all-lg-250-100-168x300.jpg" alt="Control sobre los datos 2" width="168" height="300" /></a>
<p class="wp-caption-text">Control sobre los datos 2</p>
</div>
<h2>Cámara</h2>
<p>Declaraciones por parte de Google afirman que han estado trabajando conjuntamente con Samsung en el apartado de la cámara. Gracias a esta colaboración han podido mejorar toda la interfaz de la aplicación que maneja este apartado. Ahora es posible capturar una imagen, mover la cámara y el dispositivo irá montando las imagenes para obtener una panorámica. Ahora podemos añadir efectos, tenemos también reconocimiento facial y capacidad de compartir con nuestras redes sociales favoritas.</p>
<p>Entre las actualizaciones menores nos encontramos con, mejoras en copiar pegar, registro de información y la posibilidad al fin de realizar capturas de pantallas pulsando la tecla de volumen y el boton de encendido. Los diccionarios y el teclado han sido revisados, se puede ver una mejora en el auto completado o la corrección de palabras.</p>
<h2>Conclusión</h2>
<p>Nos encontramos ante la ultima hornada de Android y eso siempre es bueno. Viene cargada de novedades de las cuales dependiendo de nuestros usos o intereses generales usaremos más o menos. El primer terminal en disponer de este nuevo S.O sera el nuevo Galaxy Nexus que ya se encuentra en el mercado. Todavía se desconoce la lista definitiva de los terminales que actualizaran a esta nueva versión pero de momento el Nexus One se queda fuera y tendrá que recurrir a los cocineros de ROM´s para poder obtener la versión 4.0 de este tan conocido sistema operativo.</p>
 <img src="http://blog.theinit.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1124" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2011/11/23/android-4-0-ice-cream-sandwich/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

