<?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 KDE Plasma)</title><link>https://sergiobelkin.com/</link><description></description><atom:link href="https://sergiobelkin.com/categories/kde-plasma.xml" rel="self" type="application/rss+xml"></atom:link><language>es</language><copyright>Contents © 2025 &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, 24 Nov 2025 22:57:22 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>3 Power Tips + 1 Power Link I7</title><link>https://sergiobelkin.com/posts/3-power-tips-1-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 Crítico&lt;/th&gt;
&lt;th&gt;Enfoque Operacional&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;Enfoque en 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;&lt;br&gt;&lt;code&gt;SECRET_KEY = os.environ.get('PROD_KEY')&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prioridad a la &lt;strong&gt;Seguridad&lt;/strong&gt; y la &lt;strong&gt;Gestión de Secretos&lt;/strong&gt; mediante la &lt;em&gt;shell&lt;/em&gt; de Linux.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Entorno Deseado&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Comando Linux&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Resultado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Producción&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;export FLASK_ENV=production; python app.py&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;* Debug mode: off&lt;/code&gt; (Modo seguro activado por el &lt;em&gt;shell&lt;/em&gt; de Linux).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Desarrollo&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;unset FLASK_ENV; python app.py&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;* Debug mode: on&lt;/code&gt; (La variable se borra, volviendo al modo de depuración).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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>APIs</category><category>bash</category><category>KDE Plasma</category><category>python</category><guid>https://sergiobelkin.com/posts/3-power-tips-1-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-1-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 PowerTip #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>containers</category><category>KDE Plasma</category><category>systemd</category><guid>https://sergiobelkin.com/posts/3-power-tips-1-power-link-i6/</guid><pubDate>Mon, 13 Oct 2025 21:13:07 GMT</pubDate></item></channel></rss>