<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:wfw="https://xn--bitcora-jwa.es/">
    <channel>
        <title><![CDATA[Bitácora]]></title>
        <description><![CDATA[Programación, Sistemas e Ingeniería del Conocimiento con un firme y decidido compromiso ético.]]></description>
        <link>https://xn--bitcora-jwa.es/</link>
        <image>
            <url>https://xn--bitcora-jwa.es/yo.jpg</url>
            <title>Bitácora</title>
            <link>https://xn--bitcora-jwa.es/</link>
        </image>
        <generator>RSS for Node</generator>
        <lastBuildDate>Wed, 16 Sep 2026 04:20:22 GMT</lastBuildDate>
        <atom:link href="https://xn--bitcora-jwa.es/rss" rel="self" type="application/rss+xml"/>
        <copyright><![CDATA[© 2017-2026 • José Vicente del Valle Fayos]]></copyright>
        <language><![CDATA[es]]></language>
        <item>
            <title><![CDATA[La tregua]]></title>
            <description><![CDATA[Hoy recibo el libro con el que espero llegar a jugar bien al ajedrez , después de leerlo y estudiarlo con detenimiento, claro está. Y precisamente hoy, es el...]]></description>
            <link>https://xn--bitcora-jwa.es/entrada/0bdcfb64-2aee-4164-8aec-e24bca55b7b3</link>
            <guid isPermaLink="true">https://xn--bitcora-jwa.es/entrada/0bdcfb64-2aee-4164-8aec-e24bca55b7b3</guid>
            <dc:creator><![CDATA[José Vicente del Valle Fayos]]></dc:creator>
            <pubDate>Sun, 06 Sep 2026 11:35:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Hoy recibo <a href="https://www.amazon.es/dp/8491871330">el libro con el que espero llegar a jugar bien al ajedrez</a>, después de leerlo y estudiarlo con detenimiento, claro está. Y precisamente hoy, es el día en que su autor, Miguel Illescas, en <a href="https://www.youtube.com/watch?v=TDEHcgmbUNk">una entrevista de <em>podcast</em> del año 2024</a>, nos hace saber que abandonó la alta competición porque su cuerpo no aguantaba el estrés provocado por el juego después de quince años de dedicación en cuerpo y alma. Según cuenta, a partir de cierto momento, el ajedrez le empezó a pasar factura. Poco a poco comprendió que no podía sostener ese nivel de exigencia y se vio obligado a reorientar su carrera hacia el entrenamiento y la divulgación.</p>
<p>Supongo que es esa la primera lección que deberían enseñar en cualquier escuela de ajedrez. <strong>La excelencia que se prodiga en la mayor parte de empresas e instituciones, lleva veneno</strong>. <strong>Y el veneno, mata</strong>. Antes de jugar al ajedrez, planifique el momento de su retirada, porque <strong>quien está dispuesto a ganar a cualquier precio, corre el riesgo de perderse en sus ambiciones</strong>. El ajedrez tiene la mala costumbre de disfrazarse de diversión. Desde fuera parece una actividad reposada: dos personas sentadas frente a un tablero moviendo piezas de madera. Pero, en la élite, es un deporte de resistencia. Horas de concentración absoluta, preparación obsesiva de aperturas, estudio constante de rivales, presión competitiva y un desgaste psicológico que no sale en las retransmisiones. <strong>La partida termina cuando cae el rey</strong>. <strong>La competición -en cambio- continúa dentro de su cabeza</strong>.</p>
<p>Resulta curioso que <strong>una disciplina cuyo fin es tomar las mejores decisiones posibles, acabe castigando nuestra capacidad para decidir</strong>. El mismo cálculo que sirve para encontrar la mejor jugada puede convertirse en una cárcel, porque siempre existe una variante más, una preparación adicional, otro torneo... y <strong>la retirada suena a rey caído</strong>. <strong>Una caída como remedio para una actividad que no da tregua</strong>. Una tregua que se niegan unos a otros. Quizá por eso <strong>el ajedrez debería plantearse más como un arte de pensamiento que como un deporte de competición</strong>. Si alguna vez llego a jugar razonablemente bien, me gustaría conservar la capacidad de cerrar el tablero con dignidad, como quien gana por haber sabido abandonar a tiempo.</p>]]></content:encoded>
            <wfw:commentRss>https://xn--bitcora-jwa.es/rss/comentarios/0bdcfb64-2aee-4164-8aec-e24bca55b7b3</wfw:commentRss>
        </item>
        <item>
            <title><![CDATA[No problem]]></title>
            <description><![CDATA[Me desanimé un poco al comprobar cómo las lecciones de Open Studio parecían más fáciles sobre la pantalla que sobre el teclado, así que por un momento decidí...]]></description>
            <link>https://xn--bitcora-jwa.es/entrada/6f33f0a6-4d6d-4603-85e6-3a2e1566130c</link>
            <guid isPermaLink="true">https://xn--bitcora-jwa.es/entrada/6f33f0a6-4d6d-4603-85e6-3a2e1566130c</guid>
            <dc:creator><![CDATA[José Vicente del Valle Fayos]]></dc:creator>
            <pubDate>Tue, 01 Sep 2026 07:30:00 GMT</pubDate>
            <enclosure url="https://api.bitácora.es/media/6f33f0a6-4d6d-4603-85e6-3a2e1566130c.mp3" length="1082926" type="audio/mpeg"/>
            <content:encoded><![CDATA[<p>Me desanimé un poco al comprobar cómo las lecciones de <a href="https://www.openstudiojazz.com/">Open Studio</a> parecían más fáciles sobre la pantalla que sobre el teclado, así que -por un momento- decidí volver a los pequeños preludios de J. S. Bach. Concretamente, al <a href="https://www.youtube.com/watch?v=kuSt0X1Js0k">BWV 935</a> y al <a href="https://www.youtube.com/watch?v=GV9-9X5vZbM">BWV 937</a>. Sin embargo, <strong>mi verdadero propósito era el jazz y, como todavía me sentía superado por el nivel de las lecciones de Open Studio, decidí darle una oportunidad al <a href="https://www.amazon.es/dp/1847615066">primer</a> y al <a href="https://www.amazon.es/dp/1847615120">segundo volumen</a> de Exploring Jazz Piano</strong>, de Tim Richards. Ahí comprobé que Richards propone un avance más progresivo y más asequible.</p>
<p>Richards plantea el aprendizaje desde una perspectiva muy práctica. En lugar de introducir desde el principio armonías complejas o improvisaciones difíciles, <strong>nos reta con pequeñas piezas que sirven para trabajar uno o dos conceptos concretos</strong>: un acompañamiento, un patrón rítmico, una progresión armónica o una escala. Este enfoque recuerda al de muchos métodos clásicos, donde <strong>la dificultad técnica aumenta de manera gradual sin perder nunca de vista el aspecto musical</strong>. Para quien llega al jazz desde el piano clásico, esa progresión resulta especialmente tranquilizadora.</p>
<p><em>No Problem</em> es uno de los primeros temas del libro. Un tema sencillo y alegre, con estructura AABA, una de las formas más habituales en el jazz y en la canción popular norteamericana durante buena parte del siglo XX. <strong>La melodía se construye sobre la escala pentatónica mayor</strong>, una escala de cinco notas que evita casi todas las tensiones y permite improvisar con libertad. Precisamente por eso, a menudo se dice que constituye la puerta de entrada a la improvisación.</p>
<p><strong>El ejercicio no consiste únicamente en interpretar la pieza, sino en transportarla a las doce tonalidades</strong>. Ese trabajo de transposición obliga a no depender de la memoria muscular y a comprender de verdad la relación entre las notas y los acordes. <strong>Una práctica exigente, pero provechosa</strong>: el teclado deja de ser un conjunto de teclas blancas y negras para convertirse en un mapa coherente. Posiblemente a usted no le impresione, pero créame si le digo que <strong>esta pieza tiene un gran valor pedagógico</strong>. Así que, ahí va mi interpretación, casi a primera vista. Disfruten.</p>
                <figure>
                    <audio controls src="https://api.bitácora.es/media/6f33f0a6-4d6d-4603-85e6-3a2e1566130c.mp3">Tu lector no soporta el elemento de audio.</audio>
                    <figcaption><p><em>No problem</em>. Tim Richards. Interpretado por José Vicente del Valle Fayos.</p></figcaption>
                </figure>                
                ]]></content:encoded>
            <wfw:commentRss>https://xn--bitcora-jwa.es/rss/comentarios/6f33f0a6-4d6d-4603-85e6-3a2e1566130c</wfw:commentRss>
        </item>
        <item>
            <title><![CDATA[La calibración]]></title>
            <description><![CDATA[Calibrar un controlador MIDI exige dedicar tiempo a examinar y corregir la respuesta del software de modelado en relación a la señal con que lo alimentamos,...]]></description>
            <link>https://xn--bitcora-jwa.es/entrada/270f8008-df8c-4c31-be77-d6130975f0c9</link>
            <guid isPermaLink="true">https://xn--bitcora-jwa.es/entrada/270f8008-df8c-4c31-be77-d6130975f0c9</guid>
            <dc:creator><![CDATA[José Vicente del Valle Fayos]]></dc:creator>
            <pubDate>Fri, 21 Aug 2026 13:20:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Calibrar un controlador MIDI exige dedicar tiempo a examinar y corregir la respuesta del <em>software</em> de modelado en relación a la señal con que lo alimentamos, pero <strong>ese tiempo invertido merece la pena, porque garantiza una respuesta fiel</strong>. Cuando conectas el controlador a la computadora y percibes que las notas quedan especialmente atenuadas en pulsaciones de intensidad intermedia, <strong>es hora de determinar un valor <math><mi>γ</mi></math> que amplifique en su justa medida la señal de salida</strong> para ese nivel de pulsación, que se encuentra entre <math><mn>63</mn></math> y <math><mn>64</mn></math> en una escala de ocho <em>bits</em>.</p>
