<?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>unreal4u&#039;s Personal Network</title>
	<atom:link href="http://blog.unreal4u.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.unreal4u.com</link>
	<description>Because my reality... is just your virtuality</description>
	<lastBuildDate>Wed, 28 Mar 2012 21:46:31 +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>¿Debería comprarme un Mac o un PC?</title>
		<link>http://blog.unreal4u.com/2012/03/deberia-comprarme-un-mac-o-pc/</link>
		<comments>http://blog.unreal4u.com/2012/03/deberia-comprarme-un-mac-o-pc/#comments</comments>
		<pubDate>Thu, 15 Mar 2012 00:27:48 +0000</pubDate>
		<dc:creator>unreal4u</dc:creator>
				<category><![CDATA[Apple/Mac]]></category>
		<category><![CDATA[Pensamientos Personales]]></category>

		<guid isPermaLink="false">http://blog.unreal4u.com/?p=608</guid>
		<description><![CDATA[Aunque no es la tónica de este blog, sí hay una pregunta que me preguntan (valga la redundancia) bastante cuando alguien ve que saco mi MacBook y es la que lleva el título de este blog: "Tú que usas Mac, ¿me lo recomiendas? ¿Debería comprarme uno?". Antes de escribir esta entrada, debo hacer una aclaración: [...]]]></description>
			<content:encoded><![CDATA[<p>Aunque no es la tónica de este blog, sí hay una pregunta que me preguntan (valga la redundancia) bastante cuando alguien ve que saco mi MacBook y es la que lleva el título de este blog: "Tú que usas Mac, ¿me lo recomiendas? ¿Debería comprarme uno?".<br />
Antes de escribir esta entrada, debo hacer una aclaración: no soy ni fan boy ni hater, mi filosofía de vida se define por irme por la mejor solución que se me dé en el momento, y da la casualidad de que en este momento Mac OS X es el sistema operativo que se ajusta mejor a mis requerimientos, por dos ventajas sobre sus competidores bastante definidas: Es un sistema operativo estable, mucho más estable que Windows (y más barato de mantener) y es mucho más rápido de asimilar que cualquier máquina Linux.<br />
<span id="more-608"></span><br />
Antes de continuar con el post, primero voy a aclarar cómo llegué a ocupar Mac.<br />
Yo ocupo Mac desde principios del año 2010, y no porque me hubiera comprado uno, sino porque en la empresa donde recién había entrado a trabajar me dieron a elegir entre un PC armado que podía demorar algunos días o empezar de inmediato con el trabajo pero con un Mac Mini que era lo único que había disponible en ese entonces. Después de un mes ya estaba completamente enamorado del sistema operativo ya que podía trabajar de lo más bien.<br />
Al cabo de algunos meses y debido a que salió un proyecto en una empresa externa, me pasaron un MacBook Pro ya que necesitaba algo móvil, ni tonto ni perezoso acepté la oferta y comencé en ese entonces a interiorizarme de verdad en el mundo Mac.</p>
<p>Con eso aclarado, procedo entonces a las típicas dos preguntas que se me hacen con respecto a aparataje de la empresa de la manzana mordida:</p>
<h2>¿Por qué los productos Apple son tan caros?</h2>
<p>Sí, los productos Apple son caros, lo admito. Sin embargo, una vez que te familiarizas con el sistema y te acostumbraste a usarlo, te das cuenta que es dinero muy bien invertido, ya que hay ciertas diferencias en los Mac que son los que finalmente hacen la raya de la suma:</p>
<ul>
<li>Para empezar, todos los MacBook (pro y normales) cuentan con Magsafe, y en mi caso me ha salvado ya 3 veces de unas caídas que hubiesen sido de consecuencias catastróficas.</li>
<li>El sistema operativo está muy bien integrado con el equipo en sí: un MacBook Pro típico viene con cámara, micrófono, teclado retroiluminado, sensores de todo tipo y Mac OS X se integra de forma perfecta con ese hardware, no hay que instalar drivers, y con suerte hay que cambiar algunos ajustes para que quede como ustedes quieran.</li>
<li>Mousepad: Digan lo que me digan, lo mejor del MacBook es su mouse integrado. En mis dos primeras semanas de uso me resistí a ocuparlo debido a mi experiencia previa en los notebooks, pero al cabo de este tiempo me di cuenta que ni siquiera estaba ocupando el mouse externo. Es mucho más rápido y cómodo trabajar con el mouse integrado.</li>
<li>Calidad de audio: este punto hay que separarlo en dos la verdad. Los parlantes integrados dan pena: son malos, dan muy poca potencia y suenan mal. Pero con un buen programa de audio (recomiendo <a href="http://www.audiofile-engineering.com/fidelia/">Fidelia</a>) y unos audífonos decentes (yo ocupo los <a href="http://www.sennheiser.com/sennheiser/home_en.nsf/root/private_headphones_audiophile-headphone-hd515-bass">Sennheiser HD515</a>) la cosa cambia y nunca le había sacado tan buen provecho a los audífonos hasta ahora.</li>
<li>El peso del equipo completo y la duración de la batería son inigualables.</li>
</ul>
<h2>En mi empresa trabajan con un software que costó X millones, ¿puedo correr esa aplicación en Mac?</h2>
<p>Con respecto a ésta, es una pregunta difícil de contestar ya que cada usuario es distinto y si bien es cierto existen ciertas similitudes entre uno y otro, no hay que olvidar que Mac OS X está basado en Unix (<a href="http://mx.answers.yahoo.com/question/index?qid=20080212040101AA8aj6L">que no es lo mismo que Linux</a>) pero se adaptó a tal forma y de manera tan profunda que acabó siendo un sistema bastante cerrado. Sin embargo, con un poco de investigación y a base de prueba y error, casi cualquier programa que <strong>corra en Linux</strong> es posible correrlo en Mac, ya sea compilándolo para nuestra plataforma o mediante MacPorts.<br />
En el caso de software escrito originalmente para Microsoft Windows la cosa es un poco distinta. A veces existen versiones de cierto software para Mac, como es el caso de Adobe, que toda su suite (Dreamweaver, Photoshop, Flash, Fireworks) es capaz de correr en Mac (y según de lo que he leído corre mejor en Mac que en Windows) y Microsoft Office, que corre bastante bien, aunque debo admitir que no soy un usuario "profesional" de esta suite, simplemente lo utilizo para escribir informes. Sin embargo, he sabido de otro software que no corre tan bien como por ejemplo Autocad, para el que prácticamente no hay alternativas.<br />
Y si en su empresa trabajan con un ERP especial, hay grandes posibilidades de que no exista un cliente para Mac, así que ojo con eso. Si es este el caso, y siempre y cuando ese ERP no consuma una cantidad desmesurada de recursos, pueden instalar <a href="http://www.vmware.com/es/products/desktop_virtualization/fusion/overview.html">VMWare Fusion</a> o <a href="http://www.parallels.com/eu/products/desktop/">Parallels</a> para ejecutar Windows de forma virtualizada y de esa forma poder ejecutar ESA herramienta específica en la máquina virtualizada.</p>
<p>Sólo con motivos de aclaración, yo ocupo en mi tiempo de trabajo Firefox, PHP, Apache, Zend Studio, Zend Framework, Aqua Data Studio, Word y un poco de Excel, los cuales están todos disponibles de forma nativa para Mac.</p>
<h2>Conclusión</h2>
<p>Mac OS X es un muy buen sistema operativo a ocupar con un buen equipo como lo son los productos de Apple, pero muchas veces tampoco es la combinación ideal de acuerdo a los requerimientos del usuario. Hay ciertas cosas que no podrán hacer como por ejemplo jugar, pero a su vez el segmento al cual apunta Apple es netamente al usuario corporativo, es así como terminan siendo muy buenos compañeros de trabajo.</p>
<p>Otra arista que no he tocado es el precio de las licencias. Mac OS X Lion viene sólo en un paquete que vale la friolera cantidad de USD$30 (Si compran un equipo, ya viene instalado por lo que ya tendrán una licencia). Windows en cambio viene en múltiples versiones con precios que fluctúan de los USD$120 a los USD$220. Linux, dependiendo obviamente de la distro, es en mucho casos gratuito.</p>
<p>Otro punto que no he tocado es el tema del soporte, pero toco madera porque nunca he tenido la necesidad de llevar mi Mac a servicio técnico. Los problemas que he tenido los he resuelto yo solo y todo lo "extra" (más disco duro y mucha más RAM) lo he instalado yo solo en cosa de minutos. Sin embargo; y siempre por lo que he leído; parece que deja bastante que desear, aunque lo dejo a la duda porque por lo general uno lee más casos de frustación que de éxito.</p>
<p>Finalmente, sí debo decir que encuentro decepcionante la calidad de ciertas piezas, y aquí debo apuntar con el dedo al SuperDrive (nombre que Apple le designa al lector/grabador de DVD), que por lo visto es derechamente malo ya que todos coinciden en que no dura más allá de un año y medio lo cual es poco considerando la gran calidad de las demás piezas. En mi caso, el SuperDrive ya murió y con suerte me lee algunos DVDs. También he leído que el adaptador de corriente tiende a durar poco, aunque hasta el momento el mío ha funcionado bien.</p>
<p>A medida que iba escribiendo fui elaborando también una pequeña tabla resumen acerca de los pros y contras de los Mac, con lo cual finalizo esta nota:</p>
<h3><strong>Pros:</strong></h3>
<ul>
<li>El sistema operativo es muy estable y muy fácil de entender</li>
<li>Magsafe</li>
<li>Teclado retroiluminado (sólo presente en MBP)</li>
<li>Mousepad</li>
<li>Muy buena disipación de calor. Junto con algunos Toshiba high-end son los equipos con menores índices de reballing</li>
<li>Excelente interoperabilidad con otros dispositivos Apple</li>
<li>Calidad de audio (con audífonos)</li>
</ul>
<h3><strong>Contras:</strong></h3>
<ul>
<li>Calidad de audio (con parlantes)</li>
<li>Precio, aunque se justifica</li>
<li>Poca compatibilidad con software especializado</li>
<li>Algunos componentes de mala calidad (SuperDrive, parlantes, cargador (?))</li>
<li>Poco soporte en caso de problemas (?)</li>
<li>Pocos puertos de expansión (Sólo 2 USB en los MBP)</li>
<li>Conectores propietarios.</li>
<li>Muchos programas externos son pagados</li>
</ul>
<p>Si sientes que algo le faltó al artículo, coméntalo en los comentarios y con gusto lo agregaré a este post.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unreal4u.com/2012/03/deberia-comprarme-un-mac-o-pc/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Pequeña nota sobre el tag base de HTML</title>
		<link>http://blog.unreal4u.com/2012/02/pequena-nota-sobre-el-tag-base-de-html/</link>
		<comments>http://blog.unreal4u.com/2012/02/pequena-nota-sobre-el-tag-base-de-html/#comments</comments>
		<pubDate>Tue, 07 Feb 2012 21:37:19 +0000</pubDate>
		<dc:creator>unreal4u</dc:creator>
				<category><![CDATA[Javascript/jQuery]]></category>
		<category><![CDATA[Mundo Web]]></category>

		<guid isPermaLink="false">http://blog.unreal4u.com/?p=591</guid>
		<description><![CDATA[Cuando hoy ya estábamos a punto de lanzar un nuevo sitio web, empezamos a hacer los ajustes finales de ésta. Sin embargo, cuando estábamos probando los últimos ajustes, una gran sorpresa apareció: mientras que el sitio funcionaba bien en Safari, Firefox y demases, en Internet Explorer no había ningún estilo, ningún Javascript asociado y ninguna [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando hoy ya estábamos a punto de lanzar un nuevo sitio web, empezamos a hacer los ajustes finales de ésta. Sin embargo, cuando estábamos probando los últimos ajustes, una gran sorpresa apareció: mientras que el sitio funcionaba bien en Safari, Firefox y demases, en Internet Explorer no había ningún estilo, ningún Javascript asociado y ninguna imagen. Investigando, nos dimos cuenta de que el problema estaba en la declaración <code>&lt;base&gt;</code>, ya que sólo al poner la URI completa (con http y todo incluido), Internet Explorer la tomaba en cuenta. Irónicamente, esta vez es Internet Explorer el que cumple con la norma, ya que el estándar de HTML 4.01 dicta que <a href="http://december.com/html/4/element/base.html">el valor a ponerse en esta directiva debe corresponder a una URI completa y absoluta</a> tal como se denota en la <a href="http://www.ietf.org/rfc/rfc2396.txt">RFC2396</a>.</p>
<p>Así que ya saben, si no funciona:<br />
<code>&lt;base href="/hola/chao/" /&gt;</code><br />
Deben poner:<br />
<code>&lt;base href="http://unreal4u.com/hola/chao/" /&gt;</code></p>
<p>Para que Internet Explorer la tome en cuenta.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unreal4u.com/2012/02/pequena-nota-sobre-el-tag-base-de-html/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Algunas notas sobre el prefetching</title>
		<link>http://blog.unreal4u.com/2012/01/algunas-notas-sobre-el-prefetching/</link>
		<comments>http://blog.unreal4u.com/2012/01/algunas-notas-sobre-el-prefetching/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 21:29:17 +0000</pubDate>
		<dc:creator>unreal4u</dc:creator>
				<category><![CDATA[Apple/Mac]]></category>
		<category><![CDATA[Javascript/jQuery]]></category>
		<category><![CDATA[Mundo Web]]></category>
		<category><![CDATA[Pensamientos Personales]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.unreal4u.com/?p=584</guid>
		<description><![CDATA[Desde hace tiempo que sigo bien de cerca algo que me tenía bien intrigado: el prefetch de HTML5, que me parece demasiado buena idea y espero que todos los navegadores lo implementen ipso-facto. Sin embargo, quise echar una pequeña mirada a cómo funcionaba (si es que funcionaba) y específicamente a cuál era la sintaxis necesaria [...]]]></description>
			<content:encoded><![CDATA[<p>Desde hace tiempo que sigo bien de cerca algo que me tenía bien intrigado: el prefetch de HTML5, que me parece demasiado buena idea y espero que todos los navegadores lo implementen ipso-facto. Sin embargo, quise echar una pequeña mirada a cómo funcionaba (si es que funcionaba) y específicamente a cuál era la sintaxis necesaria y cuáles son los pequeños trucos de la vida que se pueden aplicar para lograr el efecto deseado. Haz click en leer más para conocer los detalles de esta investigación que algunas sorpresas dio y también muchos dolores de cabeza.</p>
<p><span id="more-584"></span></p>
<h2>¿Qué es el prefetching?</h2>
<p>Desde la entrada de HTML5, aparte de los tags de audio y video, hubo algo que me llamó bastante la atención: el prefetch. Esta técnica consiste en adivinar lo que el usuario bajará en su siguiente click en nuestra página por lo que la idea detrás de esta técnica es bajar el mentado archivo o página desde ya para que de esta forma cuando el usuario haga el click no tenga que bajar el archivo nuevamente.<br />
En teoría, suena bastante bien, pero quise llevarlo a la práctica para saber si acaso era factible o no poder implementar esta tecnología hoy en día. De acuerdo a casi todas las páginas web que consulté, simplemente había que incluir algunas cabeceras en nuestra página web para que milagrosamente funcionara el prefetching, lo cual me parecía demasiado bueno para ser verdad y así fue: resulta que el prefetching sólo ocurre bajo algunas condiciones y no siempre. </p>
<p>Como primer punto de aquiles, el prefetching sólo funciona en Firefox y en Chrome, desde la versión 3.6 y 13 respectivamente, pero sinceramente es un punto que poco importa, ya que estos dos navegadores juntos ya obtienen más de un 50% de participación en el mercado de los navegadores (<a href="http://gs.statcounter.com/#browser-ww-monthly-201107-201112">fuente</a>), por lo que nuestro grupo objetivo desde ya es bastante amplio. </p>
<p>Sin embargo, de aquí en adelante todo empieza a irse cuesta abajo. Resulta que el prefetching no funciona en muchos casos, y como podrán leer más adelante, el prefetching de Firefox simplemente no cumple su cometido, lo que baja nuestra cuota de mercado a sólo un 25%. La otra característica sobresaliente es que el uso más intenso que pretendía darle no funciona: sólo funciona si el recurso prefetcheado es un link (elemento &lt;a&gt;), y no una llamada ajax. </p>
<h2>Preparación</h2>
<p>Para poder saber de forma rápida si acaso el prefetching funcionaba, escribí 2 archivos: uno como índice principal y el otro de prefetching, con el siguiente código, primero vemos nuestro índice:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html&gt;
&lt;html&gt;&lt;head&gt;
	&lt;title&gt;Testing prefetch with HTML5&lt;/title&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;../jquery.min.js&quot;&gt;&lt;/script&gt;
	&lt;link rel=&quot;prefetch&quot;  href=&quot;prefetch.php&quot;&gt;
	&lt;link rel=&quot;prerender&quot; href=&quot;prefetch.php&quot;&gt;
&lt;/head&gt;&lt;body&gt;
&lt;a href=&quot;prefetch.php&quot; class=&quot;prefetch&quot;&gt;Please click here to display the (prefetched) page&lt;/a&gt;&lt;br /&gt;

&lt;input type=&quot;button&quot; id=&quot;buttonContents&quot; value=&quot;Get contents&quot; /&gt;
&lt;div id=&quot;contents&quot;&gt;&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
$('#buttonContents').click(function(){
	$.ajax({
		url:'prefetch.php',
		success:function(data){
			$('#contents').html(data);
		}
	});
});
&lt;/script&gt;
&lt;/body&gt;&lt;/html&gt;
</pre>
<p>Es un documento HTML5 estándar, con dos elementos link: uno para firefox (que ocupa rel=prefetch) y la otra para Chrome, que ocupa rel=prerender. Dato rosa: la diferencia entre ambas es que el prerender también renderea la gráfica de la página, mientras que el prefetch sólo realiza este paso cuando la página se hace visible. En un documento complejo podría quizás llegar a notarse este punto, pero para el 99,6% de las páginas restantes no habría ninguna diferencia. De todas formas, ambas directivas son necesarias, ya que uno funciona para Firefox y la otra para Chrome.</p>
<p>Sólo para realizar un test, tenemos dos "links": uno que carga el archivo mediante ajax, y la otra es simplemente un link. Hice esta separación ya que uno es dinámico y la otra es estática, y era probable que los navegadores hicieran una diferenciación entre ambos tipos.</p>
<p>Este será nuestro archivo que vamos a "prefetchear":</p>
<pre class="brush: php; title: ; notranslate">
$fp = fopen('log.txt', 'a');
fwrite($fp,'['.strftime('%d-%m-%Y %T').'] - '.substr($_SERVER['HTTP_USER_AGENT'],strrpos($_SERVER['HTTP_USER_AGENT'], ' '),strlen($_SERVER['HTTP_USER_AGENT'])).&quot;\n&quot;);
fclose($fp);
sleep(3);
echo 'hello';
</pre>
<p>Por supuesto que tenemos un archivo llamado log.txt que tiene permisos 777. La principal razón del sleep era para simular la vida real y darle un tiempo de espera de carga de 3 segundos.</p>
<h2>Empiezan las sorpresas</h2>
<p>Con estos dos archivos empecé a hacer las pruebas, y grandes fueron mis sorpresas, ya que lo escrito en el papel es muy distinto a la práctica. </p>
<p>Primero dos links que me fueron de mucha ayuda:</p>
<p>http://browserspy.dk/prefetch.php</p>
<p>http://prerender-test.appspot.com/</p>
<p>El primero sirve para saber si el prefetching está funcionando para Firefox, mientras que el segundo sirve para verificar si el prefetching está funcionando para Chrome.<br />
También resultó bastante útil el task manager de Chrome (Window|Task Manager), y este link, también para Chrome:<br />
<code>chrome://net-internals/#prerender</code></p>
<p>Ya con todas estas herramientas pude empezar a probar distintas configuraciones y estos fueron los resultados:</p>
<ul>
<li>Firefox en Mac NO soporta prefetching. Así es, NO. Bajo ninguna circunstancia.</li>
<li>Firefox en Windows no tuvo mayores inconvenientes en hacer el prefetch, pero en cuanto se hace click en el documento "prefetcheado", lo empieza a descargar de nuevo. Más sobre esto después.</li>
<li>Chrome a partir de la versión 13 funciona bien el prerendering. ANTES de esta versión, no hubo caso en que funcionara.</li>
<li>Sólo se descargan documentos estáticos. Olvídense de pre-cargar ajax, no funcionará.</li>
</ul>
<h2>¿Qué pasa con Firefox?</h2>
<p>Hasta que me di cuenta de lo que pasaba en Firefox, estaba feliz de que funcionara, pero me llevé una gran desilusión. Resulta que Firefox después de haber hecho el prefetching y cuando uno ya hace click en el link... empieza a descargar el documento de nuevo! El gran problema de esto, es que se pierde todo el objetivo de hacer un prefetching y más encima realiza un request adicional que nunca ocupará, gastando recursos en nuestro servidor.<br />
Hay sin embargo un test que no he hecho y que tampoco creo que valga la pena: establecer cabeceras explícitamente en el futuro para que Firefox piense que el recurso que acaba de rescatar también es válido para el siguiente request.<br />
El único reparo que tengo con esto es que si tenemos una cabecera de prefetching es por que sabemos que el próximo recurso a rescatarse será el que le estamos indicando... ¿para qué necesito decirle explícitamente que quiero que conserve ese recurso?</p>
<h2>Conclusiones</h2>
<p>Aunque Firefox soporta desde la versión 3.6 el concepto de prefetch, lo hace bastante mal. Uno pensaría que ya con tanto tiempo "soportando" prefetching, funcionaría bien pero como queda demostrado, lo soporta de forma paupérrima.<br />
Chrome en cambio me alegró el día ya que funciona y bastante bien. Incluso funciona si tenemos un javascript como el que sigue:</p>
<pre class="brush: jscript; title: ; notranslate">
var app = {
    prefetchLinks: function(){
        var hrefs = $(&quot;a.prefetch&quot;).map(function(index, domElement){
            return $(this).attr(&quot;href&quot;);
        });
        return $.unique(hrefs);
    },

    addPrefetchTags: function(){
        this.prefetchLinks().each(function(index,Element){
            $(&quot;&lt;link /&gt;&quot;, {
                rel: &quot;prefetch&quot;, href: Element
            }).appendTo('head');
            $('&lt;link /&gt;', {
                rel:'prerender', href: Element
            }).appendTo('head');
        });
    },
};
$(document).ready(function(){
    app.addPrefetchTags();
});
</pre>
<p>Sacado (y modificado) <a href="http://www.catswhocode.com/blog/mastering-html5-prefetching">desde esta página</a>. Las modificaciones que tiene son en la llamada final de la función y en agregar el soporte para Chrome.</p>
<p>La gran sorpresa de esta función es que aunque construye bien el documento en todos los navegadores, el objetivo final sólo se logra en Chrome, ya que todos los demás navegadores no saben qué hacer con las etiquetas recién construidas, lo cual incluye -para mi sorpresa- a Firefox, que ni siquiera comienza a bajar los documentos que queramos rescatar.</p>
<p>Con esta pequeña investigación al respecto, creo que dejaré descansar el tema por uno o dos años para luego ver si se ha avanzado algo y si en ese futuro sirve o no.<br />
También quiero dejar una pequeña enseñanza: aunque muchas páginas juran que el prefetching funciona con sólo agregar algunas líneas a tu código fuente, siempre hay que experimentar y tratar de hacer funcionar las cosas por uno mismo. En este caso, quedó demostradísimo que no es llegar y agregar links, ya que la funcionalidad final sólo se logra en un navegador mientras que para el otro es sólo una gastadera de recursos. Por si fuera poco, casi todas las páginas que promocionan el uso del prefetching sólo incluyen el código necesario para Firefox haciendo su solución totalmente inútil para la vida real, así que: cuidado con copy-paste!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unreal4u.com/2012/01/algunas-notas-sobre-el-prefetching/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Índice de directorios con filtro</title>
		<link>http://blog.unreal4u.com/2011/12/indice-de-directorios-con-filtro/</link>
		<comments>http://blog.unreal4u.com/2011/12/indice-de-directorios-con-filtro/#comments</comments>
		<pubDate>Sun, 04 Dec 2011 19:41:16 +0000</pubDate>
		<dc:creator>unreal4u</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.unreal4u.com/?p=581</guid>
		<description><![CDATA[Hacía mucho tiempo que no escribía y era por una razón bien práctica: me cambié de país y como tal, he estado muy ocupado tanto con la mudanza, con el traerme mi mujer y trabajando, ya que de alguna forma hay que mantener la máquina andando y eso significa que aparte de todos los trámites [...]]]></description>
			<content:encoded><![CDATA[<p>Hacía mucho tiempo que no escribía y era por una razón bien práctica: me cambié de país y como tal, he estado muy ocupado tanto con la mudanza, con el traerme mi mujer y trabajando, ya que de alguna forma hay que mantener la máquina andando y eso significa que aparte de todos los trámites regulares que hay que hacer y pagar, también hay que trabajar. </p>
<p>Lo bueno es que estoy trabajando hace cerca de 2 meses ya, encontré trabajo sumamente rápido y como recién llegado en la empresa, me llenaron de proyectos pasados, presentes y futuros. Cuando estaba trabajando en Chile,  sólo tenía 3 proyectos permanentes, así que trabajar en localhost era bastante simple. Sin embargo, ahora tengo algo más de 18 proyectos y recordar el nombre de cada una no es tan simple como parece. Por eso, ya instalado en mi nueva casa y aprovechando un ratito de ocio, escribí un script que recorre un directorio y crea un link por cada directorio que encuentra para que de esa forma, pueda visitar http://localhost/ y hacer click en el proyecto que me interesa trabajar. Hasta ahí, no tiene ninguna maravilla; sin embargo; este script tiene algo especial, ya que permite esconder ciertos directorios y asignarles un alias a otros para que el listado no quede tan feo a primera vista.<br />
<span id="more-581"></span></p>
<p>En sí, consta de 2 archivos: un index.php y un .index (predeterminadamente el "." indica que se trata de un archivo oculto en los UNIX). </p>
<p>Veamos el primer archivo: </p>
<pre class="brush: php; title: ; notranslate">&lt;html&gt;&lt;head&gt;&lt;title&gt;Proyectos en unreal4u&lt;/title&gt;&lt;/head&gt;&lt;body&gt;
&lt;h1&gt;Proyectos&lt;/h1&gt;
&lt;p&gt;Edit .index for index options&lt;/p&gt;&lt;ul&gt;&lt;?php
$aliasFile = explode(&quot;\n&quot;,file_get_contents('.index'));
foreach($aliasFile AS $aliasString) {
	$aliasFileTmp = explode('|',$aliasString);
	if (!empty($aliasFileTmp[1]) AND substr($aliasFileTmp[1],0,1) != '#') {
		$aliasFileCompleted[$aliasFileTmp[0]] = $aliasFileTmp[1];
	}
}

$itemHandler = opendir('.');
$output = '';
while (($item = readdir($itemHandler)) !== false) {
	if (substr($item,0,1) != '.' AND is_dir($item)) {
		$linkText = $item;
		if (!empty($aliasFileCompleted[$item])) $linkText = $aliasFileCompleted[$item];

		if ($linkText != '.') {
			$output .= '&lt;li&gt;&lt;a href=&quot;'.$item.'&quot;&gt;'.$linkText.'&lt;/a&gt;&lt;/li&gt;';
		}
	}
}
echo $output;
?&gt;&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</pre>
<p>En ella primero abrimos nuestro archivo .index y creamos un pequeño arreglo con los datos (válidos) que rescatamos de ella. En seguida, abrimos el directorio actual y empezamos a recorrerlo verificando primero que se trate de un directorio y que no sea un archivo oculto (o el directorio actual). Si estas condiciones se cumplen, se verifica por último en nuestro arreglo si tiene un alias y si debemos esconderlo o no. Si no lo debemos esconder, lo mostramos.</p>
<p>El segundo archivo es bastante simple, es un archivo en texto plano que indica el nombre del directorio y un alias. Opcionalmente, el alias lo podemos nombrar con "." para que de esa forma lo esconda. La estructura sería: </p>
<pre class="brush: plain; title: ; notranslate">
# Hide logs and sessions folder
logs-sistema|.
sesiones|.
RemoteSystemsTempFiles|.

# Assign alias to some folders
00.general-tests|+++ Test Dir +++
doc|Technical Documentation
framework|Framework
zf|Pr&amp;aacute;ctica Zend Framework
</pre>
<p>De esta forma, cuando visitamos localhost, tendremos la siguiente vista (a la izquierda navegador, a la derecha explorador de archivos): </p>

<a href="http://blog.unreal4u.com/wp-content/gallery/miscelaneo/screen-shot-2011-12-04-at-20-36-50-113.png" title="" class="shutterset_singlepic15" >
	<img class="ngg-singlepic ngg-center" src="http://blog.unreal4u.com/wp-content/gallery/cache/15__320x240_screen-shot-2011-12-04-at-20-36-50-113.png" alt="screen-shot-2011-12-04-at-20-36-50-113" title="screen-shot-2011-12-04-at-20-36-50-113" />
</a>

<p>Espero que les haya servido el tip, en cuanto tenga más tiempo escribiré más tips y continuaré un poco con la actualización más constante de este blog.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unreal4u.com/2011/12/indice-de-directorios-con-filtro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cinco maneras simples de acelerar tu aplicación</title>
		<link>http://blog.unreal4u.com/2011/09/cinco-maneras-simples-de-acelerar-tu-aplicacion/</link>
		<comments>http://blog.unreal4u.com/2011/09/cinco-maneras-simples-de-acelerar-tu-aplicacion/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 20:39:22 +0000</pubDate>
		<dc:creator>unreal4u</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.unreal4u.com/?p=494</guid>
		<description><![CDATA[Estaba yo revisando mi twitter el otro día cuando me encontré con un artículo bien interesante acerca de cómo acelerar tu aplicación en PHP. De hecho, lo encontré tan bueno que decidí hacer el mismo listado, pero en español y poniéndole también de mi cosecha. Instalación de un Opcode Cache En general, se puede acelerar [...]]]></description>
			<content:encoded><![CDATA[<p>Estaba yo revisando mi twitter el otro día cuando me encontré con un artículo bien interesante acerca de cómo acelerar tu aplicación en PHP. De hecho, lo encontré tan bueno que decidí hacer el mismo listado, pero en español y poniéndole también de mi cosecha.</p>
<h2>Instalación de un Opcode Cache</h2>
<p>En general, se puede acelerar mucho una aplicación hecha en PHP con un simple programita, el cual es tan bueno que será incluida dentro del core de PHP en su próxima release principal (5.4). El funcionamiento básico de este programa sigue un esquema bastante básico, aunque para entender eso primero deberemos entender el cómo funciona el ciclo de entrega de una página Web. Básicamente, el ciclo completo es el siguiente:<br />
<span id="more-494"></span><br />
<img src="http://blog.unreal4u.com/wp-content/uploads/2011/04/fig01.gif" alt="Figura 1" /><br />
Primero se pide la página, y esa petición le llega al WebServer. El mismo webserver, al detectar código PHP, se lo deriva a PHP, que revisa el código, lo parsea, lo compila y lo ejecuta, para entregar una salida. Por razones que desconozco, este ciclo se repite siempre, aunque el archivo no se haya modificado entremedio; o al menos; lo hará hasta la versión 5.4 de PHP, cuando se incluirá de forma predeterminada APC (Alternative PHP Cache). APC es además mantenida por varios desarrolladores de PHP, Facebook y Yahoo, así que comparado con las demás opciones es poco lo malo que se puede decir del mismo.</p>
<p>Lo que hace esta extensión es guardar una copia del script ya compilado, de forma que se evita algunos pasos innecesarios. Si el script fue modificado, entonces se compila nuevamente, pero hay que destacar que una vez que un sistema está estable, eso ocurrirá tarde mal y nunca:<br />
<img src="http://blog.unreal4u.com/wp-content/uploads/2011/04/fig02.gif" alt="Figura 2" /></p>
<p>Instalar un Opcode Cache es definitivamente una de las mejores soluciones que se pueden implementar: por lo menos un incremento de velocidad de un 80% en cada request.</p>
<h2>Optimización de configuración de PHP</h2>
<p>Hay diversas optimizaciones que se pueden hacer en la configuración de PHP, partiendo por las más básicas y también de forma más avanzada.<br />
De las más básicas, son diversas las que no sólo incrementan la velocidad, pero también aumentan la seguridad:<br />
<code>register_globals</code>: Lo mejor es dejar desactivada esta opción, ya que aparte de tener que parsear todo el script para buscar las variables, es una falla de seguridad enorme.<br />
<code>register_long_arrays</code>: Habilita o deshabilita las variables tipo $HTTP_*_VARS que ya no son válidas hace mucho tiempo. Se recomienda dejar desactivado. (Off)<br />
<code>register_argc_argv</code>: También se recomienda dejarla en off. Crea los arreglos argc y argv cada vez que un script se ejecuta, algo totalmente innecesario en el 99% de los casos, y en aquellos casos donde sí es necesario (CLI) se crean automáticamente debido a que son obligatorios.<br />
<code>auto_globals_jit</code>: Se recomienda dejar en "On". Inicializa las variables superglobales ENV y SERVER sólo cuando se necesitan en vez de siempre. Las tres funciones previas deberán estar todas desactivadas para que este parámetro tome efecto.<br />
<code>magic_quotes_*</code>: Esta opción originalmente existía para limpiar las entradas a las bases de datos, pero la gran mayoría empezó a implementar sistemas propios de limpieza de datos que eran mucho más efectivas y que protegían incluso de las inyecciones más comunes de las cuales los magic_quotes no protegían y al final cayó en desuso. Es también importante para la velocidad debido a que no se tienen que parsear las cadenas antes de enviarlas a la base de datos.<br />
<code>always_populate_raw_post_data</code>: Nunca ocupé esta opción y no tengo idea para qué sirve. Sólo sé que deja una copia de todo el POST en otro arreglo, un duplicado. Predeterminadamente, esta opción viene desactivada desde PHP4.2.3.<br />
<code>output_buffering</code>: Esta opción debería dejarse siempre activado, ya que evita que con cada llamada a echo o print se devuelva algo al navegador. Con esta opción en cambio, se llena un buffer y recién cuando ese buffer se llena o el motor de PHP termina de procesar la página, se manda toda la información en el buffer.<br />
<code>variables_order</code>: Esta opción es poco documentada lo cual es una pena, ya que permite desactivar cierto tipo de variables superglobales. Predeterminadamente, está ajustada en EGPCS (Environment, Get, Post, Cookie y Server) y perfectamente podemos desactivar una o más de una. La que siempre he visto que es seguro quitar, es la E de environment. Casi nunca he visto que ocupen esa variable superglobal. El incremento en velocidad se obtiene al no tener que parsear en cada request esta variable superglobal.<br />
<code>date.timezone</code>: Esta directiva fue introducida a partir de PHP5.1 y es bastante útil colocarle un valor predeterminado ya que sino se producirá un error de tipo warning en cada request. Este error se escribe en el disco, haciendo más lento el acceso general sobretodo en un sitio con alta demanda, y además PHP hará una serie de requests al sistema operativo para averiguar el valor.<br />
<code>short_open_tag</code> / <code>asp_tags</code>: Recomiendo encarecidamente dejarlas ambas en off. ¿Lo malo? No podrán iniciar un documento php con "<?" o con "<%", pero el motor no tomará en cuenta estas reglas adicionales y será una pequeña micro-optimización.<br />
<code>implicit_flush</code>: Se recomienda dejar esta opción siempre en "off", ya que de lo contrario se ejecutará una llamada a "flush()" cada vez que se imprima un echo, un print o se haya enviado un bloque de información, algo totalmente innecesario en el 99% de los casos. (Y en aquellos casos donde sí es necesario, simplemente se hace una llamada manual a esta función).</p>
<h2>Controlar las llamadas a require e include</h2>
<p>Por muy increíble que parezca, la siguiente regla es definitivamente una de las más importantes. Es increíble cómo una aplicación anda mucho más rápido al controlar bien el flujo de nuestra aplicación y no abusar de include_once() y require_once(), que lo único que hacen es revisar en la pila si el archivo ha sido incluido, si las funciones que aparecen en ese archivo ya fueron inicializados, si las classes que declaramos ya fueron declarados previamente y finalmente levantar un error (en el caso de un include o require simple) u omitir el error si hacemos la llamada con *_once().<br />
Así que ya saben: ¡a revisar bien su flujo y que no haya ninguna llamada con *_once() que hacen nuestra aplicación mucho más lenta!<br />
Además, algunas micro-optimizaciones incluyen el usar rutas absolutas para no buscar en todo nuestro <code>include_path</code> y tratar de mantener llamadas estáticas en vez de dinámicas para poder permitir al motor de PHP tener eso en cuenta antes de ejecutar y poder hacer una suerte de pre-fetching. (Ok, no ocurre exactamente así, pero mantengámoslo simple).</p>
<h2>Optimiza tu base de datos</h2>
<p>Y llegamos al punto más crítico del artículo, el cual es tan extenso que perfectamente podría entrar en un post aparte.<br />
Sólo mencionaré muy por encima las principales demoras en una base de datos:</p>
<ul>
<li>Mal diseño de la base de datos. Definitivamente con esto podemos sepultar una aplicación al no tener un buen diseño pensando en el futuro en mente. Quizás hoy tenemos 100 registros, pero una vez que nuestra aplicación se lance, en pocos días podemos tener 250.000 registros en un día. Si un mes tiene 30 días, ¡tenemos que en dos meses podemos acumular 15.000.000 de registros! Índices y claves primarias cobrarán vital importancia.</li>
<li>Mal diseño de nuestras consultas. Muy similar a lo anterior, pero esta vez enfocada a la optimización de las consultas que le hacemos a la base de datos. Si hacemos un UNION de 15 tablas distintas, entonces anda preparanda esa tasa de café, porque la necesitarás. Lo mejor para solucionar este tipo de problemas es tomar un buen conector de base de datos y poner un EXPLAIN antes de nuestra consulta. (Ejemplo: si la consulta fuera <code>SELECT * FROM t1;</code> tenemos que escribir <code>EXPLAIN SELECT * FROM t1;</code>). Enseguida, MySQL, PostGreSQL u otro motor compatible con el estándar SQL99 nos explicará qué fue lo que hizo y en base a eso puedes reformular tu consulta.</li>
<li>Una conexión por consulta: He visto que hay gente que se conecta a la base de datos, hace una consulta y luego se desconecta. Luego, en el mismo request, se conecta a la base de datos y luego se desconecta. Así 50 veces más. En mi experiencia a lo largo de los años es que si hay algo costoso en términos de base de datos es logearse y obtener una conexión. ¡<strong>EVITA múltiples conexiones</strong> y trata de establecer sólo una por request!</li>
</ul>
<h2>Cachear datos</h2>
<p>Otra de las más grandes optimizaciones que uno puede hacer, es ahorrarse consultas a la base de datos y jugar con la caché, ya sea generándola uno mismo u ocupando activamente APC u otro motor de caché (memcache, Wincache, etc). Eso si hay que tener en cuenta que a partir de la próxima versión mayor de PHP se incluirá predeterminadamente APC.<br />
Volviendo a nuestro tema, la gran diferencia entre estos dos métodos (generando uno mismo la caché vs ocupar APC) es que mientras que en el primero por lo general guardamos código HTML ya listo y generado, en el segundo simplemente guardamos datos de PHP en memoria compartida. Esto último tiene algunas ventajas ya que primero que nada no tenemos que leer un archivo ya que ya se encuentra en memoria. Lo otro es que perfectamente podemos guardar un arreglo y por supuesto podemos cambiar la apariencia de ese arreglo sin tener que necesariamente ejecutar la misma rutina para generar ese arreglo. En este sentido, supongamos un menú lateral cuya estructura base es la misma pero cuyo HTML va cambiando ya que va resaltando el menú actual donde estamos, que en el fondo es otro HTML.<br />
Claro, podríamos guardar estos datos por ejemplo en una sesión, pero eso de todas formas implica un llamado a archivo que es lo que queremos evitar.</p>
<p>Espero que les haya gustado esta entrega de optimización y micro-optimizaciones, sobre el cual <a href="http://blog.unreal4u.com/2009/12/micro-optimizaciones-en-php-desmitificadas/">ya tenía un artículo previo</a> que hace mucho tiempo está en el blog y nadie pescó.</p>
<p>Fuente: <a href="http://www.ibm.com/developerworks/opensource/library/os-5waystunelamp/index.html?cmp=dw&#038;cpb=dwlin&#038;ct=dwgra&#038;cr=twitter&#038;ccy=zz&#038;csr=lambwam">developerWorks</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unreal4u.com/2011/09/cinco-maneras-simples-de-acelerar-tu-aplicacion/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Instalación de php-mssql y xDebug en Mac OS Lion</title>
		<link>http://blog.unreal4u.com/2011/07/instalacion-de-php-mssql-y-xdebug-en-mac-os-lion/</link>
		<comments>http://blog.unreal4u.com/2011/07/instalacion-de-php-mssql-y-xdebug-en-mac-os-lion/#comments</comments>
		<pubDate>Thu, 28 Jul 2011 05:01:22 +0000</pubDate>
		<dc:creator>unreal4u</dc:creator>
				<category><![CDATA[Apple/Mac]]></category>
		<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.unreal4u.com/?p=571</guid>
		<description><![CDATA[Ayer les contaba acerca de que Mac OS en su nueva versión del sistema operativo había actualizado la versión de PHP (sin preguntar) y que tenía que instalar las extensiones de nuevo. Hoy toca el día en que el artículo que explica cómo instalar dos de las extensiones más populares bajo este sistema operativo y [...]]]></description>
			<content:encoded><![CDATA[<p>Ayer les contaba acerca de que Mac OS en su nueva versión del sistema operativo había actualizado la versión de PHP (sin preguntar) y que tenía que instalar las extensiones de nuevo. Hoy toca el día en que el artículo que explica cómo instalar dos de las extensiones más populares bajo este sistema operativo y con la nueva versión de PHP incluida.</p>
<p>Lo primero que hay que hacer es bajar las dependencias:<br />
<a href="ftp://ftp.ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz">Freedts</a><br />
<a href="http://php.net/downloads.php#v5">PHP5.3.6</a><br />
<a href="http://xdebug.org/download.php">xDebug</a><br />
Descomprimen todo en un directorio y hacen click en Continuar Leyendo.<br />
<span id="more-571"></span></p>
<p>Lo primero que tenemos que hacer antes de continuar es instalar Xcode que ahora está cómodamente disponible en la App Store. Ojo que una vez instalado (según la App Store) necesitaremos ir a Aplicaciones y apretar el ícono que dice "Instalar Xcode" para que todas las herramientas de desarrollo estén disponibles.</p>
<p>Ejecutamos los siguientes comandos. Ejecutar todo lo que esté con asterisco como root o con sudo, como quieran:</p>
<pre class="brush: bash; title: ; notranslate">
cd freetds-XXXX/
./configure --prefix=/etc/freetds --with-tdsver=8.0 --sysconfdir=/etc/freetds/conf/
make
# make install
# cp modules/mssql.so /usr/lib/php/extensions/no-debug-non-zts-20090626/
cd ../xdebug-XXXX/
phpize
./configure --enable-xdebug
make
# cp modules/xdebug.so /usr/lib/php/extensions/no-debug-non-zts-20090626/
# cp /etc/php.ini.default /etc/php.ini
# vi /etc/php.ini
// Hacemos los ajustes necesarios a nuestra configuración,
// importante es que las siguientes tres líneas queden dentro
// de la configuración:
extension=mssql.so
[xdebug]
zend_extension=&quot;/usr/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so&quot;
</pre>
<p>Con estos pasos, ya pueden disfrutar de su instalación de PHP con xDebug y el conector de PHP para Microsoft SQL Server.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unreal4u.com/2011/07/instalacion-de-php-mssql-y-xdebug-en-mac-os-lion/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Crear una firma HTML en Mail5</title>
		<link>http://blog.unreal4u.com/2011/07/crear-una-firma-html-en-mail5/</link>
		<comments>http://blog.unreal4u.com/2011/07/crear-una-firma-html-en-mail5/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 16:34:22 +0000</pubDate>
		<dc:creator>unreal4u</dc:creator>
				<category><![CDATA[Apple/Mac]]></category>

		<guid isPermaLink="false">http://blog.unreal4u.com/?p=566</guid>
		<description><![CDATA[Pequeño tip: el proceso para la creación de una firma que admita HTML en Mail5.0 es lijeramente distinto que en las versiones anteriores. En la nueva versión es: Crear un archivo .html con lo que quisiéramos dejar de firma. Guardar en una ubicación temporal. Abrir Preferencias en Mail y agregar una nueva firma. Cerrar Mail [...]]]></description>
			<content:encoded><![CDATA[<p>Pequeño tip: el proceso para la creación de una firma que admita HTML en Mail5.0 es lijeramente distinto que en las versiones anteriores. En la nueva versión es: </p>
<ul>
<li>Crear un archivo .html con lo que quisiéramos dejar de firma. Guardar en una ubicación temporal.</li>
<li>Abrir Preferencias en Mail y agregar una nueva firma.</li>
<li>Cerrar Mail</li>
<li>En Safari, abrir el archivo .html creado y guardarlo como un archivo tipo .webarchive</li>
<li>Copiar el archivo exportado por Safari a <code>~/Library/Mail/V2/MailData/Signatures/</code>, teniendo cuidado en cambiarle el nombre al archivo sobreescribiendo el que ya esté. Si tienen varias firmas, primero revisen cuál es cuál, Mail5 le asigna una ID única a cada uno pero abriendo el archivo en un editor de texto, aunque verán mucha basura entremedio, igual se puede ver de cuál firma se trata.</li>
</ul>
<p>[ACTUALIZACIÓN]<br />
Otro tip para volver a activar el apretar una tecla y que ésta se repita es poner en la terminal el siguiente comando:<br />
<code>defaults write -g ApplePressAndHoldEnabled -bool false</code></p>
<p>Gracias a <a href="http://rinconapple.com/1584/activar-repeticion-del-teclado-en-os-x-lion/">Rincón Apple</a> por este dato.</p>
<p>[ACTUALIZACIÓN 2]<br />
Tuve un problema con la copia de archivos: sucede que copiaba o movía y éste movimiento quedaba sin efecto alguno. La solución a este problema proviene directamente de los foros oficiales de Apple y consiste en borrar un archivo ubicado en:<br />
<code>rm -rf ~/Library/Preferences/com.apple.finder.plist</code></p>
<p>Solución encontrada gracias a los <a href="https://discussions.apple.com/thread/3204529?start=0&#038;tstart=0">foros de Apple</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unreal4u.com/2011/07/crear-una-firma-html-en-mail5/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Ventajas y desventajas de Mac OS Lion</title>
		<link>http://blog.unreal4u.com/2011/07/ventajas-y-desventajas-de-mac-os-lion/</link>
		<comments>http://blog.unreal4u.com/2011/07/ventajas-y-desventajas-de-mac-os-lion/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 04:45:27 +0000</pubDate>
		<dc:creator>unreal4u</dc:creator>
				<category><![CDATA[Apple/Mac]]></category>
		<category><![CDATA[Pensamientos Personales]]></category>

		<guid isPermaLink="false">http://blog.unreal4u.com/?p=562</guid>
		<description><![CDATA[Este es un artículo que ilustra las ventajas y desventajas técnicas de Mac OS Lion en comparación con Mac OS Snow Leopard, si quieres saber las ventajas y desventajas generales, por favor visita este artículo que lo explica mucho mejor La última versión del sistema operativo de la manzanita es, en muchos sentidos, un cambio [...]]]></description>
			<content:encoded><![CDATA[<h3 style="color:red">Este es un artículo que ilustra las ventajas y desventajas técnicas de Mac OS Lion en comparación con Mac OS Snow Leopard, si quieres saber las ventajas y desventajas generales, por favor <a href="http://blog.unreal4u.com/2012/03/deberia-comprarme-un-mac-o-pc/">visita este artículo</a> que lo explica mucho mejor</h3>
<p>La última versión del sistema operativo de la manzanita es, en muchos sentidos, un cambio para bien. Sin embargo, hay algunas cosas que no funcionan y otros que llegan a ser molestos y esta entrada pretende ser una suerte de guía para aquel que, como yo, simplemente actualizó a Lion sin leer antes de.</p>
<p>Una de las cosas que afecta directamente la temática de este blog, es que Lion actualiza la versión de PHP... y lo hace sin preguntar. Eso significa que tenemos que instalar php-mssql, xDebug, APC y todo eso nuevamente, así que aprovechando la ocasión, estoy escribiendo dos artículos a la vez: la primera que enseña a instalar xDebug y php-mssql (<a href="http://blog.unreal4u.com/2011/04/instalar-apc-para-php-en-snow-leopard/">APC ya está cubierto</a>) y esta misma.<br />
<span id="more-562"></span></p>
<h2>Desventajas</h2>
<p>Lo primero que se anuncia con bombos y platillos es que cambió el multitouch, pero este cambio se puede desactivar rápidamente en Preferencias - Trackpad - scroll &#038; zoom - desactivar scroll direction: natural.</p>
<p><img src='http://blog.unreal4u.com/wp-content/gallery/miscelaneo/screen-shot-2011-07-27-at-0-01-58-295.png' alt='screen-shot-2011-07-27-at-0-01-58-295' class='ngg-singlepic ngg-center' /></p>
<p>Con estos nuevos settings del multitouch lamentablemente también se perdió la habilidad de ir al inicio o final del documento con hacer el swap de tres dedos hacia arriba y abajo respectivamente. Sin embargo, buscando en Internet, encontré un programa llamado <a href="http://blog.boastr.net/?page_id=1722">BetterTouchTool</a> que vino a salvar el día. ¿Lo único malo? Hay que tener iniciado el programa lo cual no es tan terrible ya que queda en la barra del reloj: </p>
<p><img src='http://blog.unreal4u.com/wp-content/gallery/miscelaneo/screen-shot-2011-07-27-at-0-24-39-675.png' alt='screen-shot-2011-07-27-at-0-24-39-675' class='ngg-singlepic ngg-center' /></p>
<p>Otra desventaja es que Visor, plugin para mejorar la terminal integrada, desapareció por incompatibilidad. Lo bueno es que buscándomelas, di con el sitio original y para mi sorpresa me di cuenta que Visor estaba descontinuado y que apareció <a href="http://totalterminal.binaryage.com/">TotalTerminal en su lugar</a>, que hace lo mismo con una instalación más simple que Visor y que funciona de lo más bien con Lion. El único "detalle" es que no desaparece la ventana cuando pierde el foco como lo hacía con Visor, pero supongo que esa funcionalidad se restablecerá en una versión futura.</p>
<p>Sin embargo, la guinda de la torta es definitivamente la actualización a PHP5.3.6. Aunque se agradece el upgrade, podrían por lo menos haber avisado ya que me da una paja enorme tener que instalar las extensiones nuevamente. Lo único rescatable de esto es que mañana en la mañana estaré obligado a hacerlo ya que de lo contrario no tendría para qué ir a trabajar.</p>
<h2>Ventajas</h2>
<p>Las ventajas sin embargo son muchas más significativas que las desventajas. Entre ellas podemos mencionar detalles como por ejemplo que ahora se puede modificar el tamaño de la ventana desde cualquier lado y no solamente desde la esquina inferior derecha y otro tan gigante en Mail que simplemente deseché Thunderbird, ya que fue un amor a primera vista.<br />
Todo lo malo de Mail (un poco desorganizado, sin soporte para conversaciones) ahora ya no es así y presentaron una interfaz mucho más limpia y novedosa. Por lo demás ahora soporta las conversaciones de una manera que incluso le podría hacer la competencia a gMail. ¡Incluso ahora tiene soporte para las famosas estrellas de gMail! (Que antes no tenía). En fin, como por lo general soy un asiduo fan a la búsqueda en mis mails y la búsqueda en Thunderbird da pena, me cambié inmediatamente de vuelta a Mail.</p>
<p>Por otro lado, Spaces desapareció pero en su lugar apareció Mission Control, que sería una cruza bastante extraña entre Spaces y Exposé. No lo he probado con múltiples monitores y extraño un poco la distribución customizada que uno le podía dar a las distintas pantallas con Spaces y Exposé, pero la configuración ahora es bastante más simple y además la pantalla de presentación mejoró bastante, aún teniendo muchos programas abiertos uno puede ver todas las ventanas sin problemas, algo que no pasaba con Exposé.</p>
<p>A medida que vayan pasando los días voy a ir encontrándole más cosas buenas y malas a Lion, pero hasta el momento mi experiencia ha sido bastante agradable. Es de esperar que siga así.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unreal4u.com/2011/07/ventajas-y-desventajas-de-mac-os-lion/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Nueva class publicada: Extended PGsql</title>
		<link>http://blog.unreal4u.com/2011/07/nueva-class-publicada-extended-pgsql/</link>
		<comments>http://blog.unreal4u.com/2011/07/nueva-class-publicada-extended-pgsql/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 04:28:16 +0000</pubDate>
		<dc:creator>unreal4u</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.unreal4u.com/?p=560</guid>
		<description><![CDATA[Hice un submit de una nueva class basada en mi class ya existente para MySQL: Extended MySQLi. Hoy (bueno, más bien ayer) salió aprobada la segunda class que toma un approach algo distinto: es la misma class con los mismos métodos, pero esta vez hecho para PostGreSQL, ocupando PDO, ¿se acuerdan que hablé sobre eso [...]]]></description>
			<content:encoded><![CDATA[<p>Hice un submit de una nueva class basada en mi class ya existente para MySQL: <a href="http://blog.unreal4u.com/publicaciones/">Extended MySQLi</a>. Hoy (bueno, más bien ayer) salió aprobada la segunda class que toma un approach algo distinto: es la misma class con los mismos métodos, pero esta vez hecho para PostGreSQL, ocupando PDO, ¿se acuerdan que <a href="http://blog.unreal4u.com/2011/04/instalando-postgresql-php-pgsql-y-php-pdo_pgsql-en-mac-os-x/">hablé sobre eso hace algún tiempo</a>?</p>
<p>Finalmente la class, después de mucho tiempo, vio la luz y como tal también es probable que el framework en el que estoy trabajando, realice el cambio a PostGreSQL. MySQL si bien es cierto bastante bueno, no tiene un buen sistema de transacciones, depende de muchas cosas para hacer las cosas bien y es muy fácil equivocarse, especialmente trabajando en equipo. </p>
<p>Sin más ni menos, les dejo el link para que <a href="http://www.phpclasses.org/package/7052-PHP-Access-PostGreSQL-databases-using-PDO.html">puedan bajar la class Extended PGsql</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unreal4u.com/2011/07/nueva-class-publicada-extended-pgsql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firefox5 + IE9 y su nueva forma de redireccionar</title>
		<link>http://blog.unreal4u.com/2011/07/firefox5-ie9-y-su-nueva-forma-de-redireccionar/</link>
		<comments>http://blog.unreal4u.com/2011/07/firefox5-ie9-y-su-nueva-forma-de-redireccionar/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 03:45:26 +0000</pubDate>
		<dc:creator>unreal4u</dc:creator>
				<category><![CDATA[Mundo Web]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.unreal4u.com/?p=557</guid>
		<description><![CDATA[Yo siempre he opinado, como desarrollador, que todos los nuevos cambios en un programa son bienvenidos, sobretodo si son buenos. Pero ocurre también que a veces estos nuevos cambios terminan siendo contra-productivos, ya que requiere una gran inversión de tiempo en acomodar lo que antes funcionaba bien y que ahora funciona mal o derechamente no [...]]]></description>
			<content:encoded><![CDATA[<p>Yo siempre he opinado, como desarrollador, que todos los nuevos cambios en un programa son bienvenidos, sobretodo si son buenos. Pero ocurre también que a veces estos nuevos cambios terminan siendo contra-productivos, ya que requiere una gran inversión de tiempo en acomodar lo que antes funcionaba bien y que ahora funciona mal o derechamente no funciona. A veces sólo es necesario una línea de código, pero llegar a esa conclusión puede ser una gran pérdida de tiempo.</p>
<p>En ese sentido, Firefox en su última versión del popular navegador, cambió la forma de tratar las redirecciones 302 y que pueden producir más de algún dolor de cabeza teniendo en cuenta lo poco difundido de esta nueva característica.<br />
<span id="more-557"></span></p>
<p>El problema surgió cuando uno de los vendedores me dijo: "No funciona la página". Debo reconocer que al principio lo ignoré debido a que los vendedores siempre dicen que no funciona la página cuando el mensaje de error desplegado al mismo dice muy claramente: "RUT inválido, por favor intente nuevamente".<br />
Lo único malo es que esta vez, más y más vendedores me empezaron a decir lo mismo y eventualmente le empezó a pasar a los gerentes (A los dos días de hecho). Ya a estas alturas, debía haber un denominador común que hiciera que este error se produjera, así que me puse a investigar.</p>
<p>Una de las primeras cosas que me llamó la atención, es que en los logs empezó a aparecer el siguiente denominador común: Firefox/5.0.1. Me encantó el hecho que Mozilla actualice automáticamente sin preguntarle al usuario si desea hacerlo, pero en estos momentos estaba odiando tal característica xD.</p>
<p>Con eso en mente, tuve que bajar el mentado navegador (yo todavía estoy en 3.6.19 y por el momento no pienso actualizar) y empezar a probar. Finalmente logré aislar el "bug" que estaba relacionado a "algo" que tenía que ver con las sesiones y las redirecciones 302. Cuento corto: hice cientos de tests durante 1 semana (<a href="https://addons.mozilla.org/en-US/firefox/addon/live-http-headers/">Live HTTP Headers</a> jamás había sido tan útil), buscaba en Google por todos los términos que podrían llegar a ser y no logré encontrar la pifia. Seguía pasando en el sistema en producción pero no podía reproducir el error en menos de 10 líneas, necesario para poder reportar el problema en bugzilla.</p>
<p>Eso hasta que un buen día, <a href="http://www.inventpartners.com/content/firefox-5-redirect-bug-pragma-no-cache-bug">POR FIN APARECIÓ UN POST</a> que contenía exactamente el mismo problema y lo mejor de todo: su solución, y aquí viene lo mejor: Internet Explorer 9 tiene exactamente el mismo comportamiento!</p>
<p>El problema está en que la <a href="http://www.w3.org/Protocols/rfc2616/rfc2616.html">RFC 2616</a> #sección 10 (la que regula los códigos de estatus HTTP) dice que bajo la redirección 302 el resultado se puede o no dejar en caché. Bueno, Firefox ANTES de la versión 5, NO cacheaba la redirección 302 y ahora SÍ lo hace (tratándolo como si fuera una redirección 301), por lo tanto; y después de esta magna explicación; tenemos que la solución a este problema es simplemente enviar <strong>Pragma:no-cache</strong> y <strong>Cache-Control: no-cache</strong> antes de enviar las cabeceras de Location para que estos dos navegadores NO almacenen la redirección: </p>
<pre class="brush: php; title: ; notranslate">
$donde = 'http://blog.unreal4u.com/';
$tipo = 302;
header('Pragma: no-cache');
header('Cache-Control: no-cache');
header('Location: '.$donde,TRUE,$tipo);
</pre>
<p>Más información en la fuente:<br />
Fuente: <a href="http://www.inventpartners.com/content/firefox-5-redirect-bug-pragma-no-cache-bug">InventPartners</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unreal4u.com/2011/07/firefox5-ie9-y-su-nueva-forma-de-redireccionar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

