<?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>alvarezp</title>
	<atom:link href="http://blog.alvarezp.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.alvarezp.org</link>
	<description>cat &#62;&#62; /dev/blog</description>
	<lastBuildDate>Tue, 15 May 2012 07:36:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JavaScript debe desaparecer de la Web</title>
		<link>http://blog.alvarezp.org/2012/05/15/javascript-debe-desaparecer-de-la-web/</link>
		<comments>http://blog.alvarezp.org/2012/05/15/javascript-debe-desaparecer-de-la-web/#comments</comments>
		<pubDate>Tue, 15 May 2012 07:36:14 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Diseño web]]></category>
		<category><![CDATA[Ensayos]]></category>
		<category><![CDATA[Español]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Opera browser]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[Planeta Linux]]></category>
		<category><![CDATA[Queja]]></category>
		<category><![CDATA[Seguridad]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1594</guid>
		<description><![CDATA[En recientes días escribí un post sobre cómo hacer nuestra navegación más segura usando Opera (en inglés). El principio de operación es simple: deshabilitar JavaScript por defecto excepto para aquellos sitio en los que plenamente confío.
No fue capricho. En alguna ocasión mordí un anzuelo y, sin intención, mi PC participó en un ataque masivo contra [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.alvarezp.org/wp-content/uploads/2012/05/script.png" alt="script" title="script" class="aligncenter size-full wp-image-1619" /></p>
<p>En recientes días escribí un post sobre <a href="http://blog.alvarezp.org/2012/03/04/tweaking-opera-for-safer-web-browsing/">cómo hacer nuestra navegación más segura usando Opera</a> (en inglés). El principio de operación es simple: deshabilitar <a href="http://en.wikipedia.org/wiki/Javascript">JavaScript</a> por defecto excepto para aquellos sitio en los que plenamente confío.</p>
<p>No fue capricho. En alguna ocasión mordí un anzuelo y, sin intención, mi PC participó en un ataque masivo contra <a href="http://en.wikipedia.org/wiki/Freenode">Freenode</a>. ¿Cómo ocurrió? Visité una página que tenía un código malicioso de JavaScript, el cual se ejecutó automáticamente (tal vez gracias a <a href="http://en.wikipedia.org/wiki/Mouseover">onMouseOver</a> o a onLoad) y mandó spam a dicha red. Me bloquearon varias horas y tuve que contactar a los administradores para explicar el caso. Ellos lidian con este tipo de cosas todo el tiempo (¡señal!).</p>
<p><img src="http://blog.alvarezp.org/wp-content/uploads/2012/05/alvarezp-banned.png" alt="alvarezp-banned" title="alvarezp-banned" class="aligncenter size-full wp-image-1632" /></p>
<p>No es el único tipo de <a href="http://en.wikipedia.org/wiki/Javascript#Security">problema de seguridad de JavaScript</a>. Tampoco es el único ataque facilitado por JavaScript: como referencia les dejo <a href="http://es.wikipedia.org/wiki/Cross-site_scripting">XSS</a>, <a href="http://es.wikipedia.org/wiki/Cross_Site_Request_Forgery">X/CSRF</a>, <a href="http://es.wikipedia.org/wiki/Clickjacking">Clickjacking</a>, <a href="http://ui-redressing.mniemietz.de/">Revestimiento de interfaz (UI redressing)</a>, fuga de datos personales, etc. No que <em>requieran</em> de este lenguaje, sino que con él son mucho más fáciles de implementar sin que el navegador pueda detectarlos.</p>
<p>Busqué formas de evitar llegar a esa conclusión; después de todo, la mayoría de los sitios Web usan JavaScript. ¿Es posible que el navegador sólo ejecute código bien intencionado? No. Una computadora es tonta. No puede distinguir código malicioso. Incluso existe <a href="http://en.wikipedia.org/wiki/Evil_bit">una broma sobre el tema</a>. ¿Cómo le hacen los antivirus? Se basan en firmas y bases de datos alimentadas por humanos y aún así a veces arrojan falsos positivos. Peor aún, también arrojan falsos negativos.</p>
<p>Sin embargo <em>yo necesito</em> una forma de confiar en mi PC. En el momento en que pierde mi confianza, no sé si está interceptando lo que tecleo o lo que transmito, o si las páginas que me muestra son ilegítimas, o si los programas está alterados de otro modo. No sé si mis passwords y datos de tarjetas de crédito están siendo transmitidos por la red a algún cibercriminal. Y no, <a href="http://www.youtube.com/watch?v=cf3zxHuSM2Y&#038;t=4m48s">no estoy exagerando</a>. Desde el momento en que pierde mi confianza tengo que aplicarle un <a href="http://es.wikipedia.org/wiki/Cómputo_forense">análisis forense</a>, aunque, por lo general, sale más rápido reinstalar.</p>
<p><span id="more-1594"></span><br />
<div id="attachment_1643" class="wp-caption aligncenter" style="width: 380px"><a href="http://www.youtube.com/watch?v=cf3zxHuSM2Y&#038;t=4m48s"><img src="http://blog.alvarezp.org/wp-content/uploads/2012/05/ted-creditcards-1.png" alt="(Mikko Hyppönen presenta en TED un listado de datos de tarjetas de crédito, como los roba un cíbercriminal.)" title="ted-creditcards-1.png" width="370" height="278" class="size-full wp-image-1643" /></a><p class="wp-caption-text">Mikko Hyppönen presenta en TED un listado de datos de tarjetas de crédito, como los roba un cíbercriminal.</p></div></p>
<p>Lo mismo ocurre con el navegador. Yo confío en que el navegador me permite mantener el control mientras navego. Si no confío en el navegador no puedo confiar en los datos que se envían o se reciben, en el contenido de los sitios que visito o si realmente estoy yendo a los sitios que creo. Si mi navegador está comprometido ni siquiera puedo confiar en el cifrado <a href="http://es.wikipedia.org/wiki/Transport_Layer_Security">SSL</a>, por lo que ni con <a href="http://es.wikipedia.org/wiki/Hypertext_Transfer_Protocol_Secure">HTTPS</a> puedo asegurar la confidencialidad o integridad de mis transacciones.</p>
<p>No por nada existe <a href="http://en.wikipedia.org/wiki/Noscript">NoScript</a> para <a href="http://en.wikipedia.org/wiki/Firefox">FireFox</a>.</p>
<h3>Analogía con otro error histórico: los privilegios de administrador</h3>
<p>No porque sea la opción más popular significa que sea la mejor o la más segura. Me recuerda a los llamados <a href="http://es.wikipedia.org/wiki/Permisos_(informática)"><em>derechos de administrador</em></a>. Cuando comencé a usar a Linux, en tiempos de Windows 2000 y cuando 98 era todavía lo más popular, los linuxeros me decían que nunca usara mi PC como <a href="http://es.wikipedia.org/wiki/Root"><em>root</em></a> (&#8221;root&#8221; el usuario privilegiado en Linux, similar al &#8220;Administrator&#8221;). Yo pensaba: pero entonces no puedo instalar programas, no puedo configurar hardware, mi CD-RW no puede pedir todo el CPU y es propenso a fallas de escritura, no puedo &#8216;tunear&#8217; mi sistema igual, etc. Todos esos &#8220;problemas&#8221; eran <em>precisamente</em> los motivos para no usar <em>root</em> por defecto. ¡Es bueno que no tan fácilmente se instale un programa o hardware! ¡Es bueno que no cualquier programa se adueñe del CPU! ¡Es bueno que no tan fácil se puedan hacer ajustes al sistema!</p>
<p>No porque sea la opción más popular significa que sea la mejor o la más segura. Windows 9x era lo más popular en ese entonces y 2000, intentando traerse el <a href="http://es.wikipedia.org/wiki/Arquitectura_de_Windows_NT">núcleo de NT</a>, ahora multiusuario, apenas comenzaba a tomar auge. Muchos programas se rompieron por ese cambio de paradigma.</p>
<p>Ese pequeño cambio de pensar tenía muchísimas ventajas. En Linux y en Mac es rarísimo ver un virus. No que no los haya, pero no son tan fáciles de hacer y tenemos más líneas de defensa. Cada usuario tiene su espacio bien segmentado. Un usuario no puede ver el contenido de otro usuario. Un usuario no puede dañar el sistema, sólo su propia cuenta. Si un virus se inyecta en el sistema es porque explotó una vulnerabilidad y se reconoce como tal.</p>
<p>Pero seguía existiendo la necesidad de instalar programas, y no era fácil. Había que resolver el problema. Aquí es donde tenemos que hacer una pausa, quedarnos en &#8220;still&#8221; y analizar las posibles rutas:</p>
<ul>
<li>Considerar que el problema es la falta de privilegios por default y cambiarse a usar root por default, como lo hacía Windows 2000. Windows 9x ni siquiera tenía el concepto de privilegios; todos eran &#8220;administradores&#8221;.</li>
<li>Considerar que el problema es el tedio, y crear métodos seguros para hacer fácil la escalación controlada de privilegios, pero manteniendo un nivel aceptable de seguridad. Habría que inventarlo de ser necesario.</li>
</ul>
<p>Afortunadamente en Linux cuenta con <a href="http://es.wikipedia.org/wiki/Su_(Unix)"><em>su</em></a> y <a href="http://es.wikipedia.org/wiki/Sudo"><em>sudo</em></a>. Igual, para Windows XP SP2, Microsoft mejoró significativamente la delimitación de las facultades de los usuarios restringidos. Si en Windows 2000 muchos programas se rompieron, con este cambio hubo otra barrida; era obvio. Muchos programadores se quejaron, pero era necesario. En Windows Vista incluyeron <a href="http://en.wikipedia.org/wiki/User_Account_Control">UAC</a> pero el plan estuvo mal ejecutado. Me han contado que en Windows 7 finalmente dieron en el clavo. Se tardaron más de 10 años, pero así se hace un cambio de esta magnitud.</p>
<p>Yo veo el uso de JavaScript como estar en la primera opción, atacando el problema incorrecto, y hay que pasarse a la segunda opción. Con la popularidad actual de JavaScript, el cambio tendría que ser sumamente doloroso, pero igualmente necesario.</p>
<h3>De vuelta al tema</h3>
<p>La única manera de estar seguros contra ataques de JavaScript es apagándolo. Si no lo hago así, cualquier persona puede ejecutar código en mi navegador con simplemente incluirlo en un sitio que yo visite. El código puede ser confiable o malicioso, y en cualquiera de los casos se ejecuta <em>sin mi consentimiento</em>, es decir, antes de yo validar o aceptar dicha ejecución. La única forma de prevenirlo es que yo lo habilite sólo para los dominios en los que confío.</p>
<p>¿Basta con deshabilitar JavaScript? No. Hay otros modos de atacar, pero JavaScript los facilita tremendamente; la mayoría de los ataques están basados y ofuscados con JavaScript.</p>
<h3>¿Qué fue lo que salió mal?</h3>
<p>¿Cómo es que pasamos del deseo de ser productivos, a tener corriendo en nuestras computadoras un lenguaje que permite <a href="http://en.wikipedia.org/wiki/Web_analytics">rastrearnos</a>, atacar otros sitios, etc.?</p>
<h4>La escalera de la programación</h4>
<p><strong>Peldaño 0</strong>. Todo comienza por el principio, y en este caso, las computadoras son simples máquinas que harán lo que su operador le diga. A fin de cuentas eso son: viles, patéticas y despreciables herramientas que simplemente siguen las órdenes de un humano. El programa se hace en un <a href="http://es.wikipedia.org/wiki/Lenguaje_de_programación">lenguaje cualquiera</a>.</p>
<p><strong>Peldaño 1</strong>. No todos los humanos tienen la capacidad de hablarle a una PC en su idioma. Las instrucciones son demasiado primitivas y básicas, de modo que se vuelve una mezcla de ciencia y arte. Se requiere de tiempo y dedicación para hacer un programa medianamente complejo. Entonces, otras personas hacen programas por nosotros. Nosotros nos limitamos a instalarlos en nuestra PC. La PC sigue haciendo lo que el operador le dice&#8230; o no exactamente: hará lo que le diga el programador por medio de la autorización del operador.</p>
<p>Existe ahora un punto débil: el operador ahora debe confiar en el programador, pues las instrucciones pueden ser maliciosas. ¿Qué tal si el código del programador, como parte del programa, dice que tome archivos y los mande por correo o por fax? La computadora no puede distinguir la intención de esa instrucción. El código puede ser sintáctica y semánticamente válido y aún así realizar funciones maliciosas. Sólo queda, como línea de defensa, que el operador tome la decisión de instalar el programa o no, según su confianza en el programador.</p>
<p>Esto es crucial. Es imprescindible la libertad de autorización del operador. Esta libertad se puede ver afectada por engaños, por ejemplo, si el programador le muestra un código diferente al operador del que se va a ejecutar, o si el operador no es hecho consciente de lo que está instalando.</p>
<div class="wp-caption aligncenter" style="width: 676px"><a href="http://es.xkcd.com/strips/exploits-de-una-madre/"><img alt="XKCD nos cuenta la historia de una madre que le cambió de nombre a su hijo para borrar la base de datos de la escuela de su hijo. Una PC no distingue intenciones buenas de malas." src="http://es.xkcd.com/site_media/strips/exploits_of_a_mom.png" title="Exploits de una madre" width="666" height="205" /></a><p class="wp-caption-text">XKCD nos cuenta la historia de una madre que le cambió de nombre a su hijo para borrar la base de datos de la escuela de su hijo. Una PC no distingue intenciones buenas de malas.</p></div>
<p>Sin embargo, se presenta una excepción cuando el programador y el operador son la misma persona. Siempre es más satisfactorio lograr que el programa haga algo que ir a instalar ese programa en la PC, ¡y desmiéntanme! Es sumamente aburrido instalar un programa. Es más aburrido cuando el programador cometió un error y hay que ir a reinstalar una versión nueva, y aún más aburrido cuando esto ocurre una y otra vez.</p>
<p><strong>Peldaño 2</strong>. Hay que instalar los programas en PCs que están aquí cerca o allá en el cerro. Su instalación puede requerir cambios en el sistema, potencialmente rompiendo la configuración de la máquina misma. Entonces la industria contempla la posibilidad de ejecutar un programa sin necesidad de ser instalado. Esto simplificaría las implementaciones, ahorraría dinero significativamente y se enfocaría el esfuerzo en el desarrollo del programa, y no en su instalación. La necesidad es obvia: un lenguaje que no requiera compilación, cuyo resultado no requiera una instalación, que funcione en todos lados de forma predecible, que no padezca del <a href="http://en.wikipedia.org/wiki/Dependency_hell">infierno de las dependencias</a> (librerías), etc. Y luego existen diferentes computadoras con diferentes características, versiones de sistema operativo, etc.</p>
<h4>La escalera de la Web</h4>
<p>Por otra parte, se genera otra línea de escalafones de tecnología, la de la World Wide Web:</p>
<p><strong>Peldaño A</strong>. El formato de la Web es <a href="http://es.wikipedia.org/wiki/HTML">HTML</a>, que es como hablar de un <a href="http://en.wikipedia.org/wiki/DOC_(computing)">.doc</a>, pero en lugar de binario, en texto plano. El HTML tiene la característica de que el archivo se <a href="http://es.wikipedia.org/wiki/Renderización">renderiza</a> por diferentes programas en diferentes plataformas y da resultados suficientemente similares. Se vislumbra a la Web como algo multiplataforma (vamos a dejar la discusión de los múltiples navegadores para otra ocasión).</p>
<p><strong>Peldaño B</strong>. La necesidad de la interactividad de las páginas Web. Más que una necesidad por hacer páginas interactivas, es resolver necesidades de interactividad muy específicas. Por ejemplo, el HTML no incluye semántica para mostrar selectores de fecha o validar direcciones de correo electrónico. El manejo masivo de información comienza a pedir menús de árbol expandibles, tan comúnmente usados en el escritorio. Resulta natural querer poner un menú contraíble en una página. Al iniciar como un lenguaje de texto genérico, HTML no podía dar suficiente semántica para que un navegador ofrezca estas capacidades él mismo. Al final todos pecaron: los navegadores populares no ofrecieron una forma de ofrecer tablas de contenido a partir de las etiquetas H1 a H6. HTML no se extendió con nuevos tipos de elementos INPUT, por ejemplo.</p>
<div id="attachment_1660" class="wp-caption aligncenter" style="width: 329px"><img src="http://blog.alvarezp.org/wp-content/uploads/2012/05/wikitoc.png" alt="Tabla de Contenido generada automáticamente por Wikipedia para sus documentos. De forma similar, un navegador podría generar automáticamente la TdC según lo indiquen los elementos H1 a H6." title="wikitoc" width="319" height="240" class="size-full wp-image-1660" /><p class="wp-caption-text">Tabla de Contenido generada automáticamente por Wikipedia para sus documentos. De forma similar, un navegador podría generar automáticamente la TdC según lo indiquen los elementos H1 a H6.</p></div>
<p>Desafortunadamente para HTML, todo mundo le quiso poner diferentes funciones para hacer algo &#8220;innovador&#8221;, como las etiquetas MARQUEE, BLINK y FRAME. Tuvo que llegar el momento de estandarizar, simplificar y reencauzar el lenguaje. Esto también demoró su progreso.</p>
<p>Aquí entra el auge de JavaScript. Por sí misma, la interactividad no debería ser riesgosa para los usuarios. El problema es la aplicación de la misma por medio de un lenguaje de programación (es decir, de propósito general) en lugar de un lenguaje de formato, semántico, específico. Aquí es donde <strong>se rompe el peldaño 1</strong>: el código escrito en este lenguaje se ejecuta en el navegador sin intervención del usuario.</p>
<h4>La unión de ambas escaleras</h4>
<p>Al final, se unen las dos escaleras para crear un monstruo. En la combinación navegador-JavaScript, los desarrolladores encuentran una plataforma para resolver el problema de la difícil implementación (descrito en el <strong>peldaño 2</strong>), mientras que el boom de la interactividad (<strong>peldaño B</strong>) facilita el auge. Lo anterior, a pesar del romper la libertad de autorización del usuario u operador (descrito en el <strong>peldaño 1</strong>). JavaScript hace que la implementación de programas sea extremadamente simple, pero a costa del usuario. Ahora el usuario tiene una plataforma de propósito mezclado: por una parte la lectura de la Web y por otra la de aplicaciones Web.</p>
<p>Sobre este ladrillo roto se han estado construyendo más tecnologías. Al principio las aplicaciones web eran páginas cuya interactividad se extendía con JavaScript, pero cada vez se depende más de JavaScript. Ahora hay sitios que generan las páginas mismas desde el script. Esto crea un nivel extra de abstracción que los navegadores no pueden optimizar fácilmente. Al final se traduce en mayor consumo de memoria y CPU, haciendo cada vez más lento al navegador en general. Para mi gusto, es un abuso generalizado de JavaScript, pero que también devela una especie de ruta natural, una <a href="http://en.wikipedia.org/wiki/Path_of_least_resistance">ruta de menor resistencia</a>, que es mejor atacar por los cuernos.</p>
<h3>¿Qué necesitamos?</h3>
<p>Lo que deberíamos tener es:</p>
<ul>
<li>Una forma de convertir las aplicaciones Web en aplicaciones de escritorio, sin esfuerzo para el programador.</li>
<li>Una forma de instalar e integrar fácilmente estas nuevas aplicaciones, sin esfuerzo para el usuario.</li>
<li>Una forma de distinguir entre la mera interactividad de documento y una aplicación hecha y derecha. La única forma que yo veo, infalible, es desaparecer JavaScript de la lectura de la Web, a favor de mejoras semánticas a HTML y CSS y dejar JavaScript para aplicaciones Web, fuera del navegador.</li>
</ul>
<h4>¿Funcionaría, al menos en concepto?</h4>
<p><a href="http://en.wikipedia.org/wiki/Css">CSS</a> es un lenguaje sumamente poderoso. Sin necesidad de JavaScript se pueden efectos muy interesantes. Esta página muestra <a href="http://speckyboy.com/2010/04/26/30-pure-css-alternatives-to-javascript/">30 efectos con CSS puro</a> que se pueden hacer hoy por hoy.</p>
<p><strong>¿Podría comprar un boleto de avión sin JavaScript?</strong> Poco a poco sería más factible hacer una compra de avión menos frustrante. El <em>wizard</em> estaría programado del lado del servidor y se usaría HTML5 (o tal vez sería necesario inventar algo nuevo) para mejorar la accesibilidad y la interactividad (validaciones, controles de fecha y demás). Imagino que el contenido del <em>wizard</em> se va acumulando en la misma página conforme se llena, alimentado por procesos del lado del servidor. De esta forma podría imprimirse todo el <em>wizard</em> una vez lleno. Habría que estar al pendiente del tiempo restante a la expiración de la sesión. El elemento META podría contener un atributo &#8220;session_expiration&#8221; y el elemento FORM podría contener un atributo de &#8220;partial_action&#8221; que permitiría al navegador poner un contador en segundos y un botón de &#8220;refresh&#8221; para mantener la sesión activa y refrescar el estado del <em>wizard</em>.</p>
<p><strong>¿Podría tener validaciones arbitrarias del lado del cliente?</strong> Afortunadamente HTML5 ya permite esto con el atributo <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/common-input-element-attributes.html#the-pattern-attribute"><em>pattern</em></a>, en el que se le puede poner una <a href="http://es.wikipedia.org/wiki/Expresión_regular">expresión regular</a> a cumplir como requisito para enviar el formulario. <a href="http://html5pattern.com/">HTML5Pattern</a> muestra algunos ejemplos de validación arbitraria por expresión regular.</p>
<p><strong>¿Funcionarían los SSO como Google Accounts, etc.?</strong> Probablemente también se necesiten extensiones semánticas, pero quisiera que que el navegador tuviera un indicador de cuentas en las que tengo sesión en este momento, principalmente basados en <a href="http://en.wikipedia.org/wiki/OpenID">OpenID</a>, <a href="http://en.wikipedia.org/wiki/BrowserID">BrowserID</a> y otros protocolos abiertos. Sería responsabilidad de Facebook desarrollar su propio &#8220;provider&#8221; para Facebook Connect.</p>
<h4>Lo que se lograría</h4>
<ul>
<li>Yo tendría que aceptar antes de permitir la instalación de la aplicación &#8220;Facebook&#8221;, &#8220;Twitter&#8221; o &#8220;Hangout&#8221;.</li>
<li>Al distinguir una aplicación Web de una página Web, las plataformas de aplicación web (que ya no serían los navegadores) permitirían una más fácil integración entre la aplicación y el escritorio (iconos, lectura de documentos, etc).</li>
<li>Yo podría confiar en mi navegador.</li>
<li>La sola lectura de páginas web no consumiría tantos recursos como una aplicación Web.</li>
<li>Poco a poco el HTML iría evolucionando para soportar nativamente lo que hacen las aplicaciones Web. Así ha ocurrido con HTML5, por ejemplo, con los nuevos elementos INPUT.</li>
<li>Sería más difícil que me rastrearan, como con Google Analytics y demás.</li>
<li>Funcionaría mejor el botón de Anterior.</li>
<li>Funcionaría mejor el botón de Imprimir.</li>
<li>Las páginas serían mucho más &#8220;accesibles&#8221;.</li>
<li>La barra de estado siempre diría la verdad. Hoy en día hay forma de que uno sombree una liga y lo que se muestra en la barra de estado sea diferente que el sitio al que el navegador mande (*cough* Facebook *cough*).</li>
<li>Se reduce el footprint de los lectores de páginas Web y se dedica JavaScript (o cualquier otro lenguaje) para aplicaciones especializadas.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2012/05/15/javascript-debe-desaparecer-de-la-web/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>When is a protocol a tunneling protocol?</title>
		<link>http://blog.alvarezp.org/2012/05/11/when-is-a-protocol-a-tunneling-protocol/</link>
		<comments>http://blog.alvarezp.org/2012/05/11/when-is-a-protocol-a-tunneling-protocol/#comments</comments>
		<pubDate>Fri, 11 May 2012 09:06:04 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Net-admin]]></category>
		<category><![CDATA[Notas]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1605</guid>
		<description><![CDATA[This is a note on episode 102 of the fantastic-as-always Packet Pushers Podcast. Initially it was going to be destined for them and less than 140 characters long but I just couldn&#8217;t, so I started writing freely and all of this came up.
So, the whole episode is about analyzing if is MPLS tunneling. Maybe somebody [...]]]></description>
			<content:encoded><![CDATA[<p>This is a note on <a href="http://packetpushers.net/show-102-a-layer-of-indirection-is-mpls-tunneling/">episode 102</a> of the fantastic-as-always <a href="http://packetpushers.net/">Packet Pushers Podcast</a>. Initially it was going to be destined for them and less than 140 characters long but I just couldn&#8217;t, so I started writing freely and all of this came up.</p>
<p>So, the whole episode is about analyzing if is MPLS tunneling. Maybe somebody asked the question or maybe there is some disagreement in the industry.</p>
<p>I found it very interesting (and fun, as usual) but after listening to the show it got me thinking: it&#8217;s the wrong question. It&#8217;s not if MPLS is tunneling, but if MPLS *can be used for* tunneling.</p>
<p>So before going deeper I also have to say that I have never implemented MPLS; I have labbed it but that&#8217;s about it. I don&#8217;t consider myself to have enough foundations or experience as these guys. I hope not to shoot myself in the foot. With that said&#8230;</p>
<p>Tunneling is an application of encapsulation. Transport, multiplexing and delivery are other applications of encapsulation. Protocols encapsulate their payload. I see Ethernet as layer 2 &#8220;delivery&#8221;, IP as layer 3 &#8220;delivery&#8221; (or &#8220;transport&#8221; across multiple layer 2 domains), and 802.1Q as 1-factor multiplexing. I&#8217;m thinking TCP and UDP are 2-factor multiplexing.</p>
<p>I think we agree that IPv4 and IPv6 are network protocols, but you can create a tunnel with Hurricane Electric by setting the Protocol to 41 in IPv4, and without using GRE. The tunnel gets created by the way they are stacked and used.</p>
<p>So a valid question can be stated: am I setting up a tunnel when I start LDP and MPLS? So, from my point of view, the following are requirements for a tunnel to be made:</p>
<p>1. It is set up by or for a user outside of the domain of the transport network (even if the user is a network engineer in a data center). If I create a tunnel over the Internet, I&#8217;m the user outside of my ISP&#8217;s network. Note that I can tunnel over my own enterprise network; there is some interest in doing that and I&#8217;m the end user for that particular case. This takes away MPLS, but not MPLS VPN.</p>
<p>2. The tunnels created deliver the packet between two endpoints but neither of them are the final destination; or&#8230; well, technically yes, it can, but my point is that there is another endpoint higher in the OSI layers, even if it ends up being the same one. Once a packet gets delivered it gets decapsulated and further processed again for its delivery. Yes, Ethernet may fit here, but it doesn&#8217;t fit #1.</p>
<p>3. Two same or different delivery protocols with usually different address spaces are stacked onto each other. As such, there must be source and destination endpoint addresses endpoints in the encapsulated packet and in the lower-layer protocol. You may use the same address space, but most of the time it&#8217;s only a trick to get around some weird limitation. Oh, wait, just like tunnels! ;-)</p>
<p>So, by how it works, no protocol is a tunneling protocol (well, except maybe IPSec in tunnel mode). It&#8217;s only by what it was designed for that can be called a &#8220;tunneling protocol&#8221;.</p>
<p>Examples:<br />
* ICMP is not a tunneling protocol but it can be used to create tunnels.<br />
* Same for HTTP.<br />
* It can be said that GRE is a tunneling protocol, but it doesn&#8217;t work by creating tunnels, but by encapsulating packets and making it easy to layer a protocol on top of another.</p>
<p>Was MPLS designed to do tunnels?</p>
<p>Best regards.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2012/05/11/when-is-a-protocol-a-tunneling-protocol/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>stats.gawk</title>
		<link>http://blog.alvarezp.org/2012/04/19/stats-gawk/</link>
		<comments>http://blog.alvarezp.org/2012/04/19/stats-gawk/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 04:14:11 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Español]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Net-admin]]></category>
		<category><![CDATA[Notas]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[Planeta Linux]]></category>
		<category><![CDATA[Tenía que ser un geek.]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1578</guid>
		<description><![CDATA[$ cat bin/stats.gawk
#!/usr/bin/gawk -f

{
	d = $1 ~ /^[0-9]/;
}

d &#038;&#038; !f {
	M = $1;
	m = $1;
	f = 1;
}

d &#038;&#038; $1 > M {
	M = $1;
}

d &#038;&#038; $1 < m {
	m = $1;
}

d {
	c += 1;
	s += $1;
	ss += $1*$1;
}

END {
	OFS = "\t";
	a = s/c;
	print "cnt,min,max,sum,avg,stdev:", c, m, M, s, a, sqrt(ss/c-a**2);
}

Ejemplo de uso:


$ ls -s1 &#124; [...]]]></description>
			<content:encoded><![CDATA[<pre class="code">
$ cat bin/stats.gawk
#!/usr/bin/gawk -f

{
	d = $1 ~ /^[0-9]/;
}

d &#038;&#038; !f {
	M = $1;
	m = $1;
	f = 1;
}

d &#038;&#038; $1 > M {
	M = $1;
}

d &#038;&#038; $1 < m {
	m = $1;
}

d {
	c += 1;
	s += $1;
	ss += $1*$1;
}

END {
	OFS = "\t";
	a = s/c;
	print "cnt,min,max,sum,avg,stdev:", c, m, M, s, a, sqrt(ss/c-a**2);
}
</pre>
<p>Ejemplo de uso:
</pre>
<pre class="code">
$ ls -s1 | ./stats.gawk
cnt,min,max,sum,avg,stdev:	53	4	33064	78860	1487.92	6125.08
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2012/04/19/stats-gawk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Super Happy Dev House, Tijuana, 24 de marzo de 2012</title>
		<link>http://blog.alvarezp.org/2012/03/22/super-happy-dev-house-tijuana-24-de-marzo-de-2012/</link>
		<comments>http://blog.alvarezp.org/2012/03/22/super-happy-dev-house-tijuana-24-de-marzo-de-2012/#comments</comments>
		<pubDate>Thu, 22 Mar 2012 07:15:06 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Español]]></category>
		<category><![CDATA[Gultij]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[Planeta Linux]]></category>
		<category><![CDATA[Tijuana]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1572</guid>
		<description><![CDATA[Esto es muy simple. A desarrollar se aprende desarrollando. Este 24 de marzo (sábado) de 2012 estaremos reuniéndonos en el SHDH Tijuana a ver qué sale. :-) Algunos van a trabajar sobre proyectos de su página, otros sobre proyectos de negocio, otros van a ver qué hay de nuevo en el desarrollo de software, etc. [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption aligncenter" style="width: 460px"><a href="http://shdhtj.pbworks.com/"><img alt="Invitación al SuperHappyDevHouse Tijuana, marzo 2012." src="http://shdhtj.pbworks.com/f/shdhv2_2.jpg" title="Cartel SHDH TJ" width="450" height="320" /></a><p class="wp-caption-text">Cartel SuperHappyDevHouse Tijuana, marzo 2012.</p></div>
<p>Esto es muy simple. A desarrollar se aprende desarrollando. Este 24 de marzo (sábado) de 2012 estaremos reuniéndonos en el SHDH Tijuana a ver qué sale. :-) Algunos van a trabajar sobre proyectos de su página, otros sobre proyectos de negocio, otros van a ver qué hay de nuevo en el desarrollo de software, etc. La mejor forma de conocer en una comunidad local es participando. Así que no hay más: regístrate y llégale.</p>
<p>Nos vemos ahí. Lleva tu laptop y tu multitoma o extensión. Sugiero que te lleves todas las herramientas instaladas porque todavía nadie dice que va a llevar Internet&#8230; o mejor aún, lleva Internet. :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2012/03/22/super-happy-dev-house-tijuana-24-de-marzo-de-2012/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tweaking Opera for safer Web browsing</title>
		<link>http://blog.alvarezp.org/2012/03/04/tweaking-opera-for-safer-web-browsing/</link>
		<comments>http://blog.alvarezp.org/2012/03/04/tweaking-opera-for-safer-web-browsing/#comments</comments>
		<pubDate>Sun, 04 Mar 2012 10:28:51 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Notas]]></category>
		<category><![CDATA[Opera browser]]></category>
		<category><![CDATA[Planet Gultij]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1523</guid>
		<description><![CDATA[Sometimes I deeply hate the Opera browser, as with its RAM consumption behavior, but most of the times I just love it.
One of the reasons I do is because it allows me to pretty easily tweak my browsing safety.
There are several aspects to browsing safety. When working on your own computer the most important one [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes I deeply hate the <a href="http://www.opera.com/browser/">Opera browser</a>, as with <a href="http://blog.alvarezp.org/2011/07/14/the-ram-is-there-to-be-used-fallacy/">its RAM consumption behavior</a>, but most of the times I just love it.</p>
<p>One of the reasons I do is because it allows me to pretty easily tweak my browsing safety.</p>
<p>There are several aspects to browsing safety. When working on your own computer the most important one after having an updated browser is <a href="http://en.wikipedia.org/wiki/Javascript">JavaScript</a>.</p>
<p>JavaScript is really useful, as it allows you to make websites interactive, but it can be easily misused to do all kinds of bad stuff, from personal tracking to attacking <a href="http://en.wikipedia.org/wiki/Internet_Relay_Chat">IRC networks</a>, passing through personal information stealing, <a href="http://en.wikipedia.org/wiki/Cross-site_scripting">cross-site scripting</a>, <a href="http://en.wikipedia.org/wiki/Clickjacking">clickjacking</a>, etc., even if you use <a href="http://en.wikipedia.org/wiki/Linux">Linux</a>, <a href="http://en.wikipedia.org/wiki/Mac_OS">Mac OS</a> or any other non-<a href="http://en.wikipedia.org/wiki/Microsoft_Windows">Windows</a> operating system. Although not strictly necessary, most of the new browser-related attack vectors require JavaScript to work or be useful.</p>
<p><span id="more-1523"></span></p>
<p>People using <a href="http://en.wikipedia.org/wiki/Firefox">Firefox</a> rely on add-ons like <a href="http://en.wikipedia.org/wiki/NoScript">NoScript</a> to disable JavaScript, but Opera provides a surprisingly easy built-in interface to control JavaScript yourself.</p>
<div class="wp-caption alignright" style="width: 147px"><a href="http://blog.alvarezp.org/imagenes/opera-safer/f12-menu.png"><img alt="Quick Preferences menu" src="http://blog.alvarezp.org/imagenes/opera-safer/f12-menu.png" title="Quick Preferences menu" width="137" height="180" /></a><p class="wp-caption-text"><em>Quick Preferences</em> menu</p></div>
<p>What features of Opera do we need to use to make our browsing safer? </p>
<ul>
<li>We&#8217;ll use the easily-accessible global JavaScript toggle switch. You can see it by pressing F12.</li>
<li>We&#8217;ll use the global JavaScript restrictions defaults.</li>
<li>We&#8217;ll use the customizable per-domain &#8220;Site Preferences&#8221;, which include JavaScript toggling.</li>
<li>We&#8217;ll use the easy access for the per-domain &#8220;Site preferences&#8221;. The dialog, although available through the Tools menu, is also just a right-click away, using the &#8220;Edit site preferences&#8230;&#8221; context menu entry.</li>
</ul>
<h3>What&#8217;s my way of using this?</h3>
<div class="wp-caption alignleft" style="width: 230px"><a href="http://blog.alvarezp.org/imagenes/opera-safer/pref-adv-content-jsdis.png"><img alt="Preferences dialog, Advanced tab, Content section" src="http://blog.alvarezp.org/imagenes/opera-safer/pref-adv-content-jsdis.png" title="Preferences dialog, Advanced tab, Content section" width="220" height="153" /></a><p class="wp-caption-text"><em>Preferences</em> dialog, <em>Advanced</em> tab, <em>Content</em> section</p></div>
<p>Navigate to <em>Tools</em> » <em>Preferences&#8230;</em>, and in the <em>Advanced</em> tab choose <em>Content</em> from the list on the left. Enable JavaScript using the checkbox just to let the <em>JavaScript Options&#8230;</em> button get enabled. Clicking it will get you to the dialog shown.</p>
<div class="wp-caption alignright" style="width: 165px"><a href="http://blog.alvarezp.org/imagenes/opera-safer/js-options.png"><img alt="JavaScript options" src="http://blog.alvarezp.org/imagenes/opera-safer/js-options.png" title="JavaScript options" width="155" height="140" /></a><p class="wp-caption-text"><em>JavaScript</em> options</p></div>
<p>This dialog lets you configure the global JavaScript defaults. I do not like websites raising or lowering any windows, and surely not allow changing the status bar, as I want to trust the links appearing on it before clicking on anything.</p>
<p>Likewise, I don&#8217;t want websites detecting <a href="http://en.wikipedia.org/wiki/Context_menu">context menu</a> events, or at least not by default. Facebook is one site that detects right-clicking to prevent you from properly copying and pasting links. On the other hand, Google Maps extensively tweaks the context menu and gives you more options.</p>
<p>Also, I don&#8217;t like websites hiding the <a href="http://en.wikipedia.org/wiki/Address_bar">address bar</a>, at least not by default, as I like to check the URL of each and every website that I browse to. This is helpful to prevent <a href="http://en.wikipedia.org/wiki/Phishing">phishing</a> attacks.</p>
<p><strong>I disable pretty much everything by default.</strong> After setting it to your own liking click OK. Back in the <em>Preferences</em> window, uncheck <em>Enable JavaScript</em> to disable it back and finally click on OK.</p>
<p>You have just set the default JavaScript settings. You may feel this should be adjusted in the future, but let&#8217;s leave it like that for now.</p>
<p>Now, press F12. You will get a quick menu where you can globally enable or disable JavaScript quickly and easily, just in case you are in a hurry and can&#8217;t make it work for a specific website. It should be disabled because of what we just did. Leave it that way.</p>
<div class="wp-caption alignright" style="width: 123px"><a href="http://blog.alvarezp.org/imagenes/opera-safer/context-menu.png"><img alt="Context menu" src="http://blog.alvarezp.org/imagenes/opera-safer/context-menu.png" title="Context menu" width="113" height="180" /></a><p class="wp-caption-text"><em>Context</em> menu</p></div>
<p>Now, you should manually enable JavaScript to each site you actually trust. Let&#8217;s go to a site that uses JavaScript, say, <a href="http://www.google.com/ncr">Google</a>. You will notice Google works a bit different now. Let&#8217;s say you trust Google and you want to let pages from www.google.com to be able to use JavaScript. Right click on any text or blank area of the website and choose &#8220;Edit site preferences&#8230;&#8221;. This will take you to the &#8220;Site Preferences&#8221; dialog.</p>
<p>In the &#8220;Site Preferences&#8221; dialog you&#8217;ll find a text box for the site (or domain) you want to tweak. You may want to use the current domain or tweak it to use a broader domain.</p>
<div class="wp-caption alignleft" style="width: 230px"><a href="http://blog.alvarezp.org/imagenes/opera-safer/sitepref-scripting.png"><img alt="Site Preferences dialog, General tab" src="http://blog.alvarezp.org/imagenes/opera-safer/sitepref-scripting.png" title="Site Preferences dialog, General tab" width="220" height="112" /></a><p class="wp-caption-text"><em>Site Preferences</em> dialog, <em>General</em> tab</p></div>
<p>After choosing the domain, go to the Scripting tab. There you can &#8220;Enable JavaScript&#8221; only for that domain. When you enable JavaScript, the other 4 checkboxes default to the settings you chose in the <em>JavaScript Options</em> window, globally. You can change that too if you trust your site enough, or if the site requires it. I usually leave them unchecked.</p>
<p>Whenever you find a site that may not be working as expected, selectively enable JavaScript for that site only, but only if you trust it enough. &#8220;Enough&#8221; may have a different meaning for you or me. For some, it may be &#8220;enough&#8221; that the site doesn&#8217;t try to steal your information; others may want the site not to track them in any way (good luck with those, though).</p>
<h3>Caveat</h3>
<p>Some sites hired too few programmers (or too many potatoes) to code their sites and they work in weird ways without the proper JavaScript in place and don&#8217;t offer any kind of graceful degradation. For example, the online banking site I use does multifactor authentication that doesn&#8217;t work without JavaScript, so I selectively enabled it for that subdomain (www.somebank.com). However, the final login step gets sent to a different domain (say, loggedin.somebank.com), which uses JavaScript to redirect you to the dashboard page. Because the second domain doesn&#8217;t have JavaScript enabled yet, I can&#8217;t access it. Since I can&#8217;t access it, I can&#8217;t drop the context menu down to <em>Edit site preferences</em> for the second domain. This leaves me locked out of my online banking.</p>
<p>However, since the two domains are part of somebank.com, you can easily work around this chicken-and-egg problem by tweaking the &#8220;Site&#8221; textbox to remove the &#8220;www.&#8221; part and leave JavaScript enabled for the whole somebank.com domain. Voila!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2012/03/04/tweaking-opera-for-safer-web-browsing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenCharla, en iTunes</title>
		<link>http://blog.alvarezp.org/2012/02/02/opencharla-en-itunes/</link>
		<comments>http://blog.alvarezp.org/2012/02/02/opencharla-en-itunes/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 19:12:14 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Español]]></category>
		<category><![CDATA[OpenCharla]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[Planeta Linux]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1503</guid>
		<description><![CDATA[Les comparto que OpenCharla ya aparece en los listados de iTunes.
Para ingresar el feed de OpenCharla a otro directorio de podcasts o a algún agregador, estas son las direcciones:
MP3 feed RSS: http://opencharla.gultij.org/mp3/feed.xml
MP3 sitio: http://opencharla.gultij.org/mp3/
Ogg feed RSS: http://opencharla.gultij.org/ogg/feed.xml
Ogg sitio: http://opencharla.gultij.org/ogg/
Mientras tanto, los dejo con el episodio 2&#215;01 de OpenCharla, donde hablamos un poquito de IPv6, SOPA/PIPA, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://opencharla.gultij.org/mp3/"><img alt="" src="http://opencharla.gultij.org/mp3/images/itunes_image.jpg" class="aligncenter" width="300" height="287" style="padding-left: 40px; padding-right: 40px; border: 3px solid black; border-radius: 5px" /></a></p>
<p>Les comparto que OpenCharla ya <a href="http://itunes.apple.com/us/podcast/opencharla/id498812978">aparece en los listados de iTunes</a>.</p>
<p>Para ingresar el feed de OpenCharla a otro directorio de podcasts o a algún agregador, estas son las direcciones:</p>
<p>MP3 feed RSS: <a href="http://opencharla.gultij.org/mp3/feed.xml">http://opencharla.gultij.org/mp3/feed.xml</a><br />
MP3 sitio: <a href="http://opencharla.gultij.org/mp3/">http://opencharla.gultij.org/mp3/</a></p>
<p>Ogg feed RSS: <a href="http://opencharla.gultij.org/ogg/feed.xml">http://opencharla.gultij.org/ogg/feed.xml</a><br />
Ogg sitio: <a href="http://opencharla.gultij.org/ogg/">http://opencharla.gultij.org/ogg/</a></p>
<p>Mientras tanto, los dejo con el <a href="http://opencharla.gultij.org/mp3/?p=episode&#038;name=2012-01-29_opencharla-2x01.mp3">episodio 2&#215;01 de OpenCharla</a>, donde hablamos un poquito de IPv6, SOPA/PIPA, Plone, WPS, FileZilla y HTTPS.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2012/02/02/opencharla-en-itunes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Calibración del Touchpad en Linux y GNOME3</title>
		<link>http://blog.alvarezp.org/2012/01/25/calibracion-del-touchpad-en-linux/</link>
		<comments>http://blog.alvarezp.org/2012/01/25/calibracion-del-touchpad-en-linux/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 10:44:35 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Español]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Notas]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[Planeta Linux]]></category>
		<category><![CDATA[Queja]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1490</guid>
		<description><![CDATA[Ya comprendí a mi hermana cuando le instalé Debian. Utilizar un Touchpad en una laptop con Linux es una de las peores experiencias que he tenido con este sistema operativo.
El problema: estando escribiendo, cualquier rozón &#8212;a veces ni siquiera se necesita un rozón&#8212; provoca que el ratón se considere presionado en una ubicación diferente a [...]]]></description>
			<content:encoded><![CDATA[<p>Ya comprendí a mi hermana cuando le instalé <a href="http://es.wikipedia.org/wiki/Debian">Debian</a>. Utilizar un Touchpad en una laptop con Linux es una de las peores experiencias que he tenido con este sistema operativo.</p>
<p>El problema: estando escribiendo, cualquier rozón &mdash;a veces ni siquiera se necesita un rozón&mdash; provoca que el ratón se considere presionado en una ubicación diferente a la del cursor. Esto nos mueve súbitamente el cursor a la ubicación del puntero y quienes mecanografiamos debemos detener nuestra escritura para reubicar el cursor y continuar frustradamente (no sin antes corregir las consecuencias de lo ocurrido: salida de foco, tecleo en un lugar incorrecto, etc.).</p>
<p>Estoy usando una laptop <a href="http://www.samsung.com/us/computer/laptops/NP-R540-JA09US">Samsung NP-R540-JA09US</a>. Naturalmente, tan pronto como la recibí, le instalé Debian. A diferencia de la <a href="http://es.wikipedia.org/wiki/ThinkPad">IBM ThinkPad T42</a> la Samsung no tiene <a href="http://en.wikipedia.org/wiki/Pointing_stick">TrackPoint</a>. Mi hermana tenía instalado Debian 6.0 en una laptop HP Pavilion dv6700. Lo menciono porque, al ser diferente hardware, me resulta más fácil echarle la culpa al software. Yo estoy usando <a href="http://www.debian.org/releases/sid/index.es.html">Debian Sid</a>; no <a href="http://www.debian.org/releases/testing/">Wheezy</a>, sino Sid: dos versiones adelante de la estable. Lo que no puedo creer es que nadie más haya experimentado el mismo problema en todo este tiempo.</p>
<p>La mayoría de los linuxeros acostumbramos resolver nuestros propios problemas, así que a veces los desarrolladores no se enteran de la problemática que envuelve a los usuarios novatos y no-técnicos. <strong>Llamada de atención para los desarrolladores de GNOME.</strong></p>
<p>Al menos por default, en GNOME, las interfaces para ajustar los parámetros del Touchpad son muy pobres. El afán de hacer las interfaces amigables a veces llevan a los desarrolladores a la falacia de eliminar cosas que realmente son útiles, como los valores numéricos que resultan de un control tipo &#8220;slider&#8221; (de esos que son como para controlar el volumen, pero rectos). Esto hace que sea difícil tener valores de referencia para calibrar algo tan importante como el equivalente del ratón.</p>
<p>Por ejemplo, para la &#8220;detección de palma&#8221; tienen un slider cuyos extremos dicen algo así como &#8220;leve&#8221; y &#8220;fuerte&#8221;. Es un control que no tiene retroalimentación inmediata o visual, con valores sin sentido y sin disponer de una referencia comparativa.</p>
<p>Al usar Debian Sid, actualizar a una versión más reciente de software no es una opción, a menos que quiera arriesgar mi laptop con software experimental y con baja probabilidad de que el problema esté realmente resuelto.</p>
<p>Hecho el berrinche correspondiente, incluyo los pasos que seguí para reducir mi estrés con el uso del Touchpad.</p>
<h3>Habilitar de manera personalizada la desactivación del Touchpad mientras escribo</h3>
<p>Esta parte la hice bajo GNOME 3. Aunque GNOME Control Center trae una opción llamada &#8220;Deshabilitar el Touchpad mientras se escribe&#8221;, la realidad es que los parámetros de esta opción son extremadamente conservadores.</p>
<p>Lo que esta opción hace es cargar un programa llamado syndaemon, que monitoriza los eventos de teclado y desactiva el Touchpad mientras se detecta que el usuario está escribiendo. GNOME Control Center, en su versión 3.2.2, al menos en Debian Sid, deshabilita el Touchpad durante 2 segundos después del último teclazo, con el inconveniente de que ni siquiera permite el movimiento del puntero.</p>
<p>Para resolver esto, deshabilité dicha función, dejando que el touchpad siempre estuviera habilitado por default, pero yo cargué manualmente <code>syndaemon</code> desde un &#8220;Startup Application&#8221; (gnome-session-properties) con los siguientes parámetros:</p>
<pre class="code">syndaemon -i 0.8 -K -t -R -d</pre>
<p><strong>-i 0.8</strong>, que deshabilita el Touchpad por sólo 0.8 segundos después del último teclazo.<br />
<strong>-K</strong>, que no deshabilita el Touchpad si se usan combinaciones de teclas (como Ctrl+W). Esta opción ya la incluye GNOME.<br />
<strong>-t</strong>, que sólo deshabilita los taps y los scrolls. El puntero se sigue moviendo.<br />
<strong>-R</strong>, porque ya la incluía GNOME (usa XRecord).<br />
<strong>-d</strong>, porque ya la incluía GNOME (carga como demonio).</p>
<p>Con esto, espero menos de la mitad del tiempo para poder hacer un tap (y siempre dispongo de los botones de todos modos) y mientras puedo ir moviendo el puntero. Esto hace que el uso de la computadora sea mucho más fluido.</p>
<h3>Calibración de la detección de palma</h3>
<p>Esto lo hice a nivel X.org. A falta de parámetros reales para calibrar la palma, opté por usar el siguiente comando fuera de X11:</p>
<pre class="code">sudo evtest /dev/input/event6 | egrep 'WIDTH|PRESSURE'</pre>
<p>Esta instrucción (cambiando event6 por el valor que corresponda en tu laptop) permite ver los eventos que ocurren con el Touchpad, relevantes a la presión y el ancho del toque.</p>
<p>Después de comparar con algunos taps comunes, toques accidentales, mi palma, etc., decidí que después de una anchura de 7 y una presión de 70, se considere palma. Así, creé el archivo <code>/etc/X11/xorg.conf.d/synaptics</code> con las siguientes líneas:</p>
<pre class="code">
Section "InputClass"
	Identifier "Touchpad" #Requerido
	MatchIsTouchpad "yes" #Requerido
	Driver "synaptics" #Requerido

	Option	"PalmDetect"	"1"
	Option	"PalmMinWidth"	"5"
	Option	"PalmMinZ"	"70"
EndSection
</pre>
<p>Para ver los valores que actualmente tiene su driver de Synaptics (el Touchpad), se usa:</p>
<pre class="code">synclient</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2012/01/25/calibracion-del-touchpad-en-linux/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>stail-notify.bash</title>
		<link>http://blog.alvarezp.org/2011/11/29/stail-notify-bash/</link>
		<comments>http://blog.alvarezp.org/2011/11/29/stail-notify-bash/#comments</comments>
		<pubDate>Wed, 30 Nov 2011 04:42:28 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Español]]></category>
		<category><![CDATA[Gultij]]></category>
		<category><![CDATA[Net-admin]]></category>
		<category><![CDATA[Notas]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[Planeta Linux]]></category>
		<category><![CDATA[Tenía que ser un geek.]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1465</guid>
		<description><![CDATA[El siguiente script hace que cada línea nueva que aparezca en un archivo remoto, salte en mi pantalla como notificación.
Con pocas modificaciones se puede hacer lo mismo para un archivo local.
Se puede colocar el comando en el arranque de sesión, pero se va a bloquear para pedir la contraseña. Se recomienda tener acceso al servidor [...]]]></description>
			<content:encoded><![CDATA[<p>El siguiente script hace que cada línea nueva que aparezca en un archivo remoto, salte en mi pantalla como notificación.</p>
<p>Con pocas modificaciones se puede hacer lo mismo para un archivo local.</p>
<p>Se puede colocar el comando en el arranque de sesión, pero se va a bloquear para pedir la contraseña. Se recomienda tener acceso al servidor remoto por medio de claves públicas para que el agente de SSH automáticamente pida la contrafrase en pantalla.</p>
<p>Puesto que tail -f nunca debería salirse, tal vez sería conveniente agregar una línea después del SSH que mande una alerta de que concluyó el tail -f o de que falló la conexión con el servidor. Tal vez se pueda hacer revisando el código de retorno, pero hay que ver qué ruido le provoca el tubo.</p>
<p>Se puede modificar para que también el icono y la severidad de la notificación sean distintas, pero en mi caso no es necesario.</p>
<p>El comando podría fallar si la cadena a mostrar contiene comillas.</p>
<pre class="code">
#!/bin/bash

# stail-notify.bash
# Escrito por Octavio Alvarez.
# Licencia: <a href="http://en.wikipedia.org/wiki/WTFPL">WTFPL</a>

[ $# -lt 3 ] &#038;&#038; {
	echo "usage: "`basename $0`" &lt;user@host> &lt;file-to-tail> &lt;alert-title>"
	exit
}

ssh $1 "tail -n 0 -f "$2 | while read M D T ELSE; do notify-send -t 5000 -i dialog-warning -u critical "$3" "$ELSE"; done
</pre>
<p>Para usarlo, lo ejecutan así:</p>
<pre class="code">stail-notify.bash alvarezp@192.168.2.100 /var/log/messages "Alerta de Syslog"</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2011/11/29/stail-notify-bash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dando la bienvenida a los usuarios de IRC con X-Chat 2.</title>
		<link>http://blog.alvarezp.org/2011/10/10/bienvenida-en-irc-con-x-chat-2/</link>
		<comments>http://blog.alvarezp.org/2011/10/10/bienvenida-en-irc-con-x-chat-2/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 01:42:37 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Español]]></category>
		<category><![CDATA[Gultij]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Notas]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[Planeta Linux]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1451</guid>
		<description><![CDATA[Algunos usuarios, cuando entran a algún canal de charla (como el del Gultij) por IRC, saludan y preguntan si pueden ser ayudados. La gente que tiene más experiencia ya sabe lo que va a ocurrir:

USUARIO_NUEVO entra al canal de charla y, después de no percatarse de lo que dice el topic, dice «tengo una pregunta» [...]]]></description>
			<content:encoded><![CDATA[<p>Algunos usuarios, cuando entran a algún canal de charla (como el del <a href="http://gultij.org/irc">Gultij</a>) por IRC, saludan y preguntan si pueden ser ayudados. La gente que tiene más experiencia ya sabe lo que va a ocurrir:</p>
<ol>
<li>USUARIO_NUEVO entra al canal de charla y, después de <strong>no</strong> percatarse de lo que dice el <em>topic</em>, dice «tengo una pregunta» o «¿alguien me puede aydar?»</li>
<li>VOLUNTARIO_1 dice «¿cuál es tu pregunta?»</li>
<li>USUARIO_NUEVO le hace la pregunta específicamente a VOLUNTARIO_1.</li>
<li>Si VOLUNTARIO_1 no contesta en menos de 2 minutos USUARIO_NUEVO se siente ignorado y repite la pregunta. Además de que no es obligación del resto del mundo estar atento de sus reclamos, es posible que VOLUNTARIO_1 no sepa, pero sí VOLUNTARIO_2, VOLUNTARIO_3 o VOLUNTARIO_N, que no están en el canal en ese momento.</li>
<li>En ocasiones, cuando USUARIO_NUEVO no recibe respuesta, adopta una actitud donde VOLUNTARIO_1 está obligado a contestarle, como si fuera un servicio pagado de soporte.</li>
</ol>
<p>Por eso, en los canales de charla, el protocolo es simplemente entrar, hacer la pregunta y ser paciente, <strong>muy paciente</strong>.</p>
<p>Obviamente, no todos saben esto y no es su culpa. Siempre entrará gente pidiendo ayuda y, claro, hay que darles la bienvenida. Esto toma tiempo, desde 1) estar al pendiente del canal hasta 2) escribir el mensaje de guía a cada usuario para que escriba su pregunta, dando a entender que yo sólo le doy al bienvenida. Para reducir la parte 2, algunos canales tienen un bot al que se le da la instrucción de darle la bienvenida al &#8220;usuario nuevo&#8221;. Yo creo que esto sale contraproducente porque la automatización se revela al usuario.</p>
<p>Para facilitar la parte 2, he configurado en mi X-Chat 2 los siguientes comandos para que la gente reciba un mensaje de mi parte.</p>
<dl>
<dt>/adelante $nick</dt>
<dd>say %2: adelante, qué pregunta tienes? Tal vez alguien sepa.</dd>
<dt>/paciencia $nick</dt>
<dd>say %2, sugiero que esperes un rato. Si alguien te puede ayudar, puede ser que esté ocupado o haya salido un momento.</dd>
</dl>
<p>y sus equivalentes en inglés:</p>
<dl>
<dt>/goahead $nick</dt>
<dd>say %2, what question do you have? Go ahead and ask; someone around might know.</dd>
<dt>/patience $nick</dt>
<dd>say %2, I suggest you wait for a while. If someone can help you, he may be busy or out for a moment.</dd>
</dl>
<p>El de /patience es para cuando el usuario haya repetido su pregunta a escasos minutos.</p>
<p>Aún falta pulir los mensajes para que se vean más naturales pero que, a su vez, abarquen más casos.</p>
<p>De esta manera me facilito el guiar a un usuario nuevo cuyo saludo, con un poco de suerte, yo vea. Creo que sólo siendo amigables con los usuarios nuevos, es como percibirán un valor real en la famosa &#8220;comunidad&#8221;. Para aumentar la probabilidad de detectar un saludo, es posible hacer cosas como configurar el realzado de palabras como &#8220;buenas&#8221; u &#8220;hola&#8221;, pero esto es harina de otro costal (X-Chat está muy limitado en este aspecto, pero se pueden escribir plug-ins).</p>
<p>Obviamente, si alguien va a tomar esta sugerencia, ponga su propio mensaje a su propio estilo. Realmente sería feo entrar a un canal y ver que 5 usuarios diferentes me contesten exactamente con el mismo mensaje.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2011/10/10/bienvenida-en-irc-con-x-chat-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenCharla: Podcast del Grupo de Usuarios de GNU/Linux de Tijuana</title>
		<link>http://blog.alvarezp.org/2011/09/28/opencharla-podcast-del-grupo-de-usuarios-de-gnulinux-de-tijuana/</link>
		<comments>http://blog.alvarezp.org/2011/09/28/opencharla-podcast-del-grupo-de-usuarios-de-gnulinux-de-tijuana/#comments</comments>
		<pubDate>Wed, 28 Sep 2011 07:15:28 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Español]]></category>
		<category><![CDATA[Gultij]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[Planeta Linux]]></category>
		<category><![CDATA[Tijuana]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1421</guid>
		<description><![CDATA[OpenCharla
El Gultij tiene podcast! Después de varios meses de pláticas y pruebas, ya tenemos los primeros episodios de OpenCharla.
OpenCharla se distribuye en formato Ogg por ser un formato libre de patentes y regalías. No necesitas descargar nada para oirlo, pues en la página del podcast disponemos de un reproductor web basado en Flash para oírlo [...]]]></description>
			<content:encoded><![CDATA[<p style="font-size: 400%; font-weight: bold; text-align: center; padding: 20px; border: 3px solid black; border-radius: 5px"><a href="http://www.gultij.org/opencharla/">OpenCharla</a></p>
<p>El <a href="http://www.gultij.org/">Gultij</a> tiene <a href="http://www.gultij.org/opencharla/">podcast</a>! Después de varios meses de pláticas y pruebas, ya tenemos los primeros episodios de <a href="http://www.gultij.org/opencharla/">OpenCharla</a>.</p>
<p>OpenCharla se distribuye en formato Ogg por ser un formato libre de patentes y regalías. No necesitas descargar nada para oirlo, pues en la página del podcast disponemos de un reproductor web basado en Flash para oírlo en línea.</p>
<p>Sólo en caso de que quieras descargar el archivo será necesario que utilices un programa que lea archivos Ogg. <em>Dicen</em> que si instalas el <a href="http://xiph.org/dshow/downloads/">filtro de DirectShow para Ogg</a> lo vas a poder tocar en Windows con Media Player. En Linux seguramente ya lo soporta cualquier programa.</p>
<p>Bienvenidos los comentarios. Ah, aún no tenemos el RSS, pero pronto!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2011/09/28/opencharla-podcast-del-grupo-de-usuarios-de-gnulinux-de-tijuana/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ciclo de conferencias CDTI, Tijuana</title>
		<link>http://blog.alvarezp.org/2011/08/11/ciclo-de-conferencias-cdti-tijuana/</link>
		<comments>http://blog.alvarezp.org/2011/08/11/ciclo-de-conferencias-cdti-tijuana/#comments</comments>
		<pubDate>Fri, 12 Aug 2011 06:34:21 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Conferencias]]></category>
		<category><![CDATA[Español]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Gultij]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[Planeta Linux]]></category>
		<category><![CDATA[Software libre]]></category>
		<category><![CDATA[Tijuana]]></category>
		<category><![CDATA[mexico]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1413</guid>
		<description><![CDATA[CDTI: Comunidad + Desarrollo + Tecnología + Innovación

Los invito a asistir al ciclo de conferencias CDTI, en Centro de Gobierno (edificio blanco) en Tijuana, B. C. este sábado 13 de agosto de 2011.
Para saber más sobre CDTI y el evento, visiten la página del #cdti
]]></description>
			<content:encoded><![CDATA[<p>CDTI: Comunidad + Desarrollo + Tecnología + Innovación</p>
<p><img src="http://blog.alvarezp.org/wp-content/uploads/2011/08/cdti-logos.png" alt="cdti-logos" title="cdti-logos" width="810" height="218" class="aligncenter size-full wp-image-1414" style="max-width: 100%; height: auto" /></p>
<p>Los invito a asistir al ciclo de conferencias CDTI, en Centro de Gobierno (edificio blanco) en Tijuana, B. C. este sábado 13 de agosto de 2011.</p>
<p>Para saber más sobre CDTI y el evento, visiten la página del <a href="http://cdti.mx/">#cdti</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2011/08/11/ciclo-de-conferencias-cdti-tijuana/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La falacia de que &#8220;la RAM está para ser usada&#8221;</title>
		<link>http://blog.alvarezp.org/2011/07/15/la-falacia-de-que-la-ram-esta-para-ser-usada/</link>
		<comments>http://blog.alvarezp.org/2011/07/15/la-falacia-de-que-la-ram-esta-para-ser-usada/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 08:12:55 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Español]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Opera browser]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[Planeta Linux]]></category>
		<category><![CDATA[Queja]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1408</guid>
		<description><![CDATA[Parece que se ha vuelto popularizado un error de concepto en algunos foros de usuarios. Tal vez recuerdes esta frase:
La RAM está para ser usada.
Esta frase es cierta dentro de un contexto en particular. Se usa para permitir que el sistema operativo acelere disco a RAM tanto como sea posible, pues la RAM es significativamente [...]]]></description>
			<content:encoded><![CDATA[<p>Parece que se ha vuelto popularizado un error de concepto en algunos foros de usuarios. Tal vez recuerdes esta frase:</p>
<blockquote><p>La RAM está para ser usada.</p></blockquote>
<p>Esta frase es cierta <em>dentro de un contexto en particular</em>. Se usa para permitir que el sistema operativo acelere disco a RAM tanto como sea posible, pues la RAM es significativamente más rápida que los discos duros.</p>
<p>Sin embargo, dentro del contexto de una aplicación de usuario, en realidad es una falacia. Algunos usuarios (e incluso algunos desarrolladores) no saben mucho sobre el funcionamiento interno de su computadora y usan esta frase fuera de su contexto correcto. Lo peor es que algunas veces ni siquiera les importa el consumo de la RAM. No les importan los derrames de memoria o piensan que si ocurren sólo una vez, no pasa nada. O piensan que los lenguajes y plataformas con recolección de basura (garbage collectors) se encargarán mágicamente de todo. Sin darse cuenta, acaban usando la frase en cuestión como un equivalente de:</p>
<blockquote><p>La RAM está para ser <em>desperdiciada</em>.</p></blockquote>
<p>Hay algunas cuestiones que en realidad alimentan este modo de pensar, llevándolos a concluir que una aplicación realmente debería poner tanta información como sea posible en la RAM y que, tarde o temprano, el sistema operativo lo manejará eficientemente. Más aún, que no hacerlo es un sacrificio de rendimiento.</p>
<p>Consideremos lo siguiente (sobresimplificaré para efectos de facilidad de explicación, pero el modelo es bueno). Por una parte:</p>
<ul>
<li>Cuando una aplicación solicita RAM y el sistema operativo la <em>asigna</em>, esa memoria queda reservada para el uso <strong>exclusivo</strong> de la aplicación hasta que ésta la <em>libera</em>. Una aplicación no puede saber (y no debería) si otra requiere o solicita RAM.</li>
<li>Si la RAM física se llena y hay espacio de paginación (swap o paging) disponible en el sistema, el OS descargará algunas de las <em>páginas</em> menos usadas de la RAM hacia el espacio de paginación, sea una partición o un archivo. Cuando la RAM paginada se necesita nuevamente, se <em>intercambia</em> con otras páginas de RAM de las menos usadas. Ambas operaciones requieren de actividad en el disco duro. Eso es lo que hace a la paginación inherentemente lenta.</li>
<li>El sistema operativo siempre dejará libre algo (digamos, 50 MB) de RAM física sin usar para que haya disponible cuando necesite reaccionar a una emergencia de inestabilidad de sistema.</li>
</ul>
<p>Por otra parte:</p>
<ul>
<li>El sistema operativo usa memoria física para acelerar lecturas y escrituras a disco por medio de caché, de modo que cuando un sector de disco es leído múltiples veces, las subsecuentes se obtienen de la RAM, que es mucho más rápida.</li>
<li>El OS sólo acelerará lecturas/escrituras a disco hacia RAM física, pues sería inútil &#8220;acelerar&#8221; de disco a disco.</li>
<li>Cuando una aplicación solicita RAM, el OS liberará RAM usada para caché antes de asignarla al a aplicación solicitante. Esta operación no requiere actividad de disco si se están liberando lecturas aceleradas o escrituras ya fijadas; sin embargo, sí requiere de escribir en disco si necesita fijar escrituras aceleradas pendientes. Usualmente, el sistema operativo realiza esta fijación cuando la PC está en ocio, de modo que uno no lo nota y, cuando llega el momento, ya no hay escrituras pendientes por fijar.</li>
</ul>
<p>Por último:</p>
<ul>
<li>Linux reporta el &#8220;tamaño residente en RAM&#8221; para un proceso como &#8220;consumo de RAM física&#8221;. Si uno quiere medir el consumo de RAM por una aplicación, se debe hacer con la swap desactivada. Por favor indíquenme cómo Windows reporta la RAM consumida por un proceso.</li>
<li>Las escrituras a disco suelen ser más lentas que las lecturas.</li>
</ul>
<p>La realidad sobre esta falacia es &#8220;cierto, el sistema operativo se encargará de eso, pero se muere el caché de disco y se provoca la paginación, <strong>alentando todo el sistema, incluyendo la propia aplicación</strong>&#8220;. Entonces: sí, el sistema se encarga, pero en realidad está recuperándose del error del programador a costa de una degradación global e innecesaria de sistema y la potencial inestabilida que conlleva.</p>
<p>Analicemos dos escenarios tomados de mi propia experiencia. Repito: estoy sobresimplificando. Úsese esto como modelo.</p>
<h3>Caso 1: Un navegador acelera la red a disco en lugar de a RAM</h3>
<p>Tienes un sistema con 2 GB of RAM, de los cuales tienes 1 GB <em>libres</em> (como en &#8220;tal vez usados por el caché de disco pero ciertamente disponible para las aplicaciones&#8221;). Tú ejecutas un navegador que acelera los recursos de red a disco porque es más rápido que el Internet (pues es más rápido que el Internet) y usa unos 300 MB of RAM.</p>
<p>1000 &#8211; 300 &#8211; 50 = 650</p>
<p>Acabas con unos 650 MB of RAM para aceleración de disco por memoria caché y 50 MB de RAM física real.</p>
<p>Cuando un navegador necesita un recurso de red, intenta cargarlo de disco (pues lo está acelerando). Sin embargo, el disco queda acelerado en la RAM por el sistema operativo y las lecturas subsecuentes se realizan en RAM. La penalidad en rendimiento apenas se nota.</p>
<p>Si el navegador quiere acelerar una página visitada por primera vez, la guardará ne disco. El SO acelerará la lectura a RAM y la pospondrá hasta que el sistema esté ne ocio (cuando estás leyendo el contenido del sitio). La penalidad en rendimiento apenas se nota.</p>
<p>Cuando cualquier otro proceso lee de disco, la probabilidad de pegarle al caché es alta porque hay 650 MB de RAM disponibles par esto. Incluso si se le falla al caché, lo que se lee de disco se acelera en RAM para los accesos subsecuentes. reading.</p>
<p>Entonces, ejecutas una máquina virtual que requiere de 450 MB de RAM. Ocurre lo siguiente:</p>
<ul>
<li>El sistema operativo libera 450 MB de caché de disco. Parte de este requiere de escrituras, parte no. Esta operación es sólo tan lenta como la cantidad de escrituras requeridas para fijar las escrituras aceleradas, así que no es <em>tan</em> lento. Además, el usuario en cierto modo lo espera porque le pidió a la PC cargar la VM.</li>
<li>No hay paginación. No es necesario.</li>
<li>Finalmente se asignan los 450 MB a la VM.</li>
<li>La VM escribe a ese espacio físico de RAM asignado.</li>
</ul>
<p>Aún quedan 200 MB disponibles para caché de disco, que el SO procurará usar eficientemente.</p>
<p>Ahora, el navegador quiere cargar algo de su &#8220;cache de disco&#8221;. Hay una probabilidad, claro que mayor que 0, de pegarle al caché y que el SO sirva el dato directamente desde la RAM. Supongamos que no, que fue leída desde disco. El navegador aún está acelerando la navegación pues el disco local es más rápido que el Internet. Más aún, el SO acelerará este objeto en la RAM para sus accesos subsecuentes.</p>
<p>Claro: la VM continúa corriendo desde la RAM sin necesitar de ningún tipo de paginación (o hiperpaginación). El sistema responde perfectamente. El usuario sabe (o debería saber) que si quiere liberar memoria, debe cerrar la VM o el navegador.</p>
<h3>Caso 2: Un navegador usa más RAM que la que requiere, para su aceleración</h3>
<p>Tienes un sistema con 2 GB of RAM, de los cuales tienes 1 GB <em>libres</em> (como en &#8220;tal vez usados por el caché de disco pero ciertamente disponible para las aplicaciones&#8221;). Tú ejecutas un navegador que acelera los recursos de red a disco porque es más rápido que el Internet (pues es más rápido que el Internet) y usa unos 300 MB of RAM.</p>
<p>1000 &#8211; 600 &#8211; 50 = 350</p>
<p>Acabas con unos 350 MB of RAM para aceleración de disco y 50 MB de RAM física real.</p>
<p>Cuando el navegador necesita un recurso de red, trata de cargarlo desde su asignación de RAM, así que es muy rápido (aún así, tiene que leerlo primero de disco si no estaba previamente disponible en RAM).</p>
<p>Cuando cualquier otra aplicación lee de disco hay una baja probabilidad de pegarle al caché. En cualquier caso, la probabilidad general de que otra aplicación le pegue al caché es más baja, pues la memoria está exclusivamente asingada para el navegador. Esto incrementa significativamente la probabilidad de acceder a disco, lo que puede llevar a una alentar todo el sistema.</p>
<p>Minimizar el navegador <em>no</em> libera memoria para otras aplicaciones. la memoria aún está asignada para su uso exclusivo para éste.</p>
<p>Entonces, ejecutas una máquina virtual que requiere de 450 MB de RAM. Ocurre lo siguiente:</p>
<ul>
<li>El sistema operativo libera 350 MB de caché de disco. Parte de este requiere de escrituras, parte no. Esta operación es sólo tan lenta como la cantidad de escrituras requeridas para fijar las escrituras aceleradas, así que no es <em>tan</em> lento.</li>
<li>Determina los 100 MB menos usados de RAM y las mueve al espacio de paginación. Esta operación es lenta pues implica varias escrituras inevitables a disco.</li>
<li>Finalmente se asignan los 450 MB a la VM</li>
<li>La VM escribe a ese espacio físico de RAM asignado.</li>
</ul>
<p>El sistema ya no tiene caché de disco. Cuando otra aplicación necesita leer de disco, no le pegarán al inexistente caché y el SO tendrá que acceder físicamente al disco para servir esta petición. Esto es lento. Lo peor es que el acceso a disco no será acelerado para sus subsecuentes lecturas.</p>
<p>Ahora, el navegador quiere cargar algo desde su propia &#8220;caché de memoria&#8221; (que, por cierto, tal vez está paginada a disco). Puede pasar una de dos:</p>
<p>Si el recurso a extraer del caché de RAM de la aplicación está paginado en disco, el SO necesitará leerlo de vuelta. Puesto que los datos leídos ahora serán memoria &#8220;más reciente usada&#8221;, el SO podría intercambiarlos de disco contra algo de la RAM de la VM o de otra aplicación menos usada. Esta operación es lenta pues implica varias escrituras inevitables a disco. O:</p>
<p>Si el recurso aún está en la propia &#8220;caché de memoria&#8221; de la aplicación, será extraída como de rayo de la RAM. Sin embargo, la VM aún necesita su propia RAM para continuar al igual que las demás aplicaciones. Esto fuerza al sistema operativo a usar paginación nuevamente. Además, no hay RAM disponible para caché de disco y otras solicitudes de disco estarán continuamente siendo servidas desde disco sin la posibilidad de acelerar las subsecuentes hacia RAM. Esto genera una actividad constante a disco, alentando todo el sistema <strong>incluyendo al navegador</strong>. El &#8220;caché de memoria&#8221; de la aplicación no sirvió para nada.</p>
<p>Claro que la máquina virtual continúa corriendo y su RAM se necesita constantemente, así que la escritura a disco por paginación se vuelve una constante. El sistema operativo se alenta por lo que se llama <em>hiperpaginación</em>. En casos extremos, el sistema deja de responder, impidiendo al usuario de siquiera cerrar una de las dos aplicaciones para recuperarlo.</p>
<h3>Conclusiones</h3>
<p>Sí, la RAM está ahí para ser usada cuando se necesita, no para desperdiciarse. La RAM es un recurso limitado. Hay maneras de usar la RAM eficientemente. Por ejemplo, cargar los índices de un buzón de correo en RAM (sin cargar el contenido completo del buzón) puede, si se hace correctamente, acelerar significativamente la búsqueda de mensajes.</p>
<p>Sin embargo, acelerar disco a RAM puede que no sea una buena idea. La aceleración ya se hace por el SO, así que sólo se desperdicia una función eficiente del sistema operativo. A veces puede ser una buena idea, pero lo más probable, especialmente en aplicaciones de escritorio, es que no.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2011/07/15/la-falacia-de-que-la-ram-esta-para-ser-usada/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The &#8220;RAM is there to be used&#8221; fallacy</title>
		<link>http://blog.alvarezp.org/2011/07/14/the-ram-is-there-to-be-used-fallacy/</link>
		<comments>http://blog.alvarezp.org/2011/07/14/the-ram-is-there-to-be-used-fallacy/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 02:09:32 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Opera browser]]></category>
		<category><![CDATA[Queja]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1403</guid>
		<description><![CDATA[There seems to be a common misconception around some user forums. Maybe you recall this phrase:
RAM is there to be used.
This phrase is true within a particular context. It is used to let the operating system cache as much disk as possible into RAM, as RAM is significantly faster than hard disks.
However, within the context [...]]]></description>
			<content:encoded><![CDATA[<p>There seems to be a common misconception around some user forums. Maybe you recall this phrase:</p>
<blockquote><p>RAM is there to be used.</p></blockquote>
<p>This phrase is true <em>within a particular context</em>. It is used to let the operating system cache as much disk as possible into RAM, as RAM is significantly faster than hard disks.</p>
<p>However, within the context of a user-space application it is actually a fallacy. Some users (and even some developers) don&#8217;t know much about the inner workings of their computers, and use this phrase outside of its proper context. What is worse, sometimes they don&#8217;t even care much about RAM consumption. They don&#8217;t care about memory leaks, or think that if memory leaking occurs only once, it&#8217;s fine. Or they think garbage-collected frameworks or languages will take care of everything by magic. Without knowing, they end up using the aforementioned phrase as the equivalent of:</p>
<blockquote><p>RAM is there to be <em>wasted</em>.</p></blockquote>
<p><span id="more-1403"></span><br />
There are some issues that may lead to actually feed this thought, leading them to think that an application actually should put as much information as needed in RAM, and that, sooner or later, &#8220;the OS will handle it efficiently&#8221;. Furthermore, that not doing this is just a performance sacrifice.</p>
<p>Consider the following (I&#8217;ll oversimplifying for the sake of easy explanation, but the model is true). On one hand:</p>
<ul>
<li>When an application requests for RAM and the OS <em>allocates</em> it, the memory is being reserved for its <strong>exclusive</strong> use until the application <em>frees</em> it. An application can not know (and should not know) if another application requires or requests RAM.</li>
<li>If physical RAM gets topped and there is swap space available in the system, the OS will move out some of the least used RAM <em>pages</em> out to swap space, be it a partition or a file. When the paged-out RAM in swap space is needed, it gets <em>swapped</em> with other least-used physical RAM pages. Both operations require hard disk activity. That&#8217;s what makes swapping inherently slow.</li>
<li>The operating system will always leave some (say, 50 MB) physical RAM unused, so it has RAM available to react to a system instability emergency.</li>
</ul>
<p>On the other hand:</p>
<ul>
<li>Operating systems use free physical memory to cache disk reads and writes, so when a disk sector is read multiple times, subsequent reads are read from RAM, which is much faster.</li>
<li>The OS will only cache disk reads/writes to free physical RAM, as it would be useless to &#8220;cache&#8221; disk to disk.</li>
<li>When an application requests for RAM, the OS will free RAM used by disk cache before allocating it to the requesting application. This operation doesn&#8217;t require disk activity if freeing up RAM-cached reads or flushed disk writes; however, it does require disk writes if freeing up unflushed RAM-buffered disk writes. Usually, the OS flushes cached disk writes when system is idle, so you don&#8217;t really notice it, and when the time comes, everything is already flushed.</li>
</ul>
<p>And last:</p>
<ul>
<li>Linux, report &#8220;resident RAM size&#8221; for a process as &#8220;physical RAM usage&#8221;. So if you measure your application RAM requirements, you should do it with your swap partitions disabled. Please enlighten me about how Windows reports RAM for a process.</li>
<li>Disk writes are usually slower than disk reads.</li>
</ul>
<p>The actual truth around this fallacy is &#8220;sure, the OS handles it, but you kill the disk cache and encourage memory swapping, <strong>slowing the whole system down, including your own application</strong>&#8220;. So yes, the system &#8220;takes care&#8221; of it, but it is actually recovering from the programmer&#8217;s mistake at the cost of overall, unnecessary, system slow down and potential instability.</p>
<p>So let&#8217;s analyze two scenarios taken out of my own experience. I repeat: I am oversimplifying. Use this as a model.</p>
<h3>Case 1: A browser caches on disk instead of RAM.</h3>
<p>You have a system with 2 GB of RAM, out of which you have 1 GB <em>free</em> (as in &#8220;maybe used by disk cache but surely available for applications&#8221;). You fire up a web browser that caches resources on disk (because it is faster than the Internet) and needs about 300 MB of RAM.</p>
<p>1000 &#8211; 300 &#8211; 50 = 650</p>
<p>You end up with about 650 MB of RAM for disk cache optimization and 50 MB of actual free physical RAM.</p>
<p>Whenever the browser needs a network resource it tries to load it up from disk. However, disk gets cached on RAM by the OS, so subsequent reads will be read out from RAM. Performance penalty it is barely noticeable.</p>
<p>If the browser wants to cache a newly-visited website, it will save it to disk. The OS will buffer the write to RAM so it will postpone it until the system is idle (when you are reading the website). Performance penalty it is barely noticeable.</p>
<p>Whenever another application reads from disk there is a high probability of hitting the cache because there is 650 MB of RAM available for this purpose. Even if missing the cache, whatever was read from disk will be cached in RAM for subsequent reading.</p>
<p>You, then, fire up a VM that requests 450 MB of RAM. The following occurs:</p>
<ul>
<li>The operating system frees up 450 MB of disk cache. Some of it requires writing, some not. This operation is only as slow as the disk-writes required for unflushed writes, so it&#8217;s not really <em>that</em> slow. Besides, the user somewhat expects it because he just commanded the PC to load up a VM.</li>
<li>There is no swapping at all. There is no need.</li>
<li>It finally allocates 450 MB to the VM.</li>
<li>The VM writes to that physical RAM allocated for it.</li>
</ul>
<p>There is still 200 MB available for disk caching, which the OS will try to efficiently use.</p>
<p>Now, the browser wants to load something from &#8220;disk cache&#8221;. There is some probability, higher than 0 of course, of hitting the cache and the OS serving the data directly from RAM. Let&#8217;s assume not: it was read from disk. The browser is still accelerating web surfing, as the local disk is still faster than the Internet. Furthermore, the OS will cache the object on RAM for subsequent access.</p>
<p>Of course, the VM continues running from RAM without ever needing of any kind of swapping or disk trashing. The system is fully responsive. The user knows (or should know) that if it wants to free up RAM it will close the VM or the browser.</p>
<h3>Case 2: A browser uses more RAM than it should, for caching.</h3>
<p>You have a system with 2 GB of RAM, out of which you have 1 GB <em>free</em> (as in &#8220;maybe used by disk cache but surely available for applications&#8221;). You fire up a web browser that could work really nice with 300 MB of RAM but instead caches everything up for the sake of speed and ends up using 600 MB of RAM.</p>
<p>1000 &#8211; 600 &#8211; 50 = 350</p>
<p>You end up with about 350 MB of RAM for disk cache optimization and 50 MB of actual free physical RAM.</p>
<p>Whenever the browser needs a network resource it loads it up from its own RAM allocation, so it is really fast. (It still has to load it first from disk if not previously available on RAM).</p>
<p>Whenever any other application reads from disk there is a lower probability of hitting the cache. In any case, the overall probability of the other applications of hitting the cache is lower, as memory is exclusively allocated for the web browser. This significantly increases the probability of accessing disk, which may lead to slow the whole system down.</p>
<p>Minimizing the browser <em>does not</em> free memory for other applications. Memory is still being allocated for exclusive use by it.</p>
<p>You, then, fire up a VM that requests for 450 MB of RAM. The following occurs:</p>
<ul>
<li>The operating system frees up 350 MB of disk cache. Some of it requires writing, some not. This operation is only as slow as the disk-writes required, so it&#8217;s not really that slow.</li>
<li>It determines the least used 100 MB of physical RAM and moves it out to swap space. This operation is slow, as it involves a lot of unavoidable on-the-fly disk writes.</li>
<li>It finally allocates 450 MB to the VM application.</li>
<li>The VM writes to that physical RAM allocated for it.</li>
</ul>
<p>The system has no memory for disk cache anymore. Whenever other applications need to read from disk, they will miss the cache and the OS will have to physically access the disk to serve the request. This is slow. What is worse, the disk access will not be cached for subsequent reading.</p>
<p>Now, the browser wants to load something from its own &#8220;RAM cache&#8221; (which, by the way, may probably be out in swap space, now). It may happen one of two things:</p>
<p>If the RAM cache resource is on swap space, the OS will need to read it back. Since that data will be now a &#8220;more recently used&#8221; memory page, the OS might swap RAM and disk with some contents of the VM or another least-used application. This operation is slow because it requires another lot of unavoidable on-the-fly disk writes. Or:</p>
<p>If the resource is still in the application own &#8220;RAM cache&#8221;, it will be retrieved flash-fast from RAM. However, the VM still needs its own RAM to continue, and so do all other applications. This forces the operating system to swap memory again. Also, there is no RAM available for disk cache, and other applications disk requests will still served continuously from disk without the possibility of RAM caching for subsequent access. This generates constant disk activity, slowing all the system, <strong>including the browser</strong>. The browser &#8220;extra RAM cache&#8221; did no good at all.</p>
<p>Of course, the VM continues running and its RAM will continuously be needed back, so disk writing becomes a constant. The whole system slows down by what is called <em>disk trashing</em>. In really bad cases, the system may become unresponsive, restricting the user from even being able to close one of the two applications to recover the system back.</p>
<h3>Conclusions</h3>
<p>Yes, RAM is there to be used when it is needed, not wasted. RAM is a limited resource. There are ways to use RAM efficiently. For instance, loading the indexes of a mailbox in RAM (but not the whole mailbox content), if done correctly, may significantly speed up mail searching.</p>
<p>However, caching disk to RAM might not be a good idea. The caching is already done by the OS, so it is just discarding an efficient OS function by an application. Sometimes it may be a good idea but most probably, particularly in desktop applications, it is not.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2011/07/14/the-ram-is-there-to-be-used-fallacy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gratis vs. libre: La compra de Skype por Microsoft</title>
		<link>http://blog.alvarezp.org/2011/05/13/gratis-vs-libre-la-compra-de-skype-por-microsoft/</link>
		<comments>http://blog.alvarezp.org/2011/05/13/gratis-vs-libre-la-compra-de-skype-por-microsoft/#comments</comments>
		<pubDate>Fri, 13 May 2011 07:24:39 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Ensayos]]></category>
		<category><![CDATA[Español]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[Planeta Linux]]></category>
		<category><![CDATA[Software libre]]></category>
		<category><![CDATA[Tenía que ser un geek.]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1388</guid>
		<description><![CDATA[Cuando no se requiere de pago alguno para usar plenamente un programa se dice que es &#8220;gratuito&#8221;. Dos ejemplos son Skype y OpenOffice.org. Sin embargo, existe una diferencia radical entre ambos: las libertades legales que la licencia de OpenOffice.org garantiza. Por eso se le llama software &#8220;libre&#8221;.
OpenOffice.org es más que simplemente gratuito y más &#8212;incluso&#8212; [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1390" class="wp-caption alignleft" style="width: 310px"><a href="http://blog.alvarezp.org/wp-content/uploads/2011/05/skype-libreoffice.png"><img src="http://blog.alvarezp.org/wp-content/uploads/2011/05/skype-libreoffice-300x271.png" alt="Gratis vs. Libre" title="Gratis vs. Libre" width="300" height="271" class="size-medium wp-image-1390" /></a><p class="wp-caption-text">Gratis vs. Libre</p></div>
<p>Cuando no se requiere de pago alguno para usar plenamente un programa se dice que es &#8220;gratuito&#8221;. Dos ejemplos son <a href="http://www.skype.com/">Skype</a> y <a href="http://www.openoffice.org/">OpenOffice.org</a>. Sin embargo, existe una diferencia radical entre ambos: las libertades legales que la <a href="http://www.openoffice.org/license.html">licencia de OpenOffice.org</a> garantiza. Por eso se le llama <a href="http://es.wikipedia.org/wiki/Software_libre">software &#8220;libre&#8221;</a>.</p>
<p>OpenOffice.org es más que simplemente gratuito y más &#8212;incluso&#8212; que simplemente &#8220;de código abierto&#8221;. Disponer del código fuente de un programa no implica la libertad legal de hacer públicas las mejoras.<br />
 <span id="more-1388"></span><br />
La diferencia entre ambos programas ha quedado de manifiesto comparando la <a href="http://www.informador.com.mx/tecnologia/2009/96803/6/oracle-pacta-la-compra-de-sun-microsystems.htm">adquisición de Sun Microsystems por Oracle</a> frente a la de <a href="http://www.informador.com.mx/economia/2011/291746/6/microsoft-compra-skype-quiere-competir-con-google.htm">Skype por Microsoft</a>.</p>
<p>Antes de ser adquirido, Skype proveía su producto en tres plataformas: Windows, Mac y Linux. El programa era <a href="http://es.wikipedia.org/wiki/Software_propietario">privativo</a> y el protocolo cerrado. Al Microsoft adquirir a Skype, el producto y el modelo de negocios de Microsoft habrán de ajustarse uno al otro. Aunque Microsoft expresó su intención de continuar el soporte para todas las plataformas, es obvio que esto puede cambiar si no le resulta conveniente. Además, como ha ocurrido en otros casos, la disponibilidad del programa para otras plataformas no implica la sincronía con las liberaciones para Windows. Lo cierto es que lo más barato para Microsoft es eliminar el soporte para las plataformas ajenas y mantenerlo sólo para la plataforma que mejor conoce. Lo puede hacer, pues con la compra de Skype se ha adueñado de sus derechos de autor.</p>
<p>Analicemos el escenario en que Microsoft decida terminar con el soporte para Mac y Linux de Skype. Cualquier alternativa sería subóptima en comparación con una implementación nativa:</p>
<ul>
<li><strong>Implementación un cliente alterno por terceros</strong>: Requiere de <a href="http://es.wikipedia.org/wiki/Ingeniería_inversa">ingeniería inversa</a> del protocolo, lo cual puede estar en contra del <a href="http://es.wikipedia.org/wiki/Licencia_de_software">EULA</a>. Además, los cambios en el protocolo podrían ser unilaterales, arbitrarios e incompatibles, lo que se convertiría en desconexiones para los usuarios del cliente alterno hasta la siguiente actualización del programa.</li>
<li><strong>Usar el cliente en un ambiente virtualizado</strong>: Requiere de un consumo extra y significativo de memoria. Además, requeriría de una licencia válida de Windows e implica el mantenimiento de actualizaciones, antivirus, etc.</li>
<li><strong>Usar el cliente sobre una capa de abstracción de Windows (<a href="http://www.winehq.org/">Wine</a>)</strong>: Sólo si Wine fuera perfecto sería viable el uso masivo del cliente nativo de Skype. Sin embargo, el efecto &#8220;burro con zanahoria&#8221; descrito en el primer punto se traslada al sistema operativo. Microsoft puede mejorar Windows realizando cambios unilaterales, arbitrarios y potencialmente incompatibles, lo que perjudicaría y comprometería el funcionamiento de Wine. La realidad es que Wine dista mucho de proveer la plena compatibilidad con Windows y, debido a la alta velocidad con la que cambian y surgen nuevos API, es un trabajo más arduo que alcanzable.</li>
</ul>
<p>En contraposición con lo anterior, antes de la adquisición de Sun Microsystems, OpenOffice.org era software libre bajo la <a href="http://www.viti.es/gnu/licenses/gpl.html">licencia GPLv3</a>. Cuando Oracle apagó el proyecto openSolaris, la comunidad de desarrollo de OpenOffice.org decidió reaccionar ante un posible cierre de OpenOffice.org: crearon <a href="http://www.documentfoundation.org/">The Document Foundation</a>. Con las garantías ofrecidas por la licencia libre de OpenOffice.org se <a href="http://es.wikipedia.org/wiki/Bifurcación_(desarrollo_de_software)">bifurcó</a> el código para formar <a href="http://www.libreoffice.org/">LibreOffice</a>. De esta forma, independientemente del proceder de Oracle con respecto a OpenOffice.org, sea que apagara el proyecto o lo comercializara como producto, la opción nativa sigue existiendo.</p>
<p>Por último, considerando que Skype es un cliente de red y dada su popularidad, bastaría con que Microsoft abriera y mantuviera libre el protocolo actualizado para que la comunidad hiciera un cliente compatible con la plataforma de su preferencia e, incluso, <a href="http://es.wikipedia.org/wiki/Multiplataforma">multiplataforma</a>. Al final, es más importante la especificación abierta y libre del protocolo que la del cliente.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2011/05/13/gratis-vs-libre-la-compra-de-skype-por-microsoft/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Superkb: entonces y ahora</title>
		<link>http://blog.alvarezp.org/2011/03/28/superkb-entonces-y-ahora/</link>
		<comments>http://blog.alvarezp.org/2011/03/28/superkb-entonces-y-ahora/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 01:34:57 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Español]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[Planeta Linux]]></category>
		<category><![CDATA[Superkb]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1381</guid>
		<description><![CDATA[Así es como superkb se veía en ese entonces, en la versión 0.10. Usaba directamente la librería Xlib que no tiene soporte para antialiasing. Entonces, el texto también lo pintaba con Xlib. Los íconos eran cargados y pintados con Imlib2. La versión 0.10 fue liberada en septiembre de 2006. No incluyo pantallazos más viejos pues [...]]]></description>
			<content:encoded><![CDATA[<p>Así es como superkb se veía en ese entonces, en la versión 0.10. Usaba directamente la librería Xlib que no tiene soporte para antialiasing. Entonces, el texto también lo pintaba con Xlib. Los íconos eran cargados y pintados con Imlib2. La versión 0.10 fue liberada en septiembre de 2006. No incluyo pantallazos más viejos pues los considero &#8220;demasiado experimentales&#8221;.<br />
<div id="attachment_1376" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.alvarezp.org/wp-content/uploads/2011/03/superkb-then.png"><img src="http://blog.alvarezp.org/wp-content/uploads/2011/03/superkb-then-300x133.png" alt="Pantallazo de Superkb v0.10." title="Superkb, entonces!" width="300" height="133" class="size-medium wp-image-1376" /></a><p class="wp-caption-text">Pantallazo de Superkb v0.10.</p></div></p>
<p>Bueno, Superkb 0.22 fue liberado hace un par de semanas. Las teclas se pintan ahora usando gradientes. Esto, además de los múltiples modos de rendereo de las teclas que se introdujo en la 0.15 (Feb 2008) y el uso de la biblioteca Cairo en 0.20 (Nov 2009), han cambiado drásticamente la apariencia en general. Ayer corregí la presentación de caracteres UTF-8, que ahora me permiten usar flechas para las teclas de cursor y otras más. Este es el resultado:<br />
<div id="attachment_1377" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.alvarezp.org/wp-content/uploads/2011/03/superkb-now.png"><img src="http://blog.alvarezp.org/wp-content/uploads/2011/03/superkb-now-300x114.png" alt="Superkb con el cambio más reciente para la versión 0.23." title="Superkb, now." width="300" height="114" class="size-medium wp-image-1377" /></a><p class="wp-caption-text">Superkb con el cambio más reciente para la versión 0.23.</p></div></p>
<p>También es una nota de agradecimiento a los usuarios que me han proveído con su retroalimentación tan útil.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2011/03/28/superkb-entonces-y-ahora/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Superkb: then and now</title>
		<link>http://blog.alvarezp.org/2011/03/28/superkb-then-and-now/</link>
		<comments>http://blog.alvarezp.org/2011/03/28/superkb-then-and-now/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 01:30:11 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Software libre]]></category>
		<category><![CDATA[Superkb]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1375</guid>
		<description><![CDATA[This is how Superkb used to look back then in the 0.10 version. It used direct calls to the Xlib library which doesn&#8217;t support antialiasing. Back then, text was also rendered using Xlib. The icons were loaded and painted using Imlib2. Version 0.10 was released on September, 2006. I didn&#8217;t include an even older screenshot [...]]]></description>
			<content:encoded><![CDATA[<p>This is how Superkb used to look back then in the 0.10 version. It used direct calls to the Xlib library which doesn&#8217;t support antialiasing. Back then, text was also rendered using Xlib. The icons were loaded and painted using Imlib2. Version 0.10 was released on September, 2006. I didn&#8217;t include an even older screenshot because I considered it to be &#8220;still too experimental&#8221;.<br />
<span id="more-1375"></span><br />
<div id="attachment_1376" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.alvarezp.org/wp-content/uploads/2011/03/superkb-then.png"><img src="http://blog.alvarezp.org/wp-content/uploads/2011/03/superkb-then-300x133.png" alt="Superkb v0.10 screenshot." title="Superkb, back then!" width="300" height="133" class="size-medium wp-image-1376" /></a><p class="wp-caption-text">Superkb v0.10 screenshot.</p></div></p>
<p>So, Superkb 0.22 was released a couple of weeks ago. It featured a gradient-based rendering of the keys. This, in addition to the multiple key-rendering modes introduced in 0.15 (Feb 2008) and the use of the Cairo library in 0.20 (Nov 2009), have drastically changed the overall appearance. Yesterday I fixed the display of UTF-8 characters, which have allowed me to use arrows for the cursor keys and others. This is the result:<br />
<div id="attachment_1377" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.alvarezp.org/wp-content/uploads/2011/03/superkb-now.png"><img src="http://blog.alvarezp.org/wp-content/uploads/2011/03/superkb-now-300x114.png" alt="Superkb with the most recent change for version 0.23." title="Superkb, now." width="300" height="114" class="size-medium wp-image-1377" /></a><p class="wp-caption-text">Superkb with the most recent change for version 0.23.</p></div></p>
<p>This is also a thank you note to the users that have provided me with their useful feedback.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2011/03/28/superkb-then-and-now/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Teclado Logitech K200, su falta de Super_R y Superkb</title>
		<link>http://blog.alvarezp.org/2011/03/26/teclado-logitech-k200-su-falta-de-super_r-y-superkb/</link>
		<comments>http://blog.alvarezp.org/2011/03/26/teclado-logitech-k200-su-falta-de-super_r-y-superkb/#comments</comments>
		<pubDate>Sat, 26 Mar 2011 08:22:26 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Español]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[Planeta Linux]]></category>
		<category><![CDATA[Superkb]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1368</guid>
		<description><![CDATA[Pues como dice el título, recién me compré un teclado Logitech K200 porque el anterior ya estaba demasiado gastado.
En la fotografía se alcanza a distinguir a la derecha de la barra espaciadora que sólo hay tres teclas. Se trata de Alt, Menu y Ctrl. 
¿Y la tecla Super_R apá? Me di cuenta ya cuando tenía [...]]]></description>
			<content:encoded><![CDATA[<p>Pues como dice el título, recién me compré un teclado <a href="http://www.logitech.com/en-gb/for-business/products/keyboards/devices/7242">Logitech K200</a> porque el anterior ya estaba demasiado gastado.</p>
<div class="wp-caption aligncenter" style="width: 439px"><a href="http://www.logitech.com/en-gb/for-business/products/keyboards/devices/7242"><img alt="Teclado Logitech K200" src="http://blog.alvarezp.org/imagenes/k200/df.png" title="Teclado Logitech K200" width="429" height="257" /></a><p class="wp-caption-text">Teclado Logitech K200</p></div>
<p>En la fotografía se alcanza a distinguir a la derecha de la barra espaciadora que sólo hay tres teclas. Se trata de Alt, Menu y Ctrl. </p>
<p>¿Y la tecla Super_R apá? Me di cuenta ya cuando tenía el teclado instalado y funcionando.</p>
<p>Yo uso <a href="http://superkb.sourceforge.net/index.shtml.es">Superkb</a> para lanzar aplicaciones. Para mí, lanzar aplicaciones es una de las cosas que podrían hacerse con shortcuts y por eso reservo la tecla de Super para esto. La tecla Super_R es importante porque no puedo presionar la Super izquierda simultáneamente con F12 usando una sola mano. Esto se necesita cuando tienes una hamburguesa en la otra mano, jaja!</p>
<p>Pues bien, Superkb admite en <a href="http://superkb.org/wiki/index.php?title=Configuration_files">$HOME/.superkbrc</a> tiene dos líneas de configuración: <a href="http://superkb.org/wiki/index.php?title=SUPERKEY2_STRING">SUPERKEY2_STRING</a> y <a href="http://superkb.org/wiki/index.php?title=SUPERKEY_REPLAY">SUPERKEY_REPLAY</a>, con lo que quedará resuelto este pequeño problema.</p>
<p>&#8220;SUPERKEY2_STRING Menu&#8221; me permite indicar que la segunda tecla mágica a usar será Menu, y no Super_R.</p>
<p>&#8220;SUPERKEY_REPLAY 1&#8243; me permite indicar a Superkb que si la tecla se presiona antes de mostrar el teclado en pantalla y no se usó para lanzar nada, que le envíe el tecladazo a la aplicación que actualmente tiene el foco. De esta manera, puedo seguir contando con la tecla Menu para mostrar los menús contextuales en cualquiera que sea la aplicación en la que esté trabajando.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2011/03/26/teclado-logitech-k200-su-falta-de-super_r-y-superkb/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Superkb 0.22 liberado!</title>
		<link>http://blog.alvarezp.org/2011/03/18/superkb-0-22-liberado/</link>
		<comments>http://blog.alvarezp.org/2011/03/18/superkb-0-22-liberado/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 23:58:41 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Español]]></category>
		<category><![CDATA[Gultij]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[Planeta Linux]]></category>
		<category><![CDATA[Superkb]]></category>
		<category><![CDATA[Tenía que ser un geek.]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1358</guid>
		<description><![CDATA[¡Superkb 0.22 ha sido liberado! Esta es una liberación menor. ¿Quieres saber qué hay de nuevo? Échale un vistazo a la página de la versión 0.22 en el Wiki de Superkb.
Superkb es un lanzador de aplicaciones basado en atajos de teclado con pistas gráficas en pantalla. Está escrito en C usando Xlib con la ayuda [...]]]></description>
			<content:encoded><![CDATA[<p>¡Superkb 0.22 ha sido liberado! Esta es una liberación menor. ¿Quieres saber qué hay de nuevo? Échale un vistazo a la <a href="http://superkb.org/wiki/index.php?title=Superkb_0.22">página de la versión 0.22 en el Wiki de Superkb</a>.</p>
<p><a href="http://superkb.sourceforge.net/">Superkb</a> es un lanzador de aplicaciones basado en atajos de teclado con pistas gráficas en pantalla. Está escrito en C usando Xlib con la ayuda de Cairo graphics, Pango, Imlib2, Xinerama, etc. y con su código fuente manejado con Git.</p>
<div class="wp-caption aligncenter" style="width: 650px"><a href="http://blog.alvarezp.org/imagenes/superkb/shots/0.22/0.22-flatkey.png"><img title="Tus atajos de teclado pintados por Superkb 0.22" src="http://blog.alvarezp.org/imagenes/superkb/shots/0.22/0.22-flatkey-640-245.png" alt="Tus atajos de teclado pintados por Superkb 0.22" width="640" height="245" /></a><p class="wp-caption-text">Tus atajos de teclado pintados por Superkb 0.22</p></div>
<p>Algunas de las características de Superkb:</p>
<ul>
<li>Fácil de usar. Se selecciona una tecla mágica (por omisión Super) como la base de los lanzadores y basta con presionar Super+Tecla para ejecutar cualquier comando configurado o aplicación seleccionada.</li>
<li>No estorboso. Siendo basado en atajos no se necesita nada en pantalla. Al mantener presionada la tecla mágica mostrará en las pistas en pantalla y al soltarla desaparecen.</li>
<li>Soporte para diferentes geometrías del teclado según lo provea el servidor de X Window System.</li>
<li>Provee indicadores en pantalla sobre las acciones invocadas.</li>
<li>La configuración se escribe en un archivo. Instalar la misma configuración en otra computadora es tan simple como copiar el archivo.</li>
<li>La tecla mágica no se desperdicia. Se puede usar F8 como tecla mágica y al presionarla sin lanzar nada se envía a la aplicación que actualmente tiene el foco. Yo uso esto para la Thinkpad T42.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2011/03/18/superkb-0-22-liberado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Superkb 0.22 released</title>
		<link>http://blog.alvarezp.org/2011/03/18/superkb-0-22-released/</link>
		<comments>http://blog.alvarezp.org/2011/03/18/superkb-0-22-released/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 23:50:56 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Gultij]]></category>
		<category><![CDATA[Superkb]]></category>
		<category><![CDATA[Tenía que ser un geek.]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1351</guid>
		<description><![CDATA[Superkb 0.22 has been released! This is a minor release. Do you want to know what&#8217;s new? Take a look at the 0.22 page on the Superkb Wiki.
Superkb is a shortcut-based launcher with on-screen graphical hints. It is written in C using Xlib, with the help of Cairo graphics, Pango, Imlib2, Xinerama, etc. and the [...]]]></description>
			<content:encoded><![CDATA[<p>Superkb 0.22 has been released! This is a minor release. Do you want to know what&#8217;s new? Take a look at the <a href="http://superkb.org/wiki/index.php?title=Superkb_0.22">0.22 page on the Superkb Wiki</a>.</p>
<p><a href="http://superkb.sourceforge.net/">Superkb</a> is a shortcut-based launcher with on-screen graphical hints. It is written in C using Xlib, with the help of Cairo graphics, Pango, Imlib2, Xinerama, etc. and the source code is managed using Git.</p>
<p><span id="more-1351"></span><br />
<div class="wp-caption aligncenter" style="width: 650px"><a href="http://blog.alvarezp.org/imagenes/superkb/shots/0.22/0.22-flatkey.png"><img title="Your keyboard shortcuts painted by Superkb 0.22" src="http://blog.alvarezp.org/imagenes/superkb/shots/0.22/0.22-flatkey-640-245.png" alt="Your keyboard shortcuts painted by Superkb 0.22. Click to see the full image." width="640" height="245" /></a><p class="wp-caption-text">Your keyboard shortcuts painted by Superkb 0.22</p></div></p>
<p>Some of Superkb features:</p>
<ul>
<li>Easy to use. You select a hotkey (Super keys by default) as the base for your launchers and just hit Super+Key to execute whatever command you configured or launch whatever application you chose.</li>
<li>Non-obstructive. Being shortcut based, you don&#8217;t need anything on your screen. Holding the hotkey down will invoke the on-screen hints and releasing it will dismiss them.</li>
<li>Support for different keyboard geometries as provided by the underlying X server.</li>
<li>It provides on-screen feedback for whatever action you have launched.</li>
<li>Configuration is written on a file. You take the configuration with you to install it on your other computer as simple as copying a file.</li>
<li>The hotkey isn&#8217;t wasted. You can choose F8 (or any other) as your hotkey if you please and hitting it will still send it to the currently focused window. I use this for the Thinkpad T42 that has no Super keys.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2011/03/18/superkb-0-22-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Opinión: de la evolución del idioma y las autoridades lingüísticas</title>
		<link>http://blog.alvarezp.org/2011/01/14/opinion-de-la-evolucion-del-idioma-y-las-autoridades-linguisticas/</link>
		<comments>http://blog.alvarezp.org/2011/01/14/opinion-de-la-evolucion-del-idioma-y-las-autoridades-linguisticas/#comments</comments>
		<pubDate>Fri, 14 Jan 2011 22:20:56 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Ensayos]]></category>
		<category><![CDATA[Español]]></category>
		<category><![CDATA[Idioma]]></category>
		<category><![CDATA[Tijuana]]></category>
		<category><![CDATA[mexico]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=1347</guid>
		<description><![CDATA[De leer el artículo No estamos obligados a utilizar el léxico de otra sociedad: lingüista, me pregunta Ricardo Quit:
¿Qué opinas Octavio? ¿Debemos dejar que entre un nuevo participante al negocio de los diccionarios? Este dice que tiene &#8220;25mil palabras&#8221;. La RAE tiene mas de &#8220;88mil lemas&#8221;. Además, para definiciones pues siempre podemos recurrir a Ramón [...]]]></description>
			<content:encoded><![CDATA[<p>De leer el artículo <a href="http://www.jornada.unam.mx/2011/01/14/index.php?section=cultura&#038;article=a03n1cul">No estamos obligados a utilizar el léxico de otra sociedad: lingüista</a>, me pregunta <a href="http://www.ciencia.cc">Ricardo Quit</a>:</p>
<blockquote><p>¿Qué opinas Octavio? ¿Debemos dejar que entre un nuevo participante al negocio de los diccionarios? Este dice que tiene &#8220;25mil palabras&#8221;. La RAE tiene mas de &#8220;88mil lemas&#8221;. Además, para definiciones pues siempre podemos recurrir a Ramón García-Pelayo y Gross. Creo que el problema real esta en el manual de ortografía, no en las definiciones.</p>
<p>Me acordé de cuando cambiaron tuxpam por tuxPAN por onda politica o cuando ponían: &#8220;este imeil a sido escrito sin asentos para fasilitar su lectura&#8221; y no por falta de ortografía.</p></blockquote>
<p>Otros diccionarios han existido, por ejemplo, el Larousse. Su existencia no implica autoridad. Sin embargo, existe una necesidad implícita de unificación de reglas.</p>
<p>Todo depende de la reputación, seriedad y preparación académica del nuevo &#8220;jugador&#8221; que venda el diccionario. Si entra <em>Juanito de los Papeles</em> a hacer diccionarios, realmente sólo provocará caos si la gente le hace caso. El jugador debe ser respetado por la sociedad, por los estudiosos del idioma, los interesados en el habla culta y demás que busquen una referencia seria.</p>
<p>Sin embargo, hay que considerar que la tendencia del idioma la define la gente con el uso. Es decir, si por populismo se decreta que &#8220;ya todos podemos escribir k por /k/, como en <em>komo estás</em> o <em>ke onda</em>&#8221; y la gente lo sigue, se va a provocar una competencia caótica entre &#8220;autoridades&#8221;. Aunque al final una gane, el proceso no necesariamente será agradable.</p>
<p>En este sentido, los diccionarios son sólo documentadores del uso de los vocablos del idioma, aunque no sólo de los vocablos se componga el idioma. Los diccionarios deberían formar parte de un juego que contenga la función de distinguir y justificar las diferencias entre el uso culto y el coloquial.</p>
<p>En cuanto a la RAE, yo he observado que rápidamente recoge vocablos de España pero para Latinoamérica es muy burocrático. La misma RAE está buscando, tal vez sin propia iniciativa, perder esa autoridad; por &#8220;autoridad&#8221; también entiéndase &#8220;mercado&#8221;. Por ejemplo, hay términos que figuran en el <a href="http://www.academia.org.mx/dicmex.php">Diccionario Breve de Mexicanismos</a> de la <a href="http://www.academia.org.mx/historia.php">Academia Mexicana de la Lengua</a>, más no en el <a href="http://www.rae.es/rae.html">Diccionario de la RAE</a>. Al final, lo único que significa es que de usar alguno de estos mexicanismos ante un español, probablemente éste no lo entienda.</p>
<p>Pensemos en la competencia entre Britannica y Wikipedia. Comparemos esto con las diferencias entre el conjugador de RAE contra <a href="http://www.onoma.es/">Onoma</a>, el conjugador de <a href="http://www.molinodeideas.es/">Molino de Ideas</a>.</p>
<p>A la RAE le falta modernizarse. Apenas lo están haciendo con su departamento de &#8220;<a href="http://www.rae.es/rae/gestores/gespub000018.nsf/voTodosporId/651DD2E435FC3039C12571F8003AAE85?OpenDocument">Español al día</a>&#8220;. Sin embargo, están muy atrás de en términos de intercomunicación comunitaria. Ahí está <a href="http://www.wordreference.com/">WordReference.com</a> que con sus foros y diccionarios de traducción llena este hueco.</p>
<p>Personalmente, aunque mi referencia central es la RAE, por lo general utilizo otras fuentes para confirmar y formarme un criterio.</p>
<p>Cuando la RAE cambia arbitrariamente las normas ocurre lo que recientemente fue noticia: que la gente reaccionó: &#8220;me estuviste dando lata durante 30 años para corregirme, y ahora por tus pistolas me la cambias&#8230; lo rechazo.&#8221; La actitud de la RAE fue de autoridad e imposición y no de &#8220;estos son los nuestros humildes resultados de 10 años de estudio del idioma; los motivos son A, B, y C para estos casos&#8221;.</p>
<p>En conclusión, un jugador nuevo es bienvenido si es una entidad estudiosa del idioma, seria y reconoce el valor de la comunidad de lingüistas en la región donde trabaja.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2011/01/14/opinion-de-la-evolucion-del-idioma-y-las-autoridades-linguisticas/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