<p>Supongamos que el valor de <em>gamma</em> es <math><mrow><mi>γ</mi><mo>=</mo><mn>11.5</mn></mrow></math>. Eso significa que si el intérprete pulsara la tecla del controlador con un nivel de <math><mn>63.5</mn></math>, la salida debería sonar a <math><mn>75</mn></math>. <strong>No olvidemos las condiciones de contorno</strong>: si la entrada vale <math><mn>0</mn></math>, la salida debe valer <math><mn>0</mn></math>. Y si la entrada vale <math><mn>127</mn></math>, la salida tiene que valer también <math><mn>127</mn></math>.</p>
<p>Con esto, ya tenemos tres puntos de funcionamiento conocidos. Podríamos buscar alguno más, pero solo serviría para complicar las cosas, ya que <strong>el teorema fundamental de la interpolación polinómica nos dice que solo se necesitan <math><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></math> puntos para describir una función polinómica de grado <math><mi>n</mi></math></strong>, y es obvio que lo que se busca es una función exclusivamente convexa. Ahora vamos a entrar en el detalle: la función polinómica de grado 2 tiene la forma <math><mrow><mi>f</mi><mrow><mo fence="true" form="prefix" stretchy="false">(</mo><mi>x</mi><mo fence="true" form="postfix" stretchy="false">)</mo></mrow><mo>=</mo><mi>a</mi><msup><mi>x</mi><mn class="tml-sml-pad">2</mn></msup><mo>+</mo><mi>b</mi><mi>x</mi><mo>+</mo><mi>c</mi></mrow></math>. Si para <math><mrow><mi>x</mi><mo>=</mo><mn>0</mn></mrow></math>, <math><mrow><mi>f</mi><mrow><mo fence="true" form="prefix" stretchy="false">(</mo><mi>x</mi><mo fence="true" form="postfix" stretchy="false">)</mo></mrow><mo>=</mo><mn>0</mn></mrow></math>, entonces <math><mrow><mi>c</mi><mo>=</mo><mn>0</mn></mrow></math>. Conocido <math><mi>c</mi></math>, falta plantear el siguiente sistema de ecuaciones con los otros dos puntos:</p>
<math display="block" class="tml-display" style="display:block math;"><mtable displaystyle="true"><mtr><mtd class="tml-right" style="padding-left:0em;padding-right:0em;"><mrow><mo fence="true" form="prefix" stretchy="true"></mo><mtable displaystyle="true" class="tml-jot"><mtr><mtd class="tml-right" style="padding-left:0em;padding-right:0em;"><mrow><msup><mn>63.5</mn><mn>2</mn></msup><mi>a</mi><mo>+</mo><mn>63.5</mn><mi>b</mi></mrow></mtd><mtd class="tml-left" style="padding-left:0em;padding-right:0em;"><mrow><mo>=</mo><mn>75</mn></mrow></mtd></mtr><mtr><mtd class="tml-right" style="padding-left:0em;padding-right:0em;"><mrow><msup><mn>127</mn><mn>2</mn></msup><mi>a</mi><mo>+</mo><mn>127</mn><mi>b</mi></mrow></mtd><mtd class="tml-left" style="padding-left:0em;padding-right:0em;"><mrow><mo>=</mo><mn>127</mn></mrow></mtd></mtr></mtable><mo fence="true" form="postfix" stretchy="true">}</mo></mrow></mtd></mtr></mtable></math>
<p>Que tiene como solución <math><mrow><mi>a</mi><mo>=</mo><mfrac><mrow><mo form="prefix" stretchy="false" lspace="0em" rspace="0em">−</mo><mn>46</mn></mrow><mn>16129</mn></mfrac></mrow></math> y <math><mrow><mi>b</mi><mo>=</mo><mfrac><mn>173</mn><mn>127</mn></mfrac></mrow></math>. <strong>La función que relaciona la entrada y la salida MIDI queda pues como sigue</strong>:</p>
<math display="block" class="tml-display" style="display:block math;"><mrow><mi>f</mi><mrow><mo fence="true" form="prefix" stretchy="false">(</mo><mi>x</mi><mo fence="true" form="postfix" stretchy="false">)</mo></mrow><mo>=</mo><mo form="prefix" stretchy="false">−</mo><mfrac><mn>46</mn><mn>16129</mn></mfrac><msup><mi>x</mi><mn class="tml-sml-pad">2</mn></msup><mo>+</mo><mfrac><mn>173</mn><mn>127</mn></mfrac><mi>x</mi></mrow></math>
<p>Puesto que la mayor parte de <em>software</em> de modelado físico se limita a unir con lineas rectas un conjunto de puntos dados de antemano, de esta ecuación podemos sacar un total de nueve puntos equiespaciados en el dominio, que servirán como aproximación a la función anterior. <strong>Y con eso, ya solo queda disfrutar la experiencia de un sonido fiel a la pulsación</strong>.</p>
                <figure>
                    <img src="https://api.bitácora.es/media/270f8008-df8c-4c31-be77-d6130975f0c9.jpg" alt="La calibración"/>
                    <figcaption><p><em>Nord Stage 2 de cerca</em>. <a href="https://www.pexels.com/photo/close-up-of-red-nord-stage-2-piano-keyboard-33829401/">Pexels</a>.</p></figcaption>
                </figure>                
                ]]></content:encoded>
            <wfw:commentRss>https://xn--bitcora-jwa.es/rss/comentarios/270f8008-df8c-4c31-be77-d6130975f0c9</wfw:commentRss>
        </item>
        <item>
            <title><![CDATA[El cascabel y el gato]]></title>
            <description><![CDATA[Los hábitos del internauta han cambiado . Durante los años noventa navegábamos por la red con palabras clave que servían para alimentar nuestras búsquedas en...]]></description>
            <link>https://xn--bitcora-jwa.es/entrada/aacb1b81-bc5c-41b1-8a5d-61c2d12261aa</link>
            <guid isPermaLink="true">https://xn--bitcora-jwa.es/entrada/aacb1b81-bc5c-41b1-8a5d-61c2d12261aa</guid>
            <dc:creator><![CDATA[José Vicente del Valle Fayos]]></dc:creator>
            <pubDate>Fri, 07 Aug 2026 20:25:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><strong>Los hábitos del internauta han cambiado</strong>. Durante los años noventa navegábamos por la red con palabras clave que servían para alimentar nuestras búsquedas en Altavista, Yahoo o Google. Y dentro de los resultados de búsqueda, después de seleccionar y filtrar todo el contenido, encontrábamos lo que necesitábamos. Así eran las cosas, pero por suerte o por desgracia <strong>esos días de web elaborada y consumida por seres humanos han llegado a su fin</strong>.</p>
<p><strong>Ahora lo que se lleva es preguntarle a ChatGPT</strong>. Y se lleva, porque los LLMs dan una respuesta que afronta y resuelve de lleno la pregunta que les hacemos: no hay necesidad de buscar entre páginas, filtrar el contenido de las menos relevantes y resumir. <strong>ChatGPT busca, filtra y resume por ti</strong>. Y el verdadero drama surge cuando tomamos conciencia de que <strong>la IA generativa nos puede ayudar porque ha sido alimentada con el contenido que los seres humanos hemos generado durante décadas, antes incluso del nacimiento de internet</strong>.</p>
<p>¿Es eso malo? <a href="https://www.xataka.com/robotica-e-ia/anthropic-fue-acusada-robar-libros-para-entrenar-sus-modelos-ia-su-solucion-ha-sido-sencilla-pagar">Un grupo de expertos en IA se apropió indebidamente de medio millón de obras protegidas por derechos de autor</a> para alimentar el modelo de lenguaje que mañana te dará una receta de pollo al pesto y te explicará la diferencia entre el perejil y el cilantro. La cuestión es que <strong>los autores de las obras que alimentaron la IA, se convierten así en víctimas de un lucro cesante</strong> porque Anthropic ha vulnerado sus derechos y usted prefiere consultar a la IA antes que comprar su trabajo: <strong>la misma tecnología que lleva una receta de pollo a la interfaz del chat LLM, sustituye al ser humano que se ganaba la vida compartiendo con usted una receta de pollo</strong>.</p>
<p>Y ¿qué podemos hacer? Muchas personas perciben el paro tecnológico como una amenaza, por eso <a href="https://blog.cloudflare.com/introducing-pay-per-crawl/">los chicos de Cloudflare han puesto en marcha una funcionalidad llamada <em>pay-per-crawl</em></a>, que permite abonar pequeñas cantidades de dinero a los creadores de contenido que alimentan a ChatGTP, Claude, Gemini, DeepSeek, etc. Parece justo: usted paga por <em>tokens</em> de IA y la IA paga por una receta de pollo. Pero... ¡ojo! Si alguien puede cobrar por su contenido y ese contenido es público, <strong>¿quién garantiza que no lo vayan a copiar y revender a un precio menor?</strong> Señores, <strong>lo que se pone en entredicho es la esencia de internet</strong>. <strong>Y ahora, ¿quién le pone el cascabel al gato?</strong></p>
                <figure>
                    <img src="https://api.bitácora.es/media/aacb1b81-bc5c-41b1-8a5d-61c2d12261aa.jpg" alt="El cascabel y el gato"/>
                    <figcaption><p><em>Mascota</em>. <a href="https://www.pexels.com/es-es/foto/animal-mascota-gato-mamifero-12201987/">Pexels</a>.</p></figcaption>
                </figure>                
                ]]></content:encoded>
            <wfw:commentRss>https://xn--bitcora-jwa.es/rss/comentarios/aacb1b81-bc5c-41b1-8a5d-61c2d12261aa</wfw:commentRss>
        </item>
        <item>
            <title><![CDATA[Dos controladores]]></title>
            <description><![CDATA[Los fabricantes de instrumentos musicales rara vez publican datos técnicos sobre sus productos , por eso los músicos en la mayoría de casos se ven abocados a...]]></description>
            <link>https://xn--bitcora-jwa.es/entrada/ae09e7a5-890a-4ea7-ad9d-aaff9fcd7001</link>
            <guid isPermaLink="true">https://xn--bitcora-jwa.es/entrada/ae09e7a5-890a-4ea7-ad9d-aaff9fcd7001</guid>
            <dc:creator><![CDATA[José Vicente del Valle Fayos]]></dc:creator>
            <pubDate>Thu, 06 Aug 2026 14:40:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><strong>Los fabricantes de instrumentos musicales rara vez publican datos técnicos sobre sus productos</strong>, por eso los músicos -en la mayoría de casos- se ven abocados a desplazarse a la tienda de música a probar instrumentos en exposición antes de realizar una compra. En particular, <strong>no conozco ningún fabricante de controladores ni de pianos digitales que publique el recorrido vertical de la tecla de ninguno de sus modelos, ni tampoco su resistencia media a la pulsación</strong>. Pero esa información es vital, ya que pasada por alto nos llevará -sin duda- a tomar una decisión equivocada.</p>
