<?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 &#187; Pensamientos Personales</title>
	<atom:link href="http://blog.unreal4u.com/category/pensamientos/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.unreal4u.com</link>
	<description>Because my reality... is just your virtuality</description>
	<lastBuildDate>Mon, 30 Jan 2012 21:29:17 +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>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>0</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[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. Una [...]]]></description>
			<content:encoded><![CDATA[<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>8</slash:comments>
		</item>
		<item>
		<title>Manito de gato al blog</title>
		<link>http://blog.unreal4u.com/2011/07/manito-de-gato-al-blog/</link>
		<comments>http://blog.unreal4u.com/2011/07/manito-de-gato-al-blog/#comments</comments>
		<pubDate>Sun, 17 Jul 2011 06:26:47 +0000</pubDate>
		<dc:creator>unreal4u</dc:creator>
				<category><![CDATA[Javascript/jQuery]]></category>
		<category><![CDATA[Pensamientos Personales]]></category>

		<guid isPermaLink="false">http://blog.unreal4u.com/?p=555</guid>
		<description><![CDATA[Hace mucho tiempo que quería hacer algunas cosas nuevas en el blog, entre las cuales estaban: Una actualización general: Cuando instalé el blog WordPress iba en la versión 2.7.9 y nunca más la actualicé. Actualización de Plugins: Aunque no me gusta ocupar plugins, sí tenía algunos que estaban sumamente desactualizados. Incorporar botones sociales: Hoy en [...]]]></description>
			<content:encoded><![CDATA[<p>Hace mucho tiempo que quería hacer algunas cosas nuevas en el blog, entre las cuales estaban:</p>
<ul>
<li>Una actualización general: Cuando instalé el blog WordPress iba en la versión 2.7.9 y nunca más la actualicé.</li>
<li>Actualización de Plugins: Aunque no me gusta ocupar plugins, sí tenía algunos que estaban sumamente desactualizados.</li>
<li>Incorporar botones sociales: Hoy en día, casi infaltables si uno quiere hacer las cosas de forma rápida.</li>
<li>Cambiar el blog de máquina: Antes estaba en una máquina casi exclusiva, ahora, estoy en el servidor web que sirve todas las páginas, pero podré administrar mejor.</li>
<p>Así que buenas noticias: actualicé WordPress a la última versión (3.2.1), actualicé los plugins a la última versión y también incorporé los botones <a href="http://www.google.com/webmasters/+1/button/">+1 de Google</a>, <a href="http://developers.facebook.com/docs/reference/plugins/like/">Like de Facebook</a> y el <a href="http://twitter.com/about/resources/tweetbutton#url-fields">Tweet Button de Twitter</a>. Y para dejar algo de aporte, revise el código después del salto.<br />
<span id="more-555"></span></p>
<p>La verdad, pensé que incorporar estos botones iba a ser un poco más complicado, pero resultó bastante más fácil de lo que pensé. Lo primero que tenemos que hacer es visitar cada una de las páginas arriba mencionadas y seleccionar el estilo adecuado a nuestro gusto. Una vez hecho eso, procedemos a su instalación.</p>
<h2>Botón +1 de Google</h2>
<p>En header.php de nuestro theme, justo antes del cierre de la cabecera, agregamos el siguiente código:</p>
<pre class="brush: xml; title: ; notranslate">&lt;script type=&quot;text/javascript&quot; src=&quot;https://apis.google.com/js/plusone.js&quot;&gt;&lt;/script&gt;</pre>
<p>Luego, para cuando queramos agregar el botón en algún lado, digamos single.php o index.php, sólo basta con: </p>
<pre class="brush: xml; title: ; notranslate">&lt;g:plusone size=&quot;medium&quot; href=&quot;&lt;?php the_permalink(); ?&gt;&quot;&gt;&lt;/g:plusone&gt;</pre>
<p>size y href son obviamente configurables. Revisen también la página de Google, porque al incluir el primer javascript, es posible setear algunas configuraciones de inmediato, como por ejemplo el idioma.</p>
<h2>Like de Facebook</h2>
<p>Este botón es quizás el más difícil de estilar debido a que trabaja directamente con HTML en vez de CSS para eso. De todas formas, es bastante fácil, basta con agregar este código:</p>
<pre class="brush: xml; title: ; notranslate">&lt;div id=&quot;fb-root&quot;&gt;&lt;/div&gt;&lt;script src=&quot;http://connect.facebook.net/en_US/all.js#appId=148806621860058&amp;amp;xfbml=1&quot;&gt;&lt;/script&gt;&lt;fb:like href=&quot;&lt;?php the_permalink(); ?&gt;&quot; send=&quot;false&quot; layout=&quot;button_count&quot; width=&quot;80&quot; show_faces=&quot;false&quot; font=&quot;&quot;&gt;&lt;/fb:like&gt;</pre>
<p>Pueden revisar las opciones que ofrece el botón en el mismo link que cité arriba, de las 3 opciones, es la mejor documentada.</p>
<h2>Tweet Button de Twitter</h2>
<p>De las tres, es la que peor documentación tiene, sin embargo, su inclusión sigue siendo, tal como los demás botones, casi un chiste de lo fácil que es.<br />
Lo primero que tenemos que hacer es incluir el siguiente código en nuestra cabecera:</p>
<pre class="brush: xml; title: ; notranslate">&lt;script src=&quot;http://platform.twitter.com/widgets.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<p>Y después, cuando queramos imprimir el botón:</p>
<pre class="brush: xml; title: ; notranslate">&lt;a href=&quot;http://twitter.com/share&quot; class=&quot;twitter-share-button&quot; count=&quot;horizontal&quot; lang=&quot;es&quot; text=&quot;&lt;?php the_title(); ?&gt;&quot; url=&quot;&lt;?php the_permalink(); ?&gt;&quot;&gt;Tweet&lt;/a&gt;</pre>
<p>Y con eso, quedará inmediatamente insertado en nuestro blog.</p>
<p>Espero que les haya servido de ayuda para además, revitalizar un poco el blog.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unreal4u.com/2011/07/manito-de-gato-al-blog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sobre convenciones y notaciones (húngara, CamelCase, etc)</title>
		<link>http://blog.unreal4u.com/2011/03/sobre-convenciones-y-notaciones-hungara-camelcase-etc/</link>
		<comments>http://blog.unreal4u.com/2011/03/sobre-convenciones-y-notaciones-hungara-camelcase-etc/#comments</comments>
		<pubDate>Tue, 15 Mar 2011 04:25:32 +0000</pubDate>
		<dc:creator>unreal4u</dc:creator>
				<category><![CDATA[Pensamientos Personales]]></category>

		<guid isPermaLink="false">http://blog.unreal4u.com/?p=503</guid>
		<description><![CDATA[Cuando el otro día escribí sobre PHPDocumentor, en los comentarios se mencionó que podría crear un post sobre las distintas notaciones que se utilizan comúnmente. Lo primero que debo mencionar es que existen pocas notaciones, la verdad es que yo sólo conocía dos, y grande fue mi sorpresa cuando me di cuenta que sólo existían [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando el otro día escribí <a href="http://blog.unreal4u.com/2011/01/phpdocumentor-haciendo-una-buena-documentacion-excelente/">sobre PHPDocumentor</a>, en los comentarios se mencionó que podría crear un post sobre las distintas notaciones que se utilizan comúnmente. </p>
<p>Lo primero que debo mencionar es que existen pocas notaciones, la verdad es que yo sólo conocía dos, y grande fue mi sorpresa cuando me di cuenta que sólo existían cuatro. Sin embargo, no deja de llamarme la atención la gran cantidad de convenciones que existen alrededor de las notaciones, que por lo general es una convención en cada empresa, adaptado específicamente a sus necesidades y requerimientos.<span id="more-503"></span></p>
<p>Lo primero por lo cual partir es establecer la definición de qué es una convención y qué es una notación. En muy pocas palabras, una convención es un conjunto de reglas que se aplican para lograr un consenso en la programación, de aplicar ciertas reglas de común entendimiento y de esta forma acelerar el desarrollo y lograr trabajar mejor en grupo. En ella se establecen por ejemplo qué reglas se aplican al nombramiento de las variables, de las constantes, de las funciones, de las classes, de los archivos, del árbol de directorios y un gran etc (que incluye también la notación a utilizar). En definitiva, <strong>una convención engloba una notación</strong>.</p>
<p>Una de las convenciones más comunes es aquella que dicta que las constantes deben ir completas en letras mayúsculas para diferenciarlas fácilmente de las variables. También es común encontrarse que los nombres de las tablas en la base de datos deben ir completamente en minúsculas y que la id principal en caso de tener debe incluir la palabra "id_" seguido del nombre de la tabla. (Y en bases de datos que lo permitan, el nombramiento de los índices debe ser "pk_*", "uk_*", "fk_*" para claves primarias, únicas y foráneas respectivamente). También he visto casos donde las tablas se ordenan con un sistema de 3 letras al inicio de cada una (prefix) de acuerdo a su función primordial. (Como por ejemplo: "sis_*" para todas las tablas que involucren directamente el sistema base, "bod_*" para todas las tablas que involucren movimiento de bodegas, "ven_*" para todas aquellas relacionadas con las ventas y así sucesivamente.<br />
Volviendo al tema un poco más en general, en una convención también se establece si se ocupará algún sistema de control de versiones como GIT, SVN u otro, cada cuánto se subirá la información al servidor de producción y qué se hace en caso de desastre. Por lo general, para toda esta información se crea un documento o manual para consultarlo en caso de ser necesario, especialmente útil si hay 100 personas trabajando en un proyecto y de esa forma seguir un solo estilo único en toda la empresa.</p>
<p>Por otro lado, también se debe elegir el tipo de notación a ocuparse, entre las cuales existen: </p>
<h2>Notación C</h2>
<p>Es la menos conocida de los cuatro. Consiste en que básicamente los espacios se cambian por un guión bajo. Esto resultaba útil durante los años 60 donde podía pasar que escribir una mayúscula era más lento que escribir un guión bajo. Lo otro que llama la atención de este tipo de notación es que todo se escribe en letras minúsculas.<br />
Se ocupó mucho en C y C++, aunque actualmente está en desuso. Personalmente, lo ocupo para elementos en HTML, ya sea para señalar ids de elementos, classes y otros. (Ejemplo: <code>&lt;p id="parrafo_principal" class="adorno_adecuado"&gt;</code>).</p>
<h2>Notación posicional</h2>
<p>Otra notación bastante poco conocida hoy en día (pero que en sus tiempos fue famosa) es ésta que se ocupaba primordialmente en ambientes limitado por el famoso 8.3 (el que sea old-school va a saber al tiro, el que no, que investigue. Pista: DOS) que también se aplicaba a algunos lenguajes de programación.<br />
Esta restricción también se aplicaba a algunos lenguajes de programación. De esta forma, (y el único ejemplo que pude encontrar en la red), el nombre de una variable sería LCCIIL01, donde LC sería la aplicación, C para denostar Cobol, IIL para señalar el sub-proceso y 01 era una secuencia.</p>
<h2>Notación CamelCase</h2>
<p>Es quizás la más famosa y la que, aparte de los lenguajes de programación, también se le he visto fuera de estas. Existen en principio dos variantes de esta notación, la UpperCamelCase y la lowerCamelCase. El que tiene un ojo agudo va a conocer la diferencia de ambas sólo con leer el nombre mediante la cual se diferencian, pero para el ojo menos experto le diré que la principal diferencia entre ambas es que en el caso del upper la primera letra siempre se escribirá en mayúscula mientras que en la segunda la primera palabra siempre será entera en minúsculas.</p>
<h2>Notación Húngara</h2>
<p>El inventor de esta notación (<a href="http://es.wikipedia.org/wiki/Charles_Simonyi">Charles Simonyi</a>) nació en Hungría, por eso el nombre. Aunque personalmente debo decir que deberían haberlo llamado notación Simonyi ya que el caballero mencionado es demasiado seco, vean el link de arriba si no me creen.</p>
<p>En fin, volviendo al tema, la notación húngara está basada en parte en CamelCase, específicamente la lowerCamelCase. En su versión más básica, tenemos varios tipos de datos los que reciben una letra. De esa forma, un string recibirá la letra s, un int la letra i, un decimal la letra d. Un arreglo recibirá por supuesto la letra a.<br />
Teniendo eso en cuenta, y combinándola con la CamelCase no resulta difícil pensar en qué sigue: Un nombre cualquiera para nuestra variable siguiendo las reglas del CamelCase.</p>
<p>De esta forma, podemos tener:<br />
aIndicadorResultados<br />
iContador<br />
sPrimerNombre</p>
<p>Y así se continúa. De esta forma, con sólo un miro podemos saber de qué tipo es nuestra variable, y mediante CamelCase (asignándole un nombre significativo) podremos saber cuál es su función, lo cual encuentro ideal en un lenguaje como PHP donde una misma variable puede ser un float o un bit al momento siguiente.</p>
<p>Para finalizar, cabe destacar que los 3 tipos mencionados no son los únicos, para ver los restantes, favor visitar la <a href="http://es.wikipedia.org/wiki/Notaci%C3%B3n_h%C3%BAngara#Situaci.C3.B3n_actual">nunca mal ponderada wikipedia</a> donde se explica con muchos más ejemplos y más profundamente el uso de esta notación.</p>
<p>Espero que les haya servido el artículo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unreal4u.com/2011/03/sobre-convenciones-y-notaciones-hungara-camelcase-etc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El problema del microsegundo en MySQL</title>
		<link>http://blog.unreal4u.com/2011/02/el-problema-del-microsegundo-en-mysql/</link>
		<comments>http://blog.unreal4u.com/2011/02/el-problema-del-microsegundo-en-mysql/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 16:00:49 +0000</pubDate>
		<dc:creator>unreal4u</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Pensamientos Personales]]></category>

		<guid isPermaLink="false">http://blog.unreal4u.com/?p=505</guid>
		<description><![CDATA[Es increíble cómo hoy se celebran 6 años desde que fue ingresado un feature request a MySQL Bugs pidiendo que se implemente una función que de seguro es importante para muchos: los microsegundos en TIMESTAMP y otros relacionados. Si bien es cierto que por lo general no se necesita tanta precisión, de repente es necesario, [...]]]></description>
			<content:encoded><![CDATA[<p>Es increíble cómo hoy se celebran 6 años <a href="http://bugs.mysql.com/bug.php?id=8523">desde que fue ingresado un feature request a MySQL Bugs</a> pidiendo que se implemente una función que de seguro es importante para muchos: los microsegundos en TIMESTAMP y otros relacionados. </p>
<p>Si bien es cierto que por lo general no se necesita tanta precisión, de repente es necesario, ya sea para propósitos de debug o actividad en el sistema, considerando que es un sistema que ocupan muchas personas.<br />
Imaginemos por un momento que administramos Facebook y ocurre lo peor que te puede pasar: uno de los balanceadores de carga entiende mal un request y arma un castillo de naipes sobrecargando paulatinamente cada uno de los servidores.<br />
<span id="more-505"></span><br />
Enseguida vienen las preguntas: ¿Es un bug? ¿De dónde viene? ¿Fue provocado por algún usuario? ¿Por cuál? En estos casos críticos es necesario conocer en qué momento exacto las cosas comenzaron a fallar, ya que un segundo es un espacio de tiempo demasiado amplio: es posible que caigan 2 o más servidores en ese mismo segundo y hay que encontrar el origen, aislarlo, arreglarlo y asegurarse de que no vuelva a pasar, pero para eso, se necesita saber qué usuario hizo qué cosa como para que empezaran a caer los naipes.</p>
<p>Algo parecido me pasó ayer con la aplicación de la empresa: apareció un error en el log del sistema. Todos los errores de PHP los capturo y los guardo en la base de datos, aunque muchas veces no tengo idea de a quién le salió el error debido a que todavía no depuro mucho la parte que es la encargada de revisar la sesión anteriormente existente y rescatar la información desde ahí. Hasta el momento tampoco me había preocupado mucho, ya que se logea la hora en que se produjo el error y además se logea la actividad del usuario: si al usuario en cuestión le apareció un error, voy a poder filtrar por la hora en que se produjo el error si fue él o no.</p>
<p>Sucede que por esas cosas del destino, revisando a quién le podría haber salido el error, me di cuenta que al filtrar por la hora habían dos posibles candidatos, momento en el cual me di cuenta que se hizo posible mi worst-case scenario: dos usuarios distintos que visitaron la <strong>misma página</strong> en el <strong>mismo segundo</strong>. ¿Quién había provocado el error?<br />
Para complicar las cosas aún más, esos dos clicks no eran los únicos: también había una redirección de parte de uno de los usuarios, lo cual puede significar varias cosas. En total, para ese segundo en particular, ahora tenía 5 registros: 2 actividades de usuarios distintos, una redirección y el landing page de esa redirección, además obviamente del error. Para agregarle más enredo, no se sabe bien en qué orden ocurrieron las cosas debido a que MySQL internamente ordena las cosas de acuerdo a su propio criterio y no de acuerdo al microsegundo en el cual ocurrieron las cosas. (Para optimizar esa tabla que presenta una altísima actividad [para hacerse una idea: son 100 usuarios activos + 50 vendedores de campo que continuamente están ingresando ventas, revisando flujo de caja, revisando las cuentas de la empresa, viendo logística y un montón de etcétera], no tiene un simple id_actividad AUTO_INCREMENT asociada, sino una clave primaria compuesta entre varios campos importantes, entre ellas la hora).</p>
<h2>Ok, mucho blabla, ¿qué puedo hacer para solucionar esto?</h2>
<p>Lamentablemente, y como una solución "óptima" no mucho. Existen algunas soluciones pero ninguna es efectiva debido a que el origen de ellas no es en MySQL mismo, sino que el origen se genera afuera de la base de datos, lo cual supone unas cuantas complicaciones que ya veremos. Pero veamos primero cómo podemos almacenar microsegundos. </p>
<p>Llegué a dos potenciales soluciones, de la menos a la más recomendada son:<br />
- Lo primero es tener una tabla donde la fecha que guardaremos se almacene en formato UNIX_TIMESTAMP como un bigint o un numeric (decimal) con la cantidad de dígitos "microsegundianos" que queramos almacenar. Desventajas? Al guardar como un número se pierden todas las ventajas de consultas un poco más complejas, como aquellas que incluyen MONTH(), DAY() y demases. Tampoco se pueden calcular rangos de fechas y otro montón de funciones más. Al menos para mi, se pierde demasiado comparado a la poca ganancia de los microsegundos.</p>
<p>- La segunda solución consiste en guardar la fecha en dos campos por separado: la primera siendo un campo de tipo TIMESTAMP y la segunda siendo un INT del largo que deseemos. Supongamos que queremos guardar 6 dígitos significativos, por lo tanto nuestro rango iría de 0 a 999.999, un número que alcanza a ser guardado en un MEDIUMINT sea UNSIGNED o no. (Por favor tened <a href="http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html">esta página como referencia</a>). Ahora, si queremos ordenar por microsegundo, en nuestro ORDER tendríamos que colocar: <code>ORDER BY UNIX_TIMESTAMP(campo_timestamp),campo_microsegundo</code>. ¿Fácil, cierto?</p>
<h2>Y vienen los problemas...</h2>
<p>La segunda solución sería ideal si no fuera por un pequeño detalle: ¿de dónde podemos sacar el dato del microsegundo? Una cosa es segura: NO a través de MySQL. Prueben con las siguientes variantes: </p>
<pre class="brush: sql; title: ; notranslate">
SELECT MICROSECOND(NOW());
SELECT MICROSECOND(CURRENT_TIMESTAMP);
SELECT EXTRACT(MICROSECOND FROM NOW());
SELECT DATE_FORMAT(NOW(),'%f');
</pre>
<p>¿Qué devuelve? Les simplifico la respuesta: 0 (Cero). En todos los casos. Punto. NO HAY forma de sacar el valor del microsegundo exacto en MySQL. Es un dato que siempre provendrá del exterior.<br />
Ahora bien, en sí eso no es mucho problema porque siempre nos queda la opción de generarlo con PHP. Con un poco de suerte PHP y MySQL estarán en el mismo servidor así que la hora y el microsegundo siempre estarán coordinados... ¿pero qué pasaría si están en máquinas separadas? O peor aún, ¿si entremedio le metemos un balanceador de carga para el webserver?<br />
Respuesta corta: termino con una ensalada de microsegundos que no corresponde a la realidad, ya que una máquina tendrá una hora distinta de otra y además esa hora difiere de la hora del servidor de base de datos. Además hay que tomar en cuenta que en promedio un servidor tiene un margen de error de 3 segundos por año (en el mejor de los casos, tuve que arreglar hace poco un server al cual no se le sincronizaba la hora hacía 9 meses y tenía un desfase de 574.473159 segundos, seguramente porque entremedio de esos 9 meses hubo una hibernación que Linux no considera como tiempo que pasa) es casi imposible que a nivel de microsegundos una fecha pueda ser certera.</p>
<p>En el escenario más probable, un sistema grande, con muchos usuarios y carga, teniendo un balanceador de carga y 2 personas visitando una misma página al mismo tiempo, es que se los mande a dos webservers distintos, dando como resultado, 2 horas (microsegundianamente visto) totalmente distintas, ya que una diferencia de hora de 0.05 segundos ya da resultados muy distintos.</p>
<p>Como conclusión... es que espero que MySQL, después de 6 años incorpore de una buena vez el microsegundo como parte de un campo TIMESTAMP, TIME o DATETIME. (En lo personal, que lo dejen dentro de TIME que sería la aproximación más exacta a lo que se quiere lograr). Y por mientras los usuarios "comunes" de MySQL simplemente tendremos que conformarnos con soluciones parches como el expresado arriba o bien cambiarnos a PostGreSQL que sí tiene soporte para este y muchos otros tipos de datos más, donde en temas de tipos de datos para trabajar con monedas o direcciones ip's están a años luz de MySQL. (No saben los dolores de cabeza que he tenido porque MySQL no me permite guardar 192.168.1.0/28 y tengo que generar y guardar el intervalo de forma manual).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unreal4u.com/2011/02/el-problema-del-microsegundo-en-mysql/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Algunos links interesantes</title>
		<link>http://blog.unreal4u.com/2011/02/algunos-links-interesantes/</link>
		<comments>http://blog.unreal4u.com/2011/02/algunos-links-interesantes/#comments</comments>
		<pubDate>Fri, 04 Feb 2011 03:23:00 +0000</pubDate>
		<dc:creator>unreal4u</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Classes]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Javascript/jQuery]]></category>
		<category><![CDATA[Magento]]></category>
		<category><![CDATA[Mi mundo en noticias]]></category>
		<category><![CDATA[Pensamientos Personales]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.unreal4u.com/?p=499</guid>
		<description><![CDATA[Como siempre, navego en busca de información interesante, y aquí les traigo algunos links de interés (que además me servirán para desocupar un par de pestañas del navegador). Están ordenadas por temática, y hay de todo un poco, desde generadores de passwords hasta guías sobre cómo hacer extensiones de classes para Magento. jQuery / Javascript: [...]]]></description>
			<content:encoded><![CDATA[<p>Como siempre, navego en busca de información interesante, y aquí les traigo algunos links de interés (que además me servirán para desocupar un par de pestañas del navegador). Están ordenadas por temática, y hay de todo un poco, desde generadores de passwords hasta guías sobre cómo hacer extensiones de classes para Magento.<br />
<span id="more-499"></span></p>
<p>jQuery / Javascript:<br />
<a href="http://playground.mobily.pl/jquery/mobily-blocks/demo.html#">Una botonera hecha con jQuery</a> y cuyo efecto me encantó.<br />
<a href="http://www.webresourcesdepot.com/wp-content/uploads/file/jquerydragdrop/">Ordenar un arreglo con drag &#038; drop</a>, enviando una solicitud via Ajax al server principal.</p>
<p>PHP:<br />
<a href="http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/">Cómo crear un daemon en PHP</a>, excelente artículo.<br />
Comprendiendo <a href="http://codeutopia.net/blog/2009/02/20/closures-coming-in-php-53-and-thats-a-good-thing/">cómo ocupar closures en PHP</a>.<br />
Del mismo blog, aprendiendo <a href="http://codeutopia.net/blog/2009/02/16/practical-uses-for-reflection/">cómo usar Reflection en PHP</a>.<br />
Desde DeveloperWorks, un artículo que explica <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">cómo optimizar PHP en 5 simples pasos</a>, bastante básico pero certero.<br />
Interesantísimo artículo de cómo ocupar <a href="http://www.rooftopsolutions.nl/blog/107">Memcached, APC y/o directamente el sistema de archivos</a>.</p>
<p>MySQL:<br />
Del blog personal del creador de menéame, explica <a href="http://gallir.wordpress.com/2011/02/02/optimizando-obsesivamente-las-consultas-al-mysql/">cómo optimizó una consulta en el transcurso de 5 años</a>. Mención aparte se lo llevan los comentarios donde aprendí varias cosas nuevas.</p>
<p>WordPress:<br />
Una guía bastante buena que nos enseña <a href="http://digwp.com/2010/08/pimp-your-wp-config-php/">cómo optimizar (y asegurar) wp-config.php</a>, ese archivo tan vital de WordPress.<br />
¿Quiéres saber cómo funciona WordPress y su sistema de funciones? Échale un miro <a href="http://ayudawordpress.com/35-funciones-utiles-para-functions-php-en-wordpress/">a este post</a> donde definen 35 funciones (bastante) útiles para WP.</p>
<p>Magento:<br />
La mejor manera de trabajar en Magento: extendiendo classes. Por lo mismo, <a href="http://simonyoung.net/magento-tips/extending-an-existing-class-in-magento/">no te puedes perder este artículo</a> donde se explica con bastante detalle cómo crear una extensión.</p>
<p>CSS:<br />
Completo listado de <a href="http://css-infos.net/">todas las propiedades de CSS y cuáles son soportadas</a> en sus distintas versiones.<br />
Una guía acerca de los <a href="http://www.suburban-glory.com/blog?page=125">pseudo-selectores de CSS</a>, lectura recomendada para aquellos que quieran sacarle el jugo a CSS.</p>
<p>Misceláneos:<br />
¿Alguna vez has tenido que armar una página con un mapa de Google Maps y tienes que averiguar las coordenadas? Bueno, entonces sabrás el dolor de cabeza que representa averiguar las mismas, hasta ahora. Sólo basta ubicar bien el puntero <a href="http://www.agenciacreativa.net/coordenadas_google_maps.php">en esta página especialmente dedicada a tal propósito</a> y estás listo: ¡ya tendrás esas coordenadas!<br />
¿Necesitas generar una contraseña segura de forma rápida? Sin duda que <a href="http://www.thebitmill.com/tools/password.html">esto te ayudará mucho</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unreal4u.com/2011/02/algunos-links-interesantes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>phpDocumentor: Haciendo una buena documentación excelente</title>
		<link>http://blog.unreal4u.com/2011/01/phpdocumentor-haciendo-una-buena-documentacion-excelente/</link>
		<comments>http://blog.unreal4u.com/2011/01/phpdocumentor-haciendo-una-buena-documentacion-excelente/#comments</comments>
		<pubDate>Wed, 26 Jan 2011 01:32:54 +0000</pubDate>
		<dc:creator>unreal4u</dc:creator>
				<category><![CDATA[Pensamientos Personales]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.unreal4u.com/?p=484</guid>
		<description><![CDATA[No fue sino hasta el otro día que le encontré un propósito y una utilidad a la documentación bien hecha. Todo surgió debido a que andaba buscando un método determinado que había escrito una vez hace 5 meses atrás y que podría haber estado dentro de un par de classes o bien dentro de un [...]]]></description>
			<content:encoded><![CDATA[<p>No fue sino hasta el otro día que le encontré un propósito y una utilidad a la documentación bien hecha. </p>
<p>Todo surgió debido a que andaba buscando un método determinado que había escrito una vez hace 5 meses atrás y que podría haber estado dentro de un par de classes o bien dentro de un par de archivos de distintas funciones: en resumen, no tenía idea de cómo se llamaba ni menos cómo se ocupaba. Incluso ni siquiera estaba seguro de si efectivamente podría hacer lo que tenía pensado ya que la función que había escrito hacía algo muy parecido, pero podría ser que no hiciera lo mismo. Traté de ubicarla mediante diversos términos <a href="http://blog.unreal4u.com/2011/01/buscando-en-linux-hecho-facil/">con este script</a> pero no hubo caso. Ya casi dándome por vencido se me ocurrió la idea de que en realidad la documentación del programa estaba mal hecha y con múltiples formatos distintos: había que unificar todo.<br />
<span id="more-484"></span><br />
Fue entonces que me puse a buscar estándares de documentación donde, al parecer, Java es definitivamente la número 1 con su JavaDoc, esquema que fue copiado por PHPDocumentor (y que convenientemente pasó a llamarse PHPDoc). Básicamente hay que seguir algunas reglas, las cuales son: </p>
<pre class="brush: php; title: ; notranslate">
/**
 * Un comentario PHPDoc siempre empieza con 2 asteriscos. Comentarios adicionales tendrán 1 asterisco
 *
 * La primera línea será siempre una descripción corta, es como el título
 * Si se desea agregar o extender esa descripción, es necesario un espacio en blanco
 * y luego una descripción un poco más larga que dura hasta el siguiente
 * espacio en blanco.
 *
 * @author PHPDoc es capaz de recibir varios parámetros, entre los más importantes, el autor...
 * @param string $asdf En caso de funciones, los parámetros que recibe esa función
 * @return bool O lo que retorna esa función
 * @version 0.1 También podemos dejar expresado la versión
 * @package Y una de las más importantes: agrupar contenido por packages
 * @subpackage Y por supuesto por sub-packages.
 */
</pre>
<p>Existen bastantes variantes más de etiquetas que podemos poner, <a href="http://en.wikipedia.org/wiki/PHPDoc#Tags">que están listados aquí</a>, página en la que además se explica mucho mejor el uso básico de PHPDoc.</p>
<p>En fin, una vez que unifiqué todos los comentarios, había que generar la documentación. Para esto, <a href="http://sourceforge.net/projects/phpdocu/files/">bajé PHPDocumentor</a>, configuré la configuración predeterminada ubicada en <code>user/default.ini</code> a mi gusto con las rutas y visité la página predeterminada que crea PHPDocumentor. Pasó un buen rato y terminé con mi documentación en un <a href="http://manual.phpdoc.org/">esquema muy parecido a esto</a> (elegir alguna opción de las disponibles).</p>
<p>PHPDocumentor genera entonces toda la documentación técnica en un formato fácil de leer y fácil de seguir para el programador, desde donde es perfectamente posible combinarlo por ejemplo con las keywords propias que genera svn. </p>
<p>De esta forma, es posible generar un completo manual para el desarrollador el cual podrá ser estudiado y eventualmente hasta auditado (y por supuesto aprobado) por alguna empresa externa.</p>
<p>Así que ya saben: no existe excusa alguna para generar una buena documentación... y hacer de esta buena documentación una excelente documentación.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unreal4u.com/2011/01/phpdocumentor-haciendo-una-buena-documentacion-excelente/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Histórico: se han superado 1.000 visitas mensuales!</title>
		<link>http://blog.unreal4u.com/2010/11/historico-se-han-superado-1-000-visitas-mensuales/</link>
		<comments>http://blog.unreal4u.com/2010/11/historico-se-han-superado-1-000-visitas-mensuales/#comments</comments>
		<pubDate>Sat, 13 Nov 2010 04:30:25 +0000</pubDate>
		<dc:creator>unreal4u</dc:creator>
				<category><![CDATA[Pensamientos Personales]]></category>

		<guid isPermaLink="false">http://blog.unreal4u.com/?p=474</guid>
		<description><![CDATA[Sé que este post lo más probable es que no le interesa a nadie, pero de todas formas siempre es bueno celebrar un límite mental, el cual es, en este caso, el tráfico de 1.000 visitas únicas mensuales. Aunque el 80% de las visitas abandonan la página, hay un puñado de 25% que se queda [...]]]></description>
			<content:encoded><![CDATA[<p>Sé que este post lo más probable es que no le interesa a nadie, pero de todas formas siempre es bueno celebrar un límite mental, el cual es, en este caso, el tráfico de 1.000 visitas únicas mensuales. Aunque el 80% de las visitas abandonan la página, hay un puñado de 25% que se queda frecuentemente dando vueltas en el sitio y les agradezco <img src='http://blog.unreal4u.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Sin más ni menos, les presento el SS que demuestra lo que estoy diciendo:<br />

<a href="http://blog.unreal4u.com/wp-content/gallery/miscelaneo/analytics.png" title="" class="shutterset_singlepic12" >
	<img class="ngg-singlepic ngg-center" src="http://blog.unreal4u.com/wp-content/gallery/cache/12__320x240_analytics.png" alt="analytics" title="analytics" />
</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unreal4u.com/2010/11/historico-se-han-superado-1-000-visitas-mensuales/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recuperándome del desastre: Rollback de 3 meses</title>
		<link>http://blog.unreal4u.com/2010/11/recuperandome-del-desastre-rollback-de-3-meses/</link>
		<comments>http://blog.unreal4u.com/2010/11/recuperandome-del-desastre-rollback-de-3-meses/#comments</comments>
		<pubDate>Mon, 08 Nov 2010 15:49:22 +0000</pubDate>
		<dc:creator>unreal4u</dc:creator>
				<category><![CDATA[Pensamientos Personales]]></category>

		<guid isPermaLink="false">http://blog.unreal4u.com/?p=464</guid>
		<description><![CDATA[Estaba anoche trabajando en varias cosas, entre ellas ver la forma de actualizar mi instalación de WordPress. Como siempre se aconseja respaldar todo, respaldé todo lo que eran datos del disco y por supuesto ejecuté lo que yo creía que era un mysqldump (para respaldar) pero me equivoqué en esto último, restaurando el último respaldo [...]]]></description>
			<content:encoded><![CDATA[<p>Estaba anoche trabajando en varias cosas, entre ellas ver la forma de actualizar mi instalación de WordPress. Como siempre se aconseja respaldar todo, respaldé todo lo que eran datos del disco y por supuesto ejecuté lo que yo creía que era un mysqldump (para respaldar) pero me equivoqué en esto último, restaurando el último respaldo que saqué cuando me cambié de hosting, es decir, hubo un rollback de cerca de 3 meses.<br />
Sucede que siempre he tenido la costumbre de respaldar periódicamente la base de datos: para esto, ejecuto un simple "mysqldump -p db_wp > respaldo.sql" mediante la cual rescato la base de datos "db_wp" a respaldo.sql. En un Linux cualquiera, para no ingresar el comando a cada rato, es simplemente flecha hacia arriba durante un rato para encontrar el comando y darle enter. Hasta ahí no hay ningún problema, sólo que hace poco me cambié de hosting y nunca había hecho un respaldo: sí había importado la base de datos cuando me cambié por lo que el comando guardado era "mysql -p db_wp < respaldo.sql". Muy poca diferencia para las dos tremendas diferencias que hay entre ambas.<br />
<span id="more-464"></span><br />
Como es bastante desilusionante perderlo todo, voy a aprovechar el espacio para aconsejar qué hacer en caso de desastre.</p>
<ul>
<li>Si tienes habilitado el log binario de mysql, estás salvado: en ella se guardan todos los datos, incluso los que pasaste a borrar con un "DROP TABLE usuarios". Ojo que puede no servir para condoros que impliquen gigas de información. Revisen en Google acerca de mysqlbinlog. En mi caso no existía este archivo <img src='http://blog.unreal4u.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </li>
<li>Soñar para que el administrador de turno haya activado un respaldo diario. Aunque en teoría debería haber estado haciéndolo, este servidor se instaló hace poco y al parecer nadie se acordó de activar esto <img src='http://blog.unreal4u.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </li>
<li>Confiar en la caché de Google: aunque la gran mayoría de los artículos estaban online, los últimos 3 no estaban <img src='http://blog.unreal4u.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </li>
<li>Publicar los artículos completos en tu RSS y salvarlos desde ahí.</li>
</ul>
<p>Aunque no lo crean, fue esta última opción la que me salvó, pero eso sí: se perdieron los comentarios <img src='http://blog.unreal4u.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Sin embargo, agradezco a Thunderbird por ser lo suficientemente inteligente como para no borrar los artículos siendo que el RSS "nuevo" que había no tenía aquellos artículos.</p>
<p>Es así como se restauraron los artículos de los últimos 3 meses y estamos con los artículos actualizados. Tengan por seguro que NO me volverá a pasar lo mismo <img src='http://blog.unreal4u.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unreal4u.com/2010/11/recuperandome-del-desastre-rollback-de-3-meses/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Hell: qué es, cómo evitarlo… y cómo salir</title>
		<link>http://blog.unreal4u.com/2010/11/google-hell-que-es-como-evitarlo%e2%80%a6-y-como-salir/</link>
		<comments>http://blog.unreal4u.com/2010/11/google-hell-que-es-como-evitarlo%e2%80%a6-y-como-salir/#comments</comments>
		<pubDate>Thu, 04 Nov 2010 03:02:35 +0000</pubDate>
		<dc:creator>unreal4u</dc:creator>
				<category><![CDATA[Pensamientos Personales]]></category>

		<guid isPermaLink="false">http://blog.unreal4u.com/?p=462</guid>
		<description><![CDATA[Algo pasó durante el fin de semana que de pronto al buscar por Google Hell aparezco en los primeros lugares... así que aprovechando el impulso, voy a explicar un poco mejor de qué se trata, cómo evitarlo y cómo salir de ella... si tienes suerte. (Y paciencia). Google Hell (traducido: el infierno de Google o [...]]]></description>
			<content:encoded><![CDATA[<p>Algo pasó durante el fin de semana que de pronto al buscar por  Google Hell aparezco en los primeros lugares... así que aprovechando el  impulso, voy a explicar un poco mejor de qué se trata, cómo evitarlo y  cómo salir de ella... si tienes suerte. (Y paciencia).</p>
<p>Google Hell (traducido: el infierno de Google o GInfierno) fue un  término acuñado porque de pronto el gigante buscador simplemente puede  decidir dejarnos fuera de su índice principal, relegando nuestras  propias páginas a meras búsquedas del tipo "site:misitio.com busqueda",  algo que se conoce como el índice suplementario. También existe la  posibilidad (menor, pero posibilidad a fin y a cabo) de que nos banee y  nos ponga en un blacklist.<br />
Por este hecho, es probable que de pasar a ser siempre los número 1 en  casi cualquier búsqueda, pasemos directamente a la página 300, con  suerte: aquella última página que nadie visitará y por lo tanto,  reducirá las visitas en un (en mi caso) casi 65%. Auch.<br />
<span id="more-462"></span></p>
<h2>¿Cómo evitar el Google Hell?</h2>
<p>No indexándote en Google. No, fuera de bromas, existen bastantes técnicas que puedes evitar:</p>
<ul>
<li>Intercambio de links: Pecado mortal. Si pagaste para que de la noche  a la mañana te llenaran de links entrantes... puedes olvidarte con  certeza de que aparezcas primero en todos los sitios. Más información en  el cuarto ítem.</li>
<li>Páginas duplicadas o hasta dominios duplicados: Creo que nunca he  tocado este tema en el blog, pero un pecado gigantezco (aunque no tan  grande como el anterior) es tener los dominios (ejemplo)  www.unreal4u.com y unreal4u.com por separado sin redirigir a alguno en  particular. Google considera que sólo estás tratando de duplicar las  páginas para que de esta forma, aparezcas mejor rankeado. El cómo evitar  esto será objeto de un próximo post.</li>
<li>Títulos duplicados: Es casi lo mismo que lo anterior, pero menos grave. Inscríbase en <a href="http://www.google.com/webmasters">Google Webmasters</a> para ver esto.</li>
<li>Páginas en blanco: Uno de los pecados más grandes a realizarse es  tener páginas en blanco. Sucede que hace algún tiempo atrás, existían  muchas páginas que tenían un montón de comentarios (que el navegador  ignora) con una montonera gigantezca de links. Esos links para Google  eran relevantes, hasta que se dieron cuenta de lo que pasaba y desde ese  entonces que página en blanco significa un pasaje casi directo al  Google Hell.</li>
<li>Cabeceras 404: ¿Alguna vez has creado una página 404 personalizada?  ¿Se ve bonito cierto? Pensarías de cierta forma que Google aprecia esto,  y es cierto... siempre y cuando mandes el código 404! Sucede que el  ErrorDocument <strong>redirige</strong> el request al 404, haciendo que  de esta forma, el 404 en realidad se transforma en un 200... al tener  muchos 404 tendrás mucho contenido duplicado... mucho contenido  duplicado significa Google Hell.</li>
<li>Crear robots.txt y sitemap.xml: Estos dos archivos son muy útiles para los buscadores... sé amigable con ellos y créalas.</li>
</ul>
<h2>Cómo salir del Google Hell</h2>
<p>Si has llegado hasta aquí... no hay mucho más de lo que pueda aconsejar que no sea seguir los consejos de arriba. Arregla el sitio, ten ojo, revisa en Google Webmasters, manda sitemaps como loco y reza  para que Google no decida dejar pasar un año antes de dejarse caer  nuevamente con su Googlebot. ¡Y nunca compres intercambio de links!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.unreal4u.com/2010/11/google-hell-que-es-como-evitarlo%e2%80%a6-y-como-salir/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

