<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Bitácora de Vuelo (Publicaciones sobre distribución)</title><link>http://blog.taniquetil.com.ar/</link><description></description><atom:link href="http://blog.taniquetil.com.ar/categories/distribucion.xml" rel="self" type="application/rss+xml"></atom:link><language>es</language><copyright>Contents © 2023 &lt;a href="mailto:facundo@taniquetil.com.ar"&gt;Facundo Batista&lt;/a&gt; CC BY-NC-SA</copyright><lastBuildDate>Mon, 29 May 2023 18:52:04 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Mi posición con respecto a pinning</title><link>http://blog.taniquetil.com.ar/posts/0849/</link><dc:creator>Facundo Batista</dc:creator><description>&lt;p&gt;Si ya voy mezclando palabras raras en el título pueden empezar a adivinar que este es un post técnico, y tendrán razón.&lt;/p&gt;
&lt;p&gt;¿Qué significa &lt;em&gt;pinning&lt;/em&gt;? Un montón de cosas, pero en el mundo del software, o al menos en la parte de distribución de software, significa especificar exactamente la versión de una dependencia.&lt;/p&gt;
&lt;p&gt;Por ejemplo, yo puedo hacer un programejo que usa la biblioteca &lt;code class="docutils literal"&gt;requests&lt;/code&gt;, y no me importa la versión, entonces en la lista de dependencias pongo &lt;code class="docutils literal"&gt;requests&lt;/code&gt; y ya. Pero si quiero especificar exactamente qué versión de esa biblioteca necesito, pondría algo como &lt;code class="docutils literal"&gt;requests == 2.7.1&lt;/code&gt;. Eso es &lt;em&gt;pinnear&lt;/em&gt; (mezclando ahora inglés y castellano) la versión de la dependencia, que es como agarrarla con un alfiler para que no se mueva y siempre sea la misma.&lt;/p&gt;
&lt;img alt="Le ponemos un pin" src="http://blog.taniquetil.com.ar/images/pinning/cartelera.jpeg"&gt;
&lt;p&gt;¿Cuándo tiene sentido hacer eso y cuándo no? ¿Depende del entorno donde correrá mi programejo? ¿De las dependencias que estoy usando? ¿De la forma de distribución? Un poco de todo eso apunta a contestar este post.&lt;/p&gt;
&lt;p&gt;Entonces...&lt;/p&gt;
&lt;section id="mi-posicion-con-respecto-a-pinning"&gt;
&lt;h2&gt;Mi posición con respecto a pinning&lt;/h2&gt;
&lt;p&gt;Ya sabemos que los extremos son malos. Traducido al tema que nos atañe, podemos decir que no queremos ni nada pinneado nunca, ni todo pinneado todo el tiempo.&lt;/p&gt;
&lt;p&gt;El problema de "nada pinneado nunca" es que es muy difícil poder garantizar la calidad del sistema que estamos armando. Si en desarrollo usamos la biblioteca versión &lt;code class="docutils literal"&gt;X&lt;/code&gt;, pero luego cuando desplegamos todo en un servidor termina instalando la versión &lt;code class="docutils literal"&gt;Y&lt;/code&gt;, puede ser que nos explote todo. O peor, que parezca funcionar, pero que no funcione correctamente. Y si lo distribuimos es aún más complicado: si el sistema lo instalan un montón de personas en sus computadoras vamos a tener mil combinaciones de distintas versiones.&lt;/p&gt;
&lt;p&gt;Por otro lado, si tenemos "todo pinneado todo el tiempo", rompemos la evolución del software que contiene nuestro sistema. La evolución es un concepto central, no podemos cortar la evolución de las dependencias de nuestro software porque terminamos atados a versiones viejas. Y no es un problema de alguna funcionalidad más o menos, sino de seguridad: a menos que tengamos atrás un equipo de especialistas en seguridad haciéndose cargo del mantenimiento de versiones viejas, tenemos que tratar de usar todo lo nuevo en todos lados.&lt;/p&gt;
&lt;p&gt;Entonces, tenemos que encontrar un balance entre ambos extremos, que es lo que les comento en el resto del post.&lt;/p&gt;
&lt;p&gt;Tengamos en cuenta que queremos distintos comportamientos si tenemos bibliotecas o aplicaciones, y en este último caso dónde correrán las aplicaciones, si del lado del cliente (luego de que empaquetamos el software) o en un servidor (que desplegamos directamente).&lt;/p&gt;
&lt;img alt="Por qué les decimos bibliotecas a las bibliotecas" src="http://blog.taniquetil.com.ar/images/pinning/biblioteca.jpeg"&gt;
&lt;section id="bibliotecas"&gt;
&lt;h3&gt;Bibliotecas&lt;/h3&gt;
&lt;p&gt;Si estamos trabajando con bibliotecas, las mismas tienen que ser lo más flexibles posible, ya que van a ser usadas de maneras que no se pueden prever: nunca vamos a tener el contexto en el qué se usarán nuestras bibliotecas.&lt;/p&gt;
&lt;p&gt;Debemos especificar qué dependencias se necesitan, pero ser lo más libres y genériques posibles con respecto a las versiones, luego la aplicación que use nuestra biblioteca especificará la versión, o no. No es de nuestra incumbencia, nuestra biblioteca debería ser independiente de las versiones de sus dependencias... y aunque ya sabemos que esto no es posible en su totalidad, debemos tratar de restringir las versiones lo menos posible.&lt;/p&gt;
&lt;p&gt;En otras palabras, está mal definir que nuestra biblioteca necesita la dependencia &lt;code class="docutils literal"&gt;X&lt;/code&gt; en la versión &lt;code class="docutils literal"&gt;== 2.7.1&lt;/code&gt;, pero está bien definir que la necesita en una versión &lt;code class="docutils literal"&gt;=&amp;gt; 2&lt;/code&gt; o incluso &lt;code class="docutils literal"&gt;=&amp;gt; 2; != 2.0.4&lt;/code&gt;, en caso de que haya alguna incompatibilidad puntual. Y después será la aplicación la que defina en qué versión necesita sus propias dependencias, y se hará el análisis en conjunto para determinar si hay un conflicto. Si la biblioteca defina una dependencia &lt;code class="docutils literal"&gt;X&lt;/code&gt; en una versión específica, y la aplicación también depende de la misma &lt;code class="docutils literal"&gt;X&lt;/code&gt;, está condicionada a usar sólo esa versión. Peor aún, si la aplicación necesita las bibliotecas &lt;code class="docutils literal"&gt;foo&lt;/code&gt; y &lt;code class="docutils literal"&gt;bar&lt;/code&gt;, y &lt;code class="docutils literal"&gt;foo&lt;/code&gt; define la dependencia &lt;code class="docutils literal"&gt;X&lt;/code&gt; en una versión y &lt;code class="docutils literal"&gt;bar&lt;/code&gt; define la misma dependencia &lt;code class="docutils literal"&gt;X&lt;/code&gt; en otra versión, la aplicación directamente no podrá usar ambas &lt;code class="docutils literal"&gt;foo&lt;/code&gt; y &lt;code class="docutils literal"&gt;bar&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Entonces, recapitulemos: para las bibliotecas seamos lo menos específicos posible en las versiones de sus dependencias. Arranquemos con no indicar ninguna versión en ninguna dependencia, y vayamos agregando restricciones con el tiempo, sólo si encontramos alguna incompatibilidad.&lt;/p&gt;
&lt;img alt="Local para eventos en el lago Pavillión, en Copenhague, Dinamarca" src="http://blog.taniquetil.com.ar/images/pinning/local.jpeg"&gt;
&lt;/section&gt;
&lt;section id="aplicaciones"&gt;
&lt;h3&gt;Aplicaciones&lt;/h3&gt;
&lt;p&gt;Con las aplicaciones es diferente. En el momento en que empaquetamos una aplicación para distribuirla, o la desplegamos en servidores para ser usada, queremos poder garantizar que se ejecutará correctamente de cara a les usuaries finales.&lt;/p&gt;
&lt;p&gt;La calidad de la aplicación la garantizamos con distintas evaluaciones que hacemos, que pueden ser pruebas de unidad, pruebas de integración, pruebas manuales. Un proyecto robusto siempre tendrá alguna combinación de todas estas pruebas que se realizarán para determinar la calidad de una determinada versión de la aplicación.&lt;/p&gt;
&lt;p&gt;Pero esta versión de la aplicación, ¿qué versión de cada una de sus dependencias utilizará? Si corremos todas las pruebas para la versión que queremos liberar de nuestra aplicación usando la versión &lt;code class="docutils literal"&gt;X&lt;/code&gt; de una dependencia, pero al momento de empaquetarla o desplegarla en un servidor se termina usando la versión &lt;code class="docutils literal"&gt;Y&lt;/code&gt; de esa dependencia, en realidad las pruebas que corrimos no son válidas.&lt;/p&gt;
&lt;p&gt;Tengamos en cuenta que en realidad no hay mucha diferencia entre si a la aplicación la empaquetamos para distribuirla o la desplegamos en un servidor para ser usada. En general tanto el proceso de empaquetado como el de despliegue terminarán instalando nuevamente las dependencias necesarias, y a menos que todas las versiones estén especificadas, no tenemos control de cuales serán usadas.&lt;/p&gt;
&lt;p&gt;En otras palabras, para garantizar la calidad de la aplicación tenemos que pinnear las versiones de las dependencias, correr toda la batería de pruebas que tengamos utilizando esas dependencias, y luego empaquetar o desplegar la aplicación usando exactamente esas dependencias.&lt;/p&gt;
&lt;p&gt;Pero si tenemos todo pinneado, volvemos al problema del que hablábamos antes de poder evolucionar, quedamos atrapados en versiones viejas con posibles problemas sin corregir. O peor, con fallas de seguridad expuestas.&lt;/p&gt;
&lt;img alt="Praga, de noche, luego de la lluvia" src="http://blog.taniquetil.com.ar/images/pinning/pragamojada.jpeg"&gt;
&lt;p&gt;La forma más piola que he encontrado de tanto poder garantizar la calidad final como también de evolucionar en el tiempo es tener &lt;em&gt;dos&lt;/em&gt; listas de dependencias.&lt;/p&gt;
&lt;p&gt;La primera lista tendrá las dependencias directas de nuestra aplicación (no las dependencias de las dependencias) de la forma más laxa posible: similar a lo que hacemos con las bibliotecas, a priori no especificaremos ninguna restricción, y sólo las agregaremos con el tiempo si encontramos incompatibilidades puntuales.&lt;/p&gt;
&lt;p&gt;La segunda lista tendrá todas las dependencias de nuestra aplicación y a la vez todas las dependencias de las dependencias, y las dependencias de las dependencias de las dependencias, etc., con la versión específica con que fueron instaladas. Todas las pruebas que correrá el desarrollador, o el sistema de CI/CD (&lt;em&gt;Continuous Integration / Continuous Delivery&lt;/em&gt;) que tengamos, se harán utilizando esta segunda lista con todo bien especificado. Y el proceso posterior de empaquetado o despliegue también utilizará esta segunda lista, con lo cual terminamos garantizando la calidad de la aplicación. Incluso, si dudamos de la procedencia de los archivos de nuestras dependencias, podemos hasta sacar el &lt;em&gt;hash&lt;/em&gt; de las mismas y luego validarlas; entonces no sólo indicamos que los tests se hacen con la versión &lt;code class="docutils literal"&gt;foo == 2.1.7&lt;/code&gt; sino que también podemos validar que cuando el server instale esa versión específica el archivo con el que lo haga sea exactamente igual al que usamos nosotros, y nadie nos vendió gato por liebre en el medio (lo que sería un tipo de ataque &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Ataque_de_intermediario"&gt;MITM&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Entonces, ya sabemos que tenemos dos listas para las dependencias de nuestra aplicación, la laxa que nos permite evolucionar y a partir de la cual se arma la muy específica sobre la cual se valida calidad y libera la aplicación.&lt;/p&gt;
&lt;p&gt;¿Cómo vamos de una lista a la otra? En tiempo de desarrollo. Será responsabilidad de nosotres les desarrolladores el cada tanto (no tiene que ser &lt;em&gt;todo el tiempo&lt;/em&gt;) generar el entorno de desarrollo desde cero utilizando la lista laxa y generar a partir de esa instalación la lista específica. Las distintas herramientas que nos permiten trabajar con entornos de desarrollo en general también nos dan la posibilidad de generar la lista específica a partir del entorno creado (por ejemplo en &lt;a class="reference external" href="https://fades.readthedocs.io/"&gt;fades&lt;/a&gt; tenemos la opción &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;--freeze&lt;/span&gt;&lt;/code&gt;).&lt;/p&gt;
&lt;img alt='Muy bien lograda la ambientación de una "taberna medieval" en Praga' src="http://blog.taniquetil.com.ar/images/pinning/tabernamedieval.jpeg"&gt;
&lt;p&gt;Para terminar, tengamos en cuenta que todas las dependencias que vengo mencionando son las de &lt;em&gt;producción&lt;/em&gt;, aquellas bibliotecas que nuestra aplicación necesita para finalmente correr.&lt;/p&gt;
&lt;p&gt;Pero también tenemos aquellas dependencias de &lt;em&gt;desarrollo&lt;/em&gt;: todas las bibliotecas y utilidades que usaremos les desarrolladores para, justamente, desarrollar la aplicación. Estas dependencias &lt;strong&gt;no&lt;/strong&gt; se instalarán, incluirán, ni usarán en el paquete que armemos para distribuir la aplicación o en el servidor. Un ejemplo de este tipo de dependencias podría ser &lt;a class="reference external" href="https://docs.pytest.org/"&gt;pytest&lt;/a&gt;, el corredor de pruebas de unidad.&lt;/p&gt;
&lt;p&gt;Para estas dependencias tendremos otra lista, separada de las de producción. Hay distintas formas de manejar esta separación; por ejemplo, si utilizamos archivos de dependencias podemos tener un &lt;code class="docutils literal"&gt;requirements.txt&lt;/code&gt; para las de producción y &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;requirements-dev.txt&lt;/span&gt;&lt;/code&gt; para las desarrollo.&lt;/p&gt;
&lt;p&gt;El punto es que a las dependencias de desarrollo no las tenemos que pinnear para nada (obviamente, a menos que encontremos alguna incompatibilidad o bug en particular). Siempre utilizaremos lo último de lo último cuando armemos los entornos de desarrollo, y si en algún momento algún test falla porque las herramientas que utilizamos evolucionaron (por ejemplo, &lt;a class="reference external" href="https://flake8.pycqa.org/en/latest/"&gt;flake8&lt;/a&gt; detectando un caso nuevo) corregiremos nuestro código y seguiremos adelante. Pero no hay motivo alguno para pinnearlas.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;</description><category>bibliotecas</category><category>distribución</category><category>distribution</category><category>packages</category><category>paquetes</category><category>Python</category><category>separados por pinning</category><guid>http://blog.taniquetil.com.ar/posts/0849/</guid><pubDate>Wed, 09 Nov 2022 22:19:00 GMT</pubDate></item><item><title>El futuro del empaquetado en Python</title><link>http://blog.taniquetil.com.ar/posts/0836/</link><dc:creator>Facundo Batista</dc:creator><description>&lt;p&gt;Ok, ok, es un poco pretencioso mi título, pero es que estoy &lt;strong&gt;muy&lt;/strong&gt; contento de anunciar la segunda liberación de un proyecto que maduró en mi cabeza por unos meses y ya armé una prueba de concepto.&lt;/p&gt;
&lt;p&gt;La alegría viene en parte porque no sólo la prueba de concepto fue más exitosa de lo que pensaba (el sistema hace lo que quería que haga de forma sorprendentemente genérica y robusta), sino que todo esto pasa en los días que cumplo 20 años programando en Python :)&lt;/p&gt;
&lt;p&gt;En verdad lo que ya tengo armado es más que una prueba de concepto. Está funcionando todo lo que quería, aunque le faltan algunas funcionalidades básicas para todo lo que tengo imaginado, tests, mejorar el código etc. Podemos decir que está en estado "alfa".&lt;/p&gt;
&lt;p&gt;Pero aún versión alfa y todo, ya está publicado: &lt;a class="reference external" href="https://pypi.org/project/pyempaq/0.2.1/"&gt;PyEmpaq v0.2.1&lt;/a&gt;.&lt;/p&gt;
&lt;a class="reference external image-reference" href="https://github.com/facundobatista/pyempaq/"&gt;&lt;img alt="El empaquetado hecho fácil" src="http://blog.taniquetil.com.ar/images/logo-pyempaq.png"&gt;&lt;/a&gt;
&lt;p&gt;En &lt;a class="reference external" href="https://github.com/facundobatista/pyempaq/"&gt;la página del proyecto&lt;/a&gt; está todo super explicado, pero la idea base es que con PyEmpaq se puede meter todo el proyecto (código fuente, imágenes necesarias, etc.) en un sólo archivo &lt;code class="docutils literal"&gt;.pyz&lt;/code&gt;, que termina siendo el único archivo que hay que distribuir.&lt;/p&gt;
&lt;p&gt;Exactamente como vemos en este videito:&lt;/p&gt;
&lt;a class="reference external image-reference" href="https://github.com/facundobatista/pyempaq/blob/main/resources/demo_pack.gif?raw=True"&gt;&lt;img alt="Proceso de empaquetado, por el desarrollador (click para ampliar)" src="http://blog.taniquetil.com.ar/images/pyempaq_demo_pack.gif"&gt;&lt;/a&gt;
&lt;p&gt;Luego, la persona que recibe o se baja ese archivo, lo único que tiene que hacer es ejecutarlo con Python. La magia de PyEmpaq hará que (la primera vez solamente) ese archivo se expanda en algún lugar piola, se instalen las dependencias necesarias, y finalmente se ejecute el programa indicado.&lt;/p&gt;
&lt;p&gt;Lo podemos ver en este otro videito:&lt;/p&gt;
&lt;a class="reference external image-reference" href="https://github.com/facundobatista/pyempaq/blob/main/resources/logo-256.png?raw=True"&gt;&lt;img alt="Proceso de ejecución por el usuario final (click para ampliar)" src="http://blog.taniquetil.com.ar/images/pyempaq_demo_run.gif"&gt;&lt;/a&gt;
&lt;p&gt;Es muy multiplataforma: se puede empaquetar estando en Linux, Mac o Windows, y ese &lt;cite&gt;.pyz&lt;/cite&gt; resultante funcionará sin problema en esos sistemas operativos. Incluso cruzándolos: podemos empaquetar en Linux y ejecutarlo en Windows, etc.&lt;/p&gt;
&lt;p&gt;Para mostrar todo el potencial, armé tres ejemplitos para que cualquiera pueda probar que el empaquetado funciona:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/facundobatista/pyempaq/blob/main/examples/simple-command-line.pyz?raw=True"&gt;en una terminal&lt;/a&gt;: un ejemplo muy chiquito que corre sólo en la terminal&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/facundobatista/pyempaq/blob/main/examples/arcade-game.pyz?raw=True"&gt;un juego&lt;/a&gt;: un juego simple usando la biblioteca Arcade de Python (en realidad es el ejemplo 6 de su tutorial)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/facundobatista/pyempaq/blob/main/examples/desktop-qt-app.pyz?raw=True"&gt;una aplicación de escritorio&lt;/a&gt;: un aplicación completa de escritorio usando el framework PyQt5 (es mi programa Encuentro)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Como pueden ver &lt;a class="reference external" href="https://github.com/facundobatista/pyempaq/issues"&gt;en los issues&lt;/a&gt; le falta bastante laburo para que se lo pueda considerar "estable", pero ya llegará. Por lo pronto lo voy a llevar al &lt;a class="reference external" href="https://wiki.python.org.ar/PyCamp/2021/"&gt;PyCamp de Noviembre&lt;/a&gt;.&lt;/p&gt;</description><category>distribución</category><category>packaging</category><category>proyecto</category><category>PyCamp</category><category>Python</category><guid>http://blog.taniquetil.com.ar/posts/0836/</guid><pubDate>Sun, 26 Sep 2021 23:44:00 GMT</pubDate></item><item><title>Distribuyendo Encuentro</title><link>http://blog.taniquetil.com.ar/posts/0834/</link><dc:creator>Facundo Batista</dc:creator><description>&lt;p&gt;El año pasado &lt;a class="reference external" href="https://blog.taniquetil.com.ar/posts/0809/"&gt;les contaba&lt;/a&gt; que con la ayuda de un colaborador sacamos a flote y renovamos totalmente &lt;a class="reference external" href="https://encuentro.taniquetil.com.ar/"&gt;Encuentro&lt;/a&gt;.&lt;/p&gt;
&lt;a class="reference external image-reference" href="https://encuentro.taniquetil.com.ar/"&gt;&lt;img alt="Amo el logo de Encuentro" src="http://blog.taniquetil.com.ar/images/encuentro-logonuevo.png"&gt;&lt;/a&gt;
&lt;p&gt;Eso quedó ahí, y aunque se podía clonar el proyecto o bajar un tarball y usarlo sin problema, realmente no había armado nada para que sea facil distribuirlo. Y es que poder distribuirlo y que se pueda usar facilmente es un laburo necesario para que todes puedan realmente aprovechar el programa.&lt;/p&gt;
&lt;p&gt;En su momento, aprovechando que laburé para armar &lt;a class="reference external" href="https://blog.taniquetil.com.ar/posts/0829/"&gt;un instalador de Windows de TypusPocus&lt;/a&gt;, armé también el instalador para Windows de Encuentro.&lt;/p&gt;
&lt;p&gt;¿Pero y los linuxes? Bueno, no es tan fácil. Armar un &lt;code class="docutils literal"&gt;.deb&lt;/code&gt; o un &lt;code class="docutils literal"&gt;.rpm&lt;/code&gt; no es trivial (y sólo se cubre Debian, Ubuntu, Fedora, y algunos derivados). Y para Arch es distinto. Traté de armar un &lt;a class="reference external" href="https://snapcraft.io/"&gt;snap&lt;/a&gt;, que funca en muchos linuxes, pero como es un formato que tiene "todo adentro y listo para usar" no es sencillo meter cosas gigantes del escritorio, como PyQt5. Y sí, claro, siempre te podés bajar el tarball o clonar el proyecto y usar Encuentro en Linux, pero no es sencillo, termina siendo una barrera.&lt;/p&gt;
&lt;p&gt;Por otro lado, desde hace algunos meses empezó a germinar en mi cabeza una idea para distribuir proyectos Python, y hace algunas semanas empezó a catalizarse en algo firme, posible. Lo dí por llamar &lt;a class="reference external" href="https://github.com/facundobatista/pyempaq/"&gt;PyEmpaq&lt;/a&gt; y todavía está muy verde (ya escribiré un post cuando esté más firme).&lt;/p&gt;
&lt;p&gt;El punto es que justamente PyEmpaq me permite distribuir Encuentro de forma sencilla :). Es sólo un archivo, te lo bajás y lo corrés con Python 3, y listo. Sí, tenés que tener Python instalado en la máquina, pero eso siempre se cumple con los Linuxes. ¡Y nada más!&lt;/p&gt;
&lt;p&gt;La primera vez va a tardar un toque porque arma el entorno para que el programa corra ok, pero luego lo reusa y listo. Y no es un instalador: vas a tener que volver a correrlo desde la terminal cada vez que lo quieras usar (¿les dije que estaba verde?).&lt;/p&gt;
&lt;p&gt;Pero funciona, y es suficiente para que sea usable. Así que actualicé &lt;a class="reference external" href="https://encuentro.taniquetil.com.ar/"&gt;la página de Encuentro&lt;/a&gt; para reflejar estas dos formas de instalación/uso, y listo.&lt;/p&gt;
&lt;p&gt;Que lo aprovechen.&lt;/p&gt;</description><category>contenido</category><category>distribución</category><category>Encuentro</category><category>Linux</category><category>PyEmpaq</category><category>Windows</category><guid>http://blog.taniquetil.com.ar/posts/0834/</guid><pubDate>Sun, 08 Aug 2021 16:19:00 GMT</pubDate></item><item><title>Distribución de teclado</title><link>http://blog.taniquetil.com.ar/posts/0749/</link><dc:creator>Facundo Batista</dc:creator><description>&lt;p&gt;Arranquemos la historia a principios de siglo, porque en algún momento hay que arrancarla.&lt;/p&gt;
&lt;p&gt;Mi computadora principal hogareña tenía un teclado con &lt;a class="reference external" href="https://upload.wikimedia.org/wikipedia/commons/7/74/KB_Spanish.svg"&gt;distribución "en español"&lt;/a&gt; (lo que normalmente se consigue en las casas de computación), pero en el laburo que arranqué en el 2000 (Unifón) todas las computadoras tenían &lt;a class="reference external" href="https://upload.wikimedia.org/wikipedia/commons/8/8e/KB_Latin_American.svg"&gt;distribución "latinoamericana"&lt;/a&gt; (que es lo que venden las marcas grandes, como IBM, Dell, etc, en toda Latinoamérica).&lt;/p&gt;
&lt;p&gt;Los teclados eran diferentes, sí, pero no tanto. Encima alrededor del 2004 decidí comprarme un teclado de buena calidad, y elegí uno marca IBM, como los de la oficina, que me gustaban mucho. Obviamente, era distribución latinoamericana.&lt;/p&gt;
&lt;p&gt;Desde ese momento usé esa distribución exclusivamente.&lt;/p&gt;
&lt;p&gt;La laptop que usaba los últimos meses de Movistar, la que me dieron en Cyclelogic (una Dell Inspiron), y la que me dieron en Ericsson (creo que una HP) todas eran compradas acá así que eran todas con teclado latinoamericano.&lt;/p&gt;
&lt;p&gt;Cuando entré en Canonical, me compré una laptop yo. En ese momento compré en Argentina una &lt;a class="reference external" href="http://blog.taniquetil.com.ar/posts/0403"&gt;Dell XPS m1330&lt;/a&gt;, muy linda máquina. Al momento de renovarla busqué mucho y terminé en &lt;a class="reference external" href="http://blog.taniquetil.com.ar/posts/0597"&gt;una Samsung que nunca me convenció mucho&lt;/a&gt;, también comprada acá. En ambos casos, teclado latinoamericano.&lt;/p&gt;
&lt;p&gt;Y mientras tanto, seguía usando en la desktop el &lt;strong&gt;excelente&lt;/strong&gt; teclado IBM que me había comprado hace tanto tiempo.&lt;/p&gt;
&lt;p&gt;El año pasado volvía a renovar la laptop, y luego de buscar varios meses algo que me convenciera acá en Argentina, en Chile o en Uruguay, terminé tomando la decisión de comprarla en USA (una Lenovo Thinkpad). Claro, con &lt;a class="reference external" href="http://www.spanish411.net/images/Keyboard-US-International.gif"&gt;teclado en inglés&lt;/a&gt;, pero mi idea era luego comprar el teclado acá y cambiárselo.&lt;/p&gt;
&lt;p&gt;Muchas personas (desde hace mucho tiempo) me preguntaban por qué no usaba teclado en inglés y listo. Puedo agrupar toda esa gente en dos grandes grupos:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;los que usan el teclado en inglés configurado como "inglés", sin acentos ni eñe, pero escriben todo el tiempo con faltas de ortografía; esto es llanamente inaceptable para mí.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;los que usan el teclado en inglés configurado como "internacional con teclas muertas" (que era como yo tenía la laptop nueva), donde para poner un acento hay que teclear el tilde y luego la vocal; el problema de esto es que para escribir el tilde sólo, hay que teclear el tilde y luego espacio (y como es la misma tecla, para comillas hay que hacer shift+tilde y luego espacio). Funciona, pero es tremendamente ineficiente y molesto.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El 2017 me encontró con el mismatch de teclado entre el desktop y la laptop, algo que me molestaba bastante. Y en Agosto pasaron dos cosas.&lt;/p&gt;
&lt;p&gt;Por un lado ya me había cansado de esperar que Lenovo Argentina me vendiera un teclado en latinoamericano para la laptop. Nunca lo importaron, siempre me lo patearon para adelante, ¡durante un año!&lt;/p&gt;
&lt;p&gt;Por otro lado, Joac me mostró que hay una configuración "internacional con teclas muertas por AltGr", que lo que hace es evitar el "doble tecleo": para poner una á, sólo hay que hacer AltGr+a. Y listo. Tilde es tilde, comilla es comilla, etc. Hay casos donde necesitamos componer caracteres con varias teclas, pero no es frecuente (por ejemplo, si queremos escribir una ü, donde ahí si tenemos que teclear AltGr+shift+tilde, y luego la u).&lt;/p&gt;
&lt;p&gt;Esta configuración me resultó bastante funcional (aunque no ideal), así que lo que tenía que hacer también era solucionar el mismatch con la desktop, por lo que me compré en el último viaje &lt;a class="reference external" href="https://www.amazon.com/gp/product/B000AOYWVE/ref=oh_aui_detailpage_o07_s00?ie=UTF8&amp;amp;amp;psc=1"&gt;un teclado Lenovo que es igualito al IBM que tenía... pero en inglés&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Así que acá me ven, a la vejez viruela, etc, etc.&lt;/p&gt;</description><category>distribución</category><category>teclado</category><guid>http://blog.taniquetil.com.ar/posts/0749/</guid><pubDate>Mon, 23 Oct 2017 22:13:48 GMT</pubDate></item><item><title>La CDPedia en Educ.ar</title><link>http://blog.taniquetil.com.ar/posts/0541/</link><dc:creator>Facundo Batista</dc:creator><description>&lt;p&gt;¡Finalmente! Luego de varios meses de discutir, pelear diseños, frases que debían aparecer en las cajas y en lo impreso del CD, y varios etcéteras más, aparecieron las cajas de Educ.ar.&lt;/p&gt;
&lt;p&gt;Todavía no me queda claro si ya se enviaron y llegaron a las escuelas de todo el país, ya se enviaron y van a ir llegando en las sucesivas semanas, o se va a mandar a principios del año que viene... pero bueno, a nosotros ya nos dieron unos ejemplos del producto final.&lt;/p&gt;
&lt;img alt="La CDPedia en Educ.ar" src="http://blog.taniquetil.com.ar/images/material-educar.jpg"&gt;
&lt;p&gt;Como ven en la foto, tenemos un pack para nivel medio y otro para nivel superior. En ambos casos se incluye un CD que es "la wikipedia en el aula". Aunque la caja y los discos tienen mucho de lo que les obligamos a poner (las licencias correspondientes, o la leyenda "se permite la copia y distribución de este disco" bien legible, por ejemplo), ni esa caja ni el disco tienen los logos de PyAr ni de Wikipedia. Una lástima.&lt;/p&gt;
&lt;p&gt;Por otro lado, también hicieron cajitas separadas con la "wikipedia en el aula", y para esos sí: está el logo de PyAr en el reverso, y el disco, y la URL de la CDPedia en el frente, bien grande.&lt;/p&gt;
&lt;p&gt;No está mal, en general, pero jode porque ellos NO cumplieron con lo prometido, :(&lt;/p&gt;
&lt;p&gt;En fin, de a poquito.&lt;/p&gt;</description><category>distribución</category><category>Wikipedia</category><guid>http://blog.taniquetil.com.ar/posts/0541/</guid><pubDate>Tue, 20 Dec 2011 23:35:31 GMT</pubDate></item></channel></rss>