<p>Dentro de los controladores de piano, cabe destacar el vetusto <strong>Kawai VPC1</strong> (2013), de acción similar al aclamado Kawai MP-11. Su recorrido de tecla es idéntico al de los pianos acústicos y su resistencia a la pulsación se reparte entre los 53 gramos iniciales hasta los 78 g de fondo en la zona central. Su longitud de pivote alcanza los 25 cm, permitiendo al interprete tocar cerca del fondo sin fatiga apreciable. <strong>Un lujo de controlador que imita con pleno acierto el auténtico mecanismo de acción de los pianos de cola Kawai</strong>. Eso sí, con un peso que ronda los 30 kg y unas dimensiones superiores a las de la mayoría de alternativas del mercado.</p>
<p>Por una tercera parte de lo que cuesta el VPC1 y una tercera parte de lo que pesa, el <strong>StudioLogic SL88 MKII ofrece una experiencia similar a los pianos de escenario Nord y Yamaha</strong>. Tecla Fatar con recorrido estándar entre 10 y 11 mm, y longitud de pivote de 22 cm compensada con una reducción del peso inicial y el fondo que se situan en torno a los 48 y los 63 g respectivamente, también en la zona central. <strong>Un equilibrio entre precio, prestaciones y peso más que interesante</strong>, aderezado por una reducción de dimensiones que facilita mucho su transporte.</p>
<p>Si tu plan es usar la aplicación Numa Player para reproducir como sonido la señal MIDI procedente de alguno de estos controladores, no esperes milagros. Numa Player no modela la resonancia de sus pianos. En su lugar, <strong>yo recomiendo Modartt Pianoteq 9</strong> en una máquina capaz de responder con una latencia inferior a los 10 ms. Así no vas a tener problemas y todo irá como la seda. Ya verás que bien.</p>]]></content:encoded>
            <wfw:commentRss>https://xn--bitcora-jwa.es/rss/comentarios/ae09e7a5-890a-4ea7-ad9d-aaff9fcd7001</wfw:commentRss>
        </item>
        <item>
            <title><![CDATA[Satin Doll]]></title>
            <description><![CDATA[Después de pasar los últimos seis meses entre algoritmos de inteligencia artificial, redes, sistemas operativos y demás mecanismos empeñados en obedecer...]]></description>
            <link>https://xn--bitcora-jwa.es/entrada/e7a22bda-60db-403f-bb9d-71321bce2e0f</link>
            <guid isPermaLink="true">https://xn--bitcora-jwa.es/entrada/e7a22bda-60db-403f-bb9d-71321bce2e0f</guid>
            <dc:creator><![CDATA[José Vicente del Valle Fayos]]></dc:creator>
            <pubDate>Mon, 13 Jul 2026 17:35:00 GMT</pubDate>
            <enclosure url="https://api.bitácora.es/media/e7a22bda-60db-403f-bb9d-71321bce2e0f.mp3" length="1433224" type="audio/mpeg"/>
            <content:encoded><![CDATA[<p>Después de pasar los últimos seis meses entre algoritmos de inteligencia artificial, redes, sistemas operativos y demás mecanismos empeñados en obedecer estrictamente a la lógica, <strong>he decidido volver a entregarme voluntariamente a un lenguaje en el que las reglas existen, sí, pero únicamente para que alguien con suficiente talento las doble sin que se rompan</strong>. <strong>El primer estándar que ha caído sobre mi atril ha sido Satin Doll</strong>. Y apenas veinticuatro horas después de convertirme en estudiante de jazz, ya me he atrevido a grabarlo. Una decisión que probablemente cualquier profesor sensato habría desaconsejado, pero que encaja bastante bien con mi conocida faceta de aprender en público y equivocarme con las luces encendidas.</p>
<p>No es una elección cualquiera. <strong>Satin Doll</strong> -compuesta por Duke Ellington y Billy Strayhorn, con letra posterior de Johnny Mercer- <strong>pertenece a esa reducida aristocracia de estándares que parecen haber existido siempre</strong>. Es una melodía elegante, sofisticada y engañosamente amable: sonríe mientras obliga a pensar varios movimientos por delante. <strong>Bajo su apariencia de conversación relajada esconde una lección permanente sobre armonía, ritmo y buen gusto</strong>. No es una pieza que pretenda impresionar. En su lugar, prefiere <strong>enseñar que el jazz no consiste en tocar muchas notas, sino en encontrar exactamente las que merecen ser escuchadas</strong>.</p>
<p><strong>La grabación que acompaña esta entrada está hecha exactamente como ha salido de mis manos</strong>. <strong>Sin trampa ni cartón</strong>. Sin preparación previa. Sin detener la grabación para corregir un pasaje. <strong>Sin una segunda toma</strong>. <strong>Lo que se escucha es mi primer encuentro con el tema</strong>, con sus inevitables pausas mientras el cerebro intenta convencer a los dedos de que colaboren, con algún pequeño atropello de notas por la falta de soltura y con algún <em>voicing</em> que todavía admite margen de negociación. Soy un principiante y sería ridículo fingir lo contrario. Y precisamente por eso, <strong>me parecía más honesto compartir el proceso antes que el resultado</strong>. Aquí está. Disfruten.</p>
                <figure>
                    <audio controls src="https://api.bitácora.es/media/e7a22bda-60db-403f-bb9d-71321bce2e0f.mp3">Tu lector no soporta el elemento de audio.</audio>
                    <figcaption><p><em>Satin Doll</em>. Duke Ellington y Billy Strayhorn. Interpretado por José Vicente del Valle Fayos.</p></figcaption>
                </figure>                
                ]]></content:encoded>
            <wfw:commentRss>https://xn--bitcora-jwa.es/rss/comentarios/e7a22bda-60db-403f-bb9d-71321bce2e0f</wfw:commentRss>
        </item>
        <item>
            <title><![CDATA[Ropa prestada]]></title>
            <description><![CDATA[Hay quien sigue creyendo que las aplicaciones de escritorio nacen en oscuros laboratorios de programadores con barba y problemas de sueño. Como si cada icono...]]></description>
            <link>https://xn--bitcora-jwa.es/entrada/35cf8000-ae2f-40e3-9dab-fdae7f95e57e</link>
            <guid isPermaLink="true">https://xn--bitcora-jwa.es/entrada/35cf8000-ae2f-40e3-9dab-fdae7f95e57e</guid>
            <dc:creator><![CDATA[José Vicente del Valle Fayos]]></dc:creator>
            <pubDate>Fri, 26 Jun 2026 14:30:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Hay quien sigue creyendo que las aplicaciones de escritorio nacen en oscuros laboratorios de programadores con barba y problemas de sueño. Como si cada icono del menú fuese el fruto de una compleja alquimia de compiladores, bibliotecas y sacrificios rituales a los dioses del software. <strong>Pero la realidad, a veces, no es tan romántica</strong>.</p>
