<?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>Linux Sin Humo (Publicaciones sobre PowerTips)</title><link>https://sergiobelkin.com/</link><description></description><atom:link href="https://sergiobelkin.com/categories/cat_powertips.xml" rel="self" type="application/rss+xml"></atom:link><language>es</language><copyright>Contents © 2026 &lt;a href="mailto:sebelk@gmail.com"&gt;sebelk&lt;/a&gt; 
&lt;a rel="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0/"&gt;
&lt;img alt="Creative Commons License BY-NC-SA"
style="border-width:0; margin-bottom:12px;"
src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png"&gt;&lt;/a&gt;
</copyright><lastBuildDate>Mon, 03 Aug 2026 11:55:01 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>3 Power Tips + Power Link I13</title><link>https://sergiobelkin.com/posts/3-power-tips-power-link-i13/</link><dc:creator>sebelk</dc:creator><description>&lt;figure&gt;&lt;img src="https://sergiobelkin.com/images/PowerTipsPlus.png"&gt;&lt;/figure&gt; &lt;p&gt;Leer un comando antes de correrlo y autorizarlo por su nombre son decisiones que se toman sobre un texto. Lo que el proceso puede hacer una vez que arrancó se decide en otro lado.&lt;/p&gt;
&lt;h3 id="power-tip-1-el-comando-que-lees-no-es-el-que-corre"&gt;Power Tip #1 El comando que leés no es el que corre&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;El script del pipeline está versionado y lo revisaste entero. Dice &lt;code&gt;$CLEAN "$d"&lt;/code&gt; y en el repositorio no aparece dónde se define &lt;code&gt;CLEAN&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No aparece porque no vive ahí: lo inyecta la plataforma de CI, desde la configuración del job o desde un grupo de variables que se edita en otra pantalla.&lt;/li&gt;
&lt;li&gt;Una función viaja igual de callada. &lt;code&gt;export -f ls&lt;/code&gt; la manda al ambiente, y en el hijo esa función le gana al binario del mismo nombre.&lt;/li&gt;
&lt;li&gt;El alias, en cambio, no viaja: en un script no se expande salvo que lo habilites. Es el único de los tres que se queda donde lo ves.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;env&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-E&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'^CLEAN=|BASH_FUNC'&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# como paso del job: lo que el script usa y no declara&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Leer el repositorio asume que el repositorio es el programa. La otra mitad la pone el ambiente donde corre el job y no está versionada, así que queda fuera del alcance de cualquier revisión del código. El nombre y lo que ejecuta son dos cosas distintas hasta que los resolvés en el proceso donde va a correr.&lt;/p&gt;
&lt;h3 id="power-tip-2-permitir-un-comando-es-permitir-todo-lo-que-ese-programa-es-capaz-de-hacer"&gt;Power Tip #2 Permitir un comando es permitir todo lo que ese programa es capaz de hacer&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;La regla de sudoers autoriza &lt;code&gt;less /var/log/secure&lt;/code&gt; y nada más. Leer un log con un visor: se abre, se lee, se cierra. Parece prudente y acotado.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;less&lt;/code&gt; no solo muestra. Con &lt;code&gt;!&lt;/code&gt; corre un comando en una shell —la que diga &lt;code&gt;$SHELL&lt;/code&gt;—, con &lt;code&gt;|&lt;/code&gt; manda el contenido a otro programa y con &lt;code&gt;v&lt;/code&gt; abre el editor. No es un agujero: está en su manual, en la lista de comandos.&lt;/li&gt;
&lt;li&gt;Tampoco es una particularidad de &lt;code&gt;less&lt;/code&gt;. &lt;code&gt;vim&lt;/code&gt; sale a la shell con &lt;code&gt;:!&lt;/code&gt;, &lt;code&gt;find&lt;/code&gt; ejecuta programas con &lt;code&gt;-exec&lt;/code&gt;, &lt;code&gt;tar&lt;/code&gt; canaliza lo que extrae a un programa externo con &lt;code&gt;--to-command&lt;/code&gt;. Ninguno está roto: todos hacen lo que su documentación dice.&lt;/li&gt;
&lt;li&gt;"Solo lectura" describe para qué lo autorizaste, no lo que el programa puede hacer una vez abierto. La regla nombra un archivo y entrega todo lo que ese archivo es capaz de hacer, incluido lo que le delegue a otro.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# de cada línea: ¿qué más puede hacer ese programa, y a quién llama?&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Enumerar lo que se puede correr te ahorra tener que prever cada cosa que no querés que corra, y eso no es poco. Lo que no te da es un límite a lo que esos comandos pueden hacer: el nombre autorizado no dice hasta dónde llega el proceso una vez que arrancó, y averiguarlo binario por binario no escala. Ese límite hay que ponerlo en otro lado.&lt;/p&gt;
&lt;h3 id="power-tip-3-sudo-dice-quien-systemd-dice-hasta-donde"&gt;Power Tip #3 sudo dice quién; systemd dice hasta dónde&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;El job de mantenimiento corre autorizado por una regla de sudoers que nombra un solo script. Mientras corre, tiene el filesystem entero a mano, &lt;code&gt;/home&lt;/code&gt; incluido.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La regla contestó una pregunta —quién puede correr qué— y no hay nada en ella que conteste la otra. El alcance del proceso no se decide en sudoers porque sudoers no habla de eso.&lt;/li&gt;
&lt;li&gt;La otra pregunta se responde en la unidad. &lt;code&gt;ProtectHome=&lt;/code&gt;, &lt;code&gt;ProtectSystem=&lt;/code&gt;, &lt;code&gt;PrivateTmp=&lt;/code&gt; le recortan al proceso lo que puede tocar, sin tocar la autorización ni el script. No compiten con sudo: arrancan donde sudo termina.&lt;/li&gt;
&lt;li&gt;Ahora, no le creas al archivo. En scope de usuario, según la versión de systemd, esas propiedades pueden necesitar además &lt;code&gt;PrivateUsers=yes&lt;/code&gt; para hacer efecto — sin error, y con &lt;code&gt;systemctl show&lt;/code&gt; confirmándote que están puestas.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;systemd-run&lt;span class="w"&gt; &lt;/span&gt;--user&lt;span class="w"&gt; &lt;/span&gt;--pty&lt;span class="w"&gt; &lt;/span&gt;--property&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ProtectHome&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes&lt;span class="w"&gt; &lt;/span&gt;ls&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# si te lista el home, acá no rige&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Las dos preguntas se responden en lugares distintos y ninguna cubre la de la otra. Antes de apoyarte en la segunda, hacela fallar a propósito: pedile al proceso lo que no tendría que poder, y fijate si puede.&lt;/p&gt;
&lt;h3 id="power-link"&gt;Power Link&lt;/h3&gt;
&lt;p&gt;La discusión sobre IA y software libre suele quedarse en si el código generado sirve o no. Debian se está haciendo una pregunta más de fondo: quién puede contribuir y con qué. La resolución general en debate hasta el 8 de agosto junta seis propuestas en la misma votación, desde prohibir las contribuciones asistidas por LLM en el Contrato Social hasta no pronunciarse y dejarlo al criterio de cada quien: &lt;a href="https://www.debian.org/vote/2026/vote_002"&gt;General Resolution: LLM usage in Debian&lt;/a&gt;. Cuando esto se publica todavía no se votó, que es el mejor momento para leerlas: las seis están argumentadas y firmadas, cosa poco frecuente en una discusión sobre este tema.&lt;/p&gt;</description><category>bash</category><category>seguridad</category><category>sudo</category><category>sysadmin</category><category>systemd</category><guid>https://sergiobelkin.com/posts/3-power-tips-power-link-i13/</guid><pubDate>Mon, 03 Aug 2026 11:51:29 GMT</pubDate></item><item><title>3 Power Tips + Power Link I12</title><link>https://sergiobelkin.com/posts/3-power-tips-power-link-i12/</link><dc:creator>sebelk</dc:creator><description>&lt;figure&gt;&lt;img src="https://sergiobelkin.com/images/PowerTipsPlus.png"&gt;&lt;/figure&gt; &lt;p&gt;"GUI vs CLI" es un falso dilema. Antes que técnico, es cultural: hábitos, modos de trabajo y supersticiones que arrastramos quienes trabajamos en IT. La consola y la interfaz gráfica no se disputan el mismo lugar; resuelven problemas distintos y, bien usadas, se complementan.&lt;/p&gt;
&lt;h3 id="power-tip-1-una-imagen-contra-una-tabla-de-sectores"&gt;Power Tip #1 Una imagen contra una tabla de sectores&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Hay que redimensionar una partición con datos, y querés ver cómo queda el layout antes de escribir al disco.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La línea de comandos no te deja sin red: &lt;code&gt;sgdisk&lt;/code&gt; o un playbook de Ansible pueden simular el cambio sin escribir al disco. El tema es cómo lo muestran: una tabla de números —alineación a sectores, espacio libre real, orden físico de las particiones— que hay que reconstruir de cabeza.&lt;/p&gt;
&lt;p&gt;GParted o KDE Partition Manager muestran ese mismo estado final, pero dibujado:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;gparted&lt;span class="w"&gt; &lt;/span&gt;/dev/sdX
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Cargan el layout, dejan encolar varias operaciones, y muestran el resultado antes de aplicarlo. El "Aplicar" recién dispara las llamadas reales al disco.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/pt12-kde-partition-manager.webp"&gt;&lt;img src="https://sergiobelkin.com/images/pt12-kde-partition-manager.webp" alt="Barra de herramientas del Gestor de Particiones de KDE con «Aplicar» y «Cambiar el tamaño/mover», y la lista de particiones del disco: los cambios se preparan sobre el layout y nada se escribe hasta pulsar «Aplicar»"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cuando la operación es difícilmente reversible y conviene evaluar el estado de antemano, la GUI es un camino apropiado: no porque la CLI no pueda simular, sino porque entrega una imagen donde la consola entrega una tabla. Y eso no tiene que ver con el nivel del operador.&lt;/p&gt;
&lt;h3 id="power-tip-2-el-clic-no-se-copia-de-manera-natural"&gt;Power Tip #2 El clic no se copia de manera natural&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Ajustaste una regla de firewall desde Cockpit, el servicio volvió, y treinta días después hay que replicarlo en otros 50 nodos.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El cambio se hizo en la web UI, no en una shell.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;history&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;firewall-cmd
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;No aparece nada: no hay un comando para copiar.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;firewall-cmd&lt;span class="w"&gt; &lt;/span&gt;--permanent&lt;span class="w"&gt; &lt;/span&gt;--add-service&lt;span class="o"&gt;=&lt;/span&gt;https&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;firewall-cmd&lt;span class="w"&gt; &lt;/span&gt;--reload
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;La CLI permite reproducir y adaptar; la GUI facilita hacerlo una sola vez.&lt;/p&gt;
&lt;h3 id="power-tip-3-un-comando-contra-el-asistente-de-media-docena-de-pantallas"&gt;Power Tip #3 Un comando contra el asistente de media docena de pantallas&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Hay que crear el mismo private endpoint en dev, staging y prod, y en el Portal es un asistente de varias pantallas cada vez.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Resource group, región, sub-resource, VNet, subnet: cada pantalla es un clic y un punto donde el tercer entorno termina distinto del primero.&lt;/li&gt;
&lt;li&gt;No hay forma de correr "lo mismo" dos veces: cada pasada se arma a mano de nuevo.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;az&lt;span class="w"&gt; &lt;/span&gt;network&lt;span class="w"&gt; &lt;/span&gt;private-endpoint&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;--name&lt;span class="w"&gt; &lt;/span&gt;pe-app&lt;span class="w"&gt; &lt;/span&gt;--resource-group&lt;span class="w"&gt; &lt;/span&gt;rg-prod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--vnet-name&lt;span class="w"&gt; &lt;/span&gt;vnet-prod&lt;span class="w"&gt; &lt;/span&gt;--subnet&lt;span class="w"&gt; &lt;/span&gt;snet-data&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--private-connection-resource-id&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$sqlid&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--group-id&lt;span class="w"&gt; &lt;/span&gt;sqlServer&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--connection-name&lt;span class="w"&gt; &lt;/span&gt;pe-app-conn
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;La misma operación entra en una línea parametrizable: la repetís idéntica en cada entorno cambiando un par de variables. El patrón no es de Azure — &lt;code&gt;aws&lt;/code&gt; y &lt;code&gt;gcloud&lt;/code&gt; resuelven lo suyo igual.&lt;/p&gt;
&lt;p&gt;Cuando la misma operación se repite entre entornos, el asistente visual es el cuello de botella, no la ayuda.&lt;/p&gt;
&lt;h3 id="power-link"&gt;Power Link&lt;/h3&gt;
&lt;p&gt;"La IA provocará la inutilidad de la línea de comandos". ¿Será así? Mark Pesce —co-creador de VRML— sostiene en The Register justo lo contrario: &lt;a href="https://www.theregister.com/software/2026/03/11/ai-has-made-the-cli-more-important-and-powerful/5229986"&gt;AI has made the Command Line Interface more important and powerful than ever before&lt;/a&gt;. Su argumento es que las GUIs se volvieron tan recargadas que ni los agentes las operan bien, y la CLI reaparece como el terreno común entre humanos y máquinas. No hace falta estar de acuerdo en todo para que la pregunta quede flotando: ¿cuánto de lo que se grita en los medios y en las redes sociales vamos a tener que repensar?&lt;/p&gt;</description><category>Azure</category><category>CLI</category><category>Cockpit</category><category>GUI</category><category>sysadmin</category><guid>https://sergiobelkin.com/posts/3-power-tips-power-link-i12/</guid><pubDate>Mon, 08 Jun 2026 04:16:42 GMT</pubDate></item><item><title>3 Power Tips + Power Link I11</title><link>https://sergiobelkin.com/posts/3-power-tips-power-link-i11/</link><dc:creator>sebelk</dc:creator><description>&lt;figure&gt;&lt;img src="https://sergiobelkin.com/images/PowerTipsPlus.png"&gt;&lt;/figure&gt; &lt;p&gt;Las PTs de este issue muestran cómo, incluso en la nube (en este caso Azure), siguen aplicando conceptos clásicos de sistemas: distinguir entre ejecución y estado, entender la irreversibilidad de ciertos valores (como secrets) y operar en ausencia de un mapeo explícito entre componentes. Al final, el progreso en la &lt;strong&gt;Estrategia de Innovación Abierta y Código Abierto&lt;/strong&gt; en un estado alemán.&lt;/p&gt;
&lt;h3 id="power-tip-1-el-exit-code-es-local-no-de-azure"&gt;Power Tip #1 El exit code es local, no de Azure&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;El comando volvió con &lt;code&gt;0&lt;/code&gt; y la app sigue cayéndose.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;az&lt;/code&gt; reporta éxito al recibir el ACK del control plane.&lt;/li&gt;
&lt;li&gt;El recurso queda en &lt;code&gt;Updating&lt;/code&gt; o &lt;code&gt;Creating&lt;/code&gt; por minutos.&lt;/li&gt;
&lt;li&gt;El siguiente paso del script lo encuentra "no listo" y falla raro.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;az&lt;span class="w"&gt; &lt;/span&gt;resource&lt;span class="w"&gt; &lt;/span&gt;show&lt;span class="w"&gt; &lt;/span&gt;--ids&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--query&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"properties.provisioningState"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;tsv
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;provisioningState&lt;/code&gt; es un testigo más confiable del control plane.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="power-tip-2-el-valor-del-secret-se-entrega-una-sola-vez"&gt;Power Tip #2 El valor del secret se entrega una sola vez&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;La alerta de vencimiento de un secret se "resolvió" pero la app igual se cae.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;credential reset&lt;/code&gt; devolvió el password en stdout.&lt;/li&gt;
&lt;li&gt;Lo perdiste antes de guardarlo en el vault.&lt;/li&gt;
&lt;li&gt;Entra ID considera el secret válido. Nadie puede usarlo.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;az&lt;span class="w"&gt; &lt;/span&gt;ad&lt;span class="w"&gt; &lt;/span&gt;app&lt;span class="w"&gt; &lt;/span&gt;credential&lt;span class="w"&gt; &lt;/span&gt;reset&lt;span class="w"&gt; &lt;/span&gt;--append&lt;span class="w"&gt; &lt;/span&gt;...&lt;span class="w"&gt; &lt;/span&gt;--query&lt;span class="w"&gt; &lt;/span&gt;password&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;tsv
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Si se perdió el valor generado, no se puede recuperar. Como perder una clave privada SSH: podés crear otra, pero no reconstruir la anterior.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="power-tip-3-el-mapeo-no-vive-donde-uno-espera"&gt;Power Tip #3 El mapeo no vive donde uno espera&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Sabés que la app usa un secret de un KV. No sabés cuál.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;App Registration no declara qué KV la consume.&lt;/li&gt;
&lt;li&gt;Key Vault no mantiene, por defecto, una relación nativa con la App Registration que originó el secret.&lt;/li&gt;
&lt;li&gt;El nombre del secret en KV es convención del equipo responsable, no metadato de Azure.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kv&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;az&lt;span class="w"&gt; &lt;/span&gt;keyvault&lt;span class="w"&gt; &lt;/span&gt;list&lt;span class="w"&gt; &lt;/span&gt;--query&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[].name"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;tsv&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;az&lt;span class="w"&gt; &lt;/span&gt;keyvault&lt;span class="w"&gt; &lt;/span&gt;secret&lt;span class="w"&gt; &lt;/span&gt;list&lt;span class="w"&gt; &lt;/span&gt;--vault-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$kv&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--query&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[?contains(name, 'mi-superpower-app')].{kv:'&lt;/span&gt;&lt;span class="nv"&gt;$kv&lt;/span&gt;&lt;span class="s2"&gt;',name:name}"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;tsv
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Si para rotar un secret tenés que salir a buscarlo, no está definido en ningún lado qué secret usa esa app...&lt;/p&gt;
&lt;h3 id="power-link"&gt;Power Link&lt;/h3&gt;
&lt;p&gt;Este es un análisis del &lt;strong&gt;Open Source Observatory (OSOR)&lt;/strong&gt; sobre la adopción de software Open Source en el estado alemán de Schleswig-Holstein. ¿Cómo les fue implementando LibreOffice, Thunderbird, and Linux?: &lt;a href="https://interoperable-europe.ec.europa.eu/collection/open-source-observatory-osor/news/schleswig-holsteins-open-source-strategy-year"&gt;From Early Adopter to Leader: Schleswig-Holstein's Open Source Evolution&lt;/a&gt;&lt;/p&gt;</description><category>Azure</category><category>seguridad</category><guid>https://sergiobelkin.com/posts/3-power-tips-power-link-i11/</guid><pubDate>Mon, 27 Apr 2026 16:57:09 GMT</pubDate></item><item><title>3 Power Tips + Power Link I10</title><link>https://sergiobelkin.com/posts/3-power-tips-power-link-i10/</link><dc:creator>sebelk</dc:creator><description>&lt;figure&gt;&lt;img src="https://sergiobelkin.com/images/PowerTipsPlus.png"&gt;&lt;/figure&gt; &lt;p&gt;Las herramientas de &lt;strong&gt;monitoreo&lt;/strong&gt; son fundamentales, pero una pobre &lt;strong&gt;interpretación&lt;/strong&gt; de los resultados, pueden llevar a conclusiones incorrectas. Incluso usando chatbots de IA, si hacemos &lt;strong&gt;preguntas&lt;/strong&gt; deficientes podemos terminar girando en círculos o tardar más tiempo en resolver un problema. Lo mejor es reducir el nivel de especulación con hipótesis técnica. A continuación vemos unos ejemplos bien sencillos.&lt;/p&gt;
&lt;h3 id="power-tip-1"&gt;Power Tip #1&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;No todas las métricas que parecen similares describen el mismo fenómeno.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aplicación lenta.&lt;/li&gt;
&lt;li&gt;Load 15.&lt;/li&gt;
&lt;li&gt;CPU idle 50%.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Alguien descarta CPU porque “está libre”.&lt;/p&gt;
&lt;p&gt;Pero:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Load describe tareas en ejecución o esperando.&lt;/li&gt;
&lt;li&gt;CPU usage describe tiempo ocupado.&lt;/li&gt;
&lt;li&gt;CPU pressure describe tiempo en que las tareas no pudieron progresar.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Son fenómenos distintos.&lt;/p&gt;
&lt;p&gt;Antes de interpretar, mirá comportamiento:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;vmstat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
mpstat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Y si necesitás otra capa:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;cat&lt;span class="w"&gt; &lt;/span&gt;/proc/pressure/cpu
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Es importante saber que “Load no es necesariamente consumo de CPU”, sin embargo, más importante es entender qué está describiendo cada señal.&lt;/p&gt;
&lt;p&gt;Interpretarlas como si hablaran de lo mismo es especulación con números.&lt;/p&gt;
&lt;h3 id="power-tip-2"&gt;Power Tip #2&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Tomar una métrica aislada de memoria en Linux no implica entender como funciona&lt;/strong&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;free&lt;span class="w"&gt; &lt;/span&gt;-h
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Las columnas están ahí. Pero entender qué representa cada una es otra cosa.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;used&lt;/code&gt; no significa “memoria en crisis”.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;buff/cache&lt;/code&gt; no significa “desperdicio”.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;available&lt;/code&gt; no significa “memoria libre inmediata”.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Antes de reaccionar ante un número alto, mirá dinámica:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;vmstat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Linux administra memoria como recurso dinámico, no como espacio estático.&lt;/p&gt;
&lt;p&gt;Leer columnas sin entender el modelo del kernel es especulación con formato tabular.&lt;/p&gt;
&lt;h3 id="power-tip-3"&gt;Power Tip #3&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Reiniciar en muchas situaciones no hace otra cosa que restaurar un estado. No explica causas.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El servicio falla.&lt;/li&gt;
&lt;li&gt;Se reinicia.&lt;/li&gt;
&lt;li&gt;Funciona.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eso no es diagnóstico.&lt;/p&gt;
&lt;p&gt;Antes de repetir el gesto automático:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;journalctl&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;servicio-problematico&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;50&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Si no entendemos por qué se degradó, volverá a pasar.&lt;/p&gt;
&lt;p&gt;Reiniciar elimina el síntoma. No valida la hipótesis. Las herramientas no están equivocadas.&lt;/p&gt;
&lt;p&gt;La diferencia está en entender qué fenómeno describe cada señal. Está claro que en el mundo real, muchas veces determinar la causa del problema lleva más tiempo que usar un trigger que reinice un servicio. Algo que pasa muchas veces apps legacy (la falta de especialistas o la triste realidad de falta del código fuente). Sin embargo, el problema es cuando se usa esta metodologìa como primera opción...&lt;/p&gt;
&lt;h3 id="power-link"&gt;Power Link&lt;/h3&gt;
&lt;p&gt;La IA terminará con las operaciones de IT. ¿En serio? Bueno, en realidad no, para sorpresa de tecno-optimistas o tecno-pesimistas, aquí hay un interesante análisis de Sebastián Martínez de SUSE sobre este tema: &lt;a href="https://www.suse.com/c/why-ai-cannot-run-linux-infrastructure-mcp-suse/"&gt;Why AI Still Cannot Run Your Linux Infrastructure (And What Must Change)&lt;/a&gt;&lt;/p&gt;</description><category>kernel</category><category>monitoreo</category><category>RAM</category><category>systemd</category><guid>https://sergiobelkin.com/posts/3-power-tips-power-link-i10/</guid><pubDate>Sat, 21 Feb 2026 16:57:09 GMT</pubDate></item><item><title>3 Power Tips + 1 Power Link I9</title><link>https://sergiobelkin.com/posts/3-power-tips-power-link-i9/</link><dc:creator>sebelk</dc:creator><description>&lt;figure&gt;&lt;img src="https://sergiobelkin.com/images/PowerTipsPlus.png"&gt;&lt;/figure&gt; &lt;p&gt;&lt;strong&gt;PSI (Pressure Stall Information)&lt;/strong&gt; permite observar ese tipo de situaciones y, sobre todo, cambiar la forma en que interpretamos problemas de rendimiento y estabilidad en Linux. A partir de esa señal, el foco deja de estar en métricas globales y pasa a decisiones concretas: entender dónde ocurre el problema, a quién afecta y cómo intervenir sin arrastrar todo el sistema.
Finalmente, el Power Link nos lleva a ver qué opina Gaël Duval, el creador de la distribución Mandrake, sobre uno de los hypes actuales.&lt;/p&gt;
&lt;h3 id="power-tip-1-como-se-ven-afectadas-mis-aplicaciones-por-falta-de-recursos"&gt;Power Tip #1: ¿Cómo se ven afectadas mis aplicaciones por falta de recursos?&lt;/h3&gt;
&lt;p&gt;Existe a veces una creencia basado en pensamiento mágico: que el monitoreo depende solamente de la herramienta que se utilice. Pero más que la herramienta lo importante, es &lt;em&gt;qué se mide&lt;/em&gt; y &lt;em&gt;cómo interpretar&lt;/em&gt; esos resultados. &lt;strong&gt;Las métricas más conocidas: uso de cpu, load-average, uso de memoria, uso de I/O, etc. si bien son útiles pueden darnos en muchos casos un panorama parcial&lt;/strong&gt;. Eso sucede porque están basados en los recursos, o en el scheduler.&lt;/p&gt;
&lt;p&gt;Existen sin embargo desde hace varios años métricas que están más centradas en como las aplicaciones se ven impactadas por el uso de recursos.  Con PSI (Pressure Stall Information) obtenemos un indicio del tiempo que las aplicaciones quedan detenidas porque el sistema no puede darles CPU, memoria o acceso a disco en el momento en que lo necesitan. &lt;/p&gt;
&lt;p&gt;Esto está expuesto en el sistema de archivos:&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/psi-files.webp"&gt;&lt;img src="https://sergiobelkin.com/images/psi-files.thumbnail.webp" alt="Archivos de PSI"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;PSI distingue entre situaciones donde al menos una tarea queda bloqueada (&lt;code&gt;some&lt;/code&gt;) y escenarios donde todas las tareas relevantes compiten por el mismo recurso (&lt;code&gt;full&lt;/code&gt;).
Valores elevados y sostenidos en este &lt;code&gt;full&lt;/code&gt; caso suelen indicar un problema estructural: no de picos puntuales, sino de diseño, aislamiento o priorización de workloads.&lt;/p&gt;
&lt;p&gt;Vale hacer aquí tres aclaraciones:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Esta funcionalidad está presente a partir de la versión 4.20 del kernel (RHEL8 la trae como backport). En algunas distribuciones puede ser necesario habilitar PSI explícitamente en el arranque.&lt;/li&gt;
&lt;li&gt;Esta no es &lt;strong&gt;la&lt;/strong&gt; métrica definitiva, sin embargo ignorarla es perder el cuadro completo de lo que sucede tanto en el sistema como nuestras aplicaciones.&lt;/li&gt;
&lt;li&gt;Versiones recientes del kernel incluyen también la medición de la presión sobre &lt;strong&gt;irq&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="power-tip-2-las-disrupciones-se-pueden-atribuir-a-workloads-especificos"&gt;Power Tip #2: Las disrupciones se pueden atribuir a workloads específicos&lt;/h3&gt;
&lt;p&gt;Cuando el host empieza a perder capacidad de respuesta, no siempre el problema es global.
Es común que el sistema siga siendo usable mientras algunos servicios o aplicaciones comienzan a degradarse, simplemente porque no acceden a los recursos cuando los necesitan. Esa degradación suele manifestarse como lentitud, mayor latencia o pérdida de capacidad de interacción.&lt;/p&gt;
&lt;p&gt;En un Linux moderno, el kernel organiza los procesos bajo &lt;strong&gt;dominios de control definidos por cgroups&lt;/strong&gt;.
Esto permite observar de forma localizada qué tareas empiezan a quedarse esperando recursos, en lugar de razonar únicamente a partir de métricas agregadas del host.&lt;/p&gt;
&lt;p&gt;En sistemas basados en systemd, ese dominio no es abstracto: se corresponde con services, slices o scopes.
El mismo síntoma que aparece a nivel global puede observarse dentro de estos límites, lo que permite atribuir dónde se generan las esperas, incluso cuando el resto del sistema continúa funcionando con normalidad.&lt;/p&gt;
&lt;p&gt;Pensar a nivel host diluye el diagnóstico.
En cambio poner el foco en en services, scopes y slices permite relacionar directamente los síntomas percibidos —lentitud, tiempos de respuesta, degradación de rendimiento— con un grupo de procesos concreto.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/specific-psi.webp"&gt;&lt;img src="https://sergiobelkin.com/images/specific-psi.thumbnail.webp" alt="PSI per cgroup"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Es decir, uno puede decir que &lt;strong&gt;el host muestra la presión acumulada&lt;/strong&gt;, pero &lt;strong&gt;los cgroups permiten entender qué se queda atascado y frente qué recurso&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="power-tip-3-abordar-el-problema-de-manera-localizada"&gt;Power Tip #3: Abordar el problema de manera localizada&lt;/h3&gt;
&lt;p&gt;Cuando un servicio o aplicación empieza a tener tiempos muertos o a interferir con el resto, tenemos varias maneras de abordar el problema. Y no estamos hablando de las típicas acciones: reiniciarlo, moverlo o rediseñarlo.&lt;/p&gt;
&lt;p&gt;Podemos tomar medidas más estructurales, por ejemplo, crear un slice de systemd, establecer límites y luego confinar esos servicios o procesos en esos slices.&lt;/p&gt;
&lt;p&gt;Sin embargo, antes de intervenir de manera prematura, es conveniente tener en cuenta que Linux, en general ya tiene una agrupación de slices, scopes y servicios bastante razonable. En este punto entonces, ya sabemos que &lt;strong&gt;ese servicio problemático ya corre dentro de un perímetro definido&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En lugar de crear un nuevo slice, que tiene un carácter más permanente, podemos adoptar una solución más sencilla y gradualista. En systemd, &lt;strong&gt;los parámetros que gobiernan cómo compite por recursos no están fijos&lt;/strong&gt; en scopes o servicios.&lt;/p&gt;
&lt;p&gt;Un vistazo rápido alcanza para verlo (los siguientes son ejemplos para entender la idea):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;show&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;ControlGroup,CPUWeight,MemoryMax,IOWeight&lt;span class="w"&gt; &lt;/span&gt;procesos-ruidosos.scope
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Y tomar cartas en el asunto:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;set-property&lt;span class="w"&gt; &lt;/span&gt;procesos-ruidosos.scope&lt;span class="w"&gt; &lt;/span&gt;…
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ese tipo de intervención es local, reversible y no convierte un incidente puntual en un cambio estructural.&lt;/p&gt;
&lt;p&gt;Intervenir sobre una unidad existente permite corregir interferencias concretas &lt;strong&gt;sin rediseñar el sistema ni propagar el problema&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="fuentes-y-mas-recursos"&gt;Fuentes y más recursos&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://sergiobelkin.com/posts/que-son-los-cgroups-y-para-que-sirven/"&gt;Qué son los cgroups y para qué sirven&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="power-link"&gt;Power Link&lt;/h3&gt;
&lt;p&gt;Gaël Duval, creador de Mandrake, Murena y e/OS reflexiona sobre el impacto de la AI en el software open source: &lt;a href="https://gaelduval.com/why-ai-wont-kill-open-source/#more-1725"&gt;Why AI won’t “Kill Open Source”&lt;/a&gt;&lt;/p&gt;</description><category>cgroups</category><category>kernel</category><category>monitoreo</category><category>systemd</category><guid>https://sergiobelkin.com/posts/3-power-tips-power-link-i9/</guid><pubDate>Sun, 04 Jan 2026 18:30:54 GMT</pubDate></item><item><title>3 Power Tips + 1 Power Link I8</title><link>https://sergiobelkin.com/posts/3-power-tips-power-link-i8/</link><dc:creator>sebelk</dc:creator><description>&lt;figure&gt;&lt;img src="https://sergiobelkin.com/images/PowerTipsPlus.png"&gt;&lt;/figure&gt; &lt;p&gt;&lt;strong&gt;Resumen&lt;/strong&gt;: En esta entrega, un ejemplo del poder que tienen la subshells de bash, como solucionar problemas de SELinux con Podman, y el uso de la herramienta yq para procesar archivos yaml.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Nota: En los ejemplos de comandos el prompt del usuario no privilegiado es "$", mientras que el del superusuario es "#"&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="power-tip-1-crear-entornos-de-bash-efimeros-usando-subshells"&gt;Power Tip #1: Crear entornos de bash efímeros usando subshells&lt;/h3&gt;
&lt;p&gt;Una subshell es una copia del proceso de la shell actual. Una manera de crear una subshell es usando &lt;code&gt;()&lt;/code&gt; y sirve: para personalizar el entorno de bash de manera reversible. Por ejemplo, podemos cambiar de directorio y la variable de entorno C (POSIX) para que muestre los mensajes de salida y de error en inglés:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LANG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
es_AR.UTF-8
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;
/home/sergio
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ahora creamos una &lt;strong&gt;subshell&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"La variable LANG cambia a  &lt;/span&gt;&lt;span class="nv"&gt;$LANG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/algun_dir&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"el directorio actual es &lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;myscript.sh&lt;span class="o"&gt;)&lt;/span&gt;
La&lt;span class="w"&gt; &lt;/span&gt;variable&lt;span class="w"&gt; &lt;/span&gt;LANG&lt;span class="w"&gt; &lt;/span&gt;cambia&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt;  &lt;/span&gt;C
-bash:&lt;span class="w"&gt; &lt;/span&gt;cd:&lt;span class="w"&gt; &lt;/span&gt;/algun_dir:&lt;span class="w"&gt; &lt;/span&gt;No&lt;span class="w"&gt; &lt;/span&gt;such&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt; &lt;/span&gt;or&lt;span class="w"&gt; &lt;/span&gt;directory
el&lt;span class="w"&gt; &lt;/span&gt;directorio&lt;span class="w"&gt; &lt;/span&gt;actual&lt;span class="w"&gt; &lt;/span&gt;es&lt;span class="w"&gt; &lt;/span&gt;/tmp
-bash:&lt;span class="w"&gt; &lt;/span&gt;myscript.sh:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;not&lt;span class="w"&gt; &lt;/span&gt;found
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Al terminar la subshell, volvemos a la shell madre y tanto el directorio de trabajo como la variable LANG, vuelven a sus valores predeterminados:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;
/home/sergio
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LANG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
es_AR.UTF-8
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="power-tip-2-identificar-y-solucionar-problemas-de-selinux-al-usar-volumenes"&gt;Power Tip #2: Identificar y solucionar problemas de SELinux al usar volúmenes.&lt;/h3&gt;
&lt;p&gt;Supongamos que necesitamos probar una configuración en un contenedor:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;$&lt;span class="w"&gt; &lt;/span&gt;podman&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt;  &lt;/span&gt;--name&lt;span class="w"&gt; &lt;/span&gt;mynginx&lt;span class="w"&gt;  &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/sandbox/nginx.conf:/etc/nginx/nginx.conf&lt;span class="w"&gt; &lt;/span&gt;--pull&lt;span class="o"&gt;=&lt;/span&gt;never&lt;span class="w"&gt; &lt;/span&gt;docker.io/library/nginx@sha256:553f64aecdc31b5bf944521731cd70e35da4faed96b2b7548a3d8e2598c52a42
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ahora bien: ¿Qué sucede si el contenedor en realidad, falla al arrancar como lo muestran los logs?:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;$&lt;span class="w"&gt; &lt;/span&gt;podman&lt;span class="w"&gt; &lt;/span&gt;logs&lt;span class="w"&gt; &lt;/span&gt;mynginx&lt;span class="w"&gt; &lt;/span&gt;
/docker-entrypoint.sh:&lt;span class="w"&gt; &lt;/span&gt;/docker-entrypoint.d/&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;not&lt;span class="w"&gt; &lt;/span&gt;empty,&lt;span class="w"&gt; &lt;/span&gt;will&lt;span class="w"&gt; &lt;/span&gt;attempt&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;perform&lt;span class="w"&gt; &lt;/span&gt;configuration
/docker-entrypoint.sh:&lt;span class="w"&gt; &lt;/span&gt;Looking&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;shell&lt;span class="w"&gt; &lt;/span&gt;scripts&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/docker-entrypoint.d/
/docker-entrypoint.sh:&lt;span class="w"&gt; &lt;/span&gt;Launching&lt;span class="w"&gt; &lt;/span&gt;/docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
&lt;span class="m"&gt;10&lt;/span&gt;-listen-on-ipv6-by-default.sh:&lt;span class="w"&gt; &lt;/span&gt;info:&lt;span class="w"&gt; &lt;/span&gt;Getting&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;checksum&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;/etc/nginx/conf.d/default.conf
&lt;span class="m"&gt;10&lt;/span&gt;-listen-on-ipv6-by-default.sh:&lt;span class="w"&gt; &lt;/span&gt;info:&lt;span class="w"&gt; &lt;/span&gt;Enabled&lt;span class="w"&gt; &lt;/span&gt;listen&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;IPv6&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/nginx/conf.d/default.conf
/docker-entrypoint.sh:&lt;span class="w"&gt; &lt;/span&gt;Sourcing&lt;span class="w"&gt; &lt;/span&gt;/docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh:&lt;span class="w"&gt; &lt;/span&gt;Launching&lt;span class="w"&gt; &lt;/span&gt;/docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh:&lt;span class="w"&gt; &lt;/span&gt;Launching&lt;span class="w"&gt; &lt;/span&gt;/docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh:&lt;span class="w"&gt; &lt;/span&gt;Configuration&lt;span class="w"&gt; &lt;/span&gt;complete&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ready&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;up
&lt;span class="m"&gt;2025&lt;/span&gt;/11/24&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;:09:21&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;emerg&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;#1: open() "/etc/nginx/nginx.conf" failed (13: Permission denied)&lt;/span&gt;
nginx:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;emerg&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;open&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/etc/nginx/nginx.conf"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;failed&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;Permission&lt;span class="w"&gt; &lt;/span&gt;denied&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Si estás tentado a desactivar SELinux, te recomiendo enfáticamente que leas &lt;a href="https://sergiobelkin.com/posts/selinux-nah-deshabilitalo/"&gt;¿SELinux? Nah, dejalo en Disabled&lt;/a&gt;. Lo que ocurre es que no hay ninguna regla que permita que el contenedor acceda al contexto del archivo nginx.conf del host.&lt;/p&gt;
&lt;p&gt;Contexto del archivo:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;$&lt;span class="w"&gt; &lt;/span&gt;ls&lt;span class="w"&gt; &lt;/span&gt;-Z&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/sandbox/nginx.conf
unconfined_u:object_r:user_home_t:s0&lt;span class="w"&gt; &lt;/span&gt;/home/sergio/sandbox/nginx.conf
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Este problema se soluciona fácilmente:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;podman&lt;span class="w"&gt; &lt;/span&gt;stop&lt;span class="w"&gt; &lt;/span&gt;mynginx
podman&lt;span class="w"&gt; &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;mynginx
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Y ahora el contenedor arrancará sin inconvenientes:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;podman&lt;span class="w"&gt; &lt;/span&gt;ps
CONTAINER&lt;span class="w"&gt; &lt;/span&gt;ID&lt;span class="w"&gt;  &lt;/span&gt;IMAGE&lt;span class="w"&gt;                                                                                            &lt;/span&gt;COMMAND&lt;span class="w"&gt;               &lt;/span&gt;CREATED&lt;span class="w"&gt;         &lt;/span&gt;STATUS&lt;span class="w"&gt;         &lt;/span&gt;PORTS&lt;span class="w"&gt;       &lt;/span&gt;NAMES
a29c08eda1b1&lt;span class="w"&gt;  &lt;/span&gt;docker.io/library/nginx@sha256:553f64aecdc31b5bf944521731cd70e35da4faed96b2b7548a3d8e2598c52a42&lt;span class="w"&gt;  &lt;/span&gt;nginx&lt;span class="w"&gt; &lt;/span&gt;-g&lt;span class="w"&gt; &lt;/span&gt;daemon&lt;span class="w"&gt; &lt;/span&gt;o...&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;seconds&lt;span class="w"&gt; &lt;/span&gt;ago&lt;span class="w"&gt;  &lt;/span&gt;Up&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;seconds&lt;span class="w"&gt;              &lt;/span&gt;mynginx
podman&lt;span class="w"&gt; &lt;/span&gt;logs&lt;span class="w"&gt; &lt;/span&gt;mynginx&lt;span class="w"&gt; &lt;/span&gt;
/docker-entrypoint.sh:&lt;span class="w"&gt; &lt;/span&gt;/docker-entrypoint.d/&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;not&lt;span class="w"&gt; &lt;/span&gt;empty,&lt;span class="w"&gt; &lt;/span&gt;will&lt;span class="w"&gt; &lt;/span&gt;attempt&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;perform&lt;span class="w"&gt; &lt;/span&gt;configuration
/docker-entrypoint.sh:&lt;span class="w"&gt; &lt;/span&gt;Looking&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;shell&lt;span class="w"&gt; &lt;/span&gt;scripts&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/docker-entrypoint.d/
/docker-entrypoint.sh:&lt;span class="w"&gt; &lt;/span&gt;Launching&lt;span class="w"&gt; &lt;/span&gt;/docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
&lt;span class="m"&gt;10&lt;/span&gt;-listen-on-ipv6-by-default.sh:&lt;span class="w"&gt; &lt;/span&gt;info:&lt;span class="w"&gt; &lt;/span&gt;Getting&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;checksum&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;/etc/nginx/conf.d/default.conf
&lt;span class="m"&gt;10&lt;/span&gt;-listen-on-ipv6-by-default.sh:&lt;span class="w"&gt; &lt;/span&gt;info:&lt;span class="w"&gt; &lt;/span&gt;Enabled&lt;span class="w"&gt; &lt;/span&gt;listen&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;IPv6&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/nginx/conf.d/default.conf
/docker-entrypoint.sh:&lt;span class="w"&gt; &lt;/span&gt;Sourcing&lt;span class="w"&gt; &lt;/span&gt;/docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh:&lt;span class="w"&gt; &lt;/span&gt;Launching&lt;span class="w"&gt; &lt;/span&gt;/docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh:&lt;span class="w"&gt; &lt;/span&gt;Launching&lt;span class="w"&gt; &lt;/span&gt;/docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh:&lt;span class="w"&gt; &lt;/span&gt;Configuration&lt;span class="w"&gt; &lt;/span&gt;complete&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ready&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;up
&lt;span class="m"&gt;2025&lt;/span&gt;/11/24&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;21&lt;/span&gt;:16:10&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;notice&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;#1: using the "epoll" event method&lt;/span&gt;
&lt;span class="m"&gt;2025&lt;/span&gt;/11/24&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;21&lt;/span&gt;:16:10&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;notice&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;#1: nginx/1.29.3&lt;/span&gt;
&lt;span class="m"&gt;2025&lt;/span&gt;/11/24&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;21&lt;/span&gt;:16:10y&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;notice&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;#1: built by gcc 14.2.0 (Debian 14.2.0-19) &lt;/span&gt;
&lt;span class="m"&gt;2025&lt;/span&gt;/11/24&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;21&lt;/span&gt;:16:10&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;notice&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;#1: OS: Linux 4.18.0-553.84.1.el8_10.x86_64&lt;/span&gt;
&lt;span class="m"&gt;2025&lt;/span&gt;/11/24&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;21&lt;/span&gt;:16:10&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;notice&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;#1: getrlimit(RLIMIT_NOFILE): 262144:262144&lt;/span&gt;
&lt;span class="m"&gt;2025&lt;/span&gt;/11/24&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;21&lt;/span&gt;:16:10&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;notice&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;#1: start worker processes&lt;/span&gt;
&lt;span class="m"&gt;2025&lt;/span&gt;/11/24&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;21&lt;/span&gt;:16:10&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;notice&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;#1: start worker process 28&lt;/span&gt;
&lt;span class="m"&gt;2025&lt;/span&gt;/11/24&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;21&lt;/span&gt;:16:10&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;notice&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;#1: start worker process 29&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ahora bien, la opción &lt;code&gt;:Z&lt;/code&gt; no es mágica, para tener una aproximación a lo que hace veamos el contexto del archivo $HOME/sandbox/nginx.conf:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;$&lt;span class="w"&gt; &lt;/span&gt;ls&lt;span class="w"&gt; &lt;/span&gt;-Z&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/sandbox/nginx.conf
system_u:object_r:container_file_t:s0:c369,c839&lt;span class="w"&gt; &lt;/span&gt;/home/sergio/sandbox/nginx.conf
&lt;/pre&gt;&lt;/div&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Campo&lt;/th&gt;
&lt;th&gt;Antes&lt;/th&gt;
&lt;th&gt;Después&lt;/th&gt;
&lt;th&gt;Comentario&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Usuario (SELinux)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;unconfined_u&lt;/td&gt;
&lt;td&gt;system_u&lt;/td&gt;
&lt;td&gt;Pasa de ser un usuario sin restricciones a un usuario gestionado por el sistema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rol (SELinux)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;object_r&lt;/td&gt;
&lt;td&gt;object_r&lt;/td&gt;
&lt;td&gt;Se mantiene sin cambios&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Asignación basada en tipos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;user_home_t&lt;/td&gt;
&lt;td&gt;container_file_t&lt;/td&gt;
&lt;td&gt;Cambia a un tipo de asignación en la cual los contenedores pueden escribir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rango (SELinux)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;s0&lt;/td&gt;
&lt;td&gt;s0:c369,c839&lt;/td&gt;
&lt;td&gt;Este cambio implica que solamente podrá utilizarlo de manera exclusiva un único contenedor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="power-tip-3-filtrar-un-archivo-de-template-en-formato-yaml-de-zabbix-sin-instalar-absolutamente-nada"&gt;Power Tip #3: Filtrar un archivo de template en formato yaml de Zabbix sin instalar absolutamente nada&lt;/h3&gt;
&lt;p&gt;Solamente necesitamos Podman, en el siguiente ejemplo estamos filtrando todos los triggers estáticos con nivel de severidad &lt;strong&gt;HIGH&lt;/strong&gt; o &lt;strong&gt;DISASTER&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;podman&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;--rm&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PWD&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;:/workdir:Z&lt;span class="w"&gt; &lt;/span&gt;mikefarah/yq&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s1"&gt;'.zabbix_export.templates[].items[].triggers[] | select(.priority == "HIGH" or .priority == "DISASTER")| {"Trigger": .name}'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;template_db_mssql_agent2.yaml
Trigger:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'MSSQL: Percentage of the buffer cache efficiency is low'&lt;/span&gt;
Trigger:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'MSSQL: Page life expectancy is low'&lt;/span&gt;
Trigger:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'MSSQL: Percentage of work tables available from the work table cache is low'&lt;/span&gt;
Trigger:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'MSSQL: Service is unavailable'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="fuentes-y-mas-recursos"&gt;Fuentes y más recursos&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://danwalsh.livejournal.com/81269.html"&gt;Container Labeling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://danwalsh.livejournal.com/76016.html"&gt;Be careful relabeling volumes with Container run times. Sometimes things can go very wrong?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="power-link"&gt;Power Link&lt;/h3&gt;
&lt;p&gt;El enlace de esta edición apunta a una entrevista a Linux Torvalds que gira en torno a la evolución del hardware, la IA y su impacto en el Linux y el desarrollo del kernel: &lt;a href="https://www.youtube.com/watch?v=NjGHrDnPxwI"&gt;Linus Torvalds — Talks about AI Hype, GPU Power, and Linux’s Future &lt;/a&gt;. En la actualidad cuestiones como la programación guiada por la intuición con la ayuda de chatbots debates importantes, no solamente en Linux sino en el ámbito IT en general.&lt;/p&gt;</description><category>bash</category><category>podman</category><category>seguridad</category><category>SELinux</category><category>yq</category><category>zabbix</category><guid>https://sergiobelkin.com/posts/3-power-tips-power-link-i8/</guid><pubDate>Sun, 23 Nov 2025 22:09:59 GMT</pubDate></item><item><title>3 Power Tips + 1 Power Link I7</title><link>https://sergiobelkin.com/posts/3-power-tips-power-link-i7/</link><dc:creator>sebelk</dc:creator><description>&lt;figure&gt;&lt;img src="https://sergiobelkin.com/images/PowerTipsPlus.png"&gt;&lt;/figure&gt; &lt;p&gt;&lt;strong&gt;Resumen&lt;/strong&gt;: Tips para bash, KDE Plasma y el uso del shell para cambiar entre ambientes de desarrollo. Además, en el Power Link, un artículo de Aaron P. MacSween, en el que discute el uso de &lt;em&gt;AI scraping&lt;/em&gt; de sitios web usados de manera no consensuada para entrenar &lt;em&gt;Modelos Extensos de Lenguaje (LLMs)&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id="power-tip-1-agrupacion-de-comandos-en-bash"&gt;Power Tip #1: Agrupación de comandos en bash&lt;/h3&gt;
&lt;p&gt;El shell bash permite agrupar comandos, una funcionalidad tan sencilla como potente, por ejemplo:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dnf&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;upgrade&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt; &lt;/span&gt;httpd&lt;span class="w"&gt; &lt;/span&gt;mariadb&lt;span class="w"&gt; &lt;/span&gt;php-fpm&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The final status is unsuccessful 🙁"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;De esta manera si algunos de los dos comandos falla, mostrará un mensaje de error unificado.&lt;/p&gt;
&lt;h3 id="power-tip-2-uso-de-cuadros-de-dialogos-nativos-de-kde-plasma-en-firefox"&gt;Power Tip #2: Uso de cuadros de diálogos nativos de KDE Plasma en Firefox&lt;/h3&gt;
&lt;p&gt;Para hacerlo hay que abrir la url &lt;code&gt;about:config&lt;/code&gt; y luego setear la preferencia &lt;code&gt;widget.use-xdg-desktop-portal.file-picker&lt;/code&gt; en &lt;code&gt;1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/pt7-set-pref-ff.webp"&gt;&lt;img src="https://sergiobelkin.com/images/pt7-set-pref-ff.thumbnail.webp" alt="Set preferences on Firefox"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Esto se basa en el uso de XDG Portals que es un elemento de la arquitectura de entornos gráficos. Ellos proporcionan sandboxing, funcionalidad en entornos Wayland y lo que nos interesa en este caso: coherencia en la interfaz del usuario.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Antes 🤐&lt;/th&gt;
&lt;th&gt;Después 😎️&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/pt7-ugly-dialog-box-firefox.webp"&gt;&lt;img src="https://sergiobelkin.com/images/pt7-ugly-dialog-box-firefox.thumbnail.webp" alt="Set preferences on Firefox"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/pt7-nice-dialog-box-firefox.webp"&gt;&lt;img src="https://sergiobelkin.com/images/pt7-nice-dialog-box-firefox.thumbnail.webp" alt="Before and After of setting file picker"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Ah... usar la variable de entorno &lt;code&gt;MOZ_USE_XDG_PORTAL&lt;/code&gt; no es la manera recomendada, más allá de lo que diga cierto chatbot...&lt;/p&gt;
&lt;h3 id="power-tip-3-flask-linux-entornos-seguros-usando-solo-la-shell"&gt;Power Tip #3: [Flask + Linux]: Entornos Seguros usando solo la Shell&lt;/h3&gt;
&lt;h4 id="problema-comun"&gt;Problema Común&lt;/h4&gt;
&lt;p&gt;Ejecutar una app Flask con &lt;code&gt;DEBUG=True&lt;/code&gt; en producción expone trazas de errores, rutas internas y detalles del &lt;em&gt;stack&lt;/em&gt; que pueden ser explotados. Un &lt;strong&gt;sysadmin o devops con experiencia&lt;/strong&gt; sabe que una práctica profesional es &lt;strong&gt;externalizar la configuración&lt;/strong&gt; y usar el sistema operativo como interruptor de entorno.&lt;/p&gt;
&lt;h4 id="solucion-basada-en-linux-flask"&gt;Solución Basada en Linux + Flask&lt;/h4&gt;
&lt;p&gt;Usá la variable de entorno de Linux &lt;code&gt;FLASK_ENV&lt;/code&gt; para alternar entre una configuración segura de Producción (&lt;code&gt;config_prod.py&lt;/code&gt;) y una configuración orientada a Desarrollo (&lt;code&gt;config_dev.py&lt;/code&gt;).&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Archivo&lt;/th&gt;
&lt;th&gt;Ajuste&lt;/th&gt;
&lt;th&gt;Enfoque&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;config_dev.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DEBUG = True&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Depuración y agilidad.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;config_prod.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DEBUG = False&lt;/code&gt; (más &lt;code&gt;SECRET_KEY&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Seguridad&lt;/strong&gt; y &lt;strong&gt;Gestión de Secretos&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;En &lt;code&gt;config_prod.py&lt;/code&gt;, además de &lt;code&gt;DEBUG = False&lt;/code&gt;, la clave secreta se carga
desde el entorno con &lt;code&gt;SECRET_KEY = os.environ.get('PROD_KEY')&lt;/code&gt; — así nunca
queda hardcodeada en el repo.&lt;/p&gt;
&lt;h4 id="fragmento-de-apppy"&gt;Fragmento de app.py&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;flask&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;
&lt;span class="c1"&gt;# Se importan las clases para un código robusto:&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;config_dev&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DevelopmentConfig&lt;/span&gt; 
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;config_prod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ProductionConfig&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vm"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'FLASK_ENV'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'production'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Entorno PROD: Carga DEBUG=False&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ProductionConfig&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Entorno DEV: Carga DEBUG=True por defecto&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DevelopmentConfig&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="control-desde-la-terminal"&gt;Control desde la Terminal&lt;/h4&gt;
&lt;p&gt;+--------------------------+----------------------------------------------------------------------------------+---------------------------------------------------+
| Entorno                  | Comando                                                                          | Resultado                                         |
+==========================+==================================================================================+===================================================+
| &lt;strong&gt;Producción&lt;/strong&gt;           | &lt;code&gt;export FLASK_ENV=production&lt;/code&gt;                                                    | &lt;code&gt;Debug mode: off&lt;/code&gt;                                 |
|                          |                                                                                  |                                                   |
|                          | &lt;code&gt;python app.py&lt;/code&gt;                                                                  | (modo seguro)                                     |
+--------------------------+----------------------------------------------------------------------------------+---------------------------------------------------+
| &lt;strong&gt;Desarrollo&lt;/strong&gt;           | &lt;code&gt;unset FLASK_ENV&lt;/code&gt;                                                                | &lt;code&gt;Debug mode: on&lt;/code&gt;                                  |
|                          |                                                                                  |                                                   |
|                          | &lt;code&gt;python app.py&lt;/code&gt;                                                                  | (vuelve a depuración)                             |
+--------------------------+----------------------------------------------------------------------------------+---------------------------------------------------+&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ Conclusión:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Este patrón convierte tu &lt;em&gt;shell&lt;/em&gt; de Linux en un &lt;em&gt;switch&lt;/em&gt; seguro de entorno para tu app Flask.&lt;/p&gt;
&lt;h3 id="preguntas-de-repaso"&gt;Preguntas de repaso&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Seguridad y DevOps (Power Tip #3):&lt;/strong&gt; ¿Cuál es el riesgo principal de ejecutar una aplicación Flask con &lt;code&gt;DEBUG=True&lt;/code&gt; en producción, y cómo permite la variable de entorno de Linux &lt;strong&gt;&lt;code&gt;FLASK_ENV&lt;/code&gt;&lt;/strong&gt; que el administrador (&lt;code&gt;sysadmin o devops con experiencia&lt;/code&gt;) cambie de manera segura a la configuración de producción (&lt;code&gt;config_prod.py&lt;/code&gt;) usando solo un comando en la &lt;em&gt;shell&lt;/em&gt;?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eficiencia en Bash (Power Tip #1):&lt;/strong&gt; En el ejemplo de agrupación de comandos, ¿cuál es el propósito de encerrar las sentencias de actualización (&lt;code&gt;dnf -y upgrade&lt;/code&gt;) y de reinicio de servicios (&lt;code&gt;systemctl restart ...&lt;/code&gt;) entre llaves &lt;code&gt;{}&lt;/code&gt;, y qué rol juega el operador lógico &lt;strong&gt;&lt;code&gt;||&lt;/code&gt;&lt;/strong&gt; en caso de que alguna de estas operaciones falle?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Experiencia de Usuario (Power Tip #2):&lt;/strong&gt; Si un usuario de KDE Plasma desea que Firefox utilice los cuadros de diálogo nativos del escritorio en lugar de los predeterminados del navegador, ¿qué URL debe abrir y a qué valor debe establecer la preferencia &lt;strong&gt;&lt;code&gt;widget.use-xdg-desktop-portal.file-picker&lt;/code&gt;&lt;/strong&gt;?&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="power-link"&gt;Power Link&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://cryptography.dog/blog/AI-scrapers-request-commented-scripts/"&gt;AI scrapers request commented scripts&lt;/a&gt;. ¿Hasta qué punto una actividad es considerada benigina cuando se entrenan LLMs? Y muchas cuestiones para pensar...&lt;/p&gt;</description><category>bash</category><category>firefox</category><category>flask</category><category>kde-plasma</category><category>python</category><category>seguridad</category><guid>https://sergiobelkin.com/posts/3-power-tips-power-link-i7/</guid><pubDate>Tue, 04 Nov 2025 22:10:17 GMT</pubDate></item><item><title>3 Power Tips + 1 Power Link I6</title><link>https://sergiobelkin.com/posts/3-power-tips-power-link-i6/</link><dc:creator>sebelk</dc:creator><description>&lt;figure&gt;&lt;img src="https://sergiobelkin.com/images/PowerTipsPlus.png"&gt;&lt;/figure&gt; &lt;p&gt;&lt;strong&gt;Resumen:&lt;/strong&gt; Tips para KDE Plasma, manejo de directorios temporales e información detallada sobre Podman. Además, un link a un post en el cual un líder de ingenería recomienda pasar de Docker a Podman.  &lt;/p&gt;
&lt;h3 id="power-tip-1-reiniciar-kde-plasma-sin-cerrar-sesion"&gt;Power Tip #1 Reiniciar KDE Plasma sin cerrar sesión&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;kquitapp6&lt;span class="w"&gt; &lt;/span&gt;plasmashell&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;plasmashell&lt;span class="w"&gt; &lt;/span&gt;--replace&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;/tmp/plasma.log&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;disown&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-h
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="power-tip-2-crea-un-sandbox-con-limpieza-automatica-usando-tmpfilesd"&gt;Power Tip #2 Crea un sandbox con limpieza automática usando tmpfiles.d&lt;/h3&gt;
&lt;p&gt;Podemos tener un directorio al cual usamos como sandbox, por ejemplo para:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Descarga de archivos&lt;/li&gt;
&lt;li&gt;Volcar Logs y dumps temporarios&lt;/li&gt;
&lt;li&gt;Scripts, código... y cualquier cosa que queremos probar.... por un tiempo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pero la idea es que no queremos que esos archivos se almacenen de manera indefinida... entonces:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt; EOF &amp;gt;  ~/.config/user-tmpfiles.d/user-sandbox.conf &lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; d %h/sandbox - - - 7d&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; d %h/sandbox/ephemeral - - - 10m&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; EOF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Una idea tentadora es usar un directorio como &lt;code&gt;/tmp&lt;/code&gt;. Pero no es buena práctica usar ese directorio como sandbox. Luego de crear ese archivo, hay que ejecutar: &lt;code&gt;systemd-tmpfiles --create --user&lt;/code&gt; que creará los directorios en las rutas especificadas. El servicio &lt;code&gt;systemd-tmpfiles-clean&lt;/code&gt; eliminará periódicamente los archivos más viejos de 7 días del directorio ~/sandbox. El contenido de &lt;code&gt;~/sandbox/ephermeral&lt;/code&gt; en cambio, no se borrará automáticamente excepto que creemos una unit de tipo timer. Sin embargo se puede hacer manualmente mediante &lt;code&gt;systemd-tmpfiles --clean --user&lt;/code&gt;. Como siempre entender por qué hacés lo que hacés es fundamental, los manpages son siempre aliados a tener en cuenta aun en pleno hype de la AI.&lt;/p&gt;
&lt;p&gt;A propósito... el comando en el Power Tip #1 podría haber usado el directorio del sandbox en lugar de /tmp....&lt;/p&gt;
&lt;h3 id="power-tip-3-revisar-espacios-y-objetos-de-manera-detallada-en-podman"&gt;Power Tip #3 Revisar espacios y objetos de manera detallada en Podman&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;podman&lt;span class="w"&gt; &lt;/span&gt;system&lt;span class="w"&gt; &lt;/span&gt;df&lt;span class="w"&gt; &lt;/span&gt;-v
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;De esta manera obtenemos información muy útil sobre las imágenes, contenedores y volúmenes que tenemos.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/pt6-podman-system-df.webp"&gt;&lt;img src="https://sergiobelkin.com/images/pt6-podman-system-df.thumbnail.webp" alt="Espacio ocupado por podman"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4 id="power-link"&gt;Power Link&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://www.odbms.org/blog/2025/10/beyond-the-ai-hype-guido-van-rossum-on-pythons-philosophy-simplicity-and-the-future-of-programming/"&gt;Entrevista a Guido van Rossum, creador de Python, en la cual trata entre temas sobre AI&lt;/a&gt;&lt;/p&gt;</description><category>kde-plasma</category><category>podman</category><category>systemd</category><guid>https://sergiobelkin.com/posts/3-power-tips-power-link-i6/</guid><pubDate>Mon, 13 Oct 2025 21:13:07 GMT</pubDate></item><item><title>3 Power Tips + 1 Power Link I5</title><link>https://sergiobelkin.com/posts/3-power-tips-power-link-i5/</link><dc:creator>sebelk</dc:creator><description>&lt;figure&gt;&lt;img src="https://sergiobelkin.com/images/PowerTipsPlus.png"&gt;&lt;/figure&gt; &lt;p&gt;&lt;strong&gt;Resumen:&lt;/strong&gt; Tips para contenedores, uso de digests y análisis de seguridad de imágenes y obtener información de imágenes remotas. Además, un link a un post en el cual un líder de ingenería recomienda pasar de Docker a Podman.  &lt;/p&gt;
&lt;h3 id="power-tip-1-etiquetar-las-imagenes-con-digest-en-produccion"&gt;Power Tip #1 Etiquetar las imágenes con digest en producción&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;❌ Mala práctica, apuntar a un tag:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;podman&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;--name&lt;span class="w"&gt; &lt;/span&gt;pass_git&lt;span class="w"&gt; &lt;/span&gt;localhost/passteiner-ubi9:1
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Esta es una mala práctica porque:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Es mutable, puede apuntar a otro build&lt;/li&gt;
&lt;li&gt;También es un error confiar ciegamente usar &lt;em&gt;latest&lt;/em&gt;, hoy puede apuntar a una versión, mañana a otra&lt;/li&gt;
&lt;li&gt;Dificulta el debugging al no saber exactamente qué versión usás&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;✅ Buena práctica:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;podman&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;--name&lt;span class="w"&gt; &lt;/span&gt;pass-git&lt;span class="w"&gt; &lt;/span&gt;--pull&lt;span class="o"&gt;=&lt;/span&gt;never&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;localhost/passteiner-ubi9@sha256:3ca1e63acb24d88fde5e86eb1f476ba69eb740cd43590c37f3a964b5a19f001
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Ventajas:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Totalmente reproducible y auditable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Evitás actualizaciones sorpresa.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ideal para ambientes de producción, CI/CD, y entornos donde la confiabilidad importa.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="power-tip-2-examinar-vulnerabilidades-en-imagenes-de-contenedores"&gt;Power Tip #2 Examinar vulnerabilidades en imágenes de contenedores&lt;/h3&gt;
&lt;p&gt;La abstración con que nos proporcionan los contenedores, tal vez nos den una falsa sensación de seguridad, sin embargo, con trivy se pueden escanear en una imagen vulnerabilades por ejemplo:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;trivy&lt;span class="w"&gt; &lt;/span&gt;image&lt;span class="w"&gt; &lt;/span&gt;docker.io/bitnami/wordpress
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Debajo podemos ver un resumen:&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/pt5-trivy.webp"&gt;&lt;img src="https://sergiobelkin.com/images/pt5-trivy.thumbnail.webp" alt="Resumen del reporte realizado por trivy"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h3 id="power-tip-3-examinar-imagenes-de-contenedores-sin-necesidad-pullearlas"&gt;Power Tip #3 Examinar imágenes de contenedores sin necesidad "pullearlas"&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;skopeo&lt;span class="w"&gt; &lt;/span&gt;inspect&lt;span class="w"&gt; &lt;/span&gt;docker://docker.io/ollama/ollama&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jq&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'{Digest: .Digest, Labels: .Labels, UltimaCapa: .Layers[-1]}'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"Digest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:a5409cb903d30f9cd67e9f430dd336ddc9274e16fd78f75b675c42065991b4fd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"Labels"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"org.opencontainers.image.ref.name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ubuntu"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"org.opencontainers.image.version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"24.04"&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"UltimaCapa"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:45fafbfc0e267e3b61858ae5cb28ff739d901d85e1b60ee62db5dad64ae7c0d5"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="de-esta-manera-obtenemos"&gt;De esta manera obtenemos:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;El &lt;strong&gt;Digest&lt;/strong&gt; de la imagen (identificador único inmutable).&lt;/li&gt;
&lt;li&gt;En qué &lt;strong&gt;distro base y versión&lt;/strong&gt; se construyó la imagen (&lt;code&gt;ubuntu:24.04&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;Digest de la última capa&lt;/strong&gt;, que representa el &lt;strong&gt;último cambio&lt;/strong&gt; al sistema de archivos durante el proceso de build.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;El digest de la última capa representa el último cambio al sistema de archivos en el proceso de construcción de la imagen.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="power-link"&gt;Power Link&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://codesmash.dev/why-i-ditched-docker-for-podman-and-you-should-too"&gt;Why I Ditched Docker for Podman And You Should Too&lt;/a&gt;&lt;/p&gt;</description><category>podman</category><category>seguridad</category><category>skopeo</category><category>trivy</category><guid>https://sergiobelkin.com/posts/3-power-tips-power-link-i5/</guid><pubDate>Sat, 13 Sep 2025 19:38:48 GMT</pubDate></item><item><title>3 Power Tips + 1 Power Link I4</title><link>https://sergiobelkin.com/posts/3-power-tips-power-link-i4/</link><dc:creator>sebelk</dc:creator><description>&lt;figure&gt;&lt;img src="https://sergiobelkin.com/images/PowerTipsPlus.png"&gt;&lt;/figure&gt; &lt;p&gt;Resumen: Tips para &lt;strong&gt;curl&lt;/strong&gt;, &lt;strong&gt;ollama&lt;/strong&gt; y &lt;strong&gt;KDE Plasma&lt;/strong&gt;. Y un link acerca de cómo las organizaciones están usando el open source y el upskilling para responder a las demandas laborales impulsadas por IA&lt;/p&gt;
&lt;h3 id="power-tip-1"&gt;Power Tip #1&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Obtener un json con información de diagnóstico a partir de curl&lt;/strong&gt;. Por ejemplo: una solicitud que devuelva el &lt;em&gt;código de respuesta http&lt;/em&gt;, &lt;em&gt;la versión del protocolo http`, &lt;/em&gt;la dirección ip&lt;em&gt;, &lt;/em&gt;el tiempo de transferencia hasta el primer byte recibido&lt;em&gt; y el &lt;/em&gt;tiempo total de la operación completa*:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-Ls&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;/dev/null&lt;span class="w"&gt; &lt;/span&gt;-w&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'{"code":%{response_code},"http":"%{http_version}","ip":"%{remote_ip}","ttfb":%{time_starttransfer},"total":%{time_total}}\n'&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;https://fast.com&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jq
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/pt1-curl-json.webp"&gt;&lt;img src="https://sergiobelkin.com/images/pt1-curl-json.thumbnail.webp" alt="Ejemplo de curl obteniendo json con información de diagnóstico"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h3 id="power-tip-2"&gt;Power Tip #2&lt;/h3&gt;
&lt;p&gt;En &lt;a href="https://sergiobelkin.com/posts/3-power-tips-plus-1-power-link-i3/"&gt;el PT 2 anterior&lt;/a&gt; mostramos como usar un LLM offline. Aquí tenemos un &lt;strong&gt;script para bajar e instalar ollama&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="ch"&gt;#! /usr/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
curl&lt;span class="w"&gt; &lt;/span&gt;-LO&lt;span class="w"&gt; &lt;/span&gt;https://ollama.com/download/ollama-linux-amd64.tgz
sudo&lt;span class="w"&gt; &lt;/span&gt;tar&lt;span class="w"&gt; &lt;/span&gt;-C&lt;span class="w"&gt; &lt;/span&gt;/usr/local&lt;span class="w"&gt; &lt;/span&gt;-xzf&lt;span class="w"&gt; &lt;/span&gt;ollama-linux-amd64.tgz
sudo&lt;span class="w"&gt; &lt;/span&gt;useradd&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;/bin/false&lt;span class="w"&gt; &lt;/span&gt;-U&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;/usr/local/share/ollama&lt;span class="w"&gt; &lt;/span&gt;ollama
sudo&lt;span class="w"&gt; &lt;/span&gt;usermod&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;-G&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;whoami&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;tee&lt;span class="w"&gt;  &lt;/span&gt;/etc/systemd/system/ollama.service&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt; 'EOF'&lt;/span&gt;
&lt;span class="s"&gt;[Unit]&lt;/span&gt;
&lt;span class="s"&gt;Description=Ollama Service&lt;/span&gt;
&lt;span class="s"&gt;After=network-online.target&lt;/span&gt;

&lt;span class="s"&gt;[Service]&lt;/span&gt;
&lt;span class="s"&gt;ExecStart=/usr/local/bin/ollama serve&lt;/span&gt;
&lt;span class="s"&gt;User=ollama&lt;/span&gt;
&lt;span class="s"&gt;Group=ollama&lt;/span&gt;
&lt;span class="s"&gt;Restart=always&lt;/span&gt;
&lt;span class="s"&gt;RestartSec=3&lt;/span&gt;
&lt;span class="s"&gt;Environment="PATH=$PATH&lt;/span&gt;

&lt;span class="s"&gt;[Install]&lt;/span&gt;
&lt;span class="s"&gt;WantedBy=multi-user.target&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;

sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;daemon-reload
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--now&lt;span class="w"&gt; &lt;/span&gt;ollama
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Y ya está listo &lt;strong&gt;ollama&lt;/strong&gt; para usar. 😉 &lt;/p&gt;
&lt;h3 id="power-tip-3"&gt;Power Tip #3&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Configurar klipper en Plasma para que al copiar una url llame a una acción&lt;/strong&gt;. A diferencia de lo que ocurre en otros entornos o sistemas operativos, el &lt;strong&gt;Portapapeles&lt;/strong&gt; de Plasma no sirve solamente para cortar/copiar y pegar. Sino que puede realizar tareas que hacen más sencillas las tareas tanto para usuarios finales como para usuarios administradores y/o desarrolladores.
Los fundamentos de este &lt;strong&gt;Power Tip&lt;/strong&gt; son:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Una &lt;strong&gt;expresión regular&lt;/strong&gt;, por ejemplo: &lt;code&gt;^(https?://[^ \t\r\n"'&amp;lt;&amp;gt;]+)$&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Una &lt;strong&gt;acción comando&lt;/strong&gt;, por ejemplo: &lt;code&gt;konsole --new-tab -e bash -lc 'curl -I -L -- "%1"; exec "${SHELL:-/bin/bash}" -i'&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dentro de la &lt;strong&gt;configuración del Portapapeles (&lt;em&gt;klipper&lt;/em&gt;)&lt;/strong&gt;, se pueden realizar esos y otros ajustes.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/pt3-klipper-acttion-config.webp"&gt;&lt;img src="https://sergiobelkin.com/images/pt3-klipper-acttion-config.thumbnail.webp" alt="Configurar una acción en Klipper"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Luego al copiar una URL, podemos usar un menú emergente que dispare la acción &lt;strong&gt;(en este de acuerdo al ejemplo arriba mencionado el comando curl en konsole)&lt;/strong&gt;.  💪 &lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/pt3-klipper-acttion-example.webp"&gt;&lt;img src="https://sergiobelkin.com/images/pt3-klipper-acttion-example.thumbnail.webp" alt="Configurar una acción en Klipper"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h3 id="power-link"&gt;Power Link&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://training.linuxfoundation.org/blog/just-released-2025-state-of-tech-talent-report/"&gt;2025 State of Tech Talent Report&lt;/a&gt;&lt;/p&gt;</description><category>curl</category><category>jq</category><category>kde-plasma</category><category>ollama</category><category>systemd</category><guid>https://sergiobelkin.com/posts/3-power-tips-power-link-i4/</guid><pubDate>Mon, 11 Aug 2025 22:20:56 GMT</pubDate></item></channel></rss>