<?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>Frickr.es &#187; Desarrollo</title>
	<atom:link href="http://www.frickr.es/categorias/desarrollo/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.frickr.es</link>
	<description>Tecnología, desarrollo, economía y empresa.</description>
	<lastBuildDate>Wed, 27 Apr 2011 17:53:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Mejorando el rendimiento de Magento</title>
		<link>http://www.frickr.es/2009/07/08/mejorando-el-rendimiento-de-magento-commerce/</link>
		<comments>http://www.frickr.es/2009/07/08/mejorando-el-rendimiento-de-magento-commerce/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 18:24:28 +0000</pubDate>
		<dc:creator>Rodrigo</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[caché]]></category>
		<category><![CDATA[e-commerce]]></category>
		<category><![CDATA[magento]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.frickr.es/?p=202</guid>
		<description><![CDATA[[Actualizado para incluir la instalación de APC (Alternative PHP Caché) y optimizar también la parte PHP de Magento]. Entre los usuarios de software de comercio electrónico (e-commerce) es de sobra conocida la <a href="http://www.magentocommerce.com/product/compare">edición Community de Magento</a>. Lo tiene todo: es potente, modulable, versátil, estéticamente buena, gratis y de código abierto. Pero como todo en esta vida, tiene un gran pero: es bastante más lento que otros sistemas como el cuasi-difunto osCommerce, Zen Cart y similares. La explicación es sencilla: Magento NO es competencia de este tipo de software de carta de compras, sino de software empresarial de miles de euros que corren en servidores igual de caros.]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://www.frickr.es/wp-content/uploads/2009/07/media_logo.png" alt="Magento Logo" title="Magento Logo" width="318" height="100" class="alignnone size-full wp-image-205" /></center></p>
<p><em><strong>Actualizado</strong> para incluir la instalación de APC (Alternative PHP Caché) y optimizar también la parte PHP de Magento.</em></p>
<p>Entre los usuarios de software de comercio electrónico (e-commerce) es de sobra conocida la <a href="http://www.magentocommerce.com/product/compare">edición Community de Magento</a>. Lo tiene todo: es potente, modulable, versátil, estéticamente buena, gratis y de código abierto. Pero como todo en esta vida, tiene un gran pero: es bastante más lento que otros sistemas como el cuasi-difunto osCommerce, Zen Cart y similares. La explicación es sencilla: Magento NO es competencia de este tipo de software de carta de compras, sino de software empresarial de miles de euros que corren en servidores igual de caros.</p>
<p>En mi caso concreto, tengo en inminente estado de producción un servidor dedicado de bajo coste (con Intel Atom) y he mejorado muchísimo el rendimiento general de Magento &#8220;simplemente&#8221; ampliando el tamaño de la caché de MySQL. Aquí os dejo lo que hice:</p>
<h3>Activando y ampliando la caché de MySQL</h3>
<p>Primero comprobamos si la caché para consultas está habilitada en nuestra instalación de MySQL, ejecutando esta consulta (desde phpMyAdmin también vale):</p>
<p><code>SHOW VARIABLES LIKE 'have_query_cache';</code></p>
<p>Que devolverá YES si está correctamente activado.</p>
<pre lang="sql">mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name | Value    |
+------------------+-------+
| have_query_cache | YES   |
+------------------+-------+</pre>
<p>Después comprobamos el tamaño asignado a la caché para queries . Si lo tenemos a cero, entonces está desactivado aunque en el paso anterior se obtuviésemos YES. Ejecutamos:</p>
<p><code>SHOW VARIABLES LIKE 'query_cache_size';</code></p>
<p>Y obtendremos el tamaño asignado en Bytes (por defecto creo que suele estar en 16777216 Bytes = 16 MB):</p>
<pre lang="sql">mysql> SHOW VARIABLES LIKE 'query_cache_size';
+------------------+----------+
| Variable_name | Value       |
+------------------+----------+
| query_cache_size | 16777216 |
+------------------+----------+
1 row in set (0.00 sec)</pre>
<p>En mi caso 16MB de RAM se quedaban escasos y amplié el tamaño a 32MB. Dependiendo del uso, del hardware y de la cantidad de RAM instalada, quizá para muchos sea más conveniente ampliarlo hasta 64MB. No he probado cantidades mayores, pero se comenta que tampoco es conveniente poner más de esta cantidad.</p>
<p>Finalmente, para cambiar el tamaño sólo tenemos que editar el archivo <code>mysql.cnf</code>. En mi máquina Ubuntu está en <code>/etc/mysql/my.cnf</code> y lo edité mediante SSH con <code>nano</code> sin problemas. Debajo de la sección <code>[mysqld]</code> cambiamos:</p>
<p><code>query_cache_size=32M</code></p>
<p>Y reiniciamos MySQL (mysqld), aunque en mi caso parece que cogió las nuevas opciones sin necesidad de reiniciar, el cambio fue instantáneo. Y la mejora, también :jeje:</p>
<h3>Instalación de APC para mejorar el rendimiento de PHP</h3>
<p>APC es una extensión para PHP que mejora el sistema de caché de este lenguaje almacenando el código intermedio (&#8220;opcode&#8221;) sin tener que realizar modificaciones a nuestro código (en este caso, el de Magento). Todo funciona de forma transparente para el usuario y la propio aplicación, aunque en el caso de Magento tendremos que &#8220;avisarle&#8221; de que puede utilizar este sistema como veremos más adelante.</p>
<p>Al igual que para la optimización de MySQL, necesitaremos privilegios de administrador en nuestra máquina y acceso shell (recomiendo SSH) para instalar los paquetes necesarios. APC está disponible en casi todas las distribuciones Linux, pero los pasos a continuación sólo se aplican si utilizas una distro basada en Debian, como por ejemplo Ubuntu (8.04 Hardy en mi caso).</p>
<p>Primero actualizamos los paquetes de las fuentes:</p>
<pre lang="term">sudo apt-get update</pre>
<p>Instalamos los paquetes necesarios (nota: tanto <code>php5-dev</code> como <code>apache2-threaded-dev</code> son únicamente herramientas de desarrollo, no cambiarán ni arruinarán nuestra instalación actual de PHP5 ni Apache):</p>
<pre lang="term">sudo apt-get install php5-dev php-pear apache2-threaded-dev</pre>
<p>Si nos hace esta pregunta, simplemente pulsamos ENTER:</p>
<pre lang="term"> 1. Use apxs to set compile flags (if using APC with Apache)? : yes
1-1, 'all', 'abort', or Enter to continue: </pre>
<p>Y por último compilamos el módulo APC ejecutando:</p>
<pre lang="term">sudo pecl install apc</pre>
<p>Ahora incluiremos el módulo <code>apc.so</code> recién compilado en nuestra configuración de PHP, añadiendo las siguientes líneas al final de nuestro archivo <code>php.ini</code> (en mi caso en <code>/etc/php5/apache2/php.ini</code>), <strong>guardamos y reiniciamos el servidor Apache</strong>:</p>
<pre lang="ini">extension=apc.so

[APC]
apc.enabled = 1
apc.shm_segments = 1
apc.shm_size = 64
apc.max_file_size = 10M
apc.stat=1</pre>
<p>Y para terminar del todo, el paso final: hacer que Magento utilice APC, para lo que editaremos el archivo de configuración local situado en <code>app/etc/local.xml</code> de nuestra instalación de Magento, entre los tags <code><global></global></code> (aconsejo ponerlo al final de la sección global, una línea más abajo de <code></session_save></code>):</p>
<pre lang="xml"><cache>
    <backend>apc</backend>
<prefix>alphanumeric</prefix>
</cache></pre>
<h3>Resultados</h3>
<p>Con esto, deberíamos tener:</p>
<ul>
<li>La propia caché de Magento activada en <em>Options &raquo; Caché Management</em></li>
<li>La caché de consultas de MySQL activada y con un límite más amplio</li>
<li>Y el módulo APC cacheando el código intermedio de PHP</li>
</ul>
<p>En mi servidor dedicado con Intel Atom, el tiempo de espera se ha reducido en cerca de un 40% al optimizar MySQL y posteriormente un 38% adicional al incluir APC. No tengo datos concretos de cuando active la caché interna de Magento, pero desde luego la diferencia fue mucho menor que cuando activé cada uno de estos sistemas por separado. Ahora sí, podemos decir que Magento ha llegado para quedarse sin miedo a hablar de rendimiento o lentitud para nuestros clientes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frickr.es/2009/07/08/mejorando-el-rendimiento-de-magento-commerce/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parchea el iPhone OS 3.0 para aceptar aplicaciones sin DRM</title>
		<link>http://www.frickr.es/2009/06/20/parchea-el-iphone-os-3-0-para-aceptar-aplicaciones-sin-drm/</link>
		<comments>http://www.frickr.es/2009/06/20/parchea-el-iphone-os-3-0-para-aceptar-aplicaciones-sin-drm/#comments</comments>
		<pubDate>Sat, 20 Jun 2009 15:12:57 +0000</pubDate>
		<dc:creator>Rodrigo</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[3.0]]></category>
		<category><![CDATA[AppSync]]></category>
		<category><![CDATA[installd]]></category>
		<category><![CDATA[IPA]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iTunes]]></category>
		<category><![CDATA[miPatch]]></category>
		<category><![CDATA[MobileInstallation]]></category>

		<guid isPermaLink="false">http://www.frickr.es/?p=191</guid>
		<description><![CDATA[
Con la salida de la versión final del iPhone OS 3.0, muchos desarrolladores se han encontrado con que ya no es posible parchear el framework MobileInstallation tal como se venía haciendo con las versiones 2.x para poder probar sus propias aplicaciones antes de pagar los $99 por la cuenta de editor en el App Store.
Disclaimer: El objetivo de esta guía es permitir la carga de aplicaciones sin DRM en el nuevo software 3.0 del iPhone/iPod Touch con fines de desarrollo/educativos. En ningún momento resolveré dudas o consultas sobre cargar aplicaciones ...]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://www.frickr.es/wp-content/uploads/2009/06/iphone-unlocked.jpg" alt="iphone-unlocked" title="iphone-unlocked" width="424" height="392" class="alignnone size-full wp-image-200" /></center></p>
<p>Con la salida de la versión final del iPhone OS 3.0, muchos desarrolladores se han encontrado con que ya no es posible parchear el framework MobileInstallation tal como se venía haciendo con las versiones 2.x para poder probar sus propias aplicaciones antes de pagar los $99 por la cuenta de editor en el App Store.<span id="more-191"></span></p>
<p class="info"><strong>Disclaimer:</strong> El objetivo de esta guía es permitir la carga de aplicaciones sin DRM en el nuevo software 3.0 del iPhone/iPod Touch con fines de desarrollo/educativos. En ningún momento resolveré dudas o consultas sobre cargar aplicaciones protegidas con copyright procedentes de la App Store, puesto que además es ilegal en muchos países.</p>
<p>Aquellos que han accedido al directorio de rigor en esta nueva versión habrán descubierto que Apple ha modificado el sistema de autorización que antes era controlado por MobileInstallation por un nuevo sistema contenido en <em>/lib/exec/installd</em>, por lo que todos los desbloqueos basados en el anterior sistema (básicamente todos los <em>miPatch</em> que han ido saliendo en Cydia) no tienen efecto y pueden provocar bloqueos al inicio, teniendo que poner el dispositivo en modo DFU para restaurarlo.</p>
<p>Afortunadamente, los chicos de <a href="http://hackulo.us/forum">Hackulous</a> han creado un nuevo parche especialmente diseñado para <em>installd</em> y fácilmente instalable desde Cydia, siempre y cuando hayamos realizado el <a href="http://www.esferaiphone.com/tutoriales/pwnagetool-para-firmware-30-disponible/">Jailbreak correspondiente</a>. Estos son los pasos:</p>
<ul>
<li>Abre Cydia en tu 3.0 con el jailbreak aplicado (<strong>Icy da problemas</strong>).</li>
<li>Añade la fuente http://cydia.hackulo.us</li>
<li>Instala la aplicación <em>AppSync</em>, dentro de la categoría <em>Hackulous</em></li>
<li>Reinicia el iPhone para evitar problemas y cuelgues (<strong>imprescindible</strong>)</li>
<li>Proceder con iTunes como siempre, arrastrando los ficheros .IPA que hemos empaquetado desde Xcode</li>
<li>Sincronizar y listo</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.frickr.es/2009/06/20/parchea-el-iphone-os-3-0-para-aceptar-aplicaciones-sin-drm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo mostrar miniaturas en tu tema de WordPress sin plugins ni hacks</title>
		<link>http://www.frickr.es/2009/01/04/como-mostrar-miniaturas-en-tu-tema-de-wordpress-sin-plugins-ni-hacks/</link>
		<comments>http://www.frickr.es/2009/01/04/como-mostrar-miniaturas-en-tu-tema-de-wordpress-sin-plugins-ni-hacks/#comments</comments>
		<pubDate>Sun, 04 Jan 2009 21:41:00 +0000</pubDate>
		<dc:creator>Rodrigo</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Destacados]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[miniaturas]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[thumbnail]]></category>
		<category><![CDATA[timthumb]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.frickr.es/?p=127</guid>
		<description><![CDATA[El día de año nuevo cambié el tema del blog (una versión modificada de Redoable) por Arthemia 2 y descubrí que incluía el script timthumb.php para generar las miniaturas de las entradas en la portada, archivos y búsqueda, ¡qué bien!. Pero nada más activarlo y entrar en el blog propiamente dicho, las imágenes no se muestran&#8230; Voy a la documentación del tema y veo que hay que copiar la ruta de la imagen que quiero como miniatura en un campo personalizado de la entrada, con nombre &#8216;Image&#8217; y la URL ...]]></description>
			<content:encoded><![CDATA[<p>El día de año nuevo cambié el tema del blog (una versión modificada de Redoable) por <a href="http://michaelhutagalung.com/2008/08/arthemia-20-released-the-updates/">Arthemia 2</a> y descubrí que incluía el script <code>timthumb.php</code> para generar las miniaturas de las entradas en la portada, archivos y búsqueda, ¡qué bien!. Pero nada más activarlo y entrar en el blog propiamente dicho, las imágenes no se muestran&#8230; Voy a la documentación del tema y veo que hay que copiar la ruta de la imagen que quiero como miniatura en un campo personalizado de la entrada, con nombre &#8216;Image&#8217; y la URL relativa (esto es, <code>wp-content/uploads/año/mes/imagen.jpg</code>). Vaya rollazo, ¿no hay nada automático?.</p>
<blockquote><p><center>No me cuentes historias, <a href="http://www.frickr.es/2009/01/04/como-mostrar-miniaturas-en-tu-tema-de-wordpress-sin-plugins-ni-hacks/2/">show me the code!</a></center></p></blockquote>
<h3>Obtener los archivos adjuntos a una entrada</h3>
<p>Buscando por el <a href="http://codex.wordpress.org">Codex</a> de WordPress encontré algo que podía ser útil: la función <a href="http://codex.wordpress.org/Function_Reference/get_children">get_children()</a>. Por lo visto WordPress relaciona internamente cada fichero con su entrada correspondiente, y esta función devuelve todos los adjuntos que hemos subido mediante el <em>uploader</em> al escribir la entrada. Además permite filtrar el resultado por tipo (<code>attachment</code>), el identificador de la entrada (<code>post_id</code>) y el tipo MIME del archivo (<code>image</code>).</p>
<pre lang="php">$attachments =&#038; get_children( array(
	'post_type' => 'attachment',
	'post_parent' => get_the_ID(),
        'post_mime_type' => 'image'
));</pre>
<p>Tras varias pruebas -no todo sale siempre a la primera- compruebo que las todas miniaturas funcionan sin tener que usar los campos personalizados (que sinceramente, nunca me iba a molestar en rellenar) y me voy a la cama tan tranquilo. </p>
<h3>El desastre</h3>
<p>Al día siguiente&#8230; ¡horror!, el blog carga lentísimo y pocos minutos después recibo un mensaje del Hostmaster porque hay un proceso que está llamando continuamente a una IP caída (que resultó ser la de Twitter). Desactivo el plugin culpable -Twittwoo- e instalo <a href="http://ocaoimh.ie/wp-super-cache/">WP-Super-Cache</a> a petición del Hostmaster. Segundo horror: las miniaturas a tomar por saco. Borro la caché que había generado, desactivo y elimino todos los ficheros. Siguen sin aparecer las miniaturas y el Hostmaster me indica que desde el día de año nuevo a las 21:15h aparece este otro mensaje de error en los logs del servidor:</p>
<pre lang="text">[Thu Jan 01 21:15:04 2009] [error] [client 84.77.X.X] Usage: file [-bcikLhnNsvz] [-f namefile] [-F separator] [-m magicfiles] file..., referer: http://www.frickr.es/
[Thu Jan 01 21:15:04 2009] [error] [client 84.77.X.X]        file -C -m magicfiles, referer: http://www.frickr.es/</pre>
<p>Pues parece que <code>timthumb.php</code> hace una llamada a una función que calcula no-se-qué de un número mágico y falla o el servidor no la soporta. Y encima el WP-Super-Cache me ha modificado el <code>.htaccess</code>, pero por suerte el Hostmaster me sube uno limpio para WordPress. Resumiendo: que el dichoso <code>timthumb.php</code> en realidad nunca ha funcionado bien, y hay que encontrar otra solución.</p>
<p>Me pongo a buscar otra vez en el Codex y esta vez descubro que desde la versión 2.5 WordPress permite especificar tamaños para generar miniaturas de todas las imágenes que se suben. Perfecto: si nativamente el sistema genera las miniaturas, y yo puedo acceder a todos los adjuntos de un post, me falta relacionar el adjunto con la miniatura del tamaño que necesito. Sigo inspeccionando las funciones internas y me encuentro con <a href="http://codex.wordpress.org/Function_Reference/wp_get_attachment_image_src">wp_get_attachment_image_src()</a>, justo lo que necesito:</p>
<pre lang="php">(array) $image = function wp_get_attachment_image_src (
     $attachment_id,
     $size='thumbnail',
     $icon = false
);

// Returns an array containing:
$image[0] => url
$image[1] => width
$image[2] => height
</pre>
<p>Bueno, pues vamos a configurar WordPress y a modificar el código del tema (theme) para hacer que soporte las miniaturas internas de WordPress y eliminar cualquier rastro del <code>timthumb.php</code>.</p>
<blockquote><p><a href="http://www.frickr.es/2009/01/04/como-mostrar-miniaturas-en-tu-tema-de-wordpress-sin-plugins-ni-hacks/2/">Página 2 &raquo; Insertando el código final en el <em>theme</em></a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.frickr.es/2009/01/04/como-mostrar-miniaturas-en-tu-tema-de-wordpress-sin-plugins-ni-hacks/feed/</wfw:commentRss>
		<slash:comments>56</slash:comments>
		</item>
		<item>
		<title>smush.it!, optimiza y comprime tus imágenes sin pérdida</title>
		<link>http://www.frickr.es/2009/01/02/smushit-optimiza-y-comprime-tus-imagenes-sin-perdida/</link>
		<comments>http://www.frickr.es/2009/01/02/smushit-optimiza-y-comprime-tus-imagenes-sin-perdida/#comments</comments>
		<pubDate>Fri, 02 Jan 2009 14:59:15 +0000</pubDate>
		<dc:creator>Rodrigo</dc:creator>
				<category><![CDATA[Desarrollo]]></category>

		<guid isPermaLink="false">http://www.frickr.es/?p=109</guid>
		<description><![CDATA[
Cuando estás realizando una web adaptada a dispositivos móviles, hay que favorecer el uso de técnicas CSS avanzadas (los navegadores basados en WebKit se prestan más a ello) pero siempre necesitas algunas imágenes con logos, iconos, botones&#8230; La mejor técnica siempre es utilizar la &#8220;presentación preliminar de imagen&#8221; de Fireworks o Photoshop para reducir al máximo la paleta de colores en archivos GIF o PNG.
Otro escenario típico es en el que tenemos una imagen enorme (de más de 1.000 px de ancho) que queremos usar como fondo (background), como por ...]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.frickr.es/wp-content/uploads/2009/01/logo.png" alt="smush.it" title="smush.it" width="349" height="75" class="aligncenter size-full wp-image-110" /></p>
<p>Cuando estás realizando una web adaptada a dispositivos móviles, hay que favorecer el uso de técnicas CSS avanzadas (los navegadores basados en WebKit se prestan más a ello) pero siempre necesitas algunas imágenes con logos, iconos, botones&#8230; La mejor técnica siempre es utilizar la &#8220;presentación preliminar de imagen&#8221; de Fireworks o Photoshop para reducir al máximo la paleta de colores en archivos GIF o PNG.</p>
<p>Otro escenario típico es en el que tenemos una imagen enorme (de más de 1.000 px de ancho) que queremos usar como fondo (background), como por ejemplo en nuestra página de Twitter, pero pesa demasiado y tarda mucho en cargar. También pueden ser fotos con muchos colores en las que no podemos reducir la paleta sin una pérdida muy aparente de la calidad, pero necesitamos reducirlas como sea.</p>
<p>Para todos estos casos, <a href="http://phpied.com/">Stoyan Stefanov</a> y <a href="http://stubbornella.org/content">Nicole Sullivan</a>, del equipo de Rendimiento Excepcional (Exceptional Performance team) de Yahoo! han creado <a href="http://smushit.com">smush.it!</a>, un proyecto open source de optimización de imagenes online que reúne varias herramientas de procesamiento tales como ImageMagick, pngcrush, optipng, pngrewrite, jpegtran y gifsicle, con las que realiza varios patrones y nos devuelve automáticamente aquella con menor tamaño (generalmente un PNG). Además conserva los metadatos EXIF y de geolocalización de nuestras fotos.</p>
<p>Como cabe esperar, la aplicación es muy rápida y <a href="http://smushit.com/faq.php">proveen una API gratuita</a> para enviar y recibir desde nuestros scripts mediante simples llamadas GET y respuestas JSON (ideal para AJAX).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frickr.es/2009/01/02/smushit-optimiza-y-comprime-tus-imagenes-sin-perdida/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.172 seconds -->