<p>Vivimos rodeados de servicios web que han terminado ocupando el lugar que antes pertenecía a las aplicaciones tradicionales. Correo, calendarios, gestores de tareas, editores de texto, etc. <strong>Todo sucede en una pestaña del navegador</strong>. <strong>Todo vive en una URL</strong>. <strong>Todo es efímero</strong>. <strong>Y, sin embargo, hay algo incómodamente humano en querer que ciertas herramientas tengan su propio espacio</strong>. <strong>Su propia ventana</strong>. <strong>Su propia silla en el salón de nuestra máquina</strong>. <strong>Para eso existe Nativefier</strong>. Primero instalamos la herramienta:</p>
<div><pre><code class="hljs language-sh"><span class="hljs-built_in">sudo</span> npm install -g nativefier
</code></pre></div>
<p>Y con ella, convertimos cualquier servicio web en una aplicación de escritorio autónoma:</p>
<div><pre><code class="hljs language-sh">nativefier <span class="hljs-string">"https://direccion-del-servicio-web.com"</span> --name <span class="hljs-string">"MiAplicacion"</span>
</code></pre></div>
<p>Y entonces ocurre la pequeña magia: <strong>Nativefier genera una carpeta con todo lo necesario para ejecutar la aplicación como si hubiese existido allí desde siempre: un ejecutable, sus dependencias y la agradable ilusión de que internet y el escritorio siguen siendo mundos distintos</strong>. La carpeta generada puede vivir donde queramos dentro de nuestro directorio personal, aunque resulta razonable moverla a algún lugar civilizado, por ejemplo:</p>
<div><pre><code class="hljs language-sh">~/Aplicaciones/MiAplicacion-linux-x64/
</code></pre></div>
<p>Porque el orden no evita el desastre, pero al menos permite localizarlo. <strong>El siguiente paso consiste en enseñarle al sistema que nuestra criatura existe</strong>. <strong>Para ello creamos el fichero <code>miaplicacion.desktop</code> dentro de <code>~/.local/share/applications/</code></strong>. Allí definimos su nombre, el ejecutable que debe lanzar, el icono que utilizará y la categoría donde aparecerá en el menú de aplicaciones:</p>
<div><pre><code class="hljs language-sh">[Desktop Entry]
Name=MiAplicacion
Exec=/home/usuario/Aplicaciones/MiAplicacion-linux-x64/MiAplicacion
Icon=gnome-mail-send-receive
Type=Application
Categories=Network;Email;
Terminal=<span class="hljs-literal">false</span>
</code></pre></div>
<p>Después, <strong>guardamos el icono correspondiente en <code>~/.local/share/icons/</code></strong>. Y aquí llega uno de esos detalles absurdamente técnicos que explican por qué la informática sigue siendo una disciplina profundamente artesanal: <strong>la ventana que acabamos de crear tiene una identidad secreta</strong>. <strong>Un nombre interno</strong>. <strong>Una especie de alias clandestino que el gestor de ventanas utiliza para reconocerla</strong>. Para descubrirlo ejecutamos:</p>
<div><pre><code class="hljs language-sh">xprop WM_CLASS
</code></pre></div>
<p>El cursor se transforma en una cruz, como si estuviésemos a punto de realizar una autopsia digital. Seleccionamos la ventana de la aplicación y la terminal responderá con algo parecido a:</p>
<div><pre><code class="hljs language-sh">WM_CLASS(STRING) = <span class="hljs-string">"miaplicacion-nativefier-xxxxxx"</span>, <span class="hljs-string">"miaplicacion-nativefier-xxxxxx"</span>
</code></pre></div>
<p>Ese identificador debe añadirse al fichero .desktop mediante la directiva <code>StartupWMClass</code>. <strong>Si nos saltamos este paso, durante la ejecución de la aplicación se generará un molesto segundo icono en el <em>dock</em></strong>.</p>
<div><pre><code class="hljs language-sh">[Desktop Entry]
Name=MiAplicacion
Exec=/home/usuario/Aplicaciones/MiAplicacion-linux-x64/MiAplicacion
Icon=gnome-mail-send-receive
Type=Application
Categories=Network;Email;
Terminal=<span class="hljs-literal">false</span>
StartupWMClass=miaplicacion-nativefier-xxxxxx
</code></pre></div>
<p>Y entonces, <strong>por fin, todas las piezas encajan</strong>. El icono abre la ventana correcta. <strong>El sistema deja de confundir nuestra aplicación con un navegador disfrazado</strong>. La integración parece natural. Y nadie diría que detrás de esa apariencia impecable no hay más que una página web vestida con ropa prestada.</p>]]></content:encoded>
            <wfw:commentRss>https://xn--bitcora-jwa.es/rss/comentarios/35cf8000-ae2f-40e3-9dab-fdae7f95e57e</wfw:commentRss>
        </item>
        <item>
            <title><![CDATA[La exclusión financiera]]></title>
            <description><![CDATA[Hace apenas treinta años, vecinos de zonas rurales acudían a la sucursal bancaria para realizar operaciones rutinarias: transferencias, pagos, ingresos,...]]></description>
            <link>https://xn--bitcora-jwa.es/entrada/2f365906-8e7f-4ee2-89e6-9cdd5f600207</link>
            <guid isPermaLink="true">https://xn--bitcora-jwa.es/entrada/2f365906-8e7f-4ee2-89e6-9cdd5f600207</guid>
            <dc:creator><![CDATA[José Vicente del Valle Fayos]]></dc:creator>
            <pubDate>Sat, 20 Jun 2026 07:15:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Hace apenas treinta años, vecinos de zonas rurales acudían a la sucursal bancaria para realizar operaciones rutinarias: transferencias, pagos, ingresos, consultas, etc. Recientemente, <strong>muchas sucursales de pueblos pequeños han sido sustituidas por oficinas itinerantes que únicamente prestan servicio un día a la semana</strong>. <strong>Mantener una oficina física en un pueblo pequeño puede costar decenas o cientos de miles de euros al año</strong> y las entidades bancarias han descubierto que, <strong>con la creciente digitalización de los servicios financieros, se puede prescindir de ellas</strong>. <strong>El problema viene cuando usted es una persona mayor que necesita efectivo y tiene dificultades para manejar un <em>smartphone</em></strong>.</p>
<p>Mientras tanto, ahí afuera las <em>fintech</em> hacen el agosto: <a href="https://elpais.com/economia/negocios/2026-06-15/revolut-el-pelotazo-de-un-nadador-llamado-nikolay-storonsky-como-construir-un-banco-valorado-en-200000-millones-en-una-decada.html">Revolut aspira a alcanzar los 100 millones de clientes activos diarios en 100 países en el plazo de dos años</a>. A ese ritmo de crecimiento, <strong>no es de extrañar que las entidades tradicionales hayan cerrado oficinas físicas</strong> y hayan instado a sus clientes a utilizar una aplicación móvil para la operativa diaria. De esa manera consiguen reducir en mantenimiento de sucursales y compiten en mejores condiciones contra N26, Revolut y Wise, <strong>imitando un modelo de negocio que ha llegado para quedarse</strong>. Sí, para quedarse porque <a href="https://wise.com/es/blog/dinero-y-bancos-en-suecia">países como Suecia han dejado de aceptar el efectivo como forma de pago para el 90 % de las transacciones</a> y porque <a href="https://www.ecb.europa.eu/euro/digital_euro/html/index.es.html">el Banco Central Europeo ya está trabajando en la creación de una versión digital del euro</a>. Así están las cosas.</p>
<p>De cualquier modo, <a href="https://euractiv.com/es/news/suecia-pais-sin-efectivo-da-marcha-atras-en-rechazo-a-billetes/">no haga demasiado caso a la noticia sobre la marcha atrás de Suecia en el rechazo a los billetes</a>, puesto que esa "marcha atrás" se circunscribe a escenarios de catástrofe o guerra, y se propone para afrontar eventualidades de una duración no superior a la semana. Dicho esto, la evolución de la prestación de servicios financieros al ciudadano se presenta de la siguiente manera:</p>
<ul>
<li><strong>Escasas oficinas físicas</strong>.</li>
<li><strong>Más bancobuses y puntos de atención compartidos</strong>.</li>
<li><strong>Pagos con móvil y tarjeta universales</strong>.</li>
<li><strong>Uso creciente de fintech</strong>.</li>
<li><strong>Necesidad decreciente de atención personal en oficina física</strong>.</li>
</ul>
<p>Pero volviendo al tema central que nos ocupa, en pueblos pequeños, mercados, fiestas locales y entre personas mayores, <strong>el efectivo sigue teniendo una utilidad social y práctica difícil de sustituir</strong>, así que <strong>la verdadera cuestión para esos lugares, no es tanto si llegará el euro digital, sino si se garantizará que todos los vecinos sigan teniendo acceso a dinero y servicios financieros, independientemente de su nivel de digitalización</strong>. <strong>Esa es una de las preocupaciones centrales de las <a href="https://www.ecb.europa.eu/press/key/date/2025/html/ecb.sp250904~70ab593276.es.html">políticas de inclusión financiera en Europa</a> sobre la que actualmente "se está trabajando"</strong>. Por otra parte, se prevé que el euro digital se guarde en una cartera del Banco Central Europeo. Y surge entonces una duda más que razonable: <strong>si los ciudadanos trasladan sus ahorros de la banca comercial al BCE, ¿en qué queda la estabilidad financiera de la eurozona?</strong></p>
<p>Algunos economistas sostienen que un euro digital amplio podría hacer el sistema más seguro, porque los ciudadanos tendrían acceso directo al dinero del banco central. Otros argumentan que podría debilitar el modelo bancario tradicional, obligando a los bancos a financiarse más en los mercados mayoristas y menos mediante depósitos de particulares. Por eso, <strong>el BCE está intentando encontrar un equilibrio: <a href="https://www.ecb.europa.eu/press/key/date/2022/html/ecb.sp220615~0b859eb8bc.en.html">ofrecer una forma pública de dinero digital sin provocar una migración masiva de depósitos fuera de la banca comercial</a></strong>.</p>
                <figure>
                    <img src="https://api.bitácora.es/media/2f365906-8e7f-4ee2-89e6-9cdd5f600207.jpg" alt="La exclusión financiera"/>
                    <figcaption><p><em>Mujer con dinero sacando cuentas</em>. <a href="https://www.pexels.com/es-es/foto/mujer-dinero-calculando-calculadora-5900228/">Pexels</a>.</p></figcaption>
                </figure>                
                ]]></content:encoded>
            <wfw:commentRss>https://xn--bitcora-jwa.es/rss/comentarios/2f365906-8e7f-4ee2-89e6-9cdd5f600207</wfw:commentRss>
        </item>
        <item>
            <title><![CDATA[Pruebe con el cincel]]></title>
            <description><![CDATA[Dentro de la ciberseguridad, existe una idea incómoda que muchos desarrolladores descubren tarde: no basta con revisar el código fuente . Aunque el código haya...]]></description>
            <link>https://xn--bitcora-jwa.es/entrada/f2ab2bfa-a03e-4f52-93a3-0e4567a3e0fc</link>
            <guid isPermaLink="true">https://xn--bitcora-jwa.es/entrada/f2ab2bfa-a03e-4f52-93a3-0e4567a3e0fc</guid>
            <dc:creator><![CDATA[José Vicente del Valle Fayos]]></dc:creator>
            <pubDate>Wed, 27 May 2026 14:15:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Dentro de la ciberseguridad, existe una idea incómoda que muchos desarrolladores descubren tarde: <strong>no basta con revisar el código fuente</strong>. <strong>Aunque el código haya sido auditado por expertos y no exista una sola línea sospechosa, su trabajo podría estar comprometido</strong>. <strong>Imaginemos el siguiente escenario: alguien consigue modificar el compilador de C -pongamos GCC- para que se introduzca en el binario del compilador una instrucción maliciosa</strong>. <strong>El código fuente</strong> que usted ha revisado mil veces <strong>seguiría pareciendo limpio</strong>. <strong>Los repositorios permanecerían intactos</strong>. <strong>Sin embargo, su programa podría contener puertas traseras, vulnerabilidades deliberadas o mecanismos de espionaje</strong>.</p>
<p>No es ciencia ficción. <strong>La idea fue planteada en 1984 por <a href="https://en.wikipedia.org/wiki/Ken_Thompson">Ken Thompson</a>, en su célebre conferencia <em>Reflections on Trusting Trust</em></strong>. Thompson describió cómo un compilador puede modificarse para insertar una puerta trasera al compilar el programa de autenticación de Unix. Pero lo más inquietante es que el compilador puede infectarse a sí mismo. ¿Cómo?</p>
<ol>
<li><strong>El compilador modificado introduce malware en programas concretos</strong>.</li>
<li><strong>Cuando recompila su propio código fuente, vuelve a insertar la instrucción maliciosa</strong>.</li>
<li><strong>Aunque los desarrolladores eliminen el código malicioso del código fuente del compilador, los binarios compilados siguen infectados</strong>.</li>
</ol>
<p>De este modo, si no puedes confiar en el compilador, tampoco puedes confiar en sus binarios. Entonces <strong>aparece uno de los grandes problemas de la informática moderna: la tecnología se sostiene sobre una cadena de confianza imposible de verificar</strong>.</p>
<p>Cuando un desarrollador crea una pieza de <em>software</em>, los usuarios quedan a merced del código fuente, del compilador, del sistema operativo, de las bibliotecas, del <em>firmware</em>, de la BIOS / UEFI, del microcódigo del procesador, del <em>hardware</em> físico, de la cadena de suministro, de los fabricantes, de los certificados criptográficos, de las actualizaciones, de los repositorios y de los mantenedores. <strong>Todo organizado en una jerarquía de capas imposible de auditar</strong>. <strong>No porque la criptografía sea inutil</strong>. <strong>No porque las buenas prácticas sean malas</strong>, como usted comprenderá. <strong>Sino porque la complejidad tecnológica supera la capacidad humana de verificación</strong>.</p>
<p>A todo esto, agregar los <strong>problemas debidos a la naturaleza humana</strong>: ingeniería social, <em>phishing</em>, empleados descontentos, errores de configuración , contraseñas reutilizadas, actualizaciones comprometidas o un simple descuido. Por eso, <strong>los profesionales de la ciberseguridad no hablan de sistemas "invulnerables". Hablan de mitigación, resiliencia, segmentación, defensa en profundidad, detección, respuesta, <em>hardening</em> y gestión del riesgo</strong>. Así que, ya sabe... <strong>en el mundo de la informática -como en la vida misma- las cosas son seguras hasta que dejan de serlo</strong>. Si le parece mal, pruebe con el cincel.</p>]]></content:encoded>
            <wfw:commentRss>https://xn--bitcora-jwa.es/rss/comentarios/f2ab2bfa-a03e-4f52-93a3-0e4567a3e0fc</wfw:commentRss>
        </item>
        <item>
            <title><![CDATA[El editor Vi]]></title>
            <description><![CDATA[Como estamos en pascua y nadie quiere arder en el infierno de los torpes, vamos a redimir nuestros pecados aprendiendo a manejar Vi , el legendario editor de...]]></description>
            <link>https://xn--bitcora-jwa.es/entrada/3548bbd5-7c08-4558-8646-761add3f03c7</link>
            <guid isPermaLink="true">https://xn--bitcora-jwa.es/entrada/3548bbd5-7c08-4558-8646-761add3f03c7</guid>
            <dc:creator><![CDATA[José Vicente del Valle Fayos]]></dc:creator>
            <pubDate>Sun, 05 Apr 2026 11:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Como estamos en pascua y nadie quiere arder en el infierno de los torpes, <strong>vamos a redimir nuestros pecados aprendiendo a manejar Vi</strong>, el legendario editor de texto basado en línea de comandos que trae de cabeza a los profanos de la informática. Habrá quienes digan que no hace falta complicarse la vida, que para eso ya tenemos a Nano. Claro, que también se le podría pedir a la vida que no duela, pero es que resulta que <strong>Vi -el áspero mesías de la terminal- no está para gustar, sino para salvarte</strong>. Imagina: servidor recién instalado, red sin configurar, acceso mínimo, sudor frío. No hay entorno gráfico. No hay internet. No hay Nano. Solo tú, la pantalla negra... y Vi mirándote a los ojos como un gato que sabe que no estás preparado para el asalto. Ahí <strong>solo tienes dos opciones: rezas o aprendes</strong>.</p>
<p>Primera revelación: Vi no es un editor, es un estado mental. <strong>Funciona en dos modos, como las personas que sonríen en público y se rompen en privado: el modo comando y el modo inserción</strong>. En uno das órdenes, te mueves, borras, deshaces, huyes, colaboras. En el otro escribes, como en cualquier editor civilizado, como si el mundo aún tuviera sentido. <strong>Confundir ambos modos es como declarar tu amor en mitad de una discusión: técnicamente posible, pero profundamente inconveniente</strong>. <strong>Y ahora, vamos con el catecismo mínimo, para no hacer el ridículo</strong>:</p>
<div><pre><code class="hljs language-sh"><span class="hljs-comment"># Abrir o crear un documento</span>
vi ruta/nombre-del-documento.ext
<span class="hljs-comment"># Activar el modo de comando</span>
Esc
<span class="hljs-comment"># Abrir una nueva línea</span>
o
<span class="hljs-comment"># Borrar un caracter</span>
x
<span class="hljs-comment"># Borrar una línea</span>
<span class="hljs-built_in">dd</span>
<span class="hljs-comment"># Deshacer la última acción</span>
u
<span class="hljs-comment"># Navegar izquierda, abajo, arriba y derecha</span>
h, j, k, l
<span class="hljs-comment"># Ir al principio o al final de la línea</span>
0, $
<span class="hljs-comment"># Ir a la primera o a la última línea</span>
gg, G
<span class="hljs-comment"># Activar el modo de inserción antes o después del cursor</span>
i, a
<span class="hljs-comment"># Escribir texto</span>
Texto a escribir
<span class="hljs-comment"># Guardar y cerrar</span>
:wq Enter
<span class="hljs-comment"># Cerrar sin guardar</span>
:q! Enter
</code></pre></div>
<p>Con eso y un bizcocho, hasta mañana a las ocho. Ahora <strong>ya eres es un entusiasta acreditado de la edición de texto plano en Vi</strong>. No te olvides de pasturar la mona esta tarde ni de salir a caminar con los amigos. Eso sí, recuerda: cuando todo se rompa -porque se romperá- <strong>Vi seguirá ahí</strong>. <strong>No para ayudarte, sino para ponerte a prueba</strong>.</p>]]></content:encoded>
            <wfw:commentRss>https://xn--bitcora-jwa.es/rss/comentarios/3548bbd5-7c08-4558-8646-761add3f03c7</wfw:commentRss>
        </item>
        <item>
            <title><![CDATA[Mi nube]]></title>
            <description><![CDATA[He abandonado mi cuenta de Exchange, sincronizada con Thunderbird a través de Aluco, porque Aluco no gestiona el spam en el lado del usuario. Así que, he...]]></description>
            <link>https://xn--bitcora-jwa.es/entrada/ebc72c3d-0155-41ea-8146-fc363a57a71d</link>
            <guid isPermaLink="true">https://xn--bitcora-jwa.es/entrada/ebc72c3d-0155-41ea-8146-fc363a57a71d</guid>
            <dc:creator><![CDATA[José Vicente del Valle Fayos]]></dc:creator>
            <pubDate>Thu, 12 Mar 2026 16:45:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>He abandonado mi cuenta de Exchange, sincronizada con Thunderbird a través de Aluco, porque Aluco no gestiona el <em>spam</em> en el lado del usuario. Así que, <strong>he vuelto a mi cuenta IMAP + CalDAV + CardDAV + WebDAV -ahora sí- con ActiveSync, para la sincronización entre dispositivos</strong>. Para mí, esto <strong>supone recuperar el control sobre la gestión del <em>spam</em>, disponer de un espacio extra para el almacenamiento <em>cloud</em> y disfrutar de una reducción en el precio de la factura del <em>groupware</em></strong>.</p>
<p>Sin embargo, me he dado cuenta de que <strong>mi proveedor no facilita un espacio de almacenamiento accesible por <code>davs</code></strong>, sino por <code>https</code>, lo que significa que <strong>no puedo acceder a ese espacio fuera del navegador</strong>. Y por eso, <strong>me he puesto manos a la obra y he recuperado mi viejo proyecto de una nube propia</strong>, completamente integrada con el sistema operativo.</p>
<p>Antes de continuar, quiero explicar las mejoras que he introducido. En primer lugar, <strong>la sincronización se resuelve con <code>sync --delete-during</code></strong>, lo que significa que cuando se actualiza un fichero local, se borra la versión anterior en el contenedor. O si en el contenedor está activado el <em>versioning</em>, se coloca una marca de borrado. En este último caso, el archivo deja de ocupar espacio en la lista de objetos actuales, pero se guarda en el historial de versiones, por si necesitamos recuperarlo después. Y para finalizar, <strong>la sincronización con el contenedor es directa</strong>, desde la carpeta Documentos. <strong>Empezamos definiendo los tipos de ficheros que no queremos guardar</strong> con <code>sudo nano ~/.config/rclone/rclone-excludes.txt</code>:</p>
<div><pre><code class="hljs language-txt"># Carpetas inútiles
- **/.git/**
- **/node_modules/**
- **/.cache/**
- **/.npm/**
- **/target/**
- **/dist/**
- **/build/**

# Archivos temporales
- **/*.tmp
- **/*.swp
- **/*~
- **/.DS_Store
- **/Thumbs.db
- **/._*

# IDEs
- **/.idea/**
- **/.vscode/**
</code></pre></div>
<p><strong>Instalamos rclone con <code>sudo dnf install rclone</code> y nos aseguramos de configurarlo</strong>, bien con <code>rclone config</code>, bien almacenando el fichero de configuración en la carpeta <code>~/.config/rclone</code>. Para probar la conexión, ejecutamos <code>rclone ls storage:usuario-storage</code>. Después creamos el servicio: con <code>sudo nano ~/.config/systemd/user/cloud.service</code>:</p>
<div><pre><code class="hljs language-sh">[Unit]
Description=Sincronización Mirror a S3
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/rclone <span class="hljs-built_in">sync</span> <span class="hljs-string">"/home/usuario/Documentos"</span> storage:usuario-storage \
    --delete-during \
    --checksum \
    --fast-list \
    --transfers 4 \
    --bwlimit 1M \
    --filter-from /home/usuario/.config/rclone/rclone-excludes.txt \
    --log-level INFO

StandardOutput=journal
StandardError=journal
</code></pre></div>
<p><strong>Podemos consultar los <em>logs</em> emitidos</strong> con <code>journalctl --user -u cloud.service -f</code>. <strong>Creamos el timer que activa la sincronización cada cinco minutos</strong> con <code>sudo nano ~/.config/systemd/user/cloud.timer</code>:</p>
<div><pre><code class="hljs language-sh">[Unit]
Description=Run <span class="hljs-built_in">sync</span> every 5 minutes

[Timer]
OnBootSec=2min
OnUnitActiveSec=5min
Unit=cloud.service
Persistent=<span class="hljs-literal">true</span>

[Install]
WantedBy=timers.target
</code></pre></div>
<p><strong>Reiniciamos los demonios y activamos el timer</strong>:</p>
<div><pre><code class="hljs language-sh">systemctl --user daemon-reload
systemctl --user <span class="hljs-built_in">enable</span> --now cloud.timer
systemctl --user restart cloud.timer
</code></pre></div>
<p>Para comprobar que todo está en orden y que no hay sorpresas, podemos introducir los comandos <code>systemctl --user list-timers</code> y <code>systemctl --user status cloud.service</code> que listarán los <em>timers</em> de usuario activos y el estado de la sincronización, respectivamente.</p>
<p><strong>Ahora ya tenemos nuestra propia nube, hecha de software libre, infraestructura de primer nivel e integración absoluta con el sistema operativo, lista para ser usada</strong>. Pero ¿qué pasa si se apaga la máquina mientras el sistema está sincronizando? Si la máquina se apaga mientras <code>rclone sync</code> está en curso:</p>
<ul>
<li><strong>La operación se interrumpe abruptamente</strong>.</li>
<li><strong>Los archivos que ya se copiaron al servidor siguen allí</strong>.</li>
<li><strong>Los archivos que faltaban no se subirán</strong>.</li>
<li><strong><code>rclone</code> no corromperá los archivos en el contenedor</strong>, porque solo escribe temporalmente y renombra al final.</li>
</ul>
<p>Los archivos parcialmente subidos podrán quedar incompletos, pero <code>rclone</code> los detectará y reintentará la sincronización en otro momento. Y para finalizar -en caso de accidente- <strong>si queremos restaurar los archivos en la carpeta local</strong>, basta con:</p>
<div><pre><code class="hljs language-sh">rclone <span class="hljs-built_in">sync</span> storage:usuario-storage /home/usuario/carpeta-restaurada-en-local \
  --progress \
  --fast-list \
  --transfers 4 \
  --checkers 8 \
  --bwlimit 1M \
  --filter-from /home/usuario/.config/rclone/rclone-excludes.txt
</code></pre></div>
<p><strong>Actualización</strong>: Si queremos una capa extra de seguridad, <strong>podemos activar el <em>versioning</em>, lo que nos permitirá guardar versiones diferentes de los ficheros, que incluyan los cambios que vamos introduciendo</strong>. También <strong>podemos controlar el ciclo de vida de nuestro contenedor</strong>, limpiando el disco de archivos incompletos y borrando automáticamente versiones de cierta antigüedad. Para ello, creamos el archivo <code>lifecycle.json</code> en <code> ~/.config/rclone</code>:</p>
<div><pre><code class="hljs language-json"><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">"Rules"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
    <span class="hljs-punctuation">{</span>
      <span class="hljs-attr">"ID"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"regla-1"</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"Status"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"Enabled"</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"Filter"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span> <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"Expiration"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
        <span class="hljs-attr">"Days"</span><span class="hljs-punctuation">:</span> <span class="hljs-number">20</span>
      <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"NoncurrentVersionExpiration"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
        <span class="hljs-attr">"NoncurrentDays"</span><span class="hljs-punctuation">:</span> <span class="hljs-number">10</span>
      <span class="hljs-punctuation">}</span>
    <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
    <span class="hljs-punctuation">{</span>
      <span class="hljs-attr">"ID"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"regla-2"</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"Status"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"Enabled"</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"Filter"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span> <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"Expiration"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
        <span class="hljs-attr">"ExpiredObjectDeleteMarker"</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">true</span></span>
      <span class="hljs-punctuation">}</span>
    <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
    <span class="hljs-punctuation">{</span>
      <span class="hljs-attr">"ID"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"regla-3"</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"Status"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"Enabled"</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"Filter"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span> <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"AbortIncompleteMultipartUpload"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
        <span class="hljs-attr">"DaysAfterInitiation"</span><span class="hljs-punctuation">:</span> <span class="hljs-number">10</span>
      <span class="hljs-punctuation">}</span>
    <span class="hljs-punctuation">}</span>
  <span class="hljs-punctuation">]</span>
<span class="hljs-punctuation">}</span>
</code></pre></div>
<p><strong>Instalamos el CLI de AWS con <code>sudo dnf install awscli</code> y lo configuramos con <code>aws configure</code></strong>, introduciendo el <em>access key</em>, el <em>secret key</em>, la <em>region</em> por defecto y el <em>output</em> por defecto. <strong>Después aplicamos el <em>lifecycle rule</em></strong>:</p>
<div><pre><code class="hljs language-sh">aws --endpoint-url url-del-endpoint \
    s3api put-bucket-lifecycle-configuration \
    --bucket usuario-storage \
    --lifecycle-configuration file:///home/usuario/.config/rclone/lifecycle.json
</code></pre></div>
<p><strong>Y verificamos que se ha aplicado</strong>:</p>
<div><pre><code class="hljs language-sh">aws --endpoint-url url-del-endpoint \
    s3api get-bucket-lifecycle-configuration \
    --bucket usuario-storage
</code></pre></div>
<p>Para finalizar, <strong>si queremos recuperar todas las versiones con 10 días de antigüedad, empezamos listando y guardando una lista de todas las versiones disponibles</strong>:</p>
<div><pre><code class="hljs language-sh">aws --endpoint-url url-del-endpoint \
  s3api list-object-versions --bucket usuario-storage \
  > ~/.config/rclone/versions.json
</code></pre></div>
<p><strong>Y después mostramos qué se copiará al directorio local</strong>:</p>
<div><pre><code class="hljs language-sh">TARGET_DATE=$(<span class="hljs-built_in">date</span> -u -d <span class="hljs-string">"10 days ago"</span> +%s)

jq -r --argjson target <span class="hljs-string">"<span class="hljs-variable">$TARGET_DATE</span>"</span> <span class="hljs-string">'
  .Versions[]
  | select((.LastModified | sub("\\+00:00$";"Z") | strptime("%Y-%m-%dT%H:%M:%SZ") | mktime) &#x3C;= $target)
  | "\(.Key) \(.VersionId)"'</span> ~/.config/rclone/versions.json
</code></pre></div>
<p>Lo que dará un listado del tipo:</p>
<div><pre><code class="hljs language-sh">recetas/boquerones-en-vinagre.md 1769932289.488867
recetas/costillas-al-horno.md 1769932289.491374
recetas/pure-de-calabacin.md 1769932291.014892
</code></pre></div>
<p>Ahora sí, <strong>para terminar, copiamos al directorio local los ficheros que queremos recuperar</strong>, es decir los que tienen más de 10 días de antigüedad:</p>
<div><pre><code class="hljs language-sh">TARGET_DATE=$(<span class="hljs-built_in">date</span> -u -d <span class="hljs-string">"10 days ago"</span> +%s)

jq -r --argjson target <span class="hljs-string">"<span class="hljs-variable">$TARGET_DATE</span>"</span> <span class="hljs-string">'
  .Versions[]
  | select((.LastModified
            | sub("\\+00:00$"; "Z")
            | strptime("%Y-%m-%dT%H:%M:%SZ")
            | mktime) &#x3C;= $target)
  | "\(.Key) \(.VersionId)"'</span> ~/.config/rclone/versions.json |
<span class="hljs-keyword">while</span> <span class="hljs-built_in">read</span> key version; <span class="hljs-keyword">do</span>
  DEST=<span class="hljs-string">"/home/usuario/restauracion-10-dias-antiguedad/<span class="hljs-variable">$key</span>"</span>
  <span class="hljs-built_in">mkdir</span> -p <span class="hljs-string">"<span class="hljs-subst">$(dirname <span class="hljs-string">"<span class="hljs-variable">$DEST</span>"</span>)</span>"</span>
  <span class="hljs-built_in">echo</span> <span class="hljs-string">"Descargando <span class="hljs-variable">$key</span> (versión <span class="hljs-variable">$version</span>)"</span>
  aws --endpoint-url url-del-endpoint \
    s3api get-object \
    --bucket usuario-storage \
    --key <span class="hljs-string">"<span class="hljs-variable">$key</span>"</span> \
    --version-id <span class="hljs-string">"<span class="hljs-variable">$version</span>"</span> \
    <span class="hljs-string">"<span class="hljs-variable">$DEST</span>"</span>
<span class="hljs-keyword">done</span>
</code></pre></div>]]></content:encoded>
            <wfw:commentRss>https://xn--bitcora-jwa.es/rss/comentarios/ebc72c3d-0155-41ea-8146-fc363a57a71d</wfw:commentRss>
        </item>
        <item>
            <title><![CDATA[El tostón]]></title>
            <description><![CDATA[despertar, te susurra al oído como oráculo resfriado: wifi firmware missing . Traducción del informático romance: aquí falta algo y no voy a decírtelo con...]]></description>
            <link>https://xn--bitcora-jwa.es/entrada/d1b6f810-9ea6-48bb-938a-ba642150cb42</link>
            <guid isPermaLink="true">https://xn--bitcora-jwa.es/entrada/d1b6f810-9ea6-48bb-938a-ba642150cb42</guid>
            <dc:creator><![CDATA[José Vicente del Valle Fayos]]></dc:creator>
            <pubDate>Wed, 04 Mar 2026 13:45:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>despertar, te susurra al oído como oráculo resfriado: <code>wifi firmware missing</code>**. <strong>Traducción del informático romance: aquí falta algo y no voy a decírtelo con cariño</strong>. ¿Se dejaron los chicos de IBM el <em>wifi</em> en la lavadora? No. No son descuidados, son poetas del comprimido. El firmware está ahí, sí, pero empaquetado al vacío, como el jamón. Y el <em>kernel</em>, que es muy suyo, se niega a morderlo en esas condiciones. Primer acto: <strong>ir a la despensa y abrir el envase</strong>:</p>
<div><pre><code class="hljs language-sh"><span class="hljs-built_in">cd</span> /lib/firmware
<span class="hljs-built_in">sudo</span> unxz -f iwlwifi-so-a0-gf-a0-*.xz
</code></pre></div>
<p><strong>Descomprimir ahora es un gesto político que consiste en liberar los <em>bits</em> oprimidos por el <code>.xz</code></strong>. Pero la cosa no acaba ahí. <strong>El sistema también se pone existencialista con unos avisos sobre iSCSI</strong>, esa tecnología que sirve para conectar discos lejanos como si fueran propios, en una especie de relación a distancia entre bloques:</p>
<div><pre><code class="hljs language-sh">Warning: Unmantained driver is detected cnic
Warning: Unmantained driver is detected cnic_init
Warning: Unmantained driver is detected bnx2i
Warning: Unmantained driver is detected bnx2i_mod_init
</code></pre></div>
<p>Lo que viene a decirnos -con voz de notario cansado- es que <strong>esos controladores existen, pero han sido abandonados en la cuneta digital</strong>. Nadie los mantiene. Nadie los cuida. Son perros viejos del <em>kernel</em>: muerden si pueden, pero ya no aprenden trucos nuevos. Así que, <strong>si no vas a montar una red SAN</strong> -y va a ser que no-, <strong>puedes silenciar el coro de plañideras angustiadas desactivando los módulos</strong>. Se hace así: editas la profecía de <code>dracut</code>, escribes la lista negra y regeneras con <code>initramfs</code>:</p>
<div><pre><code class="hljs language-sh"><span class="hljs-built_in">sudo</span> nano /etc/dracut.conf.d/kernel-module.conf
omit_drivers+=<span class="hljs-string">" bnx2i cnic "</span>

<span class="hljs-built_in">sudo</span> dracut -f
</code></pre></div>
<p>El conjuro queda guardado en <code>/etc</code>, ese lugar donde viven las decisiones que no quieres repetir. Resultado final: <em>wifi</em> despierto, <em>kernel</em> en paz, iSCSI desterrado. <strong>La máquina ya no se queja, arranca con dignidad y funciona como debe: en silencio, que para dar el tostón ya estoy yo</strong>.</p>]]></content:encoded>
            <wfw:commentRss>https://xn--bitcora-jwa.es/rss/comentarios/d1b6f810-9ea6-48bb-938a-ba642150cb42</wfw:commentRss>
        </item>
        <item>
            <title><![CDATA[Seguridad básica]]></title>
            <description><![CDATA[La seguridad en un servidor no es importante . Es vital . Como el oxígeno. Como el café. Como evitar que entren por la ventana mientras duermes y te cambien...]]></description>
            <link>https://xn--bitcora-jwa.es/entrada/5fcbabf9-7c9f-4082-931c-551a846e7cc6</link>
            <guid isPermaLink="true">https://xn--bitcora-jwa.es/entrada/5fcbabf9-7c9f-4082-931c-551a846e7cc6</guid>
            <dc:creator><![CDATA[José Vicente del Valle Fayos]]></dc:creator>
            <pubDate>Thu, 05 Feb 2026 17:45:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><strong>La seguridad en un servidor no es importante</strong>. <strong>Es vital</strong>. Como el oxígeno. Como el café. Como evitar que entren por la ventana mientras duermes y te cambien los muebles de sitio. Un servidor sin seguridad es un local abierto a las tres de la mañana: cualquiera entra, nadie paga y todos dejan huella, por eso, <strong>cuando un <em>sysadmin</em> levanta una máquina, lo primero que debería hacer no es celebrar el evento, sino cerrar con llave</strong>.</p>
<p><strong>Empezamos el ritual conectándonos vía <code>ssh</code> y pidiéndole al sistema que recuerde quién es</strong>, porque suele olvidarlo:</p>
<div><pre><code class="hljs language-sh">ssh username@IP_SERVER_ADDR
<span class="hljs-built_in">sudo</span> apt update
<span class="hljs-built_in">sudo</span> apt upgrade
</code></pre></div>
<p>Después, el primer acto de camuflaje: <strong>cambiar el puerto por defecto</strong>. No es que esto convierta tu servidor en invisible, pero al menos deja de llevar el cartel luminoso de "Hola, soy el 22, pégame". Abrimos el confesionario con <code>sudo nano /etc/ssh/sshd_config</code>:</p>
<div><pre><code>Port 23
AddressFamily any
ListenAddress 0.0.0.0
ListenAddress ::
</code></pre></div>
<p>Reiniciamos el servicio con <code>sudo systemctl restart sshd</code>. Ahora toca levantar un muro. <strong>Un cortafuegos</strong>. Un portero con cara de pocos amigos. Uno ligero, educado y con porra: Uncomplicated Firewall (ufw):</p>
<div><pre><code class="hljs language-sh"><span class="hljs-built_in">sudo</span> apt install ufw
<span class="hljs-built_in">sudo</span> <span class="hljs-built_in">export</span> PATH=<span class="hljs-variable">$PATH</span>:/usr/sbin <span class="hljs-comment"># Add route to PATH</span>
uwf --version
<span class="hljs-built_in">sudo</span> ufw default deny incoming
<span class="hljs-built_in">sudo</span> ufw default allow outgoing
<span class="hljs-built_in">sudo</span> ufw allow 23/tcp    <span class="hljs-comment"># SSH/sFTP</span>
<span class="hljs-built_in">sudo</span> ufw allow 25/tcp    <span class="hljs-comment"># SMTP</span>
<span class="hljs-built_in">sudo</span> ufw allow 587/tcp   <span class="hljs-comment"># SMTPs</span>
<span class="hljs-built_in">sudo</span> ufw allow 993/tcp   <span class="hljs-comment"># IMAPs</span>
<span class="hljs-built_in">sudo</span> ufw allow 80/tcp    <span class="hljs-comment"># HTTP</span>
<span class="hljs-built_in">sudo</span> ufw allow 443/tcp   <span class="hljs-comment"># HTTPS</span>
<span class="hljs-built_in">sudo</span> ufw <span class="hljs-built_in">enable</span>
</code></pre></div>
<p>Aquí el servidor aprende una palabra nueva: "no". No a lo que no conoce. No a lo que no toca. No a los que llaman a las tres de la mañana. <strong>Pero aún queda la fauna persistente: los que prueban contraseñas como quien mete monedas en una tragaperras esperando premio. Para ellos existe <code>fail2ban</code>: la memoria rencorosa del sistema</strong>.</p>
<div><pre><code class="hljs language-sh"><span class="hljs-built_in">sudo</span> apt install fail2ban
fail2ban --version
<span class="hljs-built_in">sudo</span> <span class="hljs-built_in">cp</span> /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
<span class="hljs-built_in">sudo</span> nano /etc/fail2ban/jail.local
<span class="hljs-built_in">sudo</span> systemctl <span class="hljs-built_in">enable</span> --now fail2ban
</code></pre></div>
<p><strong>Una configuración sencilla para <code>sshd</code> sería la que se indica más abajo</strong>, seguida de un reinicio del servicio y de la comprobación de su estado:</p>
<div><pre><code class="hljs language-local">[sshd]
enabled = true
mode    = normal
port    = 23
logpath = %(sshd_log)s
maxretry= 10
bantime = 1d
backend = %(sshd_backend)s
action = ufw
</code></pre></div>
<div><pre><code class="hljs language-sh"><span class="hljs-built_in">sudo</span> systemctl restart fail2ban
<span class="hljs-built_in">sudo</span> systemctl status fail2ban
<span class="hljs-built_in">sudo</span> systemctl status fail2ban sshd
</code></pre></div>
<p>Y cuando el servidor ya sabe decir "no" en varios idiomas, le damos un nombre propio: <strong>apuntamos el dominio a su IP y lo vestimos con un certificado SSL</strong>, que viene a ser como ponerle traje y corbata criptográfica:</p>
<div><pre><code class="hljs language-sh"><span class="hljs-built_in">sudo</span> apt update
<span class="hljs-built_in">sudo</span> apt install certbot
certbot --version
<span class="hljs-built_in">sudo</span> apt install python3-certbot-nginx
<span class="hljs-built_in">sudo</span> certbot --nginx -d your_domain
</code></pre></div>
<p>Certbot, eso sí, exige silencio por el puerto <code>:80</code> durante el ritual. Como un sacerdote en plena ceremonia dominical. <strong>Después editamos la configuración del sitio en Nginx</strong>: <code>/etc/nginx/sites-available/your_domain.conf</code>:</p>
<div><pre><code class="hljs language-conf">server {
    listen 443 ssl;
    server_name your_domain;

    ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;

    # Additional security parameters
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # HTTP Redirection versus HTTPS
    location / {
        try_files $uri $uri/ =404;
    }
}
</code></pre></div>
<div><pre><code class="hljs language-conf">server {
    listen 80;
    server_name your_domain;
    return 301 https://$host$request_uri;
}
</code></pre></div>
<p>Y reiniciamos:</p>
<div><pre><code class="hljs language-conf">sudo nginx -t
sudo systemctl reload nginx
</code></pre></div>
<p><strong>Y con esto, el servidor deja de ser un adolescente ingenuo y pasa a ser un adulto desconfiado. No es invulnerable -nadie lo es-, pero ya no abre la puerta en bata ni contesta a desconocidos</strong>. Porque la seguridad no es una opción avanzada del menú. Es el menú. No es un "ya lo miraré". Es un "si no lo hago hoy, otro lo hará mañana... pero desde fuera". Un servidor sin defensa es una promesa sin cifrar, una puerta sin cerrojo y una confianza sin memoria. Así que endurecerlo no es un mero cumplimiento: es un acto moral. Es una forma de decirle al mundo: <strong>aquí se entra con permiso, o no se entra</strong>. <strong>Y eso, en la red, es casi un poema</strong>.</p>]]></content:encoded>
            <wfw:commentRss>https://xn--bitcora-jwa.es/rss/comentarios/5fcbabf9-7c9f-4082-931c-551a846e7cc6</wfw:commentRss>
        </item>
        <item>
            <title><![CDATA[Organizarse]]></title>
            <description><![CDATA[Abandoné mi cuaderno digital como quien deja un amor tóxico : no por falta de cariño, sino por pura supervivencia. Ocurrió tras un ingreso hospitalario a...]]></description>
            <link>https://xn--bitcora-jwa.es/entrada/6c28e049-b729-4518-997e-8602ac69d041</link>
            <guid isPermaLink="true">https://xn--bitcora-jwa.es/entrada/6c28e049-b729-4518-997e-8602ac69d041</guid>
            <dc:creator><![CDATA[José Vicente del Valle Fayos]]></dc:creator>
            <pubDate>Tue, 20 Jan 2026 14:15:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><strong>Abandoné mi cuaderno digital como quien deja un amor tóxico</strong>: no por falta de cariño, sino por pura supervivencia. Ocurrió tras un ingreso hospitalario a finales del año pasado, cuando descubrí -en bata y con suero- que <strong>no podía acceder a mi agenda desde la web</strong>. La modernidad, ya saben: es muy inteligente, pero solo cuando le apetece. <strong>Descarté también la agenda de papel por motivos higiénico-existenciales</strong>: se ensucia, se arruga, se moja y acaba oliendo a derrota. Así que hice lo que haría cualquier adulto responsable con conexión a internet: pagar. <strong>Contraté el servicio Pro de OVH, que resultó ser tan "Pro" como una bicicleta sin pedales</strong>. El calendario, eso sí, podía leerse. De tocarlo, ni hablar.</p>
<p>Entonces tomé una decisión drástica, casi dramática: <strong>contraté una cuenta de Exchange</strong> alojada en Francia, porque todo parece más serio si pasa por Francia. Correo, calendario, tareas y contactos <strong>funcionando... digamos que razonablemente bien</strong>, esa expresión que usamos cuando algo no falla lo suficiente como para devolverlo. Aunque tampoco se podía devolver.</p>
<p><strong>Durante unas semanas me sentí organizado</strong>. No feliz, pero organizado, que es una especie de felicidad de baja intensidad. <strong>Sin embargo, empezó a crecer en mí una tristeza extraña</strong>, una pena tecnológica: <strong>la pena de estar usando software privativo para hacer peor lo que los estándares abiertos -IMAP, CalDAV, CardDAV- llevan años haciendo mejor, más rápido y sin pedirte el alma</strong>. <strong>A esa pena se sumó algo de vergüenza</strong>. <strong>Y la vergüenza, cuando madura, se convierte en decisión</strong>.</p>
<p>No me arrepiento de haber contratado Exchange. Para saber si te gustan las lentejas, tienes que comerlas. Ahora bien: Exchange no hace nada esencialmente distinto a lo que ya ofrece el software libre, salvo <strong>ponerte la zancadilla con complementos obligatorios, importaciones capadas y carpetas infernales como "Historial de conversaciones" o "Tareas"</strong>, que viven en la bandeja de entrada como okupas conceptuales. Las tareas, por cierto, deberían estar en el calendario, aunque quizá eso sería demasiado sensato. Y luego está la licencia: unos sesenta euros anuales para un servicio que los estándares abiertos te dan por menos de seis. <strong>Diez veces más caro, diez veces menos libre</strong>. Una ecuación impecable... si vendes jaulas.</p>
<p>Es cierto que <strong>muchos de esos problemas desaparecen si usas Outlook, el hábitat natural de Exchange</strong>. Pero ahí surge el verdadero problema: <strong>la retención deliberada del usuario en un ecosistema cerrado que convierte tus datos en materia prima y tu dependencia en modelo de negocio</strong>. <strong>Entiendo que la gente quiera ganarse la vida, ¡pero no así, recórcholis!</strong></p>
                <figure>
                    <img src="https://api.bitácora.es/media/6c28e049-b729-4518-997e-8602ac69d041.jpg" alt="Organizarse"/>
                    <figcaption><p><em>Buzones para correo</em>. <a href="https://www.pexels.com/es-es/foto/correo-buzon-armario-mueble-11455225/">Pexels</a>.</p></figcaption>
                </figure>                
                ]]></content:encoded>
            <wfw:commentRss>https://xn--bitcora-jwa.es/rss/comentarios/6c28e049-b729-4518-997e-8602ac69d041</wfw:commentRss>
        </item>
        <item>
            <title><![CDATA[La fragmentación]]></title>
            <description><![CDATA[Llevo poco más de dos meses ocupado en casa con Fedora Silverblue y hoy toca hablar de los cambios que he notado respecto a otras distribuciones . Son solo dos...]]></description>
            <link>https://xn--bitcora-jwa.es/entrada/c721523f-f81d-4544-9351-35e143822b96</link>
            <guid isPermaLink="true">https://xn--bitcora-jwa.es/entrada/c721523f-f81d-4544-9351-35e143822b96</guid>
            <dc:creator><![CDATA[José Vicente del Valle Fayos]]></dc:creator>
            <pubDate>Thu, 15 Jan 2026 17:30:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Llevo poco más de dos meses ocupado en casa con Fedora Silverblue y <strong>hoy toca hablar de los cambios que he notado respecto a otras distribuciones</strong>. Son solo dos pequeños detalles, <a href="https://bit%C3%A1cora.com/entrada/1bdc5df7-ac6b-48b8-a99f-9e630a384fd9">uno de los cuales ya ha sido tratado en este diario</a>, así que me centraré en el segundo, que es <strong>el que está relacionado con la gestión de paquetes</strong>. Parece poco creíble que una familia de sistemas operativos como GNU/Linux rinda más y provea una mejor experiencia de uso que otros sistemas y que -aún así- no haya conseguido alcanzar una cuota mayoritaria en entornos de escritorio. Poco creíble, pero es así.</p>
<p><strong>Una de las razones por las que GNU/Linux no ha conseguido imponerse en el mercado doméstico es la que se atribuye a la fragmentación</strong>: GNU/Linux no es un sistema operativo, sino un conjunto de sistemas operativos que se derivan unos de otros y que están hechos de innumerables contribuciones de pequeños y grandes grupos de desarrolladores. Cuando un desarrollador prepara una aplicación, debe compilar versiones distintas de esa misma aplicación para todas y cada una de las distintas distribuciones de GNU/Linux que existen en el mundo. ¡Y se cuentan por centenares!</p>
<p><strong>Esta situación provoca la huida de instituciones y empresas que reniegan de desarrollar nuevo software para GNU/Linux</strong>. Y así, cuando compras un GPS para tu automóvil -por poner un ejemplo- verás que la actualización de los mapas se puede realizar desde macOS y desde Windows... ¡pero no desde GNU/Linux! Dejamos para otro momento la consideración de quienes ven a GNU/Linux como un competidor desleal, dado que la mayor parte de distribuciones son gratuitas.</p>
<p>Pero volviendo al tema de la fragmentación, a día de hoy, <strong>GNU/Linux está tratando de resolver la situación distribuyendo sus aplicaciones en contenedores</strong>. Para que usted me entienda, un contenedor contiene las partes imprescindibles de un sistema operativo necesarias para ejecutar la aplicación contenerizada, virtualizada dentro de GNU/Linux. Esto hace que dicha aplicación pueda funcionar correctamente en cualquier distribución y quede así solventado el problema de la fragmentación.</p>
<p>¿Y qué tiene esto que ver con los cambios que he detectado en Fedora Silverblue durante los dos meses que llevo usándolo? Pues que <strong>al instalar la versión contenerizada de LibreOffice en Silverblue, me he encontrado con que no se guarda la fuente necesaria para la inserción de fórmulas matemáticas</strong>. ¿Por qué no? Por que Silverblue es inmutable. ¿Tiene solución? ¿Es grave? Para nada. Vamos a ver cómo se soluciona.</p>
<p>Lo primero que necesitamos es <strong>descargar la fuente OpenSymbol y extraerla del RPM</strong> como fichero <code>.ttf</code>:</p>
<div><pre><code class="hljs language-sh">curl -O https://dl.fedoraproject.org/pub/fedora/linux/updates/43/Everything/x86_64/Packages/l/libreoffice-opensymbol-fonts-25.8.3.2-2.fc43.noarch.rpm

rpm2cpio libreoffice-opensymbol-fonts*.rpm | cpio -idmv
</code></pre></div>
<p>Después, <strong>creamos una carpeta de fuentes en el directorio local -que en Fedora Silverblue sí es mutable- y la copiamos al directorio que hemos creado anteriormente</strong>:</p>
<div><pre><code class="hljs language-sh"><span class="hljs-built_in">mkdir</span> -p ~/.local/share/fonts

<span class="hljs-built_in">cp</span> usr/share/fonts/opensymbol/OpenSymbol.ttf ~/.local/share/fonts/
</code></pre></div>
<p><strong>Actualizamos la caché de fuentes</strong> con <code>fc-cache -f -v</code>, <em>et voilà!</em> <strong>Ya tenemos la fuente disponible para su uso en la aplicación de LibreOffice (Flatpak) y en cualquier otra aplicación</strong>. No ha sido difícil, ¿verdad? ¿Crees que en el futuro -con la contenerización de aplicaciones- veremos llegar GNU/Linux a entornos de escritorio de uso masivo? ¿O piensas que hemos llegado tarde? <a href="https://bit%C3%A1cora.com/escr%C3%ADbame">¡Haz tu apuesta ahora!</a></p>
                <figure>
                    <img src="https://api.bitácora.es/media/c721523f-f81d-4544-9351-35e143822b96.jpg" alt="La fragmentación"/>
                    <figcaption><p><em>Cristal roto</em>. <a href="https://www.pexels.com/es-es/foto/fragil-espejo-roto-destrozado-fragmentos-6755134/">Pexels</a>.</p></figcaption>
                </figure>                
                ]]></content:encoded>
            <wfw:commentRss>https://xn--bitcora-jwa.es/rss/comentarios/c721523f-f81d-4544-9351-35e143822b96</wfw:commentRss>
        </item>
    </channel>
</rss>